//+-----------------------------------------------------------------------------+ //¦ Author: Ben Rollinson and Rob Bray Date: 06/04/10 ¦ //¦-----------------------------------------------------------------------------¦ //¦ ¦ //¦ ¦ //¦ FBI 2 - Snatch and Grab ¦ //¦ ¦ //¦ ¦ //+-----------------------------------------------------------------------------+ //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_physics.sch" USING "commands_fire.sch" USING "commands_cutscene.sch" USING "selector_public.sch" USING "dialogue_public.sch" USING "cellphone_public.sch" USING "flow_public_core_override.sch" USING "rappel_public.sch" USING "script_ped.sch" USING "script_blips.sch" USING "script_buttons.sch" USING "select_mission_stage.sch" USING "replay_public.sch" USING "cutscene_public.sch" USING "player_ped_public.sch" USING "mission_stat_public.sch" USING "clearMissionArea.sch" USING "CompletionPercentage_public.sch" USING "locates_public.sch" USING "timelapse.sch" USING "commands_shapetest.sch" USING "building_control_public.sch" USING "chase_hint_cam.sch" USING "cheat_controller_public.sch" USING "spline_cam_edit.sch" USING "commands_recording.sch" USING "push_in_public.sch" // REMOVE TEMP WEATHER CALLS // REMOVE SKY SCENARIO BLOCKING // NEED TO DO SOMETHING ABOUT IF THE PLAYER DIES HOLDING THE ADVANCED RIFLE, HE WILL PROB HAVE IT ON RETURN // Enums ENUM MISSION_INIT_STAGE_ENUM MISSION_INIT_PRE_INTRO = 0, MISSION_INIT_REQUEST_INTRO, MISSION_INIT_WAIT_FOR_INTRO, MISSION_INIT_PLAY_INTRO, MISSION_INIT_DONE ENDENUM ENUM MISSION_STAGE_ENUM STAGE_FOOD_COURT = 0, STAGE_GET_TO_CHOPPER, STAGE_GET_TO_BUILDING, STAGE_RAPPEL_DOWN, STAGE_SNIPE_GUARDS, STAGE_CHOPPER_CHASE, STAGE_DROPOFF ENDENUM ENUM MISSION_FAIL_STATE_ENUM MISSION_FAIL_STATE_NOT_FAILED = 0, MISSION_FAIL_STATE_WAIT_FOR_FADE ENDENUM ENUM FAIL_REASON_ENUM FAIL_FRANKLIN_DEAD = 0, FAIL_MICHAEL_DEAD, FAIL_TREVOR_DEAD, FAIL_DAVE_DEAD, FAIL_ABANDONED_DAVE, FAIL_PRISONER_DEAD, FAIL_CHOPPER_DESTROYED, FAIL_CAR_DESTROYED, FAIL_ABANDONED_CAR, FAIL_ABANDONED_CHOPPER, FAIL_TREVOR_ABANDONED_CHOPPER, FAIL_ATTACKED_FBI, FAIL_FELL_FROM_ROPE, FAIL_ROPE_CUT, FAIL_SEEN, FAIL_ATTRACTED_COPS, FAIL_CAR_STUCK, FAIL_CHOPPER_STUCK, FAIL_CAUSED_TROUBLE, FAIL_UNCOUPLED_ROPE, FAIL_DROWNED, FAIL_STEVE_DEAD, FAIL_ANDREAS_DEAD, FAIL_TROUBLE_FOOD_COURT 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 SNATCH_AND_GRAB_MODEL_ENUM SAGM_MICHAEL = 0, SAGM_FRANKLIN, SAGM_TREVOR, SAGM_DAVE, SAGM_STEVE, SAGM_ANDREAS, SAGM_PRISONER_HIGH, SAGM_PRISONER_LOW, SAGM_PILOT, SAGM_GUARD, SAGM_MICHELLE, SAGM_FBI, SAGM_FBIEND, SAGM_CHOPPER, SAGM_ENEMY_CHOPPER, SAGM_MICHAEL_CAR, // SAGM_TREVOR_JEEP, SAGM_FRANKLIN_BIKE, SAGM_FBI_VAN, SAGM_FBI_CAR, SAGM_UTIL_TRUCK_1, SAGM_UTIL_TRUCK_2, SAGM_DRIVE_AWAY_CAR, //SAGM_HOOK, //SAGM_BLOCK, SAGM_HARNESS, SAGM_PULLEY, SAGM_TORCH, SAGM_CHAIR, SAGM_COFFEE ENDENUM ENUM SNATCH_AND_GRAB_VECTOR_ENUM SAGVEC_PLAYER_INIT = 0, SAGVEC_PLAYER_INIT2, SAGVEC_DAVE_INIT, SAGVEC_DAVE_INIT2, SAGVEC_MICHAEL_CAR_INIT, SAGVEC_CHOPPER_INIT, SAGVEC_PICKUP_CHOPPER_LEADIN, SAGVEC_CHOPPER_HOVER, SAGVEC_HOVER_TARGET, SAGVEC_TREVOR_INIT, SAGVEC_FRANKLIN_INIT, SAGVEC_FRANKLIN_SNIPER, SAGVEC_BIKE_INIT, SAGVEC_JEEP_INIT, SAGVEC_ROPE_ANCHOR_OFFSET, SAGVEC_ROPE_ANCHOR_ROT, SAGVEC_ROPE_HARNESS_OFFSET, SAGVEC_ROPE_WEIGHT_OFFSET, SAGVEC_ROPE_PLAYER_SWING_ATTACH, SAGVEC_ROPE_PRISONER_SWING_ATTACH, SAGVEC_MEETING_POINT, SAGVEC_WINDOW_FRAME, SAGVEC_WINDOW_FRAME_2, SAGVEC_WINDOW_SWING_RIGHT, SAGVEC_WINDOW_SWING_LEFT, SAGVEC_WINDOW_SOUND, SAGVEC_BREAK_IN, SAGVEC_PRISONER_INIT, SAGVEC_MICHELLE_INIT, SAGVEC_INTERROGATION, SAGVEC_HEADSHOT, SAGVEC_GUARD_DOOR_INSIDE, SAGVEC_GUARD_DOOR_OUTSIDE, SAGVEC_GUARD_ANIM_ORIGIN, SAGVEC_SNIPER, SAGVEC_REMOTE_VIEW, SAGVEC_BEHIND_SNIPER, SAGVEC_SNIPER_AI_SHOT_ORIGIN, SAGVEC_CHASE_END, SAGVEC_DROPOFF, SAGVEC_DROPOFF_DIMENSIONS, SAGVEC_DROPOFF_PASS_DIMENSIONS, SAGVEC_END, SAGVEC_MICHAEL_AT_FOOD_COURT, SAGVEC_MOVE_LAST_PLAYER_VEHICLE ENDENUM ENUM SNATCH_AND_GRAB_VEHICLE_ENUM SAGV_PLAYER_CHOPPER = 0, //SAGV_TREVOR_JEEP, SAGV_MICHAEL_CAR, SAGV_FRANKLIN_BIKE ENDENUM ENUM SNATCH_AND_GRAB_SHOT_DETAILS_ENUM SAG_SHOT_ARRIVE = 0, SAG_SHOT_ARRIVEB, SAG_SHOT_ARRIVE2, SAG_SHOT_ARRIVE2B, SAG_SHOT_ARRIVE3, SAG_SHOT_ARRIVE3B, SAG_SHOT_INSIDE, SAG_SHOT_SMASH_IN, SAG_SHOT_WAIT_FOR_SWITCH, SAG_SHOT_WAIT_FOR_SWITCHB, SAG_SHOT_WINCHING, SAG_SHOT_WINCHINGB, SAG_SHOT_FIB1, SAG_SHOT_FIB1B, SAG_SHOT_FIB2, SAG_SHOT_FIB2B ENDENUM ENUM SNATCH_AND_GRAB_ANIM_DICT_ENUM SAG_ANIM_DICT_MISSION = 0, SAG_ANIM_DICT_RAPPEL, SAG_ANIM_DICT_GUARDS, SAG_ANIM_DICT_CUTSCENES, SAG_ANIM_DICT_INTRO, SAG_ANIM_DICT_TOWER_SEATED, SAG_ANIM_DICT_TOWER_SEATED_REACT, SAG_ANIM_DICT_TOWER_STANDING, SAG_ANIM_DICT_TOWER_STANDING_REACT_ENTER_L, SAG_ANIM_DICT_TOWER_STANDING_REACT_ENTER_R, SAG_ANIM_DICT_TOWER_STANDING_REACT_IDLE, SAG_ANIM_DICT_AIM_VARIATIONS, SAG_ANIM_DICT_COMBAT_GLANCES, SAG_ANIM_DICT_OVER_THERE, SAG_ANIM_DICT_PANIC, SAG_ANIM_DICT_BECKON, SAG_ANIM_DICT_FOOD_COURT, SAG_ANIM_DICT_AT_LOT, SAG_ANIM_DICT_IN_OFFICE, SAG_ANIM_DICT_FLY_HOME, SAG_ANIM_CAM_SHAKE_LIBRARY, SAG_ANIM_DICT_SNIPER ENDENUM ENUM SNATCH_AND_GRAB_WEAPON_ENUM SAG_WEAPON_MICHAEL_PISTOL = 0, SAG_WEAPON_CIA_PISTOL, SAG_WEAPON_CIA_SMG, SAG_WEAPON_CIA_HELI, SAG_WEAPON_SNIPER_RIFLE, SAG_WEAPON_MICHAEL_RIFLE ENDENUM ENUM SNATCH_AND_GRAB_PTFX_ENUM SAG_PTFX_PLACEHOLDER = 0 ENDENUM ENUM SNATCH_AND_GRAB_SFX_ENUM SAG_SFX_MISSION = 0, SAG_SFX_HELIS //SAG_SFX_RAPPEL ENDENUM ENUM SNATCH_AND_GRAB_MISC_ASSET_ENUM SAG_MISC_ASSET_CAR_ANIMS = 0, SAG_MISC_ASSET_CHOPPER_ANIMS, SAG_MISC_ASSET_HELI_DRIVEBY_ANIMS, SAG_MISC_ASSET_DAVE_WALK //SAG_MISC_ASSET_FOOD_COURT_ANIMS ENDENUM ENUM SNATCH_AND_GRAB_CUTSCENE_STAGE_ENUM SAG_CUT_STAGE_INIT = 0, SAG_CUT_STAGE_RUNNING, SAG_CUT_STAGE_CLEANUP ENDENUM /* ENUM MEETING_SHOT_ENUM MEETING_ARRIVE = 0, MEETING_FADED, MEETING_DRESSED ENDENUM */ ENUM START_RAPPEL_SHOT_ENUM START_RAPPEL_ARRIVE = 0, START_RAPPEL_JUMP ENDENUM ENUM SMASH_THROUGH_SHOT_ENUM SMASH_THROUGH_MOCAP = 0, SMASH_THROUGH_WAIT_FOR_SWITCH, SMASH_THROUGH_PAN //SMASH_THROUGH_MOCAP_2 ENDENUM ENUM DROPOFF_SHOT_ENUM DROPOFF_ESTABLISH = 0, DROPOFF_HANDOVER, DROPOFF_DRIVE ENDENUM ENUM ROPE_TYPE_ENUM ROPE_TYPE_FURLED = 0, ROPE_TYPE_CUTSCENE, ROPE_TYPE_RAPPELLING, ROPE_TYPE_INSIDE, ROPE_TYPE_SWINGING, ROPE_TYPE_DROPOFF ENDENUM ENUM FBI_AI_STAGE_ENUM FBI_AI_WATCH_ARRIVE = 0, FBI_AI_ENTER_CAR, FBI_AI_FOLLOW_RECORDING, FBI_AI_CLEANUP, FBI_AI_DONT_EXIST ENDENUM ENUM FRANKLIN_AI_STAGE_ENUM FRANKLIN_AI_WATCH_ARRIVE = 0, FRANKLIN_AI_MOUNT_BIKE, FRANKLIN_AI_FOLLOW_RECORDING, FRANKLIN_AI_CLEANUP, FRANKLIN_AI_DONT_EXIST ENDENUM ENUM EXTRACT_STAGE_ENUM EXTRACT_STAGE_KILL_INITIAL_GUARDS = 0, EXTRACT_STAGE_REINFORCEMENTS_ENTER, EXTRACT_STAGE_DO_ANIMATION, EXTRACT_STAGE_KILL_REINFORCEMENTS ENDENUM ENUM HANGING_HOTSWAP_STATE_ENUM HANGING_HOTSWAP_ON_TREVOR = 0, HANGING_HOTSWAP_ON_MICHAEL, HANGING_HOTSWAP_ON_FRANKLIN, HANGING_HOTSWAP_MICHAEL_TO_TREVOR, HANGING_HOTSWAP_FRANKLIN_TO_TREVOR, HANGING_HOTSWAP_FRANKLIN_TO_MICHAEL, HANGING_HOTSWAP_TREVOR_TO_MICHAEL, HANGING_HOTSWAP_MICHAEL_TO_FRANKLIN, HANGING_HOTSWAP_TREVOR_TO_FRANKLIN ENDENUM ENUM GUARD_SYNCED_SCENE_ENUM GSS_STANDARD = 0, GSS_LAST_GUARD, //GSS_REIN_ADJUSTED, GSS_REIN_FIRST_EXTRA, GSS_REIN_SECOND_EXTRA, GSS_REIN_THIRD_EXTRA, GSS_REIN_FOURTH_EXTRA ENDENUM ENUM GUARD_SITUATION_REACT_ENUM GS_REACT_NONE = 0, GS_REACT_BULLET_NEAR, GS_REACT_FIRST_SHOT ENDENUM ENUM GUARD_ACTION_ENUM GA_AIM_AT_MICHAEL = 0, GA_AIM_AT_SNIPER, GA_FIRE_ON_SNIPER ENDENUM ENUM PRISONER_GRAB_STATE_ENUM PRISONER_GRAB_STATE_INIT = 0, PRISONER_GRAB_STATE_DUCK_INTRO, PRISONER_GRAB_STATE_DUCK_LOOPING, //PRISONER_GRAB_STATE_DUCK_OUTRO, PRISONER_GRAB_STATE_EXTRACT, PRISONER_GRAB_STATE_DANGLING, PRISONER_GRAB_STATE_WINCHING ENDENUM ENUM HOTSWAP_CAM_ENUM HOTSWAP_CAM_DEFAULT = 0, HOTSWAP_CAM_INSIDE_CHOPPER, HOTSWAP_CAM_OUTSIDE_CHOPPER, HOTSWAP_CAM_CHOPPER_TO_FRANKLIN, HOTSWAP_CAM_FRANKLIN_TO_CHOPPER, HOTSWAP_CAM_HANGING_TO_SNIPER, HOTSWAP_CAM_SNIPER_TO_HANGING ENDENUM ENUM CREATE_MEETING_STAGE_ENUM CREATE_MEETING_STAGE_NOT_STARTED = 0, CREATE_MEETING_STAGE_WAITING_FOR_VEHICLES, CREATE_MEETING_STAGE_VEHICLES_CREATED, CREATE_MEETING_STAGE_WAITING_FOR_PEDS, CREATE_MEETING_STAGE_DONE ENDENUM ENUM CREATE_UTIL_TRUCKS_STAGE_ENUM CREATE_UTIL_TRUCKS_STAGE_NOT_STARTED = 0, CREATE_UTIL_TRUCKS_STAGE_WAITING, CREATE_UTIL_TRUCKS_STAGE_DONE ENDENUM ENUM CREATE_INTERROGATION_STAGE_ENUM CREATE_INTERROGATION_STAGE_NOT_STARTED = 0, CREATE_INTERROGATION_STAGE_WAITING, CREATE_INTERROGATION_STAGE_DONE ENDENUM ENUM CREATE_FBI_AT_END_STAGE_ENUM CREATE_FBI_AT_END_STAGE_NOT_STARTED = 0, CREATE_FBI_AT_END_STAGE_WAITING, CREATE_FBI_AT_END_STAGE_DONE ENDENUM ENUM REPLACE_MR_K_STAGE_ENUM REPLACE_MR_K_STAGE_NOT_STARTED = 0, REPLACE_MR_K_STAGE_WAITING, REPLACE_MR_K_STAGE_DONE ENDENUM ENUM FALL_ENUM FALL_FELL = 0, FALL_ROPE_CUT, FALL_KNOCKED, FALL_DROWNED ENDENUM ENUM SHAPETEST_STATE_ENUM SHAPETEST_STATE_NOT_STARTED = 0, SHAPETEST_STATE_PROBING ENDENUM ENUM HELI_STRAFE_STATE_ENUM HELI_STRAFE_MOVE = 0, HELI_STRAFE_ATTACK ENDENUM ENUM JUMP_GRUNT_STATE_ENUM JUMP_GRUNT_READY = 0, JUMP_GRUNT_DO_ON_LAND, JUMP_GRUNT_DO_ON_PUSH, JUMP_GRUNT_WAIT_FOR_RESET ENDENUM ENUM MICHAEL_RELOAD_STATE_ENUM MICHAEL_RELOAD_HAS_AMMO = 0, MICHAEL_RELOAD_IS_RELOADING ENDENUM ENUM TOWER_PED_STATE_ENUM TOWER_PED_STATE_UNALERTED = 0, TOWER_PED_STATE_ENTER_REACT, TOWER_PED_STATE_REACTING ENDENUM ENUM LEAD_OUT_STATE_ENUM LEAD_OUT_STATE_NOT_STARTED = 0, LEAD_OUT_STATE_WAIT_TO_REVERT, LEAD_OUT_STATE_DONE, LEAD_OUT_STATE_FLEEING ENDENUM ENUM SNATCH_AND_GRAB_AUDIO_SCENE_ENUM SNATCH_AND_GRAB_AUDIO_SCENE_DRIVE_TO_LOT = 0, SNATCH_AND_GRAB_AUDIO_SCENE_FLY_TO_AGENCY, SNATCH_AND_GRAB_AUDIO_SCENE_FOCUS_ON_ROOF, SNATCH_AND_GRAB_AUDIO_SCENE_RAPPEL, SNATCH_AND_GRAB_AUDIO_SCENE_INDOOR, SNATCH_AND_GRAB_AUDIO_SCENE_BREAK_THE_GLASS, SNATCH_AND_GRAB_AUDIO_SCENE_MR_K_HOSTAGE, SNATCH_AND_GRAB_AUDIO_SCENE_FRANKLIN_SNIPE_ENEMIES, SNATCH_AND_GRAB_AUDIO_SCENE_MICHAEL_SHOOT_ENEMIES, SNATCH_AND_GRAB_AUDIO_SCENE_CHOPPERS_ARRIVE_FRANKLIN, SNATCH_AND_GRAB_AUDIO_SCENE_CHOPPERS_ARRIVE_MICHAEL, SNATCH_AND_GRAB_AUDIO_SCENE_CHOPPERS_ARRIVE_TREVOR, SNATCH_AND_GRAB_AUDIO_SCENE_FLY_BACK_AS_TREVOR, SNATCH_AND_GRAB_AUDIO_SCENE_FLY_BACK_AS_MICHAEL, SNATCH_AND_GRAB_AUDIO_SCENE_LAND_THE_HELI ENDENUM ENUM PICKUP_CHOPPER_LEADIN_STAGE_ENUM PICKUP_CHOPPER_LEADIN_NOT_STARTED = 0, PICKUP_CHOPPER_LEADIN_LOOPING, PICKUP_CHOPPER_LEADIN_ACTION, PICKUP_CHOPPER_LEADIN_DONE ENDENUM ENUM DAVE_INTO_CAR_STATE_ENUM DAVE_INTO_CAR_STATE_WALKING = 0, DAVE_INTO_CAR_STATE_ENTER, DAVE_INTO_CAR_STATE_PAUSED ENDENUM // Structs STRUCT GUARD_AI GUARD_ACTION_ENUM currentAction GUARD_SITUATION_REACT_ENUM currentSituation INT iRevertActionTime ENDSTRUCT // Consts CONST_INT NUMBER_MODEL_REQUEST_SLOTS COUNT_OF(SNATCH_AND_GRAB_MODEL_ENUM) CONST_INT NUMBER_RECORDING_REQUEST_SLOTS 13 CONST_INT NUMBER_FBI_AGENTS 2 CONST_INT NUMBER_FBI_CARS 2 CONST_INT NUMBER_GUARDS 6 CONST_INT NUMBER_ENEMY_CHOPPERS 4 CONST_INT GUARD_FIRST_WAVE_INDEX 0 CONST_INT GUARD_SECOND_WAVE_INDEX 3 CONST_INT NUMBER_FROZEN_CHAIRS 2 CONST_INT NUMBER_TOWER_CHAIRS 3 CONST_INT NUMBER_TOWER_WINDOWS 3 CONST_INT NUMBER_FOOD_COURT_CHAIRS 7 CONST_INT NUMBER_TOWER_PEDS 5 CONST_INT GUARD_LAST_INDEX 4 CONST_INT NUMBER_REINFORCEMENTS 8 CONST_INT NUMBER_TRAFFIC_VEHICLES 15 CONST_INT NUMBER_LEAVE_HIGH_RISE_AREA_POINTS 10 CONST_INT NUMBER_ESCAPE_ROUTE_POINTS 45 CONST_INT MAX_SKIP_MENU_LENGTH 13 CONST_INT SKIP_FADE_WAIT_TIME 200 CONST_INT SKIP_FADE_LONG_WAIT_TIME 1600 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 FREE_AIM_THRESHOLD 11 CONST_INT GUARD_ATTACK_TIME_INIT 90000 CONST_INT GUARD_ATTACK_TIME_SHOOTING 35000 CONST_INT CHOPPER_HELP_TIME 7000 CONST_INT FOCUS_HELP_TIME 4000 CONST_INT MIN_RANDOM_SPEECH_TIME 7000 CONST_INT MAX_RANDOM_SPEECH_TIME 12000 CONST_INT WINCH_CUTSCENE_TIME 7000 CONST_INT DOORHASH_OPEN_DOOR HASH("DOORHASH_OPEN_DOOR") CONST_INT DOORHASH_CLOSED_DOOR1 HASH("DOORHASH_CLOSED_DOOR1") CONST_INT DOORHASH_CLOSED_DOOR2 HASH("DOORHASH_CLOSED_DOOR2") CONST_INT FRANKLIN_SMART_FEET 9 CONST_INT FRANKLIN_SMART_TORSO 18 CONST_INT FRANKLIN_SMART_LEG 15 CONST_FLOAT CLEAR_POS_RADIUS 3.2 CONST_FLOAT RAPPEL_VEHICLE_RANGE_MULTIPLIER 0.8 CONST_FLOAT CHOPPER_HOVER_SPEED 0.5 CONST_FLOAT CHOPPER_ESCAPE_SPEED 0.9 CONST_FLOAT ROPE_SHOOT_TURN_SPEED 80.0 CONST_FLOAT CHASE_START_WINDING_TIME 4000.0 CONST_FLOAT CHASE_STOP_WINDING_TIME 20000.0 CONST_FLOAT WINDING_LENGTH 16000.0 CONST_FLOAT CHASE_UNPIN_INTERIOR_TIME 36000.0 CONST_FLOAT CHASE_FORCE_SWITCH_TIME 20500.0 CONST_FLOAT CHASE_SPOT_CHOPPER_TIME 23000.0 CONST_FLOAT SKIP_CHOPPER_PLAYBACK_TIME 10000.0 CONST_FLOAT AFTER_CUTSCENE_TIME 2000.0 CONST_FLOAT AFTER_CUTSCENE_LONG_TIME 4000.0 CONST_FLOAT ROPE_ATTACH_Z - 0.9 CONST_FLOAT RAPPEL_ROPE_LENGTH_LONG 72.7//64.7 CONST_FLOAT RAPPEL_ROPE_LENGTH_DANGLING 63.0 CONST_FLOAT RAPPEL_ROPE_LENGTH_WOUND 25.0//65.1 CONST_FLOAT RAPPEL_ROPE_STORE_Y_OFFSET 0.4 CONST_FLOAT RAPPEL_ROPE_STORE_Z_OFFSET 0.01 CONST_FLOAT RAPPEL_ROPE_FALL_ACCELERATION 6.0 CONST_FLOAT RAPPEL_ROPE_FALL_MAX_SPEED 12.0 CONST_FLOAT RAPPEL_READY_Z -61.0 CONST_FLOAT RAPPEL_ROPE_WEIGHT 30.0 CONST_FLOAT INIT_ROPE_ATTACH_HEADING 234.3 CONST_FLOAT START_RAPPEL_Z 13.5 CONST_FLOAT WEIGHT_PHYSICAL_MASS 150.0 CONST_FLOAT WEIGHT_PHYSICAL_GRAVITY 1.0 CONST_FLOAT ATTACH_CAM_OFFSET_MOD_X 0.03 CONST_FLOAT ATTACH_CAM_OFFSET_LIMIT_X 3.0 CONST_FLOAT ATTACH_CAM_OFFSET_MOD_Y 0.03 CONST_FLOAT ATTACH_CAM_OFFSET_LIMIT_Y 3.0 CONST_FLOAT ATTACH_CAM_OFFSET_MOD_Z -0.03 CONST_FLOAT ATTACH_CAM_OFFSET_LIMIT_Z 3.0 CONST_FLOAT ATTACH_CAM_OFFSET_PLUS_Z -0.03 CONST_FLOAT DOOR_OPEN_RATIO -1.28 CONST_FLOAT ESCAPE_ROUTE_HEIGHT 190.0 CONST_FLOAT PLAYER_INIT_ROT 70.2//-63.0//-45.33 CONST_FLOAT PLAYER_INIT_ROT2 135.8 CONST_FLOAT DAVE_INIT_ROT 24.84 CONST_FLOAT DAVE_INIT_ROT2 79.1 CONST_FLOAT TREVOR_INIT_ROT 137.37 CONST_FLOAT FRANKLIN_INIT_ROT 6.54 CONST_FLOAT FRANKLIN_SNIPER_ROT -96.9 CONST_FLOAT MICHAEL_CAR_INIT_ROT -19.9//339.68 CONST_FLOAT BIKE_INIT_ROT -78.9 CONST_FLOAT JEEP_INIT_ROT 16.67 CONST_FLOAT CHOPPER_INIT_ROT -15.08 CONST_FLOAT PICKUP_CHOPPER_LEADIN_ROT -15.47 CONST_FLOAT CHOPPER_HOVER_ROT 167.90 CONST_FLOAT CHOPPER_CHASE_END_ROT -129.27 CONST_FLOAT WINDOW_ROT -103.14 CONST_FLOAT BREAK_IN_ROT -96.20 CONST_FLOAT PRISONER_INIT_ROT 255.98 CONST_FLOAT MICHELLE_INIT_ROT 78.59 CONST_FLOAT INTERROGATION_ROT -125.7// -126.19 CONST_FLOAT SNIPER_ROT 85.67 CONST_FLOAT REMOTE_ROT -100.63 CONST_FLOAT END_ROT -22.4 CONST_FLOAT GUARD_ANIM_ORIGIN_ROT 145.500 CONST_FLOAT MOVE_LAST_PLAYER_VEHICLE_ROT -18.98 CONST_FLOAT MICHAEL_AT_FOOD_COURT_ROT -65.4 CONST_FLOAT MAX_DAVE_WALK_SPEED 1.15 CONST_FLOAT MIN_DAVE_WALK_SPEED 0.9 CONST_FLOAT RAPPEL_CAM_X_Y_INPUT_TO_DEGREES_FACTOR 1.2 CONST_FLOAT RAPPEL_CAM_X_Y_SPEED 0.4 CONST_FLOAT RAPPEL_CAM_Z_UPPER_LIMIT 7.0 CONST_FLOAT RAPPEL_CAM_Z_LOWER_LIMIT -6.0 CONST_FLOAT RAPPEL_CAM_FOV 44.2 CONST_FLOAT INIT_SNIPER_ZOOM 3.0 CONST_FLOAT CASCADE_SHADOWS_MULTIPLIER_EXTERIOR_OVERRIDE 2.0 CONST_FLOAT CASCADE_SHADOWS_MULTIPLIER_INTERIOR_OVERRIDE 0.25 CONST_FLOAT CASCADE_SHADOWS_MULTIPLIER_NO_OVERRIDE 1.0 CONST_FLOAT CASCADE_SHADOWS_ROPE_OVERRIDE 2.1 CONST_FLOAT GUARD_ANIM_BLEND_OUT -0.25 CONST_FLOAT DAVE_PAUSE_DIST 3.6//7.0 CONST_FLOAT DAVE_UNPAUSE_DIST 3.2//4.1//3.2 CONST_FLOAT MAX_TRANSITION_BLUR 10.0 // 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 SNATCH_AND_GRAB_CUTSCENE_STAGE_ENUM cutsceneStage EXTRACT_STAGE_ENUM extractStage HANGING_HOTSWAP_STATE_ENUM hangingHotswapState PRISONER_GRAB_STATE_ENUM prisonerGrabState CREATE_MEETING_STAGE_ENUM createMeetingStage CREATE_UTIL_TRUCKS_STAGE_ENUM createUtilTrucksStage CREATE_INTERROGATION_STAGE_ENUM createInterrogationStage CREATE_FBI_AT_END_STAGE_ENUM createFBIAtEndStage REPLACE_MR_K_STAGE_ENUM replaceMrKStage GUARD_AI guardAI[NUMBER_GUARDS] SELECTOR_PED_STRUCT sSelectorPeds SELECTOR_CAM_STRUCT sCamDetails //MEETING_SHOT_ENUM meetingShot SMASH_THROUGH_SHOT_ENUM smashThroughShot //DROPOFF_SHOT_ENUM dropoffShot JUMP_GRUNT_STATE_ENUM jumpGruntState HELI_STRAFE_STATE_ENUM heliStrafeState TOWER_PED_STATE_ENUM towerPedState[NUMBER_TOWER_PEDS] //MICHAEL_RELOAD_STATE_ENUM michaelReloadState //LEAD_OUT_STATE_ENUM steveLeadOutState //LEAD_OUT_STATE_ENUM andreasLeadOutState RAGDOLL_BLOCKING_FLAGS steveRagdollBlocking = RBF_PLAYER_IMPACT | RBF_VEHICLE_IMPACT | RBF_IMPACT_OBJECT PICKUP_CHOPPER_LEADIN_STAGE_ENUM pickupChopperLeadinStage DAVE_INTO_CAR_STATE_ENUM daveIntoCarState // Peds PED_INDEX davePed PED_INDEX stevePed PED_INDEX andreasPed PED_INDEX prisonerPed PED_INDEX michellePed PED_INDEX towerPed[NUMBER_TOWER_PEDS] PED_INDEX fbiPed[NUMBER_FBI_AGENTS] PED_INDEX guardPed[NUMBER_GUARDS] PED_INDEX reinforcementPed[NUMBER_REINFORCEMENTS] PED_INDEX enemyChopperPed[NUMBER_ENEMY_CHOPPERS*3] PED_INDEX michaelTargetPed PED_INDEX dummyFranklinPed PED_INDEX dummyTrevorPed // Vehicles VEHICLE_INDEX snatchAndGrabVehicle[COUNT_OF(SNATCH_AND_GRAB_VEHICLE_ENUM)] VEHICLE_INDEX enemyChopperVehicle[NUMBER_ENEMY_CHOPPERS] VEHICLE_INDEX fbiVanVehicle VEHICLE_INDEX trafficVehicle[NUMBER_TRAFFIC_VEHICLES] VEHICLE_INDEX michaelTargetVehicle VEHICLE_INDEX franklinTargetVehicle VEHICLE_INDEX utilTruckVehicle[3] VEHICLE_INDEX driveAwayVehicle // Objects OBJECT_INDEX harnessObject OBJECT_INDEX torchObject OBJECT_INDEX chairObject OBJECT_INDEX towerChairObject[NUMBER_TOWER_CHAIRS] OBJECT_INDEX frozenChairObject[NUMBER_FROZEN_CHAIRS] OBJECT_INDEX foodCourtChairObject[NUMBER_FOOD_COURT_CHAIRS] //OBJECT_INDEX hookObject OBJECT_INDEX franklinAnchorObject OBJECT_INDEX michaelGunObject OBJECT_INDEX coffeeObject[3] OBJECT_INDEX cutsceneChairObject[6] // Blips BLIP_INDEX vehicleBlip BLIP_INDEX getToBlip BLIP_INDEX buddyBlip BLIP_INDEX guardBlip[NUMBER_GUARDS] BLIP_INDEX reinforcementBlip[NUMBER_REINFORCEMENTS] BLIP_INDEX enemyChopperBlip[NUMBER_ENEMY_CHOPPERS] BLIP_INDEX playerChopperBlip BLIP_INDEX franklinSniperBlip // Cameras CAMERA_INDEX staticCam CAMERA_INDEX interpCam //CAMERA_INDEX holdShotCam CAMERA_INDEX animCam CAMERA_INDEX ropeCam //CAMERA_INDEX followCam // Bools BOOL bModelRequestTracker[COUNT_OF(SNATCH_AND_GRAB_MODEL_ENUM)] BOOL bVehicleRecordingRequestTracker[NUMBER_RECORDING_REQUEST_SLOTS] BOOL bAnimDictRequestTracker[COUNT_OF(SNATCH_AND_GRAB_ANIM_DICT_ENUM)] BOOL bWeaponRequestTracker[COUNT_OF(SNATCH_AND_GRAB_WEAPON_ENUM)] BOOL bPTFXRequestTracker[COUNT_OF(SNATCH_AND_GRAB_PTFX_ENUM)] BOOL bSFXRequestTracker[COUNT_OF(SNATCH_AND_GRAB_SFX_ENUM)] BOOL bMiscAssetRequestTracker[COUNT_OF(SNATCH_AND_GRAB_MISC_ASSET_ENUM)] BOOL bThoroughCleanup BOOL bForcePassOnShitskip BOOL bRunningCutscene BOOL bSkippedCutscene BOOL bClearedForCutscene BOOL bCutsceneWaitStarted BOOL bShownGodText BOOL bDoneChopperLandSpeech BOOL bSniperMusicStarted BOOL bDoneGotoSpeech BOOL bShouldDoGetInText BOOL bDoneBanter BOOL bSavedBanter BOOL bRemovedBlipsForWanted //BOOL bKilledConversationOnWanted BOOL bShownLoseWantedPrompt BOOL bCloseToBuilding BOOL bWaitForBuddyPrompt BOOL bGetBuddyPrompt BOOL bInteriorPinned //BOOL bFadedOut BOOL bMusicFaded BOOL bMeetingCutsceneMusicStart BOOL bMeetingCutsceneMusicEnd BOOL bSteveSeated BOOL bAndreasSeated BOOL bDaveSeated BOOL bLoopSteveAndAndreas BOOL bRemovedSteveAndAndreas BOOL bDoneGetToLotSpeech //BOOL bForceIntoCar BOOL bCarIsMoving BOOL bRegisteredCall //BOOL bRestoredControlOnStart BOOL bChangedClothes BOOL bRemovedFBICar //BOOL bLatchedChopperDoors BOOL bRemovedAltitudeHelp //BOOL bStartedRappelSound BOOL bDoneGetInPositionSpeech BOOL bKilledBanterInChopper BOOL bArrivedAtBuilding BOOL bPlayingHoverBackwards BOOL bAlertedWindow[NUMBER_TOWER_WINDOWS] BOOL bCreatedOfficePedsForRappel BOOL bInitialisedInterrogation //BOOL bTakeOverRappelControl //BOOL bFocusRappelCamIntoOffice //BOOL bRestoreRappelCamToPlayer BOOL bTortureMusicStart BOOL bDoneSeeHelp //BOOL bDoneWaitHelp BOOL bHasDoneJump //BOOL bSetSmashHelp //BOOL bDisplayJumpHelp BOOL bUsingOfficeCam //BOOL bHoldingShot BOOL bAllowSmashIn BOOL bDeletedTraffic BOOL bCreatedSniper //BOOL bDrewWeapon BOOL bGaveGuardWeapon BOOL bTriggeredGuardShoot BOOL bDoGuardsKillMichael BOOL bFakeKillMichael BOOL bResetGuardAim BOOL bRegisteredSmash //BOOL bDoneSmashInSpeech BOOL bPinRopeToWindow BOOL bShownSwitchText BOOL bFrozenFranklin //BOOL bSniperOneshot BOOL bDoneFranklinSniperSpeech BOOL bKilledSpeechOnPan BOOL bGuardsHeardSniper BOOL bDoneGuardBeckon BOOL bRappelMusicStart //BOOL bRemovedGuardDialogue BOOL bAdvancedGuardAttackTime BOOL bSelectedMichaelDuringExtract BOOL bActivatedRopeSwingFromSynced //BOOL bKilledSmashOS BOOL bDoneExtractSpeech //BOOL bDoneExtractHelp BOOL bReactedToFirstShot BOOL bAdditionalGuardsToShoot BOOL bDoneGetOutSpeech BOOL bCreatedAdditionalReinforcement[4] BOOL bReinforcementToShoot[NUMBER_REINFORCEMENTS] BOOL bUnpinnedInteriorForChase BOOL bStartedWinding BOOL bStoppedWinding BOOL bSwingingRight BOOL bRopePhysical BOOL bDoneDangleHelp BOOL bDoneReattach BOOL bEnemyChopperShootersToAttack[NUMBER_ENEMY_CHOPPERS] BOOL bShownChopperPrompt BOOL bEnemyChopperToAI[NUMBER_ENEMY_CHOPPERS] BOOL bDoneDestroyedChopperSpeech[NUMBER_ENEMY_CHOPPERS] BOOL bKilledEnemyChopperPed[NUMBER_ENEMY_CHOPPERS * 3] BOOL bSpottedChopper BOOL bDoneChopperChoiceSpeech BOOL bDoneMakeMichaelMoreLethal BOOL bDoneTrevorFly BOOL bAllowStartEscapeRoute BOOL bStartedRotateToLeaveHighRiseArea BOOL bStartedJourneyToLeaveHighRiseArea //BOOL bAttachedBlock BOOL bKnockedOff BOOL bLoadedExtractSpeech BOOL bDoneGoHomeSpeech BOOL bDoChopperSpinOut[NUMBER_ENEMY_CHOPPERS] BOOL bRemovedEnemyChopper BOOL bSwitchedBackDuringDropoff BOOL bDoneForceTrevorLow BOOL bDoneFBITurnToFaceChopper BOOL bDoneFBIWaveDownChopper BOOL bDoneLandSpeech BOOL bDoneLandAudioScene BOOL bKilledSpeechForLand //BOOL bLockedToTrevor //BOOL bMichaelToRagdoll //BOOL bBackedUpZoom BOOL bSkippedGlassSmash BOOL bDoForceHeliUpwards BOOL bAlternateChopper BOOL bShortRope BOOL bStartExtraction BOOL bDonePanicSpeech BOOL bDoneRealPanicSpeech BOOL bReattachedMichael BOOL bDoneTrevorEncourageSpeech BOOL bKilledBanter //BOOL bDoneBriefTroopsSpeech BOOL bSetSniperZoom //BOOL bDoneFranklinDangerHelp BOOL bRemovedUtilTrucks BOOL bDoneChopperAttackFranklinSpeech BOOL bDoneFranklinReactToChopperSpeech BOOL bDoneLastOneSpeech BOOL bDoneRocketReactionSpeech BOOL bDoneTrevorRemindFranklinSpeech BOOL bDoneFranklinSayChopperDownSpeech BOOL bDoneTrevorCongratulateFranklinSpeech BOOL bDoneWeHitSpeech BOOL bDoneWayHomeSpeech BOOL bDoneWayHomeSpeech2 BOOL bDoneGetOffRoofSpeech //BOOL bDoneKeepSniperSpeech BOOL bRequestedGuardAnims BOOL bRequestedAtBuildingAssets BOOL bDoneSmashSound BOOL bHeliLiftedOff BOOL bDoneInterpBackToGame BOOL bDoneApproachLotCue BOOL bDoneHalfwayThereCue BOOL bDoneSwitchToFranklinCue BOOL bDoneKill3GuardsCue BOOL bPreparedChoppersApproachingCue BOOL bDoneChoppersApproachingCue BOOL bDoneMichaelFightsChoppersCue BOOL bDoneNoMoreThreatCue BOOL bDoneMissionCompleteCue BOOL bUnmuffledRappelAudioScene BOOL bInteriorCamIsOutside BOOL bDoneDontShootSpeech BOOL bClearedAutopilot //BOOL bKilledTrevorDiscussionSpeech //BOOL bRestartedDiscussionSpeech BOOL bDisableSwitchDuringMagDemoEndScene BOOL bKeepTorch BOOL bCheckedInitialSniper BOOL bGuardsAttackPrisoner BOOL bGuardsStoppedShooting BOOL bDoLeadHeliFireRockets BOOL bDoneDaveLetsGoSpeech BOOL bDaveInCar BOOL bDoneSteveLook BOOL bDoneAndreasLook BOOL bDoneInCarAudioScene BOOL bTrevorGone BOOL bDoneMichaelLeaveCarSpeech BOOL bStuckOnOfficeCam BOOL bWaitingOnOfficeCamRelease BOOL bPreparedTrevorRantAudio BOOL bSetSceneAudioEntity BOOL bCanRunPickupChopperScene BOOL bDaveActionModeTrack BOOL bDoneDaveShuffle BOOL bKilledDaveSpeechForDamage BOOL bKilledDaveSpeechForWanted BOOL bDoneDaveWantedSpeech BOOL bWarpedToLot BOOL bWarpedChopperToBuilding BOOL bResetTimeForBelowHeight BOOL bChangedPriorityFromSniperToTrevor BOOL bDoneFocusCamAudioScene BOOL bDoneCantGetShotSpeech BOOL bDoneTroubleFlashHelp BOOL bLastReinforcementIsLast BOOL bDoneTopOfTowerShot BOOL bTriggeredGreetingAnim BOOL bTriggeredGreetingSpeech BOOL bPlayerLeaveVehicle BOOL bDoneIntroCreateEntities BOOL bDoneIntroClearStart BOOL bWasTimeLapseRunning BOOL bDoneDaveCarSpeech BOOL bKilledSpeechForDaveCar BOOL bCuedFriendlyFireSpeech BOOL bDoneForceGetOutOfThereSpeech BOOL bDoneLastGuardEnter BOOL bLastGuardToShoot BOOL bSuppressFutureReplaySetups BOOL bForceStartedChopper BOOL bSetMichaelToWalk BOOL bDoneTowerHintCamHelp BOOL bDisabledBlurOnRifle BOOL bRocketsAccurate BOOL bCreatedGuysAtFoodCourt BOOL bKilledLookAtInCar BOOL bKilledMichaelLeaveCarSpeechForTime BOOL bUnproofedChoppers BOOL bDoMichaelBoom BOOL bHitCutsceneFailsafe BOOL bSetNavmesh BOOL bHitFranklinSound BOOL bPrestreamedLine BOOL bCreatedExtraHeli BOOL bFrozeChairs BOOL bShownSlowmoHelp BOOL bFilledMichaelMeter BOOL bCacheAt BOOL bTurnedOffRadarForSuppressHud BOOL bApplyOffsetToWinchRope BOOL bFadedIn BOOL bStartPushIn BOOL bDoneHitSound BOOL bWooshStarted BOOL bDoneFlash BOOL bFlashOnTimeLapse BOOL bSwitchToFirstPerson // Floats FLOAT fHoverPlaybackSpeed FLOAT fRopeAttachHeading FLOAT fPlaybackTime FLOAT fTargetChopperRotate //FLOAT fPointCamY //FLOAT fPointCamZ //FLOAT fPointCamYSpeed //FLOAT fPointCamZSpeed FLOAT fLockDoorOpen //FLOAT fTempPhase FLOAT fAtDropOffTime FLOAT fSpinForce FLOAT fUpwardsForce FLOAT fChopperAccuracy FLOAT fRopeTransitionPhase //FLOAT fDrownTime FLOAT fRappelCamTransitionPhase FLOAT fRappelCamTransitionPhaseSpeed FLOAT fHeliCircleAngle FLOAT fBelowWaveHeightTime FLOAT fAtWindowTime[NUMBER_TOWER_WINDOWS] FLOAT fDaveWalkSpeed FLOAT fCircleCentreMod FLOAT g_fSavedMaxMotionBlur = -1.0 // Ints INT iReplayAttempt INT iAllowSkipCutsceneTime INT iSnatchAndGrabCutsceneTime INT iCutsceneTriggerTime INT iNextRandomSpeechTime INT iGetInTextStage INT iChopperHelpTime INT iHelpStage INT iDriveBanterStage //INT iInterrogationSpeechStage INT iKillMichaelTime //INT iHoldShotStage //INT iHoldShotTime //INT iDeactivateHoldShotTime INT iGuardReactionStage INT ireactionDelay //added Reaction delay so that guards dont perform reactions dead in sync - Craig INT iGuardAttackTime INT iGuardSpeech INT iGuardShot //INT iTriggerGuardShootTime INT iPostKilledGuardsTime INT iChopperChaseTime INT iStartWindingTime INT iAlertedWindowTime[NUMBER_TOWER_WINDOWS] //INT iTrevorTime INT iEnemyChopperAITime[NUMBER_ENEMY_CHOPPERS] INT iEnemyChopperSpeechStage INT iNextEnemyChopperSpeechTime INT iTrevorRouteStage INT iLeaveHighRiseAreaPoint INT iAllowGoHomeTime INT iStartMissionStageTime INT iSyncScene INT iSyncScene2 INT iGuardSyncScene[COUNT_OF(GUARD_SYNCED_SCENE_ENUM)] INT iNextGuardAnimationTime[NUMBER_GUARDS] INT iLastGuardAnimationTime[NUMBER_GUARDS] INT iReinforcementShootWhileMovingStage[NUMBER_REINFORCEMENTS] //INT iDangleMichaelSyncScene //INT iDanglePrisonerSyncScene INT iFoodCourtSyncScene INT iWindowSmashStage INT iClearHelpTime INT iShownGodTextTime INT iTrevorEscapeRoutePoint INT iRecheckMichaelShootTime INT iNextFranklinSnipeTime INT iRecheckFranklinShootTime INT iNextMichaelRappelSpeechTime //INT iNextTrafficCarTime INT iMichaelRappelSpeechStage INT iFranklinTargetPed INT iSpinModifier INT iFadeInTime INT iForceHeliUpwardsTime INT iDangleSoundID = GET_SOUND_ID() INT iSmashSoundID = GET_SOUND_ID() INT iRappelWindSoundID = GET_SOUND_ID() INT iFaintHeliSoundID = GET_SOUND_ID() INT iSniperSwitchSoundID = GET_SOUND_ID() //INT iTrafficRec[NUMBER_TRAFFIC_VEHICLES] INT iDangleTime INT iWinchTime INT iFranklinPanicTime INT iSwitchToMichaelPromptTime //INT iFranklinDamageCount INT iNextFranklinDamageCheckTime //INT iDidPanicSpeechTime INT iFranklinDeathTime INT iNextMrKSpeechTime INT iMrKSpeechStage INT iTrevorRemindFranklinTime INT iTrevorSayWeHitTime INT iNextGetInPositionSpeechTime INT iInterpBackToGameTime INT iLastEnemyRocketsTime INT iNextFranklinRocketReactionTime INT iDuckAnim INT iFlinchLeftAnim INT iFlinchRightAnim INT iClearAutopilotTime INT iNextTrevorAITime INT iHeliFlyOffState INT iInitialSniperAmmo INT iLeadHeli INT iLeadHeliFireRocketsTime INT iLastFBITaskTime //INT iWaitForFadeTime INT iNextRocketInBarrageTime INT iLoopSteveAndAndreasTime INT iTrevorFlyOffTime INT iWaitToKillCam INT iActivatedOfficeCamTime INT iDaveActionModeDelay INT iNextCheckPlayerDealDamageTime INT iSteveSyncScene INT iAndreasSyncScene INT iDaveSyncScene INT iReinforcementsEnterTime INT iCreatedLastReinforcementTime INT iCantGetShotSpeechTime INT iLastFakeDamagedMichaelTime INT iDaveDamageSpeechCount INT iNextKickbackTime INT iNextFriendlyFireSpeechTime INT iCueFriendlyFireSpeechTime INT iInterrogationSubCount INT iReactToFirstShotTime INT iNextExplosionCheckTime INT iMichaelLeaveCarSpeechTime INT iSkipTime INT iPushInTime INT iSetNavmeshTime INT iLoadedExtractSpeechTime INT iCreateExtraHeliTime INT iSlowmoHelpTime INT iSavedAmmo = -1 INT iBlockMichaelShootTime INT iSelectorPressedTime INT iHitTime INT iSwitchTime //INT iSteveRevertTime //INT iAndreasRevertTime // Vectors VECTOR vShiftVectorSpeed //VECTOR vCurrentKickBackOffset VECTOR vCurrentKickBackForce VECTOR vTrevorRoutePoint[3] VECTOR vCachedPrisonerPos // cache trevor mission FLOAT fTrevorDist BOOL bTrevorCachedTarget // Other variables RAPPEL_DATA rappelData SCENARIO_BLOCKING_INDEX lotScenarioBlocking SCENARIO_BLOCKING_INDEX tableScenarioBlocking SCENARIO_BLOCKING_INDEX rampScenarioBlocking //SCENARIO_BLOCKING_INDEX skyScenarioBlocking INTERIOR_INSTANCE_INDEX officeInterior RAYFIRE_INDEX windowRayfire SEQUENCE_INDEX sequence STREAMVOL_ID officeVolume STREAMVOL_ID sniperVolume ROPE_INDEX choppedRope1 ROPE_INDEX choppedRope2 //CHECKPOINT_INDEX jumpCheckpoint structPedsForConversation snatchAndGrabConversation REL_GROUP_HASH agencyRelGroup structTimelapse sTimelapse CHASE_HINT_CAM_STRUCT localChaseHintCamStruct STREAMVOL_ID foodCourtStreamingVolume TEXT_LABEL_23 tSavedBanterRoot TEXT_LABEL_23 tResumeBanterLabel PUSH_IN_DATA pushInData //VECTOR vSniperNodePos1 = <<109.385162,-618.262939,206.679871>>//<<109.195,-619.290,206.681>> //VECTOR vSniperNodeRot1 = <<-5.776209,0.000091,-104.552910>>//<<-0.658756,0.010757,-95.572708>>//<<-0.0969, 0.0, -83.3608>> /* VECTOR vSniperNodePos2 = <<-135.569, -592.585, 211.870>> //<<-137.246,-592.720,211.842>> VECTOR vSniperNodeRot2 = <<-1.681, 0.0, -100.0>> //<<-1.680723,0.0,-93.077797>> //<<-0.658756,0.010757,-95.572708>> VECTOR vSniperNodePos3 = <<-136.085, -592.5285, 211.910>> //<<-137.700,-592.700,211.842>> VECTOR vSniperNodeRot3 = <<-1.681, 0.0, -100.0>> //<<-1.680723,0.0,-93.077797>> //<<-0.658756,0.010757,-95.572708>> VECTOR vSniperNodePos4 = <<-136.601, -592.472, 211.950>> //<<-137.700,-592.700,211.842>> VECTOR vSniperNodeRot4 = <<-1.681, 0.0, -100.0>> //<<-1.680723,0.0,-93.077797>> //<<-0.658756,0.010757,-95.572708>> VECTOR vSniperNodePos5 = <<-136.005, -592.540, 211.880>>//<<-137.700,-592.700,211.842>> VECTOR vSniperNodeRot5 = <<-3.473, 0.0, -97.369>> //<<-1.680723,0.0,-93.077797>>//<<-6.112012, 0.0, -93.078186>> VECTOR vSniperNodePos6 = <<-135.729,-592.570,211.850>>//<<-135.915, -592.551, 211.862>> VECTOR vSniperNodeRot6 = <<-3.473, 0.0, -97.369>> //<<-1.680723,0.0,-93.077797>>//<<-3.837169, 0.000000, -93.078186>> */ // NEW VALUES - ROB VECTOR vSniperNodePos3 = <<-136.7, -592.6, 211.870>>//<<-136.085, -592.640, 211.910>> //<<-137.700,-592.700,211.842>> VECTOR vSniperNodeRot3 = <<-1.7, 0.0, -98.1>>//<<-1.681, 0.0, -100.0>> //<<-1.680723,0.0,-93.077797>> //<<-0.658756,0.010757,-95.572708>> //VECTOR vSniperNodePos4 = <<-136.601, -592.472, 211.950>> //<<-137.700,-592.700,211.842>> //VECTOR vSniperNodeRot4 = <<-1.681, 0.0, -100.0>> //<<-1.680723,0.0,-93.077797>> //<<-0.658756,0.010757,-95.572708>> //VECTOR vSniperNodePos5 = <<-136.005, -592.540, 211.880>>//<<-137.700,-592.700,211.842>> //VECTOR vSniperNodeRot5 = <<-1.680723,0.0,-93.077797>>//<<-6.112012, 0.0, -93.078186>> //VECTOR vSniperNodePos6 = <<-135.915, -592.551, 211.862>> //VECTOR vSniperNodeRot6 = <<-1.680723,0.0,-93.077797>>//<<-3.837169, 0.000000, -93.078186>> INT iSuppressHUDTime // Debug #IF IS_DEBUG_BUILD WIDGET_GROUP_ID snatchAndGrabWidgets TEXT_WIDGET_ID RBCamPosWidget, RBCamRotWidget BOOL bRBDebugCamDoDump VECTOR vRBDebugCamPos VECTOR vRBDebugCamRot BOOL bDebugJSkip MissionStageMenuTextStruct stageMenu[MAX_SKIP_MENU_LENGTH] INT iMenuMissionStage INT iDebugStage = -1 BOOL bDebugUseAlternateRappelCam BOOL bDebugDontFailOnKnockoff #ENDIF BOOL bDebugCanWinch = FALSE BOOL bDebugSwingOutEarlier = TRUE BOOL bDebugSkipMagdemoStart BOOL bDebugSkipMagdemoZskipped //BOOL bDebugSkipMagdemoUseRing = TRUE // get recording prefix FUNC STRING GET_FBI2_INTRO_CUTSCENE_NAME() RETURN "fbi_2_int" ENDFUNC FUNC STRING GET_SNATCH_AND_GRAB_RECORDING_PREFIX() RETURN "SnatchNGrab" ENDFUNC // get mission audio bank FUNC STRING GET_MISSION_AUDIO_BANK_NAME() RETURN "FBI_02_Snatch_and_Grab_01" ENDFUNC FUNC STRING GET_HELI_DRIVEBY_ANIMS_AS_STRING() RETURN "clipset@missfbi2_driveby" ENDFUNC FUNC STRING GET_DESCRIPTION_FOR_STAGE_AS_STRING(MISSION_STAGE_ENUM thisStage) SWITCH thisStage CASE STAGE_FOOD_COURT RETURN "Meet at food court" BREAK CASE STAGE_GET_TO_CHOPPER RETURN "Get to chopper" BREAK CASE STAGE_GET_TO_BUILDING RETURN "Get to Agency building" BREAK CASE STAGE_RAPPEL_DOWN RETURN "Rappel to window" BREAK CASE STAGE_SNIPE_GUARDS RETURN "Snipe guards" BREAK CASE STAGE_CHOPPER_CHASE RETURN "Escape enemy chopper" BREAK CASE STAGE_DROPOFF RETURN "Drop off Mr K" 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) 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, DEFAULT_GOD_TEXT_TIME, 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 bAllowOverrideSpeech = FALSE, BOOL bDisplaySubtitles = TRUE, BOOL bFromSpecifiedLine = FALSE) IF bSupercedeText OR NOT IS_MESSAGE_BEING_DISPLAYED() OR NOT IS_SUBTITLE_PREFERENCE_SWITCHED_ON() IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() OR bAllowOverrideSpeech IF CAN_ADVANCE_MISSION() enumSubtitlesState subtitlesState IF bDisplaySubtitles subtitlesState = DISPLAY_SUBTITLES ELSE subtitlesState = DO_NOT_DISPLAY_SUBTITLES ENDIF IF iLine = 0 RETURN CREATE_CONVERSATION(snatchAndGrabConversation, "FBI2AUD", sSpeech, CONV_PRIORITY_HIGH, subtitlesState) ELSE TEXT_LABEL tLine tLine = sSpeech tLine+="_" tLine+=iLine IF NOT bFromSpecifiedLine RETURN PLAY_SINGLE_LINE_FROM_CONVERSATION(snatchAndGrabConversation, "FBI2AUD", sSpeech, tLine, CONV_PRIORITY_HIGH, subtitlesState) ELSE RETURN CREATE_CONVERSATION_FROM_SPECIFIC_LINE(snatchAndGrabConversation, "FBI2AUD", sSpeech, tLine, CONV_PRIORITY_HIGH, subtitlesState) ENDIF 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 CLEAR_HELP() 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 FUNC BOOL SHOULD_USE_MISSION_START_VEHICLE_AT_END() IF IS_REPLAY_START_VEHICLE_AVAILABLE() IF IS_REPLAY_START_VEHICLE_UNDER_SIZE_LIMIT(GET_DEFAULT_ALLOWABLE_VEHICLE_SIZE_VECTOR()) RETURN TRUE ENDIF ENDIF RETURN FALSE ENDFUNC FUNC STRING GET_RECORD_PREFIX() RETURN "M_FIB2" ENDFUNC PROC WAIT_WITH_RECORD() WAIT(0) REPLAY_CHECK_FOR_EVENT_THIS_FRAME(GET_RECORD_PREFIX()) ENDPROC // get model for a snatch and grab model enum FUNC MODEL_NAMES GET_MODEL_FOR_SNATCH_AND_GRAB_MODEL_ENUM(SNATCH_AND_GRAB_MODEL_ENUM sagModel) SWITCH sagModel CASE SAGM_MICHAEL RETURN GET_PLAYER_PED_MODEL(CHAR_MICHAEL) BREAK CASE SAGM_FRANKLIN RETURN GET_PLAYER_PED_MODEL(CHAR_FRANKLIN) BREAK CASE SAGM_TREVOR RETURN GET_PLAYER_PED_MODEL(CHAR_TREVOR) BREAK CASE SAGM_DAVE RETURN GET_NPC_PED_MODEL(CHAR_DAVE) BREAK CASE SAGM_STEVE RETURN GET_NPC_PED_MODEL(CHAR_STEVE) BREAK CASE SAGM_ANDREAS RETURN GET_NPC_PED_MODEL(CHAR_ANDREAS) BREAK CASE SAGM_PRISONER_HIGH RETURN CS_MRK BREAK CASE SAGM_PRISONER_LOW RETURN IG_MRK BREAK CASE SAGM_GUARD RETURN S_M_M_CIASEC_01 BREAK case SAGM_PILOT RETURN S_M_M_PILOT_02 break CASE SAGM_MICHELLE RETURN CS_MICHELLE BREAK CASE SAGM_FBI RETURN IG_FBISUIT_01 BREAK CASE SAGM_FBIEND RETURN S_M_M_FIBOFFICE_01 BREAK CASE SAGM_CHOPPER RETURN FROGGER BREAK CASE SAGM_ENEMY_CHOPPER RETURN BUZZARD BREAK CASE SAGM_MICHAEL_CAR RETURN GET_NPC_VEH_MODEL(CHAR_DAVE) BREAK // CASE SAGM_TREVOR_JEEP // RETURN GET_PLAYER_VEH_MODEL(CHAR_TREVOR) // BREAK CASE SAGM_FRANKLIN_BIKE PED_VEH_DATA_STRUCT sVehData GET_PLAYER_VEH_DATA(CHAR_FRANKLIN, sVehData, VEHICLE_TYPE_BIKE) RETURN sVehData.model BREAK CASE SAGM_FBI_VAN RETURN BURRITO BREAK CASE SAGM_FBI_CAR RETURN FBI2 BREAK CASE SAGM_UTIL_TRUCK_1 RETURN UTILLITRUCK2 BREAK CASE SAGM_UTIL_TRUCK_2 RETURN UTILLITRUCK3 BREAK CASE SAGM_DRIVE_AWAY_CAR IF SHOULD_USE_MISSION_START_VEHICLE_AT_END() RETURN GET_REPLAY_START_VEHICLE_MODEL() ELSE RETURN VOLTIC ENDIF BREAK //CASE SAGM_HOOK // RETURN PROP_ROPE_HOOK_01 //BREAK //CASE SAGM_BLOCK // RETURN PROP_BOX_WOOD08A //BREAK CASE SAGM_HARNESS RETURN GET_RAPPEL_ANCHOR_MODEL_NAME() BREAK CASE SAGM_PULLEY RETURN GET_RAPPEL_PULLEY_MODEL_NAME() BREAK CASE SAGM_TORCH RETURN PROP_CS_POLICE_TORCH BREAK CASE SAGM_CHAIR RETURN V_CORP_OFFCHAIR BREAK CASE SAGM_COFFEE RETURN P_ING_COFFEECUP_01 BREAK ENDSWITCH RETURN DUMMY_MODEL_FOR_SCRIPT ENDFUNC // get a weapon enum as a weapontype FUNC WEAPON_TYPE GET_SNATCH_AND_GRAB_WEAPON_TYPE(SNATCH_AND_GRAB_WEAPON_ENUM weapon) SWITCH weapon CASE SAG_WEAPON_MICHAEL_PISTOL RETURN WEAPONTYPE_APPISTOL BREAK CASE SAG_WEAPON_CIA_PISTOL RETURN WEAPONTYPE_PISTOL BREAK CASE SAG_WEAPON_CIA_SMG RETURN WEAPONTYPE_SMG BREAK CASE SAG_WEAPON_CIA_HELI RETURN WEAPONTYPE_CARBINERIFLE BREAK CASE SAG_WEAPON_SNIPER_RIFLE RETURN WEAPONTYPE_HEAVYSNIPER BREAK CASE SAG_WEAPON_MICHAEL_RIFLE RETURN WEAPONTYPE_ADVANCEDRIFLE BREAK ENDSWITCH RETURN WEAPONTYPE_UNARMED ENDFUNC // suppress vehicles PROC SUPPRESS_MISSION_MODELS(BOOL bSuppress) SET_VEHICLE_MODEL_IS_SUPPRESSED(GET_MODEL_FOR_SNATCH_AND_GRAB_MODEL_ENUM(SAGM_MICHAEL_CAR), bSuppress) SET_VEHICLE_MODEL_IS_SUPPRESSED(GET_MODEL_FOR_SNATCH_AND_GRAB_MODEL_ENUM(SAGM_CHOPPER), bSuppress) SET_VEHICLE_MODEL_IS_SUPPRESSED(GET_MODEL_FOR_SNATCH_AND_GRAB_MODEL_ENUM(SAGM_ENEMY_CHOPPER), bSuppress) SET_VEHICLE_MODEL_IS_SUPPRESSED(GET_MODEL_FOR_SNATCH_AND_GRAB_MODEL_ENUM(SAGM_FBI_VAN), bSuppress) SET_VEHICLE_MODEL_IS_SUPPRESSED(GET_MODEL_FOR_SNATCH_AND_GRAB_MODEL_ENUM(SAGM_FRANKLIN_BIKE), bSuppress) SET_VEHICLE_MODEL_IS_SUPPRESSED(GET_MODEL_FOR_SNATCH_AND_GRAB_MODEL_ENUM(SAGM_UTIL_TRUCK_1), bSuppress) SET_VEHICLE_MODEL_IS_SUPPRESSED(GET_MODEL_FOR_SNATCH_AND_GRAB_MODEL_ENUM(SAGM_UTIL_TRUCK_2), bSuppress) SET_VEHICLE_MODEL_IS_SUPPRESSED(MAVERICK, bSuppress) SET_VEHICLE_MODEL_IS_SUPPRESSED(POLMAV, bSuppress) SET_VEHICLE_MODEL_IS_SUPPRESSED(BUZZARD2, bSuppress) SET_VEHICLE_MODEL_IS_SUPPRESSED(CARGOBOB, bSuppress) SET_VEHICLE_MODEL_IS_SUPPRESSED(ANNIHILATOR, bSuppress) SET_PED_MODEL_IS_SUPPRESSED(GET_MODEL_FOR_SNATCH_AND_GRAB_MODEL_ENUM(SAGM_DAVE), bSuppress) SET_PED_MODEL_IS_SUPPRESSED(GET_MODEL_FOR_SNATCH_AND_GRAB_MODEL_ENUM(SAGM_STEVE), bSuppress) SET_PED_MODEL_IS_SUPPRESSED(GET_MODEL_FOR_SNATCH_AND_GRAB_MODEL_ENUM(SAGM_ANDREAS), bSuppress) SET_PED_MODEL_IS_SUPPRESSED(GET_MODEL_FOR_SNATCH_AND_GRAB_MODEL_ENUM(SAGM_MICHELLE), bSuppress) SET_PED_MODEL_IS_SUPPRESSED(GET_MODEL_FOR_SNATCH_AND_GRAB_MODEL_ENUM(SAGM_GUARD), bSuppress) SET_PED_MODEL_IS_SUPPRESSED(GET_MODEL_FOR_SNATCH_AND_GRAB_MODEL_ENUM(SAGM_PILOT), bSuppress) SET_PED_MODEL_IS_SUPPRESSED(GET_MODEL_FOR_SNATCH_AND_GRAB_MODEL_ENUM(SAGM_PRISONER_HIGH), bSuppress) SET_PED_MODEL_IS_SUPPRESSED(GET_MODEL_FOR_SNATCH_AND_GRAB_MODEL_ENUM(SAGM_FBI), bSuppress) SET_PED_MODEL_IS_SUPPRESSED(GET_MODEL_FOR_SNATCH_AND_GRAB_MODEL_ENUM(SAGM_FBIEND), bSuppress) 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(), <>) ENDIF ENDIF ENDPROC // remove blips PROC REMOVE_ALL_BLIPS() INT i IF DOES_BLIP_EXIST(vehicleBlip) REMOVE_BLIP(vehicleBlip) ENDIF IF DOES_BLIP_EXIST(getToBlip) REMOVE_BLIP(getToBlip) ENDIF g_sMagDemoFBI2Entities.bBlipActive = FALSE IF DOES_BLIP_EXIST(buddyBlip) REMOVE_BLIP(buddyBlip) ENDIF REPEAT NUMBER_GUARDS i IF DOES_BLIP_EXIST(guardBlip[i]) REMOVE_BLIP(guardBlip[i]) ENDIF ENDREPEAT REPEAT NUMBER_REINFORCEMENTS i IF DOES_BLIP_EXIST(reinforcementBlip[i]) REMOVE_BLIP(reinforcementBlip[i]) ENDIF ENDREPEAT REPEAT NUMBER_ENEMY_CHOPPERS i IF DOES_BLIP_EXIST(enemyChopperBlip[i]) REMOVE_BLIP(enemyChopperBlip[i]) ENDIF ENDREPEAT IF DOES_BLIP_EXIST(playerChopperBlip) REMOVE_BLIP(playerChopperBlip) ENDIF IF DOES_BLIP_EXIST(franklinSniperBlip) REMOVE_BLIP(franklinSniperBlip) ENDIF ENDPROC // which ped is michael? 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 ENDFUNC // which ped is trevor? 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 ENDFUNC // which ped is franklin? FUNC PED_INDEX GET_FRANKLIN_PED() IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_FRANKLIN RETURN PLAYER_PED_ID() ELSE RETURN sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN] ENDIF ENDFUNC // use stream volume for office PROC DO_STREAM_VOLUME_ON_OFFICE(BOOL bUseVolume) IF bUseVolume IF IS_NEW_LOAD_SCENE_ACTIVE() NEW_LOAD_SCENE_STOP() ENDIF officeVolume = STREAMVOL_CREATE_SPHERE(<<115.08, -619.93, 207.00>>, 5.0, FLAG_COLLISIONS_MOVER | FLAG_MAPDATA) ELSE IF NOT IS_NEW_LOAD_SCENE_ACTIVE() STREAMVOL_DELETE(officeVolume) ENDIF ENDIF ENDPROC // 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 // switch off roads for mission PROC SET_SNATCH_AND_GRAB_ROADS(BOOL bRoads) INT i VECTOR vMin VECTOR vMax REPEAT 2 i SWITCH i CASE 0 vMin = <<-375.94440, -548.54968, -100.0>> vMax = <<244.94885, -449.56308, 39.3>> BREAK CASE 1 vMin = <<1337.56860, -2129.30542, -100.69554>> vMax = <<1440.82471, -2028.34973, 100.23717>> BREAK ENDSWITCH IF bRoads SET_ROADS_BACK_TO_ORIGINAL(vMin, vMax) ELSE SET_ROADS_IN_AREA(vMin, vMax, FALSE) ENDIF ENDREPEAT ENDPROC // disable/reenable cargens PROC ENABLE_CARGENS_FOR_MISSION(BOOL bEnable) SET_ALL_VEHICLE_GENERATORS_ACTIVE_IN_AREA(<<76.37175, -676.25598, 28.27041>>, <<93.24977, -660.14941, 53.22037>>, bEnable) ENDPROC FUNC STRING GET_SNATCH_AND_GRAB_AUDIO_SCENE_AS_STRING(SNATCH_AND_GRAB_AUDIO_SCENE_ENUM thisScene) SWITCH thisScene CASE SNATCH_AND_GRAB_AUDIO_SCENE_DRIVE_TO_LOT RETURN "FBI_2_DRIVE_TO_LOT" BREAK CASE SNATCH_AND_GRAB_AUDIO_SCENE_FLY_TO_AGENCY RETURN "FBI_2_FLY_TO_AGENCY" BREAK CASE SNATCH_AND_GRAB_AUDIO_SCENE_FOCUS_ON_ROOF RETURN "FBI_2_FOCUS_ON_ROOF" BREAK CASE SNATCH_AND_GRAB_AUDIO_SCENE_RAPPEL RETURN "SNATCH_AND_GRAB_RAPPEL" BREAK CASE SNATCH_AND_GRAB_AUDIO_SCENE_INDOOR RETURN "SNATCH_AND_GRAB_INDOOR" BREAK CASE SNATCH_AND_GRAB_AUDIO_SCENE_BREAK_THE_GLASS RETURN "FBI_2_BREAK_THE_GLASS" BREAK CASE SNATCH_AND_GRAB_AUDIO_SCENE_MR_K_HOSTAGE RETURN "FBI_2_MR_K_HOSTAGE" BREAK CASE SNATCH_AND_GRAB_AUDIO_SCENE_FRANKLIN_SNIPE_ENEMIES RETURN "FBI_2_FRANKLIN_SNIPE_ENEMIES" BREAK CASE SNATCH_AND_GRAB_AUDIO_SCENE_MICHAEL_SHOOT_ENEMIES RETURN "FBI_2_MICHAEL_SHOOT_ENEMIES" BREAK CASE SNATCH_AND_GRAB_AUDIO_SCENE_CHOPPERS_ARRIVE_FRANKLIN RETURN "FBI_2_CHOPPERS_ARRIVE_FRANKLIN" BREAK CASE SNATCH_AND_GRAB_AUDIO_SCENE_CHOPPERS_ARRIVE_MICHAEL RETURN "FBI_2_CHOPPERS_ARRIVE_MICHAEL" BREAK CASE SNATCH_AND_GRAB_AUDIO_SCENE_CHOPPERS_ARRIVE_TREVOR RETURN "FBI_2_CHOPPERS_ARRIVE_TREVOR" BREAK CASE SNATCH_AND_GRAB_AUDIO_SCENE_FLY_BACK_AS_TREVOR RETURN "FBI_2_FLY_BACK_AS_TREVOR" BREAK CASE SNATCH_AND_GRAB_AUDIO_SCENE_FLY_BACK_AS_MICHAEL RETURN "FBI_2_RIDE_BACK_AS_MICHAEL" BREAK CASE SNATCH_AND_GRAB_AUDIO_SCENE_LAND_THE_HELI RETURN "FBI_2_LAND_THE_HELI" BREAK ENDSWITCH RETURN "" ENDFUNC // start train crash audio scene FUNC BOOL START_SNATCH_AND_GRAB_AUDIO_SCENE(SNATCH_AND_GRAB_AUDIO_SCENE_ENUM thisScene) RETURN START_AUDIO_SCENE(GET_SNATCH_AND_GRAB_AUDIO_SCENE_AS_STRING(thisScene)) ENDFUNC // stop train crash audio scene PROC STOP_SNATCH_AND_GRAB_AUDIO_SCENE(SNATCH_AND_GRAB_AUDIO_SCENE_ENUM thisScene) STOP_AUDIO_SCENE(GET_SNATCH_AND_GRAB_AUDIO_SCENE_AS_STRING(thisScene)) ENDPROC // stop all train crash audio scenes PROC STOP_ALL_SNATCH_AND_GRAB_AUDIO_SCENES() INT i REPEAT COUNT_OF(SNATCH_AND_GRAB_AUDIO_SCENE_ENUM) i STOP_SNATCH_AND_GRAB_AUDIO_SCENE(INT_TO_ENUM(SNATCH_AND_GRAB_AUDIO_SCENE_ENUM, i)) ENDREPEAT 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) KILL_CHASE_HINT_CAM(localChaseHintCamStruct) DISABLE_CELLPHONE(FALSE) ENDPROC // unfreeze player PROC CUSTOM_UNFREEZE_PLAYER() IF NOT IS_PED_INJURED(PLAYER_PED_ID()) IF NOT IS_ENTITY_ATTACHED(PLAYER_PED_ID()) FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE) ENDIF ENDIF ENDPROC // delete enemy chopper PROC DELETE_ENEMY_CHOPPER() INT i REPEAT COUNT_OF(enemyChopperPed) i IF DOES_ENTITY_EXIST(enemyChopperPed[i]) DELETE_PED(enemyChopperPed[i]) ENDIF ENDREPEAT REPEAT NUMBER_ENEMY_CHOPPERS i IF DOES_ENTITY_EXIST(enemyChopperVehicle[i]) DELETE_VEHICLE(enemyChopperVehicle[i]) ENDIF ENDREPEAT ENDPROC // delete everything PROC DELETE_ALL_ENTITIES_IN_FADE() INT i IF NOT IS_PED_INJURED(PLAYER_PED_ID()) SET_ENTITY_COORDS(PLAYER_PED_ID(), <<1315.36, -1979.53, 45.69>>) ENDIF REPEAT 3 i SET_SELECTOR_PED_DAMAGED(sSelectorPeds, INT_TO_ENUM(SELECTOR_SLOTS_ENUM, i), FALSE) IF DOES_ENTITY_EXIST(sSelectorPeds.pedID[i]) DELETE_PED(sSelectorPeds.pedID[i]) ENDIF ENDREPEAT IF DOES_ENTITY_EXIST(davePed) DELETE_PED(davePed) ENDIF IF DOES_ENTITY_EXIST(prisonerPed) DELETE_PED(prisonerPed) ENDIF IF DOES_ENTITY_EXIST(michellePed) DELETE_PED(michellePed) ENDIF IF DOES_ENTITY_EXIST(dummyFranklinPed) DELETE_PED(dummyFranklinPed) ENDIF REPEAT NUMBER_FBI_AGENTS i IF DOES_ENTITY_EXIST(fbiPed[i]) DELETE_PED(fbiPed[i]) ENDIF ENDREPEAT IF DOES_ENTITY_EXIST(fbiVanVehicle) DELETE_VEHICLE(fbiVanVehicle) ENDIF REPEAT NUMBER_ENEMY_CHOPPERS i IF DOES_ENTITY_EXIST(enemyChopperVehicle[i]) DELETE_VEHICLE(enemyChopperVehicle[i]) ENDIF ENDREPEAT REPEAT COUNT_OF(utilTruckVehicle) i IF DOES_ENTITY_EXIST(utilTruckVehicle[i]) DELETE_VEHICLE(utilTruckVehicle[i]) ENDIF ENDREPEAT REPEAT NUMBER_GUARDS i IF DOES_ENTITY_EXIST(guardPed[i]) DELETE_PED(guardPed[i]) ENDIF ENDREPEAT REPEAT NUMBER_REINFORCEMENTS i IF DOES_ENTITY_EXIST(reinforcementPed[i]) DELETE_PED(reinforcementPed[i]) ENDIF ENDREPEAT REPEAT NUMBER_ENEMY_CHOPPERS*3 i IF DOES_ENTITY_EXIST(enemyChopperPed[i]) DELETE_PED(enemyChopperPed[i]) ENDIF ENDREPEAT REPEAT COUNT_OF(snatchAndGrabVehicle) i IF DOES_ENTITY_EXIST(snatchAndGrabVehicle[i]) DELETE_VEHICLE(snatchAndGrabVehicle[i]) ENDIF ENDREPEAT REPEAT COUNT_OF(trafficVehicle) i IF DOES_ENTITY_EXIST(trafficVehicle[i]) DELETE_VEHICLE(trafficVehicle[i]) ENDIF ENDREPEAT WAIT(0) IF DOES_ENTITY_EXIST(harnessObject) DELETE_OBJECT(harnessObject) ENDIF IF DOES_ENTITY_EXIST(torchObject) DELETE_OBJECT(torchObject) ENDIF IF DOES_ENTITY_EXIST(chairObject) DELETE_OBJECT(chairObject) ENDIF REPEAT NUMBER_FROZEN_CHAIRS i IF DOES_ENTITY_EXIST(frozenChairObject[i]) DELETE_OBJECT(frozenChairObject[i]) ENDIF ENDREPEAT //IF DOES_ENTITY_EXIST(hookObject) // DELETE_OBJECT(hookObject) //ENDIF IF DOES_ENTITY_EXIST(franklinAnchorObject) DELETE_OBJECT(franklinAnchorObject) ENDIF IF DOES_ENTITY_EXIST(michaelGunObject) DELETE_OBJECT(michaelGunObject) ENDIF IF DOES_CAM_EXIST(staticCam) DESTROY_CAM(staticCam) ENDIF IF DOES_CAM_EXIST(animCam) DESTROY_CAM(animCam) ENDIF //IF DOES_CAM_EXIST(followCam) // DESTROY_CAM(followCam) //ENDIF IF DOES_CAM_EXIST(ropeCam) DESTROY_CAM(ropeCam) ENDIF DESTROY_PUSH_IN_CAMS(pushInData) ENDPROC PROC CLEANUP_MICHAEL_WEAPON_OVERRIDES() PED_INDEX michaelPed = GET_MICHAEL_PED() SET_PED_INFINITE_AMMO(PLAYER_PED_ID(), FALSE) IF DOES_ENTITY_EXIST(michaelPed) SET_PED_INFINITE_AMMO(michaelPed, FALSE) ENDIF IF NOT IS_PED_INJURED(PLAYER_PED_ID()) SET_PED_INFINITE_AMMO_CLIP(PLAYER_PED_ID(), FALSE) RESET_PED_IN_VEHICLE_CONTEXT(PLAYER_PED_ID()) CLEAR_PED_DRIVE_BY_CLIPSET_OVERRIDE(PLAYER_PED_ID()) SET_PLAYER_FORCED_AIM(PLAYER_ID(), FALSE) SET_PED_CAN_SWITCH_WEAPON(PLAYER_PED_ID(), TRUE) ENDIF IF NOT IS_PED_INJURED(michaelPed) SET_PED_INFINITE_AMMO_CLIP(michaelPed, FALSE) RESET_PED_IN_VEHICLE_CONTEXT(michaelPed) CLEAR_PED_DRIVE_BY_CLIPSET_OVERRIDE(michaelPed) SET_PED_CAN_SWITCH_WEAPON(michaelPed, TRUE) ENDIF IF iSavedAmmo >= 0 PRINTINT(iSavedAmmo) printnl() IF DOES_ENTITY_EXIST(michaelPed) IF HAS_PED_GOT_WEAPON(michaelPed, WEAPONTYPE_CARBINERIFLE) IF NOT IS_PED_INJURED(michaelPed) SET_PED_AMMO(michaelPed, WEAPONTYPE_CARBINERIFLE, iSavedAmmo) ENDIF SET_PED_INFINITE_AMMO(michaelPed, FALSE, WEAPONTYPE_CARBINERIFLE) ENDIF IF HAS_PED_GOT_WEAPON(michaelPed, WEAPONTYPE_ASSAULTRIFLE) IF NOT IS_PED_INJURED(michaelPed) SET_PED_AMMO(michaelPed, WEAPONTYPE_ASSAULTRIFLE, iSavedAmmo) ENDIF SET_PED_INFINITE_AMMO(michaelPed, FALSE, WEAPONTYPE_ASSAULTRIFLE) ENDIF ENDIF ENDIF IF HAS_PED_GOT_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_CARBINERIFLE) SET_PED_INFINITE_AMMO(PLAYER_PED_ID(), FALSE, WEAPONTYPE_CARBINERIFLE) ENDIF IF HAS_PED_GOT_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_ASSAULTRIFLE) SET_PED_INFINITE_AMMO(PLAYER_PED_ID(), FALSE, WEAPONTYPE_ASSAULTRIFLE) ENDIF IF HAS_PED_GOT_WEAPON(PLAYER_PED_ID(), GET_SNATCH_AND_GRAB_WEAPON_TYPE(SAG_WEAPON_MICHAEL_RIFLE)) SET_PED_INFINITE_AMMO(PLAYER_PED_ID(), FALSE, GET_SNATCH_AND_GRAB_WEAPON_TYPE(SAG_WEAPON_MICHAEL_RIFLE)) REMOVE_WEAPON_FROM_PED(PLAYER_PED_ID(), GET_SNATCH_AND_GRAB_WEAPON_TYPE(SAG_WEAPON_MICHAEL_RIFLE)) ENDIF IF DOES_ENTITY_EXIST(michaelPed) IF HAS_PED_GOT_WEAPON(michaelPed, WEAPONTYPE_CARBINERIFLE) SET_PED_INFINITE_AMMO(michaelPed, FALSE, WEAPONTYPE_CARBINERIFLE) ENDIF IF HAS_PED_GOT_WEAPON(michaelPed, WEAPONTYPE_ASSAULTRIFLE) SET_PED_INFINITE_AMMO(michaelPed, FALSE, WEAPONTYPE_ASSAULTRIFLE) ENDIF IF HAS_PED_GOT_WEAPON(michaelPed, GET_SNATCH_AND_GRAB_WEAPON_TYPE(SAG_WEAPON_MICHAEL_RIFLE)) SET_PED_INFINITE_AMMO(michaelPed, FALSE, GET_SNATCH_AND_GRAB_WEAPON_TYPE(SAG_WEAPON_MICHAEL_RIFLE)) REMOVE_WEAPON_FROM_PED(michaelPed, GET_SNATCH_AND_GRAB_WEAPON_TYPE(SAG_WEAPON_MICHAEL_RIFLE)) ENDIF ENDIF ENDPROC // get mission vector FUNC VECTOR GET_SNATCH_AND_GRAB_VECTOR(SNATCH_AND_GRAB_VECTOR_ENUM sagVec) SWITCH sagVec CASE SAGVEC_PLAYER_INIT //RETURN <<76.16, -689.51, 43.16>> //RETURN <<75.60, -689.83, 43.18>> RETURN <<147.91399, -678.00134, 41.02758>> BREAK CASE SAGVEC_PLAYER_INIT2 RETURN <<147.9, -678.2, 41.02758>> BREAK CASE SAGVEC_DAVE_INIT RETURN <<148.95930, -677.50409, 41.02758>> BREAK CASE SAGVEC_DAVE_INIT2 RETURN <<149.57080, -678.42639, 41.02729>> BREAK CASE SAGVEC_MICHAEL_CAR_INIT // RETURN <<77.70, -689.40, 43.22>> RETURN <<84.65, -670.03, 43.73>> BREAK CASE SAGVEC_CHOPPER_INIT RETURN <<1368.4725, -2076.7312, 51.00>> BREAK CASE SAGVEC_PICKUP_CHOPPER_LEADIN // MAKE SAME AS ABOVE RETURN <<1368.4725, -2076.7312, 51.685>> BREAK CASE SAGVEC_CHOPPER_HOVER RETURN <<110.62, -619.50, 269.85>> BREAK CASE SAGVEC_HOVER_TARGET RETURN <<111.6, -619.50, 270.85>> BREAK CASE SAGVEC_TREVOR_INIT RETURN <<1373.39, -2072.44, 51.38>> BREAK CASE SAGVEC_FRANKLIN_INIT RETURN <<1373.06, -2079.65, 51.00>> BREAK CASE SAGVEC_FRANKLIN_SNIPER RETURN <<-139.69, -591.94, 207.58>> BREAK CASE SAGVEC_BIKE_INIT RETURN <<1373.42, -2079.67, 51.00>> BREAK CASE SAGVEC_JEEP_INIT RETURN <<1381.31, -2077.68, 51.00>> BREAK CASE SAGVEC_ROPE_ANCHOR_OFFSET RETURN <<-1.20, 0.90, 1.60>> BREAK CASE SAGVEC_ROPE_ANCHOR_ROT RETURN <<0,0,-99.76>> BREAK CASE SAGVEC_ROPE_WEIGHT_OFFSET RETURN <<0.00, 0.00, 3.00>> BREAK CASE SAGVEC_ROPE_PLAYER_SWING_ATTACH //RETURN <<0.00, 0.00, -0.55>> RETURN <<0.00, 0.00, 0.0>> BREAK CASE SAGVEC_ROPE_PRISONER_SWING_ATTACH RETURN <<-0.12, 0.165, -0.212>> BREAK CASE SAGVEC_MEETING_POINT //RETURN <<1374.77, -2043.06, 51.06>> //RETURN <<1368.54919, -2032.53784, 51.04349>> RETURN <<1375.16589, -2065.92920, 50.99826>> BREAK CASE SAGVEC_WINDOW_FRAME RETURN <<111.67, -619.11, 207.60>> BREAK CASE SAGVEC_WINDOW_FRAME_2 RETURN <<110.5, -618.5, 207.8>> BREAK CASE SAGVEC_WINDOW_SWING_RIGHT //RETURN <<110.35, -618.2, 206.8>> RETURN <<110.15, -618.2, 207.1>> BREAK CASE SAGVEC_WINDOW_SWING_LEFT //RETURN <<111.10, -615.81, 207.10>> RETURN <<110.90, -615.81, 207.1>> BREAK CASE SAGVEC_WINDOW_SOUND RETURN <<112.15, -619.09, 206.78>> BREAK CASE SAGVEC_BREAK_IN RETURN <<112.92, -619.09, 205.94>> BREAK CASE SAGVEC_PRISONER_INIT RETURN <<113.47, -619.19, 205.49>> BREAK CASE SAGVEC_MICHELLE_INIT RETURN <<113.77, -619.37, 205.48>> BREAK CASE SAGVEC_INTERROGATION RETURN <<112.082, -619.063, 206.05>> BREAK CASE SAGVEC_HEADSHOT RETURN <<112.85, -619.72, 206.33>> BREAK CASE SAGVEC_GUARD_DOOR_INSIDE RETURN <<117.97, -618.96, 205.05>> BREAK CASE SAGVEC_GUARD_DOOR_OUTSIDE RETURN <<119.57, -619.96, 205.05>> BREAK CASE SAGVEC_GUARD_ANIM_ORIGIN RETURN <<118.704, -620.003, 205.05>> BREAK CASE SAGVEC_SNIPER RETURN <<-137.9, -593.0, 207.55>> BREAK CASE SAGVEC_REMOTE_VIEW // RETURN <<17.39, -602.71, 211.52>> good before draw dist change RETURN <<98.25, -617.81, 205.50>> BREAK CASE SAGVEC_BEHIND_SNIPER RETURN <<99.2, -618.0, 206.9>> BREAK CASE SAGVEC_SNIPER_AI_SHOT_ORIGIN RETURN <<-129.43, -561.09, 209.27>> BREAK CASE SAGVEC_CHASE_END RETURN <<173.95, -990.51, 136.94>> BREAK CASE SAGVEC_DROPOFF RETURN <<1373.92822, -2070.67017, 51.00>> BREAK CASE SAGVEC_DROPOFF_DIMENSIONS RETURN <<75,75,85>> BREAK CASE SAGVEC_DROPOFF_PASS_DIMENSIONS RETURN <<15,15,4>> BREAK CASE SAGVEC_END RETURN <<1378.58630, -2074.40503, 50.99809>> BREAK CASE SAGVEC_MICHAEL_AT_FOOD_COURT RETURN <<122.02104, -692.21143, 41.02729>> BREAK CASE SAGVEC_MOVE_LAST_PLAYER_VEHICLE RETURN <<55.089, -750.924, 43.084>> BREAK ENDSWITCH RETURN <<0,0,0>> ENDFUNC // get an anim dict enum as string FUNC STRING GET_SNATCH_AND_GRAB_ANIM_DICT_AS_STRING(SNATCH_AND_GRAB_ANIM_DICT_ENUM animDict) SWITCH animDict CASE SAG_ANIM_DICT_MISSION RETURN "MISSSAGRAB" BREAK CASE SAG_ANIM_DICT_RAPPEL RETURN GET_RAPPEL_ANIM_DICT_NAME() BREAK CASE SAG_ANIM_DICT_GUARDS RETURN "MISSFBI2" BREAK CASE SAG_ANIM_DICT_CUTSCENES RETURN "MISSFBI2CUTS" BREAK CASE SAG_ANIM_DICT_INTRO RETURN "MISSFBI2_intro" BREAK CASE SAG_ANIM_DICT_TOWER_SEATED RETURN "amb@prop_human_seat_computer@male@base" BREAK CASE SAG_ANIM_DICT_TOWER_SEATED_REACT RETURN "amb@prop_human_seat_computer@male@react_shock" BREAK CASE SAG_ANIM_DICT_TOWER_STANDING RETURN "amb@world_human_stand_guard@male@base" BREAK CASE SAG_ANIM_DICT_TOWER_STANDING_REACT_ENTER_L RETURN "reaction@male_stand@small_intro@left" BREAK CASE SAG_ANIM_DICT_TOWER_STANDING_REACT_ENTER_R RETURN "reaction@male_stand@small_intro@right" BREAK CASE SAG_ANIM_DICT_TOWER_STANDING_REACT_IDLE RETURN "reaction@male_stand@small_variations@idle_a" BREAK CASE SAG_ANIM_DICT_AIM_VARIATIONS RETURN "combat@aim_variations@pistol" BREAK CASE SAG_ANIM_DICT_COMBAT_GLANCES RETURN "combat@gestures@pistol@panic" BREAK CASE SAG_ANIM_DICT_OVER_THERE RETURN "combat@gestures@pistol@overthere" BREAK CASE SAG_ANIM_DICT_PANIC RETURN "combat@panic@pistol" BREAK CASE SAG_ANIM_DICT_BECKON RETURN "combat@gestures@pistol@beckon" BREAK CASE SAG_ANIM_DICT_FOOD_COURT RETURN "MISSFBI2@LeadInOut" BREAK CASE SAG_ANIM_DICT_AT_LOT RETURN "MISSFBI2@LeadInOutFBI_2_MCS_1" BREAK CASE SAG_ANIM_DICT_IN_OFFICE RETURN "MISSSAGRAB_INOFFICE" BREAK CASE SAG_ANIM_DICT_FLY_HOME RETURN "MISSSAGRAB_FLYHOME" BREAK CASE SAG_ANIM_CAM_SHAKE_LIBRARY RETURN "shake_cam_all@" BREAK CASE SAG_ANIM_DICT_SNIPER RETURN "missheistdocks2aswitchig_7" BREAK ENDSWITCH RETURN "invalid!" ENDFUNC // cleanup the mission PROC MISSION_CLEANUP() //IF IS_PED_INJURED(PLAYER_PED_ID()) TRIGGER_MUSIC_EVENT("FIB2_DEATH_FAIL") //ENDIF SET_HIDOF_OVERRIDE(FALSE, TRUE, 0, 0, 0, 0) CLEAR_PED_NON_CREATION_AREA() SET_PED_PATHS_BACK_TO_ORIGINAL(<<80.15606, -689.07544, 40.22030>>, <<153.51270, -671.06488, 45.02924>>) CASCADE_SHADOWS_ENABLE_FREEZER(TRUE) KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() DISABLE_SELECTOR_QUICK_SWITCH_TO_DAMAGED_PED(FALSE) ROPE_UNLOAD_TEXTURES() DISABLE_CHEAT(CHEAT_TYPE_GIVE_WEAPONS, FALSE) CLEAR_WEATHER_TYPE_PERSIST() SHUTDOWN_PC_SCRIPTED_CONTROLS() OVERRIDE_PLAYER_GROUND_MATERIAL(GET_HASH_KEY("AM_BASE_GLASS_STRONG"),FALSE) DISABLE_DOWNWASH_PTFX(FALSE) //CLEAR_WEATHER_TYPE_PERSIST() PAUSE_CLOCK(FALSE) IF STREAMVOL_IS_VALID(foodCourtStreamingVolume) STREAMVOL_DELETE(foodCourtStreamingVolume) ENDIF IF STREAMVOL_IS_VALID(officeVolume) STREAMVOL_DELETE(officeVolume) ENDIF IF STREAMVOL_IS_VALID(sniperVolume) STREAMVOL_DELETE(sniperVolume) ENDIF NEW_LOAD_SCENE_STOP() STOP_ALL_SNATCH_AND_GRAB_AUDIO_SCENES() REMOVE_MISSION_TEXT() KILL_ANY_CONVERSATION() //SET_SNATCH_AND_GRAB_ROADS(TRUE) ENABLE_CARGENS_FOR_MISSION(TRUE) REMOVE_SCENARIO_BLOCKING_AREA(lotScenarioBlocking) REMOVE_SCENARIO_BLOCKING_AREA(tableScenarioBlocking) REMOVE_SCENARIO_BLOCKING_AREA(rampScenarioBlocking) //REMOVE_SCENARIO_BLOCKING_AREA(skyScenarioBlocking) //SET_FRONTEND_RADIO_ACTIVE(TRUE) //SCRIPT_OVERRIDES_WIND_TYPES(FALSE, "","") // SET_PLAYER_PED_DATA_IN_CUTSCENES(TRUE) RELEASE_WEAPON_AUDIO()//TEMP REMOVE_PORTAL_SETTINGS_OVERRIDE("V_CIA_PS_WINDOW_UNBROKEN") REMOVE_DOOR_FROM_SYSTEM(DOORHASH_OPEN_DOOR) REMOVE_DOOR_FROM_SYSTEM(DOORHASH_CLOSED_DOOR1) REMOVE_DOOR_FROM_SYSTEM(DOORHASH_CLOSED_DOOR2) IF g_fSavedMaxMotionBlur > 0.0 SET_MOTIONBLUR_MAX_VEL_SCALER(g_fSavedMaxMotionBlur) ENDIF STOP_SOUND(iDangleSoundID) RELEASE_SOUND_ID(iDangleSoundID) STOP_SOUND(iSmashSoundID) RELEASE_SOUND_ID(iSmashSoundID) STOP_SOUND(iRappelWindSoundID) RELEASE_SOUND_ID(iRappelWindSoundID) STOP_SOUND(iFaintHeliSoundID) RELEASE_SOUND_ID(iFaintHeliSoundID) STOP_SOUND(iSniperSwitchSoundID) RELEASE_SOUND_ID(iSniperSwitchSoundID) RELEASE_NAMED_SCRIPT_AUDIO_BANK(GET_MISSION_AUDIO_BANK_NAME()) //DELETE_CHECKPOINT(jumpCheckpoint) CLEANUP_MICHAEL_WEAPON_OVERRIDES() // remove heavy sniper from franklin PED_INDEX franklinPed = GET_FRANKLIN_PED() WEAPON_TYPE sniperWeapon = GET_SNATCH_AND_GRAB_WEAPON_TYPE(SAG_WEAPON_SNIPER_RIFLE) IF NOT IS_PED_INJURED(franklinPed) IF HAS_PED_GOT_WEAPON(franklinPed, sniperWeapon) IF bCheckedInitialSniper IF iInitialSniperAmmo > 0 SET_PED_AMMO(franklinPed, sniperWeapon, iInitialSniperAmmo) ELSE REMOVE_WEAPON_FROM_PED(franklinPed, sniperWeapon) ENDIF ELSE REMOVE_WEAPON_FROM_PED(franklinPed, sniperWeapon) ENDIF ENDIF ENDIF STORE_PLAYER_PED_WEAPONS(franklinPed) SET_BUILDING_STATE(BUILDINGNAME_IPL_FIB2_TOWER, BUILDINGSTATE_NORMAL) remove_ipl("DT1_05_FIB_Reflection") PRINTSTRING("remove reflection ipl 4") printnl() CASCADE_SHADOWS_SET_CASCADE_BOUNDS_SCALE(CASCADE_SHADOWS_MULTIPLIER_NO_OVERRIDE) CASCADE_SHADOWS_SET_ENTITY_TRACKER_SCALE(1.0) CASCADE_SHADOWS_SET_AIRCRAFT_MODE(FALSE) SET_PARTICLE_FX_BULLET_IMPACT_SCALE(1.0) IF NOT IS_PED_INJURED(PLAYER_PED_ID()) SET_PED_CAN_SWITCH_WEAPON(PLAYER_PED_ID(), TRUE) TASK_CLEAR_LOOK_AT(PLAYER_PED_ID()) SET_ENTITY_VISIBLE(PLAYER_PED_ID(), TRUE) SET_PED_RELATIONSHIP_GROUP_HASH(PLAYER_PED_ID(), RELGROUPHASH_PLAYER) CUSTOM_UNFREEZE_PLAYER() ENDIF //IF NOT IS_PED_INJURED(GET_MICHAEL_PED()) // RESTORE_PLAYER_PED_VARIATIONS(GET_MICHAEL_PED()) //ENDIF CLEANUP_RAPPEL(rappelData) IF DOES_ROPE_EXIST(choppedRope1) DELETE_ROPE(choppedRope1) ENDIF IF DOES_ROPE_EXIST(choppedRope2) DELETE_ROPE(choppedRope2) ENDIF //IF mocapStreamingStage >= MOCAP_STREAMING_STAGE_WAIT REMOVE_CUTSCENE() //ENDIF 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) SET_FAR_DRAW_VEHICLES(FALSE) // reset budgets SET_VEHICLE_POPULATION_BUDGET(3) SET_PED_POPULATION_BUDGET(3) IF currentMissionStage = STAGE_RAPPEL_DOWN IF bDoGuardsKillMichael IF IS_PED_INJURED(PLAYER_PED_ID()) IF NOT IS_PED_INJURED(guardPed[2]) TASK_AIM_GUN_AT_COORD(guardPed[2], <<112.85, -619.72, 206.33>>, -1) ENDIF IF NOT IS_PED_INJURED(prisonerPed) VECTOR vSceneMod = <<0,0,1.05>> iSyncScene = CREATE_SYNCHRONIZED_SCENE(GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_INTERROGATION) - vSceneMod, <<0.0, 0.0, INTERROGATION_ROT>>) IF NOT IS_PED_INJURED(prisonerPed) TASK_SYNCHRONIZED_SCENE(prisonerPed, iSyncScene, GET_SNATCH_AND_GRAB_ANIM_DICT_AS_STRING(SAG_ANIM_DICT_IN_OFFICE), "hostage_low_intro_mrk", NORMAL_BLEND_IN, NORMAL_BLEND_OUT) ENDIF ENDIF ENDIF ENDIF ENDIF IF bInteriorPinned IF IS_INTERIOR_READY(officeInterior) UNPIN_INTERIOR(officeInterior) ENDIF ENDIF IF IS_NEW_LOAD_SCENE_ACTIVE() NEW_LOAD_SCENE_STOP() ENDIF DO_STREAM_VOLUME_ON_OFFICE(FALSE) // detach if needed IF NOT IS_PED_INJURED(PLAYER_PED_ID()) SET_ENTITY_PROOFS(PLAYER_PED_ID(), FALSE, FALSE, FALSE, FALSE, FALSE) STOP_PED_SPEAKING(PLAYER_PED_ID(), FALSE) SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(PLAYER_PED_ID(), FALSE) CUSTOM_UNFREEZE_PLAYER() SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(PLAYER_PED_ID(), FALSE) 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 INT i REPEAT NUMBER_FOOD_COURT_CHAIRS i IF DOES_ENTITY_EXIST(foodCourtChairObject[i]) SET_OBJECT_AS_NO_LONGER_NEEDED(foodCourtChairObject[i]) ENDIF ENDREPEAT IF NOT IS_PED_INJURED(prisonerPed) IF IS_ENTITY_ATTACHED(prisonerPed) IF GET_VEHICLE_PED_IS_USING(prisonerPed) = NULL DETACH_ENTITY(prisonerPed) ENDIF ENDIF ENDIF // remove dave IF NOT IS_PED_INJURED(davePed) REMOVE_PED_FROM_GROUP(davePed) ENDIF IF bThoroughCleanup IF DOES_ENTITY_EXIST(davePed) DELETE_PED(davePed) ENDIF IF DOES_ENTITY_EXIST(prisonerPed) DELETE_PED(prisonerPed) ENDIF IF DOES_ENTITY_EXIST(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN]) #if USE_CLF_DLC g_savedGlobalsClifford.sPlayerData.sInfo.vLastKnownCoords[CHAR_FRANKLIN] = <<0,0,0>> g_savedGlobalsClifford.sPlayerData.sInfo.fLastKnownHead[CHAR_FRANKLIN] = 0 g_savedGlobalsClifford.sPlayerData.sInfo.iLastKnownRoomKey[CHAR_FRANKLIN] = 0 g_savedGlobalsClifford.sPlayerData.sInfo.vLastKnownVelocity[CHAR_FRANKLIN] = <<0,0,0>> #endif #if USE_NRM_DLC g_savedGlobalsZombie.sPlayerData.sInfo.vLastKnownCoords[CHAR_FRANKLIN] = <<0,0,0>> g_savedGlobalsZombie.sPlayerData.sInfo.fLastKnownHead[CHAR_FRANKLIN] = 0 g_savedGlobalsZombie.sPlayerData.sInfo.iLastKnownRoomKey[CHAR_FRANKLIN] = 0 g_savedGlobalsZombie.sPlayerData.sInfo.vLastKnownVelocity[CHAR_FRANKLIN] = <<0,0,0>> #endif #if not USE_CLF_DLC #if not USE_NRM_DLC g_savedGlobals.sPlayerData.sInfo.vLastKnownCoords[CHAR_FRANKLIN] = <<0,0,0>> g_savedGlobals.sPlayerData.sInfo.fLastKnownHead[CHAR_FRANKLIN] = 0 g_savedGlobals.sPlayerData.sInfo.iLastKnownRoomKey[CHAR_FRANKLIN] = 0 g_savedGlobals.sPlayerData.sInfo.vLastKnownVelocity[CHAR_FRANKLIN] = <<0,0,0>> #endif #endif DELETE_PED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN]) ENDIF 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 currentMissionStage = STAGE_SNIPE_GUARDS IF DOES_ENTITY_EXIST(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN]) DELETE_PED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN]) ENDIF ENDIF REPEAT COUNT_OF(utilTruckVehicle) i IF IS_VEHICLE_DRIVEABLE(utilTruckVehicle[i]) SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(utilTruckVehicle[i], FALSE) SET_VEHICLE_DOORS_LOCKED(utilTruckVehicle[i], VEHICLELOCK_UNLOCKED) ENDIF ENDREPEAT IF IS_VEHICLE_DRIVEABLE(driveAwayVehicle) SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(driveAwayVehicle, FALSE) ENDIF IF IS_VEHICLE_DRIVEABLE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) SET_HELI_TURBULENCE_SCALAR(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER],1.0) SET_AIRCRAFT_PILOT_SKILL_NOISE_SCALAR(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER],1.0) ENDIF // get rid of anim cam IF DOES_CAM_EXIST(animCam) DESTROY_CAM(animCam) ENDIF IF currentMissionStage >= STAGE_CHOPPER_CHASE IF DOES_ENTITY_EXIST(GET_FRANKLIN_PED()) IF PLAYER_PED_ID() = GET_FRANKLIN_PED() IF IS_ENTITY_DEAD(GET_FRANKLIN_PED()) OR NOT IS_ENTITY_DEAD(GET_FRANKLIN_PED()) SET_ENTITY_VISIBLE(GET_FRANKLIN_PED(), TRUE) ENDIF ENDIF ENDIF ENDIF DO_COMMON_PLAYER_AND_CAM_CLEANUP() // IF IS_VEHICLE_DRIVEABLE(snatchAndGrabVehicle[SAGV_TREVOR_JEEP]) // SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(snatchAndGrabVehicle[SAGV_TREVOR_JEEP], TRUE) // ENDIF IF IS_VEHICLE_DRIVEABLE(snatchAndGrabVehicle[SAGV_FRANKLIN_BIKE]) SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(snatchAndGrabVehicle[SAGV_FRANKLIN_BIKE], TRUE) ENDIF IF IS_VEHICLE_DRIVEABLE(snatchAndGrabVehicle[SAGV_MICHAEL_CAR]) SET_VEHICLE_HAS_STRONG_AXLES(snatchAndGrabVehicle[SAGV_MICHAEL_CAR], FALSE) ENDIF //RESET_TO_BACKED_UP_ZOOM() SUPPRESS_MISSION_MODELS(FALSE) SET_TIME_SCALE(1.0) #IF IS_DEBUG_BUILD IF DOES_WIDGET_GROUP_EXIST(snatchAndGrabWidgets) DELETE_WIDGET_GROUP(snatchAndGrabWidgets) ENDIF #ENDIF TERMINATE_THIS_THREAD() ENDPROC // mission passed PROC MISSION_PASSED() // Fading any active music out. //TRIGGER_MISSION_MUSIC_EVENT("FBI2_TEST_END_MISSION") // remove enemy chopper DELETE_ENEMY_CHOPPER() Mission_Flow_Mission_Passed() MISSION_CLEANUP() ENDPROC // mission failed PROC MISSION_FAILED(FAIL_REASON_ENUM reasonForFail) IF CAN_ADVANCE_MISSION() REMOVE_ALL_BLIPS() REMOVE_MISSION_TEXT(TRUE, TRUE, TRUE, TRUE) TRIGGER_MUSIC_EVENT("FIB2_DEATH_FAIL") missionFailState = MISSION_FAIL_STATE_WAIT_FOR_FADE savedFailReason = reasonForFail SET_TIME_SCALE(1.0) STRING failText SWITCH savedFailReason CASE FAIL_MICHAEL_DEAD failText = "CMN_MDIED" //PRINTSTRING("FAIL REASON MICHAEL DEAD!") PRINTNL() BREAK CASE FAIL_FRANKLIN_DEAD failText = "CMN_FDIED" //PRINTSTRING("FAIL REASON FRANKLIN DEAD!") PRINTNL() BREAK CASE FAIL_TREVOR_DEAD failText = "CMN_TDIED" //PRINTSTRING("FAIL REASON TREVOR DEAD!") PRINTNL() BREAK CASE FAIL_DAVE_DEAD failText = "SG_FAIL3" //PRINTSTRING("FAIL REASON DAVE DEAD!") PRINTNL() BREAK CASE FAIL_ABANDONED_DAVE failText = "SG_FAIL2" //PRINTSTRING("FAIL REASON DAVE ABANDONED!") PRINTNL() BREAK CASE FAIL_PRISONER_DEAD failText = "SG_FAIL4" //PRINTSTRING("FAIL REASON K DEAD!") PRINTNL() BREAK CASE FAIL_CHOPPER_DESTROYED failText = "SG_FAIL5" //PRINTSTRING("FAIL REASON HELI DEAD!") PRINTNL() BREAK CASE FAIL_CAR_DESTROYED failText = "SG_FAIL20" //PRINTSTRING("FAIL REASON CAR DEAD!") PRINTNL() BREAK CASE FAIL_ABANDONED_CAR failText = "SG_FAIL9" //PRINTSTRING("FAIL REASON CAR ABA!") PRINTNL() BREAK CASE FAIL_ABANDONED_CHOPPER failText = "SG_FAIL1" //PRINTSTRING("FAIL REASON HELI ABA!") PRINTNL() BREAK CASE FAIL_TREVOR_ABANDONED_CHOPPER failText = "SG_FAIL10" //PRINTSTRING("FAIL REASON T HELI ABA!") PRINTNL() BREAK CASE FAIL_ATTACKED_FBI failText = "SG_FAIL6" //PRINTSTRING("FAIL REASON ATTACKED!") PRINTNL() BREAK CASE FAIL_FELL_FROM_ROPE failText = "SG_FAIL7" //PRINTSTRING("FAIL REASON1111!") PRINTNL() BREAK CASE FAIL_ROPE_CUT failText = "SG_FAIL8" //PRINTSTRING("FAIL REASON1111!") PRINTNL() BREAK CASE FAIL_SEEN failText = "SG_FAIL11" //PRINTSTRING("FAIL REASON1111!") PRINTNL() BREAK CASE FAIL_ATTRACTED_COPS failText = "SG_FAIL12" //PRINTSTRING("FAIL REASON COPS!") PRINTNL() BREAK CASE FAIL_CAR_STUCK failText = "SG_FAIL13" //PRINTSTRING("FAIL REASON CSTUCK!") PRINTNL() BREAK CASE FAIL_CHOPPER_STUCK failText = "SG_FAIL14" //PRINTSTRING("FAIL REASON CHSTUCK!") PRINTNL() BREAK CASE FAIL_CAUSED_TROUBLE failText = "SG_FAIL15" //PRINTSTRING("FAIL REASON TROUBLE!") PRINTNL() BREAK CASE FAIL_UNCOUPLED_ROPE failText = "SG_FAIL17" //PRINTSTRING("FAIL REASON1111!") PRINTNL() BREAK CASE FAIL_DROWNED failText = "SG_FAIL16" //PRINTSTRING("FAIL REASON1111!") PRINTNL() BREAK CASE FAIL_STEVE_DEAD failText = "SG_FAIL18" //PRINTSTRING("FAIL REASON1111!") PRINTNL() BREAK CASE FAIL_ANDREAS_DEAD failText = "SG_FAIL19" //PRINTSTRING("FAIL REASON1111!") PRINTNL() BREAK CASE FAIL_TROUBLE_FOOD_COURT failText = "SG_FAIL21" BREAK ENDSWITCH MISSION_FLOW_MISSION_FAILED_WITH_REASON(failText) ENDIF ENDPROC // remove heli blip and text PROC REMOVE_HELI_BLIP_AND_TEXT() IF DOES_BLIP_EXIST(vehicleBlip) REMOVE_BLIP(vehicleBlip) ENDIF IF IS_THIS_PRINT_BEING_DISPLAYED("CMN_GENGETINHE") OR IS_THIS_PRINT_BEING_DISPLAYED("CMN_GENGETBCKHE") REMOVE_MISSION_TEXT(TRUE, TRUE, FALSE) ENDIF ENDPROC // remove car blip and text PROC REMOVE_CAR_BLIP_AND_TEXT() IF DOES_BLIP_EXIST(vehicleBlip) REMOVE_BLIP(vehicleBlip) ENDIF IF IS_THIS_PRINT_BEING_DISPLAYED("SG_GETDCAR1") OR IS_THIS_PRINT_BEING_DISPLAYED("SG_GETDCAR2") REMOVE_MISSION_TEXT(TRUE, TRUE, FALSE) 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() SWITCH injuredChar CASE CHAR_MICHAEL // michael IF NOT IS_PED_INJURED(prisonerPed) IF IS_ENTITY_ATTACHED(prisonerPed) AND NOT IS_PED_IN_ANY_VEHICLE(prisonerPed) DETACH_ENTITY(prisonerPed) ENDIF ENDIF MISSION_FAILED(FAIL_MICHAEL_DEAD) BREAK CASE CHAR_TREVOR // trevor MISSION_FAILED(FAIL_TREVOR_DEAD) BREAK CASE CHAR_FRANKLIN // franklin IF currentMissionStage = STAGE_GET_TO_CHOPPER OR currentMissionStage = STAGE_CHOPPER_CHASE OR currentMissionStage = STAGE_DROPOFF MISSION_FAILED(FAIL_FRANKLIN_DEAD) ENDIF BREAK ENDSWITCH ENDIF ENDIF ENDIF ENDREPEAT // dave IF currentMissionStage = STAGE_GET_TO_CHOPPER IF IS_PED_INJURED(davePed) MISSION_FAILED(FAIL_DAVE_DEAD) ELSE // abandon fail IF NOT bDaveInCar IF GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), davePed, FALSE) > ABANDON_BUDDY_FAIL_RANGE IF NOT bForcePassOnShitskip MISSION_FAILED(FAIL_ABANDONED_DAVE) ENDIF ENDIF ENDIF ENDIF ENDIF // prisoner IF currentMissionStage > STAGE_RAPPEL_DOWN OR bCreatedOfficePedsForRappel IF DOES_ENTITY_EXIST(prisonerPed) IF IS_PED_INJURED(prisonerPed) MISSION_FAILED(FAIL_PRISONER_DEAD) ENDIF ENDIF ENDIF // vehicles IF DOES_ENTITY_EXIST(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) IF NOT IS_VEHICLE_DRIVEABLE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) REMOVE_HELI_BLIP_AND_TEXT() MISSION_FAILED(FAIL_CHOPPER_DESTROYED) ELSE IF currentMissionStage = STAGE_GET_TO_BUILDING OR currentMissionStage = STAGE_DROPOFF OR (currentMissionStage = STAGE_CHOPPER_CHASE AND GET_GAME_TIMER() >= iStartMissionStageTime + 3000) IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR IF GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) > STUCK_FAIL_RANGE_m MISSION_FAILED(FAIL_ABANDONED_CHOPPER) ENDIF IF IS_VEHICLE_STUCK_TIMER_UP(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], VEH_STUCK_JAMMED, JAMMED_TIME) OR IS_VEHICLE_STUCK_TIMER_UP(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], VEH_STUCK_ON_SIDE, SIDE_TIME) OR IS_VEHICLE_STUCK_TIMER_UP(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], VEH_STUCK_ON_ROOF, ROOF_TIME) REMOVE_HELI_BLIP_AND_TEXT() MISSION_FAILED(FAIL_CHOPPER_STUCK) ENDIF ENDIF ENDIF ENDIF ENDIF IF currentMissionStage = STAGE_GET_TO_CHOPPER IF NOT IS_VEHICLE_DRIVEABLE(snatchAndGrabVehicle[SAGV_MICHAEL_CAR]) REMOVE_CAR_BLIP_AND_TEXT() MISSION_FAILED(FAIL_CAR_DESTROYED) ELSE IF IS_VEHICLE_STUCK_TIMER_UP(snatchAndGrabVehicle[SAGV_MICHAEL_CAR], VEH_STUCK_JAMMED, JAMMED_TIME) OR IS_VEHICLE_STUCK_TIMER_UP(snatchAndGrabVehicle[SAGV_MICHAEL_CAR], VEH_STUCK_HUNG_UP, HUNG_UP_TIME) OR IS_VEHICLE_STUCK_TIMER_UP(snatchAndGrabVehicle[SAGV_MICHAEL_CAR], VEH_STUCK_ON_SIDE, SIDE_TIME) OR IS_VEHICLE_STUCK_TIMER_UP(snatchAndGrabVehicle[SAGV_MICHAEL_CAR], VEH_STUCK_ON_ROOF, ROOF_TIME) REMOVE_CAR_BLIP_AND_TEXT() MISSION_FAILED(FAIL_CAR_STUCK) ENDIF IF GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), snatchAndGrabVehicle[SAGV_MICHAEL_CAR], FALSE) > STUCK_FAIL_RANGE_m MISSION_FAILED(FAIL_ABANDONED_CAR) 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 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 // 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_RAPPEL_DOWN CASE STAGE_SNIPE_GUARDS CASE STAGE_CHOPPER_CHASE CASE STAGE_DROPOFF SWITCH GET_CURRENT_PLAYER_PED_ENUM() CASE CHAR_MICHAEL BOOL bCreateAtBottomOfTower bCreateAtBottomOfTower = TRUE IF currentMissionStage >= STAGE_CHOPPER_CHASE IF IS_VEHICLE_DRIVEABLE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) PED_INDEX pilotPed pilotPed = GET_PED_IN_VEHICLE_SEAT(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) IF DOES_ENTITY_EXIST(pilotPed) DELETE_PED(pilotPed) ENDIF SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) bCreateAtBottomOfTower = FALSE ENDIF ENDIF ENDIF IF bCreateAtBottomOfTower MISSION_FLOW_SET_FAIL_WARP_LOCATION(<<111.05540, -612.03613, 43.22037>>, 53.7) SET_REPLAY_DECLINED_VEHICLE_WARP_LOCATION(<<107.17, -607.66, 43.81>>, -20.0) ENDIF BREAK CASE CHAR_FRANKLIN MISSION_FLOW_SET_FAIL_WARP_LOCATION(<<-111.59071, -609.55170, 35.28290>>, -127.0) SET_REPLAY_DECLINED_VEHICLE_WARP_LOCATION(<<-107.15, -611.71, 35.76>>, 160.2) BREAK ENDSWITCH BREAK ENDSWITCH //SET_REPLAY_DECLINED_VEHICLE_WARP_LOCATION(<< 79.2596, -692.3523, 43.2205 >>, 336.9140) // get rid of enemy chopper DELETE_ENEMY_CHOPPER() IF g_bMagDemoActive DELETE_ALL_ENTITIES_IN_FADE() ENDIF 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 // fill position, rotation, FOV for a camera shot PROC FILL_CAMERA_PROPERTIES_FOR_SNATCH_AND_GRAB_SHOT(SNATCH_AND_GRAB_SHOT_DETAILS_ENUM cutsceneShot, VECTOR &vCamPos, VECTOR &vCamRot, FLOAT &fCamFOV) SWITCH cutsceneShot CASE SAG_SHOT_ARRIVE vCamPos = <<96.46, -622.69, 262.29>> vCamRot = <<19.41, 0.0, -103.44>> fCamFOV = 29.75 BREAK CASE SAG_SHOT_ARRIVEB vCamPos = <<96.46, -622.69, 262.29>> vCamRot = <<19.41, 0.0, -85.27>> fCamFOV = 29.75 BREAK CASE SAG_SHOT_ARRIVE2 vCamPos = <<81.82, -669.82, 274.21>> vCamRot = <<0.61, 0.60, -21.81>> fCamFOV = 22.04 BREAK CASE SAG_SHOT_ARRIVE2B vCamPos = <<81.82, -669.82, 274.21>> vCamRot = <<-6.98, 0.60, -21.80>> fCamFOV = 22.04 BREAK CASE SAG_SHOT_ARRIVE3 vCamPos = <<110.16, -590.50, 254.40>> vCamRot = <<15.76, 0.28, 158.27>> fCamFOV = 28.054 BREAK CASE SAG_SHOT_ARRIVE3B vCamPos = <<110.16, -590.50, 254.40>> vCamRot = <<21.49, 0.47, -166.12>> fCamFOV = 28.054 BREAK CASE SAG_SHOT_INSIDE vCamPos = <<119.15, -618.77, 206.46>> vCamRot = <<0.64, 0.0, 99.40>> fCamFOV = 39.54 BREAK CASE SAG_SHOT_SMASH_IN vCamPos = <<118.88, -618.60, 206.81>> vCamRot = <<-12.44, 0.0, 105.89>> fCamFOV = 53.16 BREAK CASE SAG_SHOT_WAIT_FOR_SWITCH vCamPos = <<109.385162,-618.262939,206.679871>> vCamRot = <<-5.776211,0.000091,-104.552917>> fCamFOV = 35.00 BREAK CASE SAG_SHOT_WAIT_FOR_SWITCHB vCamPos = <<109.385162,-618.262939,206.679871>> vCamRot = <<-5.776211,0.000091,-104.552917>> fCamFOV = 35.00 BREAK // the alt /* CASE SAG_SHOT_WINCHING vCamPos = <<110.84, -619.28, 216.49>> vCamRot = <<-57.33, -14.65, -8.90>> fCamFOV = 24.755 BREAK CASE SAG_SHOT_WINCHINGB vCamPos = <<110.84, -619.28, 216.49>> vCamRot = <<9.20, -5.80, -9.65>> fCamFOV = 24.755 BREAK */ CASE SAG_SHOT_WINCHING vCamPos = <<111.93, -614.87, 209.10>> vCamRot = <<-5.14, -4.85, 155.18>> fCamFOV = 32.662 BREAK CASE SAG_SHOT_WINCHINGB vCamPos = <<111.93, -614.87, 209.10>> vCamRot = <<10.86, -4.85, 155.18>> fCamFOV = 32.662 BREAK CASE SAG_SHOT_FIB1 vCamPos = <<60.9, -753.7, 46.0>> vCamRot = <<5.8, 0.0, -75.0>> fCamFOV = 46.6 BREAK CASE SAG_SHOT_FIB1B vCamPos = <<59.3, -751.7, 46.8>> vCamRot = <<61.9, 0.0, -63.8>> fCamFOV = 46.6 BREAK CASE SAG_SHOT_FIB2 vCamPos = <<50.3, -734.0, 230.0>> vCamRot = <<18.2, 0.0, -65.5>> fCamFOV = 46.6 BREAK CASE SAG_SHOT_FIB2B vCamPos = <<50.1, -733.5, 230.0>> vCamRot = <<18.2, 0.0, -61.9>> fCamFOV = 46.6 BREAK ENDSWITCH 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) // 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", TRUE) ENDIF ENDPROC // cam for a cutscene shot PROC CREATE_CAM_FOR_SNATCH_AND_GRAB_SHOT(SNATCH_AND_GRAB_SHOT_DETAILS_ENUM cutsceneShot, BOOL bIsInterp = FALSE, INT iInterpTime = 10000) VECTOR vCamPos, vCamRot FLOAT fCamFOV FILL_CAMERA_PROPERTIES_FOR_SNATCH_AND_GRAB_SHOT(cutsceneShot, vCamPos, vCamRot, fCamFOV) CREATE_MISSION_STATIC_CAM(staticCam) DETACH_CAM(staticCam) STOP_CAM_POINTING(staticCam) SET_CAM_COORD(staticCam, vCamPos) SET_CAM_ROT(staticCam, vCamRot) SET_CAM_FOV(staticCam, fCamFOV) // setup for interpolation IF bIsInterp SNATCH_AND_GRAB_SHOT_DETAILS_ENUM shotDetails = INT_TO_ENUM(SNATCH_AND_GRAB_SHOT_DETAILS_ENUM, ENUM_TO_INT(cutsceneShot)+1) FILL_CAMERA_PROPERTIES_FOR_SNATCH_AND_GRAB_SHOT(shotDetails, 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 an anim cam for sync scenes PROC CREATE_MISSION_ANIM_CAM(BOOL bStartActivated = TRUE) IF DOES_CAM_EXIST(animCam) DESTROY_CAM(animCam) ENDIF animCam = CREATE_CAM("DEFAULT_ANIMATED_CAMERA", bStartActivated) RENDER_SCRIPT_CAMS(TRUE, FALSE) ENDPROC // create follow cam for come back from MCS_1 skip //PROC CREATE_FOLLOW_CAM() // CREATE_MISSION_STATIC_CAM(followCam) // RENDER_SCRIPT_CAMS(TRUE, FALSE) //ENDPROC // create the follow cam /* PROC HANDLE_CREATE_FOLLOW_CAM_ON_FLY() IF NOT DOES_CAM_EXIST(followCam) CREATE_MISSION_STATIC_CAM(followCam) SET_CAM_COORD(followCam,<<10,10,10>>) RENDER_SCRIPT_CAMS(TRUE,FALSE) ELSE SET_CAM_COORD(followCam,GET_FINAL_RENDERED_CAM_COORD()) SET_CAM_FAR_CLIP(followCam,GET_FINAL_RENDERED_CAM_FAR_CLIP()) SET_CAM_FAR_DOF(followCam,GET_FINAL_RENDERED_CAM_FAR_DOF()) SET_CAM_FOV(followCam,GET_FINAL_RENDERED_CAM_FOV()) SET_CAM_MOTION_BLUR_STRENGTH(followCam,GET_FINAL_RENDERED_CAM_MOTION_BLUR_STRENGTH()) SET_CAM_NEAR_CLIP(followCam,GET_FINAL_RENDERED_CAM_NEAR_CLIP()) SET_CAM_NEAR_DOF(followCam,GET_FINAL_RENDERED_CAM_NEAR_DOF()) SET_CAM_ROT(followCam,GET_FINAL_RENDERED_CAM_ROT()) //PRINTSTRING("coord = ") PRINTVECTOR(GET_FINAL_RENDERED_CAM_COORD()) PRINTNL() //PRINTSTRING("rot = ") PRINTVECTOR(GET_FINAL_RENDERED_CAM_ROT()) PRINTNL() //PRINTSTRING("farclip = ") PRINTFLOAT(GET_FINAL_RENDERED_CAM_FAR_CLIP()) PRINTNL() //PRINTSTRING("fardof = ") PRINTFLOAT(GET_FINAL_RENDERED_CAM_FAR_DOF()) PRINTNL() //PRINTSTRING("fov = ") PRINTFLOAT(GET_FINAL_RENDERED_CAM_FOV()) PRINTNL() //PRINTSTRING("blur = ") PRINTFLOAT(GET_FINAL_RENDERED_CAM_MOTION_BLUR_STRENGTH()) PRINTNL() //PRINTSTRING("nearclip = ") PRINTFLOAT(GET_FINAL_RENDERED_CAM_NEAR_CLIP()) PRINTNL() //PRINTSTRING("neardof= ") PRINTFLOAT(GET_FINAL_RENDERED_CAM_NEAR_DOF()) PRINTNL() ENDIF ENDPROC // create fake follow cam PROC CREATE_FAKE_FOLLOW_CAM() IF NOT DOES_CAM_EXIST(followCam) CREATE_MISSION_STATIC_CAM(followCam) SET_CAM_COORD(followCam,<< 1370.51, -2089.4, 53.2142 >>) SET_CAM_FAR_CLIP(followCam,5000.000000) SET_CAM_FAR_DOF(followCam,150.000000) SET_CAM_FOV(followCam, 40.000000) SET_CAM_MOTION_BLUR_STRENGTH(followCam,0.000000) SET_CAM_NEAR_CLIP(followCam,0.5) SET_CAM_NEAR_DOF(followCam,0.100000) SET_CAM_ROT(followCam,<< 0.000454265, 0.000252917, 12.5 >>) RENDER_SCRIPT_CAMS(TRUE,FALSE) ENDIF ENDPROC */ PROC CLEANUP_HOTSWAP_CAMERAS() INT i REPEAT COUNT_OF(sCamDetails.camInterpIDs) i IF DOES_CAM_EXIST(sCamDetails.camInterpIDs[i]) DESTROY_CAM(sCamDetails.camInterpIDs[i]) ENDIF ENDREPEAT ENDPROC /* // create cam interping from sniper PROC CREATE_INTERP_FROM_SNIPER(VECTOR vRiflePos, VECTOR vRifleRot, FLOAT fRifleFOV) DESTROY_MISSION_STATIC_CAM(staticCam) DESTROY_MISSION_STATIC_CAM(interpCam) IF DOES_CAM_EXIST(animCam) DESTROY_CAM(animCam) ENDIF CREATE_MISSION_STATIC_CAM(staticCam) // set cam coords to sniper pos SET_CAM_COORD(staticCam, vRiflePos) SET_CAM_ROT(staticCam, vRifleRot) SET_CAM_FOV(staticCam, fRifleFOV) // setup interp VECTOR vCamPos, vCamRot FLOAT fCamFOV FILL_CAMERA_PROPERTIES_FOR_SNATCH_AND_GRAB_SHOT(SAG_SHOT_PRE_EXTRACT, 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, 2000) // render RENDER_SCRIPT_CAMS(TRUE, FALSE) ENDPROC */ // create a spline cam for between interp and franklin PROC CREATE_SPLINE_INTERP_TO_FRANKLIN() IF DOES_CAM_EXIST(interpCam) DESTROY_MISSION_STATIC_CAM(staticCam) IF DOES_CAM_EXIST(animCam) DESTROY_CAM(animCam) ENDIF FLOAT fInterpFOV = GET_CAM_FOV(interpCam) VECTOR vEaseFromMichael DESTROY_MISSION_STATIC_CAM(interpCam) // Re-using these camera indices CLEANUP_HOTSWAP_CAMERAS() ////interpCam = CREATE_CAM("SMOOTHED_SPLINE_CAMERA", TRUE) interpCam = CREATE_CAMERA(CAMTYPE_SPLINE_TIMED_CUSTOM, FALSE) //// SET_CAM_FOV(interpCam, fInterpFov) ////sCamDetails.camInterpIDs[0] = CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SCRIPTED, vSniperNodePos1, vSniperNodeRot1, fInterpFov, TRUE) sCamDetails.camInterpIDs[0] = CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SCRIPTED, GET_FINAL_RENDERED_CAM_COORD(), GET_FINAL_RENDERED_CAM_ROT(), GET_FINAL_RENDERED_CAM_FOV(), TRUE) ADD_CAM_SPLINE_NODE_USING_CAMERA(interpCam, sCamDetails.camInterpIDs[0], 0, CAM_SPLINE_NODE_SMOOTH_LENS_PARAMS) SET_CAM_MOTION_BLUR_STRENGTH(sCamDetails.camInterpIDs[0], 0.5) ////ADD_CAM_SPLINE_NODE(interpCam, GET_FINAL_RENDERED_CAM_COORD(), GET_FINAL_RENDERED_CAM_ROT(), 0, CAM_SPLINE_NODE_SMOOTH_ROT|CAM_SPLINE_NODE_SMOOTH_LENS_PARAMS) vEaseFromMichael = LERP_VECTOR(GET_FINAL_RENDERED_CAM_COORD(), vSniperNodePos3, 0.1) sCamDetails.camInterpIDs[1] = CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SCRIPTED, vEaseFromMichael, GET_FINAL_RENDERED_CAM_ROT(), GET_FINAL_RENDERED_CAM_FOV(), TRUE) ADD_CAM_SPLINE_NODE_USING_CAMERA(interpCam, sCamDetails.camInterpIDs[1], 1200, CAM_SPLINE_NODE_SMOOTH_ROT | CAM_SPLINE_NODE_SMOOTH_LENS_PARAMS) SET_CAM_MOTION_BLUR_STRENGTH(sCamDetails.camInterpIDs[1], 0.8) sCamDetails.camInterpIDs[3] = CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SCRIPTED, vSniperNodePos3, vSniperNodeRot3, fInterpFov, TRUE) ADD_CAM_SPLINE_NODE_USING_CAMERA(interpCam, sCamDetails.camInterpIDs[3], 900, CAM_SPLINE_NODE_SMOOTH_LENS_PARAMS) SET_CAM_MOTION_BLUR_STRENGTH(sCamDetails.camInterpIDs[3], 1.0) SET_CAM_SPLINE_DURATION(interpCam, 1000) SET_CAM_SPLINE_SMOOTHING_STYLE(interpCam, CAM_SPLINE_SLOW_IN_OUT_SMOOTH) //SET_CAM_SPLINE_DURATION(interpCam, iSniperNodeTime2+iSniperNodeTime3+iSniperNodeTime4+iSniperNodeTime5+iSniperNodeTime6-33) //SET_CAM_MOTION_BLUR_STRENGTH(interpCam, 0.8) SET_CAM_ACTIVE(interpCam, TRUE) // Set active last so it will be the final camera. RENDER_SCRIPT_CAMS(TRUE, FALSE) 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 // do a fadein post cutscene PROC DO_POST_CUTSCENE_FADE_IN() IF IS_SCREEN_FADED_OUT() DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME) ENDIF 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_CUTSCENE_HUD_ELEMENTS() SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE) ENDPROC // setup stuff for snatch and grab cutscene PROC SET_MISSION_CUTSCENE(BOOL bStart, BOOL bResetControlAndCameras = TRUE, BOOL bDoFade = TRUE, BOOL bRemoveText = TRUE, BOOL bSetRelativeHeading = TRUE, BOOL bSetMultiHeadBlinders = TRUE) IF bRemoveText REMOVE_MISSION_TEXT() ENDIF IF bStart SET_CUTSCENE_HUD_ELEMENTS() SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE,DEFAULT,bSetMultiHeadBlinders) DISPLAY_RADAR(FALSE) DISPLAY_HUD(FALSE) iAllowSkipCutsceneTime = GET_GAME_TIMER() ELSE SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE,DEFAULT,bSetMultiHeadBlinders) IF bResetControlAndCameras SET_PLAYER_CONTROL(PLAYER_ID(), TRUE) DISPLAY_RADAR(TRUE) DISPLAY_HUD(TRUE) DISABLE_CELLPHONE(FALSE) RENDER_SCRIPT_CAMS(FALSE, FALSE) IF DOES_CAM_EXIST(animCam) DESTROY_CAM(animCam) ENDIF DESTROY_MISSION_STATIC_CAM(staticCam) DESTROY_MISSION_STATIC_CAM(interpCam) IF bSetRelativeHeading SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0) ENDIF ENDIF bRunningCutscene = FALSE bClearedForCutscene = FALSE bSkippedCutscene = FALSE bCutsceneWaitStarted = FALSE cutsceneStage = SAG_CUT_STAGE_INIT IF bDoFade DO_POST_CUTSCENE_FADE_IN() 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 // is office ready FUNC BOOL IS_OFFICE_READY() IF bInteriorPinned IF IS_INTERIOR_READY(officeInterior) RETURN TRUE ENDIF ENDIF RETURN FALSE ENDFUNC // pin the office in memory PROC PIN_OFFICE_INTERIOR(BOOL bDoPin, BOOL bWait) IF bDoPin IF NOT bInteriorPinned officeInterior = GET_INTERIOR_AT_COORDS(<<116.08, -620.64, 206.53>>) IF IS_VALID_INTERIOR(officeInterior) PIN_INTERIOR_IN_MEMORY(officeInterior) bInteriorPinned = TRUE IF bWait WHILE NOT IS_OFFICE_READY() WAIT(0) ENDWHILE ENDIF ENDIF ENDIF ELSE IF bInteriorPinned UNPIN_INTERIOR(officeInterior) bInteriorPinned = FALSE ENDIF ENDIF ENDPROC // get correct model for mission vehicle FUNC SNATCH_AND_GRAB_MODEL_ENUM GET_MODEL_ENUM_FOR_SNATCH_AND_GRAB_VEHICLE(SNATCH_AND_GRAB_VEHICLE_ENUM sagVehicle) SWITCH sagVehicle CASE SAGV_PLAYER_CHOPPER RETURN SAGM_CHOPPER BREAK CASE SAGV_MICHAEL_CAR RETURN SAGM_MICHAEL_CAR BREAK // CASE SAGV_TREVOR_JEEP // RETURN SAGM_TREVOR_JEEP // BREAK CASE SAGV_FRANKLIN_BIKE RETURN SAGM_FRANKLIN_BIKE BREAK ENDSWITCH RETURN SAGM_CHOPPER ENDFUNC // is this model required on this stage? FUNC BOOL IS_MODEL_REQUIRED_FOR_MISSION_STAGE(SNATCH_AND_GRAB_MODEL_ENUM sagModel, MISSION_STAGE_ENUM reqStage) SWITCH sagModel CASE SAGM_MICHAEL RETURN TRUE BREAK CASE SAGM_FRANKLIN IF reqStage = STAGE_RAPPEL_DOWN OR reqStage = STAGE_SNIPE_GUARDS RETURN TRUE ENDIF BREAK CASE SAGM_TREVOR IF reqStage >= STAGE_GET_TO_BUILDING RETURN TRUE ENDIF BREAK CASE SAGM_DAVE IF reqStage <= STAGE_GET_TO_CHOPPER RETURN TRUE ENDIF BREAK CASE SAGM_STEVE CASE SAGM_ANDREAS CASE SAGM_COFFEE IF reqStage <= STAGE_GET_TO_CHOPPER RETURN TRUE ENDIF BREAK CASE SAGM_CHOPPER IF reqStage >= STAGE_GET_TO_BUILDING RETURN TRUE ENDIF BREAK CASE SAGM_ENEMY_CHOPPER //CASE SAGM_ENEMY_CHOPPER_TEST IF reqStage = STAGE_CHOPPER_CHASE RETURN TRUE ENDIF BREAK CASE SAGM_PRISONER_HIGH //IF reqStage >= STAGE_SNIPE_GUARDS // RETURN TRUE //ENDIF BREAK CASE SAGM_PRISONER_LOW IF reqStage >= STAGE_SNIPE_GUARDS RETURN TRUE ENDIF BREAK CASE SAGM_GUARD IF reqStage >= STAGE_SNIPE_GUARDS AND reqStage <= STAGE_CHOPPER_CHASE RETURN TRUE ENDIF BREAK CASE SAGM_PILOT IF reqStage = STAGE_CHOPPER_CHASE RETURN TRUE ENDIF BREAK CASE SAGM_MICHELLE CASE SAGM_TORCH BREAK CASE SAGM_FBI //IF reqStage >= STAGE_CHOPPER_CHASE // RETURN TRUE //ENDIF BREAK CASE SAGM_MICHAEL_CAR IF reqStage = STAGE_GET_TO_CHOPPER RETURN TRUE ENDIF BREAK CASE SAGM_FRANKLIN_BIKE BREAK CASE SAGM_PULLEY IF reqStage = STAGE_RAPPEL_DOWN RETURN TRUE ENDIF BREAK /* CASE SAGM_TREVOR_JEEP IF reqStage <= STAGE_GET_TO_BUILDING OR reqStage = STAGE_CHOPPER_CHASE RETURN TRUE ENDIF BREAK */ CASE SAGM_FBI_VAN // IF reqStage >= STAGE_CHOPPER_CHASE // RETURN TRUE // ENDIF BREAK CASE SAGM_UTIL_TRUCK_1 CASE SAGM_UTIL_TRUCK_2 IF reqStage = STAGE_GET_TO_BUILDING RETURN TRUE ENDIF BREAK CASE SAGM_HARNESS IF reqStage >= STAGE_RAPPEL_DOWN RETURN TRUE ENDIF BREAK //CASE SAGM_HOOK // IF reqStage >= STAGE_RAPPEL_DOWN // RETURN TRUE // ENDIF //BREAK //CASE SAGM_BLOCK // IF reqStage >= STAGE_CHOPPER_CHASE // 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_SNATCH_AND_GRAB_MODEL_ENUM(INT_TO_ENUM(SNATCH_AND_GRAB_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_SNATCH_AND_GRAB_MODEL_ENUM(INT_TO_ENUM(SNATCH_AND_GRAB_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_SNATCH_AND_GRAB_MODEL_ENUM(INT_TO_ENUM(SNATCH_AND_GRAB_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(SNATCH_AND_GRAB_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(SNATCH_AND_GRAB_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 // chopper hover SWITCH reqStage //CASE STAGE_GET_TO_BUILDING CASE STAGE_RAPPEL_DOWN RETURN TRUE BREAK ENDSWITCH BREAK CASE 002 // chopper escape IF reqStage = STAGE_SNIPE_GUARDS OR reqStage = STAGE_CHOPPER_CHASE OR reqStage = STAGE_RAPPEL_DOWN RETURN TRUE ENDIF BREAK CASE 003 // enemy chopper 1 IF reqStage = STAGE_CHOPPER_CHASE RETURN TRUE ENDIF BREAK //CASE 004 // chopper arrive at building - over roof //CASE 005 // chopper arrive at building - opposite dir //CASE 006 // chopper arrive at building - same dir //IF reqStage = STAGE_GET_TO_BUILDING // RETURN TRUE //ENDIF //BREAK //CASE 007 // traffic 1 //CASE 008 // traffic 2 //CASE 009 // traffic 3 //CASE 010 // traffic 4 //IF reqStage = STAGE_RAPPEL_DOWN //OR reqStage = STAGE_GET_TO_BUILDING // RETURN TRUE //ENDIF //BREAK CASE 011 // escape v2 IF reqStage = STAGE_CHOPPER_CHASE RETURN TRUE ENDIF BREAK CASE 012 // enemy chopper 2 CASE 013 // enemy chopper 3 IF reqStage = STAGE_CHOPPER_CHASE RETURN TRUE ENDIF BREAK ENDSWITCH RETURN FALSE ENDFUNC // add a request for a recording PROC ADD_RECORDING_REQUEST(INT iRec) bVehicleRecordingRequestTracker[iRec-1] = TRUE REQUEST_VEHICLE_RECORDING(iRec, GET_SNATCH_AND_GRAB_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_SNATCH_AND_GRAB_RECORDING_PREFIX()) REMOVE_VEHICLE_RECORDING(iRec, GET_SNATCH_AND_GRAB_RECORDING_PREFIX()) ENDIF ENDIF ENDPROC // have all requests for recordings 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_SNATCH_AND_GRAB_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 anim dict required on this stage? FUNC BOOL IS_ANIM_DICT_REQUIRED_FOR_MISSION_STAGE(SNATCH_AND_GRAB_ANIM_DICT_ENUM animDict, MISSION_STAGE_ENUM reqStage) SWITCH animDict CASE SAG_ANIM_DICT_MISSION IF currentMissionStage = STAGE_SNIPE_GUARDS RETURN TRUE ENDIF BREAK CASE SAG_ANIM_DICT_RAPPEL IF reqStage = STAGE_RAPPEL_DOWN RETURN TRUE ENDIF BREAK CASE SAG_ANIM_DICT_GUARDS IF reqStage = STAGE_SNIPE_GUARDS RETURN TRUE ENDIF BREAK CASE SAG_ANIM_DICT_CUTSCENES BREAK CASE SAG_ANIM_DICT_INTRO BREAK CASE SAG_ANIM_DICT_AIM_VARIATIONS CASE SAG_ANIM_DICT_COMBAT_GLANCES CASE SAG_ANIM_DICT_OVER_THERE CASE SAG_ANIM_DICT_PANIC CASE SAG_ANIM_DICT_BECKON IF reqStage = STAGE_SNIPE_GUARDS RETURN TRUE ENDIF BREAK CASE SAG_ANIM_DICT_FOOD_COURT IF reqStage <= STAGE_GET_TO_CHOPPER RETURN TRUE ENDIF BREAK CASE SAG_ANIM_DICT_IN_OFFICE IF reqStage = STAGE_SNIPE_GUARDS RETURN TRUE ENDIF BREAK CASE SAG_ANIM_DICT_FLY_HOME CASE SAG_ANIM_CAM_SHAKE_LIBRARY IF reqStage >= STAGE_CHOPPER_CHASE RETURN TRUE ENDIF BREAK CASE SAG_ANIM_DICT_SNIPER IF reqStage >= STAGE_SNIPE_GUARDS RETURN TRUE ENDIF BREAK ENDSWITCH RETURN FALSE ENDFUNC // add a request for an anim PROC ADD_ANIM_DICT_REQUEST(SNATCH_AND_GRAB_ANIM_DICT_ENUM animDict) bAnimDictRequestTracker[animDict] = TRUE STRING sAnimDict = GET_SNATCH_AND_GRAB_ANIM_DICT_AS_STRING(animDict) REQUEST_ANIM_DICT(sAnimDict) ENDPROC // clear an anim request slot PROC CLEAR_ANIM_DICT_REQUEST(SNATCH_AND_GRAB_ANIM_DICT_ENUM animDict) IF bAnimDictRequestTracker[animDict] bAnimDictRequestTracker[animDict] = FALSE STRING sAnimDict = GET_SNATCH_AND_GRAB_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(SNATCH_AND_GRAB_ANIM_DICT_ENUM) i IF bAnimDictRequestTracker[i] IF NOT HAS_ANIM_DICT_LOADED(GET_SNATCH_AND_GRAB_ANIM_DICT_AS_STRING(INT_TO_ENUM(SNATCH_AND_GRAB_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(SNATCH_AND_GRAB_ANIM_DICT_ENUM) i SNATCH_AND_GRAB_ANIM_DICT_ENUM thisAnimDict = INT_TO_ENUM(SNATCH_AND_GRAB_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(SNATCH_AND_GRAB_WEAPON_ENUM weapon, MISSION_STAGE_ENUM reqStage) SWITCH weapon CASE SAG_WEAPON_MICHAEL_PISTOL IF reqStage >= STAGE_RAPPEL_DOWN RETURN TRUE ENDIF BREAK CASE SAG_WEAPON_CIA_PISTOL RETURN TRUE BREAK CASE SAG_WEAPON_CIA_SMG IF reqStage = STAGE_SNIPE_GUARDS OR reqStage = STAGE_CHOPPER_CHASE RETURN TRUE ENDIF BREAK CASE SAG_WEAPON_CIA_HELI IF reqStage = STAGE_CHOPPER_CHASE RETURN TRUE ENDIF BREAK CASE SAG_WEAPON_SNIPER_RIFLE IF reqStage >= STAGE_RAPPEL_DOWN RETURN TRUE ENDIF BREAK CASE SAG_WEAPON_MICHAEL_RIFLE IF reqStage >= STAGE_CHOPPER_CHASE RETURN TRUE ENDIF BREAK ENDSWITCH RETURN FALSE ENDFUNC // add a request for a weapon PROC ADD_WEAPON_REQUEST(SNATCH_AND_GRAB_WEAPON_ENUM weapon) bWeaponRequestTracker[weapon] = TRUE WEAPON_TYPE weaponType = GET_SNATCH_AND_GRAB_WEAPON_TYPE(weapon) REQUEST_WEAPON_ASSET(weaponType) ENDPROC // clear a weapon request slot PROC CLEAR_WEAPON_REQUEST(SNATCH_AND_GRAB_WEAPON_ENUM weapon) IF bWeaponRequestTracker[weapon] bWeaponRequestTracker[weapon] = FALSE WEAPON_TYPE weaponType = GET_SNATCH_AND_GRAB_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(SNATCH_AND_GRAB_WEAPON_ENUM) i IF bWeaponRequestTracker[i] IF NOT HAS_WEAPON_ASSET_LOADED(GET_SNATCH_AND_GRAB_WEAPON_TYPE(INT_TO_ENUM(SNATCH_AND_GRAB_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(SNATCH_AND_GRAB_WEAPON_ENUM) i SNATCH_AND_GRAB_WEAPON_ENUM thisWeapon = INT_TO_ENUM(SNATCH_AND_GRAB_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_SNATCH_AND_GRAB_PTFX_AS_STRING(SNATCH_AND_GRAB_PTFX_ENUM ptfx) SWITCH ptfx CASE SAG_PTFX_PLACEHOLDER BREAK ENDSWITCH RETURN "invalid!" ENDFUNC */ // is this ptfx required on this stage? FUNC BOOL IS_PTFX_REQUIRED_FOR_MISSION_STAGE(SNATCH_AND_GRAB_PTFX_ENUM ptfx, MISSION_STAGE_ENUM reqStage) reqStage = reqStage // TEMP SWITCH ptfx CASE SAG_PTFX_PLACEHOLDER BREAK ENDSWITCH RETURN FALSE ENDFUNC // add a request for a ptfx PROC ADD_PTFX_REQUEST(SNATCH_AND_GRAB_PTFX_ENUM ptfx) bPTFXRequestTracker[ptfx] = TRUE // STRING sPTFX = GET_SNATCH_AND_GRAB_PTFX_AS_STRING(ptfx) REQUEST_PTFX_ASSET() ENDPROC // clear a ptfx request slot PROC CLEAR_PTFX_REQUEST(SNATCH_AND_GRAB_PTFX_ENUM ptfx) IF bPTFXRequestTracker[ptfx] bPTFXRequestTracker[ptfx] = FALSE // STRING sPTFX = GET_SNATCH_AND_GRAB_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(SNATCH_AND_GRAB_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(SNATCH_AND_GRAB_PTFX_ENUM) i SNATCH_AND_GRAB_PTFX_ENUM thisPTFX = INT_TO_ENUM(SNATCH_AND_GRAB_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_SNATCH_AND_GRAB_SFX_AS_STRING(SNATCH_AND_GRAB_SFX_ENUM sfx) SWITCH sfx CASE SAG_SFX_MISSION RETURN GET_MISSION_AUDIO_BANK_NAME() BREAK CASE SAG_SFX_HELIS RETURN "FBI_02_Snatch_And_Grab_HELI_CHASE" BREAK //CASE SAG_SFX_RAPPEL // RETURN GET_RAPPEL_AUDIO_BANK_NAME() //BREAK ENDSWITCH RETURN "invalid!" ENDFUNC // is this sfx required on this stage? FUNC BOOL IS_SFX_REQUIRED_FOR_MISSION_STAGE(SNATCH_AND_GRAB_SFX_ENUM sfx, MISSION_STAGE_ENUM reqStage) SWITCH sfx CASE SAG_SFX_MISSION IF reqStage >= STAGE_RAPPEL_DOWN RETURN TRUE ENDIF BREAK CASE SAG_SFX_HELIS IF reqStage = STAGE_CHOPPER_CHASE RETURN TRUE ENDIF BREAK //CASE SAG_SFX_RAPPEL // IF reqStage >= STAGE_RAPPEL_DOWN // RETURN TRUE // ENDIF //BREAK ENDSWITCH RETURN FALSE ENDFUNC // add a request for a sfx PROC ADD_SFX_REQUEST(SNATCH_AND_GRAB_SFX_ENUM sfx) bSFXRequestTracker[sfx] = TRUE STRING sSFX = GET_SNATCH_AND_GRAB_SFX_AS_STRING(sfx) REQUEST_SCRIPT_AUDIO_BANK(sSFX) ENDPROC // clear a sfx request slot PROC CLEAR_SFX_REQUEST(SNATCH_AND_GRAB_SFX_ENUM sfx) IF bSFXRequestTracker[sfx] bSFXRequestTracker[sfx] = FALSE STRING sSFX = GET_SNATCH_AND_GRAB_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(SNATCH_AND_GRAB_SFX_ENUM) i IF bSFXRequestTracker[i] IF NOT REQUEST_SCRIPT_AUDIO_BANK(GET_SNATCH_AND_GRAB_SFX_AS_STRING(INT_TO_ENUM(SNATCH_AND_GRAB_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(SNATCH_AND_GRAB_SFX_ENUM) i SNATCH_AND_GRAB_SFX_ENUM thisSFX = INT_TO_ENUM(SNATCH_AND_GRAB_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(SNATCH_AND_GRAB_MISC_ASSET_ENUM miscAsset, MISSION_STAGE_ENUM reqStage) SWITCH miscAsset CASE SAG_MISC_ASSET_CAR_ANIMS IF reqStage = STAGE_GET_TO_CHOPPER RETURN TRUE ENDIF BREAK CASE SAG_MISC_ASSET_CHOPPER_ANIMS IF reqStage > STAGE_GET_TO_CHOPPER RETURN TRUE ENDIF BREAK CASE SAG_MISC_ASSET_HELI_DRIVEBY_ANIMS IF reqStage >= STAGE_CHOPPER_CHASE RETURN TRUE ENDIF BREAK CASE SAG_MISC_ASSET_DAVE_WALK IF reqStage = STAGE_GET_TO_CHOPPER RETURN TRUE ENDIF BREAK //CASE SAG_MISC_ASSET_FOOD_COURT_ANIMS // IF reqStage = STAGE_GET_TO_CHOPPER // RETURN TRUE // ENDIF //BREAK ENDSWITCH RETURN FALSE ENDFUNC // add a request for a misc asset PROC ADD_MISC_ASSET_REQUEST(SNATCH_AND_GRAB_MISC_ASSET_ENUM miscAsset) bMiscAssetRequestTracker[miscAsset] = TRUE SWITCH miscAsset CASE SAG_MISC_ASSET_CAR_ANIMS REQUEST_VEHICLE_ASSET(GET_MODEL_FOR_SNATCH_AND_GRAB_MODEL_ENUM(SAGM_MICHAEL_CAR)) BREAK CASE SAG_MISC_ASSET_CHOPPER_ANIMS REQUEST_VEHICLE_ASSET(GET_MODEL_FOR_SNATCH_AND_GRAB_MODEL_ENUM(SAGM_CHOPPER)) BREAK CASE SAG_MISC_ASSET_HELI_DRIVEBY_ANIMS REQUEST_CLIP_SET(GET_HELI_DRIVEBY_ANIMS_AS_STRING()) printstring("requesting driveby anims") printnl() BREAK CASE SAG_MISC_ASSET_DAVE_WALK REQUEST_WAYPOINT_RECORDING("davewalk") BREAK //CASE SAG_MISC_ASSET_FOOD_COURT_ANIMS // REQUEST_CLIP_SET("missFBI2@LeadInOutAndreas") // REQUEST_CLIP_SET("missFBI2@LeadInOutDaveN") // REQUEST_CLIP_SET("missFBI2@LeadInOutSteve") //BREAK ENDSWITCH ENDPROC // clear a misc asset slot PROC CLEAR_MISC_ASSET_REQUEST(SNATCH_AND_GRAB_MISC_ASSET_ENUM miscAsset) IF bMiscAssetRequestTracker[miscAsset] bMiscAssetRequestTracker[miscAsset] = FALSE SWITCH miscAsset CASE SAG_MISC_ASSET_CAR_ANIMS REMOVE_VEHICLE_ASSET(GET_MODEL_FOR_SNATCH_AND_GRAB_MODEL_ENUM(SAGM_MICHAEL_CAR)) BREAK CASE SAG_MISC_ASSET_CHOPPER_ANIMS REMOVE_VEHICLE_ASSET(GET_MODEL_FOR_SNATCH_AND_GRAB_MODEL_ENUM(SAGM_CHOPPER)) BREAK CASE SAG_MISC_ASSET_HELI_DRIVEBY_ANIMS REMOVE_CLIP_SET(GET_HELI_DRIVEBY_ANIMS_AS_STRING()) printstring("removing driveby anims") printnl() BREAK CASE SAG_MISC_ASSET_DAVE_WALK REMOVE_WAYPOINT_RECORDING("davewalk") BREAK //CASE SAG_MISC_ASSET_FOOD_COURT_ANIMS // REMOVE_CLIP_SET("missFBI2@LeadInOutAndreas") // REMOVE_CLIP_SET("missFBI2@LeadInOutDaveN") // REMOVE_CLIP_SET("missFBI2@LeadInOutSteve") //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(SNATCH_AND_GRAB_MISC_ASSET_ENUM) i IF bMiscAssetRequestTracker[i] SWITCH INT_TO_ENUM(SNATCH_AND_GRAB_MISC_ASSET_ENUM, i) CASE SAG_MISC_ASSET_CAR_ANIMS IF NOT HAS_VEHICLE_ASSET_LOADED(GET_MODEL_FOR_SNATCH_AND_GRAB_MODEL_ENUM(SAGM_MICHAEL_CAR)) RETURN FALSE ENDIF BREAK CASE SAG_MISC_ASSET_CHOPPER_ANIMS IF NOT HAS_VEHICLE_ASSET_LOADED(GET_MODEL_FOR_SNATCH_AND_GRAB_MODEL_ENUM(SAGM_CHOPPER)) RETURN FALSE ENDIF BREAK CASE SAG_MISC_ASSET_HELI_DRIVEBY_ANIMS IF NOT HAS_CLIP_SET_LOADED(GET_HELI_DRIVEBY_ANIMS_AS_STRING()) printstring("driveby anims not loaded") printnl() RETURN FALSE ELSE printstring("driveby anims are loaded!") printnl() ENDIF BREAK CASE SAG_MISC_ASSET_DAVE_WALK IF NOT GET_IS_WAYPOINT_RECORDING_LOADED("davewalk") RETURN FALSE ENDIF BREAK //CASE SAG_MISC_ASSET_FOOD_COURT_ANIMS // IF NOT HAS_CLIP_SET_LOADED("missFBI2@LeadInOutAndreas") // OR NOT HAS_CLIP_SET_LOADED("missFBI2@LeadInOutDaveN") // OR NOT HAS_CLIP_SET_LOADED("missFBI2@LeadInOutSteve") // 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(SNATCH_AND_GRAB_MISC_ASSET_ENUM) i SNATCH_AND_GRAB_MISC_ASSET_ENUM thisMiscAsset = INT_TO_ENUM(SNATCH_AND_GRAB_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) printstring("waiting on misc asset requests") printnl() ENDWHILE ENDIF ENDIF ENDPROC // request the text for the mission PROC REQUEST_TEXT(BOOL bWaitForLoad) REQUEST_ADDITIONAL_TEXT("SAGRAB", 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() streamingStage = MISSION_STREAMING_STAGE_REQUEST cutsceneStage = SAG_CUT_STAGE_INIT bRunningCutscene = FALSE bSkippedCutscene = FALSE bClearedForCutscene = FALSE bCutsceneWaitStarted = FALSE bShownGodText = FALSE bSniperMusicStarted = FALSE bDoneGotoSpeech = FALSE bShouldDoGetInText = FALSE fLockDoorOpen = DOOR_OPEN_RATIO bDoneBanter = FALSE bSavedBanter = FALSE bRemovedBlipsForWanted = FALSE //bKilledConversationOnWanted = FALSE bShownLoseWantedPrompt = FALSE bArrivedAtBuilding = FALSE bCloseToBuilding = FALSE bDisableSwitchDuringMagDemoEndScene = FALSE bHitCutsceneFailsafe = FALSE //iNextRandomSpeechTime = -1 ENDPROC // get all variables in the correct state for this stage PROC RESET_VARIABLES_FOR_STAGE(MISSION_STAGE_ENUM resetStage) INT i RESET_ALL_COMMON_VARIABLES() SWITCH resetStage CASE STAGE_FOOD_COURT bTriggeredGreetingAnim = FALSE bPlayerLeaveVehicle = FALSE bTriggeredGreetingSpeech = FALSE bDoneIntroCreateEntities = FALSE bDoneIntroClearStart = FALSE bPrestreamedLine= FALSE bCreatedGuysAtFoodCourt = FALSE BREAK CASE STAGE_GET_TO_CHOPPER hotswapStage = MISSION_HOTSWAP_STAGE_SELECT_CHARACTER createMeetingStage = CREATE_MEETING_STAGE_NOT_STARTED createUtilTrucksStage = CREATE_UTIL_TRUCKS_STAGE_NOT_STARTED pickupChopperLeadinStage = PICKUP_CHOPPER_LEADIN_NOT_STARTED daveIntoCarState = DAVE_INTO_CAR_STATE_WALKING //steveLeadOutState = LEAD_OUT_STATE_NOT_STARTED //andreasLeadOutState = LEAD_OUT_STATE_NOT_STARTED bSetMichaelToWalk = FALSE bMusicFaded = FALSE bMeetingCutsceneMusicStart = FALSE bMeetingCutsceneMusicEnd = FALSE //bForceIntoCar = FALSE bCarIsMoving = FALSE bRegisteredCall = FALSE //bRestoredControlOnStart = FALSE bChangedClothes = FALSE bWaitForBuddyPrompt = FALSE bGetBuddyPrompt = FALSE bKilledBanter = FALSE bKilledLookAtInCar = FALSE //bDoneBriefTroopsSpeech = FALSE bRemovedFBICar = FALSE bDoneApproachLotCue = FALSE //bKilledTrevorDiscussionSpeech = FALSE //bRestartedDiscussionSpeech = FALSE bDaveInCar = FALSE bDoneDaveLetsGoSpeech = FALSE bRemovedSteveAndAndreas = FALSE bLoopSteveAndAndreas = FALSE bDoneGetToLotSpeech = FALSE bDoneSteveLook = FALSE bDoneAndreasLook = FALSE bDoneInCarAudioScene = FALSE bDoneMichaelLeaveCarSpeech = FALSE bPreparedTrevorRantAudio = FALSE bSetSceneAudioEntity = FALSE bCanRunPickupChopperScene = FALSE bDaveActionModeTrack = FALSE bDoneDaveShuffle = FALSE bKilledDaveSpeechForDamage = FALSE bKilledDaveSpeechForWanted = FALSE bDoneDaveWantedSpeech = FALSE bWarpedToLot = FALSE bDoneDaveCarSpeech = FALSE bKilledSpeechForDaveCar = FALSE bKilledMichaelLeaveCarSpeechForTime = FALSE bSetNavmesh = FALSE bFrozeChairs = FALSE bCacheAt = FALSE iGetInTextStage = 0 iDriveBanterStage = 0 iDaveActionModeDelay = 0 iDaveDamageSpeechCount = 0 iPushInTime = -1 fDaveWalkSpeed = MAX_DAVE_WALK_SPEED BREAK CASE STAGE_GET_TO_BUILDING hotswapStage = MISSION_HOTSWAP_STAGE_SELECT_CHARACTER bRequestedAtBuildingAssets = FALSE //bLatchedChopperDoors = FALSE bRemovedAltitudeHelp = FALSE bDoneGetInPositionSpeech = FALSE bKilledBanterInChopper = FALSE bRemovedUtilTrucks = FALSE bDoneHalfwayThereCue = FALSE bHeliLiftedOff = FALSE bDoneInterpBackToGame = FALSE bDoneFocusCamAudioScene = FALSE bDoneTowerHintCamHelp = FALSE iHelpStage = 0 iGetInTextStage = 2 BREAK CASE STAGE_RAPPEL_DOWN hotswapStage = MISSION_HOTSWAP_STAGE_SELECT_CHARACTER createInterrogationStage = CREATE_INTERROGATION_STAGE_NOT_STARTED replaceMrKStage = REPLACE_MR_K_STAGE_NOT_STARTED prisonerGrabState = PRISONER_GRAB_STATE_INIT smashThroughShot = SMASH_THROUGH_MOCAP jumpGruntState = JUMP_GRUNT_DO_ON_LAND pushInData.state = PUSH_IN_NOT_CREATED //bLatchedChopperDoors = FALSE bPlayingHoverBackwards = FALSE bCreatedOfficePedsForRappel = FALSE bRappelMusicStart = FALSE bHasDoneJump = FALSE //bSetSmashHelp = FALSE //bDisplayJumpHelp = FALSE bAllowSmashIn = FALSE bRegisteredSmash = FALSE bDeletedTraffic = FALSE bCreatedSniper = FALSE bGaveGuardWeapon = FALSE bTriggeredGuardShoot = FALSE bDoGuardsKillMichael = FALSE bFakeKillMichael = FALSE bResetGuardAim = FALSE bReactedToFirstShot = FALSE //bDrewWeapon = FALSE // bTakeOverRappelControl = FALSE // bFocusRappelCamIntoOffice = FALSE // bRestoreRappelCamToPlayer = FALSE bTortureMusicStart = FALSE bInitialisedInterrogation = FALSE bDoneSeeHelp = FALSE bUsingOfficeCam = FALSE // bHoldingShot = FALSE // bDoneSmashInSpeech = FALSE bFrozenFranklin = FALSE bDoneFranklinSniperSpeech = FALSE bKilledSpeechOnPan = FALSE //bSecretaryCower = FALSE bShownSwitchText = FALSE bRequestedGuardAnims = FALSE bDoneSmashSound = FALSE bDoneSwitchToFranklinCue = FALSE bUnmuffledRappelAudioScene = FALSE bInteriorCamIsOutside = FALSE bKeepTorch = FALSE bStuckOnOfficeCam = FALSE bWaitingOnOfficeCamRelease = FALSE bWarpedChopperToBuilding = FALSE bDisabledBlurOnRifle = FALSE bHitFranklinSound = FALSE bDoneHitSound = FALSE bWooshStarted = FALSE //bSniperOneshot = FALSE //bKilledSmashOS = FALSE //iTriggerGuardShootTime = -1 iWindowSmashStage = 0 iGuardSpeech = 0 iMichaelRappelSpeechStage = 0 // iInterrogationSpeechStage = 0 //iHoldShotStage = -1 fRopeTransitionPhase = 0.0 fRappelCamTransitionPhase = 0.0 fRappelCamTransitionPhaseSpeed = 0.0 iGuardAttackTime = -1 iGuardShot = 0 iInterrogationSubCount = 0 REPEAT NUMBER_TOWER_WINDOWS i fAtWindowTime[i] = 0.0 bAlertedWindow[i] = FALSE ENDREPEAT REPEAT NUMBER_TOWER_PEDS i towerPedState[i] = TOWER_PED_STATE_UNALERTED ENDREPEAT //fPointCamY = 0.0 //fPointCamZ = 0.0 //fPointCamYSpeed = 0.0 //fPointCamZSpeed = 0.0 BREAK CASE STAGE_SNIPE_GUARDS hotswapStage = MISSION_HOTSWAP_STAGE_SELECT_CHARACTER michaelTargetPed = NULL extractStage = EXTRACT_STAGE_KILL_INITIAL_GUARDS hangingHotswapState = HANGING_HOTSWAP_ON_FRANKLIN iDuckAnim = 0 iFlinchLeftAnim = 0 iFlinchRightAnim = 0 vShiftVectorSpeed = <<0.2,-0.08,0>> //vCurrentKickBackOffset = <<0,0,0>> vCurrentKickBackForce = <<0,0,0>> iGuardAttackTime = -1 iGuardReactionStage = -1 iReinforcementsEnterTime = -1 iPostKilledGuardsTime = 0 bAdvancedGuardAttackTime = FALSE bSelectedMichaelDuringExtract = FALSE bDoneExtractSpeech = FALSE //bDoneExtractHelp = FALSE bGuardsHeardSniper = FALSE bDoneGuardBeckon = FALSE bFrozenFranklin = FALSE //bRemovedGuardDialogue = FALSE bReactedToFirstShot = FALSE bAdditionalGuardsToShoot = FALSE bSwingingRight = TRUE bStartExtraction = FALSE bReattachedMichael = FALSE bSetSniperZoom = FALSE bDoneKill3GuardsCue = FALSE bPreparedChoppersApproachingCue = FALSE bDoneChoppersApproachingCue = FALSE bDoneDontShootSpeech = FALSE bGuardsAttackPrisoner = FALSE bGuardsStoppedShooting = FALSE bDoneCantGetShotSpeech = FALSE bDoneTroubleFlashHelp = FALSE bLastReinforcementIsLast = FALSE bDoneLastGuardEnter = FALSE bLastGuardToShoot = FALSE bLoadedExtractSpeech = FALSE bTurnedOffRadarForSuppressHud = FALSE bApplyOffsetToWinchRope = TRUE bStartPushIn = FALSE bDoneHitSound = FALSE REPEAT COUNT_OF(bCreatedAdditionalReinforcement) i bCreatedAdditionalReinforcement[i] = FALSE ENDREPEAT REPEAT COUNT_OF(bReinforcementToShoot) i bReinforcementToShoot[i] = FALSE ENDREPEAT REPEAT COUNT_OF(reinforcementPed) i iReinforcementShootWhileMovingStage[i] = 0 ENDREPEAT bActivatedRopeSwingFromSynced = FALSE bRopePhysical = FALSE fRopeAttachHeading = INIT_ROPE_ATTACH_HEADING fRopeTransitionPhase = 0.0 bDebugCanWinch = FALSE //fTempPhase = 0 BREAK CASE STAGE_CHOPPER_CHASE hotswapStage = MISSION_HOTSWAP_STAGE_SELECT_CHARACTER createFBIAtEndStage = CREATE_FBI_AT_END_STAGE_NOT_STARTED heliStrafeState = HELI_STRAFE_ATTACK michaelTargetPed = NULL michaelTargetVehicle = NULL franklinTargetVehicle = NULL hangingHotswapState = HANGING_HOTSWAP_ON_FRANKLIN // michaelReloadState = MICHAEL_RELOAD_HAS_AMMO bDoneGetOutSpeech = FALSE bStartedWinding = FALSE bStoppedWinding = FALSE bDoneDangleHelp = FALSE REPEAT NUMBER_ENEMY_CHOPPERS i bEnemyChopperShootersToAttack[i] = FALSE bEnemyChopperToAI[i] = FALSE bDoChopperSpinOut[i] = FALSE bDoneDestroyedChopperSpeech[i] = FALSE ENDREPEAT bShownChopperPrompt = FALSE bSpottedChopper = FALSE bDoneChopperChoiceSpeech = FALSE bUnpinnedInteriorForChase = FALSE bDoneTrevorFly = FALSE bDoneGoHomeSpeech = FALSE bDoneReattach = FALSE bDoneMakeMichaelMoreLethal = FALSE //bDoneFranklinDangerHelp = FALSE bDoneChopperAttackFranklinSpeech = FALSE bDoneFranklinReactToChopperSpeech = FALSE bDoneChopperLandSpeech = FALSE bDoneMichaelFightsChoppersCue = FALSE bDoneNoMoreThreatCue = FALSE bDoneRocketReactionSpeech = FALSE bTrevorCachedTarget = FALSE bDoneGotoSpeech = TRUE bChangedPriorityFromSniperToTrevor = FALSE bCuedFriendlyFireSpeech = FALSE bRocketsAccurate = FALSE bUnproofedChoppers = FALSE bCreatedExtraHeli = FALSE bShownSlowmoHelp = FALSE bFilledMichaelMeter = FALSE bTurnedOffRadarForSuppressHud = FALSE iWaitToKillCam = 4 //bAttachedBlock = FALSE iAllowGoHomeTime = -1 fSpinForce = 0.0 fCircleCentreMod = 2.0 fUpwardsForce = 16.0 fChopperAccuracy = 0.0 fHeliCircleAngle = 0.0 fBelowWaveHeightTime = 0.0 // fDrownTime = 0.0 iSpinModifier = 0 bAllowStartEscapeRoute = FALSE bStartedJourneyToLeaveHighRiseArea = FALSE bStartedRotateToLeaveHighRiseArea = FALSE bKnockedOff = FALSE bStartExtraction = FALSE bDonePanicSpeech = FALSE bDoneRealPanicSpeech = FALSE bDoneTrevorEncourageSpeech = FALSE bDoneLastOneSpeech = FALSE bDoneTrevorRemindFranklinSpeech = FALSE bDoneFranklinSayChopperDownSpeech = FALSE bDoneTrevorCongratulateFranklinSpeech = FALSE bDoneWeHitSpeech = FALSE bClearedAutopilot = FALSE bDoneFBITurnToFaceChopper = FALSE bDoneFBIWaveDownChopper = FALSE bDoLeadHeliFireRockets = FALSE iEnemyChopperSpeechStage = 0 iGetInTextStage = 2 iFranklinTargetPed = -1 iRecheckMichaelShootTime = 0 iTrevorEscapeRoutePoint = -1 iLeaveHighRiseAreaPoint = -1 //iFranklinDamageCount = 0 iMrKSpeechStage = 0 iLeadHeli = 1 iCreateExtraHeliTime = -1 iSlowmoHelpTime = -1 BREAK CASE STAGE_DROPOFF bDoneLandSpeech = FALSE bDoneLandAudioScene = FALSE bKilledSpeechForLand = FALSE bDoneGetOutSpeech = TRUE bDoneDangleHelp = TRUE bDoneForceTrevorLow = FALSE bSwitchedBackDuringDropoff = FALSE bRemovedEnemyChopper = FALSE //bAttachedBlock = FALSE bDoneFBIWaveDownChopper = FALSE bResetTimeForBelowHeight = FALSE bDoMichaelBoom = FALSE bTurnedOffRadarForSuppressHud = FALSE bChangedClothes = FALSE bDoneWayHomeSpeech = FALSE bDoneWayHomeSpeech2 = FALSE bDoneGetOffRoofSpeech = FALSE //bDoneKeepSniperSpeech = FALSE bDoneMissionCompleteCue = FALSE bTrevorGone = FALSE bDoneForceGetOutOfThereSpeech = FALSE bForceStartedChopper = FALSE iHeliFlyOffState = 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_FOOD_COURT RETURN CHAR_MICHAEL BREAK CASE STAGE_GET_TO_CHOPPER RETURN CHAR_MICHAEL BREAK CASE STAGE_GET_TO_BUILDING RETURN CHAR_TREVOR BREAK CASE STAGE_RAPPEL_DOWN RETURN CHAR_MICHAEL BREAK CASE STAGE_SNIPE_GUARDS RETURN CHAR_FRANKLIN BREAK CASE STAGE_CHOPPER_CHASE RETURN CHAR_FRANKLIN BREAK CASE STAGE_DROPOFF RETURN CHAR_TREVOR BREAK ENDSWITCH RETURN CHAR_FRANKLIN ENDFUNC // create a player vehicle for the mission PROC SNATCH_AND_GRAB_CREATE_VEHICLE(SNATCH_AND_GRAB_VEHICLE_ENUM sagVehicle, VECTOR vCreatePos, FLOAT fCreateRot, BOOL bKeepModel = TRUE, BOOL bKeepVehicle = TRUE, BOOL bMakeInvincible = FALSE, BOOL bSetHeliBladesOn = TRUE) IF NOT IS_VEHICLE_DRIVEABLE(snatchAndGrabVehicle[sagVehicle]) SNATCH_AND_GRAB_MODEL_ENUM vehicleModelEnum = GET_MODEL_ENUM_FOR_SNATCH_AND_GRAB_VEHICLE(sagVehicle) // if using a specific player vehicle IF sagVehicle = SAGV_MICHAEL_CAR IF NOT g_bMagDemoActive //CREATE_PLAYER_VEHICLE(snatchAndGrabVehicle[sagVehicle], CHAR_MICHAEL, vCreatePos, fCreateRot, FALSE) CREATE_NPC_VEHICLE(snatchAndGrabVehicle[sagVehicle], CHAR_DAVE, vCreatePos, fCreateRot, FALSE) ELSE IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) snatchAndGrabVehicle[sagVehicle] = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()) IF IS_VEHICLE_DRIVEABLE(snatchAndGrabVehicle[sagVehicle]) SET_ENTITY_AS_MISSION_ENTITY(snatchAndGrabVehicle[sagVehicle], TRUE, TRUE) PRINTSTRING("successfully got tailgater from switch!") PRINTNL() ELSE CREATE_PLAYER_VEHICLE(snatchAndGrabVehicle[sagVehicle], CHAR_MICHAEL, vCreatePos, fCreateRot, FALSE) PRINTSTRING("failed getting tailgater from switch!") PRINTNL() ENDIF ELSE IF bDebugSkipMagdemoStart CREATE_PLAYER_VEHICLE(snatchAndGrabVehicle[sagVehicle], CHAR_MICHAEL, <<1367.8052, -2028.5865, 51.0436>>, 205.2015, FALSE) ELSE CREATE_PLAYER_VEHICLE(snatchAndGrabVehicle[sagVehicle], CHAR_MICHAEL, vCreatePos, fCreateRot, FALSE) ENDIF ENDIF ENDIF ELIF sagVehicle = SAGV_FRANKLIN_BIKE IF NOT g_bMagDemoActive CREATE_PLAYER_VEHICLE(snatchAndGrabVehicle[sagVehicle], CHAR_FRANKLIN, vCreatePos, fCreateRot, FALSE, VEHICLE_TYPE_BIKE) FREEZE_ENTITY_POSITION(snatchAndGrabVehicle[sagVehicle], TRUE) ELSE snatchAndGrabVehicle[sagVehicle] = g_sMagDemoFBI2Entities.bikeVehicle IF IS_VEHICLE_DRIVEABLE(snatchAndGrabVehicle[sagVehicle]) SET_ENTITY_AS_MISSION_ENTITY(snatchAndGrabVehicle[sagVehicle], TRUE, TRUE) PRINTSTRING("successfully got bike from switch!") PRINTNL() ELSE CREATE_PLAYER_VEHICLE(snatchAndGrabVehicle[sagVehicle], CHAR_FRANKLIN, vCreatePos, fCreateRot, FALSE, VEHICLE_TYPE_BIKE) PRINTSTRING("failed getting bike from switch!") PRINTNL() ENDIF ENDIF ELIF sagVehicle = SAGV_PLAYER_CHOPPER IF NOT g_bMagDemoActive snatchAndGrabVehicle[sagVehicle] = CREATE_VEHICLE(GET_MODEL_FOR_SNATCH_AND_GRAB_MODEL_ENUM(vehicleModelEnum), vCreatePos, fCreateRot) ELSE snatchAndGrabVehicle[sagVehicle] = g_sMagDemoFBI2Entities.heliVehicle IF IS_VEHICLE_DRIVEABLE(snatchAndGrabVehicle[sagVehicle]) SET_ENTITY_AS_MISSION_ENTITY(snatchAndGrabVehicle[sagVehicle], TRUE, TRUE) PRINTSTRING("successfully got heli from switch!") PRINTNL() ELSE snatchAndGrabVehicle[sagVehicle] = CREATE_VEHICLE(GET_MODEL_FOR_SNATCH_AND_GRAB_MODEL_ENUM(vehicleModelEnum), vCreatePos, fCreateRot) PRINTSTRING("failed getting heli from switch!") PRINTNL() ENDIF ENDIF ELSE snatchAndGrabVehicle[sagVehicle] = CREATE_VEHICLE(GET_MODEL_FOR_SNATCH_AND_GRAB_MODEL_ENUM(vehicleModelEnum), vCreatePos, fCreateRot) ENDIF //IF NOT g_bMagDemoActive SET_VEHICLE_ON_GROUND_PROPERLY(snatchAndGrabVehicle[sagVehicle]) //ENDIF IF NOT bKeepModel CLEAR_MODEL_REQUEST(ENUM_TO_INT(vehicleModelEnum)) ENDIF IF bMakeInvincible SET_VEHICLE_CAN_BE_VISIBLY_DAMAGED(snatchAndGrabVehicle[sagVehicle], FALSE) SET_VEHICLE_CAN_BREAK(snatchAndGrabVehicle[sagVehicle], FALSE) SET_ENTITY_PROOFS(snatchAndGrabVehicle[sagVehicle], TRUE, TRUE, TRUE, TRUE, TRUE) ELSE SET_ENTITY_INVINCIBLE(snatchAndGrabVehicle[sagVehicle], FALSE) ENDIF SET_VEHICLE_CAN_LEAK_OIL(snatchAndGrabVehicle[sagVehicle], FALSE) SET_VEHICLE_CAN_LEAK_PETROL(snatchAndGrabVehicle[sagVehicle], FALSE) SET_DISABLE_VEHICLE_PETROL_TANK_FIRES(snatchAndGrabVehicle[sagVehicle], TRUE) SWITCH sagVehicle CASE SAGV_PLAYER_CHOPPER IF bSetHeliBladesOn SET_VEHICLE_ENGINE_ON(snatchAndGrabVehicle[sagVehicle], TRUE, TRUE) SET_HELI_BLADES_FULL_SPEED(snatchAndGrabVehicle[sagVehicle]) ENDIF //SET_VEHICLE_COLOUR_COMBINATION(snatchAndGrabVehicle[sagVehicle], 2) SET_VEHICLE_COLOURS(snatchAndGrabVehicle[sagVehicle], 34, 34) SET_VEHICLE_EXTRA_COLOURS(snatchAndGrabVehicle[sagVehicle], 0, 0) SET_ENTITY_CAN_BE_DAMAGED_BY_RELATIONSHIP_GROUP(snatchAndGrabVehicle[sagVehicle], FALSE, agencyRelGroup) SET_DOOR_ALLOWED_TO_BE_BROKEN_OFF(snatchAndGrabVehicle[sagVehicle], SC_DOOR_FRONT_LEFT, FALSE) SET_VEHICLE_ENGINE_CAN_DEGRADE(snatchAndGrabVehicle[sagVehicle], FALSE) SET_VEH_RADIO_STATION(snatchAndGrabVehicle[sagVehicle], GET_RADIO_STATION_NAME(ENUM_TO_INT(RADIO_GENRE_OFF))) //SET_ENTITY_ALWAYS_PRERENDER(snatchAndGrabVehicle[sagVehicle], TRUE) // temp? turn radio off //SET_VEHICLE_RADIO_ENABLED(snatchAndGrabVehicle[sagVehicle], FALSE) BREAK CASE SAGV_FRANKLIN_BIKE // SET_ENTITY_LOD_DIST(snatchAndGrabVehicle[sagVehicle], 1000) SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(snatchAndGrabVehicle[sagVehicle], FALSE) BREAK CASE SAGV_MICHAEL_CAR SET_VEH_RADIO_STATION(snatchAndGrabVehicle[sagVehicle], GET_RADIO_STATION_NAME(ENUM_TO_INT(RADIO_GENRE_CLASSIC_ROCK))) SET_DOOR_ALLOWED_TO_BE_BROKEN_OFF(snatchAndGrabVehicle[sagVehicle], SC_DOOR_FRONT_LEFT, FALSE) SET_VEHICLE_HAS_STRONG_AXLES(snatchAndGrabVehicle[sagVehicle], TRUE) //SET_VEHICLE_INDIVIDUAL_DOORS_LOCKED(snatchAndGrabVehicle[sagVehicle], ENUM_TO_INT(VS_FRONT_RIGHT), VEHICLELOCK_LOCKOUT_PLAYER_ONLY) //SET_VEHICLE_RADIO_ENABLED(snatchAndGrabVehicle[sagVehicle], FALSE) BREAK ENDSWITCH IF NOT bKeepVehicle SET_VEHICLE_AS_NO_LONGER_NEEDED(snatchAndGrabVehicle[sagVehicle]) ENDIF 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_CHOPPER SET_PED_COMP_ITEM_CURRENT_SP(ped, COMP_TYPE_OUTFIT, OUTFIT_P0_RAPPEL, FALSE) IF setStage <= STAGE_GET_TO_BUILDING // no mask OR setStage >= STAGE_CHOPPER_CHASE SET_PED_COMP_ITEM_CURRENT_SP(ped, COMP_TYPE_PROPS, PROPS_EYES_NONE, FALSE) ELSE // mask //SET_PED_PROP_INDEX(ped, ANCHOR_EYES, 2, 0) SET_PED_COMP_ITEM_CURRENT_SP(ped, COMP_TYPE_PROPS, PROPS_P0_EXTERMINATOR_MASK, FALSE) ENDIF // temp IF setStage = STAGE_GET_TO_BUILDING OR setStage >= STAGE_CHOPPER_CHASE //SET_PED_PROP_INDEX(ped, ANCHOR_HEAD, 3, 0) ELSE REMOVE_PED_HELMET(ped, TRUE) //CLEAR_PED_PROP(ped, ANCHOR_HEAD) ENDIF RELEASE_PED_PRELOAD_PROP_DATA(ped) ENDIF BREAK CASE CHAR_FRANKLIN SET_PED_COMP_ITEM_CURRENT_SP(ped, COMP_TYPE_OUTFIT, OUTFIT_P1_HOODIE_AND_JEANS_1, FALSE) // remember to change at dummy! BREAK CASE CHAR_TREVOR SET_PED_COMP_ITEM_CURRENT_SP(ped, COMP_TYPE_OUTFIT, OUTFIT_P2_TSHIRT_CARGOPANTS_2, FALSE) BREAK ENDSWITCH ENDIF ENDPROC // muffle heli sound indoors PROC MUFFLE_HELI_SOUND_INDOORS(BOOL bMuffle) IF bMuffle START_SNATCH_AND_GRAB_AUDIO_SCENE(SNATCH_AND_GRAB_AUDIO_SCENE_INDOOR) PLAY_SOUND_FRONTEND(iFaintHeliSoundID, "FBI_02_SNATCH_AND_GRAB_AMB_HELI") ELSE STOP_SNATCH_AND_GRAB_AUDIO_SCENE(SNATCH_AND_GRAB_AUDIO_SCENE_INDOOR) STOP_SOUND(iFaintHeliSoundID) ENDIF ENDPROC // michael sit in chopper PROC DO_MICHAEL_SIT_IN_CHOPPER() IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL]) // TASK_PLAY_ANIM(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], "VEH@STD@PS@BASE", "sit", INSTANT_BLEND_IN, INSTANT_BLEND_OUT, -1, AF_LOOPING) 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_PED_CONFIG_FLAG(ped, PCF_WillFlyThroughWindscreen, FALSE) SET_PED_CONFIG_FLAG(ped, PCF_DisableExplosionReactions, TRUE) SET_PED_CONFIG_FLAG(ped, PCF_RunFromFiresAndExplosions, FALSE) SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(ped, TRUE) SET_ENTITY_AS_MISSION_ENTITY(ped, TRUE, TRUE) ENDPROC // create player character PROC SNATCH_AND_GRAB_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 WHILE NOT(CREATE_PLAYER_PED_INSIDE_VEHICLE(sSelectorPeds.pedID[selectorSlot], createChar, veh, seat, FALSE)) WAIT(0) ENDWHILE ELSE // create on foot WHILE NOT(CREATE_PLAYER_PED_ON_FOOT(sSelectorPeds.pedID[selectorSlot], createChar, vPos, fRot, FALSE)) WAIT(0) ENDWHILE ENDIF ENDIF IF NOT IS_PED_INJURED(sSelectorPeds.pedID[selectorSlot]) APPLY_PLAYER_ATTRIBUTES(sSelectorPeds.pedID[selectorSlot]) SWITCH createChar CASE CHAR_FRANKLIN SET_PED_HELMET(sSelectorPeds.pedID[selectorSlot], FALSE) ADD_PED_FOR_DIALOGUE(snatchAndGrabConversation, 2, sSelectorPeds.pedID[selectorSlot], "FRANKLIN") BREAK CASE CHAR_MICHAEL // passenger index 1 SET_PED_GROUP_MEMBER_PASSENGER_INDEX(sSelectorPeds.pedID[selectorSlot], VS_BACK_LEFT) SET_PED_GET_OUT_UPSIDE_DOWN_VEHICLE(sSelectorPeds.pedID[selectorSlot], FALSE) IF setStage = STAGE_GET_TO_BUILDING DO_MICHAEL_SIT_IN_CHOPPER() ENDIF ADD_PED_FOR_DIALOGUE(snatchAndGrabConversation, 0, sSelectorPeds.pedID[selectorSlot], "MICHAEL") BREAK CASE CHAR_TREVOR ADD_PED_FOR_DIALOGUE(snatchAndGrabConversation, 1, sSelectorPeds.pedID[selectorSlot], "TREVOR") BREAK ENDSWITCH SETUP_PLAYER_CHARACTER_WITH_MISSION_VARIATIONS(sSelectorPeds.pedID[selectorSlot], createChar, setStage) ENDIF ENDPROC // set player in vehicle if not already in PROC SET_PLAYER_PED_INTO_SNATCH_AND_GRAB_VEHICLE(SNATCH_AND_GRAB_VEHICLE_ENUM sagVehicle, VEHICLE_SEAT seat, BOOL bKeepVehicle = TRUE) IF NOT IS_PED_INJURED(PLAYER_PED_ID()) IF IS_VEHICLE_DRIVEABLE(snatchAndGrabVehicle[sagVehicle]) IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), snatchAndGrabVehicle[sagVehicle]) SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), snatchAndGrabVehicle[sagVehicle], seat) IF NOT bKeepVehicle SET_VEHICLE_AS_NO_LONGER_NEEDED(snatchAndGrabVehicle[sagVehicle]) 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) VECTOR vCreatePos FLOAT fCreateRot // create transport SWITCH setStage CASE STAGE_GET_TO_CHOPPER SNATCH_AND_GRAB_CREATE_VEHICLE(SAGV_MICHAEL_CAR, GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_MICHAEL_CAR_INIT), MICHAEL_CAR_INIT_ROT) // SNATCH_AND_GRAB_CREATE_VEHICLE(SAGV_TREVOR_JEEP, GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_JEEP_INIT), JEEP_INIT_ROT) BREAK CASE STAGE_GET_TO_BUILDING IF NOT bForcePassOnShitskip vCreatePos = GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_CHOPPER_INIT) fCreateRot = CHOPPER_INIT_ROT ELSE vCreatePos = GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_HOVER_TARGET) fCreateRot = CHOPPER_HOVER_ROT ENDIF SNATCH_AND_GRAB_CREATE_VEHICLE(SAGV_PLAYER_CHOPPER, vCreatePos, fCreateRot, TRUE, TRUE, FALSE, FALSE) // SNATCH_AND_GRAB_CREATE_VEHICLE(SAGV_TREVOR_JEEP, GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_TREVOR_INIT), TREVOR_INIT_ROT) BREAK CASE STAGE_RAPPEL_DOWN SNATCH_AND_GRAB_CREATE_VEHICLE(SAGV_PLAYER_CHOPPER, GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_CHOPPER_HOVER), CHOPPER_HOVER_ROT) BREAK CASE STAGE_SNIPE_GUARDS SNATCH_AND_GRAB_CREATE_VEHICLE(SAGV_PLAYER_CHOPPER, GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_CHOPPER_HOVER), CHOPPER_HOVER_ROT) BREAK CASE STAGE_CHOPPER_CHASE SNATCH_AND_GRAB_CREATE_VEHICLE(SAGV_PLAYER_CHOPPER, GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_CHOPPER_HOVER), CHOPPER_HOVER_ROT) // SNATCH_AND_GRAB_CREATE_VEHICLE(SAGV_TREVOR_JEEP, GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_TREVOR_INIT), TREVOR_INIT_ROT) BREAK CASE STAGE_DROPOFF IF NOT bForcePassOnShitskip vCreatePos = GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_CHASE_END) fCreateRot = CHOPPER_CHASE_END_ROT ELSE vCreatePos = GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_DROPOFF) fCreateRot = -124 ENDIF SNATCH_AND_GRAB_CREATE_VEHICLE(SAGV_PLAYER_CHOPPER, vCreatePos, fCreateRot) // SNATCH_AND_GRAB_CREATE_VEHICLE(SAGV_TREVOR_JEEP, GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_TREVOR_INIT), TREVOR_INIT_ROT) BREAK ENDSWITCH // create the player characters SWITCH setStage CASE STAGE_GET_TO_CHOPPER BREAK CASE STAGE_GET_TO_BUILDING // michael SNATCH_AND_GRAB_CREATE_PLAYER_CHARACTER(CHAR_MICHAEL, setStage, <<0,0,0>>, 0.0, snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], VS_BACK_LEFT) // trevor //SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) BREAK CASE STAGE_RAPPEL_DOWN // trevor SNATCH_AND_GRAB_CREATE_PLAYER_CHARACTER(CHAR_TREVOR, setStage, <<0,0,0>>, 0.0, snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], VS_DRIVER) BREAK CASE STAGE_SNIPE_GUARDS // trevor SNATCH_AND_GRAB_CREATE_PLAYER_CHARACTER(CHAR_TREVOR, setStage, <<0,0,0>>, 0.0, snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], VS_DRIVER) // michael SNATCH_AND_GRAB_CREATE_PLAYER_CHARACTER(CHAR_MICHAEL, setStage, GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_BREAK_IN), BREAK_IN_ROT) // franklin //SET_ENTITY_COORDS(PLAYER_PED_ID(), GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_BEHIND_SNIPER)) //SET_ENTITY_HEADING(PLAYER_PED_ID(), FRANKLIN_SNIPER_ROT) //FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), TRUE) BREAK CASE STAGE_CHOPPER_CHASE // trevor SNATCH_AND_GRAB_CREATE_PLAYER_CHARACTER(CHAR_TREVOR, setStage, <<0,0,0>>, 0.0, snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], VS_DRIVER) // michael SNATCH_AND_GRAB_CREATE_PLAYER_CHARACTER(CHAR_MICHAEL, setStage, <<0,0,0>>, 0.0, snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], VS_BACK_LEFT) // franklin //SET_ENTITY_COORDS(PLAYER_PED_ID(), <<-139.47, -594.88, 210.77>>) //SET_ENTITY_HEADING(PLAYER_PED_ID(), FRANKLIN_SNIPER_ROT) BREAK CASE STAGE_DROPOFF // trevor //SET_PLAYER_PED_INTO_SNATCH_AND_GRAB_VEHICLE(SAGV_PLAYER_CHOPPER, VS_DRIVER) // michael SNATCH_AND_GRAB_CREATE_PLAYER_CHARACTER(CHAR_MICHAEL, setStage, <<0,0,0>>, 0.0, snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], VS_BACK_LEFT) BREAK ENDSWITCH ENDPROC // set dave at the car PROC SET_DAVE_AT_CAR() IF NOT IS_PED_INJURED(davePed) CLEAR_PED_TASKS_IMMEDIATELY(davePed) SET_ENTITY_COORDS(davePed, GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_DAVE_INIT)) SET_ENTITY_HEADING(davePed, DAVE_INIT_ROT) // FORCE_PED_MOTION_STATE(davePed, MS_ON_FOOT_IDLE, TRUE, FAUS_CUTSCENE_EXIT) ENDIF ENDPROC // create dave PROC CREATE_DAVE(BOOL bWait) IF IS_PED_INJURED(davePed) IF NOT g_bMagDemoActive CREATE_NPC_PED_ON_FOOT(davePed, CHAR_DAVE, GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_DAVE_INIT2), DAVE_INIT_ROT2, FALSE) ELSE /* IF IS_VEHICLE_DRIVEABLE(snatchAndGrabVehicle[SAGV_MICHAEL_CAR]) davePed = GET_PED_IN_VEHICLE_SEAT(snatchAndGrabVehicle[SAGV_MICHAEL_CAR], VS_FRONT_RIGHT) IF NOT IS_PED_INJURED(davePed) SET_ENTITY_AS_MISSION_ENTITY(davePed, TRUE, TRUE) CLEAR_PED_TASKS(davePed) PRINTSTRING("successfully got dave from switch!") PRINTNL() ELSE PRINTSTRING("failed getting dave from switch!") PRINTNL() IF bDebugSkipMagdemoStart CREATE_NPC_PED_INSIDE_VEHICLE(davePed, CHAR_DAVE, snatchAndGrabVehicle[SAGV_MICHAEL_CAR], VS_FRONT_RIGHT, FALSE) ELSE CREATE_NPC_PED_ON_FOOT(davePed, CHAR_DAVE, GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_DAVE_INIT), DAVE_INIT_ROT, FALSE) ENDIF ENDIF ELSE CREATE_NPC_PED_ON_FOOT(davePed, CHAR_DAVE, GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_DAVE_INIT), DAVE_INIT_ROT, FALSE) ENDIF */ ENDIF ENDIF IF NOT IS_PED_INJURED(davePed) //SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(davePed, TRUE) SET_PED_DIES_WHEN_INJURED(davePed, TRUE) SET_PED_KEEP_TASK(davePed, TRUE) SET_PED_GROUP_MEMBER_PASSENGER_INDEX(davePed, VS_FRONT_RIGHT) SET_PED_CONFIG_FLAG(davePed, PCF_WillFlyThroughWindscreen, FALSE) SET_PED_CONFIG_FLAG(davePed, PCF_DontAllowToBeDraggedOutOfVehicle, TRUE) SET_PED_CONFIG_FLAG(davePed, PCF_RunFromFiresAndExplosions, FALSE) SET_PED_CONFIG_FLAG(davePed, PCF_ForcedToUseSpecificGroupSeatIndex, TRUE) SET_PED_CONFIG_FLAG(davePed, PCF_ForceIgnoreMeleeActiveCombatant, TRUE) SET_PED_CONFIG_FLAG(davePed, PCF_LawWillOnlyAttackIfPlayerIsWanted, TRUE) SET_PED_GET_OUT_UPSIDE_DOWN_VEHICLE(davePed, FALSE) SET_PED_RELATIONSHIP_GROUP_HASH(davePed, RELGROUPHASH_PLAYER) SET_PED_CAN_BE_TARGETTED(davePed, FALSE) SET_ENTITY_PROOFS(davePed, FALSE, FALSE, FALSE, FALSE, FALSE) ADD_PED_FOR_DIALOGUE(snatchAndGrabConversation, 4, davePed, "DAVE") ENDIF IF bWait BOOL bFullyStreamed = FALSE WHILE NOT bFullyStreamed WAIT(0) IF NOT IS_PED_INJURED(davePed) IF HAVE_ALL_STREAMING_REQUESTS_COMPLETED(davePed) bFullyStreamed = TRUE ENDIF ELSE bFullyStreamed = TRUE ENDIF ENDWHILE ENDIF bDaveSeated = FALSE ENDPROC PROC CREATE_COFFEE() INT i VECTOR vCoffeePos FLOAT fCoffeeRot REPEAT 3 i SWITCH i CASE 0 vCoffeePos = <<148.2658, -677.0385, 41.9132>> fCoffeeRot = 0 BREAK CASE 1 vCoffeePos = <<148.0695, -677.3365, 41.9132>> fCoffeeRot = 179.9 BREAK CASE 2 vCoffeePos = <<148.5073, -677.2362, 41.9132>> fCoffeeRot = 115.18 BREAK ENDSWITCH IF NOT DOES_ENTITY_EXIST(coffeeObject[i]) coffeeObject[i] = CREATE_OBJECT_NO_OFFSET(P_ING_COFFEECUP_01, vCoffeePos) ELSE SET_ENTITY_COORDS_NO_OFFSET(coffeeObject[i], vCoffeePos) ENDIF FREEZE_ENTITY_POSITION(coffeeObject[i], TRUE) SET_ENTITY_HEADING(coffeeObject[i], fCoffeeRot) ENDREPEAT ENDPROC // create steve and andreas PROC CREATE_STEVE_AND_ANDREAS(BOOL bWait) IF NOT DOES_ENTITY_EXIST(stevePed) CREATE_NPC_PED_ON_FOOT(stevePed, CHAR_STEVE, <<156.89864, -672.97455, 41.02924>>, 0, FALSE) ENDIF IF NOT DOES_ENTITY_EXIST(andreasPed) CREATE_NPC_PED_ON_FOOT(andreasPed, CHAR_ANDREAS, <<159.77484, -678.42975, 41.02924>>, 0, FALSE) ENDIF IF NOT IS_PED_INJURED(stevePed) SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(stevePed, TRUE) SET_PED_DIES_WHEN_INJURED(stevePed, TRUE) SET_PED_KEEP_TASK(stevePed, TRUE) SET_PED_CONFIG_FLAG(stevePed, PCF_RunFromFiresAndExplosions, FALSE) SET_PED_CONFIG_FLAG(stevePed, PCF_DisableExplosionReactions, TRUE) SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(stevePed, TRUE) SET_PED_RELATIONSHIP_GROUP_HASH(stevePed, RELGROUPHASH_PLAYER) SET_PED_CAN_BE_TARGETTED(stevePed, FALSE) ADD_PED_FOR_DIALOGUE(snatchAndGrabConversation, 5, stevePed, "Steve") bSteveSeated = FALSE ENDIF IF NOT IS_PED_INJURED(andreasPed) SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(andreasPed, TRUE) SET_PED_DIES_WHEN_INJURED(andreasPed, TRUE) SET_PED_KEEP_TASK(andreasPed, TRUE) SET_PED_CONFIG_FLAG(andreasPed, PCF_RunFromFiresAndExplosions, FALSE) SET_PED_CONFIG_FLAG(andreasPed, PCF_DisableExplosionReactions, TRUE) SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(andreasPed, TRUE) SET_PED_RELATIONSHIP_GROUP_HASH(andreasPed, RELGROUPHASH_PLAYER) SET_PED_CAN_BE_TARGETTED(andreasPed, FALSE) ADD_PED_FOR_DIALOGUE(snatchAndGrabConversation, 6, andreasPed, "Andreas") bAndreasSeated = FALSE ENDIF IF bWait BOOL bFullyStreamed = FALSE WHILE NOT bFullyStreamed WAIT(0) IF NOT IS_PED_INJURED(stevePed) AND NOT IS_PED_INJURED(andreasPed) IF HAVE_ALL_STREAMING_REQUESTS_COMPLETED(stevePed) AND HAVE_ALL_STREAMING_REQUESTS_COMPLETED(andreasPed) bFullyStreamed = TRUE ENDIF ELSE bFullyStreamed = TRUE ENDIF ENDWHILE ENDIF ENDPROC // create the fbi PROC CREATE_FBI_FOR_STAGE(MISSION_STAGE_ENUM createStage) INT i SNATCH_AND_GRAB_MODEL_ENUM thisModel INT iHead INT iHeadTexture INT iTorsoTexture INT iLegTexture VECTOR vPos FLOAT fRot iHead=iHead iHeadTexture=iHeadTexture iTorsoTexture=iTorsoTexture iLegTexture=iLegTexture IF createStage = STAGE_GET_TO_CHOPPER thisModel = SAGM_FBI ELSE thisModel = SAGM_FBIEND ENDIF // fbi van IF createStage >= STAGE_CHOPPER_CHASE fbiVanVehicle = CREATE_VEHICLE(GET_MODEL_FOR_SNATCH_AND_GRAB_MODEL_ENUM(SAGM_FBI_VAN), <<1386.65, -2064.32, 51.08>>, -14.9) SET_VEHICLE_ON_GROUND_PROPERLY(fbiVanVehicle) SET_VEHICLE_COLOUR_COMBINATION(fbiVanVehicle, 0) SET_VEHICLE_DIRT_LEVEL(fbiVanVehicle, 0.2) SET_VEHICLE_LIVERY(fbiVanVehicle, 0) SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(fbiVanVehicle, TRUE) SET_VEHICLE_DOORS_LOCKED(fbiVanVehicle, VEHICLELOCK_LOCKOUT_PLAYER_ONLY) SET_DOOR_ALLOWED_TO_BE_BROKEN_OFF(fbiVanVehicle, SC_DOOR_REAR_LEFT, FALSE) SET_DOOR_ALLOWED_TO_BE_BROKEN_OFF(fbiVanVehicle, SC_DOOR_REAR_RIGHT, FALSE) FOR i=1 TO 8 SET_VEHICLE_EXTRA(fbiVanVehicle, i, TRUE) ENDFOR ENDIF IF NOT g_bMagDemoActive OR bDebugSkipMagdemoZskipped OR createStage >= STAGE_CHOPPER_CHASE // fbi peds INT iNumber IF createStage = STAGE_GET_TO_CHOPPER iNumber = 1 ELSE iNumber = 2 ENDIF REPEAT iNumber i // get create attributes SWITCH i CASE 0 IF createStage = STAGE_GET_TO_CHOPPER vPos = <<1372.20, -2073.76, 51.12>> fRot = -38.38 ELSE vPos = <<1384.95251, -2062.89404, 50.99809>> fRot = 79.0 ENDIF iHead = 1 iHeadTexture = 0 iTorsoTexture = 2 iLegTexture = 2 BREAK CASE 1 IF createStage = STAGE_GET_TO_CHOPPER vPos = <<1361.57, -2075.04, 51.00>> fRot = -55.99 ELSE vPos = <<1381.77979, -2066.46875, 50.99809>> fRot = 68.6 ENDIF iHead = 0 iHeadTexture = 1 iTorsoTexture = 1 iLegTexture = 1 BREAK ENDSWITCH fbiPed[i] = CREATE_PED(PEDTYPE_MISSION, GET_MODEL_FOR_SNATCH_AND_GRAB_MODEL_ENUM(thisModel), vPos, fRot) IF createStage >= STAGE_CHOPPER_CHASE SET_PED_COMPONENT_VARIATION(fbiPed[i], PED_COMP_HEAD, iHead, iHeadTexture) SET_PED_COMPONENT_VARIATION(fbiPed[i], PED_COMP_TORSO, 0, iTorsoTexture) SET_PED_COMPONENT_VARIATION(fbiPed[i], PED_COMP_LEG, 0, iLegTexture) SET_PED_CONFIG_FLAG(fbiPed[i], PCF_DisableShockingEvents, TRUE) SET_PED_CONFIG_FLAG(fbiPed[i], PCF_DisableShockingDrivingOnPavementEvents, TRUE) ELSE SET_ENTITY_LOD_DIST(fbiPed[i], 200) ENDIF GIVE_WEAPON_TO_PED(fbiPed[i], GET_SNATCH_AND_GRAB_WEAPON_TYPE(SAG_WEAPON_CIA_PISTOL), INFINITE_AMMO, FALSE) SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(fbiPed[i], TRUE) SET_PED_CAN_BE_TARGETTED(fbiPed[i], FALSE) SET_PED_RELATIONSHIP_GROUP_HASH(fbiPed[i], RELGROUPHASH_PLAYER) SET_PED_KEEP_TASK(fbiPed[i], TRUE) SET_PED_DIES_WHEN_INJURED(fbiPed[i], TRUE) SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(fbiPed[i], TRUE) ENDREPEAT ELSE fbiPed[0] = g_sMagDemoFBI2Entities.fibPed IF NOT IS_PED_INJURED(fbiPed[0]) PRINTSTRING("successfully got agent from switch!") PRINTNL() SET_ENTITY_AS_MISSION_ENTITY(fbiPed[0], TRUE, TRUE) SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(fbiPed[0], TRUE) SET_PED_KEEP_TASK(fbiPed[0], TRUE) SET_PED_DIES_WHEN_INJURED(fbiPed[0], TRUE) SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(fbiPed[0], TRUE) ELSE PRINTSTRING("failed getting agent from switch!") PRINTNL() ENDIF ENDIF ENDPROC // create FBI meeting PROC CREATE_FBI_MEETING_VEHICLES() SNATCH_AND_GRAB_CREATE_VEHICLE(SAGV_PLAYER_CHOPPER, GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_CHOPPER_INIT), CHOPPER_INIT_ROT, TRUE, TRUE, FALSE, FALSE) SNATCH_AND_GRAB_CREATE_VEHICLE(SAGV_FRANKLIN_BIKE, GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_BIKE_INIT), BIKE_INIT_ROT) SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], TRUE) SET_VEHICLE_DOORS_LOCKED(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], VEHICLELOCK_LOCKOUT_PLAYER_ONLY) ENDPROC PROC CREATE_FBI_MEETING_PEDS() CREATE_FBI_FOR_STAGE(STAGE_GET_TO_CHOPPER) SNATCH_AND_GRAB_CREATE_PLAYER_CHARACTER(CHAR_TREVOR, STAGE_GET_TO_CHOPPER, GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_TREVOR_INIT), TREVOR_INIT_ROT) SNATCH_AND_GRAB_CREATE_PLAYER_CHARACTER(CHAR_FRANKLIN, STAGE_GET_TO_CHOPPER, <<1374.30, -2076.91, 51.00>>, 0) ENDPROC PROC CREATE_UTIL_TRUCKS(MISSION_STAGE_ENUM createStage) VECTOR vPos FLOAT fRot FLOAT fDirt SNATCH_AND_GRAB_MODEL_ENUM model INT i, j INT iCountTo IF createStage = STAGE_GET_TO_CHOPPER iCountTo = 2 ELSE iCountTo = 1 ENDIF FOR i=0 TO iCountTo SWITCH i CASE 0 model = SAGM_UTIL_TRUCK_2 vPos = <<1390.31, -2050.63, 51.00>> fRot = 74.2 fDirt = 0.19 BREAK CASE 1 model = SAGM_UTIL_TRUCK_1 vPos = <<1400.29, -2053.63, 51.00>> fRot = 166.8 fDirt = 0.37 BREAK CASE 2 model = SAGM_FBI_CAR vPos = <<1365.29, -2065.67, 51.00>> fRot = -83.30 fDirt = 0.0 BREAK ENDSWITCH IF g_bMagDemoActive SWITCH i CASE 0 utilTruckVehicle[i] = g_sMagDemoFBI2Entities.truck01Vehicle BREAK CASE 1 utilTruckVehicle[i] = g_sMagDemoFBI2Entities.truck02Vehicle BREAK CASE 2 utilTruckVehicle[i] = g_sMagDemoFBI2Entities.fibVehicle BREAK ENDSWITCH IF IS_VEHICLE_DRIVEABLE(utilTruckVehicle[i]) PRINTSTRING("successfully got vehicle from switch! ") PRINTINT(i) PRINTNL() SET_ENTITY_AS_MISSION_ENTITY(utilTruckVehicle[i], TRUE, TRUE) SET_ENTITY_INVINCIBLE(utilTruckVehicle[i], FALSE) ELSE PRINTSTRING("failed getting vehicle from switch! ") PRINTINT(i) PRINTNL() ENDIF ELSE utilTruckVehicle[i] = CREATE_VEHICLE(GET_MODEL_FOR_SNATCH_AND_GRAB_MODEL_ENUM(model), vPos, fRot) SET_VEHICLE_ON_GROUND_PROPERLY(utilTruckVehicle[i]) SET_VEHICLE_DIRT_LEVEL(utilTruckVehicle[i], fDirt) SET_VEHICLE_DOORS_LOCKED(utilTruckVehicle[i], VEHICLELOCK_LOCKED) SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(utilTruckVehicle[i], TRUE) FOR j=1 TO 8 SET_VEHICLE_EXTRA(utilTruckVehicle[i], j, TRUE) ENDFOR IF i=1 SET_VEHICLE_EXTRA(utilTruckVehicle[i], 3, FALSE) ELIF i=0 SET_VEHICLE_EXTRA(utilTruckVehicle[i], 1, FALSE) SET_VEHICLE_EXTRA(utilTruckVehicle[i], 3, FALSE) ENDIF ENDIF ENDFOR ENDPROC // cleanup a ped PROC CLEANUP_PED(PED_INDEX entity, BOOL bDelete) IF DOES_ENTITY_EXIST(entity) IF NOT bDelete SET_PED_AS_NO_LONGER_NEEDED(entity) ELSE DELETE_PED(entity) ENDIF ENDIF ENDPROC // cleanup a vehicle PROC CLEANUP_VEHICLE(VEHICLE_INDEX entity, BOOL bDelete) IF DOES_ENTITY_EXIST(entity) IF NOT bDelete SET_VEHICLE_AS_NO_LONGER_NEEDED(entity) ELSE DELETE_VEHICLE(entity) ENDIF ENDIF ENDPROC // cleanup FBI PROC CLEANUP_FBI(BOOL bDelete = FALSE) INT i // peds REPEAT NUMBER_FBI_AGENTS i CLEANUP_PED(fbiPed[i], bDelete) ENDREPEAT // van CLEANUP_VEHICLE(fbiVanVehicle, bDelete) CLEAR_MODEL_REQUEST(ENUM_TO_INT(SAGM_FBI)) CLEAR_MODEL_REQUEST(ENUM_TO_INT(SAGM_FBIEND)) CLEAR_MODEL_REQUEST(ENUM_TO_INT(SAGM_FBI_VAN)) ENDPROC // cleanup dave PROC CLEANUP_DAVE(BOOL bDelete = FALSE) CLEANUP_PED(davePed, bDelete) CLEANUP_VEHICLE(snatchAndGrabVehicle[SAGV_MICHAEL_CAR], bDelete) REMOVE_PED_FOR_DIALOGUE(snatchAndGrabConversation, 4) CLEAR_MODEL_REQUEST(ENUM_TO_INT(SAGM_DAVE)) ENDPROC // create the prisoner PROC CREATE_PRISONER_FOR_STAGE(MISSION_STAGE_ENUM createStage) IF NOT DOES_ENTITY_EXIST(prisonerPed) VECTOR vPos FLOAT fRot SWITCH createStage CASE STAGE_RAPPEL_DOWN CASE STAGE_SNIPE_GUARDS CASE STAGE_CHOPPER_CHASE CASE STAGE_DROPOFF vPos = GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_PRISONER_INIT) fRot = PRISONER_INIT_ROT BREAK ENDSWITCH SNATCH_AND_GRAB_MODEL_ENUM modelEnum IF createStage = STAGE_RAPPEL_DOWN modelEnum = SAGM_PRISONER_HIGH ELSE modelEnum = SAGM_PRISONER_LOW ENDIF prisonerPed = CREATE_PED(PEDTYPE_MISSION, GET_MODEL_FOR_SNATCH_AND_GRAB_MODEL_ENUM(modelEnum), vPos, fRot) SET_PED_COMPONENT_VARIATION(prisonerPed, PED_COMP_HEAD, 0, 0) SET_PED_COMPONENT_VARIATION(prisonerPed, PED_COMP_BERD, 0, 0) SET_PED_COMPONENT_VARIATION(prisonerPed, PED_COMP_TORSO, 0, 0) SET_PED_COMPONENT_VARIATION(prisonerPed, PED_COMP_FEET, 0, 0) SET_PED_COMPONENT_VARIATION(prisonerPed, PED_COMP_TEETH, 0, 0) IF createStage = STAGE_SNIPE_GUARDS SET_PED_COMPONENT_VARIATION(prisonerPed, PED_COMP_SPECIAL, 1, 0) ELSE SET_PED_COMPONENT_VARIATION(prisonerPed, PED_COMP_SPECIAL, 0, 0) ENDIF SET_PED_COMPONENT_VARIATION(prisonerPed, PED_COMP_SPECIAL2, 0, 0) SET_PED_COMPONENT_VARIATION(prisonerPed, PED_COMP_DECL, 0, 0) SET_PED_COMPONENT_VARIATION(prisonerPed, PED_COMP_JBIB, 0, 0) SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(prisonerPed, TRUE) SET_PED_RELATIONSHIP_GROUP_HASH(prisonerPed, RELGROUPHASH_PLAYER) //IF g_bMagDemoActive // SET_ENTITY_CAN_BE_DAMAGED_BY_RELATIONSHIP_GROUP(prisonerPed, FALSE, RELGROUPHASH_PLAYER) //ENDIF SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(prisonerPed, TRUE) // magdemo only SET_PED_CAN_BE_TARGETTED(prisonerPed, FALSE) SET_PED_CONFIG_FLAG(prisonerPed, PCF_DisableExplosionReactions, TRUE) SET_PED_CONFIG_FLAG(prisonerPed, PCF_RunFromFiresAndExplosions, FALSE) SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(prisonerPed, TRUE) SET_PED_KEEP_TASK(prisonerPed, TRUE) SET_PED_DIES_WHEN_INJURED(prisonerPed, TRUE) SET_ENTITY_LOAD_COLLISION_FLAG(prisonerPed, TRUE) IF createStage >= STAGE_SNIPE_GUARDS SET_PED_PRELOAD_VARIATION_DATA(prisonerPed, PED_COMP_SPECIAL, 2, 0) ELSE SET_PED_PRELOAD_VARIATION_DATA(prisonerPed, PED_COMP_SPECIAL, 1, 0) ENDIF ADD_PED_FOR_DIALOGUE(snatchAndGrabConversation, 3, prisonerPed, "MisterK") ENDIF ENDPROC // setup prisoner with belt PROC SETUP_PRISONER_WITH_BELT(BOOL bWait, MISSION_STAGE_ENUM setStage) IF NOT IS_PED_INJURED(prisonerPed) IF setStage >= STAGE_SNIPE_GUARDS SET_PED_COMPONENT_VARIATION(prisonerPed, PED_COMP_SPECIAL, 1, 0) ELSE SET_PED_COMPONENT_VARIATION(prisonerPed, PED_COMP_SPECIAL, 1, 0) ENDIF IF bWait BOOL bFullyStreamed = FALSE WHILE NOT bFullyStreamed WAIT(0) IF NOT IS_PED_INJURED(prisonerPed) IF HAVE_ALL_STREAMING_REQUESTS_COMPLETED(prisonerPed) bFullyStreamed = TRUE ENDIF ELSE bFullyStreamed = TRUE ENDIF ENDWHILE ENDIF ENDIF ENDPROC // belt off PROC TAKE_OFF_PRISONER_BELT IF NOT IS_PED_INJURED(prisonerPed) SET_PED_COMPONENT_VARIATION(prisonerPed, PED_COMP_SPECIAL, 0, 0) ENDIF ENDPROC // create michelle PROC CREATE_MICHELLE_FOR_STAGE(MISSION_STAGE_ENUM createStage) createstage = createstage IF NOT DOES_ENTITY_EXIST(michellePed) VECTOR vPos = GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_MICHELLE_INIT) FLOAT fRot = MICHELLE_INIT_ROT michellePed = CREATE_PED(PEDTYPE_MISSION, GET_MODEL_FOR_SNATCH_AND_GRAB_MODEL_ENUM(SAGM_MICHELLE), vPos, fRot) SET_PED_COMPONENT_VARIATION(michellePed,PED_COMP_HAIR,1,0) SET_PED_COMPONENT_VARIATION(michellePed,PED_COMP_HEAD,0,0) SET_PED_COMPONENT_VARIATION(michellePed,PED_COMP_TORSO,0,0) SET_PED_COMPONENT_VARIATION(michellePed,PED_COMP_LEG,0,0) ADD_PED_FOR_DIALOGUE(snatchAndGrabConversation, 6, michellePed, "MICHELLE") torchObject = CREATE_OBJECT(GET_MODEL_FOR_SNATCH_AND_GRAB_MODEL_ENUM(SAGM_TORCH), <<1,2,3>>) ATTACH_ENTITY_TO_ENTITY(torchObject, michellePed, GET_PED_BONE_INDEX(michellePed, BONETAG_PH_R_HAND), <<0, 0, 0>>, <<0, 0, 0>>) SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(michellePed, TRUE) SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(michellePed, TRUE) SET_PED_CAN_BE_TARGETTED(michellePed, FALSE) SET_PED_KEEP_TASK(michellePed, TRUE) ENDIF ENDPROC FUNC VECTOR GET_ENEMY_CHOPPER_POS(INT i) SWITCH i CASE 0 RETURN <<-429, -507, 322>> BREAK CASE 1 RETURN <<-402, -794, 219>> BREAK CASE 2 RETURN <<83, -1025, 316>> BREAK CASE 3 RETURN <<336, -527, 338>> BREAK CASE 4 RETURN <<-20, -402, 257>> BREAK CASE 5 RETURN <<-84, -689, 211>> BREAK CASE 6 RETURN <<44, -1170, 106>> BREAK CASE 7 RETURN <<-390, -1085, 160>> BREAK CASE 8 RETURN <<-33, -518, 230>> BREAK CASE 9 RETURN <<39, -801, 177>> BREAK ENDSWITCH RETURN <<-429, -507, 322>> ENDFUNC // create enemy chopper PROC CREATE_ENEMY_CHOPPER(BOOL bInCutscene, BOOL bExtra = FALSE) INT i BOOL bDontCreate = FALSE INT iStart INT iEnd IF NOT bExtra iStart = 0 iEnd = 2 ELSE iStart = 3 iEnd = 3 ENDIF FOR i=iStart TO iEnd VECTOR vPos FLOAT fRot INT iRec FLOAT fSkip SWITCH i CASE 0 vPos = <<38.28, -692.31, 281.46>> fRot= -41.9 iRec = 003 // the alt 8500 IF NOT bInCutscene fSkip = WINCH_CUTSCENE_TIME + AFTER_CUTSCENE_TIME ELSE fSkip = 2000 ENDIF BREAK CASE 1 vPos = <<69.13, -710.32, 254.99>> fRot = 8.26 iRec = 012 IF NOT bInCutscene fSkip = WINCH_CUTSCENE_TIME + AFTER_CUTSCENE_TIME ELSE fSkip = 2000 ENDIF BREAK CASE 2 vPos = <<99.72, -628.75, 207.56>> fRot = -19.67 iRec = 013 IF NOT bInCutscene fSkip = WINCH_CUTSCENE_TIME + AFTER_CUTSCENE_LONG_TIME ELSE fSkip = 2000 ENDIF BREAK CASE 3 //vPos = <<99.72, -628.75, 207.56>> //fRot = -19.67 INT iClosest iClosest = -1 INT j FLOAT fClosestDist fClosestDist = 99999999.0 REPEAT 5 j VECTOR vSpawnPos vSpawnPos = GET_ENEMY_CHOPPER_POS(j) FLOAT fThisDistance fThisDistance = GET_DISTANCE_BETWEEN_COORDS(vSpawnPos, GET_ENTITY_COORDS(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]), FALSE) IF fThisDistance < fClosestDist IF fThisDistance > 150 AND fThisDistance < 900 IF NOT IS_SPHERE_VISIBLE(vSpawnPos, 5.0) fClosestDist = fThisDistance iClosest = j ENDIF ENDIF ENDIF ENDREPEAT IF iClosest >= 0 vPos = GET_ENEMY_CHOPPER_POS(iClosest) fRot = GET_HEADING_BETWEEN_VECTORS_2D(vPos, GET_ENTITY_COORDS(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER])) ELSE bDontCreate = TRUE ENDIF iRec = -1 BREAK ENDSWITCH IF NOT bDontCreate // chopper enemyChopperVehicle[i] = CREATE_VEHICLE(GET_MODEL_FOR_SNATCH_AND_GRAB_MODEL_ENUM(SAGM_ENEMY_CHOPPER), vPos, fRot) SET_HELI_BLADES_FULL_SPEED(enemyChopperVehicle[i]) SET_VEHICLE_ENGINE_ON(enemyChopperVehicle[i], TRUE, TRUE) SET_VEHICLE_CAN_BE_TARGETTED(enemyChopperVehicle[i], TRUE) iEnemyChopperAITime[i] = GET_GAME_TIMER() //SET_VEHICLE_COLOUR_COMBINATION(enemyChopperVehicle[i], 2) IF iRec >= 0 START_PLAYBACK_RECORDED_VEHICLE(enemyChopperVehicle[i], iRec, GET_SNATCH_AND_GRAB_RECORDING_PREFIX()) SET_PLAYBACK_SPEED(enemyChopperVehicle[i], 1.0) SKIP_TIME_IN_PLAYBACK_RECORDED_VEHICLE(enemyChopperVehicle[i], fSkip) FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(enemyChopperVehicle[i]) ELSE SET_VEHICLE_FORWARD_SPEED(enemyChopperVehicle[i], 30) ENDIF SET_ENTITY_PROOFS(enemyChopperVehicle[i], FALSE, FALSE, FALSE, TRUE, TRUE) IF i <= 2 SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(enemyChopperVehicle[i], TRUE) ENDIF ENDIF ENDFOR IF NOT bDontCreate // crew VEHICLE_SEAT seat IF NOT bExtra iStart = 0 iEnd = 8 ELSE iStart = 9 iEnd = 11 ENDIF FOR i=iStart TO iEnd INT iChopper SWITCH i CASE 0 seat = VS_DRIVER iChopper = 0 BREAK CASE 1 seat = VS_BACK_LEFT iChopper = 0 BREAK CASE 2 seat = VS_BACK_RIGHT iChopper = 0 BREAK CASE 3 seat = VS_DRIVER iChopper = 1 BREAK CASE 4 seat = VS_BACK_LEFT iChopper = 1 BREAK CASE 5 seat = VS_BACK_RIGHT iChopper = 1 BREAK CASE 6 seat = VS_DRIVER iChopper = 2 BREAK CASE 7 seat = VS_BACK_LEFT iChopper = 2 BREAK CASE 8 seat = VS_BACK_RIGHT iChopper = 2 BREAK CASE 9 seat = VS_DRIVER iChopper = 3 BREAK CASE 10 seat = VS_BACK_LEFT iChopper = 3 BREAK CASE 11 seat = VS_BACK_RIGHT iChopper = 3 BREAK ENDSWITCH if i = 0 or i = 3 or i = 6 or i = 9 enemyChopperPed[i] = CREATE_PED_INSIDE_VEHICLE(enemyChopperVehicle[iChopper], PEDTYPE_MISSION, GET_MODEL_FOR_SNATCH_AND_GRAB_MODEL_ENUM(SAGM_PILOT), seat) SET_PED_PROP_INDEX(enemyChopperPed[i], ANCHOR_HEAD, 0) else enemyChopperPed[i] = CREATE_PED_INSIDE_VEHICLE(enemyChopperVehicle[iChopper], PEDTYPE_MISSION, GET_MODEL_FOR_SNATCH_AND_GRAB_MODEL_ENUM(SAGM_GUARD), seat) endif SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(enemyChopperPed[i], TRUE) SET_PED_KEEP_TASK(enemyChopperPed[i], TRUE) if i = 0 or i = 3 or i = 6 or i = 9 SET_PED_ACCURACY(enemyChopperPed[i], 100) ELSE SET_PED_ACCURACY(enemyChopperPed[i], FLOOR(fChopperAccuracy)) ENDIF SET_PED_RELATIONSHIP_GROUP_HASH(enemyChopperPed[i], agencyRelGroup) SET_ENTITY_CAN_BE_DAMAGED_BY_RELATIONSHIP_GROUP(enemyChopperPed[i], FALSE, agencyRelGroup) INFORM_MISSION_STATS_OF_HEADSHOT_WATCH_ENTITY(enemyChopperPed[i]) bKilledEnemyChopperPed[i] = FALSE IF i <> 0 AND i <> 3 AND i <> 6 AND i <> 9 GIVE_WEAPON_TO_PED(enemyChopperPed[i], GET_SNATCH_AND_GRAB_WEAPON_TYPE(SAG_WEAPON_CIA_HELI), INFINITE_AMMO, TRUE) CLEAR_PED_PROP(enemyChopperPed[i], ANCHOR_EYES) //PRINTSTRING("LOD DIST = ") PRINTINT(GET_ENTITY_LOD_DIST(enemyChopperPed[i])) PRINTNL() SET_ENTITY_LOD_DIST(enemyChopperPed[i], 240) //TASK_VEHICLE_SHOOT_AT_PED(enemyChopperPed[i], PLAYER_PED_ID()) ENDIF ENDFOR //ADD_PED_FOR_DIALOGUE(snatchAndGrabConversation, 5, enemyChopperPed[0], "FBI2CIACHOP") IF NOT bExtra ADD_PED_FOR_DIALOGUE(snatchAndGrabConversation, 4, enemyChopperPed[0], "FBI2CIACHOP2") ENDIF ENDIF ENDPROC // set bad guys to driveby PROC SET_ENEMY_CHOPPER_SHOOTERS_TO_ATTACK(INT iChopper) INT i PED_INDEX michaelPed = GET_MICHAEL_PED() PED_INDEX franklinPed = GET_FRANKLIN_PED() IF NOT IS_PED_INJURED(michaelPed) INT iFirst INT iLast SWITCH iChopper CASE 0 iFirst = 1 iLast = 2 BREAK CASE 1 iFirst = 4 iLast = 5 BREAK CASE 2 iFirst = 7 iLast = 8 BREAK ENDSWITCH FOR i=iFirst TO iLast IF NOT IS_PED_INJURED(enemyChopperPed[i]) IF iChopper < 2 TASK_DRIVE_BY(enemyChopperPed[i], michaelPed, NULL, <<0,0,0>>, 1000, 100) ELSE TASK_DRIVE_BY(enemyChopperPed[i], franklinPed, NULL, <<0,0,0>>, 1000, 100) ENDIF ENDIF ENDFOR ENDIF bEnemyChopperShootersToAttack[iChopper] = TRUE ENDPROC // set enemy chopper no longer needed PROC SET_ENEMY_CHOPPER_AS_GAVE_UP_CHASE(INT iChopper) INT iDriver SWITCH iChopper CASE 0 iDriver = 0 BREAK CASE 1 iDriver = 3 BREAK CASE 2 iDriver = 6 BREAK ENDSWITCH IF NOT IS_PED_INJURED(enemyChopperPed[iDriver]) IF IS_VEHICLE_DRIVEABLE(enemyChopperVehicle[iChopper]) VECTOR vChopperPos = GET_ENTITY_COORDS(enemyChopperVehicle[iChopper]) TASK_HELI_MISSION(enemyChopperPed[iDriver], enemyChopperVehicle[iChopper], NULL, NULL, vChopperPos, MISSION_GOTO, 100.0, 30, -1, ROUND(vChopperPos.z), 10) ENDIF ENDIF ENDPROC // initialise the interrogation PROC INIT_INTERROGATION() INT i iSyncScene = CREATE_SYNCHRONIZED_SCENE(GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_INTERROGATION), <<0.0, 0.0, INTERROGATION_ROT>>) //iSyncScene = CREATE_SYNCHRONIZED_SCENE(GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_BREAK_IN) + <<0,0,1>>, <<0.0, 0.0, BREAK_IN_ROT>>) // michelle IF NOT IS_PED_INJURED(michellePed) TASK_SYNCHRONIZED_SCENE(michellePed, iSyncScene, GET_SNATCH_AND_GRAB_ANIM_DICT_AS_STRING(SAG_ANIM_DICT_CUTSCENES), "Interrogation_Michelle", INSTANT_BLEND_IN, INSTANT_BLEND_OUT) ENDIF // mr k IF NOT IS_PED_INJURED(prisonerPed) TASK_SYNCHRONIZED_SCENE(prisonerPed, iSyncScene, GET_SNATCH_AND_GRAB_ANIM_DICT_AS_STRING(SAG_ANIM_DICT_CUTSCENES), "Interrogation_MRK", INSTANT_BLEND_IN, INSTANT_BLEND_OUT) ENDIF // guards TEXT_LABEL tGuardAnim FOR i=0 TO 2 IF NOT IS_PED_INJURED(guardPed[i]) SWITCH i CASE 0 tGuardAnim = "Interrogation_B" BREAK CASE 1 tGuardAnim = "Interrogation_C" BREAK CASE 2 tGuardAnim = "Interrogation_A" BREAK ENDSWITCH TASK_SYNCHRONIZED_SCENE(guardPed[i], iSyncScene, GET_SNATCH_AND_GRAB_ANIM_DICT_AS_STRING(SAG_ANIM_DICT_CUTSCENES), tGuardAnim, INSTANT_BLEND_IN, GUARD_ANIM_BLEND_OUT) ENDIF ENDFOR // chair IF DOES_ENTITY_EXIST(chairObject) FREEZE_ENTITY_POSITION(chairObject, FALSE) PLAY_SYNCHRONIZED_ENTITY_ANIM(chairObject, iSyncScene, "interrogation_chair", GET_SNATCH_AND_GRAB_ANIM_DICT_AS_STRING(SAG_ANIM_DICT_CUTSCENES), INSTANT_BLEND_IN) ENDIF // camera CREATE_MISSION_ANIM_CAM(FALSE) PLAY_SYNCHRONIZED_CAM_ANIM(animCam, iSyncScene, "interrogation_cam", GET_SNATCH_AND_GRAB_ANIM_DICT_AS_STRING(SAG_ANIM_DICT_CUTSCENES)) // audio PLAY_SYNCHRONIZED_AUDIO_EVENT(iSyncScene) // rob 674211 IF NOT bUsingOfficeCam SET_VARIABLE_ON_SYNCH_SCENE_AUDIO("INOUT", 0) ELSE SET_VARIABLE_ON_SYNCH_SCENE_AUDIO("INOUT", 1) ENDIF TRIGGER_MISSION_MUSIC_EVENT("FIB2_TORTURE_CS") ENDPROC // fill guard pos for stage PROC FILL_GUARD_POSITION_FOR_STAGE(INT iGuard, MISSION_STAGE_ENUM guardStage, VECTOR &vPos, FLOAT &fRot) IF iGuard <= 2 SWITCH guardStage // init - before come crashing through CASE STAGE_RAPPEL_DOWN SWITCH iGuard CASE 0 vPos = <<116.39, -626.53, 205.05>> fRot = -22.30 BREAK CASE 1 vPos = <<123.70, -622.05, 205.05>> fRot = 109.05 BREAK CASE 2 vPos = <<120.01, -620.25, 205.05>> fRot = 50.78 BREAK ENDSWITCH BREAK // during - move to for snipe stage CASE STAGE_SNIPE_GUARDS SWITCH iGuard CASE 0 vPos = <<117.05, -618.45, 205.05>> //vPos = <<117.87, -619.47, 205.05>> BREAK CASE 1 vPos = <<116.5, -620.0, 205.05>> //vPos = <<117.34, -621.14, 205.05>> BREAK CASE 2 vPos = <<115.9, -620.9, 205.05>> //vPos = <<116.04, -622.41, 205.05>> BREAK ENDSWITCH BREAK ENDSWITCH ELSE SWITCH iGuard CASE 3 vPos = <<115.4, -626.8, 205.05>> fRot = -30.95 BREAK CASE 4 vPos = <<123.7, -617.3, 205.05>> fRot = 83.48 BREAK CASE 5 vPos = <<120.10, -625.8, 205.05>> fRot = 83.48 BREAK ENDSWITCH ENDIF ENDPROC // create the guards PROC CREATE_GUARDS_FOR_STAGE(MISSION_STAGE_ENUM createStage) INT i STRING sName //INT iHead //INT iTorso VECTOR vPos FLOAT fRot BOOL bForceWeapons INT iHead INT iHeadTexture INT iTorso INT iTorsoTexture INT iLegTexture INT iHair INT iTask REPEAT NUMBER_GUARDS i IF NOT DOES_ENTITY_EXIST(guardPed[i]) FILL_GUARD_POSITION_FOR_STAGE(i, createStage, vPos, fRot) guardPed[i] = CREATE_PED(PEDTYPE_MISSION, GET_MODEL_FOR_SNATCH_AND_GRAB_MODEL_ENUM(SAGM_GUARD), vPos, fRot) IF createStage = STAGE_RAPPEL_DOWN AND i <= 2 bForceWeapons = FALSE ELSE bForceWeapons = TRUE ENDIF GIVE_WEAPON_TO_PED(guardPed[i], GET_SNATCH_AND_GRAB_WEAPON_TYPE(SAG_WEAPON_CIA_PISTOL), INFINITE_AMMO, bForceWeapons) SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(guardPed[i], TRUE) STOP_PED_WEAPON_FIRING_WHEN_DROPPED(guardPed[i]) SET_PED_DIES_WHEN_INJURED(guardPed[i], TRUE) SET_PED_KEEP_TASK(guardPed[i], TRUE) SET_PED_ACCURACY(guardPed[i], 2) SET_ENTITY_PROOFS(guardPed[i], FALSE, FALSE, FALSE, TRUE, TRUE) SET_PED_RELATIONSHIP_GROUP_HASH(guardPed[i], agencyRelGroup) SET_PED_CONFIG_FLAG(guardPed[i], PCF_DisableHurt, TRUE) SET_PED_CONFIG_FLAG(guardPed[i], PCF_DisableExplosionReactions, TRUE) SET_PED_CONFIG_FLAG(guardPed[i], PCF_RunFromFiresAndExplosions, FALSE) SET_PED_CONFIG_FLAG(guardPed[i], PCF_DontReactivateRagdollOnPedCollisionWhenDead, TRUE) SET_PED_COMBAT_ATTRIBUTES(guardPed[i], CA_DISABLE_BULLET_REACTIONS, TRUE) DISABLE_PED_INJURED_ON_GROUND_BEHAVIOUR(guardPed[i]) SET_RAGDOLL_BLOCKING_FLAGS(guardPed[i], RBF_PLAYER_IMPACT) INFORM_MISSION_STATS_OF_HEADSHOT_WATCH_ENTITY(guardPed[i]) guardAI[i].currentAction = GA_AIM_AT_MICHAEL guardAI[i].currentSituation = GS_REACT_NONE guardAI[i].iRevertActionTime = -1 // variations SWITCH i CASE 0 iHead = 0 iHeadTexture = 2 iTorso = 0 iTorsoTexture = 0 iLegTexture = 1 iTask = 1 IF createStage = STAGE_RAPPEL_DOWN iHair = 1 ELSE iHair = 3 ENDIF sName = "GUARD0" BREAK CASE 1 iHead = 1 iHeadTexture = 1 iTorso = 1 iTorsoTexture = 0 iLegTexture = 2 iTask = 0 IF createStage = STAGE_RAPPEL_DOWN iHair = 1 ELSE iHair = 3 ENDIF sName = "GUARD1" BREAK CASE 2 iHead = 0 iHeadTexture = 0 iTorso = 0 iTorsoTexture = 3 iLegTexture = 0 iTask = 1 IF createStage = STAGE_RAPPEL_DOWN iHair = 1 ELSE iHair = 3 ENDIF sName = "GUARD2" BREAK CASE 3 iHead = 1 iHeadTexture = 0 iTorso = 0 iTorsoTexture = 2 iLegTexture = 2 iTask = 0 iHair = 2 sName = "GUARD3" BREAK CASE 4 iHead = 2 iHeadTexture = 0 iTorso = 2 iTorsoTexture = 0 iLegTexture = 1 iTask = 0 iHair = 3 sName = "GUARD4" BREAK CASE 5 iHead = 1 iHeadTexture = 0 iTorso = 2 iTorsoTexture = 0 iLegTexture = 2 iTask = 0 iHair = 3 sName = "GUARD5" BREAK ENDSWITCH SET_PED_COMPONENT_VARIATION(guardPed[i], PED_COMP_HEAD, iHead, iHeadTexture) SET_PED_COMPONENT_VARIATION(guardPed[i], PED_COMP_TORSO, iTorso, iTorsoTexture) SET_PED_COMPONENT_VARIATION(guardPed[i], PED_COMP_LEG, 0, iLegTexture) SET_PED_COMPONENT_VARIATION(guardPed[i], PED_COMP_SPECIAL2, iTask, 0) SET_PED_COMPONENT_VARIATION(guardPed[i], PED_COMP_HAIR, iHair, 0) IF createStage = STAGE_RAPPEL_DOWN IF i >= 3 SET_ENTITY_VISIBLE(guardPed[i], FALSE) ENDIF ENDIF SET_PED_NAME_DEBUG(guardPed[i], sName) ENDIF ENDREPEAT ENDPROC // setup guards for dialogue PROC SETUP_GUARDS_FOR_DIALOGUE() INT i REPEAT NUMBER_GUARDS i IF NOT IS_PED_INJURED(guardPed[i]) INT iSpeaker STRING sName SWITCH i CASE 0 iSpeaker = 4 sName = "FBI2AGENT1" BREAK CASE 1 iSpeaker = 5 sName = "FBI2AGENT2" BREAK CASE 2 iSpeaker = 6 sName = "FBI2AGENT6" BREAK CASE 3 iSpeaker = 7 sName = "FBI2AGENT4" BREAK CASE 4 iSpeaker = 8 sName = "FBI2AGENT3" BREAK ENDSWITCH ADD_PED_FOR_DIALOGUE(snatchAndGrabConversation, iSpeaker, guardPed[i], sName) ENDIF ENDREPEAT ENDPROC // set guards no longer needed PROC SET_GUARDS_NO_LONGER_NEEDED() INT i REPEAT NUMBER_GUARDS i IF DOES_ENTITY_EXIST(guardPed[i]) SET_PED_AS_NO_LONGER_NEEDED(guardPed[i]) ENDIF ENDREPEAT ENDPROC // get a random aim coord FUNC VECTOR GET_RANDOM_AIM_COORD() INT iInvert //VECTOR vMod = <> VECTOR vMod = <> iInvert = GET_RANDOM_INT_IN_RANGE(0,2) IF iInvert = 0 vMod.x *= -1 ENDIF iInvert = GET_RANDOM_INT_IN_RANGE(0,2) IF iInvert = 0 vMod.y *= -1 ENDIF iInvert = GET_RANDOM_INT_IN_RANGE(0,2) IF iInvert = 0 vMod.z *= -1 ENDIF RETURN GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_REMOTE_VIEW) + vMod ENDFUNC // guards come in when they hear the sniper PROC SET_GUARDS_HEAR_SNIPER() INT i //VECTOR vPos STRING sAnim //VECTOR vAimCoord iGuardSyncScene[GSS_STANDARD] = CREATE_SYNCHRONIZED_SCENE(GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_GUARD_ANIM_ORIGIN), <<0,0,GUARD_ANIM_ORIGIN_ROT>>) FOR i=GUARD_SECOND_WAVE_INDEX TO GUARD_LAST_INDEX IF NOT IS_PED_INJURED(guardPed[i]) SWITCH i CASE 3 sAnim = "Wave_1_B" BREAK CASE 4 sAnim = "Wave_1_A" BREAK ENDSWITCH CLEAR_PED_TASKS_IMMEDIATELY(guardPed[i]) PED_INDEX michaelped = GET_MICHAEL_PED() IF NOT IS_PED_INJURED(michaelPed) TASK_LOOK_AT_ENTITY(guardPed[i], michaelPed, -1, SLF_USE_EYES_ONLY) ENDIF TASK_SYNCHRONIZED_SCENE(guardPed[i], iGuardSyncScene[GSS_STANDARD], GET_SNATCH_AND_GRAB_ANIM_DICT_AS_STRING(SAG_ANIM_DICT_GUARDS), sAnim, INSTANT_BLEND_IN, GUARD_ANIM_BLEND_OUT, SYNCED_SCENE_USE_PHYSICS | SYNCED_SCENE_DONT_INTERRUPT) ENDIF ENDFOR ENDPROC // last guard for good luck PROC SET_LAST_GUARD_ENTER() STRING sAnim iGuardSyncScene[GSS_LAST_GUARD] = CREATE_SYNCHRONIZED_SCENE(GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_GUARD_ANIM_ORIGIN), <<0,0,GUARD_ANIM_ORIGIN_ROT>>) IF NOT IS_PED_INJURED(guardPed[5]) sAnim = "Wave_2_D" CLEAR_PED_TASKS_IMMEDIATELY(guardPed[5]) PED_INDEX michaelped = GET_MICHAEL_PED() IF NOT IS_PED_INJURED(michaelPed) TASK_LOOK_AT_ENTITY(guardPed[5], michaelPed, -1, SLF_USE_EYES_ONLY) ENDIF TASK_SYNCHRONIZED_SCENE(guardPed[5], iGuardSyncScene[GSS_LAST_GUARD], GET_SNATCH_AND_GRAB_ANIM_DICT_AS_STRING(SAG_ANIM_DICT_GUARDS), sAnim, INSTANT_BLEND_IN, GUARD_ANIM_BLEND_OUT, SYNCED_SCENE_USE_PHYSICS | SYNCED_SCENE_DONT_INTERRUPT) SET_SYNCHRONIZED_SCENE_PHASE(iGuardSyncScene[GSS_LAST_GUARD], 0.77) ENDIF ENDPROC // swap the duck anim PROC SWAP_DUCK_ANIM() iDuckAnim++ IF iDuckAnim > 2 iDuckAnim = 0 ENDIF ENDPROC // get duck anim FUNC STRING GET_DUCK_ANIM() SWITCH iDuckAnim CASE 0 RETURN "Guard_React_A" BREAK CASE 1 RETURN "Guard_React_B" BREAK CASE 2 RETURN "Guard_React_C" BREAK ENDSWITCH RETURN "Guard_React_A" ENDFUNC // swap the flinch anim PROC SWAP_FLINCH_LEFT_ANIM() iFlinchLeftAnim++ IF iFlinchLeftAnim > 1 iFlinchLeftAnim = 0 ENDIF ENDPROC // swap the flinch anim PROC SWAP_FLINCH_RIGHT_ANIM() iFlinchRightAnim++ IF iFlinchRightAnim > 1 iFlinchRightAnim = 0 ENDIF ENDPROC // get flinch anim FUNC STRING GET_FLINCH_LEFT_ANIM() SWITCH iFlinchLeftAnim CASE 0 RETURN "Guard_Flinch_L" BREAK CASE 1 RETURN "Guard_Flinch_R_2" BREAK ENDSWITCH RETURN "Guard_Flinch_L" ENDFUNC // get flinch anim FUNC STRING GET_FLINCH_RIGHT_ANIM() SWITCH iFlinchRightAnim CASE 0 RETURN "Guard_Flinch_R" BREAK CASE 1 RETURN "Guard_Flinch_L_2" BREAK ENDSWITCH RETURN "Guard_Flinch_R" ENDFUNC // guards react to shooting PROC DO_GUARD_REACTIONS(INT iKilledGuards) INT i INT iCountTo IF NOT bAdditionalGuardsToShoot iCountTo = 2 ELSE IF NOT bLastGuardToShoot iCountTo = 4 ELSE iCountTo = 5 ENDIF ENDIF PED_INDEX michaelPed = GET_MICHAEL_PED() GUARD_SITUATION_REACT_ENUM thisSituation thisSituation = GS_REACT_NONE BOOL bBulletIsToLeft VECTOR vAimCoord // check for sniper bullet in the entire office BOOL bIsSniperBulletInOffice bIsSniperBulletInOffice = FALSE IF (IS_SNIPER_BULLET_IN_AREA(<<109.26, -622.75, 206.16>>, <<121.75, -618.34, 208.45>>) OR iKilledGuards > 0) AND NOT bGuardsAttackPrisoner IF NOT bReactedToFirstShot thisSituation = GS_REACT_FIRST_SHOT bReactedToFirstShot = TRUE ENDIF bIsSniperBulletInOffice = TRUE ENDIF IF NOT IS_PED_INJURED(michaelPed) FOR i=0 TO iCountTo IF thisSituation <> GS_REACT_FIRST_SHOT thisSituation = GS_REACT_NONE ENDIF vAimCoord = GET_RANDOM_AIM_COORD() IF NOT IS_PED_INJURED(guardPed[i]) // check to see if sniper bullet is close to the ped IF thisSituation = GS_REACT_NONE IF bIsSniperBulletInOffice VECTOR vGuardPos vGuardPos = GET_ENTITY_COORDS(guardPed[i]) IF IS_BULLET_IN_AREA(vGuardPos, 1.5, TRUE) IF IS_SNIPER_BULLET_IN_AREA(<>, <>) IF IS_SNIPER_BULLET_IN_AREA(<>, <>) bBulletIsToLeft = TRUE ELSE bBulletIsToLeft = FALSE ENDIF thisSituation = GS_REACT_BULLET_NEAR ENDIF ENDIF ENDIF ENDIF // react to any situation that has arisen IF thisSituation <> GS_REACT_NONE // react to any situation different than the one currently reacting to IF guardAI[i].currentSituation <> thisSituation INT iReactionLength iReactionLength = -1 CLEAR_PED_SECONDARY_TASK(guardPed[i]) CLEAR_SEQUENCE_TASK(sequence) OPEN_SEQUENCE_TASK(sequence) TASK_CLEAR_LOOK_AT(NULL) SWITCH thisSituation CASE GS_REACT_BULLET_NEAR IF bBulletIsToLeft TASK_PLAY_ANIM(NULL, GET_SNATCH_AND_GRAB_ANIM_DICT_AS_STRING(SAG_ANIM_DICT_IN_OFFICE), GET_FLINCH_LEFT_ANIM(), NORMAL_BLEND_IN, GUARD_ANIM_BLEND_OUT) SWAP_FLINCH_LEFT_ANIM() ELSE TASK_PLAY_ANIM(NULL, GET_SNATCH_AND_GRAB_ANIM_DICT_AS_STRING(SAG_ANIM_DICT_IN_OFFICE), GET_FLINCH_RIGHT_ANIM(), NORMAL_BLEND_IN, GUARD_ANIM_BLEND_OUT) SWAP_FLINCH_RIGHT_ANIM() ENDIF TASK_AIM_GUN_AT_ENTITY(NULL, michaelPed, -1) iNextGuardAnimationTime[i] = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(3000, 6000) iReactionLength = GET_RANDOM_INT_IN_RANGE(1500, 2000) BREAK CASE GS_REACT_FIRST_SHOT if ireactionDelay > 200 ireactionDelay = 0 endif TASK_AIM_GUN_AT_ENTITY(null,michaelPed,ireactionDelay) ireactionDelay += 100 TASK_PLAY_ANIM(NULL, GET_SNATCH_AND_GRAB_ANIM_DICT_AS_STRING(SAG_ANIM_DICT_IN_OFFICE), GET_DUCK_ANIM(), NORMAL_BLEND_IN, GUARD_ANIM_BLEND_OUT) SWAP_DUCK_ANIM() TASK_AIM_GUN_AT_ENTITY(NULL, michaelPed, -1) guardAI[i].currentAction = GA_AIM_AT_MICHAEL iNextGuardAnimationTime[i] = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(3000, 7000) iReactionLength = GET_RANDOM_INT_IN_RANGE(2800, 3500) BREAK ENDSWITCH CLOSE_SEQUENCE_TASK(sequence) TASK_PERFORM_SEQUENCE(guardPed[i], sequence) guardAI[i].currentSituation = thisSituation IF iReactionLength >= 0 guardAI[i].iRevertActionTime = GET_GAME_TIMER() + iReactionLength ELSE guardAI[i].iRevertActionTime = -1 ENDIF ENDIF ELSE // if this situation is none then see if can return to normal IF guardAI[i].iRevertActionTime >= 0 //printint(get_game_timer()) PRINTNL() IF GET_GAME_TIMER() >= guardAI[i].iRevertActionTime //CLEAR_SEQUENCE_TASK(sequence) //OPEN_SEQUENCE_TASK(sequence) INT iRandomState iRandomState = GET_RANDOM_INT_IN_RANGE(0,8) IF iKilledGuards > 0 OR GET_GAME_TIMER() >= iReactToFirstShotTime + 6000 iRandomState += 2 ENDIF SWITCH iRandomState CASE 0 CASE 1 TASK_AIM_GUN_AT_ENTITY(guardPed[i], michaelPed, -1) guardAI[i].currentAction = GA_AIM_AT_MICHAEL guardAI[i].iRevertActionTime = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(3000, 6000) BREAK CASE 2 CASE 3 CASE 4 CASE 5 CASE 6 TASK_AIM_GUN_AT_COORD(guardPed[i], vAimCoord, -1) guardAI[i].currentAction = GA_AIM_AT_SNIPER guardAI[i].iRevertActionTime = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(3000, 6000) BREAK CASE 7 CASE 8 CASE 9 CASE 10 TASK_SHOOT_AT_COORD(guardPed[i], vAimCoord, -1, FIRING_TYPE_CONTINUOUS) guardAI[i].currentAction = GA_FIRE_ON_SNIPER guardAI[i].iRevertActionTime = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(5000, 7000) BREAK ENDSWITCH //CLOSE_SEQUENCE_TASK(sequence) //TASK_PERFORM_SEQUENCE(guardPed[i], sequence) guardAI[i].currentSituation = GS_REACT_NONE ENDIF ENDIF ENDIF ENDIF ENDFOR ENDIF ENDPROC // set guards up and aim at current michael PROC SET_GUARDS_AIMING_AT_MICHAEL(BOOL bSetPositions = FALSE, BOOL b2AimHigh = FALSE) INT i VECTOR vPos FLOAT fRot PED_INDEX michaelPed = GET_MICHAEL_PED() REPEAT NUMBER_GUARDS i IF NOT IS_PED_INJURED(guardPed[i]) //CLEAR_PED_TASKS(guardPed[i]) SET_CURRENT_PED_WEAPON(guardPed[i], GET_SNATCH_AND_GRAB_WEAPON_TYPE(SAG_WEAPON_CIA_PISTOL), TRUE) IF bSetPositions FILL_GUARD_POSITION_FOR_STAGE(i, STAGE_SNIPE_GUARDS, vPos, fRot) SET_ENTITY_COORDS(guardPed[i], vPos) ENDIF FLOAT fHeading SWITCH i CASE 0 fHeading = 107.80 BREAK CASE 1 fHeading = 79.65 BREAK CASE 2 fHeading = 65.18 BREAK CASE 3 fHeading = 20.96 BREAK CASE 4 fHeading = 93.09 BREAK ENDSWITCH SET_ENTITY_HEADING(guardPed[i], fHeading) TASK_CLEAR_LOOK_AT(guardPed[i]) IF i<>2 OR NOT b2AimHigh IF NOT IS_PED_INJURED(michaelPed) TASK_AIM_GUN_AT_ENTITY(guardPed[i], michaelPed, -1, TRUE) ENDIF ELSE TASK_AIM_GUN_AT_COORD(guardPed[2], GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_HEADSHOT), -1, TRUE) ENDIF FORCE_PED_MOTION_STATE(guardPed[i], MS_AIMING, TRUE) FORCE_PED_AI_AND_ANIMATION_UPDATE(guardPed[i], TRUE) ENDIF ENDREPEAT ENDPROC // create chair for stage PROC CREATE_CHAIR_FOR_STAGE(MISSION_STAGE_ENUM createStage) VECTOR vPos FLOAT fRot SWITCH createStage CASE STAGE_RAPPEL_DOWN vPos = <<114.35, -619.46, 205.05>> fRot = 42.6912 BREAK CASE STAGE_SNIPE_GUARDS vPos = <<113.62, -617.81, 205.05>> fRot = -76.1837 BREAK ENDSWITCH IF NOT DOES_ENTITY_EXIST(chairObject) chairObject = CREATE_OBJECT(GET_MODEL_FOR_SNATCH_AND_GRAB_MODEL_ENUM(SAGM_CHAIR), vPos) ELSE SET_ENTITY_COORDS_NO_OFFSET(chairObject, vPos) ENDIF SET_ENTITY_HEADING(chairObject, fRot) IF createStage = STAGE_RAPPEL_DOWN FREEZE_ENTITY_POSITION(chairObject, TRUE) ELSE FREEZE_ENTITY_POSITION(chairObject, FALSE) ENDIF ENDPROC // create office peds on the rappel stage PROC CREATE_OFFICE_PEDS_FOR_RAPPEL() CREATE_PRISONER_FOR_STAGE(STAGE_RAPPEL_DOWN) CREATE_GUARDS_FOR_STAGE(STAGE_RAPPEL_DOWN) SETUP_GUARDS_FOR_DIALOGUE() CREATE_MICHELLE_FOR_STAGE(STAGE_RAPPEL_DOWN) CREATE_CHAIR_FOR_STAGE(STAGE_RAPPEL_DOWN) bCreatedOfficePedsForRappel = TRUE ENDPROC // get correct synced scene for reinforcement FUNC GUARD_SYNCED_SCENE_ENUM GET_SYNCED_SCENE_FOR_REINFORCEMENT(INT i) SWITCH i CASE 4 RETURN GSS_REIN_FIRST_EXTRA BREAK CASE 5 RETURN GSS_REIN_SECOND_EXTRA BREAK CASE 6 RETURN GSS_REIN_THIRD_EXTRA BREAK CASE 7 RETURN GSS_REIN_FOURTH_EXTRA BREAK ENDSWITCH RETURN GSS_STANDARD ENDFUNC // create the reinforcements PROC CREATE_REINFORCEMENTS(INT iWave) INT i VECTOR vPos FLOAT fRot STRING sAnim WEAPON_TYPE weapon INT iHead INT iHeadTexture INT iTorso INT iTorsoTexture INT iLegTexture INT iHair INT iTask INT iFirstIndex INT iLastIndex IF iWave = 1 iFirstIndex = 0 iLastIndex = 3 iGuardSyncScene[GSS_STANDARD] = CREATE_SYNCHRONIZED_SCENE(GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_GUARD_ANIM_ORIGIN), <<0,0,GUARD_ANIM_ORIGIN_ROT>>) ELIF iWave = 2 iFirstIndex = 4 iLastIndex = 4 iGuardSyncScene[GSS_REIN_FIRST_EXTRA] = CREATE_SYNCHRONIZED_SCENE(GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_GUARD_ANIM_ORIGIN), <<0,0,GUARD_ANIM_ORIGIN_ROT>>) ELIF iWave = 3 iFirstIndex = 5 iLastIndex = 5 iGuardSyncScene[GSS_REIN_SECOND_EXTRA] = CREATE_SYNCHRONIZED_SCENE(GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_GUARD_ANIM_ORIGIN) + <<0.4,0.4,0>>, <<0,0,GUARD_ANIM_ORIGIN_ROT>>) ELIF iWave = 4 iFirstIndex = 6 iLastIndex = 6 iGuardSyncScene[GSS_REIN_THIRD_EXTRA] = CREATE_SYNCHRONIZED_SCENE(GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_GUARD_ANIM_ORIGIN) + <<-0.6,-2.5,0>>, <<0,0,GUARD_ANIM_ORIGIN_ROT>>) ELIF iWave = 5 iFirstIndex = 7 iLastIndex = 7 iGuardSyncScene[GSS_REIN_FOURTH_EXTRA] = CREATE_SYNCHRONIZED_SCENE(GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_GUARD_ANIM_ORIGIN), <<0,0,GUARD_ANIM_ORIGIN_ROT>>) ENDIF FOR i=iFirstIndex TO iLastIndex IF NOT DOES_ENTITY_EXIST(reinforcementPed[i]) weapon = GET_SNATCH_AND_GRAB_WEAPON_TYPE(SAG_WEAPON_CIA_PISTOL) SWITCH i CASE 0 vPos = <<116.45, -626.87, 205.05>> fRot = -32.35 sAnim = "WAVE_2_A" weapon = GET_SNATCH_AND_GRAB_WEAPON_TYPE(SAG_WEAPON_CIA_SMG) iHead = 1 iHeadTexture = 2 iTorso = 0 iTorsoTexture = 1 iLegTexture = 0 iHair = 2 iTask = 0 BREAK CASE 1 vPos = <<133.85, -614.77, 205.05>> fRot = 150.59 sAnim = "WAVE_2_B" iHead = 1 iHeadTexture = 1 iTorso = 1 iTorsoTexture = 1 iLegTexture = 2 iHair = 3 iTask = 0 BREAK CASE 2 vPos = <<125.73, -617.68, 205.05>> fRot = 141.07 sAnim = "WAVE_2_C" iHead = 2 iHeadTexture = 0 iTorso = 0 iTorsoTexture = 0 iLegTexture = 0 iHair = 3 iTask = 1 BREAK CASE 3 vPos = <<126.11, -617.95, 205.05>> fRot = 121.76 sAnim = "WAVE_2_D" iHead = 0 iHeadTexture = 1 iTorso = 1 iTorsoTexture = 2 iLegTexture = 1 iHair = 3 iTask = 0 BREAK CASE 4 vPos = <<117.16, -628.03, 205.05>> fRot = -44.96 sAnim = "WAVE_3_A" weapon = GET_SNATCH_AND_GRAB_WEAPON_TYPE(SAG_WEAPON_CIA_SMG) iHead = 0 iHeadTexture = 2 iTorso = 2 iTorsoTexture = 0 iLegTexture = 2 iHair = 3 iTask = 0 BREAK CASE 5 vPos = <<130.94, -614.26, 205.05>> fRot = 123.36 sAnim = "WAVE_3_B" weapon = GET_SNATCH_AND_GRAB_WEAPON_TYPE(SAG_WEAPON_CIA_SMG) iHead = 1 iHeadTexture = 0 iTorso = 1 iTorsoTexture = 2 iLegTexture = 1 BREAK CASE 6 vPos = <<126.11, -617.95, 205.05>> fRot = 121.76 sAnim = "WAVE_2_D" iHead = 0 iHeadTexture = 0 iTorso = 1 iTorsoTexture = 0 iLegTexture = 1 iHair = 3 iTask = 1 BREAK CASE 7 vPos = <<133.85, -614.77, 205.05>> fRot = 150.59 sAnim = "WAVE_1_A" iHead = 0 iHeadTexture = 2 iTorso = 0 iTorsoTexture = 5 iLegTexture = 1 iTask = 1 iHair = 3 BREAK ENDSWITCH reinforcementPed[i] = CREATE_PED(PEDTYPE_MISSION, GET_MODEL_FOR_SNATCH_AND_GRAB_MODEL_ENUM(SAGM_GUARD), vPos, fRot) GIVE_WEAPON_TO_PED(reinforcementPed[i], weapon, INFINITE_AMMO, TRUE) SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(reinforcementPed[i], TRUE) STOP_PED_WEAPON_FIRING_WHEN_DROPPED(reinforcementPed[i]) SET_PED_DIES_WHEN_INJURED(reinforcementPed[i], TRUE) SET_PED_ACCURACY(reinforcementPed[i], 20) //SET_PED_CHANCE_OF_FIRING_BLANKS(reinforcementPed[i], 0.0, 0.75) SET_PED_AS_ENEMY(reinforcementPed[i], TRUE) SET_PED_KEEP_TASK(reinforcementPed[i], TRUE) SET_ENTITY_PROOFS(reinforcementPed[i], FALSE, FALSE, FALSE, TRUE, TRUE) SET_PED_CAN_BE_TARGETTED(reinforcementPed[i], TRUE) SET_PED_CAN_BE_TARGETED_WITHOUT_LOS(reinforcementPed[i], TRUE) SET_ENTITY_IS_TARGET_PRIORITY(reinforcementPed[i], TRUE) SET_PED_RELATIONSHIP_GROUP_HASH(reinforcementPed[i], agencyRelGroup) reinforcementBlip[i] = CREATE_MISSION_BLIP_FOR_PED(reinforcementPed[i], TRUE) INFORM_MISSION_STATS_OF_HEADSHOT_WATCH_ENTITY(reinforcementPed[i]) SET_PED_CONFIG_FLAG(reinforcementPed[i], PCF_DisableHurt, TRUE) SET_PED_CONFIG_FLAG(reinforcementPed[i], PCF_DisableExplosionReactions, TRUE) SET_PED_CONFIG_FLAG(reinforcementPed[i], PCF_RunFromFiresAndExplosions, FALSE) SET_PED_CONFIG_FLAG(reinforcementPed[i], PCF_DontReactivateRagdollOnPedCollisionWhenDead, TRUE) DISABLE_PED_INJURED_ON_GROUND_BEHAVIOUR(reinforcementPed[i]) // variation SET_PED_COMPONENT_VARIATION(reinforcementPed[i], PED_COMP_HEAD, iHead, iHeadTexture) SET_PED_COMPONENT_VARIATION(reinforcementPed[i], PED_COMP_TORSO, iTorso, iTorsoTexture) SET_PED_COMPONENT_VARIATION(reinforcementPed[i], PED_COMP_LEG, 0, iLegTexture) SET_PED_COMPONENT_VARIATION(reinforcementPed[i], PED_COMP_SPECIAL2, iTask, 0) SET_PED_COMPONENT_VARIATION(reinforcementPed[i], PED_COMP_HAIR, iHair, 0) // task ped PED_INDEX michaelped = GET_MICHAEL_PED() IF NOT IS_PED_INJURED(michaelPed) TASK_LOOK_AT_ENTITY(reinforcementPed[i], michaelPed, -1, SLF_USE_EYES_ONLY) ENDIF TASK_SYNCHRONIZED_SCENE(reinforcementPed[i], iGuardSyncScene[GET_SYNCED_SCENE_FOR_REINFORCEMENT(i)], GET_SNATCH_AND_GRAB_ANIM_DICT_AS_STRING(SAG_ANIM_DICT_GUARDS), sAnim, INSTANT_BLEND_IN, GUARD_ANIM_BLEND_OUT, SYNCED_SCENE_NONE) IF i=6 SET_SYNCHRONIZED_SCENE_PHASE(iGuardSyncScene[GSS_REIN_THIRD_EXTRA], 0.71) ELIF i=7 SET_SYNCHRONIZED_SCENE_PHASE(iGuardSyncScene[GSS_REIN_FOURTH_EXTRA], 0.2) ENDIF /* CLEAR_SEQUENCE_TASK(sequence) OPEN_SEQUENCE_TASK(sequence) IF i<=1 TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_GUARD_DOOR_OUTSIDE), PEDMOVE_RUN, DEFAULT_TIME_BEFORE_WARP, 0.25) TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(NULL, GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_GUARD_DOOR_OUTSIDE), PLAYER_PED_ID(), PEDMOVE_WALK, FALSE) TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(NULL, GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_GUARD_DOOR_INSIDE), PLAYER_PED_ID(), PEDMOVE_WALK, FALSE) TASK_GO_TO_COORD_WHILE_AIMING_AT_ENTITY(NULL, vGotoPos, PLAYER_PED_ID(), PEDMOVE_WALK, FALSE, 0.5, 4, FALSE) ELSE TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, vGotoPos, PEDMOVE_RUN) ENDIF TASK_AIM_GUN_AT_ENTITY(NULL, PLAYER_PED_ID(), 6000) TASK_SHOOT_AT_ENTITY(NULL, PLAYER_PED_ID(), 50000, FIRING_TYPE_RANDOM_BURSTS) CLOSE_SEQUENCE_TASK(sequence) TASK_PERFORM_SEQUENCE(reinforcementPed[i], sequence) */ IF i=0 ADD_PED_FOR_DIALOGUE(snatchAndGrabConversation, 4, reinforcementPed[i], "FBI2AGENT5") ELIF i=1 ADD_PED_FOR_DIALOGUE(snatchAndGrabConversation, 5, reinforcementPed[i], "FBI2AGENT7") ELIF i=3 ADD_PED_FOR_DIALOGUE(snatchAndGrabConversation, 6, reinforcementPed[i], "FBI2AGENT8") ELIF i=5 SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(reinforcementPed[i], TRUE) ENDIF ENDIF ENDFOR ENDPROC // give franklin the sniper rifle PROC GIVE_FRANKLIN_SNIPER_RIFLE() PED_INDEX franklinPed = GET_FRANKLIN_PED() IF NOT IS_PED_INJURED(franklinPed) WEAPON_TYPE sniperWeapon = GET_SNATCH_AND_GRAB_WEAPON_TYPE(SAG_WEAPON_SNIPER_RIFLE) IF NOT bCheckedInitialSniper IF HAS_PED_GOT_WEAPON(franklinPed, sniperWeapon) iInitialSniperAmmo = GET_AMMO_IN_PED_WEAPON(franklinPed, sniperWeapon) ELSE iInitialSniperAmmo = -1 ENDIF bCheckedInitialSniper = TRUE ENDIF GIVE_WEAPON_TO_PED(franklinPed, sniperWeapon, 200, TRUE) PRINTSTRING("gave franklin a rifle!") PRINTNL() ENDIF ENDPROC // give michael the advanced rifle PROC GIVE_MICHAEL_RIFLE() PED_INDEX michaelPed = GET_MICHAEL_PED() IF NOT IS_PED_INJURED(michaelPed) IF iSavedAmmo < 0 IF HAS_PED_GOT_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_ASSAULTRIFLE) iSavedAmmo = GET_AMMO_IN_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_ASSAULTRIFLE) ELIF HAS_PED_GOT_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_CARBINERIFLE) iSavedAmmo = GET_AMMO_IN_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_CARBINERIFLE) ENDIF ENDIF IF GET_AMMO_IN_PED_WEAPON(michaelPed, GET_SNATCH_AND_GRAB_WEAPON_TYPE(SAG_WEAPON_MICHAEL_RIFLE)) = 0 SET_PED_AMMO(michaelPed, GET_SNATCH_AND_GRAB_WEAPON_TYPE(SAG_WEAPON_MICHAEL_RIFLE), 1) ENDIF GIVE_WEAPON_TO_PED(michaelPed, GET_SNATCH_AND_GRAB_WEAPON_TYPE(SAG_WEAPON_MICHAEL_RIFLE), INFINITE_AMMO, TRUE) SET_PED_INFINITE_AMMO(michaelPed, TRUE, GET_SNATCH_AND_GRAB_WEAPON_TYPE(SAG_WEAPON_MICHAEL_RIFLE)) SET_PED_INFINITE_AMMO_CLIP(michaelPed, TRUE) //REQUEST_WEAPON_AUDIO("WEAPON_ADVANCEDRIFLE") // temp ENDIF ENDPROC // freeze franklin at sniper PROC FREEZE_FRANKLIN_AT_SNIPER(BOOL bFakeClose = TRUE) PED_INDEX franklinPed = GET_FRANKLIN_PED() IF NOT IS_PED_INJURED(franklinPed) IF DOES_ENTITY_EXIST(franklinAnchorObject) DELETE_OBJECT(franklinAnchorObject) ENDIF VECTOR vCreatePos IF bFakeClose vCreatePos = GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_BEHIND_SNIPER) ELSE vCreatePos = <<-139.44, -594.43, 211.77>> ENDIF //FREEZE_ENTITY_POSITION(franklinPed, FALSE) franklinAnchorObject = CREATE_OBJECT(GET_MODEL_FOR_SNATCH_AND_GRAB_MODEL_ENUM(SAGM_HARNESS), vCreatePos) SET_ENTITY_HEADING(franklinAnchorObject, FRANKLIN_SNIPER_ROT) FREEZE_ENTITY_POSITION(franklinAnchorObject, TRUE) SET_ENTITY_VISIBLE(franklinAnchorObject, FALSE) SET_ENTITY_COLLISION(franklinAnchorObject, FALSE) FREEZE_ENTITY_POSITION(franklinPed, FALSE) ATTACH_ENTITY_TO_ENTITY(franklinPed, franklinAnchorObject, 0, <<0,0,0>>, <<0,0,0>>) IF bFakeClose SET_ENTITY_VISIBLE(franklinPed, FALSE) ENDIF //SET_ENTITY_COLLISION(franklinPed, FALSE) ENDIF ENDPROC // ensure franklin invisible PROC ENSURE_FRANKLIN_INVISIBLE() PED_INDEX franklinPed = GET_FRANKLIN_PED() IF NOT IS_PED_INJURED(franklinPed) SET_ENTITY_VISIBLE(franklinPed, FALSE) ENDIF ENDPROC // create remote sniper object PROC CREATE_SNIPER_OBJECT() // create franklin SNATCH_AND_GRAB_CREATE_PLAYER_CHARACTER(CHAR_FRANKLIN, STAGE_SNIPE_GUARDS, GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_BEHIND_SNIPER), FRANKLIN_SNIPER_ROT) FREEZE_FRANKLIN_AT_SNIPER() GIVE_FRANKLIN_SNIPER_RIFLE() //TASK_PLAY_ANIM(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], "move_crouch", "idle", INSTANT_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING) ENDPROC // create dummy franklin PROC CREATE_DUMMY_FRANKLIN(BOOL bCreatePed = TRUE) VECTOR vPos = <<-135.52, -592.39, 210.68>> FLOAT fRot = -96.1 IF bCreatePed CREATE_PLAYER_PED_ON_FOOT(dummyFranklinPed, CHAR_FRANKLIN, vPos, fRot, FALSE) GIVE_WEAPON_TO_PED(dummyFranklinPed, GET_SNATCH_AND_GRAB_WEAPON_TYPE(SAG_WEAPON_SNIPER_RIFLE), 800, TRUE) SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(dummyFranklinPed, FALSE) SET_PED_COMP_ITEM_CURRENT_SP(dummyFranklinPed, COMP_TYPE_PROPS, PROPS_P1_HEADSET) FREEZE_ENTITY_POSITION(dummyFranklinPed, TRUE) SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(dummyFranklinPed, TRUE) SET_ENTITY_PROOFS(dummyFranklinPed, TRUE, TRUE, TRUE, TRUE, TRUE) SET_FACIAL_IDLE_ANIM_OVERRIDE(dummyFranklinPed, "Mood_Angry_1") SET_PED_COMP_ITEM_CURRENT_SP(dummyFranklinPed, COMP_TYPE_OUTFIT, OUTFIT_P1_HOODIE_AND_JEANS_1, FALSE) // remember to change at lot! //SET_PED_COMPONENT_VARIATION(dummyFranklinPed, PED_COMP_FEET, FRANKLIN_SMART_FEET, 0) ////SET_PED_COMPONENT_VARIATION(dummyFranklinPed, PED_COMP_TORSO, FRANKLIN_SMART_TORSO, 0) //SET_PED_COMPONENT_VARIATION(dummyFranklinPed, PED_COMP_LEG, FRANKLIN_SMART_LEG, 0) ELSE IF NOT IS_PED_INJURED(dummyFranklinPed) SET_ENTITY_COORDS(dummyFranklinPed, vPos) SET_ENTITY_HEADING(dummyFranklinPed, fRot) FREEZE_ENTITY_POSITION(dummyFranklinPed, TRUE) SET_CURRENT_PED_WEAPON(dummyFranklinPed, GET_SNATCH_AND_GRAB_WEAPON_TYPE(SAG_WEAPON_SNIPER_RIFLE), TRUE) ENDIF ENDIF IF NOT IS_PED_INJURED(dummyFranklinPed) TASK_PLAY_ANIM(dummyFranklinPed, GET_SNATCH_AND_GRAB_ANIM_DICT_AS_STRING(SAG_ANIM_DICT_GUARDS), "FRANKLIN_SNIPER_CROUCH", INSTANT_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING) FORCE_PED_AI_AND_ANIMATION_UPDATE(dummyFranklinPed) ENDIF ENDPROC /* // set the chopper to arrive FUNC INT SET_CHOPPER_TO_ARRIVE() IF IS_VEHICLE_DRIVEABLE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) STOP_PLAYBACK_RECORDED_VEHICLE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) ENDIF INT iRec FLOAT fSpeed VECTOR vChopperPos = GET_ENTITY_COORDS(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) IF vChopperPos.x >= 177.64 OR IS_ENTITY_IN_ANGLED_AREA(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], <<124.640, -625.900, 266.970>>, <<183.060, -657.460, 241.660>>, 150, FALSE, FALSE) iRec = 004 fPlaybackTime = 1000 fSpeed = 1.0 ELSE IF vChopperPos.y >= -629.58 iRec = 005 fPlaybackTime = 2400 fSpeed = 1.0 ELSE iRec = 006 fPlaybackTime = 1000 fSpeed = 0.87 ENDIF ENDIF START_PLAYBACK_RECORDED_VEHICLE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], iRec, GET_SNATCH_AND_GRAB_RECORDING_PREFIX()) SET_PLAYBACK_SPEED(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], fSpeed) SET_VEHICLE_ENGINE_ON(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], TRUE, TRUE) SET_HELI_BLADES_FULL_SPEED(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) SKIP_TIME_IN_PLAYBACK_RECORDED_VEHICLE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], fPlaybackTime) FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) RETURN iRec ENDIF RETURN -1 ENDFUNC */ // set the chopper to hover PROC SET_CHOPPER_TO_HOVER(BOOL bForceUpdate = TRUE) IF IS_VEHICLE_DRIVEABLE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) SET_ENTITY_COORDS(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER],GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_CHOPPER_HOVER)) SET_ENTITY_HEADING(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], CHOPPER_HOVER_ROT) FREEZE_ENTITY_POSITION(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], FALSE) SET_VEHICLE_ENGINE_ON(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], TRUE, TRUE) START_PLAYBACK_RECORDED_VEHICLE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], 001, GET_SNATCH_AND_GRAB_RECORDING_PREFIX()) IF bForceUpdate FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) ENDIF //SET_PLAYBACK_SPEED(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], CHOPPER_HOVER_SPEED) SET_PLAYBACK_SPEED(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], 0.0) SET_HELI_BLADES_FULL_SPEED(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) fHoverPlaybackSpeed = CHOPPER_HOVER_SPEED ENDIF ENDIF ENDPROC // set the chopper to escape PROC SET_CHOPPER_TO_ESCAPE(BOOL bSkipToGetaway = FALSE) IF IS_VEHICLE_DRIVEABLE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) STOP_PLAYBACK_RECORDED_VEHICLE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) ENDIF IF NOT bSkipToGetaway START_PLAYBACK_RECORDED_VEHICLE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], 002, GET_SNATCH_AND_GRAB_RECORDING_PREFIX()) ELSE START_PLAYBACK_RECORDED_VEHICLE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], 011, GET_SNATCH_AND_GRAB_RECORDING_PREFIX()) ENDIF SET_VEHICLE_ENGINE_ON(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], TRUE, TRUE) SET_HELI_BLADES_FULL_SPEED(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) IF NOT bSkipToGetaway fPlaybackTime = CHASE_FORCE_SWITCH_TIME//SKIP_CHOPPER_PLAYBACK_TIME SET_PLAYBACK_SPEED(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], 0.0) ELSE fPlaybackTime = 2500 SET_PLAYBACK_SPEED(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], CHOPPER_ESCAPE_SPEED) ENDIF SKIP_TIME_IN_PLAYBACK_RECORDED_VEHICLE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], fPlaybackTime) FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) ENDIF ENDPROC // enemy peds on foot during chase FUNC INT HANDLE_ENEMY_FOOT_PEDS() INT i INT iAlive = 0 REPEAT NUMBER_REINFORCEMENTS i //IF DOES_BLIP_EXIST(reinforcementBlip[i]) IF IS_PED_INJURED(reinforcementPed[i]) OR fPlaybackTime >= CHASE_UNPIN_INTERIOR_TIME IF DOES_BLIP_EXIST(reinforcementBlip[i]) REMOVE_BLIP(reinforcementBlip[i]) INFORM_MISSION_STATS_OF_INCREMENT(FBI2_KILLS) ENDIF ELSE iAlive++ ENDIF //ENDIF ENDREPEAT RETURN iAlive ENDFUNC // franklin sniping PROC HANDLE_FRANKLIN_SNIPING() INT i IF GET_GAME_TIMER() >= iRecheckFranklinShootTime BOOL bTargetIsValid[NUMBER_REINFORCEMENTS] REPEAT NUMBER_REINFORCEMENTS i IF NOT IS_PED_INJURED(reinforcementPed[i]) SWITCH i CASE 0 // WAVE_2_A bTargetIsValid[i] = FALSE BREAK CASE 1 // WAVE_2_B IF bReinforcementToShoot[i] bTargetIsValid[i] = TRUE ELSE IF GET_SYNCHRONIZED_SCENE_PHASE(iGuardSyncScene[GSS_STANDARD]) >= 0.475 bTargetIsValid[i] = TRUE ENDIF ENDIF BREAK CASE 2 // WAVE_2_C IF bReinforcementToShoot[i] bTargetIsValid[i] = TRUE ELSE IF GET_SYNCHRONIZED_SCENE_PHASE(iGuardSyncScene[GSS_STANDARD]) >= 0.328 bTargetIsValid[i] = TRUE ENDIF ENDIF BREAK CASE 3 // WAVE_2_D IF bReinforcementToShoot[i] bTargetIsValid[i] = TRUE ELSE IF GET_SYNCHRONIZED_SCENE_PHASE(iGuardSyncScene[GSS_STANDARD]) >= 0.843 bTargetIsValid[i] = TRUE ENDIF ENDIF BREAK CASE 4 // WAVE_3_A IF bReinforcementToShoot[i] bTargetIsValid[i] = TRUE ELSE IF GET_SYNCHRONIZED_SCENE_PHASE(iGuardSyncScene[GSS_REIN_FIRST_EXTRA]) >= 0.542 bTargetIsValid[i] = TRUE ENDIF ENDIF BREAK CASE 5 // WAVE_3_B bTargetIsValid[i] = FALSE BREAK CASE 6 bTargetIsValid[i] = FALSE /* // WAVE_2_D IF bReinforcementToShoot[i] bTargetIsValid[i] = TRUE ELSE IF GET_SYNCHRONIZED_SCENE_PHASE(iGuardSyncScene[GSS_REIN_THIRD_EXTRA]) >= 0.843 bTargetIsValid[i] = TRUE ENDIF ENDIF */ BREAK CASE 7 bTargetIsValid[i] = FALSE /* // WAVE_2_D IF bReinforcementToShoot[i] bTargetIsValid[i] = TRUE ELSE IF GET_SYNCHRONIZED_SCENE_PHASE(iGuardSyncScene[GSS_REIN_THIRD_EXTRA]) >= 0.843 bTargetIsValid[i] = TRUE ENDIF ENDIF */ BREAK ENDSWITCH ENDIF ENDREPEAT BOOL bFoundTarget = FALSE INT iTargetCheckCounter = 0 WHILE iTargetCheckCounter < 20 AND NOT bFoundTarget INT iRandom = GET_RANDOM_INT_IN_RANGE(0, NUMBER_REINFORCEMENTS) IF bTargetIsValid[iRandom] iFranklinTargetPed = iRandom bFoundTarget = TRUE ENDIF iTargetCheckCounter++ ENDWHILE IF NOT bFoundTarget iFranklinTargetPed = -1 iRecheckFranklinShootTime = GET_GAME_TIMER() + 2000 ELSE iRecheckFranklinShootTime = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(5000, 10000) ENDIF ELSE IF GET_GAME_TIMER() >= iNextFranklinSnipeTime IF iFranklinTargetPed >= 0 IF NOT IS_PED_INJURED(reinforcementPed[iFranklinTargetPed]) VECTOR vTargetPos = GET_ENTITY_COORDS(reinforcementPed[iFranklinTargetPed]) + <<0,0,0.5>> // apply random inaccuracy VECTOR vInaccuracy vInaccuracy.x = GET_RANDOM_FLOAT_IN_RANGE(0,0.05) vInaccuracy.y = GET_RANDOM_FLOAT_IN_RANGE(0,0.05) vInaccuracy.z = GET_RANDOM_FLOAT_IN_RANGE(0,0.05) IF GET_RANDOM_INT_IN_RANGE(0,2) = 0 vInaccuracy.x *= -1 ENDIF IF GET_RANDOM_INT_IN_RANGE(0,2) = 0 vInaccuracy.y *= -1 ENDIF IF GET_RANDOM_INT_IN_RANGE(0,2) = 0 vInaccuracy.z *= -1 ENDIF vTargetPos += vInaccuracy PLAY_SOUND_FRONTEND(-1, "Remote_Sniper_Rifle_Fire") SHOOT_SINGLE_BULLET_BETWEEN_COORDS(GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_SNIPER_AI_SHOT_ORIGIN), vTargetPos, 1000, TRUE, WEAPONTYPE_HEAVYSNIPER, PLAYER_PED_ID()) ELSE iRecheckFranklinShootTime = 0 ENDIF ELSE iRecheckFranklinShootTime = 0 ENDIF iNextFranklinSnipeTime = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(1300, 2300) ENDIF ENDIF ENDPROC CONST_FLOAT MICHAEL_TARGET_MAX_RANGE 100.0 // michael shooting PROC HANDLE_MICHAEL_SHOOTING() INT i IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL]) IF GET_GAME_TIMER() >= iRecheckMichaelShootTime // get closest enemy ped INT iClosestPed = -1 FLOAT fClosestDistance = 999999.0 FLOAT fThisDistance REPEAT COUNT_OF(reinforcementPed) i IF NOT IS_PED_INJURED(reinforcementPed[i]) fThisDistance = GET_DISTANCE_BETWEEN_ENTITIES(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], reinforcementPed[i], FALSE) IF fThisDistance < MICHAEL_TARGET_MAX_RANGE IF fThisDistance < fClosestDistance IF (bLastReinforcementIsLast OR i <> 5) AND NOT IS_ENTITY_AT_COORD(reinforcementPed[i], <<125.42207, -620.20752, 205.10718>>, <<1,1,1>>, FALSE, FALSE) //IF IS_ENTITY_IN_AREA(reinforcementPed[i], <<109.87708, -625.67480, 205.04633>>, <<124.29398, -620.27441, 205.04680>>, FALSE, FALSE) //IF IS_PED_SHOOTING(reinforcementPed[i]) IF GET_SCRIPT_TASK_STATUS(reinforcementPed[i], SCRIPT_TASK_SYNCHRONIZED_SCENE) = FINISHED_TASK OR IS_ENTITY_IN_AREA(reinforcementPed[i], <<117.89629, -623.78284, 205.04694>>, <<123.42686, -621.71790, 205.04678>>, FALSE, FALSE) iClosestPed = i fClosestDistance = fThisDistance ENDIF ENDIF ENDIF ENDIF ENDIF ENDREPEAT IF iClosestPed >= 0 IF reinforcementPed[iClosestPed] <> michaelTargetPed TASK_AIM_GUN_SCRIPTED_WITH_TARGET(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], reinforcementPed[iClosestPed], <<0,0,0>>, SCRIPTED_GUN_TASK_ON_ROPE) michaelTargetPed = reinforcementPed[iClosestPed] ENDIF iRecheckMichaelShootTime = GET_GAME_TIMER() + 2000 ELSE IF DOES_ENTITY_EXIST(michaelTargetPed) TASK_PLAY_ANIM(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], GET_SNATCH_AND_GRAB_ANIM_DICT_AS_STRING(SAG_ANIM_DICT_MISSION), "idle", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING) michaelTargetPed = NULL ENDIF iRecheckMichaelShootTime = GET_GAME_TIMER() + 1000 ENDIF ENDIF ENDIF ENDPROC // michael shooting PROC HANDLE_MICHAEL_DRIVEBY() INT i IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL]) SET_AMMO_IN_CLIP(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], GET_SNATCH_AND_GRAB_WEAPON_TYPE(SAG_WEAPON_MICHAEL_RIFLE), GET_MAX_AMMO_IN_CLIP(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], GET_SNATCH_AND_GRAB_WEAPON_TYPE(SAG_WEAPON_MICHAEL_RIFLE))) IF GET_GAME_TIMER() >= iRecheckMichaelShootTime // get closest enemy ped INT iClosestChopper = -1 FLOAT fClosestDistance = 999999.0 FLOAT fThisDistance BOOL bTakeOutFranklinChopper IF DOES_BLIP_EXIST(enemyChopperBlip[0]) OR DOES_BLIP_EXIST(enemyChopperBlip[1]) OR DOES_BLIP_EXIST(enemyChopperBlip[3]) bTakeOutFranklinChopper = FALSE ELSE bTakeOutFranklinChopper = TRUE ENDIF /* INT iCheckToChopper IF DOES_BLIP_EXIST(enemyChopperBlip[0]) AND NOT DOES_BLIP_EXIST(enemyChopperBlip[1]) AND NOT DOES_BLIP_EXIST(enemyChopperBlip[3]) iCheckToChopper = 2 ELSE iCheckToChopper = 3 ENDIF */ FOR i=0 TO 3 IF i <> 2 OR bTakeOutFranklinChopper IF DOES_BLIP_EXIST(enemyChopperBlip[i]) IF IS_VEHICLE_DRIVEABLE(enemyChopperVehicle[i]) fThisDistance = GET_DISTANCE_BETWEEN_ENTITIES(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], enemyChopperVehicle[i], FALSE) IF fThisDistance < MICHAEL_TARGET_MAX_RANGE IF fThisDistance < fClosestDistance iClosestChopper = i fClosestDistance = fThisDistance ENDIF ENDIF ENDIF ENDIF ENDIF ENDFOR IF iClosestChopper >= 0 IF enemyChopperVehicle[iClosestChopper] <> michaelTargetVehicle TASK_DRIVE_BY(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], NULL, enemyChopperVehicle[iClosestChopper], <<0,0,0>>, 1000, 100) michaelTargetVehicle = enemyChopperVehicle[iClosestChopper] ENDIF iRecheckMichaelShootTime = GET_GAME_TIMER() + 2000 ELSE IF DOES_ENTITY_EXIST(michaelTargetPed) TASK_PAUSE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], 100) michaelTargetVehicle = NULL ENDIF iRecheckMichaelShootTime = GET_GAME_TIMER() + 1000 ENDIF ENDIF ENDIF ENDPROC // franklin shooting PROC HANDLE_FRANKLIN_SHOOT_FROM_ROOF() IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN]) SET_AMMO_IN_CLIP(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], GET_SNATCH_AND_GRAB_WEAPON_TYPE(SAG_WEAPON_SNIPER_RIFLE), 6) IF GET_GAME_TIMER() >= iRecheckFranklinShootTime INT iTarget = -1 IF IS_VEHICLE_DRIVEABLE(enemyChopperVehicle[2]) iTarget = 2 ELIF IS_VEHICLE_DRIVEABLE(enemyChopperVehicle[0]) iTarget = 0 ELIF IS_VEHICLE_DRIVEABLE(enemyChopperVehicle[1]) iTarget = 1 ENDIF IF iTarget >= 0 IF enemyChopperVehicle[iTarget] <> franklinTargetVehicle TASK_SHOOT_AT_ENTITY(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], enemyChopperVehicle[iTarget], -1, FIRING_TYPE_CONTINUOUS) iRecheckFranklinShootTime = GET_GAME_TIMER() + 2000 franklinTargetVehicle = enemyChopperVehicle[iTarget] ENDIF ELSE TASK_PAUSE(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], 100) iRecheckFranklinShootTime = GET_GAME_TIMER() + 2000 ENDIF ENDIF ENDIF ENDPROC // attach michael non physically to the rope PROC ATTACH_MICHAEL_TO_ROPE(BOOL bForce = TRUE) PED_INDEX michaelPed = GET_MICHAEL_PED() IF NOT IS_PED_INJURED(michaelPed) DETACH_ENTITY(michaelPed) IF DOES_ENTITY_EXIST(harnessObject) ATTACH_ENTITY_TO_ENTITY(michaelPed, harnessObject, 0, GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_ROPE_PLAYER_SWING_ATTACH), <<0,0,0>>, TRUE) IF michaelPed = PLAYER_PED_ID() TASK_AIM_GUN_SCRIPTED(michaelPed, SCRIPTED_GUN_TASK_ON_ROPE) IF bForce FORCE_PED_AI_AND_ANIMATION_UPDATE(michaelPed) ENDIF SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0) SET_GAMEPLAY_CAM_RELATIVE_PITCH() ELSE FLOAT fBlendIn IF bForce CLEAR_PED_TASKS_IMMEDIATELY(michaelPed) fBlendIn = INSTANT_BLEND_IN ELSE fBlendIn = NORMAL_BLEND_IN ENDIF TASK_PLAY_ANIM(michaelPed, GET_SNATCH_AND_GRAB_ANIM_DICT_AS_STRING(SAG_ANIM_DICT_MISSION), "idle", fBlendIn, INSTANT_BLEND_OUT, -1, AF_LOOPING) IF bForce FORCE_PED_AI_AND_ANIMATION_UPDATE(michaelPed) ENDIF ENDIF ENDIF ENDIF ENDPROC // attach prisoner to michael PROC ATTACH_PRISONER_TO_ROPE(BOOL bForce = TRUE) IF NOT IS_PED_INJURED(prisonerPed) SET_PED_CAN_RAGDOLL(prisonerPed, FALSE) IF DOES_ENTITY_EXIST(harnessObject) VECTOR vAttach = GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_ROPE_PLAYER_SWING_ATTACH) + GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_ROPE_PRISONER_SWING_ATTACH) FLOAT fBlendIn IF bForce fBlendIn = INSTANT_BLEND_IN ELSE fBlendIn = NORMAL_BLEND_IN ENDIF ATTACH_ENTITY_TO_ENTITY(prisonerPed, harnessObject, 0, vAttach, <<0,0,0>>, TRUE) TASK_PLAY_ANIM(prisonerPed, GET_SNATCH_AND_GRAB_ANIM_DICT_AS_STRING(SAG_ANIM_DICT_MISSION), "Hang_idle_mrk", fBlendIn, INSTANT_BLEND_OUT, -1, AF_LOOPING) IF bForce FORCE_PED_AI_AND_ANIMATION_UPDATE(prisonerPed) ENDIF ENDIF ENDIF ENDPROC // start prisoner grab PROC UPDATE_PRISONER_GRAB(PRISONER_GRAB_STATE_ENUM newState) STRING sMichaelAnim STRING sPrisonerAnim STRING sMichaelDict STRING sPrisonerDict BOOL bLooping BOOL bForceIn BOOL bForceOut FLOAT fBlendIn FLOAT fBlendOut SWITCH newState CASE PRISONER_GRAB_STATE_INIT sMichaelAnim = "hostage_loop" sPrisonerAnim = "hostage_loop_mrk" sMichaelDict = GET_SNATCH_AND_GRAB_ANIM_DICT_AS_STRING(SAG_ANIM_DICT_IN_OFFICE) sPrisonerDict = GET_SNATCH_AND_GRAB_ANIM_DICT_AS_STRING(SAG_ANIM_DICT_IN_OFFICE) bLooping = TRUE bForceIn = TRUE bForceOut = FALSE BREAK CASE PRISONER_GRAB_STATE_DUCK_INTRO sMichaelAnim = "hostage_low_intro" sPrisonerAnim = "hostage_low_intro_mrk" sMichaelDict = GET_SNATCH_AND_GRAB_ANIM_DICT_AS_STRING(SAG_ANIM_DICT_IN_OFFICE) sPrisonerDict = GET_SNATCH_AND_GRAB_ANIM_DICT_AS_STRING(SAG_ANIM_DICT_IN_OFFICE) bLooping = FALSE bForceIn = FALSE bForceOut = FALSE BREAK CASE PRISONER_GRAB_STATE_DUCK_LOOPING sMichaelAnim = "hostage_loop_low" sPrisonerAnim = "hostage_loop_low_mrk" sMichaelDict = GET_SNATCH_AND_GRAB_ANIM_DICT_AS_STRING(SAG_ANIM_DICT_IN_OFFICE) sPrisonerDict = GET_SNATCH_AND_GRAB_ANIM_DICT_AS_STRING(SAG_ANIM_DICT_IN_OFFICE) bLooping = TRUE bForceIn = FALSE bForceOut = FALSE BREAK //CASE PRISONER_GRAB_STATE_DUCK_OUTRO // sMichaelAnim = "hostage_low_outro" // sPrisonerAnim = "hostage_low_outro_mrk" // bLooping = FALSE // bForceIn = FALSE // bForceOut = FALSE //BREAK CASE PRISONER_GRAB_STATE_EXTRACT sMichaelAnim = "extraction_sweep" sPrisonerAnim = "extraction_sweep_mrk" sMichaelDict = GET_SNATCH_AND_GRAB_ANIM_DICT_AS_STRING(SAG_ANIM_DICT_MISSION) sPrisonerDict = GET_SNATCH_AND_GRAB_ANIM_DICT_AS_STRING(SAG_ANIM_DICT_MISSION) bLooping = FALSE bForceIn = FALSE bForceOut = TRUE BREAK ENDSWITCH IF bForceIn fBlendIn = INSTANT_BLEND_IN ELSE fBlendIn = NORMAL_BLEND_IN ENDIF IF bForceOut fBlendOut = INSTANT_BLEND_OUT ELSE fBlendOut = NORMAL_BLEND_OUT ENDIF PED_INDEX michaelPed = GET_MICHAEL_PED() IF NOT IS_PED_INJURED(prisonerPed) VECTOR vSceneMod = <<0,0,1.05>> iSyncScene = CREATE_SYNCHRONIZED_SCENE(GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_INTERROGATION) - vSceneMod, <<0.0, 0.0, INTERROGATION_ROT>>) IF NOT IS_PED_INJURED(michaelPed) TASK_SYNCHRONIZED_SCENE(michaelPed, iSyncScene, sMichaelDict, sMichaelAnim, fBlendIn, fBlendOut) IF bForceIn FORCE_PED_AI_AND_ANIMATION_UPDATE(michaelPed) ENDIF ENDIF IF NOT IS_PED_INJURED(prisonerPed) TASK_SYNCHRONIZED_SCENE(prisonerPed, iSyncScene, sPrisonerDict, sPrisonerAnim, fBlendIn, fBlendOut) IF bForceIn FORCE_PED_AI_AND_ANIMATION_UPDATE(prisonerPed) ENDIF ENDIF SET_SYNCHRONIZED_SCENE_LOOPED(iSyncScene, bLooping) ENDIF prisonerGrabState = newState ENDPROC // window smash PROC HANDLE_WINDOW_SMASH(BOOL bDoSmashWhenPrimed, BOOL bSkipStraightToEnd = FALSE) //PRINTINT(iWindowSmashStage) PRINTNL() SWITCH iWindowSmashStage CASE 0 windowRayfire = GET_RAYFIRE_MAP_OBJECT(GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_BREAK_IN), 3, "DES_FIB_Glass") IF DOES_RAYFIRE_MAP_OBJECT_EXIST(windowRayfire) SET_STATE_OF_RAYFIRE_MAP_OBJECT(windowRayfire, RFMO_STATE_RESET) iWindowSmashStage++ ENDIF BREAK CASE 1 IF DOES_RAYFIRE_MAP_OBJECT_EXIST(windowRayfire) IF GET_STATE_OF_RAYFIRE_MAP_OBJECT(windowRayfire) = RFMO_STATE_START SET_STATE_OF_RAYFIRE_MAP_OBJECT(windowRayfire, RFMO_STATE_PRIMING) iWindowSmashStage++ ENDIF ELSE iWindowSmashStage = 0 ENDIF BREAK CASE 2 IF DOES_RAYFIRE_MAP_OBJECT_EXIST(windowRayfire) RAY_FIRE_MAP_OBJECT_STATE rayfireState rayfireState = GET_STATE_OF_RAYFIRE_MAP_OBJECT(windowRayfire) IF rayfireState = RFMO_STATE_PRIMED IF bDoSmashWhenPrimed IF NOT bSkipStraightToEnd SET_STATE_OF_RAYFIRE_MAP_OBJECT(windowRayfire, RFMO_STATE_START_ANIM) //PLAY_SOUND_FROM_COORD(iSmashSoundID, "FBI_02_SNATCH_AND_GRAB_SMASH_WINDOW", GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_WINDOW_SOUND)) iWindowSmashStage++ ELSE SET_STATE_OF_RAYFIRE_MAP_OBJECT(windowRayfire, RFMO_STATE_ENDING) iWindowSmashStage++ ENDIF ENDIF ELIF rayfireState <> RFMO_STATE_PRIMING iWindowSmashStage = 0 ENDIF ELSE iWindowSmashStage = 0 ENDIF BREAK ENDSWITCH ENDPROC // interp between 2 vals PROC INTERP_VALUE_TO_VALUE(FLOAT &fValue, FLOAT &fSpeed, FLOAT fStart, FLOAT fTarget, FLOAT fAcceleration) FLOAT fMidpoint = (fStart + fTarget) / 2 IF fTarget > fStart // speed IF fValue < fMidpoint fSpeed = fSpeed +@ fAcceleration ELSE fSpeed = fSpeed -@ fAcceleration ENDIF IF fSpeed < 0 fSpeed = 0 ENDIF // increment value fValue = fValue +@ fSpeed IF fValue > fTarget fValue = fTarget ENDIF ELSE // speed IF fValue > fMidpoint fSpeed = fSpeed -@ fAcceleration ELSE fSpeed = fSpeed +@ fAcceleration ENDIF IF fSpeed > 0 fSpeed = 0 ENDIF // increment value fValue = fValue +@ fSpeed IF fValue < fTarget fValue = fTarget ENDIF ENDIF ENDPROC // create the rappel rope PROC CREATE_CHOPPER_ROPE(ROPE_TYPE_ENUM ropeType, MISSION_STAGE_ENUM createStage = STAGE_GET_TO_CHOPPER) IF IS_VEHICLE_DRIVEABLE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) SWITCH ropeType CASE ROPE_TYPE_FURLED rappelData.rope = ADD_ROPE(GET_ENTITY_COORDS(rappelData.anchorObject), <<0.0, 90.0, 0.0>>, 40.0, PHYSICS_ROPE_THIN_WIRE_32, 0.5, 0.5, 1.2, FALSE, FALSE, TRUE, 50) ATTACH_ROPE_TO_ENTITY(rappelData.rope, snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_ROPE_ANCHOR_OFFSET)),0) START_ROPE_UNWINDING_FRONT(rappelData.rope) BREAK CASE ROPE_TYPE_CUTSCENE rappelData.rope = ADD_ROPE(<< 111.136, -617.365, 271.284 >>, <<0.0, 90.0, 0.0>>, 20.0, PHYSICS_ROPE_THIN_WIRE_32, -1, 0.5, 1.2, FALSE, FALSE, TRUE, 2) //PIN_ROPE_VERTEX(rappelData.rope, i, //ATTACH_ROPE_TO_ENTITY(rappelData.rope, snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_ROPE_ANCHOR_OFFSET)),0) BREAK CASE ROPE_TYPE_RAPPELLING CREATE_RAPPEL_ROPE(rappelData, RAPPEL_ROPE_LENGTH_LONG, TRUE, TRUE, DEFAULT_ROPE_WEIGHT, 60.7)//52.7) BREAK CASE ROPE_TYPE_INSIDE CASE ROPE_TYPE_SWINGING FLOAT fLength FLOAT fModLength FLOAT fMinLength FLOAT fWeight FLOAT fLengthChangeRate //FLOAT fSegmentLength IF createStage <> STAGE_DROPOFF fLength = RAPPEL_ROPE_LENGTH_DANGLING fModLength = RAPPEL_ROPE_LENGTH_DANGLING IF NOT bShortRope fLengthChangeRate = 2.0//1.0 fMinLength = 15.0 IF createStage < STAGE_SNIPE_GUARDS fWeight = 1.0 ELSE fWeight = 0.7 // 0.8 ENDIF ELSE fLengthChangeRate = 6.0 fMinLength = 1.3 fWeight = 15.0 ENDIF ELSE //fLength = RAPPEL_ROPE_LENGTH_WOUND //fModLength = 16.6 fLength = RAPPEL_ROPE_LENGTH_DANGLING fModLength = RAPPEL_ROPE_LENGTH_DANGLING fLengthChangeRate = 10.0 fMinLength = 15.0 fWeight = 1.0 ENDIF rappelData.rope = ADD_ROPE(GET_ENTITY_COORDS(rappelData.anchorObject), <<0.0, 90.0, 0.0>>, fModLength, PHYSICS_ROPE_THIN_WIRE_32, -1, fMinLength, fLengthChangeRate, FALSE, FALSE, TRUE, fWeight) FILL_ROPE_PROPERTIES(rappelData, fLength) //PRINTSTRING("segment length = ") PRINTFLOAT(rappelData.fRopeSegmentLength) printnl() INT i VECTOR vAnchorPos vAnchorPos = GET_ENTITY_COORDS(rappelData.anchorObject) REPEAT rappelData.iRopeVertexCount i PIN_ROPE_VERTEX(rappelData.rope, i, <>) ENDREPEAT rappelData.bAllowRopeMovement = TRUE rappelData.bRopeCreated = TRUE BREAK CASE ROPE_TYPE_DROPOFF // CREATE_RAPPEL_ROPE(rappelData, RAPPEL_ROPE_LENGTH_DROPOFF) BREAK ENDSWITCH ENDIF ENDPROC // set the rope to dangling PROC SET_ROPE_DANGLING(BOOL bForce = TRUE, BOOL bUnpin = TRUE) INT i IF bUnpin REPEAT rappelData.iRopeVertexCount i UNPIN_ROPE_VERTEX(rappelData.rope, i) ENDREPEAT ENDIF VECTOR vCreateHarness = GET_ROPE_LAST_VERTEX_COORD(rappelData.rope) //- <<0,0,2>> harnessObject = CREATE_OBJECT(GET_MODEL_FOR_SNATCH_AND_GRAB_MODEL_ENUM(SAGM_HARNESS), vCreateHarness) //hookObject = CREATE_OBJECT(GET_MODEL_FOR_SNATCH_AND_GRAB_MODEL_ENUM(SAGM_HOOK), vCreateHarness) SET_ENTITY_VISIBLE(harnessObject, FALSE) SET_ENTITY_COLLISION(harnessObject, FALSE) //ATTACH_ENTITY_TO_ENTITY(hookObject, harnessObject, 0, <<0,0,0.2>>, <<0,0,0>>) ATTACH_MICHAEL_TO_ROPE(bForce) ATTACH_PRISONER_TO_ROPE(bForce) ENDPROC // set rope physical PROC SET_ROPE_PHYSICAL() INT i IF rappelData.bRopeCreated REPEAT rappelData.iRopeVertexCount i UNPIN_ROPE_VERTEX(rappelData.rope, i) ENDREPEAT IF IS_VEHICLE_DRIVEABLE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) ATTACH_ROPE_TO_ENTITY(rappelData.rope, snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_ROPE_ANCHOR_OFFSET)), 0) // ROPE_CREATE_VIRTUAL_BOUND( rappelData.rope, snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], 2 ) //ROPE_ATTACH_VIRTUAL_BOUND_CAPSULE( rappelData.rope, 0.3, 7.5, 0, << -1.0, -0.2, -0.7 >> ) //ROPE_ATTACH_VIRTUAL_BOUND_CAPSULE( rappelData.rope, 1.3, 3.5, 1, << 0.0, -0.2, 0.0 >> ) ENDIF bRopePhysical = TRUE ENDIF ENDPROC CONST_FLOAT SHIFT_FLOAT_ACCEL 0.29 CONST_FLOAT SHIFT_FLOAT_SPEED_LIMIT 0.31 PROC SHIFT_FLOAT_TO_IDEAL_FLOAT(FLOAT &fCurrent, FLOAT fIdeal, FLOAT &fSpeed) IF fCurrent < fIdeal fSpeed = fSpeed +@ SHIFT_FLOAT_ACCEL IF fSpeed > SHIFT_FLOAT_SPEED_LIMIT fSpeed = SHIFT_FLOAT_SPEED_LIMIT ENDIF fCurrent = fCurrent +@ fSpeed ELIF fCurrent > fIdeal fSpeed = fSpeed -@ SHIFT_FLOAT_ACCEL IF fSpeed < -SHIFT_FLOAT_SPEED_LIMIT fSpeed = -SHIFT_FLOAT_SPEED_LIMIT ENDIF fCurrent = fCurrent +@ fSpeed ENDIF ENDPROC PROC SHIFT_VECTOR_TO_IDEAL_VECTOR(VECTOR &vCurrent, VECTOR vIdeal) SHIFT_FLOAT_TO_IDEAL_FLOAT(vCurrent.x, vIdeal.x, vShiftVectorSpeed.x) SHIFT_FLOAT_TO_IDEAL_FLOAT(vCurrent.y, vIdeal.y, vShiftVectorSpeed.y) SHIFT_FLOAT_TO_IDEAL_FLOAT(vCurrent.z, vIdeal.z, vShiftVectorSpeed.z) ENDPROC // get clip pos FUNC VECTOR GET_MICHAEL_CLIP_POS() PED_INDEX michaelPed = GET_MICHAEL_PED() IF NOT IS_PED_INJURED(michaelPed) PROCESS_ENTITY_ATTACHMENTS(michaelPed) //SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE(TRUE) //DRAW_DEBUG_SPHERE( GET_PED_BONE_COORDS(michaelPed, INT_TO_ENUM(PED_BONETAG, 42114), <<0,0,0>>), 0.02, 0, 0, 255) RETURN GET_PED_BONE_COORDS(michaelPed, INT_TO_ENUM(PED_BONETAG, 42114), <<0,0,0>>) ENDIF RETURN <<0,0,0>> ENDFUNC // proportion down the rope a vertex should be drawn FUNC FLOAT GET_ROPE_PROPORTION_FOR_VERTEX(INT iVertex, MISSION_STAGE_ENUM thisStage) SWITCH iVertex CASE 0 RETURN 0.0 BREAK CASE 1 RETURN 0.031465 BREAK CASE 2 RETURN 0.062912 BREAK CASE 3 RETURN 0.094346 BREAK CASE 4 RETURN 0.125768 BREAK CASE 5 RETURN 0.157177 BREAK CASE 6 RETURN 0.188572 BREAK CASE 7 RETURN 0.219954 BREAK CASE 8 RETURN 0.251322 BREAK CASE 9 RETURN 0.282676 BREAK CASE 10 RETURN 0.314017 BREAK CASE 11 RETURN 0.345343 BREAK CASE 12 RETURN 0.376657 BREAK CASE 13 RETURN 0.407956 BREAK CASE 14 RETURN 0.439242 BREAK CASE 15 RETURN 0.470513 BREAK CASE 16 RETURN 0.501771 BREAK CASE 17 RETURN 0.533015 BREAK CASE 18 RETURN 0.564245 BREAK CASE 19 RETURN 0.595462 BREAK CASE 20 RETURN 0.626664 BREAK CASE 21 RETURN 0.657853 BREAK CASE 22 RETURN 0.689027 BREAK CASE 23 RETURN 0.720188 BREAK CASE 24 RETURN 0.751334 BREAK CASE 25 RETURN 0.782467 BREAK CASE 26 RETURN 0.813585 BREAK CASE 27 RETURN 0.844690 BREAK CASE 28 IF thisStage < STAGE_SNIPE_GUARDS RETURN 0.875780 ELSE RETURN 0.855780 ENDIF BREAK CASE 29 IF thisStage < STAGE_SNIPE_GUARDS RETURN 0.906856 ELSE RETURN 0.886856 ENDIF BREAK CASE 30 IF thisStage < STAGE_SNIPE_GUARDS RETURN 0.937918 ELSE RETURN 0.917918 ENDIF BREAK CASE 31 RETURN 0.968966 BREAK CASE 32 RETURN 1.000 BREAK ENDSWITCH RETURN 0.0 ENDFUNC // position for rope vertex PROC DRAW_ROPE_TO_POINT(BOOL bToRopeEnd, VECTOR vRopeEndPos, BOOL bApplyAnchorModifierForCut = FALSE, BOOL bForceRopePin = FALSE, BOOL bUseChopperAsAnchor = FALSE) //SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE(TRUE) IF rappelData.bRopeCreated IF IS_VEHICLE_DRIVEABLE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) PED_INDEX michaelPed = GET_MICHAEL_PED() IF NOT IS_PED_INJURED(michaelPed) INT i VECTOR vClipPos IF NOT bToRopeEnd vClipPos = GET_MICHAEL_CLIP_POS() ELSE vClipPos = vRopeEndPos ENDIF VECTOR vWindowPos IF currentMissionStage < STAGE_SNIPE_GUARDS OR bForceRopePin vWindowPos = GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_WINDOW_FRAME) ELSE vWindowPos = GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_WINDOW_FRAME_2) ENDIF VECTOR vAnchorPos = GET_ENTITY_COORDS(rappelData.anchorObject) IF bUseChopperAsAnchor vAnchorPos = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_ROPE_ANCHOR_OFFSET)) ENDIF IF bApplyAnchorModifierForCut vAnchorPos += <<0,-1,0>> ENDIF VECTOR vClipToAnchor = vClipPos - vAnchorPos VECTOR vWindowToAnchor = vWindowPos - vAnchorPos INT iVerticesToWindow = rappelData.iRopeVertexCount-2 //INT iVerticesToClip = rappelData.iRopeVertexCount-1 VECTOR vModClipToAnchor VECTOR vModWindowToAnchor = vWindowToAnchor / <> REPEAT rappelData.iRopeVertexCount i IF i=0 PIN_ROPE_VERTEX(rappelData.rope, i, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_ROPE_ANCHOR_OFFSET))) ELIF i=rappelData.iRopeVertexCount-1 PIN_ROPE_VERTEX(rappelData.rope, i, vClipPos) ELSE VECTOR vPosToWindow VECTOR vPosToClip VECTOR vDistBetweenWindowAndClip VECTOR vPhasedTransition BOOL bSet = FALSE // fully to window IF fRopeTransitionPhase > 0.0 FLOAT fProportion fProportion = GET_ROPE_PROPORTION_FOR_VERTEX(i, currentMissionStage) vModClipToAnchor = vClipToAnchor * <<-fProportion, -fProportion, -fProportion>> vPosToClip = <> IF fRopeTransitionPhase = 1.0 vPhasedTransition = vPosToClip bSet = TRUE ENDIF ENDIF IF fRopeTransitionPhase < 1.0 vPosToWindow = <> IF fRopeTransitionPhase = 0.0 vPhasedTransition = vPosToWindow bSet = TRUE ENDIF ENDIF IF NOT bSet vDistBetweenWindowAndClip = vPosToClip - vPosToWindow vPhasedTransition = vPosToWindow + (vDistBetweenWindowAndClip * fRopeTransitionPhase) ENDIF IF currentMissionStage < STAGE_SNIPE_GUARDS OR bForceRopePin PIN_ROPE_VERTEX(rappelData.rope, i, vPhasedTransition) ELSE IF i < 31 IF prisonerGrabState < PRISONER_GRAB_STATE_EXTRACT OR fRopeTransitionPhase < 0.3 PIN_ROPE_VERTEX(rappelData.rope, i, vPhasedTransition) ELSE UNPIN_ROPE_VERTEX(rappelData.rope, i) ENDIF ELIF i < 30 //UNPIN_ROPE_VERTEX(rappelData.rope, i) ELSE IF prisonerGrabState >= PRISONER_GRAB_STATE_EXTRACT // UNPIN_ROPE_VERTEX(rappelData.rope, i) ELSE // PIN_ROPE_VERTEX(rappelData.rope, i, vPhasedTransition) ENDIF ENDIF ENDIF ENDIF //DRAW_DEBUG_SPHERE(GET_ROPE_VERTEX_COORD(rappelData.rope, i), 0.05) ENDREPEAT ENDIF ENDIF ENDIF ENDPROC // 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 // draw the rappel rope PROC HANDLE_CHOPPER_ROPE(ROPE_TYPE_ENUM ropeType) INT i PED_INDEX michaelPed = GET_MICHAEL_PED() SWITCH ropeType CASE ROPE_TYPE_FURLED BREAK CASE ROPE_TYPE_RAPPELLING HANDLE_RAPPEL_ROPE(rappelData) BREAK CASE ROPE_TYPE_INSIDE DRAW_ROPE_TO_POINT(FALSE, <<0,0,0>>) BREAK CASE ROPE_TYPE_SWINGING IF DOES_ENTITY_EXIST(harnessObject) AND DOES_ROPE_EXIST(rappelData.rope) VECTOR vRopeEndPos vRopeEndPos = GET_ROPE_LAST_VERTEX_COORD(rappelData.rope) // handle the rope if not physical IF NOT bRopePhysical IF bSwingingRight SHIFT_VECTOR_TO_IDEAL_VECTOR(vRopeEndPos, GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_WINDOW_SWING_RIGHT)) IF GET_DISTANCE_BETWEEN_COORDS(vRopeEndPos, GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_WINDOW_SWING_RIGHT)) < 0.4 bSwingingRight = FALSE ENDIF ELSE SHIFT_VECTOR_TO_IDEAL_VECTOR(vRopeEndPos, GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_WINDOW_SWING_LEFT)) IF GET_DISTANCE_BETWEEN_COORDS(vRopeEndPos, GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_WINDOW_SWING_LEFT)) < 0.4 bSwingingRight = TRUE ENDIF ENDIF //Matt B test for 831987 - Adding a jolt when shooting. Needs to be gone through before implementing. IF prisonerGrabState = PRISONER_GRAB_STATE_DANGLING AND currentMissionStage = STAGE_SNIPE_GUARDS IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL IF IS_PED_SHOOTING(PLAYER_PED_ID()) AND GET_GAME_TIMER() >= iNextKickbackTime AND NOT IS_SPECIAL_ABILITY_ACTIVE(PLAYER_ID()) //Calculate kickback direction VECTOR vKickbackDir, vCamRot vCamRot = GET_GAMEPLAY_CAM_ROT() vKickBackDir = <> vCurrentKickBackForce += vKickbackDir * <<1,1,1>> iNextKickbackTime = GET_GAME_TIMER() + 100 ENDIF ENDIF CONST_FLOAT KICKBACK_FORCE_DEPLETE_SPEED 5.0//13.75 CONST_FLOAT KICKBACK_OFFSET_DEPLETE_SPEED 2.0 // reduce force IF vCurrentKickBackForce.x > 0 vCurrentKickBackForce.x = vCurrentKickBackForce.x -@ KICKBACK_FORCE_DEPLETE_SPEED IF vCurrentKickBackForce.x < 0 vCurrentKickBackForce.x = 0 ENDIF ELIF vCurrentKickBackForce.x < 0 vCurrentKickBackForce.x = vCurrentKickBackForce.x +@ KICKBACK_FORCE_DEPLETE_SPEED IF vCurrentKickBackForce.x > 0 vCurrentKickBackForce.x = 0 ENDIF ENDIF IF vCurrentKickBackForce.y > 0 vCurrentKickBackForce.y = vCurrentKickBackForce.y -@ KICKBACK_FORCE_DEPLETE_SPEED IF vCurrentKickBackForce.y < 0 vCurrentKickBackForce.y = 0 ENDIF ELIF vCurrentKickBackForce.y < 0 vCurrentKickBackForce.y = vCurrentKickBackForce.y +@ KICKBACK_FORCE_DEPLETE_SPEED IF vCurrentKickBackForce.y > 0 vCurrentKickBackForce.y = 0 ENDIF ENDIF vCurrentKickBackForce.z = 0 //PRINTSTRING("kickback force = ") PRINTVECTOR(vCurrentKickBackForce) PRINTNL() //PRINTSTRING("kickback offset = ") PRINTVECTOR(vCurrentKickBackOffset) PRINTNL() vRopeEndPos.x = vRopeEndPos.x +@ vCurrentKickBackForce.x vRopeEndPos.y = vRopeEndPos.y +@ vCurrentKickBackForce.y ENDIF DRAW_ROPE_TO_POINT(TRUE, vRopeEndPos) ENDIF IF NOT IS_PED_INJURED(michaelPed) VECTOR vClipOffsetFromRoot VECTOR vClipPos vClipPos = GET_MICHAEL_CLIP_POS() vClipOffsetFromRoot = GET_ENTITY_COORDS(michaelPed) - vClipPos SET_ENTITY_COORDS_NO_OFFSET(harnessObject, vRopeEndPos + vClipOffsetFromRoot) ENDIF IF IS_VEHICLE_DRIVEABLE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) SET_ENTITY_ROTATION(harnessObject, <<0,0,fRopeAttachHeading>>) //printstring("heading = ") printfloat(fRopeAttachHeading) PRINTNL() ENDIF ENDIF BREAK CASE ROPE_TYPE_DROPOFF IF rappelData.bRopeCreated IF IS_VEHICLE_DRIVEABLE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) PIN_ROPE_VERTEX(rappelData.rope, 0, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_ROPE_ANCHOR_OFFSET))) IF NOT rappelData.bAllowRopeMovement FOR i=1 TO rappelData.iRopeVertexCount-2 UNPIN_ROPE_VERTEX(rappelData.rope, i) ENDFOR rappelData.bAllowRopeMovement = TRUE ENDIF IF NOT IS_PED_INJURED(michaelPed) VECTOR vVelocity VECTOR vRoot vVelocity = GET_ENTITY_VELOCITY(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) * GET_FRAME_TIME() vRoot = GET_PED_BONE_COORDS(michaelPed, BONETAG_ROOT, <<0,0,0>>) + vVelocity PIN_ROPE_VERTEX(rappelData.rope, rappelData.iRopeVertexCount-1, vRoot) ENDIF ENDIF ENDIF BREAK ENDSWITCH ENDPROC /* // is a coord intersecting the rotor blades? FUNC BOOL IS_COORD_INTERSECTING_ROTOR_BLADES(VECTOR vCoord, VEHICLE_INDEX chopperVehicle) IF IS_VEHICLE_DRIVEABLE(chopperVehicle) VECTOR vOffsetFromChopper = GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(chopperVehicle, vCoord) BOOL bIntersectingBlades = TRUE // check Z IF vOffsetFromChopper.z >= 2.3//2.3 OR vOffsetFromChopper.z <= 1.7//1.7 bIntersectingBlades = FALSE ENDIF // check X IF bIntersectingBlades IF vOffsetFromChopper.x >= 4.3 OR vOffsetFromChopper.x <= -4.3 bIntersectingBlades = FALSE ENDIF ENDIF // check Y IF bIntersectingBlades IF vOffsetFromChopper.y >= 4.3 OR vOffsetFromChopper.y <= -4.3 bIntersectingBlades = FALSE ENDIF ENDIF RETURN bIntersectingBlades ENDIF RETURN FALSE ENDFUNC // check knockoff PROC CHECK_KNOCKOFF_FOR_CHOPPER_ROTORS(VEHICLE_INDEX chopperVehicle) IF IS_VEHICLE_DRIVEABLE(chopperVehicle) PED_INDEX michaelPed = GET_MICHAEL_PED() IF NOT IS_PED_INJURED(michaelPed) // if player is intersecting rotors IF IS_COORD_INTERSECTING_ROTOR_BLADES(GET_ENTITY_COORDS(michaelPed), chopperVehicle) // DO_KNOCKOFF() ENDIF // if rope is intersecting rotors INT i FOR i=2 TO GET_ROPE_VERTEX_COUNT(rappelData.rope) - 1 IF IS_COORD_INTERSECTING_ROTOR_BLADES(GET_ROPE_VERTEX_COORD(rappelData.rope, i), chopperVehicle) //PRINTSTRING("knocking off ") PRINTINT(i) PRINTNL() //PRINTVECTOR(GET_ROPE_VERTEX_COORD(rappelData.rope, i)) PRINTNL() //DO_KNOCKOFF(TRUE) ENDIF ENDFOR //PRINTSTRING("offset = ") PRINTVECTOR(vOffsetFromChopper) PRINTNL() //PRINTSTRING("rotorPos = ") PRINTVECTOR(GET_WORLD_POSITION_OF_ENTITY_BONE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], 7)) PRINTNL() //PRINTSTRING("rootPos = ") PRINTVECTOR(GET_WORLD_POSITION_OF_ENTITY_BONE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], 0)) PRINTNL() ENDIF ENDIF ENDPROC */ // move the last player vehicle if at coord PROC CLEAR_INIT_POS(VECTOR vCheckPos) CLEAR_AREA(vCheckPos, CLEAR_POS_RADIUS, TRUE) ENDPROC // give player the pistol for the mission PROC GIVE_PLAYER_MISSION_PISTOL(BOOL bNPC = FALSE, BOOL bForceIntoHand = TRUE) PED_INDEX pistolPed IF NOT bNPC pistolPed = PLAYER_PED_ID() ELSE pistolPed = sSelectorPeds.pedID[SELECTOR_PED_MICHAEL] ENDIF WEAPON_TYPE missionPistol = GET_SNATCH_AND_GRAB_WEAPON_TYPE(SAG_WEAPON_MICHAEL_PISTOL) CONST_INT MISSION_AMMO 160 IF NOT IS_PED_INJURED(pistolPed) IF NOT HAS_PED_GOT_WEAPON(pistolPed, missionPistol) GIVE_WEAPON_TO_PED(pistolPed, missionPistol, MISSION_AMMO, bForceIntoHand) ELSE INT iAmmo = GET_AMMO_IN_PED_WEAPON(pistolPed, missionPistol) IF iAmmo < MISSION_AMMO ADD_AMMO_TO_PED(pistolPed, missionPistol, MISSION_AMMO - iAmmo) ENDIF SET_CURRENT_PED_WEAPON(pistolPed, missionPistol, bForceIntoHand) ENDIF ENDIF ENDPROC // set next random speech time PROC SET_NEXT_RANDOM_SPEECH_TIME(INT iTime = -1) IF iTime >= 0 // if supplied an argument, set it to that iNextRandomSpeechTime = GET_GAME_TIMER() + iTime ELSE iNextRandomSpeechTime = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(MIN_RANDOM_SPEECH_TIME, MAX_RANDOM_SPEECH_TIME) ENDIF ENDPROC // handle random speech PROC DO_RANDOM_SPEECH(STRING sSpeech, INT iNextTime = -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) SET_NEXT_RANDOM_SPEECH_TIME(iNextTime) ENDIF ENDIF ENDPROC /* // position player at init pos for mission PROC POSITION_PLAYER_AT_MISSION_INIT(BOOL bRepositionConveniently) IF NOT IS_PED_INJURED(PLAYER_PED_ID()) IF NOT bRepositionConveniently //SET_ENTITY_COORDS(PLAYER_PED_ID(), GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_PLAYER_INIT)) //SET_ENTITY_HEADING(PLAYER_PED_ID(), PLAYER_INIT_ROT) ELSE CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID()) SET_ENTITY_COORDS(PLAYER_PED_ID(), GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_PLAYER_INIT2)) SET_ENTITY_HEADING(PLAYER_PED_ID(), PLAYER_INIT_ROT2) FORCE_PED_MOTION_STATE(PLAYER_PED_ID(), MS_ON_FOOT_IDLE, TRUE, FAUS_CUTSCENE_EXIT) SET_GAMEPLAY_CAM_RELATIVE_HEADING() ENDIF ENDIF ENDPROC */ // position dave at init pos PROC POSITION_DAVE_AT_MISSION_INIT(BOOL bRepositionConveniently) IF NOT IS_PED_INJURED(davePed) CLEAR_PED_TASKS_IMMEDIATELY(davePed) IF NOT bRepositionConveniently SET_ENTITY_COORDS(davePed, GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_DAVE_INIT)) SET_ENTITY_HEADING(davePed, DAVE_INIT_ROT) ELSE SET_ENTITY_COORDS(davePed, GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_DAVE_INIT2)) SET_ENTITY_HEADING(davePed, DAVE_INIT_ROT2) ENDIF //FORCE_PED_MOTION_STATE(davePed, MS_ON_FOOT_IDLE, TRUE, FAUS_CUTSCENE_EXIT) ENDIF ENDPROC // set steve seated PROC SET_STEVE_SEATED(BOOL bPreCutscene) IF NOT bSteveSeated iSteveSyncScene = CREATE_SYNCHRONIZED_SCENE(<<148.31, -677.19, 41.02>>, <<0,0,0>>) IF NOT IS_PED_INJURED(stevePed) STRING sAnim IF bPreCutscene sAnim = "FBI_2_INT_LeadInOut_loop_Steve" ELSE sAnim = "FBI_2_INT_LeadOut_action_Steve" ENDIF TASK_SYNCHRONIZED_SCENE(stevePed, iSteveSyncScene, GET_SNATCH_AND_GRAB_ANIM_DICT_AS_STRING(SAG_ANIM_DICT_FOOD_COURT), sAnim, INSTANT_BLEND_IN, NORMAL_BLEND_OUT, SYNCED_SCENE_USE_PHYSICS | SYNCED_SCENE_DONT_INTERRUPT, steveRagdollBlocking) IF bPreCutscene SET_SYNCHRONIZED_SCENE_LOOPED(iSteveSyncScene, TRUE) ELSE SET_SYNCHRONIZED_SCENE_LOOPED(iSteveSyncScene, FALSE) ENDIF FORCE_PED_AI_AND_ANIMATION_UPDATE(stevePed) ENDIF bSteveSeated = TRUE ENDIF ENDPROC // set andreas seated PROC SET_ANDREAS_SEATED(BOOL bPreCutscene) IF NOT bAndreasSeated iAndreasSyncScene = CREATE_SYNCHRONIZED_SCENE(<<148.31, -677.19, 41.02>>, <<0,0,0>>) IF NOT IS_PED_INJURED(andreasPed) STRING sAnim IF bPreCutscene sAnim = "FBI_2_INT_LeadInOut_loop_Andreas" ELSE sAnim = "FBI_2_INT_LeadOut_action_Andreas" ENDIF TASK_SYNCHRONIZED_SCENE(andreasPed, iAndreasSyncScene, GET_SNATCH_AND_GRAB_ANIM_DICT_AS_STRING(SAG_ANIM_DICT_FOOD_COURT), sAnim, INSTANT_BLEND_IN, NORMAL_BLEND_OUT, SYNCED_SCENE_USE_PHYSICS | SYNCED_SCENE_DONT_INTERRUPT, steveRagdollBlocking) IF bPreCutscene SET_SYNCHRONIZED_SCENE_LOOPED(iAndreasSyncScene, TRUE) ELSE SET_SYNCHRONIZED_SCENE_LOOPED(iAndreasSyncScene, FALSE) ENDIF FORCE_PED_AI_AND_ANIMATION_UPDATE(andreasPed) ENDIF bAndreasSeated = TRUE ENDIF ENDPROC // set andreas seated PROC SET_DAVE_SEATED() IF NOT bDaveSeated iDaveSyncScene = CREATE_SYNCHRONIZED_SCENE(<<148.31, -677.19, 41.02>>, <<0,0,0>>) IF NOT IS_PED_INJURED(davePed) TASK_SYNCHRONIZED_SCENE(davePed, iDaveSyncScene, GET_SNATCH_AND_GRAB_ANIM_DICT_AS_STRING(SAG_ANIM_DICT_FOOD_COURT), "FBI_2_INT_LeadInOut_loop_DaveN", INSTANT_BLEND_IN, NORMAL_BLEND_OUT, SYNCED_SCENE_USE_PHYSICS | SYNCED_SCENE_DONT_INTERRUPT, steveRagdollBlocking) SET_SYNCHRONIZED_SCENE_LOOPED(iDaveSyncScene, TRUE) FORCE_PED_AI_AND_ANIMATION_UPDATE(davePed) ENDIF bDaveSeated = TRUE ENDIF ENDPROC // set steve and andreas loop PROC SET_STEVE_AND_ANDREAS_LOOP() IF NOT bLoopSteveAndAndreas iFoodCourtSyncScene = CREATE_SYNCHRONIZED_SCENE(<<148.31, -677.19, 41.02>>, <<0,0,0>>) SET_SYNCHRONIZED_SCENE_LOOPED(iFoodCourtSyncScene, TRUE) IF NOT IS_PED_INJURED(stevePed) TASK_SYNCHRONIZED_SCENE(stevePed, iFoodCourtSyncScene, GET_SNATCH_AND_GRAB_ANIM_DICT_AS_STRING(SAG_ANIM_DICT_FOOD_COURT), "FBI_2_INT_LeadInOut_loop_steve", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, SYNCED_SCENE_USE_PHYSICS | SYNCED_SCENE_DONT_INTERRUPT, steveRagdollBlocking) ENDIF IF NOT IS_PED_INJURED(andreasPed) TASK_SYNCHRONIZED_SCENE(andreasPed, iFoodCourtSyncScene, GET_SNATCH_AND_GRAB_ANIM_DICT_AS_STRING(SAG_ANIM_DICT_FOOD_COURT), "FBI_2_INT_LeadInOut_loop_ANDREAS", REALLY_SLOW_BLEND_IN, NORMAL_BLEND_OUT, SYNCED_SCENE_USE_PHYSICS | SYNCED_SCENE_DONT_INTERRUPT, steveRagdollBlocking) ENDIF iLoopSteveAndAndreasTime = GET_GAME_TIMER() bLoopSteveAndAndreas = TRUE ENDIF ENDPROC // grab and freeze food court PROC UPDATE_FOOD_COURT(BOOL bForCutscene, MISSION_STAGE_ENUM forStage) VECTOR vActualPos VECTOR vDesiredPos VECTOR vDesiredRot STRING sChairRegister MODEL_NAMES chairModel BOOL bRegister BOOL bFreeze INT i REPEAT NUMBER_FOOD_COURT_CHAIRS i BOOL bNewlyGrabbed = FALSE SWITCH i CASE 0 sChairRegister = "prop_chair_01a" vActualPos = << 147.8187, -677.8579, 41.0298 >> // bottom vDesiredPos = << 147.4805, -677.4504, 41.0238 >> vDesiredRot = << 0, 0, 100.84 >> bRegister = TRUE bFreeze = TRUE chairModel = prop_chair_01a BREAK CASE 1 sChairRegister = "prop_chair_01a^1" vActualPos = << 149.2163, -677.5004, 41.0282 >> // right vDesiredPos = << 149.0850, -676.7021, 41.0238 >> vDesiredRot = << 0, 0, -62.4523 >> bRegister = TRUE IF forStage = STAGE_FOOD_COURT bFreeze = TRUE ELSE bFreeze = FALSE ENDIF chairModel = prop_chair_01a BREAK CASE 2 sChairRegister = "prop_chair_01a^2" vActualPos = << 148.6975, -676.0681, 41.0299 >> // top vDesiredPos = << 147.8508, -676.3236, 41.0238 >> vDesiredRot = << 0, 0, 36.0963 >> bRegister = TRUE bFreeze = TRUE chairModel = prop_chair_01a BREAK CASE 3 sChairRegister = "prop_chair_01a^3" vActualPos = << 147.4372, -676.6362, 41.0288 >> // left vDesiredPos = << 148.673, -678.057, 41.0239 >> vDesiredRot = << 0, 0, -138.767 >> bRegister = TRUE IF forStage = STAGE_FOOD_COURT bFreeze = TRUE ELSE bFreeze = FALSE ENDIF chairModel = prop_chair_01a BREAK CASE 4 vActualPos = << 148.3025, -677.1946, 41.0219 >> vDesiredPos = << 148.305, -677.189, 41.0206 >> vDesiredRot = << 0, 0, -60.1606 >> bRegister = FALSE bFreeze = TRUE chairModel = prop_table_07 BREAK CASE 5 vActualPos = << 149.2603, -675.4150, 41.0215 >> vDesiredPos = << 149.2603, -675.4150, 41.0215 >> vDesiredRot = << 0, 0, 30.87 >> bRegister = FALSE bFreeze = TRUE chairModel = prop_parasol_01 BREAK CASE 6 vActualPos = << 143.2394, -678.7330, 41.0230 >> vDesiredPos = << 143.2394, -678.7330, 41.0230 >> vDesiredRot = << 0, 0, -72.56 >> bRegister = FALSE bFreeze = TRUE chairModel = prop_parasol_01 BREAK ENDSWITCH IF NOT DOES_ENTITY_EXIST(foodCourtChairObject[i]) foodCourtChairObject[i] = GET_CLOSEST_OBJECT_OF_TYPE(vActualPos, 0.3, chairModel) bNewlyGrabbed = TRUE ENDIF IF DOES_ENTITY_EXIST(foodCourtChairObject[i]) //printstring("got food court ") printint(i) printnl() IF bForCutscene IF bRegister FREEZE_ENTITY_POSITION(foodCourtChairObject[i], FALSE) REGISTER_ENTITY_FOR_CUTSCENE(foodCourtChairObject[i], sChairRegister, CU_ANIMATE_EXISTING_SCRIPT_ENTITY, chairModel) ENDIF ELSE IF bNewlyGrabbed SET_ENTITY_COORDS(foodCourtChairObject[i], vDesiredPos) SET_ENTITY_ROTATION(foodCourtChairObject[i], vDesiredRot) IF bFreeze FREEZE_ENTITY_POSITION(foodCourtChairObject[i], TRUE) ELSE FREEZE_ENTITY_POSITION(foodCourtChairObject[i], FALSE) ENDIF ENDIF ENDIF ENDIF ENDREPEAT 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_FOOD_COURT CASE STAGE_GET_TO_CHOPPER CASE STAGE_GET_TO_BUILDING CASE STAGE_RAPPEL_DOWN CASE STAGE_SNIPE_GUARDS CASE STAGE_CHOPPER_CHASE CASE STAGE_DROPOFF RETURN TRUE BREAK ENDSWITCH RETURN FALSE ENDFUNC // clear the start area PROC CLEAR_START_AREA() // clear init areas CLEAR_INIT_POS(GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_PLAYER_INIT)) CLEAR_INIT_POS(GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_DAVE_INIT)) CLEAR_INIT_POS(GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_MICHAEL_CAR_INIT)) //CLEAR_INIT_POS(<<86.03587, -665.29846, 44.30413>>) CLEAR_AREA(<<86.04990, -665.26123, 43.10414>>, 5, TRUE) //WAIT(0) ENDPROC /* // michael into car PROC SET_MICHAEL_INTO_CAR() IF NOT bForceIntoCar IF IS_VEHICLE_DRIVEABLE(snatchAndGrabVehicle[SAGV_MICHAEL_CAR]) AND NOT IS_PED_INJURED(PLAYER_PED_ID()) TASK_ENTER_VEHICLE(PLAYER_PED_ID(), snatchAndGrabVehicle[SAGV_MICHAEL_CAR], DEFAULT_TIME_BEFORE_WARP, VS_DRIVER, PEDMOVEBLENDRATIO_WALK) bForceIntoCar = TRUE ENDIF ENDIF ENDPROC */ // force chopper up PROC FORCE_CHOPPER_UP() // force chopper up IF bDoForceHeliUpwards IF GET_GAME_TIMER() >= iForceHeliUpwardsTime + 1300 bDoForceHeliUpwards = FALSE ELSE IF IS_VEHICLE_DRIVEABLE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) APPLY_FORCE_TO_ENTITY(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], APPLY_TYPE_EXTERNAL_FORCE, <<0,0,1>>, <<0,1,0>>, 0, TRUE, TRUE, TRUE) ENDIF ENDIF ENDIF ENDPROC // setup the rifle PROC SETUP_SNIPER_RIFLE(BOOL bTweakAim, BOOL bMoveOut) PED_INDEX franklinPed = GET_FRANKLIN_PED() IF NOT IS_PED_INJURED(franklinPed) SET_CURRENT_PED_WEAPON(franklinPed, GET_SNATCH_AND_GRAB_WEAPON_TYPE(SAG_WEAPON_SNIPER_RIFLE), TRUE) PRINTSTRING("setting rifle as current from CUTSCENE SWITCH!") PRINTNL() ENDIF IF NOT bMoveOut SET_FIRST_PERSON_AIM_CAM_ZOOM_FACTOR(INIT_SNIPER_ZOOM) SET_GAMEPLAY_CAM_RELATIVE_PITCH(-2.7) IF bTweakAim SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.3) ELSE SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0) ENDIF ELSE SET_FIRST_PERSON_AIM_CAM_ZOOM_FACTOR(1.0) SET_GAMEPLAY_CAM_RELATIVE_PITCH(4.0) SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0) ENDIF ENDPROC // mr k agitated PROC DO_MR_K_AGITATED_ANIM() IF NOT IS_PED_INJURED(prisonerPed) TASK_PLAY_ANIM(prisonerPed, GET_SNATCH_AND_GRAB_ANIM_DICT_AS_STRING(SAG_ANIM_DICT_FLY_HOME), "mrk_in_chopper", INSTANT_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING) ENDIF ENDPROC // set mike custom driveby in chopper PROC SET_MICHAEL_CUSTOM_DRIVEBY_IN_CHOPPER() PED_INDEX michaelPed = GET_MICHAEL_PED() IF NOT IS_PED_INJURED(michaelPed) AND IS_VEHICLE_DRIVEABLE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) SET_PED_INTO_VEHICLE(michaelPed, snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], VS_BACK_LEFT) SET_PED_IN_VEHICLE_CONTEXT(michaelPed, GET_HASH_KEY("MISSFBI2_MICHAEL_DRIVEBY")) SET_PED_DRIVE_BY_CLIPSET_OVERRIDE(michaelPed, "clipset@missfbi2_driveby") ENDIF ENDPROC CONST_FLOAT START_CAM_CHANGE_Z 40.0 CONST_FLOAT END_CAM_CHANGE_Z 50.0 // custom rappel cam PROC APPLY_CUSTOM_RAPPEL_CAM() // calculate the properties for the cam // distance down FLOAT fDistanceDown = (rappelData.vAttachPos.z * -1) - START_RAPPEL_Z /* IF fDistanceDown < START_CAM_CHANGE_Z fPhaseDown = 0.0 ELSE fPhaseDown = ((fDistanceDown - START_CAM_CHANGE_Z) / (END_CAM_CHANGE_Z - START_CAM_CHANGE_Z)) ENDIF //PRINTSTRING("phasedown = ") PRINTFLOAT(fPhaseDown) PRINTNL() //PRINTSTRING("distancedown = ") PRINTFLOAT(fDistanceDown) PRINTNL() IF fPhaseDown < 0 fPhaseDown = 0 ELIF fPhaseDown > 1 fPhaseDown = 1 ENDIF */ IF fDistanceDown >= 45.0 IF fRappelCamTransitionPhase < 0.7 fRappelCamTransitionPhaseSpeed = fRappelCamTransitionPhaseSpeed +@ 0.07 IF fRappelCamTransitionPhaseSpeed > 0.14 fRappelCamTransitionPhaseSpeed = 0.14 ENDIF ELSE fRappelCamTransitionPhaseSpeed = fRappelCamTransitionPhaseSpeed -@ 0.038 IF fRappelCamTransitionPhaseSpeed < 0 fRappelCamTransitionPhaseSpeed = 0 ENDIF ENDIF fRappelCamTransitionPhase = fRappelCamTransitionPhase +@ fRappelCamTransitionPhaseSpeed ENDIF IF fRappelCamTransitionPhase < 0 fRappelCamTransitionPhase = 0 ELIF fRappelCamTransitionPhase > 1 fRappelCamTransitionPhase = 1 ENDIF CONST_FLOAT RAPPEL_CAM_Z_SPEED 2.0 CONST_FLOAT RAPPEL_CAM_Z_INPUT_TO_HEIGHT_FACTOR 0.02 FLOAT fRappelCamDefaultHeading FLOAT fRappelCamYDist FLOAT fRappelCamZDist FLOAT fRappelCamClockwiseLimit FLOAT fRappelCamAnticlockwiseLimit #IF IS_DEBUG_BUILD IF NOT bDebugUseAlternateRappelCam #ENDIF CONST_FLOAT ALT_RAPPEL_CAM_DEFAULT_HEADING_TOP -83.0 CONST_FLOAT ALT_RAPPEL_CAM_Y_DIST_TOP -4.5//-3.5//-4.5 CONST_FLOAT ALT_RAPPEL_CAM_Z_DIST_TOP 2.8 CONST_FLOAT ALT_RAPPEL_CAM_CLOCKWISE_LIMIT_TOP 10.0 CONST_FLOAT ALT_RAPPEL_CAM_ANTICLOCKWISE_LIMIT_TOP 170.0 CONST_FLOAT ALT_RAPPEL_CAM_DEFAULT_HEADING_BOTTOM -18.0//-75.0 CONST_FLOAT ALT_RAPPEL_CAM_Y_DIST_BOTTOM -4.0//-4.0//-4.5 CONST_FLOAT ALT_RAPPEL_CAM_Z_DIST_BOTTOM 2.0//1.0 CONST_FLOAT ALT_RAPPEL_CAM_CLOCKWISE_LIMIT_BOTTOM 60.0 CONST_FLOAT ALT_RAPPEL_CAM_ANTICLOCKWISE_LIMIT_BOTTOM 90.0 fRappelCamDefaultHeading = ALT_RAPPEL_CAM_DEFAULT_HEADING_TOP + ((ALT_RAPPEL_CAM_DEFAULT_HEADING_BOTTOM - ALT_RAPPEL_CAM_DEFAULT_HEADING_TOP) * fRappelCamTransitionPhase) fRappelCamYDist = ALT_RAPPEL_CAM_Y_DIST_TOP + ((ALT_RAPPEL_CAM_Y_DIST_BOTTOM - ALT_RAPPEL_CAM_Y_DIST_TOP) * fRappelCamTransitionPhase) fRappelCamZDist = ALT_RAPPEL_CAM_Z_DIST_TOP + ((ALT_RAPPEL_CAM_Z_DIST_BOTTOM - ALT_RAPPEL_CAM_Z_DIST_TOP) * fRappelCamTransitionPhase) fRappelCamClockwiseLimit = ALT_RAPPEL_CAM_CLOCKWISE_LIMIT_TOP + ((ALT_RAPPEL_CAM_CLOCKWISE_LIMIT_BOTTOM - ALT_RAPPEL_CAM_CLOCKWISE_LIMIT_TOP) * fRappelCamTransitionPhase) fRappelCamAnticlockwiseLimit = ALT_RAPPEL_CAM_ANTICLOCKWISE_LIMIT_TOP + ((ALT_RAPPEL_CAM_ANTICLOCKWISE_LIMIT_BOTTOM - ALT_RAPPEL_CAM_ANTICLOCKWISE_LIMIT_TOP) * fRappelCamTransitionPhase) //POINT_CAM_AT_PED_BONE(rappelData.cam, PLAYER_PED_ID(), BONETAG_HEAD, <<0,0.0,0.0>>) #IF IS_DEBUG_BUILD ELSE CONST_FLOAT RAPPEL_CAM_DEFAULT_HEADING_TOP 78.0 CONST_FLOAT RAPPEL_CAM_Y_DIST_TOP -4.5//-3.5 CONST_FLOAT RAPPEL_CAM_Z_DIST_TOP 1.7 CONST_FLOAT RAPPEL_CAM_DEFAULT_HEADING_BOTTOM 68.0 CONST_FLOAT RAPPEL_CAM_Y_DIST_BOTTOM -4.5//-3.5 CONST_FLOAT RAPPEL_CAM_Z_DIST_BOTTOM 1.0 fRappelCamClockwiseLimit = 150.0 fRappelCamAnticlockwiseLimit = 20.0 fRappelCamDefaultHeading = RAPPEL_CAM_DEFAULT_HEADING_TOP + ((RAPPEL_CAM_DEFAULT_HEADING_BOTTOM - RAPPEL_CAM_DEFAULT_HEADING_TOP) * fRappelCamTransitionPhase) fRappelCamYDist = RAPPEL_CAM_Y_DIST_TOP + ((RAPPEL_CAM_Y_DIST_BOTTOM - RAPPEL_CAM_Y_DIST_TOP) * fRappelCamTransitionPhase) fRappelCamZDist = RAPPEL_CAM_Z_DIST_TOP + ((RAPPEL_CAM_Z_DIST_BOTTOM - RAPPEL_CAM_Z_DIST_TOP) * fRappelCamTransitionPhase) //POINT_CAM_AT_ENTITY(rappelData.cam, PLAYER_PED_ID(), <<0,-0.3,0.6>>) ENDIF #ENDIF DEFINE_RAPPEL_CAM_PROPERTIES(rappelData, fRappelCamDefaultHeading, fRappelCamYDist, RAPPEL_CAM_X_Y_INPUT_TO_DEGREES_FACTOR, fRappelCamClockwiseLimit, fRappelCamAnticlockwiseLimit, RAPPEL_CAM_X_Y_SPEED, fRappelCamZDist, RAPPEL_CAM_Z_INPUT_TO_HEIGHT_FACTOR, RAPPEL_CAM_Z_UPPER_LIMIT, RAPPEL_CAM_Z_LOWER_LIMIT, RAPPEL_CAM_Z_SPEED, RAPPEL_CAM_FOV) ENDPROC // init guard animation times PROC INIT_GUARD_ANIMATION_TIME(INT i) iNextGuardAnimationTime[i] = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(300, 3000) ENDPROC PROC INIT_ALL_GUARD_ANIMATION_TIMES() INT i REPEAT NUMBER_GUARDS i INIT_GUARD_ANIMATION_TIME(i) ENDREPEAT ENDPROC // can guard look left? FUNC BOOL CAN_GUARD_LOOK_LEFT(INT i) SWITCH i CASE 0 IF NOT IS_PED_INJURED(guardPed[4]) OR NOT IS_PED_INJURED(guardPed[1]) OR NOT IS_PED_INJURED(guardPed[2]) OR NOT IS_PED_INJURED(guardPed[3]) RETURN TRUE ENDIF BREAK CASE 1 IF NOT IS_PED_INJURED(guardPed[2]) OR NOT IS_PED_INJURED(guardPed[3]) RETURN TRUE ENDIF BREAK CASE 2 IF NOT IS_PED_INJURED(guardPed[3]) RETURN TRUE ENDIF BREAK CASE 3 BREAK CASE 4 IF NOT IS_PED_INJURED(guardPed[1]) OR NOT IS_PED_INJURED(guardPed[2]) OR NOT IS_PED_INJURED(guardPed[3]) RETURN TRUE ENDIF BREAK ENDSWITCH RETURN FALSE ENDFUNC // can guard look right? FUNC BOOL CAN_GUARD_LOOK_RIGHT(INT i) SWITCH i CASE 0 BREAK CASE 1 IF NOT IS_PED_INJURED(guardPed[0]) RETURN TRUE ENDIF BREAK CASE 2 IF NOT IS_PED_INJURED(guardPed[1]) OR NOT IS_PED_INJURED(guardPed[4]) OR NOT IS_PED_INJURED(guardPed[0]) RETURN TRUE ENDIF BREAK CASE 3 IF NOT IS_PED_INJURED(guardPed[4]) OR NOT IS_PED_INJURED(guardPed[1]) OR NOT IS_PED_INJURED(guardPed[2]) OR NOT IS_PED_INJURED(guardPed[0]) RETURN TRUE ENDIF BREAK CASE 4 IF NOT IS_PED_INJURED(guardPed[0]) RETURN TRUE ENDIF BREAK ENDSWITCH RETURN FALSE ENDFUNC // handle guard animations PROC HANDLE_GUARD_ANIMATIONS(INT iKilledGuards) INT i REPEAT NUMBER_GUARDS i IF NOT IS_PED_INJURED(guardPed[i]) IF GET_SCRIPT_TASK_STATUS(guardPed[i], SCRIPT_TASK_AIM_GUN_AT_ENTITY) = PERFORMING_TASK OR GET_SCRIPT_TASK_STATUS(guardPed[i], SCRIPT_TASK_AIM_GUN_AT_COORD) = PERFORMING_TASK BOOL bDoAnim = FALSE INT iAnim INT iDict STRING sAnim STRING sDict INT iNextMinTime = 3000 INT iNextMaxTime = 6000 IF NOT bReactedToFirstShot IF GET_GAME_TIMER() >= iNextGuardAnimationTime[i] iAnim = GET_RANDOM_INT_IN_RANGE(0,5) sAnim = "var_a" sDict = GET_SNATCH_AND_GRAB_ANIM_DICT_AS_STRING(SAG_ANIM_DICT_AIM_VARIATIONS) // variations of aim adjustment SWITCH i CASE 0 CASE 4 IF iAnim = 2 iAnim = 3 ENDIF BREAK CASE 2 CASE 3 IF iAnim = 3 iAnim = 2 ENDIF BREAK ENDSWITCH SWITCH iAnim CASE 0 sAnim = "var_a" BREAK CASE 1 sAnim = "var_b" BREAK CASE 2 sAnim = "var_d" BREAK CASE 3 sAnim = "var_e" BREAK CASE 4 sAnim = "var_f" BREAK ENDSWITCH bDoAnim = TRUE ENDIF ELSE iNextMinTime = 2500 iNextMaxTime = 4500 // variations on combat glances BOOL bDoingSpecialAnim = FALSE IF NOT bDoneGuardBeckon IF GET_GAME_TIMER() >= iLastGuardAnimationTime[i] + 1600 IF IS_SYNCHRONIZED_SCENE_RUNNING(iGuardSyncScene[GSS_STANDARD]) IF GET_SYNCHRONIZED_SCENE_PHASE(iGuardSyncScene[GSS_STANDARD]) >= 0.40 IF GET_RANDOM_INT_IN_RANGE(0,4) = 0 IF NOT IS_PED_INJURED(guardPed[3]) OR NOT IS_PED_INJURED(guardPed[4]) sDict = GET_SNATCH_AND_GRAB_ANIM_DICT_AS_STRING(SAG_ANIM_DICT_BECKON) IF i=0 sAnim = "-180" ELSE sAnim = "90" ENDIF bDoneGuardBeckon = TRUE bDoingSpecialAnim = TRUE bDoAnim = TRUE ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF IF NOT bDoingSpecialAnim IF GET_GAME_TIMER() >= iNextGuardAnimationTime[i] INT iRandDict = GET_RANDOM_INT_IN_RANGE(0,9) SWITCH iRandDict CASE 0 CASE 1 CASE 2 CASE 3 CASE 4 iDict = 0 sDict = GET_SNATCH_AND_GRAB_ANIM_DICT_AS_STRING(SAG_ANIM_DICT_COMBAT_GLANCES) BREAK CASE 5 CASE 6 CASE 7 iDict = 1 sDict = GET_SNATCH_AND_GRAB_ANIM_DICT_AS_STRING(SAG_ANIM_DICT_OVER_THERE) BREAK CASE 8 iDict = 2 sDict = GET_SNATCH_AND_GRAB_ANIM_DICT_AS_STRING(SAG_ANIM_DICT_PANIC) BREAK ENDSWITCH IF iKilledGuards >= 4 IF iDict = 1 iDict = 0 ENDIF ENDIF BOOL bCanLookLeft = CAN_GUARD_LOOK_LEFT(i) BOOL bCanLookRight = CAN_GUARD_LOOK_RIGHT(i) SWITCH iDict CASE 0 CASE 1 sAnim = "0" // glances, over theres // can we look left? IF NOT bCanLookLeft AND NOT bCanLookRight iAnim = 2 ELIF NOT bCanLookLeft iAnim = GET_RANDOM_INT_IN_RANGE(2,5) ELIF NOT bCanLookRight iAnim = GET_RANDOM_INT_IN_RANGE(0,3) ELSE iAnim = GET_RANDOM_INT_IN_RANGE(0,5) ENDIF SWITCH iAnim CASE 0 sAnim = "-180" BREAK CASE 1 sAnim = "-90" BREAK CASE 2 sAnim = "0" BREAK CASE 3 sAnim = "180" BREAK CASE 4 sAnim = "90" BREAK ENDSWITCH BREAK CASE 2 sAnim = "panic_aim_var_a" IF NOT bCanLookLeft AND NOT bCanLookRight iAnim = 1 ELIF NOT bCanLookLeft iAnim = GET_RANDOM_INT_IN_RANGE(1,4) ELIF NOT bCanLookRight iAnim = GET_RANDOM_INT_IN_RANGE(0,2) ELSE iAnim = GET_RANDOM_INT_IN_RANGE(0,4) ENDIF SWITCH iAnim CASE 0 sAnim = "panic_aim_var_b" BREAK CASE 1 sAnim = "panic_aim_var_a" BREAK CASE 2 sAnim = "panic_aim_var_c" BREAK CASE 3 sAnim = "panic_aim_var_d" BREAK ENDSWITCH BREAK ENDSWITCH bDoAnim = TRUE ENDIF ENDIF ENDIF IF bDoAnim TASK_PLAY_ANIM(guardPed[i], sDict, sAnim, SLOW_BLEND_IN, -1.0, -1, AF_SECONDARY) iNextGuardAnimationTime[i] = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(iNextMinTime, iNextMaxTime) iLastGuardAnimationTime[i] = GET_GAME_TIMER() ENDIF ENDIF ENDIF ENDREPEAT ENDPROC // correct audio scene for chopper chase stage PROC DO_CHOPPER_TO_PED_AUDIO_SCENE(enumCharacterList toChar, BOOL bForceDropoff = FALSE) SWITCH toChar CASE CHAR_MICHAEL STOP_SNATCH_AND_GRAB_AUDIO_SCENE(SNATCH_AND_GRAB_AUDIO_SCENE_CHOPPERS_ARRIVE_FRANKLIN) STOP_SNATCH_AND_GRAB_AUDIO_SCENE(SNATCH_AND_GRAB_AUDIO_SCENE_CHOPPERS_ARRIVE_TREVOR) STOP_SNATCH_AND_GRAB_AUDIO_SCENE(SNATCH_AND_GRAB_AUDIO_SCENE_FLY_BACK_AS_TREVOR) IF currentMissionStage = STAGE_CHOPPER_CHASE AND NOT bForceDropoff STOP_SNATCH_AND_GRAB_AUDIO_SCENE(SNATCH_AND_GRAB_AUDIO_SCENE_FLY_BACK_AS_MICHAEL) START_SNATCH_AND_GRAB_AUDIO_SCENE(SNATCH_AND_GRAB_AUDIO_SCENE_CHOPPERS_ARRIVE_MICHAEL) ELSE STOP_SNATCH_AND_GRAB_AUDIO_SCENE(SNATCH_AND_GRAB_AUDIO_SCENE_CHOPPERS_ARRIVE_MICHAEL) START_SNATCH_AND_GRAB_AUDIO_SCENE(SNATCH_AND_GRAB_AUDIO_SCENE_FLY_BACK_AS_MICHAEL) ENDIF BREAK CASE CHAR_TREVOR STOP_SNATCH_AND_GRAB_AUDIO_SCENE(SNATCH_AND_GRAB_AUDIO_SCENE_CHOPPERS_ARRIVE_FRANKLIN) STOP_SNATCH_AND_GRAB_AUDIO_SCENE(SNATCH_AND_GRAB_AUDIO_SCENE_CHOPPERS_ARRIVE_MICHAEL) STOP_SNATCH_AND_GRAB_AUDIO_SCENE(SNATCH_AND_GRAB_AUDIO_SCENE_FLY_BACK_AS_MICHAEL) IF currentMissionStage = STAGE_CHOPPER_CHASE AND NOT bForceDropoff STOP_SNATCH_AND_GRAB_AUDIO_SCENE(SNATCH_AND_GRAB_AUDIO_SCENE_FLY_BACK_AS_TREVOR) START_SNATCH_AND_GRAB_AUDIO_SCENE(SNATCH_AND_GRAB_AUDIO_SCENE_CHOPPERS_ARRIVE_TREVOR) ELSE STOP_SNATCH_AND_GRAB_AUDIO_SCENE(SNATCH_AND_GRAB_AUDIO_SCENE_CHOPPERS_ARRIVE_TREVOR) START_SNATCH_AND_GRAB_AUDIO_SCENE(SNATCH_AND_GRAB_AUDIO_SCENE_FLY_BACK_AS_TREVOR) ENDIF BREAK CASE CHAR_FRANKLIN STOP_SNATCH_AND_GRAB_AUDIO_SCENE(SNATCH_AND_GRAB_AUDIO_SCENE_CHOPPERS_ARRIVE_TREVOR) STOP_SNATCH_AND_GRAB_AUDIO_SCENE(SNATCH_AND_GRAB_AUDIO_SCENE_CHOPPERS_ARRIVE_MICHAEL) STOP_SNATCH_AND_GRAB_AUDIO_SCENE(SNATCH_AND_GRAB_AUDIO_SCENE_FLY_BACK_AS_MICHAEL) STOP_SNATCH_AND_GRAB_AUDIO_SCENE(SNATCH_AND_GRAB_AUDIO_SCENE_FLY_BACK_AS_TREVOR) START_SNATCH_AND_GRAB_AUDIO_SCENE(SNATCH_AND_GRAB_AUDIO_SCENE_CHOPPERS_ARRIVE_FRANKLIN) BREAK ENDSWITCH ENDPROC PROC CREATE_GUYS_AT_FOOD_COURT(BOOL bJumpingToStage) IF NOT bCreatedGuysAtFoodCourt UPDATE_FOOD_COURT(FALSE, STAGE_FOOD_COURT) CREATE_STEVE_AND_ANDREAS(bJumpingToStage) CREATE_DAVE(bJumpingToStage) SET_STEVE_SEATED(TRUE) SET_ANDREAS_SEATED(TRUE) SET_DAVE_SEATED() bCreatedGuysAtFoodCourt = TRUE ENDIF ENDPROC PROC DISABLE_PEDS_AT_FOOD_COURT() SET_PED_NON_CREATION_AREA(<<80.15606, -689.07544, 35.22030>>, <<153.51270, -671.06488, 47.32924>>) SET_PED_PATHS_IN_AREA(<<80.15606, -689.07544, 35.22030>>, <<153.51270, -671.06488, 47.02924>>, FALSE) ENDPROC // start a particular stage of the mission PROC SET_MISSION_STAGE(MISSION_STAGE_ENUM setStage, BOOL bJumpingToStage = FALSE, BOOL bClearTextAndSpeech = TRUE, BOOL bRenderScriptCamsFalse = TRUE, BOOL bInitialisingAfterIntro = FALSE, BOOL bClearMap = TRUE, BOOL bHandleFadeIn = TRUE, BOOL bRemoveCutscene = TRUE) PRINTSTRING("setting mission stage") PRINTNL() INT i IF bJumpingToStage // clear area and load scene around start pos VECTOR vStartPos FLOAT fStartRot SWITCH setStage CASE STAGE_FOOD_COURT vStartPos = GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_MICHAEL_AT_FOOD_COURT) fStartRot = MICHAEL_AT_FOOD_COURT_ROT BREAK CASE STAGE_GET_TO_CHOPPER IF NOT bForcePassOnShitskip vStartPos = GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_PLAYER_INIT2) fStartRot = PLAYER_INIT_ROT2 ELSE vStartPos = GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_MEETING_POINT) fStartRot = -158.1 ENDIF BREAK CASE STAGE_GET_TO_BUILDING IF NOT bForcePassOnShitskip vStartPos = GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_CHOPPER_INIT) fStartRot = CHOPPER_INIT_ROT ELSE vStartPos = GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_HOVER_TARGET) fStartRot = CHOPPER_HOVER_ROT ENDIF BREAK CASE STAGE_RAPPEL_DOWN vStartPos = <<110.2, -618.2, 258.3>> fStartRot = 157.8 BREAK CASE STAGE_SNIPE_GUARDS vStartPos = <<99.2, -618.0, 206.9>> fStartRot = -96.5 BREAK CASE STAGE_CHOPPER_CHASE vStartPos = <<-139.47, -594.4, 210.8>> fStartRot = -96.9 BREAK CASE STAGE_DROPOFF IF NOT bForcePassOnShitskip vStartPos = GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_CHASE_END) fStartRot = CHOPPER_CHASE_END_ROT ELSE vStartPos = GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_DROPOFF) fStartRot = -124 ENDIF BREAK ENDSWITCH // set to coords and wait for streaming IF NOT g_bMagDemoActive OR bDebugSkipMagdemoZskipped // clear area for replay SET_PLAYER_OUT_OF_ANY_VEHICLE() IF bClearMap CLEAR_AREA(vStartPos, 10000, TRUE) ENDIF WAIT(0) IF NOT bInitialisingAfterIntro IF IS_REPLAY_IN_PROGRESS() AND NOT bSuppressFutureReplaySetups IF setStage >= STAGE_GET_TO_BUILDING request_ipl("DT1_05_FIB_Reflection") PRINTSTRING("request reflection ipl 1") printnl() ENDIF START_REPLAY_SETUP(vStartPos, fStartRot) ELSE SET_ENTITY_COORDS(PLAYER_PED_ID(), vStartPos) SET_ENTITY_HEADING(PLAYER_PED_ID(), fStartRot) ENDIF ENDIF ENDIF WAIT(0) ENDIF PRINTSTRING("here1") PRINTNL() // set roads //IF setStage = STAGE_RAPPEL_DOWN // SET_SNATCH_AND_GRAB_ROADS(FALSE) //ELSE // SET_SNATCH_AND_GRAB_ROADS(TRUE) //ENDIF // ensure office interior is in memory IF setStage = STAGE_RAPPEL_DOWN PIN_OFFICE_INTERIOR(TRUE, FALSE) ELIF setStage = STAGE_SNIPE_GUARDS PIN_OFFICE_INTERIOR(TRUE, TRUE) ELSE PIN_OFFICE_INTERIOR(FALSE, FALSE) ENDIF PRINTSTRING("unpinned interior") PRINTNL() // get the models and force their load BOOL bForceLoad = TRUE IF g_bMagDemoActive AND setStage = STAGE_GET_TO_CHOPPER AND NOT bDebugSkipMagdemoZskipped bForceLoad = FALSE ENDIF REQUEST_MODELS_FOR_STAGE(setStage, bForceLoad, FALSE) PRINTSTRING("requested models") PRINTNL() // get the recordings and force their load REQUEST_VEHICLE_RECORDINGS_FOR_STAGE(setStage, bForceLoad, FALSE) PRINTSTRING("requested recs") PRINTNL() // get the anims and force their load REQUEST_ANIM_DICTS_FOR_STAGE(setStage, bForceLoad, FALSE) PRINTSTRING("requested anims") PRINTNL() // get the weapons and force their load REQUEST_WEAPONS_FOR_STAGE(setStage, bForceLoad, FALSE) PRINTSTRING("requested weapons") PRINTNL() // reset vars RESET_VARIABLES_FOR_STAGE(setStage) PRINTSTRING("reset vars") PRINTNL() // get rid of blips and text REMOVE_ALL_BLIPS() PRINTSTRING("removed blips") PRINTNL() // get the ptfx and force their load REQUEST_PTFX_FOR_STAGE(setStage, bForceLoad, FALSE) PRINTSTRING("requested ptfx") PRINTNL() // get the sfx and force their load REQUEST_SFX_FOR_STAGE(setStage, bForceLoad, FALSE) PRINTSTRING("requested sfx") PRINTNL() // get the misc assets and force their load REQUEST_MISC_ASSETS_FOR_STAGE(setStage, bForceLoad, FALSE) PRINTSTRING("requested misc") PRINTNL() // get the text and force its load REQUEST_TEXT(TRUE) PRINTSTRING("requested text") PRINTNL() // reset mocap streaming //IF mocapStreamingStage >= MOCAP_STREAMING_STAGE_WAIT IF bRemoveCutscene REMOVE_CUTSCENE() mocapStreamingStage = MOCAP_STREAMING_STAGE_REQUEST ENDIF //ENDIF REMOVE_MISSION_TEXT(bClearTextAndSpeech OR bJumpingToStage, bClearTextAndSpeech OR bJumpingToStage) PRINTSTRING("stop conversations") PRINTNL() // rope textures IF setStage >= STAGE_GET_TO_BUILDING AND setStage <= STAGE_SNIPE_GUARDS ROPE_LOAD_TEXTURES() IF bJumpingToStage WHILE NOT ROPE_ARE_TEXTURES_LOADED() WAIT(0) ENDWHILE ENDIF ELSE ROPE_UNLOAD_TEXTURES() ENDIF #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 REPEAT 3 i IF DOES_ENTITY_EXIST(sSelectorPeds.pedID[i]) DELETE_PED(sSelectorPeds.pedID[i]) ENDIF ENDREPEAT ENDIF ENDIF PRINTSTRING("here2") PRINTNL() IF bJumpingToStage OR bInitialisingAfterIntro // remove all dialogue IF bJumpingToStage FOR i=0 TO 9 REMOVE_PED_FOR_DIALOGUE(snatchAndGrabConversation, i) ENDFOR ENDIF // setup player with dialogue SWITCH GET_CURRENT_PLAYER_PED_ENUM() CASE CHAR_MICHAEL ADD_PED_FOR_DIALOGUE(snatchAndGrabConversation, 0, PLAYER_PED_ID(), "MICHAEL") BREAK CASE CHAR_TREVOR ADD_PED_FOR_DIALOGUE(snatchAndGrabConversation, 1, PLAYER_PED_ID(), "TREVOR") BREAK CASE CHAR_FRANKLIN ADD_PED_FOR_DIALOGUE(snatchAndGrabConversation, 2, PLAYER_PED_ID(), "FRANKLIN") 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) IF setStage = STAGE_RAPPEL_DOWN SET_PED_PRELOAD_PROP_DATA(PLAYER_PED_ID(), ANCHOR_EYES, 2, 0) INT iLoadMaskTime = GET_GAME_TIMER() + 2000 BOOL bTimedMaskLoadOut = FALSE WHILE NOT bTimedMaskLoadOut WAIT(0) IF GET_GAME_TIMER() >= iLoadMaskTime OR HAS_PED_PRELOAD_PROP_DATA_FINISHED(PLAYER_PED_ID()) bTimedMaskLoadOut = TRUE ENDIF ENDWHILE ENDIF SETUP_PLAYER_CHARACTER_WITH_MISSION_VARIATIONS(PLAYER_PED_ID(), GET_CHARACTER_FOR_MISSION_STAGE(setStage), setStage) IF bJumpingToStage IF NOT g_bMagDemoActive LOAD_ALL_OBJECTS_IF_SCREEN_FADED_OUT() WHILE NOT HAVE_ALL_STREAMING_REQUESTS_COMPLETED(PLAYER_PED_ID()) WAIT(0) ENDWHILE ENDIF ENDIF ENDIF // set stage IF bJumpingToStage IF setStage = STAGE_CHOPPER_CHASE bSelectedMichaelDuringExtract = TRUE ENDIF ENDIF // setup selector ped activities SET_SELECTOR_PED_ACTIVITY(sSelectorPeds, SELECTOR_PED_FRANKLIN, SELECTOR_ACTIVITY_SNIPER) IF setStage = STAGE_SNIPE_GUARDS SET_SELECTOR_PED_ACTIVITY(sSelectorPeds, SELECTOR_PED_MICHAEL, SELECTOR_ACTIVITY_ATTACHED_TO_HELI) ELSE SET_SELECTOR_PED_ACTIVITY(sSelectorPeds, SELECTOR_PED_MICHAEL, SELECTOR_ACTIVITY_DEFAULT) ENDIF PRINTSTRING("here4") PRINTNL() // setup IPL group IF setStage >= STAGE_GET_TO_BUILDING SET_BUILDING_STATE(BUILDINGNAME_IPL_FIB2_TOWER, BUILDINGSTATE_DESTROYED) IF NOT IS_REPLAY_BEING_SET_UP() request_ipl("DT1_05_FIB_Reflection") PRINTSTRING("request reflection ipl 2") printnl() ENDIF ELSE SET_BUILDING_STATE(BUILDINGNAME_IPL_FIB2_TOWER, BUILDINGSTATE_NORMAL) IF NOT IS_REPLAY_BEING_SET_UP() remove_ipl("DT1_05_FIB_Reflection") PRINTSTRING("remove reflection ipl 3") printnl() ENDIF ENDIF PRINTSTRING("here5") PRINTNL() // setup cascade shadows IF setStage = STAGE_RAPPEL_DOWN OR setStage = STAGE_CHOPPER_CHASE CASCADE_SHADOWS_SET_CASCADE_BOUNDS_SCALE(CASCADE_SHADOWS_MULTIPLIER_EXTERIOR_OVERRIDE) ELSE CASCADE_SHADOWS_SET_CASCADE_BOUNDS_SCALE(CASCADE_SHADOWS_MULTIPLIER_NO_OVERRIDE) ENDIF IF setStage = STAGE_RAPPEL_DOWN CASCADE_SHADOWS_SET_ENTITY_TRACKER_SCALE(CASCADE_SHADOWS_ROPE_OVERRIDE) ELSE CASCADE_SHADOWS_SET_ENTITY_TRACKER_SCALE(1.0) ENDIF IF bJumpingToStage SET_WEATHER_TYPE_NOW_PERSIST("extrasunny") ENDIF PRINTSTRING("here6") PRINTNL() // set reverb IF setStage >= STAGE_RAPPEL_DOWN SET_AUDIO_FLAG("ListenerReverbDisabled", TRUE) ELSE SET_AUDIO_FLAG("ListenerReverbDisabled", FALSE) ENDIF PRINTSTRING("here7") PRINTNL() // setup player control/cameras IF bRenderScriptCamsFalse IF setStage <> STAGE_CHOPPER_CHASE OR bSelectedMichaelDuringExtract RENDER_SCRIPT_CAMS(FALSE, FALSE) ENDIF ENDIF // headsets IF bJumpingToStage IF setStage >= STAGE_GET_TO_BUILDING SET_PLAYER_PED_WITH_HEADSET(CHAR_TREVOR, TRUE) SET_PLAYER_PED_WITH_HEADSET(CHAR_MICHAEL, TRUE) SET_PLAYER_PED_WITH_HEADSET(CHAR_FRANKLIN, TRUE) ENDIF ENDIF // downwash IF setStage = STAGE_RAPPEL_DOWN OR setStage = STAGE_SNIPE_GUARDS DISABLE_DOWNWASH_PTFX(TRUE) ELSE DISABLE_DOWNWASH_PTFX(FALSE) ENDIF SET_SELECTOR_PED_PRIORITY(sSelectorPeds, SELECTOR_PED_FRANKLIN, SELECTOR_PED_MICHAEL, SELECTOR_PED_TREVOR) KILL_CHASE_HINT_CAM(localChaseHintCamStruct) PRINTSTRING("here9") PRINTNL() // do any other necessary setup for the stage SWITCH setStage CASE STAGE_FOOD_COURT CREATE_GUYS_AT_FOOD_COURT(bJumpingToStage) CREATE_COFFEE() buddyBlip = CREATE_MISSION_BLIP_FOR_PED(davePed) SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_UNARMED, TRUE) //CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID()) //SET_ENTITY_COORDS(PLAYER_PED_ID(), GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_MICHAEL_AT_FOOD_COURT)) //SET_ENTITY_HEADING(PLAYER_PED_ID(), MICHAEL_AT_FOOD_COURT_ROT) //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) SET_GAMEPLAY_CAM_RELATIVE_HEADING() SET_ENTITY_COORDS(PLAYER_PED_ID(), GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_MICHAEL_AT_FOOD_COURT)) SET_ENTITY_HEADING(PLAYER_PED_ID(), MICHAEL_AT_FOOD_COURT_ROT) IF bWasTimeLapseRunning SET_TODS_CUTSCENE_RUNNING(sTimelapse, FALSE) ENDIF BREAK CASE STAGE_GET_TO_CHOPPER DISABLE_PEDS_AT_FOOD_COURT() IF bJumpingToStage IF IS_REPLAY_IN_PROGRESS() bFrozeChairs = TRUE ENDIF CLEAR_AREA_OF_PEDS(<<119.47105, -686.39063, 41.02894>>, 30) CLEAR_START_AREA() ENDIF SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_UNARMED, TRUE) CLEAR_PLAYER_HAS_DAMAGED_AT_LEAST_ONE_PED(PLAYER_ID()) IF NOT g_bMagDemoActive VEHICLE_INDEX lastPlayerVehicle lastPlayerVehicle = GET_PLAYERS_LAST_VEHICLE() IF IS_VEHICLE_DRIVEABLE(lastPlayerVehicle) SET_ENTITY_AS_MISSION_ENTITY(lastPlayerVehicle, TRUE, TRUE) ENDIF //CLEAR_AREA(GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_MICHAEL_CAR_INIT), 50, TRUE) IF IS_VEHICLE_DRIVEABLE(lastPlayerVehicle) SET_ENTITY_AS_MISSION_ENTITY(lastPlayerVehicle, TRUE, TRUE) SET_VEHICLE_AS_NO_LONGER_NEEDED(lastPlayerVehicle) ENDIF ENDIF IF bJumpingToStage IF NOT g_bMagDemoActive //POSITION_PLAYER_AT_MISSION_INIT(TRUE) //SET_MICHAEL_INTO_CAR() ELSE IF bDebugSkipMagdemoStart IF IS_VEHICLE_DRIVEABLE(snatchAndGrabVehicle[SAGV_MICHAEL_CAR]) SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), snatchAndGrabVehicle[SAGV_MICHAEL_CAR]) ENDIF ENDIF ENDIF ENDIF IF NOT g_bMagDemoActive IF NOT bForcePassOnShitskip CREATE_STEVE_AND_ANDREAS(bJumpingToStage) ENDIF ENDIF IF bJumpingToStage CREATE_COFFEE() ENDIF CREATE_DAVE(bJumpingToStage) IF bJumpingToStage IF NOT bForcePassOnShitskip IF NOT bInitialisingAfterIntro PRINTSTRING("update food court for chopper") printnl() UPDATE_FOOD_COURT(FALSE, STAGE_GET_TO_CHOPPER) ENDIF bSteveSeated = FALSE bAndreasSeated = FALSE SET_STEVE_SEATED(FALSE) SET_ANDREAS_SEATED(FALSE) WAIT(200) ELSE IF IS_VEHICLE_DRIVEABLE(snatchAndGrabVehicle[SAGV_MICHAEL_CAR]) SET_ENTITY_COORDS(snatchAndGrabVehicle[SAGV_MICHAEL_CAR], GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_MEETING_POINT)) SET_ENTITY_HEADING(snatchAndGrabVehicle[SAGV_MICHAEL_CAR], -158.1) ENDIF ENDIF //POSITION_DAVE_AT_MISSION_INIT() ENDIF IF IS_VEHICLE_DRIVEABLE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) FREEZE_ENTITY_POSITION(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], FALSE) SET_VEHICLE_ON_GROUND_PROPERLY(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) ENDIF //SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_UNARMED, FALSE) //CREATE_FBI_FOR_STAGE(STAGE_GET_TO_CHOPPER) // setup franklin for phone dialogue ADD_PED_FOR_DIALOGUE(snatchAndGrabConversation, 2, NULL, "FRANKLIN") iNextRandomSpeechTime = GET_GAME_TIMER() + 45000 IF NOT DOES_BLIP_EXIST(g_sMagDemoFBI2Entities.blip) // getToBlip = CREATE_MISSION_BLIP_FOR_COORD(GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_MEETING_POINT), TRUE) ELSE g_sMagDemoFBI2Entities.bBlipActive = TRUE ENDIF //IF NOT g_bMagDemoActive // SET_PLAYER_CONTROL(PLAYER_ID(), FALSE, SPC_LEAVE_CAMERA_CONTROL_ON) //ENDIF IF IS_VEHICLE_DRIVEABLE(snatchAndGrabVehicle[SAGV_MICHAEL_CAR]) SET_VEH_RADIO_STATION(snatchAndGrabVehicle[SAGV_MICHAEL_CAR], "RADIO_01_CLASS_ROCK") ENDIF IF g_bMagDemoActive IF g_bMagDemoFBI2Retry TRIGGER_MISSION_MUSIC_EVENT("FIB2_CAR_TO_CS") ELSE // TRIGGER_MISSION_MUSIC_EVENT("FIB2_CAR_TO_CS") ENDIF ENDIF BREAK CASE STAGE_GET_TO_BUILDING //jumpCheckpoint = CREATE_CHECKPOINT(CHECKPOINT_RACE_AIR_FLAG, GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_HOVER_TARGET), <<0,0,0>>, 20.0) IF bJumpingToStage IF NOT bForcePassOnShitskip CREATE_UTIL_TRUCKS(STAGE_GET_TO_BUILDING) ENDIF bWaitForBuddyPrompt = FALSE bGetBuddyPrompt = FALSE // TRIGGER_MISSION_MUSIC_EVENT("FBI2_TEST_HELI_RIDE_MUSIC") ELSE IF IS_VEHICLE_DRIVEABLE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], FALSE) SET_VEHICLE_DOORS_LOCKED(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], VEHICLELOCK_UNLOCKED) ENDIF IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL]) REMOVE_PED_FROM_GROUP(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL]) ENDIF ENDIF IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL]) SET_PED_PRELOAD_PROP_DATA(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], ANCHOR_EYES, 2, 0) SET_PED_GET_OUT_UPSIDE_DOWN_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], FALSE) SET_PED_CONFIG_FLAG(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], PCF_DontAllowToBeDraggedOutOfVehicle, TRUE) SET_PED_CONFIG_FLAG(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], PCF_RunFromFiresAndExplosions, FALSE) ENDIF IF bJumpingToStage //CREATE_FAKE_FOLLOW_CAM() ELSE IF GET_CAM_VIEW_MODE_FOR_CONTEXT(CAM_VIEW_MODE_CONTEXT_IN_HELI) <> CAM_VIEW_MODE_FIRST_PERSON ANIMPOSTFX_PLAY("SwitchSceneTrevor", 0, FALSE) PLAY_SOUND_FRONTEND(-1, "Hit_In", "PLAYER_SWITCH_CUSTOM_SOUNDSET") ENDIF ENDIF START_SNATCH_AND_GRAB_AUDIO_SCENE(SNATCH_AND_GRAB_AUDIO_SCENE_FLY_TO_AGENCY) TRIGGER_MISSION_MUSIC_EVENT("FIB2_HELI_LIFT_OFF") BREAK CASE STAGE_RAPPEL_DOWN CASCADE_SHADOWS_ENABLE_FREEZER(FALSE) OVERRIDE_PLAYER_GROUND_MATERIAL(GET_HASH_KEY("AM_BASE_GLASS_STRONG"),TRUE) SET_CHOPPER_TO_HOVER() michaelGunObject = CREATE_WEAPON_OBJECT(GET_SNATCH_AND_GRAB_WEAPON_TYPE(SAG_WEAPON_MICHAEL_PISTOL), 999, <<124.27, -623.83, 261.85>>, TRUE) SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_UNARMED, TRUE) PRINTSTRING("set current weapon as unarmed!") PRINTNL() IF bJumpingToStage //SET_WEATHER_TYPE_NOW_PERSIST("extrasunny") //SET_CLOCK_TIME(18,0,0) //PAUSE_CLOCK(TRUE) //DISPLAY_RADAR(FALSE) //DISPLAY_HUD(FALSE) //INT iStopTrafficTime ///iStopTrafficTime = GET_GAME_TIMER() + 1000 //CLEAR_AREA(<<91.91, -630.54, 43.27>>, 300, TRUE) //WHILE GET_GAME_TIMER() < iStopTrafficTime //WAIT(0) //HANDLE_RANDOM_VEHICLE_GENERATION(TRUE) //ENDWHILE // TRIGGER_MISSION_MUSIC_EVENT("FBI2_TEST_BEGIN_RAPPEL_ST") ELSE ANIMPOSTFX_PLAY("SwitchSceneMichael", 0, FALSE) PLAY_SOUND_FRONTEND(-1, "Hit_In", "PLAYER_SWITCH_CUSTOM_SOUNDSET") ENDIF REPEAT NUMBER_TRAFFIC_VEHICLES i IF IS_VEHICLE_DRIVEABLE(trafficVehicle[i]) IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(trafficVehicle[i]) UNPAUSE_PLAYBACK_RECORDED_VEHICLE(trafficVehicle[i]) ENDIF ENDIF ENDREPEAT SET_FAR_DRAW_VEHICLES(TRUE) //INSTANTLY_FILL_VEHICLE_POPULATION() RAPPEL_STATE_ENUM initState FLOAT fInitPhase FLOAT fInitHeight IF NOT bJumpingToStage initState = RAPPEL_STATE_JUMPING_DOWN fInitPhase = 0.40 fInitHeight = -8.2 ELSE initState = RAPPEL_STATE_IDLING fInitPhase = 0.0 fInitHeight = -START_RAPPEL_Z ENDIF INIT_RAPPEL(rappelData, snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_ROPE_ANCHOR_OFFSET), GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_ROPE_ANCHOR_ROT), fInitHeight, -63.0, TRUE, TRUE, FALSE, NULL, FALSE, initState, fInitPhase, TRUE) INIT_RAPPEL_CAM_MOUSE_PARAMS(rappelData, 0.9, 0.3, 0.1, 0.005) // Needed because for some reason gamepad never gets to the full extents, but mouse does - Steve R LDS. IF NOT bJumpingToStage rappelData.fStopDescendPhase = 1.0 rappelData.fCurrentJumpStrength = 1.0 rappelData.fSpeed = JUMP_DOWN_SPEED_ACCELERATING rappelData.fJumpDeceleration = JUMP_DOWN_MAX_DECELERATION_SMALL ENDIF APPLY_CUSTOM_RAPPEL_CAM() SET_CAM_NEAR_DOF(rappelData.cam, 2.0) SET_CAM_FAR_DOF(rappelData.cam, 18.0) SET_CAM_DOF_STRENGTH(rappelData.cam, 0.2) //SET_ENTITY_COORDS(rappelData.anchorObject, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_ROPE_ANCHOR_OFFSET))) SET_RAPPEL_MATERIAL(rappelData, RAPPEL_MATERIAL_GLASS) //SETUP_RAPPEL_CAM(rappelData, <<109.12, -619.77, 260.90>>, TRUE, TRUE) CREATE_CHOPPER_ROPE(ROPE_TYPE_RAPPELLING) rappelData.bAllowRopeMovement = TRUE IF NOT bJumpingToStage rappelData.iLastRopeVertex = 3 rappelData.iNextRopeVertex = 4 rappelData.vOverrideHand = <<110.11, -617.99, 264.15>> ELSE rappelData.iLastRopeVertex = 6 rappelData.iNextRopeVertex = 7 rappelData.vOverrideHand = <<111.5, -618.8, 258.81>> ENDIF rappelData.fSlowDownByLimitRange = 0.6 HANDLE_RAPPEL_ROPE(rappelData, FALSE, TRUE, TRUE) rappelData.bDisabledPainAudio = TRUE FLOAT fForceInitOffset IF NOT bJumpingToStage //rappelData.fSpeed = 2.6 fForceInitOffset = -0.247676 ELSE rappelData.fSpeed = 0.0 fForceInitOffset = 0.0 ENDIF DO_RAPPEL_CAM(rappelData, TRUE, 0, 0, FALSE, fForceInitOffset) CASCADE_SHADOWS_SET_CASCADE_BOUNDS_SCALE(CASCADE_SHADOWS_MULTIPLIER_EXTERIOR_OVERRIDE) CASCADE_SHADOWS_SET_ENTITY_TRACKER_SCALE(CASCADE_SHADOWS_ROPE_OVERRIDE) INFORM_MISSION_STATS_SYSTEM_OF_TIME_WINDOW_OPEN(FBI2_RAPPEL_TIME) START_SNATCH_AND_GRAB_AUDIO_SCENE(SNATCH_AND_GRAB_AUDIO_SCENE_RAPPEL) IF bJumpingToStage WAIT(0) ENDIF IF NOT bJumpingToStage DO_POST_CUTSCENE_FADE_IN() ENDIF iNextMichaelRappelSpeechTime = GET_GAME_TIMER() + 9000 DO_MISSION_GOD_TEXT("SG_RAPPEL") IF bJumpingToStage TRIGGER_MISSION_MUSIC_EVENT("FIB2_RAPPEL_RESTART") ENDIF BREAK CASE STAGE_SNIPE_GUARDS IF bJumpingToStage //REQUEST_REMOTE_SNIPER_ASSETS_AND_WAIT() //SET_CHOPPER_TO_HOVER() SET_CHOPPER_TO_ESCAPE() CREATE_DUMMY_FRANKLIN() CREATE_PRISONER_FOR_STAGE(STAGE_SNIPE_GUARDS) CREATE_GUARDS_FOR_STAGE(STAGE_SNIPE_GUARDS) GET_RAPPEL_SOUND_ID(rappelData) GIVE_PLAYER_MISSION_PISTOL(TRUE) GIVE_FRANKLIN_SNIPER_RIFLE() FREEZE_FRANKLIN_AT_SNIPER() CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID()) SETUP_PRISONER_WITH_BELT(TRUE, STAGE_SNIPE_GUARDS) // TRIGGER_MISSION_MUSIC_EVENT("FBI2_TEST_BEGIN_RAPPEL_ST") bSkippedGlassSmash = TRUE bDisabledBlurOnRifle = FALSE iWindowSmashStage = 0 iGuardSpeech = 0 ELSE SETUP_PRISONER_WITH_BELT(FALSE, STAGE_SNIPE_GUARDS) // reset guard speech based on where we got to last time IF iGuardSpeech <= 2 iGuardSpeech = 0 ELIF iGuardSpeech <= 3 iGuardSpeech = 1 ELIF iGuardSpeech <= 4 iGuardSpeech = 2 ELIF iGuardSpeech <= 6 iGuardSpeech = 3 ELIF iGuardSpeech <= 7 iGuardSpeech = 4 ELIF iGuardSpeech <= 8 iGuardSpeech = 5 ELIF iGuardSpeech <= 9 iGuardSpeech = 6 ELIF iGuardSpeech <= 10 iGuardSpeech = 7 ELSE iGuardSpeech = 8 ENDIF ENDIF //iWindowSmashStage = 0 // MEGA TEMP SET_FAR_DRAW_VEHICLES(FALSE) HIDE_CELLPHONE_SIGNIFIERS_FOR_CUTSCENE(TRUE) DISABLE_CELLPHONE(TRUE) IF IS_VEHICLE_DRIVEABLE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) SET_VEHICLE_CAN_BE_TARGETTED(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], FALSE) ENDIF IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL]) SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], TRUE) SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], TRUE) ENDIF IF DOES_ENTITY_EXIST(chairObject) IF IS_SYNCHRONIZED_SCENE_RUNNING(iSyncScene) STOP_SYNCHRONIZED_ENTITY_ANIM(chairObject, INSTANT_BLEND_OUT, TRUE) ENDIF ENDIF CREATE_CHAIR_FOR_STAGE(STAGE_SNIPE_GUARDS) // temp? IF DOES_ENTITY_EXIST(michellePed) DELETE_PED(michellePed) REMOVE_PED_FOR_DIALOGUE(snatchAndGrabConversation, 6) ENDIF SETUP_GUARDS_FOR_DIALOGUE() IF bJumpingToStage INIT_ALL_GUARD_ANIMATION_TIMES() ENDIF //SETUP_REMOTE_SNIPER(TRUE, TRUE, bJumpingToStage, TRUE, FALSE) // IF NOT bCreatedSniper // CREATE_SNIPER_OBJECT() // bCreatedSniper = TRUE // ENDIF IF bJumpingToStage CREATE_RAPPEL_ANCHOR(rappelData, snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_ROPE_ANCHOR_OFFSET), GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_ROPE_ANCHOR_ROT)) CREATE_CHOPPER_ROPE(ROPE_TYPE_INSIDE, STAGE_SNIPE_GUARDS) ENDIF bPinRopeToWindow = TRUE CLEAR_ROOM_FOR_GAME_VIEWPORT() // blip the guards REPEAT NUMBER_GUARDS i IF NOT IS_PED_INJURED(guardPed[i]) SET_ENTITY_VISIBLE(guardPed[i], TRUE) guardBlip[i] = CREATE_MISSION_BLIP_FOR_PED(guardPed[i], TRUE) ENDIF ENDREPEAT UPDATE_PRISONER_GRAB(PRISONER_GRAB_STATE_INIT) SET_GUARDS_AIMING_AT_MICHAEL(TRUE) ADD_ANIM_DICT_REQUEST(SAG_ANIM_DICT_MISSION) // temp? //GIVE_PLAYER_MISSION_PISTOL(TRUE) SET_CURRENT_PED_WEAPON(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], GET_SNATCH_AND_GRAB_WEAPON_TYPE(SAG_WEAPON_MICHAEL_PISTOL), TRUE) //iGuardAttackTime = GET_GAME_TIMER() + GUARD_ATTACK_TIME_INIT IF GET_ALLOW_MOVEMENT_WHILE_ZOOMED() AND NOT IS_USING_KEYBOARD_AND_MOUSE(PLAYER_CONTROL) DO_MISSION_HELP_TEXT("SG_SNHLP") ELSE DO_MISSION_HELP_TEXT("SG_SNHLP2") ENDIF START_SNATCH_AND_GRAB_AUDIO_SCENE(SNATCH_AND_GRAB_AUDIO_SCENE_FRANKLIN_SNIPE_ENEMIES) SET_PLAYER_FORCED_AIM(PLAYER_ID(), TRUE) SETUP_SNIPER_RIFLE(TRUE, FALSE) // DO_MISSION_GOD_TEXT("SG_SNIPE") IF bJumpingToStage //iWaitForFadeTime = GET_GAME_TIMER() //WHILE GET_GAME_TIMER() <= iWaitForFadeTime + 500 // HANDLE_WINDOW_SMASH(TRUE, TRUE) // WAIT(0) //ENDWHILE TRIGGER_MISSION_MUSIC_EVENT("FIB2_SNIPE_RESTART") ENDIF BREAK CASE STAGE_CHOPPER_CHASE IF bJumpingToStage bDoneTroubleFlashHelp = FALSE //hangingHotswapState = HANGING_HOTSWAP_ON_FRANKLIN //REQUEST_REMOTE_SNIPER_ASSETS_AND_WAIT() //SETUP_REMOTE_SNIPER(TRUE, FALSE, FALSE, TRUE, TRUE) ENDIF DISABLE_CELLPHONE(FALSE) //CLEANUP_FRANKLIN(TRUE) IF DOES_ROPE_EXIST(rappelData.rope) DELETE_ROPE(rappelData.rope) ENDIF REMOVE_PED_FOR_DIALOGUE(snatchAndGrabConversation, 7) REMOVE_PED_FOR_DIALOGUE(snatchAndGrabConversation, 8) IF DOES_ENTITY_EXIST(torchObject) DELETE_OBJECT(torchObject) ENDIF STOP_SOUND(iDangleSoundID) HIDE_CELLPHONE_SIGNIFIERS_FOR_CUTSCENE(FALSE) IF DOES_ENTITY_EXIST(dummyFranklinPed) DELETE_PED(dummyFranklinPed) ENDIF IF NOT IS_PED_INJURED(PLAYER_PED_ID()) SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(PLAYER_PED_ID(), FALSE) SET_PED_RELATIONSHIP_GROUP_HASH(PLAYER_PED_ID(), RELGROUPHASH_PLAYER) ENDIF IF NOT bJumpingToStage DO_STREAM_VOLUME_ON_OFFICE(FALSE) ENDIF TAKE_OFF_PRISONER_BELT() IF bJumpingToStage bSkippedGlassSmash = TRUE iWindowSmashStage = 0 GIVE_FRANKLIN_SNIPER_RIFLE() SET_CHOPPER_TO_ESCAPE(TRUE) CREATE_PRISONER_FOR_STAGE(STAGE_CHOPPER_CHASE) //SETUP_PRISONER_WITH_BELT(TRUE) CREATE_ENEMY_CHOPPER(FALSE) SET_PED_INTO_VEHICLE(prisonerPed, snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], VS_BACK_RIGHT) DO_MR_K_AGITATED_ANIM() GIVE_MICHAEL_RIFLE() SET_MICHAEL_CUSTOM_DRIVEBY_IN_CHOPPER() FORCE_PED_AI_AND_ANIMATION_UPDATE(GET_MICHAEL_PED()) ENDIF START_SNATCH_AND_GRAB_AUDIO_SCENE(SNATCH_AND_GRAB_AUDIO_SCENE_CHOPPERS_ARRIVE_FRANKLIN) IF IS_VEHICLE_DRIVEABLE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) SET_VEHICLE_CAN_BE_TARGETTED(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], FALSE) ENDIF IF NOT IS_PED_INJURED(prisonerPed) SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(prisonerPed, TRUE) SET_ENTITY_PROOFS(prisonerPed, TRUE, TRUE, TRUE, TRUE, TRUE) ENDIF IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR]) SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], TRUE) ENDIF IF NOT IS_PED_INJURED(GET_MICHAEL_PED()) SET_PED_COMP_ITEM_CURRENT_SP(GET_MICHAEL_PED(), COMP_TYPE_PROPS, PROPS_EYES_NONE, FALSE) //CLEAR_PED_PROP(GET_MICHAEL_PED(), ANCHOR_EYES) ENDIF // FROM DROPOFF STAGE //CREATE_FBI_FOR_STAGE(STAGE_CHOPPER_CHASE) // END FROM DROPOFF STAGE FREEZE_FRANKLIN_AT_SNIPER(FALSE) IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_FRANKLIN //printstring("hit here AB!!") PRINTNL() SET_PLAYER_FORCE_SKIP_AIM_INTRO(PLAYER_ID(), TRUE) SET_PLAYER_FORCED_AIM(PLAYER_ID(), TRUE) FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID(), TRUE) DISPLAY_SNIPER_SCOPE_THIS_FRAME() ENDIF SETUP_SNIPER_RIFLE(FALSE, TRUE) //SET_PARTICLE_FX_BULLET_IMPACT_SCALE(2.2) iNextMrKSpeechTime = GET_GAME_TIMER() + 25000 iFranklinPanicTime = GET_GAME_TIMER() + 35000 iTrevorSayWeHitTime = GET_GAME_TIMER() + 120000 iLastEnemyRocketsTime = GET_GAME_TIMER() + 60000 iLeadHeliFireRocketsTime = GET_GAME_TIMER() + 24000 CLEAR_ANIM_DICT_REQUEST(SAG_ANIM_DICT_MISSION) iChopperChaseTime = GET_GAME_TIMER() IF bJumpingToStage WAIT(500) TRIGGER_MISSION_MUSIC_EVENT("FIB2_ESCAPE_CHOPPER_RESTART") ENDIF BREAK CASE STAGE_DROPOFF REMOVE_PED_FOR_DIALOGUE(snatchAndGrabConversation, 6) SET_SELECTOR_PED_DAMAGED(sSelectorPeds, SELECTOR_PED_FRANKLIN, FALSE) IF bJumpingToStage GIVE_MICHAEL_RIFLE() SET_MICHAEL_CUSTOM_DRIVEBY_IN_CHOPPER() ENDIF IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL]) TASK_PAUSE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], 100) michaelTargetVehicle = NULL ENDIF SET_PARTICLE_FX_BULLET_IMPACT_SCALE(1.0) SET_SELECTOR_PED_BLOCKED(sSelectorPeds, SELECTOR_PED_FRANKLIN, TRUE) DO_CHOPPER_TO_PED_AUDIO_SCENE(GET_CURRENT_PLAYER_PED_ENUM(), TRUE) IF bJumpingToStage hotswapStage = MISSION_HOTSWAP_STAGE_SELECT_CHARACTER //CREATE_FBI_FOR_STAGE(STAGE_DROPOFF) CREATE_PRISONER_FOR_STAGE(STAGE_DROPOFF) // SETUP_PRISONER_WITH_BELT(TRUE) //CREATE_RAPPEL_ANCHOR(rappelData, snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_ROPE_ANCHOR_OFFSET), GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_ROPE_ANCHOR_ROT)) //CREATE_CHOPPER_ROPE(ROPE_TYPE_SWINGING, STAGE_DROPOFF) //SET_ROPE_DANGLING(TRUE, FALSE) ///WAIT(0) ///SET_ROPE_PHYSICAL() /// IF IS_VEHICLE_DRIVEABLE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) AND NOT IS_PED_INJURED(PLAYER_PED_ID()) AND NOT IS_PED_INJURED(prisonerPed) SET_PED_INTO_VEHICLE(prisonerPed, snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], VS_BACK_RIGHT) DO_MR_K_AGITATED_ANIM() //SET_VEHICLE_FORWARD_SPEED(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER] ENDIF IF NOT IS_PED_INJURED(prisonerPed) SET_ENTITY_PROOFS(prisonerPed, TRUE, TRUE, TRUE, TRUE, TRUE) SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(prisonerPed, TRUE) ENDIF createFBIAtEndStage = CREATE_FBI_AT_END_STAGE_NOT_STARTED hangingHotswapState = HANGING_HOTSWAP_ON_TREVOR // michaelReloadState = MICHAEL_RELOAD_HAS_AMMO // fDrownTime = 0.0 bDoneTrevorFly = FALSE bDoneGotoSpeech = TRUE bDoneGoHomeSpeech = TRUE bDoForceHeliUpwards = TRUE bStartedWinding = FALSE bStoppedWinding = FALSE bDoneReattach = FALSE bStartedJourneyToLeaveHighRiseArea = FALSE bStartedRotateToLeaveHighRiseArea = FALSE bKnockedOff = FALSE bDoneTrevorCongratulateFranklinSpeech = TRUE bDoneFranklinSayChopperDownSpeech = TRUE iGetInTextStage = 2 bClearedAutopilot = FALSE bTrevorCachedTarget = FALSE bDoneFBITurnToFaceChopper = FALSE bDoneFBIWaveDownChopper = FALSE //iTrevorAbandonChopperTime = -1 iLeaveHighRiseAreaPoint = -1 //iTrevorTime = GET_GAME_TIMER() iChopperHelpTime = GET_GAME_TIMER() + 7000 iForceHeliUpwardsTime = GET_GAME_TIMER() iHeliFlyOffState = 0 fBelowWaveHeightTime = 0.0 //TRIGGER_MISSION_MUSIC_EVENT("FBI2_TEST_CHOPPER_DONE_ST") IF bForcePassOnShitskip //SET_PED_COORDS_KEEP_VEHICLE(PLAYER_PED_ID(), GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_DROPOFF)) //LOAD_SCENE(GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_DROPOFF)) SET_PLAYER_CONTROL(PLAYER_ID(), FALSE) ELSE TRIGGER_MISSION_MUSIC_EVENT("FIB2_FLIGHT_BACK_RT") ENDIF ENDIF BREAK ENDSWITCH PRINTSTRING("here10") PRINTNL() // set wanted level IF setStage <= STAGE_GET_TO_BUILDING 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 // set budgets IF setStage = STAGE_RAPPEL_DOWN SET_VEHICLE_POPULATION_BUDGET(3) SET_PED_POPULATION_BUDGET(0) ELIF setStage = STAGE_SNIPE_GUARDS SET_VEHICLE_POPULATION_BUDGET(1) SET_PED_POPULATION_BUDGET(0) ELIF setStage = STAGE_CHOPPER_CHASE SET_VEHICLE_POPULATION_BUDGET(2) SET_PED_POPULATION_BUDGET(0) ELIF setStage = STAGE_DROPOFF SET_VEHICLE_POPULATION_BUDGET(3) SET_PED_POPULATION_BUDGET(1) ELSE SET_VEHICLE_POPULATION_BUDGET(3) SET_PED_POPULATION_BUDGET(3) ENDIF IF bJumpingToStage IF setStage <> STAGE_SNIPE_GUARDS AND setStage <> STAGE_CHOPPER_CHASE IF ENUM_TO_INT(setStage) > 0 IF NOT g_bMagDemoActive SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0) ELSE IF bDebugSkipMagdemoStart SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0) ENDIF ENDIF ELSE IF g_bMagDemoActive IF bDebugSkipMagdemoStart SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0) ENDIF ENDIF ENDIF ENDIF ENDIF // damage and speed stats IF setStage = STAGE_GET_TO_CHOPPER IF IS_VEHICLE_DRIVEABLE(snatchAndGrabVehicle[SAGV_MICHAEL_CAR]) INFORM_MISSION_STATS_OF_DAMAGE_WATCH_ENTITY(snatchAndGrabVehicle[SAGV_MICHAEL_CAR]) INFORM_MISSION_STATS_OF_SPEED_WATCH_ENTITY(snatchAndGrabVehicle[SAGV_MICHAEL_CAR]) ENDIF ELSE IF IS_VEHICLE_DRIVEABLE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) INFORM_MISSION_STATS_OF_DAMAGE_WATCH_ENTITY(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) INFORM_MISSION_STATS_OF_SPEED_WATCH_ENTITY(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) ENDIF ENDIF // cheats IF setStage >= STAGE_RAPPEL_DOWN DISABLE_CHEAT(CHEAT_TYPE_GIVE_WEAPONS, TRUE) ELSE DISABLE_CHEAT(CHEAT_TYPE_GIVE_WEAPONS, FALSE) ENDIF SET_SELECTOR_PED_HINT(sSelectorPeds, SELECTOR_PED_MICHAEL, FALSE) SET_SELECTOR_PED_HINT(sSelectorPeds, SELECTOR_PED_FRANKLIN, FALSE) SET_SELECTOR_PED_HINT(sSelectorPeds, SELECTOR_PED_TREVOR, FALSE) SET_SELECTOR_PED_DAMAGED(sSelectorPeds, SELECTOR_PED_MICHAEL, FALSE) SET_SELECTOR_PED_DAMAGED(sSelectorPeds, SELECTOR_PED_FRANKLIN, FALSE) SET_SELECTOR_PED_DAMAGED(sSelectorPeds, SELECTOR_PED_TREVOR, FALSE) IF setStage < STAGE_SNIPE_GUARDS REMOVE_PORTAL_SETTINGS_OVERRIDE("V_CIA_PS_WINDOW_UNBROKEN") ELSE SET_PORTAL_SETTINGS_OVERRIDE("V_CIA_PS_WINDOW_UNBROKEN", "V_CIA_PS_WINDOW_BROKEN") ENDIF // set value for replay BOOL bFinalCheckpoint = FALSE IF ENUM_TO_INT(setStage) >= ENUM_TO_INT(STAGE_DROPOFF) 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 PRINTSTRING("here11") PRINTNL() 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_GET_TO_BUILDING CASE STAGE_DROPOFF endReplayVehicle = snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER] BREAK CASE STAGE_GET_TO_CHOPPER IF bForcePassOnShitskip endReplayVehicle = snatchAndGrabVehicle[SAGV_MICHAEL_CAR] ENDIF BREAK ENDSWITCH BOOL bReturnControl = TRUE IF setStage = STAGE_RAPPEL_DOWN bReturnControl = FALSE ENDIF END_REPLAY_SETUP(endReplayVehicle, VS_DRIVER, bReturnControl) bSuppressFutureReplaySetups = TRUE ENDIF ENDIF ENDIF // post replay setup specific skip stuff SWITCH setStage CASE STAGE_GET_TO_CHOPPER IF bJumpingToStage PRINTSTRING("update food court for chopper 2") PRINTNL() UPDATE_FOOD_COURT(FALSE, STAGE_GET_TO_CHOPPER) ENDIF 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, 2000) ENDIF SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0) BREAK CASE STAGE_SNIPE_GUARDS IF bJumpingToStage DO_STREAM_VOLUME_ON_OFFICE(TRUE) ENDIF INT iWindowSmashTime iWindowSmashTime = GET_GAME_TIMER() + 1000 WHILE GET_GAME_TIMER() < iWindowSmashTime //AND iWindowSmashStage < 3 WAIT(0) HANDLE_WINDOW_SMASH(TRUE, TRUE) ENDWHILE SETUP_SNIPER_RIFLE(TRUE, FALSE) BREAK CASE STAGE_CHOPPER_CHASE SETUP_SNIPER_RIFLE(FALSE, TRUE) BREAK CASE STAGE_GET_TO_BUILDING CASE STAGE_DROPOFF IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) ENDIF IF setStage = STAGE_GET_TO_BUILDING SET_GAMEPLAY_CAM_RELATIVE_HEADING(18.0) SET_GAMEPLAY_CAM_RELATIVE_PITCH(20.0) ENDIF IF setStage = STAGE_DROPOFF IF NOT IS_PED_INJURED(GET_MICHAEL_PED()) SET_CURRENT_PED_WEAPON(GET_MICHAEL_PED(), GET_SNATCH_AND_GRAB_WEAPON_TYPE(SAG_WEAPON_MICHAEL_RIFLE), TRUE) ENDIF ENDIF BREAK ENDSWITCH ENDIF // after rest of setup common stuff SWITCH setStage CASE STAGE_FOOD_COURT 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, 1300) ENDIF BREAK ENDSWITCH IF bJumpingToStage PRINTSTRING("HEREA") PRINTNL() IF bHandleFadeIn PRINTSTRING("HEREB") PRINTNL() IF setStage = STAGE_GET_TO_CHOPPER WAIT(0) ENDIF IF setStage = STAGE_DROPOFF iFadeInTime = GET_GAME_TIMER() + 500 WHILE GET_GAME_TIMER() < iFadeInTime WAIT(0) FORCE_CHOPPER_UP() ENDWHILE IF IS_VEHICLE_DRIVEABLE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) APPLY_FORCE_TO_ENTITY(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], APPLY_TYPE_IMPULSE, <<0,0,0.15>>, <<0,-7,0>>, 0, TRUE, TRUE, TRUE) SET_VEHICLE_FORWARD_SPEED(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], 25) ENDIF WAIT(0) ENDIF IF setStage <> STAGE_CHOPPER_CHASE IF IS_SCREEN_FADED_OUT() PRINTSTRING("HEREC") PRINTNL() DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME) ENDIF ENDIF ENDIF ENDIF STOP_PED_SPEAKING(PLAYER_PED_ID(), FALSE) PRINTSTRING("here12") PRINTNL() iStartMissionStageTime = GET_GAME_TIMER() currentMissionStage = setStage ENDPROC // handle streaming mocap PROC HANDLE_STREAMING_MOCAP(STRING sMocap, VECTOR vStreamPos, FLOAT fStreamInDistance, FLOAT fStreamOutDistance) SWITCH mocapStreamingStage CASE MOCAP_STREAMING_STAGE_REQUEST IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), vStreamPos, <>) REQUEST_CUTSCENE(sMocap) mocapStreamingStage = MOCAP_STREAMING_STAGE_WAIT ENDIF BREAK CASE MOCAP_STREAMING_STAGE_WAIT IF HAS_CUTSCENE_LOADED() mocapStreamingStage = MOCAP_STREAMING_STAGE_COMPLETE ENDIF BREAK CASE MOCAP_STREAMING_STAGE_COMPLETE IF NOT IS_ENTITY_AT_COORD(PLAYER_PED_ID(), vStreamPos, <>) REMOVE_CUTSCENE() mocapStreamingStage = MOCAP_STREAMING_STAGE_REQUEST ENDIF BREAK ENDSWITCH ENDPROC // should we start streaming for next mission stage? FUNC BOOL SHOULD_START_STREAMING_FOR_NEXT_MISSION_STAGE() SWITCH currentMissionStage CASE STAGE_FOOD_COURT IF bRunningCutscene AND GET_CUTSCENE_TIME() >= 110000 RETURN TRUE ENDIF BREAK CASE STAGE_GET_TO_CHOPPER //IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_CHOPPER_INIT), <<100, 100, 100>>) IF bRunningCutscene RETURN TRUE ENDIF BREAK CASE STAGE_GET_TO_BUILDING IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_HOVER_TARGET), <<120, 120, 120>>) RETURN TRUE ENDIF BREAK CASE STAGE_RAPPEL_DOWN //IF bAllowSmashIn IF bRunningCutscene AND smashThroughShot >= SMASH_THROUGH_WAIT_FOR_SWITCH RETURN TRUE ENDIF BREAK CASE STAGE_SNIPE_GUARDS IF prisonerGrabState >= PRISONER_GRAB_STATE_EXTRACT RETURN TRUE ENDIF BREAK CASE STAGE_CHOPPER_CHASE RETURN TRUE BREAK CASE STAGE_DROPOFF RETURN FALSE BREAK //CASE STAGE_DROPOFF_PRISONER // 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_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) // PRINTSTRING("debug skip mocap!!") PRINTNL() 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 STOP_GAMEPLAY_HINT() CANCEL_RAPPEL(rappelData) DELETE_RAPPEL_ROPE(rappelData) //DELETE_CHECKPOINT(jumpCheckpoint) SET_HIDOF_OVERRIDE(FALSE, TRUE, 0, 0, 0, 0) IF STREAMVOL_IS_VALID(foodCourtStreamingVolume) STREAMVOL_DELETE(foodCourtStreamingVolume) ENDIF IF STREAMVOL_IS_VALID(officeVolume) STREAMVOL_DELETE(officeVolume) ENDIF IF STREAMVOL_IS_VALID(sniperVolume) STREAMVOL_DELETE(sniperVolume) ENDIF NEW_LOAD_SCENE_STOP() IF NOT IS_PED_INJURED(PLAYER_PED_ID()) RESET_PED_IN_VEHICLE_CONTEXT(PLAYER_PED_ID()) CLEAR_PED_DRIVE_BY_CLIPSET_OVERRIDE(PLAYER_PED_ID()) SET_PLAYER_FORCED_AIM(PLAYER_ID(), FALSE) CUSTOM_UNFREEZE_PLAYER() IF IS_ENTITY_ATTACHED(PLAYER_PED_ID()) IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) AND GET_VEHICLE_PED_IS_USING(PLAYER_PED_ID()) = NULL DETACH_ENTITY(PLAYER_PED_ID()) ENDIF ENDIF ENDIF RESET_MISSION_STATS_ENTITY_WATCH() OVERRIDE_PLAYER_GROUND_MATERIAL(GET_HASH_KEY("AM_BASE_GLASS_STRONG"),FALSE) bCreatedOfficePedsForRappel = FALSE SET_PLAYER_OUT_OF_ANY_VEHICLE() IF IS_NEW_LOAD_SCENE_ACTIVE() NEW_LOAD_SCENE_STOP() ENDIF DO_STREAM_VOLUME_ON_OFFICE(FALSE) STOP_ALL_SNATCH_AND_GRAB_AUDIO_SCENES() //SCRIPT_OVERRIDES_WIND_TYPES(FALSE, "", "") STOP_SOUND(iDangleSoundID) STOP_SOUND(iSmashSoundID) STOP_SOUND(iRappelWindSoundID) STOP_SOUND(iFaintHeliSoundID) STOP_SOUND(iSniperSwitchSoundID) sSelectorPeds.bBlockSelectorPed[SELECTOR_PED_MICHAEL] = FALSE sSelectorPeds.bBlockSelectorPed[SELECTOR_PED_FRANKLIN] = FALSE sSelectorPeds.bBlockSelectorPed[SELECTOR_PED_TREVOR] = FALSE // delete entities REPEAT 3 i IF DOES_ENTITY_EXIST(sSelectorPeds.pedID[i]) DELETE_PED(sSelectorPeds.pedID[i]) ENDIF ENDREPEAT IF DOES_ENTITY_EXIST(davePed) DELETE_PED(davePed) ENDIF IF DOES_ENTITY_EXIST(stevePed) DELETE_PED(stevePed) ENDIF IF DOES_ENTITY_EXIST(andreasPed) DELETE_PED(andreasPed) ENDIF IF DOES_ENTITY_EXIST(prisonerPed) DELETE_PED(prisonerPed) ENDIF IF DOES_ENTITY_EXIST(michellePed) DELETE_PED(michellePed) ENDIF IF DOES_ENTITY_EXIST(dummyFranklinPed) DELETE_PED(dummyFranklinPed) ENDIF IF DOES_ENTITY_EXIST(dummyTrevorPed) DELETE_PED(dummyTrevorPed) ENDIF REPEAT NUMBER_FBI_AGENTS i IF DOES_ENTITY_EXIST(fbiPed[i]) DELETE_PED(fbiPed[i]) ENDIF ENDREPEAT IF DOES_ENTITY_EXIST(fbiVanVehicle) DELETE_VEHICLE(fbiVanVehicle) ENDIF REPEAT NUMBER_ENEMY_CHOPPERS i IF DOES_ENTITY_EXIST(enemyChopperVehicle[i]) DELETE_VEHICLE(enemyChopperVehicle[i]) ENDIF ENDREPEAT REPEAT COUNT_OF(utilTruckVehicle) i IF DOES_ENTITY_EXIST(utilTruckVehicle[i]) DELETE_VEHICLE(utilTruckVehicle[i]) ENDIF ENDREPEAT IF DOES_ENTITY_EXIST(driveAwayVehicle) DELETE_VEHICLE(driveAwayVehicle) ENDIF REPEAT NUMBER_GUARDS i IF DOES_ENTITY_EXIST(guardPed[i]) DELETE_PED(guardPed[i]) ENDIF ENDREPEAT REPEAT NUMBER_REINFORCEMENTS i IF DOES_ENTITY_EXIST(reinforcementPed[i]) DELETE_PED(reinforcementPed[i]) ENDIF ENDREPEAT REPEAT NUMBER_TOWER_PEDS i IF DOES_ENTITY_EXIST(towerPed[i]) DELETE_PED(towerPed[i]) ENDIF ENDREPEAT REPEAT NUMBER_ENEMY_CHOPPERS*3 i IF DOES_ENTITY_EXIST(enemyChopperPed[i]) DELETE_PED(enemyChopperPed[i]) ENDIF ENDREPEAT REPEAT COUNT_OF(snatchAndGrabVehicle) i IF DOES_ENTITY_EXIST(snatchAndGrabVehicle[i]) DELETE_VEHICLE(snatchAndGrabVehicle[i]) ENDIF ENDREPEAT REPEAT COUNT_OF(trafficVehicle) i IF DOES_ENTITY_EXIST(trafficVehicle[i]) DELETE_VEHICLE(trafficVehicle[i]) ENDIF ENDREPEAT WAIT(0) IF DOES_ENTITY_EXIST(harnessObject) DELETE_OBJECT(harnessObject) ENDIF IF DOES_ENTITY_EXIST(torchObject) DELETE_OBJECT(torchObject) ENDIF IF DOES_ENTITY_EXIST(chairObject) DELETE_OBJECT(chairObject) ENDIF REPEAT NUMBER_FROZEN_CHAIRS i IF DOES_ENTITY_EXIST(frozenChairObject[i]) SET_OBJECT_AS_NO_LONGER_NEEDED(frozenChairObject[i]) ENDIF ENDREPEAT REPEAT NUMBER_TOWER_CHAIRS i IF DOES_ENTITY_EXIST(towerChairObject[i]) SET_OBJECT_AS_NO_LONGER_NEEDED(towerChairObject[i]) ENDIF ENDREPEAT REPEAT NUMBER_FOOD_COURT_CHAIRS i IF DOES_ENTITY_EXIST(foodCourtChairObject[i]) SET_OBJECT_AS_NO_LONGER_NEEDED(foodCourtChairObject[i]) ENDIF ENDREPEAT REPEAT 3 i IF DOES_ENTITY_EXIST(coffeeObject[i]) DELETE_OBJECT(coffeeObject[i]) ENDIF ENDREPEAT // IF DOES_ENTITY_EXIST(hookObject) // DELETE_OBJECT(hookObject) // ENDIF // IF DOES_ENTITY_EXIST(sniperObject) // DELETE_OBJECT(sniperObject) // bCreatedSniper = FALSE // ENDIF // IF DOES_ENTITY_EXIST(waterTestObject) // DELETE_OBJECT(waterTestObject) // ENDIF IF DOES_ENTITY_EXIST(franklinAnchorObject) DELETE_OBJECT(franklinAnchorObject) ENDIF IF DOES_ENTITY_EXIST(michaelGunObject) DELETE_OBJECT(michaelGunObject) ENDIF //CLEANUP_REMOTE_SNIPER(remoteSniperData) IF DOES_CAM_EXIST(staticCam) DESTROY_CAM(staticCam) ENDIF IF DOES_CAM_EXIST(animCam) DESTROY_CAM(animCam) ENDIF IF DOES_CAM_EXIST(ropeCam) DESTROY_CAM(ropeCam) ENDIF //IF DOES_CAM_EXIST(followCam) // DESTROY_CAM(followCam) //ENDIF #IF IS_DEBUG_BUILD bDebugDontFailOnKnockoff = FALSE #ENDIF CLEAR_AREA(GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_CHOPPER_INIT), 10000, TRUE) ENDPROC // common stuff to clear mission PROC COMMON_MISSION_CLEAR() CANCEL_RAPPEL(rappelData) KILL_CHASE_HINT_CAM(localChaseHintCamStruct) fHoverPlaybackSpeed = CHOPPER_HOVER_SPEED 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 DISPLAY_HUD(TRUE) DISPLAY_RADAR(TRUE) SET_TIME_SCALE(1.0) //CLEAR_WEATHER_TYPE_PERSIST() PAUSE_CLOCK(FALSE) SET_VEHICLE_POPULATION_BUDGET(3) SET_PED_POPULATION_BUDGET(3) SET_FAR_DRAW_VEHICLES(FALSE) CASCADE_SHADOWS_SET_CASCADE_BOUNDS_SCALE(CASCADE_SHADOWS_MULTIPLIER_NO_OVERRIDE) CASCADE_SHADOWS_SET_ENTITY_TRACKER_SCALE(1.0) CASCADE_SHADOWS_SET_AIRCRAFT_MODE(FALSE) SET_PARTICLE_FX_BULLET_IMPACT_SCALE(1.0) SET_PLAYER_CONTROL(PLAYER_ID(), TRUE) TASK_CLEAR_LOOK_AT(PLAYER_PED_ID()) SET_PED_RELATIONSHIP_GROUP_HASH(PLAYER_PED_ID(), RELGROUPHASH_PLAYER) SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE) DISABLE_CELLPHONE(FALSE) SET_PLAYER_FORCED_AIM(PLAYER_ID(), 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, "FBI 2: 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_FOOD_COURT nextReplayStage = STAGE_GET_TO_CHOPPER BREAK CASE STAGE_GET_TO_CHOPPER nextReplayStage = STAGE_GET_TO_CHOPPER bForcePassOnShitskip = TRUE BREAK CASE STAGE_GET_TO_BUILDING nextReplayStage = STAGE_GET_TO_BUILDING bForcePassOnShitskip = TRUE BREAK CASE STAGE_RAPPEL_DOWN nextReplayStage = STAGE_RAPPEL_DOWN bForcePassOnShitskip = TRUE BREAK CASE STAGE_SNIPE_GUARDS nextReplayStage = STAGE_CHOPPER_CHASE BREAK CASE STAGE_CHOPPER_CHASE nextReplayStage = STAGE_DROPOFF BREAK CASE STAGE_DROPOFF nextReplayStage = STAGE_DROPOFF bForcePassOnShitskip = TRUE //bPassMission = TRUE BREAK ENDSWITCH //IF NOT bPassMission // set the next mission stage nicely COMMON_MISSION_CLEAR() IF NOT bForcePassOnShitskip SET_MISSION_STAGE(nextReplayStage, TRUE) ELSE SET_MISSION_STAGE(nextReplayStage, TRUE, TRUE, TRUE, FALSE, TRUE, FALSE) ENDIF //WAIT(SKIP_FADE_WAIT_TIME) //DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME) //ELSE // terminate the mission for last stage // DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME) // MISSION_PASSED() //ENDIF RETURN TRUE ELSE CPRINTLN(DEBUG_REPLAY, "FBI 2: no shitskip") ENDIF ENDIF RETURN FALSE // did not do a shitskip ENDFUNC // do mission init start mission PROC DO_MISSION_INIT_START_MISSION() // stats //INFORM_MISSION_STATS_OF_MISSION_START_FBI_TWO() // relgroups ADD_RELATIONSHIP_GROUP("Agency Group", agencyRelGroup) SET_PLAYER_CONTROL(PLAYER_ID(), TRUE) IF STREAMVOL_IS_VALID(foodCourtStreamingVolume) STREAMVOL_DELETE(foodCourtStreamingVolume) ENDIF 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, TRUE, TRUE) ELSE #ENDIF IF g_bMagDemoActive SET_PLAYER_PED_AVAILABLE(CHAR_FRANKLIN, TRUE) SET_PLAYER_PED_AVAILABLE(CHAR_MICHAEL, TRUE) SET_PLAYER_PED_AVAILABLE(CHAR_TREVOR, TRUE) SET_MISSION_FLOW_FLAG_STATE(FLOWFLAG_PLAYER_PED_INTRODUCED_M, TRUE) SET_MISSION_FLOW_FLAG_STATE(FLOWFLAG_PLAYER_PED_INTRODUCED_T, TRUE) SET_MISSION_FLOW_FLAG_STATE(FLOWFLAG_PLAYER_PED_INTRODUCED_F, TRUE) SET_MISSION_STAGE(STAGE_GET_TO_CHOPPER, TRUE, TRUE, TRUE, FALSE, TRUE, TRUE, FALSE) ELSE SET_MISSION_STAGE(STAGE_FOOD_COURT, FALSE, TRUE, FALSE, TRUE) SET_MISSION_CUTSCENE(FALSE) ENDIF #IF IS_DEBUG_BUILD ENDIF #ENDIF ELSE //CLEAR_START_AREA() SET_MISSION_STAGE(STAGE_GET_TO_CHOPPER, TRUE, TRUE, TRUE, TRUE, FALSE, TRUE) ENDIF ELSE IF HANDLE_MISSION_SHITSKIP() CPRINTLN(DEBUG_REPLAY, "FBI 2: shitskip done") ELSE INT iReplayStage iReplayStage = Get_Replay_Mid_Mission_Stage() IF iReplayStage = 0 SET_MISSION_STAGE(STAGE_FOOD_COURT, TRUE, TRUE, TRUE, FALSE, TRUE, TRUE) ELSE SET_MISSION_STAGE(INT_TO_ENUM(MISSION_STAGE_ENUM, iReplayStage), TRUE) ENDIF ENDIF ENDIF //IF IS_SCREEN_FADED_OUT() //OR IS_SCREEN_FADING_OUT() // IF NOT bForcePassOnShitskip // don't fade in straight away for end stage - special case // DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME) // ENDIF //ENDIF ENDIF missionInitStage = MISSION_INIT_DONE ENDPROC FUNC VECTOR CONVERT_ROTATION_TO_DIRECTION_VECTOR(VECTOR vRot) RETURN <<-SIN(vRot.z) * COS(vRot.x), COS(vRot.z) * COS(vRot.x), SIN(vRot.x)>> ENDFUNC PROC ADD_STREAMING_VOLUME_FOR_FOOD_COURT() IF STREAMVOL_IS_VALID(foodCourtStreamingVolume) STREAMVOL_DELETE(foodCourtStreamingVolume) ENDIF foodCourtStreamingVolume = STREAMVOL_CREATE_FRUSTUM(GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_MICHAEL_AT_FOOD_COURT), CONVERT_ROTATION_TO_DIRECTION_VECTOR(<<0,0,MICHAEL_AT_FOOD_COURT_ROT>>), 150, FLAG_MAPDATA) ENDPROC // initialise mission FUNC BOOL INIT_MISSION() SWITCH missionInitStage CASE MISSION_INIT_PRE_INTRO SUPPRESS_MISSION_MODELS(TRUE) DISABLE_SELECTOR_QUICK_SWITCH_TO_DAMAGED_PED(TRUE) SET_GROUP_FORMATION_SPACING(PLAYER_GROUP_ID(), 3.5) //ADD_MISC_ASSET_REQUEST(SAG_MISC_ASSET_FOOD_COURT_ANIMS) ENABLE_CARGENS_FOR_MISSION(FALSE) g_savedGlobals.sAmbient.iChaseHelpTextDisplayed_mission = iCHASE_HINT_HELP_DISPLAY_MAX IF NOT Is_Replay_In_Progress() iReplayAttempt = 0 ELSE iReplayAttempt = g_savedGlobals.sFlow.missionSavedData[SP_MISSION_FBI_2].missionFailsNoProgress + 1 ENDIF IF NOT IS_PED_INJURED(PLAYER_PED_ID()) STOP_PED_SPEAKING(PLAYER_PED_ID(), TRUE) ENDIF ADD_DOOR_TO_SYSTEM(DOORHASH_OPEN_DOOR, V_iLev_FIB_door1, <<119.40, -618.92, 206.20>>) ADD_DOOR_TO_SYSTEM(DOORHASH_CLOSED_DOOR1, V_iLev_FIB_door1, <<123.22, -626.67, 206.2>>) ADD_DOOR_TO_SYSTEM(DOORHASH_CLOSED_DOOR2, V_iLev_FIB_door1, <<121.22, -626.31, 206.20>>) IF NOT g_bMagDemoActive //SET_PLAYER_CONTROL(PLAYER_ID(), FALSE, SPC_LEAVE_CAMERA_CONTROL_ON) lotScenarioBlocking = ADD_SCENARIO_BLOCKING_AREA(<<1321.17, -2143.95, -10>>, <<1468.61, -2001.32, 110>>) ENDIF tableScenarioBlocking = ADD_SCENARIO_BLOCKING_AREA(<<145.69, -678.70, -10>>, <<153.69, -671.30, 110>>) rampScenarioBlocking = ADD_SCENARIO_BLOCKING_AREA(<<116.38534, -685.83795, -10.04556>>, <<123.69625, -680.50031, 50.02924>>) //skyScenarioBlocking = ADD_SCENARIO_BLOCKING_AREA(<<-574.4, -1176, 50>>, <<554, -387, 600>>) // temp missionInitStage = MISSION_INIT_REQUEST_INTRO BREAK CASE MISSION_INIT_REQUEST_INTRO IF NOT Is_Replay_In_Progress() #IF IS_DEBUG_BUILD AND iDebugStage < 0 #ENDIF AND NOT g_bMagDemoActive REMOVE_MISSION_TEXT(TRUE, TRUE, FALSE) missionInitStage = MISSION_INIT_WAIT_FOR_INTRO ELSE REMOVE_MISSION_TEXT() DO_MISSION_INIT_START_MISSION() ENDIF BREAK CASE MISSION_INIT_WAIT_FOR_INTRO SET_MISSION_CUTSCENE(TRUE) PREVENT_WANTED_LEVEL_FOR_CUTSCENE() ADD_MODEL_REQUEST(ENUM_TO_INT(SAGM_STEVE)) ADD_MODEL_REQUEST(ENUM_TO_INT(SAGM_DAVE)) ADD_MODEL_REQUEST(ENUM_TO_INT(SAGM_ANDREAS)) ADD_MODEL_REQUEST(ENUM_TO_INT(SAGM_COFFEE)) ADD_ANIM_DICT_REQUEST(SAG_ANIM_DICT_FOOD_COURT) REQUEST_TEXT(FALSE) printstring("check weather") printnl() SET_WEATHER_TYPE_OVERTIME_PERSIST("EXTRASUNNY", 12.0) IF NOT IS_PED_INJURED(PLAYER_PED_ID()) SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_UNARMED, TRUE) CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID()) SET_ENTITY_COORDS(PLAYER_PED_ID(), <<69.20226, -748.92065, 43.22582>>) SET_ENTITY_HEADING(PLAYER_PED_ID(), -86.60) //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, 1300) //ENDIF TASK_GO_STRAIGHT_TO_COORD(PLAYER_PED_ID(), <<85.37592, -747.95929, 44.75402>>, PEDMOVE_WALK) SET_PLAYER_CLOTH_PIN_FRAMES(PLAYER_ID(), 1) ENDIF PAUSE_CLOCK(TRUE) RESOLVE_VEHICLES_INSIDE_ANGLED_AREA_WITH_SIZE_LIMIT(<<66.39131, -749.31171, 42.22663>>, <<86.92158, -746.64587, 45.5075422>>, 5, GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_MOVE_LAST_PLAYER_VEHICLE), MOVE_LAST_PLAYER_VEHICLE_ROT, GET_DEFAULT_ALLOWABLE_VEHICLE_SIZE_VECTOR(), TRUE, FALSE, TRUE) RESOLVE_VEHICLES_INSIDE_ANGLED_AREA_WITH_SIZE_LIMIT(<<60.45767, -749.65277, 43.22444>>, <<57.86939, -756.62573, 48.21973>>, 6.56, GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_MOVE_LAST_PLAYER_VEHICLE), MOVE_LAST_PLAYER_VEHICLE_ROT, GET_DEFAULT_ALLOWABLE_VEHICLE_SIZE_VECTOR(), TRUE, FALSE, TRUE) CLEAR_AREA_OF_PROJECTILES(<<69.40771, -748.54315, 43.22363>>, 20) STOP_FIRE_IN_RANGE(<<69.40771, -748.54315, 43.22363>>, 20) REMOVE_PARTICLE_FX_IN_RANGE(<<69.40771, -748.54315, 43.22363>>, 20) CREATE_CAM_FOR_SNATCH_AND_GRAB_SHOT(SAG_SHOT_FIB1, TRUE, 8000) IF NOT IS_TIME_BETWEEN_THESE_HOURS(g_sMissionStaticData[SP_MISSION_FBI_2].startHour, g_sMissionStaticData[SP_MISSION_FBI_2].endHour) printstring("tower vol added") printnl() bFlashOnTimeLapse = TRUE foodCourtStreamingVolume = STREAMVOL_CREATE_FRUSTUM(<<50.3, -734.0, 230.0>>, CONVERT_ROTATION_TO_DIRECTION_VECTOR(<<18.2, 0.0, -65.5>>), 3000, FLAG_MAPDATA) ELSE printstring("food court vol added") printnl() bFlashOnTimeLapse = FALSE ADD_STREAMING_VOLUME_FOR_FOOD_COURT() ENDIF IF IS_SCREEN_FADED_OUT() DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME) ENDIF bDoneFlash = FALSE iSnatchAndGrabCutsceneTime = GET_GAME_TIMER() missionInitStage = MISSION_INIT_PLAY_INTRO BREAK CASE MISSION_INIT_PLAY_INTRO SET_ALL_RANDOM_PEDS_FLEE_THIS_FRAME(PLAYER_ID()) BOOL bAllSucceeded bAllSucceeded = FALSE IF HAVE_ALL_MODEL_REQUESTS_SUCCEEDED() AND HAVE_ALL_ANIM_DICT_REQUESTS_SUCCEEDED() bAllSucceeded = TRUE ENDIF IF bAllSucceeded CREATE_GUYS_AT_FOOD_COURT(FALSE) // clear parasols CLEAR_AREA_OF_OBJECTS(<<145.77409, -676.72235, 41.02924>>, 30.0, CLEAROBJ_FLAG_FORCE) ENDIF UPDATE_FOOD_COURT(FALSE, STAGE_FOOD_COURT) IF NOT bDoneFlash IF GET_FOLLOW_PED_CAM_VIEW_MODE() = CAM_VIEW_MODE_FIRST_PERSON INT iFlashTime IF NOT bFlashOnTimeLapse iFlashTime = 8330 ELSE IF bDoneTopOfTowerShot iFlashTime = 6230 ELSE iFlashTime = 999999 ENDIF ENDIF IF GET_GAME_TIMER() >= iSnatchAndGrabCutsceneTime + iFlashTime IF bAllSucceeded ANIMPOSTFX_PLAY("CamPushInNeutral", 0, FALSE) PLAY_SOUND_FRONTEND(-1, "1st_Person_Transition", "PLAYER_SWITCH_CUSTOM_SOUNDSET") ENDIF bDoneFlash = TRUE ENDIF ENDIF ENDIF IF NOT bDoneTopOfTowerShot IF NOT bSkippedCutscene 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 iSkipTime = GET_GAME_TIMER() bSkippedCutscene = TRUE ENDIF ENDIF IF (GET_GAME_TIMER() >= iSnatchAndGrabCutsceneTime + 8600 OR bSkippedCutscene) AND bAllSucceeded CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID()) SET_ENTITY_COORDS(PLAYER_PED_ID(), GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_MICHAEL_AT_FOOD_COURT)) SET_ENTITY_HEADING(PLAYER_PED_ID(), MICHAEL_AT_FOOD_COURT_ROT) IF bSkippedCutscene WHILE GET_GAME_TIMER() <= iSkipTime + 5000 AND NOT STREAMVOL_HAS_LOADED(foodCourtStreamingVolume) WAIT(0) ENDWHILE ENDIF //CREATE_CAM_FOR_SNATCH_AND_GRAB_SHOT(SAG_SHOT_FIB2, TRUE, 7000) iSnatchAndGrabCutsceneTime = GET_GAME_TIMER() bDoneTopOfTowerShot = TRUE ENDIF ELSE BOOL bResetShadowsOnTimeLapse bResetShadowsOnTimeLapse = TRUE IF DO_TIMELAPSE(SP_MISSION_FBI_2, sTimelapse) IF GET_GAME_TIMER() >= iSnatchAndGrabCutsceneTime + 6500 OR NOT bWasTimeLapseRunning OR IS_SCREEN_FADED_OUT() PAUSE_CLOCK(FALSE) IF IS_SCREEN_FADED_OUT() iSkipTime = GET_GAME_TIMER() WHILE GET_GAME_TIMER() <= iSkipTime + 5000 AND NOT STREAMVOL_HAS_LOADED(foodCourtStreamingVolume) WAIT(0) ENDWHILE ENDIF MISSION_FLOW_RELEASE_TRIGGER_SCENE_ASSETS(SP_MISSION_FBI_2) DO_MISSION_INIT_START_MISSION() bResetShadowsOnTimeLapse = FALSE //DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME) ENDIF ELSE IF NOT bWasTimeLapseRunning IF DOES_CAM_EXIST(sTimelapse.splineCamera) IF IS_SCREEN_FADED_OUT() DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME) ENDIF ADD_STREAMING_VOLUME_FOR_FOOD_COURT() bWasTimeLapseRunning = TRUE ENDIF ENDIF ENDIF IF bResetShadowsOnTimeLapse CASCADE_SHADOWS_SET_CASCADE_BOUNDS_SCALE(0.6) CASCADE_SHADOWS_ENABLE_ENTITY_TRACKER(FALSE) CASCADE_SHADOWS_ENABLE_FREEZER(FALSE) //#1439834 ELSE CASCADE_SHADOWS_INIT_SESSION() CASCADE_SHADOWS_ENABLE_FREEZER(TRUE) CASCADE_SHADOWS_ENABLE_ENTITY_TRACKER(TRUE) ENDIF //IF GET_GAME_TIMER() >= iSnatchAndGrabCutsceneTime + 8000 // //ENDIF 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(BOOL bResetPlayer = TRUE) 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 bResetPlayer IF NOT IS_PED_INJURED(PLAYER_PED_ID()) SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(PLAYER_PED_ID(), FALSE) SET_ENTITY_PROOFS(PLAYER_PED_ID(), FALSE, FALSE, FALSE, FALSE, FALSE) ENDIF ENDIF ENDPROC // common start functions for creating a custom hotswap PROC DO_COMMON_CUSTOM_HOTSWAP_START(CAMERA_TYPE type = CAMTYPE_SPLINE_DEFAULT) CLEANUP_HOTSWAP_CAMERAS() IF DOES_CAM_EXIST(sCamDetails.camID) DESTROY_CAM(sCamDetails.camID) ENDIF sCamDetails.camID = CREATE_CAMERA(type, 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 //SWITCH CAM VARIABLES AND PROCEDURES ENUM FIB2_SWITCH_CAM_STATE SWITCH_CAM_IDLE, SWITCH_CAM_REQUEST_ASSETS, SWITCH_CAM_SETUP_SPLINE, SWITCH_CAM_PLAYING_SPLINE, SWITCH_CAM_SHUTDOWN_SPLINE, SWITCH_CAM_RETURN_TO_GAMEPLAY ENDENUM FIB2_SWITCH_CAM_STATE eSwitchCamState = SWITCH_CAM_IDLE //[MF] Monitor the currently active branched switches. ENUM FIB2_CURRENT_BRANCHED_SWITCH_ACTIVE BRANCHED_SWITCH_INACTIVE, BRANCHED_SWITCH_FRANKLIN_TO_TREVOR_ACTIVE, BRANCHED_SWITCH_FRANKLIN_TO_MICHAEL_ACTIVE, BRANCHED_SWITCH_MICHAEL_TO_FRANKLIN_ACTIVE, BRANCHED_SWITCH_TREVOR_TO_FRANKLIN_ACTIVE ENDENUM FIB2_CURRENT_BRANCHED_SWITCH_ACTIVE eCurrentBranchedSwitchState SWITCH_CAM_STRUCT scsSwitch_HangingToSniper SWITCH_CAM_STRUCT scsSwitch_Heli_TrevorToMichael SWITCH_CAM_STRUCT scsSwitch_Heli_MichaelToTrevor SWITCH_CAM_STRUCT scsSwitch_Heli_Trevor_ToFranklin SWITCH_CAM_STRUCT scsSwitch_Heli_Michael_ToFranklin SWITCH_CAM_STRUCT scsSwitch_FranklinToHeli_Trev SWITCH_CAM_STRUCT scsSwitch_FranklinToHeli_Mike #IF IS_DEBUG_BUILD BOOL bSwitchCamDebugScenarioEnabled = FALSE FLOAT fDEBUG_OverrideMichaelAim = -1.0 //BOOL bResetDebugScenario = FALSE #ENDIF BOOL bPlayerControlGiven //INT iMikeHangingToSniper_PulseInAudID //INT iMikeHangingToSniper_PulseCamMoveAudID //INT iMikeHangingToSniper_PulsePulseOutAudID //BOOL bHangingToSniper_InFXPlayed //BOOL bHangingToSniper_OutFXPlayed #IF IS_DEBUG_BUILD FLOAT fMikeHangingToSniperCamEaseMultiplier = 0.4 INT iMikeHangingToSniperEaseNodeIndex = 0 #ENDIF //FLOAT fMikeHangingToSniper_SwitchInFX_Phase = 0.1 //FLOAT fMikeHangingToSniper_SwitchOutFX_Phase = 0.8 BOOL bHangingToFranklin_FranklinAimAnimPlayed FLOAT fHangingToFranklin_AimAnimStartPhase = 0.449 BOOL bTrevorToMichaelHeliSwitch_TrevorTasked BOOL bTrevorToFranklin_TrevorTasked #IF IS_DEBUG_BUILD FLOAT fMikeToFranklin_ReloadAnimStartPhase = 0.11 FLOAT fHeliToFrank_ReloadBlendInDelta = 1000 #ENDIF FLOAT fHeliToFranklin_FranklinStartAITaskPhase = 0.0 FLOAT fMikeToFranklin_FranklinStartAITaskPhase = 0.0 FLOAT fTrevToFranklin_FranklinStartAITaskPhase = 0.0 FLOAT fSwitchToMike_AimingHeading = 165.0 FLOAT fHangOnTrevor_HintCamFollowDist = 0.95 VECTOR vHangOnTrevor_HintCamLookAtLoc = <<0.0, 350.0, -10.0>> INT iHeliToFranklin_SwitchPedIndexOffset = 1 ENTITY_INDEX eiHeliToFranklin_FranklinTarget PROC SETUP_SPLINE_CAM_NODE_ARRAY_HANGING_TO_SNIPER(SWITCH_CAM_STRUCT &thisSwitchCam, PED_INDEX piFranklin) CDEBUG3LN(DEBUG_MISSION, "SETUP_SPLINE_CAM_NODE_ARRAY_HANGING_TO_SNIPER") //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 = <<-134.2022, -592.6018, 211.9194>> 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 = <<5.9428, -0.6980, 102.2135>> thisSwitchCam.nodes[0].bPointAtEntity = FALSE thisSwitchCam.nodes[0].bPointAtOffsetIsRelative = FALSE thisSwitchCam.nodes[0].bAttachOffsetIsRelative = TRUE thisSwitchCam.nodes[0].fNodeFOV = 43.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.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 = TRUE thisSwitchCam.nodes[0].bCamEaseForceLevel = FALSE thisSwitchCam.nodes[0].fTimeScale = 0.0100 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_WORLD_POS thisSwitchCam.nodes[1].iForceCamPointAtEntityIndex = -1 thisSwitchCam.nodes[1].bIsGameplayCamCopy = FALSE thisSwitchCam.nodes[1].iNodeTime = 1500 thisSwitchCam.nodes[1].vNodePos = <<-134.2023, -592.6019, 211.9195>> thisSwitchCam.nodes[1].vWorldPosLookAt = <<-1662.8572, -1116.3562, 17.8841>> thisSwitchCam.nodes[1].fNodeOffsetDist = 5.0000 thisSwitchCam.nodes[1].fNodeVerticleOffset = 0.0000 thisSwitchCam.nodes[1].bAttachToOriginPed = FALSE thisSwitchCam.nodes[1].vNodeDir = <<5.9428, -0.6980, 102.2135>> thisSwitchCam.nodes[1].bPointAtEntity = FALSE thisSwitchCam.nodes[1].bPointAtOffsetIsRelative = FALSE thisSwitchCam.nodes[1].bAttachOffsetIsRelative = TRUE thisSwitchCam.nodes[1].fNodeFOV = 43.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.8000 thisSwitchCam.nodes[1].NodeCamShakeType = CAM_SHAKE_DEFAULT thisSwitchCam.nodes[1].fNodeCamShake = 0.0000 thisSwitchCam.nodes[1].iCamEaseType = 2 thisSwitchCam.nodes[1].fCamEaseScaler = 0.9000 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_SwitchSceneFranklin 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.iNumNodes = 2 thisSwitchCam.iCamSwitchFocusNode = 0 thisSwitchCam.fSwitchSoundAudioStartPhase = -1.0000 thisSwitchCam.fSwitchSoundAudioEndPhase = -1.0000 thisSwitchCam.bSwitchSoundPlayOpeningPulse = TRUE thisSwitchCam.bSwitchSoundPlayMoveLoop = TRUE thisSwitchCam.bSwitchSoundPlayExitPulse = TRUE thisSwitchCam.bSplineNoSmoothing = FALSE thisSwitchCam.bAddGameplayCamAsLastNode = FALSE thisSwitchCam.iGameplayNodeBlendDuration = 0 //--- End of Cam Data --- thisSwitchCam.strOutputStructName = "thisSwitchCam" thisSwitchCam.strOutputFileName = "CameraInfo_FIB2_HangingToSniper.txt" thisSwitchCam.strXMLFileName = "CameraInfo_FIB2_HangingToSniper.xml" thisSwitchCam.bInitialized = TRUE //ENDIF thisSwitchCam.piPeds[0] = piFranklin ENDPROC /// PURPOSE: /// Handle the playback of the switch cam. The will setup, play, shut down and cleanup the switch cam spline /// PARAMS: /// thisSwitchCam - Switch camera to playback /// bReturnTrueOnce - If you only want this function to return TRUE once upon completion. Set to FALSE to have this function to return true every time this is called once the camera is finished playback. /// RETURNS: /// TRUE when camera is complete, FALSE if playback is still active, or if the camera has completed playback and bReturnTrueOnce is set to TRUE. FUNC BOOL HANDLE_SWITCH_CAM_HANGING_TO_SNIPER(SWITCH_CAM_STRUCT &thisSwitchCam, BOOL bReturnTrueOnce = TRUE) INT iCurrentNode STRING sFranklinAimAnimLibrary = GET_SNATCH_AND_GRAB_ANIM_DICT_AS_STRING(SAG_ANIM_DICT_SNIPER) SWITCH eSwitchCamState CASE SWITCH_CAM_IDLE CDEBUG3LN(DEBUG_MISSION, "eSwitchCamState = SWITCH_CAM_IDLE") //RETURN FALSE BREAK CASE SWITCH_CAM_REQUEST_ASSETS CDEBUG3LN(DEBUG_MISSION, "eSwitchCamState = SWITCH_CAM_REQUEST_ASSETS") IF IS_NEW_LOAD_SCENE_ACTIVE() NEW_LOAD_SCENE_STOP() ENDIF IF STREAMVOL_IS_VALID(sniperVolume) STREAMVOL_DELETE(sniperVolume) ENDIF IF STREAMVOL_IS_VALID(officeVolume) STREAMVOL_DELETE(officeVolume) ENDIF NEW_LOAD_SCENE_START_SPHERE((<<-144.6, -593.7, 211.8>>), 20.0, NEWLOADSCENE_FLAG_LONGSWITCH_CUTSCENE ) //REQUEST_ANIM_DICT(sFranklinAimAnimLibrary) BREAK CASE SWITCH_CAM_SETUP_SPLINE CDEBUG3LN(DEBUG_MISSION, "eSwitchCamState = SWITCH_CAM_SETUP_SPLINE") SETUP_SPLINE_CAM_NODE_ARRAY_HANGING_TO_SNIPER(thisSwitchCam, GET_FRANKLIN_PED()) IF DOES_SWITCH_CAM_EXIST(thisSwitchCam) DESTROY_SWITCH_CAM(thisSwitchCam) ENDIF //REQUEST_ANIM_DICT(sFranklinAimAnimLibrary) CREATE_SPLINE_CAM(thisSwitchCam) SET_CAM_ACTIVE(thisSwitchCam.ciSpline, TRUE) RENDER_SCRIPT_CAMS(TRUE, FALSE) DISPLAY_RADAR(FALSE) DISPLAY_HUD(FALSE) SETTIMERB(0) SET_PLAYER_CONTROL(PLAYER_ID(), FALSE) bPlayerControlGiven = FALSE bHangingToFranklin_FranklinAimAnimPlayed = false eSwitchCamState = SWITCH_CAM_PLAYING_SPLINE FALLTHRU CASE SWITCH_CAM_PLAYING_SPLINE CDEBUG3LN(DEBUG_MISSION, "eSwitchCamState = SWITCH_CAM_PLAYING_SPLINE") CDEBUG3LN(DEBUG_MISSION, GET_CAM_SPLINE_PHASE(thisSwitchCam.ciSpline)) iCurrentNode = UPDATE_SPLINE_CAM(thisSwitchCam) //IF HAS_ANIM_DICT_LOADED(sFranklinAimAnimLibrary) IF NOT bHangingToFranklin_FranklinAimAnimPlayed PRINTLN("Assigning Franklin Sniper Task...") TASK_PLAY_ANIM(dummyFranklinPed, sFranklinAimAnimLibrary, "ig_7_m_door_f_sniping_franklin", INSTANT_BLEND_IN, DEFAULT, DEFAULT, DEFAULT, fHangingToFranklin_AimAnimStartPhase) FORCE_PED_AI_AND_ANIMATION_UPDATE(dummyFranklinPed, TRUE) bHangingToFranklin_FranklinAimAnimPlayed = TRUE ENDIF //ENDIF IF IS_CAM_ACTIVE(thisSwitchCam.ciSpline) IF iCurrentNode >= thisSwitchCam.iCamSwitchFocusNode sCamDetails.bOKToSwitchPed = TRUE ENDIF IF DOES_CAM_EXIST(thisSwitchCam.ciSpline) IF NOT bDoneHitSound IF GET_CAM_SPLINE_PHASE(thisSwitchCam.ciSpline) >= 0.00 PLAY_SOUND_FRONTEND(-1, "Hit_In", "PLAYER_SWITCH_CUSTOM_SOUNDSET") bDoneHitSound = TRUE ENDIF ENDIF //[MF] Once cam is at the end, reset the gameplay cam positon and advance to next state. IF GET_CAM_SPLINE_PHASE(thisSwitchCam.ciSpline) >= 1.00 CDEBUG3LN(DEBUG_MISSION, "eSwitchCamState = SWITCH_CAM_RETURN_TO_GAMEPLAY") eSwitchCamState = SWITCH_CAM_RETURN_TO_GAMEPLAY ENDIF ELSE SCRIPT_ASSERT("Cam Prematurely Deleted! WTF?") eSwitchCamState = SWITCH_CAM_RETURN_TO_GAMEPLAY ENDIF ENDIF BREAK CASE 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) ENDIF IF DOES_SWITCH_CAM_EXIST(thisSwitchCam) DESTROY_SWITCH_CAM(thisSwitchCam) ENDIF IF NOT bPlayerControlGiven SET_PLAYER_CONTROL(PLAYER_ID(), TRUE) DISPLAY_RADAR(TRUE) DISPLAY_HUD(TRUE) bPlayerControlGiven = TRUE ENDIF SETTIMERA(0) eSwitchCamState = SWITCH_CAM_IDLE NEW_LOAD_SCENE_STOP() //REMOVE_ANIM_DICT(sFranklinAimAnimLibrary) thisSwitchCam.bIsSplineCamFinishedPlaying = TRUE sCamDetails.bSplineCreated = FALSE sCamDetails.bOKToSwitchPed = FALSE SET_PLAYER_CONTROL(PLAYER_ID(), true) RETURN TRUE BREAK ENDSWITCH IF bReturnTrueOnce RETURN FALSE ELSE RETURN thisSwitchCam.bIsSplineCamFinishedPlaying ENDIF ENDFUNC PROC SETUP_SPLINE_CAM_NODE_ARRAY_HELI_TREVOR_TO_MICHAEL(SWITCH_CAM_STRUCT &thisSwitchCam, PED_INDEX piTrevor, PED_INDEX piMichael) CDEBUG3LN(DEBUG_MISSION, "SETUP_SPLINE_CAM_NODE_ARRAY_HELI_TREVOR_TO_MICHAEL") //IF NOT thisSwitchCam.bInitialized //--- Start of Cam Data --- thisSwitchCam.nodes[0].SwitchCamType = SWITCH_CAM_GAMEPLAY_CAM_COPY thisSwitchCam.nodes[0].iForceCamPointAtEntityIndex = 1 thisSwitchCam.nodes[0].bIsGameplayCamCopy = TRUE thisSwitchCam.nodes[0].iNodeTime = 0 thisSwitchCam.nodes[0].vNodePos = <<94.2251, -1245.5797, 145.5685>> 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 = <<-23.5406, 9.1208, -84.6748>> thisSwitchCam.nodes[0].bPointAtEntity = TRUE thisSwitchCam.nodes[0].bPointAtOffsetIsRelative = TRUE thisSwitchCam.nodes[0].bAttachOffsetIsRelative = TRUE thisSwitchCam.nodes[0].fNodeFOV = 0.0 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.2000 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 = 0.0100 thisSwitchCam.nodes[0].iTimeScaleEaseType = 0 thisSwitchCam.nodes[0].fTimeScaleEaseScaler = 0.0000 thisSwitchCam.nodes[0].bFlashEnabled = TRUE thisSwitchCam.nodes[0].SCFE_FlashEffectUsed = SCFE_SwitchShortTrevorIn 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_ENTITY_ATTACHED_CAM thisSwitchCam.nodes[1].iForceCamPointAtEntityIndex = 1 thisSwitchCam.nodes[1].bIsGameplayCamCopy = FALSE thisSwitchCam.nodes[1].iNodeTime = 100 thisSwitchCam.nodes[1].vNodePos = <<4.0000, -11.0000, 1.1000>> thisSwitchCam.nodes[1].vWorldPosLookAt = <<0.0000, 0.0000, 0.8000>> thisSwitchCam.nodes[1].fNodeOffsetDist = 5.0000 thisSwitchCam.nodes[1].fNodeVerticleOffset = 0.0000 thisSwitchCam.nodes[1].bAttachToOriginPed = FALSE thisSwitchCam.nodes[1].vNodeDir = <<0.0000, 0.0000, 0.8000>> thisSwitchCam.nodes[1].bPointAtEntity = TRUE thisSwitchCam.nodes[1].bPointAtOffsetIsRelative = TRUE thisSwitchCam.nodes[1].bAttachOffsetIsRelative = TRUE thisSwitchCam.nodes[1].fNodeFOV = 69.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.3000 thisSwitchCam.nodes[1].NodeCamShakeType = CAM_SHAKE_DEFAULT thisSwitchCam.nodes[1].fNodeCamShake = 0.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 = 0.0100 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_ENTITY_ATTACHED_CAM thisSwitchCam.nodes[2].iForceCamPointAtEntityIndex = 1 thisSwitchCam.nodes[2].bIsGameplayCamCopy = FALSE thisSwitchCam.nodes[2].iNodeTime = 900 thisSwitchCam.nodes[2].vNodePos = <<5.0000, -5.0000, 0.6000>> thisSwitchCam.nodes[2].vWorldPosLookAt = <<0.0000, 0.0000, 0.8000>> thisSwitchCam.nodes[2].fNodeOffsetDist = 0.0000 thisSwitchCam.nodes[2].fNodeVerticleOffset = 0.0000 thisSwitchCam.nodes[2].bAttachToOriginPed = FALSE thisSwitchCam.nodes[2].vNodeDir = <<0.0000, 0.0000, 0.8000>> thisSwitchCam.nodes[2].bPointAtEntity = TRUE thisSwitchCam.nodes[2].bPointAtOffsetIsRelative = TRUE 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.3000 thisSwitchCam.nodes[2].NodeCamShakeType = CAM_SHAKE_DEFAULT thisSwitchCam.nodes[2].fNodeCamShake = 0.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 = 0.0100 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_ENTITY_ATTACHED_CAM thisSwitchCam.nodes[3].iForceCamPointAtEntityIndex = 1 thisSwitchCam.nodes[3].bIsGameplayCamCopy = FALSE thisSwitchCam.nodes[3].iNodeTime = 1000 thisSwitchCam.nodes[3].vNodePos = <<2.5000, -0.4000, 0.3000>> thisSwitchCam.nodes[3].vWorldPosLookAt = <<0.0000, 0.0000, 0.8000>> 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.8000>> thisSwitchCam.nodes[3].bPointAtEntity = TRUE thisSwitchCam.nodes[3].bPointAtOffsetIsRelative = TRUE thisSwitchCam.nodes[3].bAttachOffsetIsRelative = TRUE 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.0000 thisSwitchCam.nodes[3].fNodeTimePostFXTimeOffset = 0.0000 thisSwitchCam.nodes[3].fNodeMotionBlur = 0.3000 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.3720 thisSwitchCam.nodes[3].bCamEaseForceLinear = FALSE thisSwitchCam.nodes[3].bCamEaseForceLevel = FALSE thisSwitchCam.nodes[3].fTimeScale = 0.0100 thisSwitchCam.nodes[3].iTimeScaleEaseType = 0 thisSwitchCam.nodes[3].fTimeScaleEaseScaler = 0.0000 thisSwitchCam.nodes[3].bFlashEnabled = TRUE thisSwitchCam.nodes[3].SCFE_FlashEffectUsed = SCFE_SwitchShortMichaelMid 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.9000 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 INT i REPEAT COUNT_OF(thisSwitchCam.camVelocityOverrides) i thisSwitchCam.camVelocityOverrides[i].fStartPoint = 0.0 thisSwitchCam.camVelocityOverrides[i].fSpeed = -1 ENDREPEAT thisSwitchCam.camVelocityOverrides[0].fStartPoint = 0.0000 thisSwitchCam.camVelocityOverrides[0].fSpeed = 10.0000 thisSwitchCam.camVelocityOverrides[1].fStartPoint = 1.0000 thisSwitchCam.camVelocityOverrides[1].fSpeed = 50.0000 thisSwitchCam.camVelocityOverrides[2].fStartPoint = 3.0000 thisSwitchCam.camVelocityOverrides[2].fSpeed = 50.0000 thisSwitchCam.camVelocityOverrides[3].fStartPoint = 3.6000 thisSwitchCam.camVelocityOverrides[3].fSpeed = 20.0000 thisSwitchCam.camVelocityOverrides[4].fStartPoint = 3.9000 thisSwitchCam.camVelocityOverrides[4].fSpeed = 10.0000 thisSwitchCam.camVelocityOverrides[5].fStartPoint = 4.0000 thisSwitchCam.camVelocityOverrides[5].fSpeed = 5.0000 thisSwitchCam.iNumNodes = 4 thisSwitchCam.iCamSwitchFocusNode = 1 thisSwitchCam.fSwitchSoundAudioStartPhase = 0.01 thisSwitchCam.fSwitchSoundAudioEndPhase = 0.6 thisSwitchCam.bSwitchSoundPlayOpeningPulse = TRUE thisSwitchCam.bSwitchSoundPlayMoveLoop = TRUE thisSwitchCam.bSwitchSoundPlayExitPulse = TRUE thisSwitchCam.bSplineNoSmoothing = FALSE thisSwitchCam.bAddGameplayCamAsLastNode = TRUE thisSwitchCam.iGameplayNodeBlendDuration = 100 //--- End of Cam Data --- thisSwitchCam.strOutputStructName = "thisSwitchCam" thisSwitchCam.strOutputFileName = "CameraInfo_FIB2_HeliTrevorToMichael.txt" thisSwitchCam.strXMLFileName = "CameraInfo_FIB2_HeliTrevorToMichael.xml" thisSwitchCam.bInitialized = TRUE //ENDIF thisSwitchCam.piPeds[0] = piTrevor thisSwitchCam.piPeds[1] = piMichael ENDPROC PROC SETUP_SPLINE_CAM_NODE_ARRAY_HELI_TREVOR_TO_MICHAEL_FIRST_PERSON(SWITCH_CAM_STRUCT &thisSwitchCam, PED_INDEX piTrevor, PED_INDEX piMichael) CDEBUG3LN(DEBUG_MISSION, "SETUP_SPLINE_CAM_NODE_ARRAY_HELI_MICHAEL_TO_FRANKLIN") //IF NOT thisSwitchCam.bInitialized //--- Start of Cam Data --- thisSwitchCam.nodes[0].SwitchCamType = SWITCH_CAM_OLD_SYSTEM thisSwitchCam.nodes[0].iForceCamPointAtEntityIndex = -1 thisSwitchCam.nodes[0].bIsGameplayCamCopy = FALSE thisSwitchCam.nodes[0].iNodeTime = 0 thisSwitchCam.nodes[0].vNodePos = <<-1.6125, 2.0081, 0.6774>> thisSwitchCam.nodes[0].vWorldPosLookAt = <<0.0000, 0.0000, 0.0000>> thisSwitchCam.nodes[0].fNodeOffsetDist = 0.0000 thisSwitchCam.nodes[0].fNodeVerticleOffset = 0.0000 thisSwitchCam.nodes[0].bAttachToOriginPed = FALSE thisSwitchCam.nodes[0].vNodeDir = <<-0.5, 0.9, 0.3>> thisSwitchCam.nodes[0].bPointAtEntity = TRUE thisSwitchCam.nodes[0].bPointAtOffsetIsRelative = TRUE thisSwitchCam.nodes[0].bAttachOffsetIsRelative = TRUE thisSwitchCam.nodes[0].fNodeFOV = 40.0000 thisSwitchCam.nodes[0].vClonedNodeOffset = <<0.0000, 0.0000, 0.0000>> thisSwitchCam.nodes[0].iNodeToClone = 0 thisSwitchCam.nodes[0].NodeTimePostFX_Type = NO_EFFECT thisSwitchCam.nodes[0].fNodeTimePostFXBlendTime = 0.0000 thisSwitchCam.nodes[0].fNodeTimePostFXTimeOffset = 0.0000 thisSwitchCam.nodes[0].fNodeMotionBlur = 0.0000 thisSwitchCam.nodes[0].NodeCamShakeType = CAM_SHAKE_DEFAULT thisSwitchCam.nodes[0].fNodeCamShake = 0.5000 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 = TRUE thisSwitchCam.nodes[0].SCFE_FlashEffectUsed = SCFE_SwitchShortTrevorIn 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 = 400 thisSwitchCam.nodes[1].vNodePos = <<-1.7125, 1.8081, 0.5774>> 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.5, 0.6, 0.3>> thisSwitchCam.nodes[1].bPointAtEntity = TRUE thisSwitchCam.nodes[1].bPointAtOffsetIsRelative = TRUE thisSwitchCam.nodes[1].bAttachOffsetIsRelative = TRUE thisSwitchCam.nodes[1].fNodeFOV = 40.0000 thisSwitchCam.nodes[1].vClonedNodeOffset = <<0.0000, 0.0000, 0.0000>> thisSwitchCam.nodes[1].iNodeToClone = 0 thisSwitchCam.nodes[1].NodeTimePostFX_Type = NO_EFFECT thisSwitchCam.nodes[1].fNodeTimePostFXBlendTime = 0.0000 thisSwitchCam.nodes[1].fNodeTimePostFXTimeOffset = 0.0000 thisSwitchCam.nodes[1].fNodeMotionBlur = 1.0000 thisSwitchCam.nodes[1].NodeCamShakeType = CAM_SHAKE_MEDIUM thisSwitchCam.nodes[1].fNodeCamShake = 0.5000 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 = 0.3 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.3000 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 = 600 thisSwitchCam.nodes[2].vNodePos = <<-1.9125, 1.3081, -0.1774>> 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, -1, 0.6>> thisSwitchCam.nodes[2].bPointAtEntity = TRUE thisSwitchCam.nodes[2].bPointAtOffsetIsRelative = TRUE thisSwitchCam.nodes[2].bAttachOffsetIsRelative = TRUE thisSwitchCam.nodes[2].fNodeFOV = 40.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 = 1.0000 thisSwitchCam.nodes[2].NodeCamShakeType = CAM_SHAKE_MEDIUM thisSwitchCam.nodes[2].fNodeCamShake = 0.5000 thisSwitchCam.nodes[2].iCamEaseType = 0 thisSwitchCam.nodes[2].fCamEaseScaler = 0.0000 thisSwitchCam.nodes[2].fCamNodeVelocityScale = 0.6000 thisSwitchCam.nodes[2].bCamEaseForceLinear = FALSE thisSwitchCam.nodes[2].bCamEaseForceLevel = FALSE thisSwitchCam.nodes[2].fTimeScale = 0.3 thisSwitchCam.nodes[2].iTimeScaleEaseType = 0 thisSwitchCam.nodes[2].fTimeScaleEaseScaler = 0.0000 thisSwitchCam.nodes[2].bFlashEnabled = TRUE thisSwitchCam.nodes[2].SCFE_FlashEffectUsed = SCFE_SwitchShortMichaelMid 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 = 400 thisSwitchCam.nodes[3].vNodePos = <<-1.9125, 1.3081, -0.1774>> 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, -1, 0.6>> thisSwitchCam.nodes[3].bPointAtEntity = TRUE thisSwitchCam.nodes[3].bPointAtOffsetIsRelative = TRUE thisSwitchCam.nodes[3].bAttachOffsetIsRelative = TRUE thisSwitchCam.nodes[3].fNodeFOV = 40.0000 thisSwitchCam.nodes[3].vClonedNodeOffset = <<0.0000, 0.0000, 0.0000>> thisSwitchCam.nodes[3].iNodeToClone = 0 thisSwitchCam.nodes[3].NodeTimePostFX_Type = NO_EFFECT thisSwitchCam.nodes[3].fNodeTimePostFXBlendTime = 0.0000 thisSwitchCam.nodes[3].fNodeTimePostFXTimeOffset = 0.0000 thisSwitchCam.nodes[3].fNodeMotionBlur = 0.0000 thisSwitchCam.nodes[3].NodeCamShakeType = CAM_SHAKE_MEDIUM thisSwitchCam.nodes[3].fNodeCamShake = 0.5000 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.iNumNodes = 4 thisSwitchCam.iCamSwitchFocusNode = 2 thisSwitchCam.fSwitchSoundAudioStartPhase = 0.25 thisSwitchCam.fSwitchSoundAudioEndPhase = 0.45 thisSwitchCam.bSwitchSoundPlayOpeningPulse = FALSE thisSwitchCam.bSwitchSoundPlayMoveLoop = FALSE thisSwitchCam.bSwitchSoundPlayExitPulse = FALSE thisSwitchCam.bSplineNoSmoothing = FALSE thisSwitchCam.bAddGameplayCamAsLastNode = FALSE thisSwitchCam.iGameplayNodeBlendDuration = 0 INT i REPEAT COUNT_OF(thisSwitchCam.camVelocityOverrides) i thisSwitchCam.camVelocityOverrides[i].fStartPoint = 0.0 thisSwitchCam.camVelocityOverrides[i].fSpeed = -1 ENDREPEAT //--- End of Cam Data --- thisSwitchCam.strOutputStructName = "thisSwitchCam" thisSwitchCam.strOutputFileName = "CameraInfo_FIB2_HeliMichaelToFranklin.txt" thisSwitchCam.strXMLFileName = "CameraInfo_FIB2_HeliMichaelToFranklin.xml" thisSwitchCam.bInitialized = TRUE //ENDIF thisSwitchCam.piPeds[0] = piTrevor thisSwitchCam.piPeds[1] = piMichael ENDPROC /// PURPOSE: /// Handle the playback of the switch cam. The will setup, play, shut down and cleanup the switch cam spline /// PARAMS: /// thisSwitchCam - Switch camera to playback /// bReturnTrueOnce - If you only want this function to return TRUE once upon completion. Set to FALSE to have this function to return true every time this is called once the camera is finished playback. /// RETURNS: /// TRUE when camera is complete, FALSE if playback is still active, or if the camera has completed playback and bReturnTrueOnce is set to TRUE. FUNC BOOL HANDLE_SWITCH_CAM_HELI_TREVOR_TO_MICHAEL(SWITCH_CAM_STRUCT &thisSwitchCam, BOOL bReturnTrueOnce = TRUE) IS_PED_INJURED(GET_FRANKLIN_PED()) IS_PED_INJURED(GET_MICHAEL_PED()) IS_PED_INJURED(GET_TREVOR_PED()) IS_VEHICLE_DRIVEABLE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) INT iCurrentNode VECTOR vMichaelAimOutSideHeliLoc VECTOR vHeliLocDebug VECTOR vHeliForwardDebug VECTOR vMichaelAimDirection SWITCH eSwitchCamState CASE SWITCH_CAM_IDLE CDEBUG3LN(DEBUG_MISSION, "eSwitchCamState = SWITCH_CAM_IDLE") RETURN FALSE BREAK CASE SWITCH_CAM_SETUP_SPLINE CDEBUG3LN(DEBUG_MISSION, "eSwitchCamState = SWITCH_CAM_SETUP_SPLINE") IF NOT bSwitchToFirstPerson SETUP_SPLINE_CAM_NODE_ARRAY_HELI_TREVOR_TO_MICHAEL(thisSwitchCam, GET_TREVOR_PED(), GET_MICHAEL_PED()) ELSE SETUP_SPLINE_CAM_NODE_ARRAY_HELI_TREVOR_TO_MICHAEL_FIRST_PERSON(thisSwitchCam, GET_TREVOR_PED(), GET_MICHAEL_PED()) ENDIF IF DOES_SWITCH_CAM_EXIST(thisSwitchCam) DESTROY_SWITCH_CAM(thisSwitchCam) ENDIF //[MF] Fix for the gameplay cam if it gets WAY outta position. IF NOT bSwitchToFirstPerson SET_THIRD_PERSON_CAM_RELATIVE_HEADING_LIMITS_THIS_UPDATE(-30.0, 20.0) SET_THIRD_PERSON_CAM_RELATIVE_PITCH_LIMITS_THIS_UPDATE(-40.0, 40.0) ENDIF WAIT_WITH_RECORD() CREATE_SPLINE_CAM(thisSwitchCam) IF bSwitchToFirstPerson INT i REPEAT COUNT_OF(thisSwitchCam.nodes) i IF DOES_CAM_EXIST(thisSwitchCam.nodes[i].ciSwitchNode) SET_CAM_INHERIT_ROLL_VEHICLE(thisSwitchCam.nodes[i].ciSwitchNode, snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) ENDIF ENDREPEAT ENDIF SET_CAM_ACTIVE(thisSwitchCam.ciSpline, TRUE) WAIT_WITH_RECORD() RENDER_SCRIPT_CAMS(TRUE, FALSE) DISPLAY_RADAR(FALSE) DISPLAY_HUD(FALSE) SETTIMERB(0) SET_PLAYER_CONTROL(PLAYER_ID(), FALSE) SET_GAME_PAUSES_FOR_STREAMING(FALSE) IF NOT bSwitchToFirstPerson IF NOT IS_PED_INJURED(GET_MICHAEL_PED()) CLEAR_PED_TASKS(GET_MICHAEL_PED()) SET_PED_FIRING_PATTERN(GET_MICHAEL_PED(), FIRING_PATTERN_FULL_AUTO) ENDIF ENDIF bPlayerControlGiven = FALSE IF IS_GAMEPLAY_HINT_ACTIVE() STOP_GAMEPLAY_HINT(FALSE) ENDIF eSwitchCamState = SWITCH_CAM_PLAYING_SPLINE RETURN TRUE FALLTHRU CASE SWITCH_CAM_PLAYING_SPLINE CDEBUG3LN(DEBUG_MISSION, "eSwitchCamState = SWITCH_CAM_PLAYING_SPLINE") CDEBUG3LN(DEBUG_MISSION, GET_CAM_SPLINE_PHASE(thisSwitchCam.ciSpline)) iCurrentNode = UPDATE_SPLINE_CAM(thisSwitchCam) IF IS_CAM_ACTIVE(thisSwitchCam.ciSpline) IF (iCurrentNode >= thisSwitchCam.iCamSwitchFocusNode AND NOT bSwitchToFirstPerson) OR (GET_CAM_SPLINE_PHASE(thisSwitchCam.ciSpline) >= 1.00 AND bSwitchToFirstPerson) sCamDetails.bOKToSwitchPed = TRUE STOP_GAMEPLAY_HINT(TRUE) ENDIF IF bSwitchToFirstPerson IF NOT bDoneHitSound IF GET_GAME_TIMER() >= (iSnatchAndGrabCutsceneTime + 20) PLAY_SOUND_FRONTEND(-1, "Hit_Out", "PLAYER_SWITCH_CUSTOM_SOUNDSET") iHitTime = GET_GAME_TIMER() bDoneHitSound = TRUE ENDIF ENDIF IF NOT bWooshStarted IF bDoneHitSound IF GET_GAME_TIMER() >= iHitTime + 150 PLAY_SOUND_FRONTEND(-1, "Short_Transition_In", "PLAYER_SWITCH_CUSTOM_SOUNDSET") bWooshStarted = TRUE ENDIF ENDIF ENDIF ENDIF IF DOES_CAM_EXIST(thisSwitchCam.ciSpline) IF NOT IS_PED_INJURED(GET_MICHAEL_PED()) //[MF] Have Michael already aiming behind the heli //IF NOT bSwitchToFirstPerson //OR GET_CAM_SPLINE_PHASE(thisSwitchCam.ciSpline) >= 0.25 IF NOT IS_SCRIPT_TASK_RUNNING_OR_STARTING(GET_MICHAEL_PED(), SCRIPT_TASK_DRIVE_BY) //OR bSwitchToFirstPerson //CLEAR_PED_TASKS(GET_MICHAEL_PED()) vHeliLocDebug = GET_ENTITY_COORDS(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) vHeliForwardDebug = GET_ENTITY_FORWARD_VECTOR(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) vMichaelAimDirection = ROTATE_VECTOR_ABOUT_Z(vHeliForwardDebug, fSwitchToMike_AimingHeading) vMichaelAimDirection.Z = 0.0 vMichaelAimDirection = GET_VECTOR_OF_LENGTH(vMichaelAimDirection, 150) vMichaelAimOutSideHeliLoc = (vHeliLocDebug + vMichaelAimDirection) TASK_DRIVE_BY(GET_MICHAEL_PED(), NULL, NULL, vMichaelAimOutSideHeliLoc, 10000, 0, FALSE, FIRING_PATTERN_SINGLE_SHOT) ENDIF //ENDIF ENDIF //[MF] Once cam is at the end, reset the gameplay cam positon and advance to next state. IF GET_CAM_SPLINE_PHASE(thisSwitchCam.ciSpline) >= 1.00 AND (GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL) CDEBUG3LN(DEBUG_MISSION, "eSwitchCamState = SWITCH_CAM_RETURN_TO_GAMEPLAY") RENDER_SCRIPT_CAMS(FALSE, FALSE) eSwitchCamState = SWITCH_CAM_RETURN_TO_GAMEPLAY ENDIF ELSE SCRIPT_ASSERT("Cam Prematurely Deleted! WTF?") RENDER_SCRIPT_CAMS(FALSE, FALSE) eSwitchCamState = SWITCH_CAM_RETURN_TO_GAMEPLAY ENDIF ENDIF RETURN TRUE BREAK CASE 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) ENDIF IF DOES_SWITCH_CAM_EXIST(thisSwitchCam) DESTROY_SWITCH_CAM(thisSwitchCam) ENDIF IF NOT bPlayerControlGiven SET_PLAYER_CONTROL(PLAYER_ID(), TRUE) DISPLAY_RADAR(TRUE) DISPLAY_HUD(TRUE) bPlayerControlGiven = TRUE ENDIF SETTIMERA(0) eSwitchCamState = SWITCH_CAM_IDLE thisSwitchCam.bIsSplineCamFinishedPlaying = TRUE IF NOT IS_PED_INJURED(GET_MICHAEL_PED()) SET_PED_FIRING_PATTERN(GET_MICHAEL_PED(), FIRING_PATTERN_FULL_AUTO) ENDIF SET_PLAYER_CONTROL(PLAYER_ID(), true) SET_GAME_PAUSES_FOR_STREAMING(TRUE) sCamDetails.bSplineCreated = FALSE sCamDetails.bOKToSwitchPed = FALSE RETURN FALSE BREAK ENDSWITCH IF bReturnTrueOnce RETURN FALSE ELSE RETURN thisSwitchCam.bIsSplineCamFinishedPlaying ENDIF ENDFUNC PROC SETUP_SPLINE_CAM_NODE_ARRAY_HELI_MICHAEL_TO_TREVOR(SWITCH_CAM_STRUCT &thisSwitchCam, PED_INDEX piTrevor, PED_INDEX piMichael) CDEBUG3LN(DEBUG_MISSION, "SETUP_SPLINE_CAM_NODE_ARRAY_HELI_MICHAEL_TO_TREVOR") //IF NOT thisSwitchCam.bInitialized //--- Start of Cam Data --- thisSwitchCam.nodes[0].SwitchCamType = SWITCH_CAM_GAMEPLAY_CAM_COPY thisSwitchCam.nodes[0].iForceCamPointAtEntityIndex = 1 thisSwitchCam.nodes[0].bIsGameplayCamCopy = TRUE thisSwitchCam.nodes[0].iNodeTime = 0 thisSwitchCam.nodes[0].vNodePos = <<296.6279, -1209.5647, 139.0910>> 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 = <<-2.8198, -7.8459, 83.1772>> thisSwitchCam.nodes[0].bPointAtEntity = TRUE thisSwitchCam.nodes[0].bPointAtOffsetIsRelative = TRUE thisSwitchCam.nodes[0].bAttachOffsetIsRelative = TRUE thisSwitchCam.nodes[0].fNodeFOV = 35.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.2000 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.3000 thisSwitchCam.nodes[0].bCamEaseForceLinear = FALSE thisSwitchCam.nodes[0].bCamEaseForceLevel = FALSE thisSwitchCam.nodes[0].fTimeScale = 0.0100 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_ENTITY_ATTACHED_CAM thisSwitchCam.nodes[1].iForceCamPointAtEntityIndex = 1 thisSwitchCam.nodes[1].bIsGameplayCamCopy = FALSE thisSwitchCam.nodes[1].iNodeTime = 1000 thisSwitchCam.nodes[1].vNodePos = <<2.5000, -1.1000, 0.3000>> thisSwitchCam.nodes[1].vWorldPosLookAt = <<0.6000, 0.0000, 0.8000>> thisSwitchCam.nodes[1].fNodeOffsetDist = 5.0000 thisSwitchCam.nodes[1].fNodeVerticleOffset = 0.0000 thisSwitchCam.nodes[1].bAttachToOriginPed = FALSE thisSwitchCam.nodes[1].vNodeDir = <<0.0000, 0.0000, 0.8000>> thisSwitchCam.nodes[1].bPointAtEntity = TRUE thisSwitchCam.nodes[1].bPointAtOffsetIsRelative = TRUE thisSwitchCam.nodes[1].bAttachOffsetIsRelative = TRUE 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.5000 thisSwitchCam.nodes[1].NodeCamShakeType = CAM_SHAKE_DEFAULT thisSwitchCam.nodes[1].fNodeCamShake = 0.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 = TRUE thisSwitchCam.nodes[1].SCFE_FlashEffectUsed = SCFE_SwitchShortMichaelIn 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.3000 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_ENTITY_ATTACHED_CAM thisSwitchCam.nodes[2].iForceCamPointAtEntityIndex = 1 thisSwitchCam.nodes[2].bIsGameplayCamCopy = FALSE thisSwitchCam.nodes[2].iNodeTime = 1000 thisSwitchCam.nodes[2].vNodePos = <<5.0000, -5.0000, 0.6000>> thisSwitchCam.nodes[2].vWorldPosLookAt = <<0.6000, 0.0000, 0.8000>> thisSwitchCam.nodes[2].fNodeOffsetDist = 0.0000 thisSwitchCam.nodes[2].fNodeVerticleOffset = 0.0000 thisSwitchCam.nodes[2].bAttachToOriginPed = FALSE thisSwitchCam.nodes[2].vNodeDir = <<0.0000, 0.0000, 0.8000>> thisSwitchCam.nodes[2].bPointAtEntity = TRUE thisSwitchCam.nodes[2].bPointAtOffsetIsRelative = TRUE 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.5000 thisSwitchCam.nodes[2].NodeCamShakeType = CAM_SHAKE_DEFAULT thisSwitchCam.nodes[2].fNodeCamShake = 0.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_ENTITY_ATTACHED_CAM thisSwitchCam.nodes[3].iForceCamPointAtEntityIndex = 1 thisSwitchCam.nodes[3].bIsGameplayCamCopy = FALSE thisSwitchCam.nodes[3].iNodeTime = 1000 thisSwitchCam.nodes[3].vNodePos = <<3.9762, -10.9954, 1.5856>> thisSwitchCam.nodes[3].vWorldPosLookAt = <<0.6000, 0.0000, 0.8000>> thisSwitchCam.nodes[3].fNodeOffsetDist = 0.0000 thisSwitchCam.nodes[3].fNodeVerticleOffset = 0.0000 thisSwitchCam.nodes[3].bAttachToOriginPed = FALSE thisSwitchCam.nodes[3].vNodeDir = <<0.6412, -1.7077, 0.7227>> thisSwitchCam.nodes[3].bPointAtEntity = TRUE thisSwitchCam.nodes[3].bPointAtOffsetIsRelative = TRUE thisSwitchCam.nodes[3].bAttachOffsetIsRelative = TRUE 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.0000 thisSwitchCam.nodes[3].fNodeTimePostFXTimeOffset = 0.0000 thisSwitchCam.nodes[3].fNodeMotionBlur = 0.3000 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 = 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 = TRUE thisSwitchCam.nodes[3].SCFE_FlashEffectUsed = SCFE_SwitchShortTrevorMid 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.75 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 INT i REPEAT COUNT_OF(thisSwitchCam.camVelocityOverrides) i thisSwitchCam.camVelocityOverrides[i].fStartPoint = 0.0 thisSwitchCam.camVelocityOverrides[i].fSpeed = -1 ENDREPEAT thisSwitchCam.camVelocityOverrides[0].fStartPoint = 0.0000 thisSwitchCam.camVelocityOverrides[0].fSpeed = 5.0000 thisSwitchCam.camVelocityOverrides[1].fStartPoint = 1.5000 thisSwitchCam.camVelocityOverrides[1].fSpeed = 20.0000 thisSwitchCam.camVelocityOverrides[2].fStartPoint = 2.0000 thisSwitchCam.camVelocityOverrides[2].fSpeed = 50.0000 thisSwitchCam.camVelocityOverrides[3].fStartPoint = 3.0000 thisSwitchCam.camVelocityOverrides[3].fSpeed = 50.0000 thisSwitchCam.camVelocityOverrides[4].fStartPoint = 3.2000 thisSwitchCam.camVelocityOverrides[4].fSpeed = 50.0000 thisSwitchCam.camVelocityOverrides[5].fStartPoint = 3.6000 thisSwitchCam.camVelocityOverrides[5].fSpeed = 30.0000 thisSwitchCam.camVelocityOverrides[6].fStartPoint = 4.0000 thisSwitchCam.camVelocityOverrides[6].fSpeed = 7.0000 thisSwitchCam.iNumNodes = 4 thisSwitchCam.iCamSwitchFocusNode = 1 thisSwitchCam.fSwitchSoundAudioStartPhase = 0.03 thisSwitchCam.fSwitchSoundAudioEndPhase = 0.6 thisSwitchCam.bSwitchSoundPlayOpeningPulse = TRUE thisSwitchCam.bSwitchSoundPlayMoveLoop = TRUE thisSwitchCam.bSwitchSoundPlayExitPulse = TRUE thisSwitchCam.bSplineNoSmoothing = FALSE thisSwitchCam.bAddGameplayCamAsLastNode = TRUE thisSwitchCam.iGameplayNodeBlendDuration = 286 //--- End of Cam Data --- thisSwitchCam.strOutputStructName = "thisSwitchCam" thisSwitchCam.strOutputFileName = "CameraInfo_FIB2_HeliMichaelToTrevor.txt" thisSwitchCam.strXMLFileName = "CameraInfo_FIB2_HeliMichaelToTrevor.xml" thisSwitchCam.bInitialized = TRUE //ENDIF thisSwitchCam.piPeds[0] = piTrevor thisSwitchCam.piPeds[1] = piMichael ENDPROC PROC SETUP_SPLINE_CAM_NODE_ARRAY_HELI_MICHAEL_TO_TREVOR_FIRST_PERSON(SWITCH_CAM_STRUCT &thisSwitchCam, PED_INDEX piMichael, PED_INDEX piTrevor) CDEBUG3LN(DEBUG_MISSION, "SETUP_SPLINE_CAM_NODE_ARRAY_HELI_MICHAEL_TO_FRANKLIN") //IF NOT thisSwitchCam.bInitialized //--- Start of Cam Data --- thisSwitchCam.nodes[0].SwitchCamType = SWITCH_CAM_OLD_SYSTEM thisSwitchCam.nodes[0].iForceCamPointAtEntityIndex = -1 thisSwitchCam.nodes[0].bIsGameplayCamCopy = FALSE thisSwitchCam.nodes[0].iNodeTime = 0 thisSwitchCam.nodes[0].vNodePos = <<-1.9125, 1.3081, -0.1774>> thisSwitchCam.nodes[0].vWorldPosLookAt = <<0.0000, 0.0000, 0.0000>> thisSwitchCam.nodes[0].fNodeOffsetDist = 0.0000 thisSwitchCam.nodes[0].fNodeVerticleOffset = 0.0000 thisSwitchCam.nodes[0].bAttachToOriginPed = FALSE thisSwitchCam.nodes[0].vNodeDir = <<0, -1, 0.7>> thisSwitchCam.nodes[0].bPointAtEntity = TRUE thisSwitchCam.nodes[0].bPointAtOffsetIsRelative = TRUE thisSwitchCam.nodes[0].bAttachOffsetIsRelative = TRUE thisSwitchCam.nodes[0].fNodeFOV = 40.0000 thisSwitchCam.nodes[0].vClonedNodeOffset = <<0.0000, 0.0000, 0.0000>> thisSwitchCam.nodes[0].iNodeToClone = 0 thisSwitchCam.nodes[0].NodeTimePostFX_Type = NO_EFFECT thisSwitchCam.nodes[0].fNodeTimePostFXBlendTime = 0.0000 thisSwitchCam.nodes[0].fNodeTimePostFXTimeOffset = 0.0000 thisSwitchCam.nodes[0].fNodeMotionBlur = 0.0000 thisSwitchCam.nodes[0].NodeCamShakeType = CAM_SHAKE_MEDIUM thisSwitchCam.nodes[0].fNodeCamShake = 0.5000 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 = TRUE thisSwitchCam.nodes[0].SCFE_FlashEffectUsed = SCFE_SwitchShortMichaelIn 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 = 400 thisSwitchCam.nodes[1].vNodePos = <<-1.8625, 1.5081, -0.0774>> 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.8, 0.5>> thisSwitchCam.nodes[1].bPointAtEntity = TRUE thisSwitchCam.nodes[1].bPointAtOffsetIsRelative = TRUE thisSwitchCam.nodes[1].bAttachOffsetIsRelative = TRUE thisSwitchCam.nodes[1].fNodeFOV = 40.0000 thisSwitchCam.nodes[1].vClonedNodeOffset = <<0.0000, 0.0000, 0.0000>> thisSwitchCam.nodes[1].iNodeToClone = 0 thisSwitchCam.nodes[1].NodeTimePostFX_Type = NO_EFFECT thisSwitchCam.nodes[1].fNodeTimePostFXBlendTime = 0.0000 thisSwitchCam.nodes[1].fNodeTimePostFXTimeOffset = 0.0000 thisSwitchCam.nodes[1].fNodeMotionBlur = 1.0000 thisSwitchCam.nodes[1].NodeCamShakeType = CAM_SHAKE_MEDIUM thisSwitchCam.nodes[1].fNodeCamShake = 0.5000 thisSwitchCam.nodes[1].iCamEaseType = 0 thisSwitchCam.nodes[1].fCamEaseScaler = 0.0000 thisSwitchCam.nodes[1].fCamNodeVelocityScale = 0.6000 thisSwitchCam.nodes[1].bCamEaseForceLinear = FALSE thisSwitchCam.nodes[1].bCamEaseForceLevel = FALSE thisSwitchCam.nodes[1].fTimeScale = 0.3 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 = 600 thisSwitchCam.nodes[2].vNodePos = <<-1.6125, 2.0081, 0.6774>> 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.5, 0.9, 0.3>> thisSwitchCam.nodes[2].bPointAtEntity = TRUE thisSwitchCam.nodes[2].bPointAtOffsetIsRelative = TRUE thisSwitchCam.nodes[2].bAttachOffsetIsRelative = TRUE thisSwitchCam.nodes[2].fNodeFOV = 40.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 = 1.0000 thisSwitchCam.nodes[2].NodeCamShakeType = CAM_SHAKE_MEDIUM thisSwitchCam.nodes[2].fNodeCamShake = 0.5000 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 = 0.3 thisSwitchCam.nodes[2].iTimeScaleEaseType = 0 thisSwitchCam.nodes[2].fTimeScaleEaseScaler = 0.0000 thisSwitchCam.nodes[2].bFlashEnabled = TRUE thisSwitchCam.nodes[2].SCFE_FlashEffectUsed = SCFE_SwitchShortTrevorMid 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.3000 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 = 400 thisSwitchCam.nodes[3].vNodePos = <<-1.6125, 2.0081, 0.6774>> 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.5, 0.9, 0.3>> thisSwitchCam.nodes[3].bPointAtEntity = TRUE thisSwitchCam.nodes[3].bPointAtOffsetIsRelative = TRUE thisSwitchCam.nodes[3].bAttachOffsetIsRelative = TRUE thisSwitchCam.nodes[3].fNodeFOV = 40.0000 thisSwitchCam.nodes[3].vClonedNodeOffset = <<0.0000, 0.0000, 0.0000>> thisSwitchCam.nodes[3].iNodeToClone = 0 thisSwitchCam.nodes[3].NodeTimePostFX_Type = NO_EFFECT thisSwitchCam.nodes[3].fNodeTimePostFXBlendTime = 0.0000 thisSwitchCam.nodes[3].fNodeTimePostFXTimeOffset = 0.0000 thisSwitchCam.nodes[3].fNodeMotionBlur = 0.0000 thisSwitchCam.nodes[3].NodeCamShakeType = CAM_SHAKE_DEFAULT thisSwitchCam.nodes[3].fNodeCamShake = 0.5000 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 INT i REPEAT COUNT_OF(thisSwitchCam.camVelocityOverrides) i thisSwitchCam.camVelocityOverrides[i].fStartPoint = 0.0 thisSwitchCam.camVelocityOverrides[i].fSpeed = -1 ENDREPEAT thisSwitchCam.iNumNodes = 4 thisSwitchCam.iCamSwitchFocusNode = 2 thisSwitchCam.fSwitchSoundAudioStartPhase = 0.25 thisSwitchCam.fSwitchSoundAudioEndPhase = 0.48 thisSwitchCam.bSwitchSoundPlayOpeningPulse = FALSE thisSwitchCam.bSwitchSoundPlayMoveLoop = FALSE thisSwitchCam.bSwitchSoundPlayExitPulse = FALSE thisSwitchCam.bSplineNoSmoothing = FALSE thisSwitchCam.bAddGameplayCamAsLastNode = FALSE thisSwitchCam.iGameplayNodeBlendDuration = 0 //--- End of Cam Data --- thisSwitchCam.strOutputStructName = "thisSwitchCam" thisSwitchCam.strOutputFileName = "CameraInfo_FIB2_HeliMichaelToFranklin.txt" thisSwitchCam.strXMLFileName = "CameraInfo_FIB2_HeliMichaelToFranklin.xml" thisSwitchCam.bInitialized = TRUE //ENDIF thisSwitchCam.piPeds[0] = piMichael thisSwitchCam.piPeds[1] = piTrevor ENDPROC /// PURPOSE: /// Handle the playback of the switch cam. The will setup, play, shut down and cleanup the switch cam spline /// PARAMS: /// thisSwitchCam - Switch camera to playback /// bReturnTrueOnce - If you only want this function to return TRUE once upon completion. Set to FALSE to have this function to return true every time this is called once the camera is finished playback. /// RETURNS: /// TRUE when camera is complete, FALSE if playback is still active, or if the camera has completed playback and bReturnTrueOnce is set to TRUE. FUNC BOOL HANDLE_SWITCH_CAM_HELI_MICHAEL_TO_TREVOR(SWITCH_CAM_STRUCT &thisSwitchCam, BOOL bReturnTrueOnce = TRUE) IS_PED_INJURED(GET_FRANKLIN_PED()) IS_PED_INJURED(GET_MICHAEL_PED()) IS_PED_INJURED(GET_TREVOR_PED()) IS_VEHICLE_DRIVEABLE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) INT iCurrentNode SWITCH eSwitchCamState CASE SWITCH_CAM_IDLE CDEBUG3LN(DEBUG_MISSION, "eSwitchCamState = SWITCH_CAM_IDLE") RETURN FALSE BREAK CASE SWITCH_CAM_SETUP_SPLINE CDEBUG3LN(DEBUG_MISSION, "eSwitchCamState = SWITCH_CAM_SETUP_SPLINE") IF NOT bSwitchToFirstPerson SETUP_SPLINE_CAM_NODE_ARRAY_HELI_MICHAEL_TO_TREVOR(thisSwitchCam, GET_MICHAEL_PED(), GET_TREVOR_PED()) ELSE SETUP_SPLINE_CAM_NODE_ARRAY_HELI_MICHAEL_TO_TREVOR_FIRST_PERSON(thisSwitchCam, GET_MICHAEL_PED(), GET_TREVOR_PED()) ENDIF IF DOES_SWITCH_CAM_EXIST(thisSwitchCam) DESTROY_SWITCH_CAM(thisSwitchCam) ENDIF CREATE_SPLINE_CAM(thisSwitchCam) IF bSwitchToFirstPerson INT i REPEAT COUNT_OF(thisSwitchCam.nodes) i IF DOES_CAM_EXIST(thisSwitchCam.nodes[i].ciSwitchNode) SET_CAM_INHERIT_ROLL_VEHICLE(thisSwitchCam.nodes[i].ciSwitchNode, snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) ENDIF ENDREPEAT ENDIF SET_GAME_PAUSES_FOR_STREAMING(FALSE) SET_CAM_ACTIVE(thisSwitchCam.ciSpline, TRUE) RENDER_SCRIPT_CAMS(TRUE, FALSE) DISPLAY_RADAR(FALSE) DISPLAY_HUD(FALSE) SETTIMERB(0) SET_PLAYER_CONTROL(PLAYER_ID(), FALSE) bPlayerControlGiven = FALSE IF currentMissionStage = STAGE_DROPOFF IF NOT bSwitchToFirstPerson CLEAR_PED_TASKS(GET_MICHAEL_PED()) ENDIF ENDIF eSwitchCamState = SWITCH_CAM_PLAYING_SPLINE RETURN TRUE BREAK CASE SWITCH_CAM_PLAYING_SPLINE CDEBUG3LN(DEBUG_MISSION, "eSwitchCamState = SWITCH_CAM_PLAYING_SPLINE") CDEBUG3LN(DEBUG_MISSION, GET_CAM_SPLINE_PHASE(thisSwitchCam.ciSpline)) iCurrentNode = UPDATE_SPLINE_CAM(thisSwitchCam) PRINTSTRING("spline pos = ") PRINTINT(iCurrentNode) PRINTNL() IF IS_CAM_ACTIVE(thisSwitchCam.ciSpline) IF iCurrentNode >= thisSwitchCam.iCamSwitchFocusNode sCamDetails.bOKToSwitchPed = TRUE ENDIF IF bSwitchToFirstPerson IF NOT bDoneHitSound IF GET_GAME_TIMER() >= (iSnatchAndGrabCutsceneTime + 20) PLAY_SOUND_FRONTEND(-1, "Hit_Out", "PLAYER_SWITCH_CUSTOM_SOUNDSET") iHitTime = GET_GAME_TIMER() bDoneHitSound = TRUE ENDIF ENDIF IF NOT bWooshStarted IF bDoneHitSound IF GET_GAME_TIMER() >= iHitTime + 150 PLAY_SOUND_FRONTEND(-1, "Short_Transition_In", "PLAYER_SWITCH_CUSTOM_SOUNDSET") bWooshStarted = TRUE ENDIF ENDIF ENDIF ENDIF //[MF] Once cam is at the end, reset the gameplay cam positon and advance to next state. IF DOES_CAM_EXIST(thisSwitchCam.ciSpline) IF GET_CAM_SPLINE_PHASE(thisSwitchCam.ciSpline) >= 1.00 CDEBUG3LN(DEBUG_MISSION, "eSwitchCamState = SWITCH_CAM_RETURN_TO_GAMEPLAY") RENDER_SCRIPT_CAMS(FALSE, FALSE) eSwitchCamState = SWITCH_CAM_RETURN_TO_GAMEPLAY ENDIF ELSE SCRIPT_ASSERT("Cam Prematurely Deleted! WTF?") RENDER_SCRIPT_CAMS(FALSE, FALSE) eSwitchCamState = SWITCH_CAM_RETURN_TO_GAMEPLAY ENDIF ENDIF RETURN TRUE BREAK CASE 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) ENDIF IF DOES_SWITCH_CAM_EXIST(thisSwitchCam) DESTROY_SWITCH_CAM(thisSwitchCam) ENDIF IF NOT bPlayerControlGiven SET_PLAYER_CONTROL(PLAYER_ID(), TRUE) DISPLAY_RADAR(TRUE) DISPLAY_HUD(TRUE) bPlayerControlGiven = TRUE ENDIF SETTIMERA(0) SET_GAME_PAUSES_FOR_STREAMING(TRUE) eSwitchCamState = SWITCH_CAM_IDLE thisSwitchCam.bIsSplineCamFinishedPlaying = TRUE SET_PLAYER_CONTROL(PLAYER_ID(), true) sCamDetails.bSplineCreated = FALSE sCamDetails.bOKToSwitchPed = FALSE CLEAR_PED_TASKS(GET_MICHAEL_PED()) RETURN FALSE BREAK ENDSWITCH IF bReturnTrueOnce RETURN FALSE ELSE RETURN thisSwitchCam.bIsSplineCamFinishedPlaying ENDIF ENDFUNC /// PURPOSE: /// Rotate an euler rotation vector to an equivalent upward pointing directional vector /// PARAMS: /// vEuler - Euler rotation vector to convert to upwards facing direction vector /// RETURNS: /// VECTOR for upward direction of Euler rotation FUNC VECTOR CONVERT_EULER_TO_UPWARD_VECTOR(VECTOR vEuler) // Euler angles assumed to be in YXZ order VECTOR vResult //c.Set( sy*cz + cy*sx*sz, sy*sz - cy*sx*cz, cy*cx); vResult.z = Cos(vEuler.y) FLOAT sy = Sin(vEuler.y) FLOAT cz = Cos(vEuler.z) FLOAT sz = Sin(vEuler.z) FLOAT cy_sx = vResult.z * Sin(vEuler.x) vResult.y = sy * sz vResult.y -= cy_sx * cz vResult.x = cy_sx * sz vResult.x += sy * cz vResult.z *= Cos(vEuler.x) RETURN vResult ENDFUNC PROC SETUP_SPLINE_CAM_NODE_ARRAY_HELI_MICHAEL_TO_FRANKLIN(SWITCH_CAM_STRUCT &thisSwitchCam, PED_INDEX piMichael, PED_INDEX piFranklin) CDEBUG3LN(DEBUG_MISSION, "SETUP_SPLINE_CAM_NODE_ARRAY_HELI_MICHAEL_TO_FRANKLIN") //IF NOT thisSwitchCam.bInitialized //--- Start of Cam Data --- thisSwitchCam.nodes[0].SwitchCamType = SWITCH_CAM_OLD_SYSTEM thisSwitchCam.nodes[0].iForceCamPointAtEntityIndex = -1 thisSwitchCam.nodes[0].bIsGameplayCamCopy = FALSE thisSwitchCam.nodes[0].iNodeTime = 0 thisSwitchCam.nodes[0].vNodePos = <<-0.9162, 1.8503, 0.4801>> thisSwitchCam.nodes[0].vWorldPosLookAt = <<0.0000, 0.0000, 0.0000>> thisSwitchCam.nodes[0].fNodeOffsetDist = 0.0000 thisSwitchCam.nodes[0].fNodeVerticleOffset = 0.0000 thisSwitchCam.nodes[0].bAttachToOriginPed = FALSE thisSwitchCam.nodes[0].vNodeDir = <<-0.9487, -0.0063, 0.3628>> thisSwitchCam.nodes[0].bPointAtEntity = TRUE thisSwitchCam.nodes[0].bPointAtOffsetIsRelative = TRUE thisSwitchCam.nodes[0].bAttachOffsetIsRelative = TRUE thisSwitchCam.nodes[0].fNodeFOV = 45.0000 thisSwitchCam.nodes[0].vClonedNodeOffset = <<0.0000, 0.0000, 0.0000>> thisSwitchCam.nodes[0].iNodeToClone = 0 thisSwitchCam.nodes[0].NodeTimePostFX_Type = NO_EFFECT thisSwitchCam.nodes[0].fNodeTimePostFXBlendTime = 0.0000 thisSwitchCam.nodes[0].fNodeTimePostFXTimeOffset = 0.0000 thisSwitchCam.nodes[0].fNodeMotionBlur = 0.0000 thisSwitchCam.nodes[0].NodeCamShakeType = CAM_SHAKE_DEFAULT thisSwitchCam.nodes[0].fNodeCamShake = 0.5000 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 = 0.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 = 300 thisSwitchCam.nodes[1].vNodePos = <<-0.9664, 2.2593, 0.5063>> 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 = <<-1.0457, 0.0132, 0.3572>> thisSwitchCam.nodes[1].bPointAtEntity = TRUE thisSwitchCam.nodes[1].bPointAtOffsetIsRelative = TRUE thisSwitchCam.nodes[1].bAttachOffsetIsRelative = TRUE thisSwitchCam.nodes[1].fNodeFOV = 45.0000 thisSwitchCam.nodes[1].vClonedNodeOffset = <<0.0000, 0.0000, 0.0000>> thisSwitchCam.nodes[1].iNodeToClone = 0 thisSwitchCam.nodes[1].NodeTimePostFX_Type = NO_EFFECT thisSwitchCam.nodes[1].fNodeTimePostFXBlendTime = 0.0000 thisSwitchCam.nodes[1].fNodeTimePostFXTimeOffset = 0.0000 thisSwitchCam.nodes[1].fNodeMotionBlur = 0.0000 thisSwitchCam.nodes[1].NodeCamShakeType = CAM_SHAKE_MEDIUM thisSwitchCam.nodes[1].fNodeCamShake = 0.5000 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 = TRUE thisSwitchCam.nodes[1].SCFE_FlashEffectUsed = SCFE_SwitchShortMichaelIn 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.3000 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 = 600 thisSwitchCam.nodes[2].vNodePos = <<-1.7246, 3.4542, -1.5665>> 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 = <<-1.7226, 0.0276, -1.6267>> thisSwitchCam.nodes[2].bPointAtEntity = TRUE thisSwitchCam.nodes[2].bPointAtOffsetIsRelative = TRUE thisSwitchCam.nodes[2].bAttachOffsetIsRelative = TRUE thisSwitchCam.nodes[2].fNodeFOV = 45.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 = 1.0000 thisSwitchCam.nodes[2].NodeCamShakeType = CAM_SHAKE_MEDIUM thisSwitchCam.nodes[2].fNodeCamShake = 0.5000 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 = 0.6000 thisSwitchCam.nodes[2].iTimeScaleEaseType = 0 thisSwitchCam.nodes[2].fTimeScaleEaseScaler = 0.0000 thisSwitchCam.nodes[2].bFlashEnabled = TRUE thisSwitchCam.nodes[2].SCFE_FlashEffectUsed = SCFE_SwitchShortFranklinMid 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.8000 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].bIsCamCutNode = TRUE thisSwitchCam.nodes[4].SwitchCamType = SWITCH_CAM_OLD_SYSTEM thisSwitchCam.nodes[4].iForceCamPointAtEntityIndex = -1 thisSwitchCam.nodes[4].bIsGameplayCamCopy = FALSE thisSwitchCam.nodes[4].iNodeTime = 0 thisSwitchCam.nodes[4].vNodePos = <<0.0646, 1.3472, 1.4595>> thisSwitchCam.nodes[4].vWorldPosLookAt = <<0.0000, 0.0000, 1.4500>> thisSwitchCam.nodes[4].fNodeOffsetDist = 0.0000 thisSwitchCam.nodes[4].fNodeVerticleOffset = 0.0000 thisSwitchCam.nodes[4].bAttachToOriginPed = FALSE thisSwitchCam.nodes[4].vNodeDir = <<0.3564, 0.2439, 1.4688>> thisSwitchCam.nodes[4].bPointAtEntity = TRUE thisSwitchCam.nodes[4].bPointAtOffsetIsRelative = TRUE thisSwitchCam.nodes[4].bAttachOffsetIsRelative = TRUE thisSwitchCam.nodes[4].fNodeFOV = 40.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 = 1.0000 thisSwitchCam.nodes[4].NodeCamShakeType = CAM_SHAKE_MEDIUM thisSwitchCam.nodes[4].fNodeCamShake = 0.5000 thisSwitchCam.nodes[4].iCamEaseType = 1 thisSwitchCam.nodes[4].fCamEaseScaler = 1.0000 thisSwitchCam.nodes[4].fCamNodeVelocityScale = 0.0000 thisSwitchCam.nodes[4].bCamEaseForceLinear = TRUE thisSwitchCam.nodes[4].bCamEaseForceLevel = FALSE thisSwitchCam.nodes[4].fTimeScale = 0.3000 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 = FALSE thisSwitchCam.nodes[5].iNodeTime = 600 thisSwitchCam.nodes[5].vNodePos = <<-0.0083, 1.3912, 0.2997>> thisSwitchCam.nodes[5].vWorldPosLookAt = <<0.0000, 0.0000, 0.4000>> thisSwitchCam.nodes[5].fNodeOffsetDist = 0.0000 thisSwitchCam.nodes[5].fNodeVerticleOffset = 0.0000 thisSwitchCam.nodes[5].bAttachToOriginPed = FALSE thisSwitchCam.nodes[5].vNodeDir = <<0.4002, 0.1876, 0.4090>> thisSwitchCam.nodes[5].bPointAtEntity = TRUE thisSwitchCam.nodes[5].bPointAtOffsetIsRelative = TRUE thisSwitchCam.nodes[5].bAttachOffsetIsRelative = TRUE thisSwitchCam.nodes[5].fNodeFOV = 40.0000 thisSwitchCam.nodes[5].vClonedNodeOffset = <<0.0000, 0.0000, 0.0000>> thisSwitchCam.nodes[5].iNodeToClone = 0 thisSwitchCam.nodes[5].NodeTimePostFX_Type = NO_EFFECT thisSwitchCam.nodes[5].fNodeTimePostFXBlendTime = 0.0000 thisSwitchCam.nodes[5].fNodeTimePostFXTimeOffset = 0.0000 thisSwitchCam.nodes[5].fNodeMotionBlur = 1.0000 thisSwitchCam.nodes[5].NodeCamShakeType = CAM_SHAKE_MEDIUM thisSwitchCam.nodes[5].fNodeCamShake = 0.5000 thisSwitchCam.nodes[5].iCamEaseType = 0 thisSwitchCam.nodes[5].fCamEaseScaler = 0.0000 thisSwitchCam.nodes[5].fCamNodeVelocityScale = 0.0000 thisSwitchCam.nodes[5].bCamEaseForceLinear = TRUE thisSwitchCam.nodes[5].bCamEaseForceLevel = FALSE thisSwitchCam.nodes[5].fTimeScale = 0.3000 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.nodes[6].SwitchCamType = SWITCH_CAM_OLD_SYSTEM thisSwitchCam.nodes[6].iForceCamPointAtEntityIndex = -1 thisSwitchCam.nodes[6].bIsGameplayCamCopy = FALSE thisSwitchCam.nodes[6].iNodeTime = 400 thisSwitchCam.nodes[6].vNodePos = <<-0.0083, 1.3912, 0.2997>> thisSwitchCam.nodes[6].vWorldPosLookAt = <<0.0000, 0.0000, 0.4000>> thisSwitchCam.nodes[6].fNodeOffsetDist = 0.0000 thisSwitchCam.nodes[6].fNodeVerticleOffset = 0.0000 thisSwitchCam.nodes[6].bAttachToOriginPed = FALSE thisSwitchCam.nodes[6].vNodeDir = <<0.4002, 0.1876, 0.4090>> thisSwitchCam.nodes[6].bPointAtEntity = TRUE thisSwitchCam.nodes[6].bPointAtOffsetIsRelative = TRUE thisSwitchCam.nodes[6].bAttachOffsetIsRelative = TRUE thisSwitchCam.nodes[6].fNodeFOV = 40.0000 thisSwitchCam.nodes[6].vClonedNodeOffset = <<0.0000, 0.0000, 0.0000>> thisSwitchCam.nodes[6].iNodeToClone = 0 thisSwitchCam.nodes[6].NodeTimePostFX_Type = NO_EFFECT thisSwitchCam.nodes[6].fNodeTimePostFXBlendTime = 0.0000 thisSwitchCam.nodes[6].fNodeTimePostFXTimeOffset = 0.0000 thisSwitchCam.nodes[6].fNodeMotionBlur = 0.0000 thisSwitchCam.nodes[6].NodeCamShakeType = CAM_SHAKE_MEDIUM thisSwitchCam.nodes[6].fNodeCamShake = 0.5000 thisSwitchCam.nodes[6].iCamEaseType = 0 thisSwitchCam.nodes[6].fCamEaseScaler = 0.0000 thisSwitchCam.nodes[6].fCamNodeVelocityScale = 0.0000 thisSwitchCam.nodes[6].bCamEaseForceLinear = TRUE thisSwitchCam.nodes[6].bCamEaseForceLevel = FALSE thisSwitchCam.nodes[6].fTimeScale = 1.0000 thisSwitchCam.nodes[6].iTimeScaleEaseType = 0 thisSwitchCam.nodes[6].fTimeScaleEaseScaler = 0.0000 thisSwitchCam.nodes[6].bFlashEnabled = FALSE thisSwitchCam.nodes[6].SCFE_FlashEffectUsed = SCFE_CODE_FLASH thisSwitchCam.nodes[6].fMinExposure = 0.0000 thisSwitchCam.nodes[6].fMaxExposure = 0.0000 thisSwitchCam.nodes[6].iRampUpDuration = 0 thisSwitchCam.nodes[6].iRampDownDuration = 0 thisSwitchCam.nodes[6].iHoldDuration = 0 thisSwitchCam.nodes[6].fFlashNodePhaseOffset = 0.0000 thisSwitchCam.nodes[6].bIsLowDetailNode = FALSE thisSwitchCam.nodes[6].bUseCustomDOF = FALSE thisSwitchCam.nodes[6].NodeDOF_Info.fDOF_NearDOF = 0.0000 thisSwitchCam.nodes[6].NodeDOF_Info.fDOF_FarDOF = 0.0000 thisSwitchCam.nodes[6].NodeDOF_Info.fDOF_EffectStrength = 0.0000 thisSwitchCam.iNumNodes = 7 thisSwitchCam.iCamSwitchFocusNode = 3 thisSwitchCam.fSwitchSoundAudioStartPhase = 0.07 thisSwitchCam.fSwitchSoundAudioEndPhase = 0.45 thisSwitchCam.bSwitchSoundPlayOpeningPulse = FALSE thisSwitchCam.bSwitchSoundPlayMoveLoop = FALSE thisSwitchCam.bSwitchSoundPlayExitPulse = FALSE thisSwitchCam.bSplineNoSmoothing = FALSE thisSwitchCam.bAddGameplayCamAsLastNode = FALSE thisSwitchCam.iGameplayNodeBlendDuration = 0 //--- End of Cam Data --- thisSwitchCam.strOutputStructName = "thisSwitchCam" thisSwitchCam.strOutputFileName = "CameraInfo_FIB2_HeliMichaelToFranklin.txt" thisSwitchCam.strXMLFileName = "CameraInfo_FIB2_HeliMichaelToFranklin.xml" thisSwitchCam.bInitialized = TRUE //ENDIF thisSwitchCam.piPeds[0] = piMichael thisSwitchCam.piPeds[1] = piFranklin ENDPROC PROC SETUP_SPLINE_CAM_NODE_ARRAY_HELI_MICHAEL_TO_FRANKLIN_FIRST_PERSON(SWITCH_CAM_STRUCT &thisSwitchCam, PED_INDEX piMichael, PED_INDEX piFranklin) CDEBUG3LN(DEBUG_MISSION, "SETUP_SPLINE_CAM_NODE_ARRAY_HELI_MICHAEL_TO_FRANKLIN") //IF NOT thisSwitchCam.bInitialized //--- Start of Cam Data --- thisSwitchCam.nodes[0].SwitchCamType = SWITCH_CAM_OLD_SYSTEM thisSwitchCam.nodes[0].iForceCamPointAtEntityIndex = -1 thisSwitchCam.nodes[0].bIsGameplayCamCopy = FALSE thisSwitchCam.nodes[0].iNodeTime = 0 thisSwitchCam.nodes[0].vNodePos = <<-1.9125, 1.3081, -0.1774>> thisSwitchCam.nodes[0].vWorldPosLookAt = <<0.0000, 0.0000, 0.0000>> thisSwitchCam.nodes[0].fNodeOffsetDist = 0.0000 thisSwitchCam.nodes[0].fNodeVerticleOffset = 0.0000 thisSwitchCam.nodes[0].bAttachToOriginPed = FALSE thisSwitchCam.nodes[0].vNodeDir = <<0, -1, 0.6>> thisSwitchCam.nodes[0].bPointAtEntity = TRUE thisSwitchCam.nodes[0].bPointAtOffsetIsRelative = TRUE thisSwitchCam.nodes[0].bAttachOffsetIsRelative = TRUE thisSwitchCam.nodes[0].fNodeFOV = 40.0000 thisSwitchCam.nodes[0].vClonedNodeOffset = <<0.0000, 0.0000, 0.0000>> thisSwitchCam.nodes[0].iNodeToClone = 0 thisSwitchCam.nodes[0].NodeTimePostFX_Type = NO_EFFECT thisSwitchCam.nodes[0].fNodeTimePostFXBlendTime = 0.0000 thisSwitchCam.nodes[0].fNodeTimePostFXTimeOffset = 0.0000 thisSwitchCam.nodes[0].fNodeMotionBlur = 0.0000 thisSwitchCam.nodes[0].NodeCamShakeType = CAM_SHAKE_DEFAULT thisSwitchCam.nodes[0].fNodeCamShake = 0.5000 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 = 0.0000 thisSwitchCam.nodes[0].iTimeScaleEaseType = 0 thisSwitchCam.nodes[0].fTimeScaleEaseScaler = 0.0000 thisSwitchCam.nodes[0].bFlashEnabled = TRUE thisSwitchCam.nodes[0].SCFE_FlashEffectUsed = SCFE_SwitchShortMichaelIn 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 = 400 thisSwitchCam.nodes[1].vNodePos = <<-1.9125, 1.3081, -0.3774>> 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, -1, 0.4>> thisSwitchCam.nodes[1].bPointAtEntity = TRUE thisSwitchCam.nodes[1].bPointAtOffsetIsRelative = TRUE thisSwitchCam.nodes[1].bAttachOffsetIsRelative = TRUE thisSwitchCam.nodes[1].fNodeFOV = 40.0000 thisSwitchCam.nodes[1].vClonedNodeOffset = <<0.0000, 0.0000, 0.0000>> thisSwitchCam.nodes[1].iNodeToClone = 0 thisSwitchCam.nodes[1].NodeTimePostFX_Type = NO_EFFECT thisSwitchCam.nodes[1].fNodeTimePostFXBlendTime = 0.0000 thisSwitchCam.nodes[1].fNodeTimePostFXTimeOffset = 0.0000 thisSwitchCam.nodes[1].fNodeMotionBlur = 0.0000 thisSwitchCam.nodes[1].NodeCamShakeType = CAM_SHAKE_MEDIUM thisSwitchCam.nodes[1].fNodeCamShake = 0.5000 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.3000 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 = 600 thisSwitchCam.nodes[2].vNodePos = <<-1.9125, 1.3081, -2.1774>> 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, -1, -1.4>> thisSwitchCam.nodes[2].bPointAtEntity = TRUE thisSwitchCam.nodes[2].bPointAtOffsetIsRelative = TRUE thisSwitchCam.nodes[2].bAttachOffsetIsRelative = TRUE thisSwitchCam.nodes[2].fNodeFOV = 40.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 = 1.0000 thisSwitchCam.nodes[2].NodeCamShakeType = CAM_SHAKE_MEDIUM thisSwitchCam.nodes[2].fNodeCamShake = 0.5000 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 = 0.6000 thisSwitchCam.nodes[2].iTimeScaleEaseType = 0 thisSwitchCam.nodes[2].fTimeScaleEaseScaler = 0.0000 thisSwitchCam.nodes[2].bFlashEnabled = TRUE thisSwitchCam.nodes[2].SCFE_FlashEffectUsed = SCFE_SwitchShortFranklinMid 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.8000 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].bIsCamCutNode = TRUE thisSwitchCam.nodes[4].SwitchCamType = SWITCH_CAM_OLD_SYSTEM thisSwitchCam.nodes[4].iForceCamPointAtEntityIndex = -1 thisSwitchCam.nodes[4].bIsGameplayCamCopy = FALSE thisSwitchCam.nodes[4].iNodeTime = 0 thisSwitchCam.nodes[4].vNodePos = <<0.0646, 1.3472, 1.4595>> thisSwitchCam.nodes[4].vWorldPosLookAt = <<0.0000, 0.0000, 1.4500>> thisSwitchCam.nodes[4].fNodeOffsetDist = 0.0000 thisSwitchCam.nodes[4].fNodeVerticleOffset = 0.0000 thisSwitchCam.nodes[4].bAttachToOriginPed = FALSE thisSwitchCam.nodes[4].vNodeDir = <<0.3564, 0.2439, 1.4688>> thisSwitchCam.nodes[4].bPointAtEntity = TRUE thisSwitchCam.nodes[4].bPointAtOffsetIsRelative = TRUE thisSwitchCam.nodes[4].bAttachOffsetIsRelative = TRUE thisSwitchCam.nodes[4].fNodeFOV = 40.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 = 1.0000 thisSwitchCam.nodes[4].NodeCamShakeType = CAM_SHAKE_MEDIUM thisSwitchCam.nodes[4].fNodeCamShake = 0.5000 thisSwitchCam.nodes[4].iCamEaseType = 1 thisSwitchCam.nodes[4].fCamEaseScaler = 1.0000 thisSwitchCam.nodes[4].fCamNodeVelocityScale = 0.0000 thisSwitchCam.nodes[4].bCamEaseForceLinear = TRUE thisSwitchCam.nodes[4].bCamEaseForceLevel = FALSE thisSwitchCam.nodes[4].fTimeScale = 0.3000 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 = FALSE thisSwitchCam.nodes[5].iNodeTime = 600 thisSwitchCam.nodes[5].vNodePos = <<-0.0083, 1.3912, 0.2997>> thisSwitchCam.nodes[5].vWorldPosLookAt = <<0.0000, 0.0000, 0.4000>> thisSwitchCam.nodes[5].fNodeOffsetDist = 0.0000 thisSwitchCam.nodes[5].fNodeVerticleOffset = 0.0000 thisSwitchCam.nodes[5].bAttachToOriginPed = FALSE thisSwitchCam.nodes[5].vNodeDir = <<0.4002, 0.1876, 0.4090>> thisSwitchCam.nodes[5].bPointAtEntity = TRUE thisSwitchCam.nodes[5].bPointAtOffsetIsRelative = TRUE thisSwitchCam.nodes[5].bAttachOffsetIsRelative = TRUE thisSwitchCam.nodes[5].fNodeFOV = 40.0000 thisSwitchCam.nodes[5].vClonedNodeOffset = <<0.0000, 0.0000, 0.0000>> thisSwitchCam.nodes[5].iNodeToClone = 0 thisSwitchCam.nodes[5].NodeTimePostFX_Type = NO_EFFECT thisSwitchCam.nodes[5].fNodeTimePostFXBlendTime = 0.0000 thisSwitchCam.nodes[5].fNodeTimePostFXTimeOffset = 0.0000 thisSwitchCam.nodes[5].fNodeMotionBlur = 1.0000 thisSwitchCam.nodes[5].NodeCamShakeType = CAM_SHAKE_MEDIUM thisSwitchCam.nodes[5].fNodeCamShake = 0.5000 thisSwitchCam.nodes[5].iCamEaseType = 0 thisSwitchCam.nodes[5].fCamEaseScaler = 0.0000 thisSwitchCam.nodes[5].fCamNodeVelocityScale = 0.0000 thisSwitchCam.nodes[5].bCamEaseForceLinear = TRUE thisSwitchCam.nodes[5].bCamEaseForceLevel = FALSE thisSwitchCam.nodes[5].fTimeScale = 0.3000 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.nodes[6].SwitchCamType = SWITCH_CAM_OLD_SYSTEM thisSwitchCam.nodes[6].iForceCamPointAtEntityIndex = -1 thisSwitchCam.nodes[6].bIsGameplayCamCopy = FALSE thisSwitchCam.nodes[6].iNodeTime = 400 thisSwitchCam.nodes[6].vNodePos = <<-0.0083, 1.3912, 0.2997>> thisSwitchCam.nodes[6].vWorldPosLookAt = <<0.0000, 0.0000, 0.4000>> thisSwitchCam.nodes[6].fNodeOffsetDist = 0.0000 thisSwitchCam.nodes[6].fNodeVerticleOffset = 0.0000 thisSwitchCam.nodes[6].bAttachToOriginPed = FALSE thisSwitchCam.nodes[6].vNodeDir = <<0.4002, 0.1876, 0.4090>> thisSwitchCam.nodes[6].bPointAtEntity = TRUE thisSwitchCam.nodes[6].bPointAtOffsetIsRelative = TRUE thisSwitchCam.nodes[6].bAttachOffsetIsRelative = TRUE thisSwitchCam.nodes[6].fNodeFOV = 40.0000 thisSwitchCam.nodes[6].vClonedNodeOffset = <<0.0000, 0.0000, 0.0000>> thisSwitchCam.nodes[6].iNodeToClone = 0 thisSwitchCam.nodes[6].NodeTimePostFX_Type = NO_EFFECT thisSwitchCam.nodes[6].fNodeTimePostFXBlendTime = 0.0000 thisSwitchCam.nodes[6].fNodeTimePostFXTimeOffset = 0.0000 thisSwitchCam.nodes[6].fNodeMotionBlur = 0.0000 thisSwitchCam.nodes[6].NodeCamShakeType = CAM_SHAKE_MEDIUM thisSwitchCam.nodes[6].fNodeCamShake = 0.5000 thisSwitchCam.nodes[6].iCamEaseType = 0 thisSwitchCam.nodes[6].fCamEaseScaler = 0.0000 thisSwitchCam.nodes[6].fCamNodeVelocityScale = 0.0000 thisSwitchCam.nodes[6].bCamEaseForceLinear = TRUE thisSwitchCam.nodes[6].bCamEaseForceLevel = FALSE thisSwitchCam.nodes[6].fTimeScale = 1.0000 thisSwitchCam.nodes[6].iTimeScaleEaseType = 0 thisSwitchCam.nodes[6].fTimeScaleEaseScaler = 0.0000 thisSwitchCam.nodes[6].bFlashEnabled = FALSE thisSwitchCam.nodes[6].SCFE_FlashEffectUsed = SCFE_CODE_FLASH thisSwitchCam.nodes[6].fMinExposure = 0.0000 thisSwitchCam.nodes[6].fMaxExposure = 0.0000 thisSwitchCam.nodes[6].iRampUpDuration = 0 thisSwitchCam.nodes[6].iRampDownDuration = 0 thisSwitchCam.nodes[6].iHoldDuration = 0 thisSwitchCam.nodes[6].fFlashNodePhaseOffset = 0.0000 thisSwitchCam.nodes[6].bIsLowDetailNode = FALSE thisSwitchCam.nodes[6].bUseCustomDOF = FALSE thisSwitchCam.nodes[6].NodeDOF_Info.fDOF_NearDOF = 0.0000 thisSwitchCam.nodes[6].NodeDOF_Info.fDOF_FarDOF = 0.0000 thisSwitchCam.nodes[6].NodeDOF_Info.fDOF_EffectStrength = 0.0000 thisSwitchCam.iNumNodes = 7 thisSwitchCam.iCamSwitchFocusNode = 3 thisSwitchCam.fSwitchSoundAudioStartPhase = 0.07 thisSwitchCam.fSwitchSoundAudioEndPhase = 0.45 thisSwitchCam.bSwitchSoundPlayOpeningPulse = FALSE thisSwitchCam.bSwitchSoundPlayMoveLoop = FALSE thisSwitchCam.bSwitchSoundPlayExitPulse = FALSE thisSwitchCam.bSplineNoSmoothing = FALSE thisSwitchCam.bAddGameplayCamAsLastNode = FALSE thisSwitchCam.iGameplayNodeBlendDuration = 0 //--- End of Cam Data --- thisSwitchCam.strOutputStructName = "thisSwitchCam" thisSwitchCam.strOutputFileName = "CameraInfo_FIB2_HeliMichaelToFranklin.txt" thisSwitchCam.strXMLFileName = "CameraInfo_FIB2_HeliMichaelToFranklin.xml" thisSwitchCam.bInitialized = TRUE //ENDIF thisSwitchCam.piPeds[0] = piMichael thisSwitchCam.piPeds[1] = piFranklin ENDPROC PROC SETUP_SPLINE_CAM_NODE_ARRAY_HELI_TREVOR_TO_FRANKLIN(SWITCH_CAM_STRUCT &thisSwitchCam, VEHICLE_INDEX viHeli, PED_INDEX piFranklin) CDEBUG3LN(DEBUG_MISSION, "SETUP_SPLINE_CAM_NODE_ARRAY_HELI_TREVOR_TO_FRANKLIN") //IF NOT thisSwitchCam.bInitialized //--- Start of Cam Data --- thisSwitchCam.nodes[0].SwitchCamType = SWITCH_CAM_OLD_SYSTEM thisSwitchCam.nodes[0].iForceCamPointAtEntityIndex = -1 thisSwitchCam.nodes[0].bIsGameplayCamCopy = TRUE thisSwitchCam.nodes[0].iNodeTime = 0 thisSwitchCam.nodes[0].vNodePos = <<-425.2161, -1215.4039, 195.0455>> thisSwitchCam.nodes[0].vWorldPosLookAt = <<0.0000, 0.0000, 0.2000>> thisSwitchCam.nodes[0].fNodeOffsetDist = 0.0000 thisSwitchCam.nodes[0].fNodeVerticleOffset = 0.0000 thisSwitchCam.nodes[0].bAttachToOriginPed = FALSE thisSwitchCam.nodes[0].vNodeDir = <<-14.1385, -8.8904, -171.0823>> thisSwitchCam.nodes[0].bPointAtEntity = FALSE thisSwitchCam.nodes[0].bPointAtOffsetIsRelative = FALSE thisSwitchCam.nodes[0].bAttachOffsetIsRelative = FALSE thisSwitchCam.nodes[0].fNodeFOV = 64.7053 thisSwitchCam.nodes[0].vClonedNodeOffset = <<0.0000, 0.0000, 0.0000>> thisSwitchCam.nodes[0].iNodeToClone = 0 thisSwitchCam.nodes[0].NodeTimePostFX_Type = NO_EFFECT thisSwitchCam.nodes[0].fNodeTimePostFXBlendTime = 0.0000 thisSwitchCam.nodes[0].fNodeTimePostFXTimeOffset = 0.0000 thisSwitchCam.nodes[0].fNodeMotionBlur = 0.0000 thisSwitchCam.nodes[0].NodeCamShakeType = CAM_SHAKE_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 = 0.0100 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 = TRUE thisSwitchCam.nodes[1].iNodeTime = 100 thisSwitchCam.nodes[1].vNodePos = <<0.1000, 0.1000, 0.1000>> thisSwitchCam.nodes[1].vWorldPosLookAt = <<0.0000, 0.0000, 0.2000>> thisSwitchCam.nodes[1].fNodeOffsetDist = 0.0000 thisSwitchCam.nodes[1].fNodeVerticleOffset = 0.0000 thisSwitchCam.nodes[1].bAttachToOriginPed = FALSE thisSwitchCam.nodes[1].vNodeDir = <<0.0000, 0.0000, 0.0000>> thisSwitchCam.nodes[1].bPointAtEntity = TRUE thisSwitchCam.nodes[1].bPointAtOffsetIsRelative = TRUE thisSwitchCam.nodes[1].bAttachOffsetIsRelative = TRUE thisSwitchCam.nodes[1].fNodeFOV = 45.0000 thisSwitchCam.nodes[1].vClonedNodeOffset = <<0.0000, 0.0000, 0.0000>> thisSwitchCam.nodes[1].iNodeToClone = 0 thisSwitchCam.nodes[1].NodeTimePostFX_Type = NO_EFFECT thisSwitchCam.nodes[1].fNodeTimePostFXBlendTime = 0.0000 thisSwitchCam.nodes[1].fNodeTimePostFXTimeOffset = 0.0000 thisSwitchCam.nodes[1].fNodeMotionBlur = 0.0000 thisSwitchCam.nodes[1].NodeCamShakeType = CAM_SHAKE_DEFAULT thisSwitchCam.nodes[1].fNodeCamShake = 0.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 = 0.5000 thisSwitchCam.nodes[1].iTimeScaleEaseType = 0 thisSwitchCam.nodes[1].fTimeScaleEaseScaler = 0.0000 thisSwitchCam.nodes[1].bFlashEnabled = TRUE thisSwitchCam.nodes[1].SCFE_FlashEffectUsed = SCFE_SwitchShortTrevorIn 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.5000 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_CLONE_NODE_WITH_OFFSET thisSwitchCam.nodes[2].iForceCamPointAtEntityIndex = -1 thisSwitchCam.nodes[2].bIsGameplayCamCopy = FALSE thisSwitchCam.nodes[2].iNodeTime = 600 thisSwitchCam.nodes[2].vNodePos = <<-311.0187, -440.2700, 187.0327>> thisSwitchCam.nodes[2].vWorldPosLookAt = <<0.0000, 0.0000, 0.2000>> thisSwitchCam.nodes[2].fNodeOffsetDist = 0.0000 thisSwitchCam.nodes[2].fNodeVerticleOffset = 0.0000 thisSwitchCam.nodes[2].bAttachToOriginPed = FALSE thisSwitchCam.nodes[2].vNodeDir = <<-2.8659, 0.2449, 118.1404>> thisSwitchCam.nodes[2].bPointAtEntity = FALSE thisSwitchCam.nodes[2].bPointAtOffsetIsRelative = FALSE thisSwitchCam.nodes[2].bAttachOffsetIsRelative = FALSE thisSwitchCam.nodes[2].fNodeFOV = 64.7053 thisSwitchCam.nodes[2].vClonedNodeOffset = <<0.0000, 0.0000, -10.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 = 1.0000 thisSwitchCam.nodes[2].NodeCamShakeType = CAM_SHAKE_DEFAULT thisSwitchCam.nodes[2].fNodeCamShake = 0.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 = TRUE thisSwitchCam.nodes[2].fTimeScale = 0.3000 thisSwitchCam.nodes[2].iTimeScaleEaseType = 0 thisSwitchCam.nodes[2].fTimeScaleEaseScaler = 0.0000 thisSwitchCam.nodes[2].bFlashEnabled = TRUE thisSwitchCam.nodes[2].SCFE_FlashEffectUsed = SCFE_SwitchShortFranklinMid 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.5000 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].bIsCamCutNode = TRUE thisSwitchCam.nodes[4].SwitchCamType = SWITCH_CAM_OLD_SYSTEM thisSwitchCam.nodes[4].iForceCamPointAtEntityIndex = -1 thisSwitchCam.nodes[4].bIsGameplayCamCopy = FALSE thisSwitchCam.nodes[4].iNodeTime = 0 thisSwitchCam.nodes[4].vNodePos = <<0.0646, 1.3472, 1.4595>> thisSwitchCam.nodes[4].vWorldPosLookAt = <<0.0000, 0.0000, 0.4000>> thisSwitchCam.nodes[4].fNodeOffsetDist = 0.0000 thisSwitchCam.nodes[4].fNodeVerticleOffset = 0.0000 thisSwitchCam.nodes[4].bAttachToOriginPed = FALSE thisSwitchCam.nodes[4].vNodeDir = <<0.3564, 0.2439, 1.4688>> thisSwitchCam.nodes[4].bPointAtEntity = TRUE thisSwitchCam.nodes[4].bPointAtOffsetIsRelative = TRUE thisSwitchCam.nodes[4].bAttachOffsetIsRelative = TRUE thisSwitchCam.nodes[4].fNodeFOV = 40.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 = 1.0 thisSwitchCam.nodes[4].NodeCamShakeType = CAM_SHAKE_MEDIUM thisSwitchCam.nodes[4].fNodeCamShake = 0.5000 thisSwitchCam.nodes[4].iCamEaseType = 1 thisSwitchCam.nodes[4].fCamEaseScaler = 1.0000 thisSwitchCam.nodes[4].fCamNodeVelocityScale = 0.0000 thisSwitchCam.nodes[4].bCamEaseForceLinear = TRUE thisSwitchCam.nodes[4].bCamEaseForceLevel = FALSE thisSwitchCam.nodes[4].fTimeScale = 0.3000 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 = FALSE thisSwitchCam.nodes[5].iNodeTime = 600 thisSwitchCam.nodes[5].vNodePos = <<-0.0083, 1.3912, 0.2997>> thisSwitchCam.nodes[5].vWorldPosLookAt = <<0.0000, 0.0000, 0.4000>> thisSwitchCam.nodes[5].fNodeOffsetDist = 0.0000 thisSwitchCam.nodes[5].fNodeVerticleOffset = 0.0000 thisSwitchCam.nodes[5].bAttachToOriginPed = FALSE thisSwitchCam.nodes[5].vNodeDir = <<0.4002, 0.1876, 0.4090>> thisSwitchCam.nodes[5].bPointAtEntity = TRUE thisSwitchCam.nodes[5].bPointAtOffsetIsRelative = TRUE thisSwitchCam.nodes[5].bAttachOffsetIsRelative = TRUE thisSwitchCam.nodes[5].fNodeFOV = 40.0000 thisSwitchCam.nodes[5].vClonedNodeOffset = <<0.0000, 0.0000, 0.0000>> thisSwitchCam.nodes[5].iNodeToClone = 0 thisSwitchCam.nodes[5].NodeTimePostFX_Type = NO_EFFECT thisSwitchCam.nodes[5].fNodeTimePostFXBlendTime = 0.0000 thisSwitchCam.nodes[5].fNodeTimePostFXTimeOffset = 0.0000 thisSwitchCam.nodes[5].fNodeMotionBlur = 1.0 thisSwitchCam.nodes[5].NodeCamShakeType = CAM_SHAKE_MEDIUM thisSwitchCam.nodes[5].fNodeCamShake = 0.5000 thisSwitchCam.nodes[5].iCamEaseType = 0 thisSwitchCam.nodes[5].fCamEaseScaler = 0.0000 thisSwitchCam.nodes[5].fCamNodeVelocityScale = 0.0000 thisSwitchCam.nodes[5].bCamEaseForceLinear = TRUE thisSwitchCam.nodes[5].bCamEaseForceLevel = FALSE thisSwitchCam.nodes[5].fTimeScale = 0.3 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.nodes[6].SwitchCamType = SWITCH_CAM_OLD_SYSTEM thisSwitchCam.nodes[6].iForceCamPointAtEntityIndex = -1 thisSwitchCam.nodes[6].bIsGameplayCamCopy = FALSE thisSwitchCam.nodes[6].iNodeTime = 400 thisSwitchCam.nodes[6].vNodePos = <<-0.0083, 1.3912, 0.2997>> thisSwitchCam.nodes[6].vWorldPosLookAt = <<0.0000, 0.0000, 0.0000>> thisSwitchCam.nodes[6].fNodeOffsetDist = 0.0000 thisSwitchCam.nodes[6].fNodeVerticleOffset = 0.0000 thisSwitchCam.nodes[6].bAttachToOriginPed = FALSE thisSwitchCam.nodes[6].vNodeDir = <<0.4002, 0.1876, 0.4090>> thisSwitchCam.nodes[6].bPointAtEntity = TRUE thisSwitchCam.nodes[6].bPointAtOffsetIsRelative = TRUE thisSwitchCam.nodes[6].bAttachOffsetIsRelative = TRUE thisSwitchCam.nodes[6].fNodeFOV = 40.0000 thisSwitchCam.nodes[6].vClonedNodeOffset = <<0.0000, 0.0000, 0.0000>> thisSwitchCam.nodes[6].iNodeToClone = 0 thisSwitchCam.nodes[6].NodeTimePostFX_Type = NO_EFFECT thisSwitchCam.nodes[6].fNodeTimePostFXBlendTime = 0.0000 thisSwitchCam.nodes[6].fNodeTimePostFXTimeOffset = 0.0000 thisSwitchCam.nodes[6].fNodeMotionBlur = 0.0000 thisSwitchCam.nodes[6].NodeCamShakeType = CAM_SHAKE_MEDIUM thisSwitchCam.nodes[6].fNodeCamShake = 0.5000 thisSwitchCam.nodes[6].iCamEaseType = 0 thisSwitchCam.nodes[6].fCamEaseScaler = 0.0000 thisSwitchCam.nodes[6].fCamNodeVelocityScale = 0.0000 thisSwitchCam.nodes[6].bCamEaseForceLinear = TRUE thisSwitchCam.nodes[6].bCamEaseForceLevel = FALSE thisSwitchCam.nodes[6].fTimeScale = 1.0000 thisSwitchCam.nodes[6].iTimeScaleEaseType = 0 thisSwitchCam.nodes[6].fTimeScaleEaseScaler = 0.0000 thisSwitchCam.nodes[6].bFlashEnabled = FALSE thisSwitchCam.nodes[6].SCFE_FlashEffectUsed = SCFE_CODE_FLASH thisSwitchCam.nodes[6].fMinExposure = 0.0000 thisSwitchCam.nodes[6].fMaxExposure = 0.0000 thisSwitchCam.nodes[6].iRampUpDuration = 0 thisSwitchCam.nodes[6].iRampDownDuration = 0 thisSwitchCam.nodes[6].iHoldDuration = 0 thisSwitchCam.nodes[6].fFlashNodePhaseOffset = 0.0000 thisSwitchCam.nodes[6].bIsLowDetailNode = FALSE thisSwitchCam.nodes[6].bUseCustomDOF = FALSE thisSwitchCam.nodes[6].NodeDOF_Info.fDOF_NearDOF = 0.0000 thisSwitchCam.nodes[6].NodeDOF_Info.fDOF_FarDOF = 0.0000 thisSwitchCam.nodes[6].NodeDOF_Info.fDOF_EffectStrength = 0.0000 thisSwitchCam.iNumNodes = 7 thisSwitchCam.iCamSwitchFocusNode = 3 thisSwitchCam.fSwitchSoundAudioStartPhase = 0.06 thisSwitchCam.fSwitchSoundAudioEndPhase = 0.38 thisSwitchCam.bSwitchSoundPlayOpeningPulse = FALSE thisSwitchCam.bSwitchSoundPlayMoveLoop = FALSE thisSwitchCam.bSwitchSoundPlayExitPulse = FALSE thisSwitchCam.bSplineNoSmoothing = FALSE thisSwitchCam.bAddGameplayCamAsLastNode = FALSE thisSwitchCam.iGameplayNodeBlendDuration = 0 //--- End of Cam Data --- thisSwitchCam.strOutputStructName = "thisSwitchCam" thisSwitchCam.strOutputFileName = "CameraInfo_FIB2_HeliTrevorToFranklin.txt" thisSwitchCam.strXMLFileName = "CameraInfo_FIB2_HeliTrevorToFranklin.xml" thisSwitchCam.bInitialized = TRUE //ENDIF thisSwitchCam.viVehicles[0] = viHeli thisSwitchCam.piPeds[1] = piFranklin ENDPROC PROC SETUP_SPLINE_CAM_NODE_ARRAY_HELI_TREVOR_TO_FRANKLIN_FIRST_PERSON(SWITCH_CAM_STRUCT &thisSwitchCam, PED_INDEX piTrevor, PED_INDEX piFranklin) CDEBUG3LN(DEBUG_MISSION, "SETUP_SPLINE_CAM_NODE_ARRAY_HELI_MICHAEL_TO_FRANKLIN") //IF NOT thisSwitchCam.bInitialized //--- Start of Cam Data --- thisSwitchCam.nodes[0].SwitchCamType = SWITCH_CAM_OLD_SYSTEM thisSwitchCam.nodes[0].iForceCamPointAtEntityIndex = -1 thisSwitchCam.nodes[0].bIsGameplayCamCopy = FALSE thisSwitchCam.nodes[0].iNodeTime = 0 thisSwitchCam.nodes[0].vNodePos = <<-1.6125, 2.0081, 0.6774>> thisSwitchCam.nodes[0].vWorldPosLookAt = <<0.0000, 0.0000, 0.0000>> thisSwitchCam.nodes[0].fNodeOffsetDist = 0.0000 thisSwitchCam.nodes[0].fNodeVerticleOffset = 0.0000 thisSwitchCam.nodes[0].bAttachToOriginPed = FALSE thisSwitchCam.nodes[0].vNodeDir = <<-0.5, 0.9, 0.3>> thisSwitchCam.nodes[0].bPointAtEntity = TRUE thisSwitchCam.nodes[0].bPointAtOffsetIsRelative = TRUE thisSwitchCam.nodes[0].bAttachOffsetIsRelative = TRUE thisSwitchCam.nodes[0].fNodeFOV = 40.0000 thisSwitchCam.nodes[0].vClonedNodeOffset = <<0.0000, 0.0000, 0.0000>> thisSwitchCam.nodes[0].iNodeToClone = 0 thisSwitchCam.nodes[0].NodeTimePostFX_Type = NO_EFFECT thisSwitchCam.nodes[0].fNodeTimePostFXBlendTime = 0.0000 thisSwitchCam.nodes[0].fNodeTimePostFXTimeOffset = 0.0000 thisSwitchCam.nodes[0].fNodeMotionBlur = 0.0000 thisSwitchCam.nodes[0].NodeCamShakeType = CAM_SHAKE_DEFAULT thisSwitchCam.nodes[0].fNodeCamShake = 0.5000 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 = 0.0000 thisSwitchCam.nodes[0].iTimeScaleEaseType = 0 thisSwitchCam.nodes[0].fTimeScaleEaseScaler = 0.0000 thisSwitchCam.nodes[0].bFlashEnabled = TRUE thisSwitchCam.nodes[0].SCFE_FlashEffectUsed = SCFE_SwitchShortTrevorIn 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 = 400 thisSwitchCam.nodes[1].vNodePos = <<-1.6125, 2.0081, 0.4774>> 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.5, 0.9, 0.1>> thisSwitchCam.nodes[1].bPointAtEntity = TRUE thisSwitchCam.nodes[1].bPointAtOffsetIsRelative = TRUE thisSwitchCam.nodes[1].bAttachOffsetIsRelative = TRUE thisSwitchCam.nodes[1].fNodeFOV = 40.0000 thisSwitchCam.nodes[1].vClonedNodeOffset = <<0.0000, 0.0000, 0.0000>> thisSwitchCam.nodes[1].iNodeToClone = 0 thisSwitchCam.nodes[1].NodeTimePostFX_Type = NO_EFFECT thisSwitchCam.nodes[1].fNodeTimePostFXBlendTime = 0.0000 thisSwitchCam.nodes[1].fNodeTimePostFXTimeOffset = 0.0000 thisSwitchCam.nodes[1].fNodeMotionBlur = 0.0000 thisSwitchCam.nodes[1].NodeCamShakeType = CAM_SHAKE_MEDIUM thisSwitchCam.nodes[1].fNodeCamShake = 0.5000 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.3000 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 = 600 thisSwitchCam.nodes[2].vNodePos = <<-1.6125, 2.0081, -1.4774>> 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.5, 0.9, -1.7>> thisSwitchCam.nodes[2].bPointAtEntity = TRUE thisSwitchCam.nodes[2].bPointAtOffsetIsRelative = TRUE thisSwitchCam.nodes[2].bAttachOffsetIsRelative = TRUE thisSwitchCam.nodes[2].fNodeFOV = 40.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 = 1.0000 thisSwitchCam.nodes[2].NodeCamShakeType = CAM_SHAKE_MEDIUM thisSwitchCam.nodes[2].fNodeCamShake = 0.5000 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 = 0.6000 thisSwitchCam.nodes[2].iTimeScaleEaseType = 0 thisSwitchCam.nodes[2].fTimeScaleEaseScaler = 0.0000 thisSwitchCam.nodes[2].bFlashEnabled = TRUE thisSwitchCam.nodes[2].SCFE_FlashEffectUsed = SCFE_SwitchShortFranklinMid 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.8000 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].bIsCamCutNode = TRUE thisSwitchCam.nodes[4].SwitchCamType = SWITCH_CAM_OLD_SYSTEM thisSwitchCam.nodes[4].iForceCamPointAtEntityIndex = -1 thisSwitchCam.nodes[4].bIsGameplayCamCopy = FALSE thisSwitchCam.nodes[4].iNodeTime = 0 thisSwitchCam.nodes[4].vNodePos = <<0.0646, 1.3472, 1.4595>> thisSwitchCam.nodes[4].vWorldPosLookAt = <<0.0000, 0.0000, 1.4500>> thisSwitchCam.nodes[4].fNodeOffsetDist = 0.0000 thisSwitchCam.nodes[4].fNodeVerticleOffset = 0.0000 thisSwitchCam.nodes[4].bAttachToOriginPed = FALSE thisSwitchCam.nodes[4].vNodeDir = <<0.3564, 0.2439, 1.4688>> thisSwitchCam.nodes[4].bPointAtEntity = TRUE thisSwitchCam.nodes[4].bPointAtOffsetIsRelative = TRUE thisSwitchCam.nodes[4].bAttachOffsetIsRelative = TRUE thisSwitchCam.nodes[4].fNodeFOV = 40.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 = 1.0000 thisSwitchCam.nodes[4].NodeCamShakeType = CAM_SHAKE_MEDIUM thisSwitchCam.nodes[4].fNodeCamShake = 0.5000 thisSwitchCam.nodes[4].iCamEaseType = 1 thisSwitchCam.nodes[4].fCamEaseScaler = 1.0000 thisSwitchCam.nodes[4].fCamNodeVelocityScale = 0.0000 thisSwitchCam.nodes[4].bCamEaseForceLinear = TRUE thisSwitchCam.nodes[4].bCamEaseForceLevel = FALSE thisSwitchCam.nodes[4].fTimeScale = 0.3000 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 = FALSE thisSwitchCam.nodes[5].iNodeTime = 600 thisSwitchCam.nodes[5].vNodePos = <<-0.0083, 1.3912, 0.2997>> thisSwitchCam.nodes[5].vWorldPosLookAt = <<0.0000, 0.0000, 0.4000>> thisSwitchCam.nodes[5].fNodeOffsetDist = 0.0000 thisSwitchCam.nodes[5].fNodeVerticleOffset = 0.0000 thisSwitchCam.nodes[5].bAttachToOriginPed = FALSE thisSwitchCam.nodes[5].vNodeDir = <<0.4002, 0.1876, 0.4090>> thisSwitchCam.nodes[5].bPointAtEntity = TRUE thisSwitchCam.nodes[5].bPointAtOffsetIsRelative = TRUE thisSwitchCam.nodes[5].bAttachOffsetIsRelative = TRUE thisSwitchCam.nodes[5].fNodeFOV = 40.0000 thisSwitchCam.nodes[5].vClonedNodeOffset = <<0.0000, 0.0000, 0.0000>> thisSwitchCam.nodes[5].iNodeToClone = 0 thisSwitchCam.nodes[5].NodeTimePostFX_Type = NO_EFFECT thisSwitchCam.nodes[5].fNodeTimePostFXBlendTime = 0.0000 thisSwitchCam.nodes[5].fNodeTimePostFXTimeOffset = 0.0000 thisSwitchCam.nodes[5].fNodeMotionBlur = 1.0000 thisSwitchCam.nodes[5].NodeCamShakeType = CAM_SHAKE_MEDIUM thisSwitchCam.nodes[5].fNodeCamShake = 0.5000 thisSwitchCam.nodes[5].iCamEaseType = 0 thisSwitchCam.nodes[5].fCamEaseScaler = 0.0000 thisSwitchCam.nodes[5].fCamNodeVelocityScale = 0.0000 thisSwitchCam.nodes[5].bCamEaseForceLinear = TRUE thisSwitchCam.nodes[5].bCamEaseForceLevel = FALSE thisSwitchCam.nodes[5].fTimeScale = 0.3000 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.nodes[6].SwitchCamType = SWITCH_CAM_OLD_SYSTEM thisSwitchCam.nodes[6].iForceCamPointAtEntityIndex = -1 thisSwitchCam.nodes[6].bIsGameplayCamCopy = FALSE thisSwitchCam.nodes[6].iNodeTime = 400 thisSwitchCam.nodes[6].vNodePos = <<-0.0083, 1.3912, 0.2997>> thisSwitchCam.nodes[6].vWorldPosLookAt = <<0.0000, 0.0000, 0.4000>> thisSwitchCam.nodes[6].fNodeOffsetDist = 0.0000 thisSwitchCam.nodes[6].fNodeVerticleOffset = 0.0000 thisSwitchCam.nodes[6].bAttachToOriginPed = FALSE thisSwitchCam.nodes[6].vNodeDir = <<0.4002, 0.1876, 0.4090>> thisSwitchCam.nodes[6].bPointAtEntity = TRUE thisSwitchCam.nodes[6].bPointAtOffsetIsRelative = TRUE thisSwitchCam.nodes[6].bAttachOffsetIsRelative = TRUE thisSwitchCam.nodes[6].fNodeFOV = 40.0000 thisSwitchCam.nodes[6].vClonedNodeOffset = <<0.0000, 0.0000, 0.0000>> thisSwitchCam.nodes[6].iNodeToClone = 0 thisSwitchCam.nodes[6].NodeTimePostFX_Type = NO_EFFECT thisSwitchCam.nodes[6].fNodeTimePostFXBlendTime = 0.0000 thisSwitchCam.nodes[6].fNodeTimePostFXTimeOffset = 0.0000 thisSwitchCam.nodes[6].fNodeMotionBlur = 0.0000 thisSwitchCam.nodes[6].NodeCamShakeType = CAM_SHAKE_MEDIUM thisSwitchCam.nodes[6].fNodeCamShake = 0.5000 thisSwitchCam.nodes[6].iCamEaseType = 0 thisSwitchCam.nodes[6].fCamEaseScaler = 0.0000 thisSwitchCam.nodes[6].fCamNodeVelocityScale = 0.0000 thisSwitchCam.nodes[6].bCamEaseForceLinear = TRUE thisSwitchCam.nodes[6].bCamEaseForceLevel = FALSE thisSwitchCam.nodes[6].fTimeScale = 1.0000 thisSwitchCam.nodes[6].iTimeScaleEaseType = 0 thisSwitchCam.nodes[6].fTimeScaleEaseScaler = 0.0000 thisSwitchCam.nodes[6].bFlashEnabled = FALSE thisSwitchCam.nodes[6].SCFE_FlashEffectUsed = SCFE_CODE_FLASH thisSwitchCam.nodes[6].fMinExposure = 0.0000 thisSwitchCam.nodes[6].fMaxExposure = 0.0000 thisSwitchCam.nodes[6].iRampUpDuration = 0 thisSwitchCam.nodes[6].iRampDownDuration = 0 thisSwitchCam.nodes[6].iHoldDuration = 0 thisSwitchCam.nodes[6].fFlashNodePhaseOffset = 0.0000 thisSwitchCam.nodes[6].bIsLowDetailNode = FALSE thisSwitchCam.nodes[6].bUseCustomDOF = FALSE thisSwitchCam.nodes[6].NodeDOF_Info.fDOF_NearDOF = 0.0000 thisSwitchCam.nodes[6].NodeDOF_Info.fDOF_FarDOF = 0.0000 thisSwitchCam.nodes[6].NodeDOF_Info.fDOF_EffectStrength = 0.0000 thisSwitchCam.iNumNodes = 7 thisSwitchCam.iCamSwitchFocusNode = 3 thisSwitchCam.fSwitchSoundAudioStartPhase = 0.08 thisSwitchCam.fSwitchSoundAudioEndPhase = 0.45 thisSwitchCam.bSwitchSoundPlayOpeningPulse = FALSE thisSwitchCam.bSwitchSoundPlayMoveLoop = FALSE thisSwitchCam.bSwitchSoundPlayExitPulse = FALSE thisSwitchCam.bSplineNoSmoothing = FALSE thisSwitchCam.bAddGameplayCamAsLastNode = FALSE thisSwitchCam.iGameplayNodeBlendDuration = 0 //--- End of Cam Data --- thisSwitchCam.strOutputStructName = "thisSwitchCam" thisSwitchCam.strOutputFileName = "CameraInfo_FIB2_HeliMichaelToFranklin.txt" thisSwitchCam.strXMLFileName = "CameraInfo_FIB2_HeliMichaelToFranklin.xml" thisSwitchCam.bInitialized = TRUE //ENDIF thisSwitchCam.piPeds[0] = piTrevor thisSwitchCam.piPeds[1] = piFranklin ENDPROC /// PURPOSE: /// Handle the playback of the switch cam. The will setup, play, shut down and cleanup the switch cam spline /// PARAMS: /// thisSwitchCam - Switch camera to playback /// bReturnTrueOnce - If you only want this function to return TRUE once upon completion. Set to FALSE to have this function to return true every time this is called once the camera is finished playback. /// RETURNS: /// TRUE when camera is complete, FALSE if playback is still active, or if the camera has completed playback and bReturnTrueOnce is set to TRUE. FUNC BOOL HANDLE_SWITCH_CAM_HELI_TO_FRANKLIN(SWITCH_CAM_STRUCT &thisSwitchCam, BOOL bReturnTrueOnce = TRUE) IS_PED_INJURED(GET_FRANKLIN_PED()) IS_PED_INJURED(GET_MICHAEL_PED()) IS_PED_INJURED(GET_TREVOR_PED()) IS_VEHICLE_DRIVEABLE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) INT iCurrentNode SWITCH eSwitchCamState CASE SWITCH_CAM_IDLE CDEBUG3LN(DEBUG_MISSION, "eSwitchCamState = SWITCH_CAM_IDLE") RETURN FALSE BREAK CASE SWITCH_CAM_SETUP_SPLINE CDEBUG3LN(DEBUG_MISSION, "eSwitchCamState = SWITCH_CAM_SETUP_SPLINE") IF DOES_SWITCH_CAM_EXIST(thisSwitchCam) DESTROY_SWITCH_CAM(thisSwitchCam) ENDIF CREATE_SPLINE_CAM(thisSwitchCam) IF bSwitchToFirstPerson INT i REPEAT COUNT_OF(thisSwitchCam.nodes) i IF DOES_CAM_EXIST(thisSwitchCam.nodes[i].ciSwitchNode) IF i < 3 SET_CAM_INHERIT_ROLL_VEHICLE(thisSwitchCam.nodes[i].ciSwitchNode, snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) ENDIF ENDIF ENDREPEAT ENDIF SET_CAM_ACTIVE(thisSwitchCam.ciSpline, TRUE) RENDER_SCRIPT_CAMS(TRUE, FALSE) DISPLAY_RADAR(FALSE) DISPLAY_HUD(FALSE) SETTIMERB(0) SET_PLAYER_CONTROL(PLAYER_ID(), FALSE) bPlayerControlGiven = FALSE NEW_LOAD_SCENE_START_SPHERE((<<-144.6, -593.7, 211.8>>), 20.0, NEWLOADSCENE_FLAG_REQUIRE_COLLISION) CLEAR_PED_TASKS_IMMEDIATELY(GET_FRANKLIN_PED()) //[MF] Set Franklin's target for during the switch IF IS_VEHICLE_DRIVEABLE(enemyChopperVehicle[2]) eiHeliToFranklin_FranklinTarget = enemyChopperVehicle[2] ELIF IS_VEHICLE_DRIVEABLE(enemyChopperVehicle[iLeadHeli]) eiHeliToFranklin_FranklinTarget = enemyChopperVehicle[iLeadHeli] ELSE eiHeliToFranklin_FranklinTarget = snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER] ENDIF TASK_AIM_GUN_AT_ENTITY(GET_FRANKLIN_PED(), eiHeliToFranklin_FranklinTarget, 8000, TRUE) IF eCurrentBranchedSwitchState = BRANCHED_SWITCH_TREVOR_TO_FRANKLIN_ACTIVE fHeliToFranklin_FranklinStartAITaskPhase = fTrevToFranklin_FranklinStartAITaskPhase ELIF eCurrentBranchedSwitchState = BRANCHED_SWITCH_MICHAEL_TO_FRANKLIN_ACTIVE fHeliToFranklin_FranklinStartAITaskPhase = fMikeToFranklin_FranklinStartAITaskPhase ENDIF CLEAR_AREA(GET_ENTITY_COORDS(GET_FRANKLIN_PED()), 10.0, TRUE, TRUE, TRUE) CLEAR_PED_TASKS(GET_FRANKLIN_PED()) IF eCurrentBranchedSwitchState = BRANCHED_SWITCH_TREVOR_TO_FRANKLIN_ACTIVE iNextTrevorAITime = GET_GAME_TIMER() + 2000 //[MF] Delay helicopter course corrections for a bit while we transition the cam off of Trevor PRINTLN("Updating iNextTrevorAITime To: ", iNextTrevorAITime) ENDIF eSwitchCamState = SWITCH_CAM_PLAYING_SPLINE RETURN TRUE BREAK CASE SWITCH_CAM_PLAYING_SPLINE CDEBUG3LN(DEBUG_MISSION, "eSwitchCamState = SWITCH_CAM_PLAYING_SPLINE") CDEBUG3LN(DEBUG_MISSION, GET_CAM_SPLINE_PHASE(thisSwitchCam.ciSpline)) IF IS_CAM_ACTIVE(thisSwitchCam.ciSpline) IF NOT bDoneHitSound IF GET_GAME_TIMER() >= (iSnatchAndGrabCutsceneTime + 20) PLAY_SOUND_FRONTEND(-1, "Hit_Out", "PLAYER_SWITCH_CUSTOM_SOUNDSET") iHitTime = GET_GAME_TIMER() bDoneHitSound = TRUE ENDIF ENDIF IF NOT bWooshStarted IF bDoneHitSound IF GET_GAME_TIMER() >= iHitTime + 250 PLAY_SOUND_FRONTEND(-1, "Short_Transition_In", "PLAYER_SWITCH_CUSTOM_SOUNDSET") bWooshStarted = TRUE ENDIF ENDIF ENDIF iCurrentNode = UPDATE_SPLINE_CAM(thisSwitchCam) IF iCurrentNode >= thisSwitchCam.iCamSwitchFocusNode - iHeliToFranklin_SwitchPedIndexOffset IF NOT sCamDetails.bOKToSwitchPed sCamDetails.bOKToSwitchPed = TRUE CLEAR_AREA(GET_ENTITY_COORDS(GET_FRANKLIN_PED()), 10.0, TRUE, TRUE, TRUE) ENDIF ELSE PRINTLN("Updating cam to match gameplay cam...") SET_CAM_COORD(thisSwitchCam.nodes[2].ciSwitchNode, (GET_GAMEPLAY_CAM_COORD() + GET_VECTOR_FROM_DIRECTION_AND_MAGNITUDE(CONVERT_EULER_TO_UPWARD_VECTOR(GET_GAMEPLAY_CAM_ROT()), thisSwitchCam.nodes[2].vClonedNodeOffset.z))) SET_CAM_ROT(thisSwitchCam.nodes[2].ciSwitchNode, GET_GAMEPLAY_CAM_ROT()) ENDIF IF GET_CAM_SPLINE_PHASE(thisSwitchCam.ciSpline) > fHeliToFranklin_FranklinStartAITaskPhase IF NOT IS_SCRIPT_TASK_RUNNING_OR_STARTING(GET_FRANKLIN_PED(), SCRIPT_TASK_PLAY_ANIM) CLEAR_PED_TASKS_IMMEDIATELY(GET_FRANKLIN_PED()) TASK_PLAY_ANIM(GET_FRANKLIN_PED(), GET_SNATCH_AND_GRAB_ANIM_DICT_AS_STRING(SAG_ANIM_DICT_SNIPER), "ig_7_m_door_f_sniping_franklin", INSTANT_BLEND_IN, INSTANT_BLEND_OUT, DEFAULT, AF_HOLD_LAST_FRAME, 0.55) FORCE_PED_AI_AND_ANIMATION_UPDATE(GET_FRANKLIN_PED(), TRUE) WAIT_WITH_RECORD() //[MF] Fix an issue where the Force Ped AI and Animation Update was getting called twice consecutively. ENDIF ENDIF //[MF] Once cam is at the end, reset the gameplay cam positon and advance to next state. IF GET_CAM_SPLINE_PHASE(thisSwitchCam.ciSpline) >= 1.00 CDEBUG3LN(DEBUG_MISSION, "eSwitchCamState = SWITCH_CAM_RETURN_TO_GAMEPLAY") IF NOT IS_PED_INJURED(GET_FRANKLIN_PED()) CLEAR_PED_TASKS_IMMEDIATELY(GET_FRANKLIN_PED()) SET_PED_RESET_FLAG(GET_FRANKLIN_PED(), PRF_InstantBlendToAim, TRUE) SET_PLAYER_FORCE_SKIP_AIM_INTRO(PLAYER_ID(), TRUE) SET_PLAYER_FORCED_AIM(PLAYER_ID(), TRUE) ENDIF eSwitchCamState = SWITCH_CAM_RETURN_TO_GAMEPLAY ENDIF ELSE SCRIPT_ASSERT("Cam Prematurely Deleted! WTF?") RENDER_SCRIPT_CAMS(FALSE, FALSE) CLEAR_PED_TASKS_IMMEDIATELY(GET_FRANKLIN_PED()) SET_PLAYER_FORCED_AIM(PLAYER_ID(), TRUE) eSwitchCamState = SWITCH_CAM_SETUP_SPLINE ENDIF RETURN TRUE BREAK CASE 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) ENDIF IF DOES_SWITCH_CAM_EXIST(thisSwitchCam) DESTROY_SWITCH_CAM(thisSwitchCam) ENDIF IF NOT bPlayerControlGiven SET_PLAYER_CONTROL(PLAYER_ID(), TRUE) DISPLAY_RADAR(TRUE) DISPLAY_HUD(TRUE) bPlayerControlGiven = TRUE ENDIF SETTIMERA(0) eSwitchCamState = SWITCH_CAM_IDLE thisSwitchCam.bIsSplineCamFinishedPlaying = TRUE SET_PLAYER_CONTROL(PLAYER_ID(), true) CLEAR_PED_TASKS(GET_MICHAEL_PED()) sCamDetails.bSplineCreated = FALSE sCamDetails.bOKToSwitchPed = FALSE eCurrentBranchedSwitchState = BRANCHED_SWITCH_INACTIVE NEW_LOAD_SCENE_STOP() RETURN FALSE BREAK ENDSWITCH IF bReturnTrueOnce RETURN FALSE ELSE RETURN thisSwitchCam.bIsSplineCamFinishedPlaying ENDIF ENDFUNC PROC SETUP_SPLINE_CAM_NODE_ARRAY_FRANKLIN_TO_TREVOR(SWITCH_CAM_STRUCT &thisSwitchCam, PED_INDEX piFranklin, VEHICLE_INDEX viHeli) CDEBUG3LN(DEBUG_MISSION, "SETUP_SPLINE_CAM_NODE_ARRAY_FRANKLIN_TO_TREVOR") //IF NOT thisSwitchCam.bInitialized //--- Start of Cam Data --- thisSwitchCam.nodes[0].SwitchCamType = SWITCH_CAM_OLD_SYSTEM thisSwitchCam.nodes[0].iForceCamPointAtEntityIndex = -1 thisSwitchCam.nodes[0].bIsGameplayCamCopy = FALSE thisSwitchCam.nodes[0].iNodeTime = 0 thisSwitchCam.nodes[0].vNodePos = <<-0.0083, 1.3912, 0.2997>> thisSwitchCam.nodes[0].vWorldPosLookAt = <<0.0000, 0.0000, 0.0000>> thisSwitchCam.nodes[0].fNodeOffsetDist = 0.0000 thisSwitchCam.nodes[0].fNodeVerticleOffset = 0.0000 thisSwitchCam.nodes[0].bAttachToOriginPed = FALSE thisSwitchCam.nodes[0].vNodeDir = <<0.4002, 0.1876, 0.4090>> thisSwitchCam.nodes[0].bPointAtEntity = TRUE thisSwitchCam.nodes[0].bPointAtOffsetIsRelative = TRUE thisSwitchCam.nodes[0].bAttachOffsetIsRelative = TRUE thisSwitchCam.nodes[0].fNodeFOV = 40.0000 thisSwitchCam.nodes[0].vClonedNodeOffset = <<0.0000, 0.0000, 0.0000>> thisSwitchCam.nodes[0].iNodeToClone = 0 thisSwitchCam.nodes[0].NodeTimePostFX_Type = NO_EFFECT thisSwitchCam.nodes[0].fNodeTimePostFXBlendTime = 0.0000 thisSwitchCam.nodes[0].fNodeTimePostFXTimeOffset = 0.0000 thisSwitchCam.nodes[0].fNodeMotionBlur = 0.0000 thisSwitchCam.nodes[0].NodeCamShakeType = CAM_SHAKE_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 = 0.0100 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 = 10 thisSwitchCam.nodes[1].vNodePos = <<-0.0083, 1.3912, 0.2997>> thisSwitchCam.nodes[1].vWorldPosLookAt = <<0.0000, 0.0000, 0.2000>> thisSwitchCam.nodes[1].fNodeOffsetDist = 0.0000 thisSwitchCam.nodes[1].fNodeVerticleOffset = 0.0000 thisSwitchCam.nodes[1].bAttachToOriginPed = FALSE thisSwitchCam.nodes[1].vNodeDir = <<0.4002, 0.1876, 0.4090>> thisSwitchCam.nodes[1].bPointAtEntity = TRUE thisSwitchCam.nodes[1].bPointAtOffsetIsRelative = TRUE thisSwitchCam.nodes[1].bAttachOffsetIsRelative = TRUE thisSwitchCam.nodes[1].fNodeFOV = 40.0000 thisSwitchCam.nodes[1].vClonedNodeOffset = <<0.0000, 0.0000, 0.0000>> thisSwitchCam.nodes[1].iNodeToClone = 0 thisSwitchCam.nodes[1].NodeTimePostFX_Type = NO_EFFECT thisSwitchCam.nodes[1].fNodeTimePostFXBlendTime = 0.0000 thisSwitchCam.nodes[1].fNodeTimePostFXTimeOffset = 0.0000 thisSwitchCam.nodes[1].fNodeMotionBlur = 0.0000 thisSwitchCam.nodes[1].NodeCamShakeType = CAM_SHAKE_DEFAULT thisSwitchCam.nodes[1].fNodeCamShake = 0.0000 thisSwitchCam.nodes[1].iCamEaseType = 2 thisSwitchCam.nodes[1].fCamEaseScaler = 1.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 = TRUE thisSwitchCam.nodes[1].SCFE_FlashEffectUsed = SCFE_SwitchShortFranklinIn 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.1000 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 = 600 thisSwitchCam.nodes[2].vNodePos = <<0.0646, 1.3472, 1.4595>> 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.3564, 0.2439, 1.4688>> thisSwitchCam.nodes[2].bPointAtEntity = TRUE thisSwitchCam.nodes[2].bPointAtOffsetIsRelative = TRUE thisSwitchCam.nodes[2].bAttachOffsetIsRelative = TRUE thisSwitchCam.nodes[2].fNodeFOV = 40.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 = 1.0000 thisSwitchCam.nodes[2].NodeCamShakeType = CAM_SHAKE_DEFAULT thisSwitchCam.nodes[2].fNodeCamShake = 0.0000 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.0000 thisSwitchCam.nodes[2].iTimeScaleEaseType = 0 thisSwitchCam.nodes[2].fTimeScaleEaseScaler = 0.0000 thisSwitchCam.nodes[2].bFlashEnabled = TRUE thisSwitchCam.nodes[2].SCFE_FlashEffectUsed = SCFE_SwitchShortTrevorMid 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.65 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_CLONE_NODE_WITH_OFFSET thisSwitchCam.nodes[3].iForceCamPointAtEntityIndex = -1 thisSwitchCam.nodes[3].bIsGameplayCamCopy = FALSE thisSwitchCam.nodes[3].iNodeTime = 0 thisSwitchCam.nodes[3].vNodePos = <<-139.4391, -594.4296, 191.3729>> 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.9798, -0.0338, -72.2534>> thisSwitchCam.nodes[3].bPointAtEntity = FALSE thisSwitchCam.nodes[3].bPointAtOffsetIsRelative = FALSE thisSwitchCam.nodes[3].bAttachOffsetIsRelative = FALSE thisSwitchCam.nodes[3].fNodeFOV = 69.7000 thisSwitchCam.nodes[3].vClonedNodeOffset = <<0.0000, 0.0000, -21.0000>> thisSwitchCam.nodes[3].iNodeToClone = 5 thisSwitchCam.nodes[3].NodeTimePostFX_Type = NO_EFFECT thisSwitchCam.nodes[3].fNodeTimePostFXBlendTime = 0.0000 thisSwitchCam.nodes[3].fNodeTimePostFXTimeOffset = 0.0000 thisSwitchCam.nodes[3].fNodeMotionBlur = 1.0000 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 = TRUE thisSwitchCam.nodes[3].fTimeScale = 0.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_CLONE_NODE_WITH_OFFSET thisSwitchCam.nodes[4].iForceCamPointAtEntityIndex = -1 thisSwitchCam.nodes[4].bIsGameplayCamCopy = FALSE thisSwitchCam.nodes[4].iNodeTime = 0 thisSwitchCam.nodes[4].vNodePos = <<-139.4391, -594.4296, 191.3729>> 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.9798, -0.0338, -72.2534>> thisSwitchCam.nodes[4].bPointAtEntity = FALSE thisSwitchCam.nodes[4].bPointAtOffsetIsRelative = FALSE thisSwitchCam.nodes[4].bAttachOffsetIsRelative = FALSE thisSwitchCam.nodes[4].fNodeFOV = 69.7000 thisSwitchCam.nodes[4].vClonedNodeOffset = <<0.0000, 0.0000, -21.0000>> thisSwitchCam.nodes[4].iNodeToClone = 5 thisSwitchCam.nodes[4].NodeTimePostFX_Type = NO_EFFECT thisSwitchCam.nodes[4].fNodeTimePostFXBlendTime = 0.0000 thisSwitchCam.nodes[4].fNodeTimePostFXTimeOffset = 0.0000 thisSwitchCam.nodes[4].fNodeMotionBlur = 1.0000 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 = TRUE thisSwitchCam.nodes[4].fTimeScale = 0.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 = 600 thisSwitchCam.nodes[5].vNodePos = <<323.9280, 430.4764, 24.9056>> 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 = <<-2.3168, -0.0333, 39.2271>> thisSwitchCam.nodes[5].bPointAtEntity = FALSE thisSwitchCam.nodes[5].bPointAtOffsetIsRelative = FALSE thisSwitchCam.nodes[5].bAttachOffsetIsRelative = FALSE thisSwitchCam.nodes[5].fNodeFOV = 69.7000 thisSwitchCam.nodes[5].vClonedNodeOffset = <<0.0000, 0.0000, 0.0000>> thisSwitchCam.nodes[5].iNodeToClone = 0 thisSwitchCam.nodes[5].NodeTimePostFX_Type = NO_EFFECT thisSwitchCam.nodes[5].fNodeTimePostFXBlendTime = 0.0000 thisSwitchCam.nodes[5].fNodeTimePostFXTimeOffset = 0.0000 thisSwitchCam.nodes[5].fNodeMotionBlur = 1.0000 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 = 0.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.camBlurOverrides[0].fBlurOverrideStartPoint = 2.9580 thisSwitchCam.camBlurOverrides[0].fBlurOverrideBlurLevel = 1.0000 thisSwitchCam.camBlurOverrides[1].fBlurOverrideStartPoint = 5.7060 thisSwitchCam.camBlurOverrides[1].fBlurOverrideBlurLevel = 0.6500 thisSwitchCam.iNumNodes = 6 thisSwitchCam.iCamSwitchFocusNode = 3 thisSwitchCam.fSwitchSoundAudioStartPhase = 0.01 thisSwitchCam.fSwitchSoundAudioEndPhase = 0.55 thisSwitchCam.bSwitchSoundPlayOpeningPulse = FALSE thisSwitchCam.bSwitchSoundPlayMoveLoop = FALSE thisSwitchCam.bSwitchSoundPlayExitPulse = FALSE thisSwitchCam.bSplineNoSmoothing = FALSE thisSwitchCam.bAddGameplayCamAsLastNode = TRUE thisSwitchCam.iGameplayNodeBlendDuration = 1 //--- End of Cam Data --- thisSwitchCam.strOutputStructName = "thisSwitchCam" thisSwitchCam.strOutputFileName = "CameraInfo_FIB2_FranklinToTrevor.txt" thisSwitchCam.strXMLFileName = "CameraInfo_FIB2_FranklinToTrevor.xml" thisSwitchCam.bInitialized = TRUE //ENDIF thisSwitchCam.piPeds[0] = piFranklin thisSwitchCam.viVehicles[1] = viHeli ENDPROC PROC SETUP_SPLINE_CAM_NODE_ARRAY_FRANKLIN_TO_TREVOR_FIRST_PERSON(SWITCH_CAM_STRUCT &thisSwitchCam, PED_INDEX piFranklin, PED_INDEX piTrevor) CDEBUG3LN(DEBUG_MISSION, "SETUP_SPLINE_CAM_NODE_ARRAY_FRANKLIN_TO_TREVOR") //IF NOT thisSwitchCam.bInitialized //--- Start of Cam Data --- thisSwitchCam.nodes[0].SwitchCamType = SWITCH_CAM_OLD_SYSTEM thisSwitchCam.nodes[0].iForceCamPointAtEntityIndex = -1 thisSwitchCam.nodes[0].bIsGameplayCamCopy = FALSE thisSwitchCam.nodes[0].iNodeTime = 0 thisSwitchCam.nodes[0].vNodePos = <<-0.0083, 1.3912, 0.2997>> thisSwitchCam.nodes[0].vWorldPosLookAt = <<0.0000, 0.0000, 0.0000>> thisSwitchCam.nodes[0].fNodeOffsetDist = 0.0000 thisSwitchCam.nodes[0].fNodeVerticleOffset = 0.0000 thisSwitchCam.nodes[0].bAttachToOriginPed = FALSE thisSwitchCam.nodes[0].vNodeDir = <<0.4002, 0.1876, 0.4090>> thisSwitchCam.nodes[0].bPointAtEntity = TRUE thisSwitchCam.nodes[0].bPointAtOffsetIsRelative = TRUE thisSwitchCam.nodes[0].bAttachOffsetIsRelative = TRUE thisSwitchCam.nodes[0].fNodeFOV = 40.0000 thisSwitchCam.nodes[0].vClonedNodeOffset = <<0.0000, 0.0000, 0.0000>> thisSwitchCam.nodes[0].iNodeToClone = 0 thisSwitchCam.nodes[0].NodeTimePostFX_Type = NO_EFFECT thisSwitchCam.nodes[0].fNodeTimePostFXBlendTime = 0.0000 thisSwitchCam.nodes[0].fNodeTimePostFXTimeOffset = 0.0000 thisSwitchCam.nodes[0].fNodeMotionBlur = 0.0000 thisSwitchCam.nodes[0].NodeCamShakeType = CAM_SHAKE_MEDIUM thisSwitchCam.nodes[0].fNodeCamShake = 0.3000 thisSwitchCam.nodes[0].iCamEaseType = 0 thisSwitchCam.nodes[0].fCamEaseScaler = 0.0000 thisSwitchCam.nodes[0].fCamNodeVelocityScale = 0.0000 thisSwitchCam.nodes[0].bCamEaseForceLinear = TRUE thisSwitchCam.nodes[0].bCamEaseForceLevel = FALSE thisSwitchCam.nodes[0].fTimeScale = 0.0100 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 = 10 thisSwitchCam.nodes[1].vNodePos = <<-0.0083, 1.3912, 0.2997>> thisSwitchCam.nodes[1].vWorldPosLookAt = <<0.0000, 0.0000, 0.2000>> thisSwitchCam.nodes[1].fNodeOffsetDist = 0.0000 thisSwitchCam.nodes[1].fNodeVerticleOffset = 0.0000 thisSwitchCam.nodes[1].bAttachToOriginPed = FALSE thisSwitchCam.nodes[1].vNodeDir = <<0.4002, 0.1876, 0.4090>> thisSwitchCam.nodes[1].bPointAtEntity = TRUE thisSwitchCam.nodes[1].bPointAtOffsetIsRelative = TRUE thisSwitchCam.nodes[1].bAttachOffsetIsRelative = TRUE thisSwitchCam.nodes[1].fNodeFOV = 40.0000 thisSwitchCam.nodes[1].vClonedNodeOffset = <<0.0000, 0.0000, 0.0000>> thisSwitchCam.nodes[1].iNodeToClone = 0 thisSwitchCam.nodes[1].NodeTimePostFX_Type = NO_EFFECT thisSwitchCam.nodes[1].fNodeTimePostFXBlendTime = 0.0000 thisSwitchCam.nodes[1].fNodeTimePostFXTimeOffset = 0.0000 thisSwitchCam.nodes[1].fNodeMotionBlur = 0.0000 thisSwitchCam.nodes[1].NodeCamShakeType = CAM_SHAKE_MEDIUM thisSwitchCam.nodes[1].fNodeCamShake = 0.3000 thisSwitchCam.nodes[1].iCamEaseType = 2 thisSwitchCam.nodes[1].fCamEaseScaler = 1.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_SwitchShortFranklinIn 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.4000 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 = 600 thisSwitchCam.nodes[2].vNodePos = <<0.0646, 1.3472, 1.4595>> 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.3564, 0.2439, 1.4688>> thisSwitchCam.nodes[2].bPointAtEntity = TRUE thisSwitchCam.nodes[2].bPointAtOffsetIsRelative = TRUE thisSwitchCam.nodes[2].bAttachOffsetIsRelative = TRUE thisSwitchCam.nodes[2].fNodeFOV = 40.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 = 1.0000 thisSwitchCam.nodes[2].NodeCamShakeType = CAM_SHAKE_DEFAULT thisSwitchCam.nodes[2].fNodeCamShake = 0.0000 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.0000 thisSwitchCam.nodes[2].iTimeScaleEaseType = 0 thisSwitchCam.nodes[2].fTimeScaleEaseScaler = 0.0000 thisSwitchCam.nodes[2].bFlashEnabled = TRUE thisSwitchCam.nodes[2].SCFE_FlashEffectUsed = SCFE_SwitchShortTrevorMid 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.5000 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].bIsCamCutNode = TRUE thisSwitchCam.nodes[4].SwitchCamType = SWITCH_CAM_OLD_SYSTEM thisSwitchCam.nodes[4].iForceCamPointAtEntityIndex = -1 thisSwitchCam.nodes[4].bIsGameplayCamCopy = FALSE thisSwitchCam.nodes[4].iNodeTime = 0 thisSwitchCam.nodes[4].vNodePos = <<-1.6125, 2.0081, -1.4774>> 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.5, 0.9, -1.7>> thisSwitchCam.nodes[4].bPointAtEntity = TRUE thisSwitchCam.nodes[4].bPointAtOffsetIsRelative = TRUE thisSwitchCam.nodes[4].bAttachOffsetIsRelative = TRUE thisSwitchCam.nodes[4].fNodeFOV = 40.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 = 1.0000 thisSwitchCam.nodes[4].NodeCamShakeType = CAM_SHAKE_MEDIUM 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 = 0.3 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 = FALSE thisSwitchCam.nodes[5].iNodeTime = 600 thisSwitchCam.nodes[5].vNodePos = <<-1.6125, 2.0081, 0.6774>> 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.5, 0.9, 0.3>> thisSwitchCam.nodes[5].bPointAtEntity = TRUE thisSwitchCam.nodes[5].bPointAtOffsetIsRelative = TRUE thisSwitchCam.nodes[5].bAttachOffsetIsRelative = TRUE thisSwitchCam.nodes[5].fNodeFOV = 40.0000 thisSwitchCam.nodes[5].vClonedNodeOffset = <<0.0000, 0.0000, 0.0000>> thisSwitchCam.nodes[5].iNodeToClone = 0 thisSwitchCam.nodes[5].NodeTimePostFX_Type = NO_EFFECT thisSwitchCam.nodes[5].fNodeTimePostFXBlendTime = 0.0000 thisSwitchCam.nodes[5].fNodeTimePostFXTimeOffset = 0.0000 thisSwitchCam.nodes[5].fNodeMotionBlur = 1.0000 thisSwitchCam.nodes[5].NodeCamShakeType = CAM_SHAKE_MEDIUM thisSwitchCam.nodes[5].fNodeCamShake = 0.5000 thisSwitchCam.nodes[5].iCamEaseType = 0 thisSwitchCam.nodes[5].fCamEaseScaler = 0.0000 thisSwitchCam.nodes[5].fCamNodeVelocityScale = 0.6000 thisSwitchCam.nodes[5].bCamEaseForceLinear = FALSE thisSwitchCam.nodes[5].bCamEaseForceLevel = FALSE thisSwitchCam.nodes[5].fTimeScale = 0.3 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.nodes[6].SwitchCamType = SWITCH_CAM_OLD_SYSTEM thisSwitchCam.nodes[6].iForceCamPointAtEntityIndex = -1 thisSwitchCam.nodes[6].bIsGameplayCamCopy = FALSE thisSwitchCam.nodes[6].iNodeTime = 400 thisSwitchCam.nodes[6].vNodePos = <<-1.6125, 2.0081, 0.6774>> thisSwitchCam.nodes[6].vWorldPosLookAt = <<0.0000, 0.0000, 0.0000>> thisSwitchCam.nodes[6].fNodeOffsetDist = 0.0000 thisSwitchCam.nodes[6].fNodeVerticleOffset = 0.0000 thisSwitchCam.nodes[6].bAttachToOriginPed = FALSE thisSwitchCam.nodes[6].vNodeDir = <<-0.5, 0.9, 0.3>> thisSwitchCam.nodes[6].bPointAtEntity = TRUE thisSwitchCam.nodes[6].bPointAtOffsetIsRelative = TRUE thisSwitchCam.nodes[6].bAttachOffsetIsRelative = TRUE thisSwitchCam.nodes[6].fNodeFOV = 40.0000 thisSwitchCam.nodes[6].vClonedNodeOffset = <<0.0000, 0.0000, 0.0000>> thisSwitchCam.nodes[6].iNodeToClone = 0 thisSwitchCam.nodes[6].NodeTimePostFX_Type = NO_EFFECT thisSwitchCam.nodes[6].fNodeTimePostFXBlendTime = 0.0000 thisSwitchCam.nodes[6].fNodeTimePostFXTimeOffset = 0.0000 thisSwitchCam.nodes[6].fNodeMotionBlur = 0.0000 thisSwitchCam.nodes[6].NodeCamShakeType = CAM_SHAKE_MEDIUM thisSwitchCam.nodes[6].fNodeCamShake = 0.5000 thisSwitchCam.nodes[6].iCamEaseType = 0 thisSwitchCam.nodes[6].fCamEaseScaler = 0.0000 thisSwitchCam.nodes[6].fCamNodeVelocityScale = 0.0000 thisSwitchCam.nodes[6].bCamEaseForceLinear = FALSE thisSwitchCam.nodes[6].bCamEaseForceLevel = FALSE thisSwitchCam.nodes[6].fTimeScale = 1.0000 thisSwitchCam.nodes[6].iTimeScaleEaseType = 0 thisSwitchCam.nodes[6].fTimeScaleEaseScaler = 0.0000 thisSwitchCam.nodes[6].bFlashEnabled = FALSE thisSwitchCam.nodes[6].SCFE_FlashEffectUsed = SCFE_CODE_FLASH thisSwitchCam.nodes[6].fMinExposure = 0.0000 thisSwitchCam.nodes[6].fMaxExposure = 0.0000 thisSwitchCam.nodes[6].iRampUpDuration = 0 thisSwitchCam.nodes[6].iRampDownDuration = 0 thisSwitchCam.nodes[6].iHoldDuration = 0 thisSwitchCam.nodes[6].fFlashNodePhaseOffset = 0.0000 thisSwitchCam.nodes[6].bIsLowDetailNode = FALSE thisSwitchCam.nodes[6].bUseCustomDOF = FALSE thisSwitchCam.nodes[6].NodeDOF_Info.fDOF_NearDOF = 0.0000 thisSwitchCam.nodes[6].NodeDOF_Info.fDOF_FarDOF = 0.0000 thisSwitchCam.nodes[6].NodeDOF_Info.fDOF_EffectStrength = 0.0000 thisSwitchCam.iNumNodes = 7 thisSwitchCam.iCamSwitchFocusNode = 3 thisSwitchCam.fSwitchSoundAudioStartPhase = 0.015 thisSwitchCam.fSwitchSoundAudioEndPhase = 0.34 thisSwitchCam.bSwitchSoundPlayOpeningPulse = FALSE thisSwitchCam.bSwitchSoundPlayMoveLoop = FALSE thisSwitchCam.bSwitchSoundPlayExitPulse = FALSE thisSwitchCam.bSplineNoSmoothing = FALSE //thisSwitchCam.bAddGameplayCamAsLastNode = TRUE thisSwitchCam.iGameplayNodeBlendDuration = 0 //--- End of Cam Data --- thisSwitchCam.strOutputStructName = "thisSwitchCam" thisSwitchCam.strOutputFileName = "CameraInfo_FIB2_FranklinToMike.txt" thisSwitchCam.strXMLFileName = "CameraInfo_FIB2_FranklinToMike.xml" thisSwitchCam.bInitialized = TRUE //ENDIF thisSwitchCam.piPeds[0] = piFranklin thisSwitchCam.piPeds[1] = piTrevor ENDPROC PROC SETUP_SPLINE_CAM_NODE_ARRAY_FRANKLIN_TO_MICHAEL(SWITCH_CAM_STRUCT &thisSwitchCam, PED_INDEX piFranklin, PED_INDEX piMichael) CDEBUG3LN(DEBUG_MISSION, "SETUP_SPLINE_CAM_NODE_ARRAY_FRANKLIN_TO_TREVOR") //IF NOT thisSwitchCam.bInitialized //--- Start of Cam Data --- thisSwitchCam.nodes[0].SwitchCamType = SWITCH_CAM_OLD_SYSTEM thisSwitchCam.nodes[0].iForceCamPointAtEntityIndex = -1 thisSwitchCam.nodes[0].bIsGameplayCamCopy = FALSE thisSwitchCam.nodes[0].iNodeTime = 0 thisSwitchCam.nodes[0].vNodePos = <<-0.0083, 1.3912, 0.2997>> thisSwitchCam.nodes[0].vWorldPosLookAt = <<0.0000, 0.0000, 0.0000>> thisSwitchCam.nodes[0].fNodeOffsetDist = 0.0000 thisSwitchCam.nodes[0].fNodeVerticleOffset = 0.0000 thisSwitchCam.nodes[0].bAttachToOriginPed = FALSE thisSwitchCam.nodes[0].vNodeDir = <<0.4002, 0.1876, 0.4090>> thisSwitchCam.nodes[0].bPointAtEntity = TRUE thisSwitchCam.nodes[0].bPointAtOffsetIsRelative = TRUE thisSwitchCam.nodes[0].bAttachOffsetIsRelative = TRUE thisSwitchCam.nodes[0].fNodeFOV = 40.0000 thisSwitchCam.nodes[0].vClonedNodeOffset = <<0.0000, 0.0000, 0.0000>> thisSwitchCam.nodes[0].iNodeToClone = 0 thisSwitchCam.nodes[0].NodeTimePostFX_Type = NO_EFFECT thisSwitchCam.nodes[0].fNodeTimePostFXBlendTime = 0.0000 thisSwitchCam.nodes[0].fNodeTimePostFXTimeOffset = 0.0000 thisSwitchCam.nodes[0].fNodeMotionBlur = 0.0000 thisSwitchCam.nodes[0].NodeCamShakeType = CAM_SHAKE_MEDIUM thisSwitchCam.nodes[0].fNodeCamShake = 0.3000 thisSwitchCam.nodes[0].iCamEaseType = 0 thisSwitchCam.nodes[0].fCamEaseScaler = 0.0000 thisSwitchCam.nodes[0].fCamNodeVelocityScale = 0.0000 thisSwitchCam.nodes[0].bCamEaseForceLinear = TRUE thisSwitchCam.nodes[0].bCamEaseForceLevel = FALSE thisSwitchCam.nodes[0].fTimeScale = 0.0100 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 = 10 thisSwitchCam.nodes[1].vNodePos = <<-0.0083, 1.3912, 0.2997>> thisSwitchCam.nodes[1].vWorldPosLookAt = <<0.0000, 0.0000, 0.2000>> thisSwitchCam.nodes[1].fNodeOffsetDist = 0.0000 thisSwitchCam.nodes[1].fNodeVerticleOffset = 0.0000 thisSwitchCam.nodes[1].bAttachToOriginPed = FALSE thisSwitchCam.nodes[1].vNodeDir = <<0.4002, 0.1876, 0.4090>> thisSwitchCam.nodes[1].bPointAtEntity = TRUE thisSwitchCam.nodes[1].bPointAtOffsetIsRelative = TRUE thisSwitchCam.nodes[1].bAttachOffsetIsRelative = TRUE thisSwitchCam.nodes[1].fNodeFOV = 40.0000 thisSwitchCam.nodes[1].vClonedNodeOffset = <<0.0000, 0.0000, 0.0000>> thisSwitchCam.nodes[1].iNodeToClone = 0 thisSwitchCam.nodes[1].NodeTimePostFX_Type = NO_EFFECT thisSwitchCam.nodes[1].fNodeTimePostFXBlendTime = 0.0000 thisSwitchCam.nodes[1].fNodeTimePostFXTimeOffset = 0.0000 thisSwitchCam.nodes[1].fNodeMotionBlur = 0.0000 thisSwitchCam.nodes[1].NodeCamShakeType = CAM_SHAKE_MEDIUM thisSwitchCam.nodes[1].fNodeCamShake = 0.3000 thisSwitchCam.nodes[1].iCamEaseType = 2 thisSwitchCam.nodes[1].fCamEaseScaler = 1.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_SwitchShortFranklinIn 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.4000 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 = 600 thisSwitchCam.nodes[2].vNodePos = <<0.0646, 1.3472, 1.4595>> 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.3564, 0.2439, 1.4688>> thisSwitchCam.nodes[2].bPointAtEntity = TRUE thisSwitchCam.nodes[2].bPointAtOffsetIsRelative = TRUE thisSwitchCam.nodes[2].bAttachOffsetIsRelative = TRUE thisSwitchCam.nodes[2].fNodeFOV = 40.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 = 1.0000 thisSwitchCam.nodes[2].NodeCamShakeType = CAM_SHAKE_DEFAULT thisSwitchCam.nodes[2].fNodeCamShake = 0.0000 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.0000 thisSwitchCam.nodes[2].iTimeScaleEaseType = 0 thisSwitchCam.nodes[2].fTimeScaleEaseScaler = 0.0000 thisSwitchCam.nodes[2].bFlashEnabled = TRUE thisSwitchCam.nodes[2].SCFE_FlashEffectUsed = SCFE_SwitchShortMichaelMid 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.5000 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].bIsCamCutNode = TRUE thisSwitchCam.nodes[4].SwitchCamType = SWITCH_CAM_OLD_SYSTEM thisSwitchCam.nodes[4].iForceCamPointAtEntityIndex = -1 thisSwitchCam.nodes[4].bIsGameplayCamCopy = FALSE thisSwitchCam.nodes[4].iNodeTime = 0 thisSwitchCam.nodes[4].vNodePos = <<-1.5125, 2.8081, -1.8774>> 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.9322, -0.2357, -1.7781>> thisSwitchCam.nodes[4].bPointAtEntity = TRUE thisSwitchCam.nodes[4].bPointAtOffsetIsRelative = TRUE thisSwitchCam.nodes[4].bAttachOffsetIsRelative = TRUE thisSwitchCam.nodes[4].fNodeFOV = 40.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 = 1.0000 thisSwitchCam.nodes[4].NodeCamShakeType = CAM_SHAKE_MEDIUM thisSwitchCam.nodes[4].fNodeCamShake = 0.3000 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 = FALSE thisSwitchCam.nodes[5].iNodeTime = 600 thisSwitchCam.nodes[5].vNodePos = <<-1.1357, 2.3820, 0.6090>> 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 = <<-1.1860, -0.0093, 0.4085>> thisSwitchCam.nodes[5].bPointAtEntity = TRUE thisSwitchCam.nodes[5].bPointAtOffsetIsRelative = TRUE thisSwitchCam.nodes[5].bAttachOffsetIsRelative = TRUE thisSwitchCam.nodes[5].fNodeFOV = 45.0000 thisSwitchCam.nodes[5].vClonedNodeOffset = <<0.0000, 0.0000, 0.0000>> thisSwitchCam.nodes[5].iNodeToClone = 0 thisSwitchCam.nodes[5].NodeTimePostFX_Type = NO_EFFECT thisSwitchCam.nodes[5].fNodeTimePostFXBlendTime = 0.0000 thisSwitchCam.nodes[5].fNodeTimePostFXTimeOffset = 0.0000 thisSwitchCam.nodes[5].fNodeMotionBlur = 1.0000 thisSwitchCam.nodes[5].NodeCamShakeType = CAM_SHAKE_MEDIUM thisSwitchCam.nodes[5].fNodeCamShake = 0.3000 thisSwitchCam.nodes[5].iCamEaseType = 0 thisSwitchCam.nodes[5].fCamEaseScaler = 0.0000 thisSwitchCam.nodes[5].fCamNodeVelocityScale = 0.6000 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.nodes[6].SwitchCamType = SWITCH_CAM_OLD_SYSTEM thisSwitchCam.nodes[6].iForceCamPointAtEntityIndex = -1 thisSwitchCam.nodes[6].bIsGameplayCamCopy = TRUE thisSwitchCam.nodes[6].iNodeTime = 600 thisSwitchCam.nodes[6].vNodePos = <<-1.1809, 1.3800, 0.7801>> thisSwitchCam.nodes[6].vWorldPosLookAt = <<0.0000, 0.0000, 0.0000>> thisSwitchCam.nodes[6].fNodeOffsetDist = 0.0000 thisSwitchCam.nodes[6].fNodeVerticleOffset = 0.0000 thisSwitchCam.nodes[6].bAttachToOriginPed = FALSE thisSwitchCam.nodes[6].vNodeDir = <<-0.5020, -0.2914, 0.4661>> thisSwitchCam.nodes[6].bPointAtEntity = TRUE thisSwitchCam.nodes[6].bPointAtOffsetIsRelative = TRUE thisSwitchCam.nodes[6].bAttachOffsetIsRelative = TRUE thisSwitchCam.nodes[6].fNodeFOV = 45.0000 thisSwitchCam.nodes[6].vClonedNodeOffset = <<0.0000, 0.0000, 0.0000>> thisSwitchCam.nodes[6].iNodeToClone = 0 thisSwitchCam.nodes[6].NodeTimePostFX_Type = NO_EFFECT thisSwitchCam.nodes[6].fNodeTimePostFXBlendTime = 0.0000 thisSwitchCam.nodes[6].fNodeTimePostFXTimeOffset = 0.0000 thisSwitchCam.nodes[6].fNodeMotionBlur = 0.0000 thisSwitchCam.nodes[6].NodeCamShakeType = CAM_SHAKE_MEDIUM thisSwitchCam.nodes[6].fNodeCamShake = 0.3000 thisSwitchCam.nodes[6].iCamEaseType = 0 thisSwitchCam.nodes[6].fCamEaseScaler = 0.0000 thisSwitchCam.nodes[6].fCamNodeVelocityScale = 0.0000 thisSwitchCam.nodes[6].bCamEaseForceLinear = FALSE thisSwitchCam.nodes[6].bCamEaseForceLevel = FALSE thisSwitchCam.nodes[6].fTimeScale = 1.0000 thisSwitchCam.nodes[6].iTimeScaleEaseType = 0 thisSwitchCam.nodes[6].fTimeScaleEaseScaler = 0.0000 thisSwitchCam.nodes[6].bFlashEnabled = FALSE thisSwitchCam.nodes[6].SCFE_FlashEffectUsed = SCFE_CODE_FLASH thisSwitchCam.nodes[6].fMinExposure = 0.0000 thisSwitchCam.nodes[6].fMaxExposure = 0.0000 thisSwitchCam.nodes[6].iRampUpDuration = 0 thisSwitchCam.nodes[6].iRampDownDuration = 0 thisSwitchCam.nodes[6].iHoldDuration = 0 thisSwitchCam.nodes[6].fFlashNodePhaseOffset = 0.0000 thisSwitchCam.nodes[6].bIsLowDetailNode = FALSE thisSwitchCam.nodes[6].bUseCustomDOF = FALSE thisSwitchCam.nodes[6].NodeDOF_Info.fDOF_NearDOF = 0.0000 thisSwitchCam.nodes[6].NodeDOF_Info.fDOF_FarDOF = 0.0000 thisSwitchCam.nodes[6].NodeDOF_Info.fDOF_EffectStrength = 0.0000 thisSwitchCam.iNumNodes = 7 thisSwitchCam.iCamSwitchFocusNode = 3 thisSwitchCam.fSwitchSoundAudioStartPhase = 0.015 thisSwitchCam.fSwitchSoundAudioEndPhase = 0.34 thisSwitchCam.bSwitchSoundPlayOpeningPulse = FALSE thisSwitchCam.bSwitchSoundPlayMoveLoop = FALSE thisSwitchCam.bSwitchSoundPlayExitPulse = FALSE thisSwitchCam.bSplineNoSmoothing = FALSE thisSwitchCam.bAddGameplayCamAsLastNode = TRUE thisSwitchCam.iGameplayNodeBlendDuration = 0 //--- End of Cam Data --- thisSwitchCam.strOutputStructName = "thisSwitchCam" thisSwitchCam.strOutputFileName = "CameraInfo_FIB2_FranklinToMike.txt" thisSwitchCam.strXMLFileName = "CameraInfo_FIB2_FranklinToMike.xml" thisSwitchCam.bInitialized = TRUE //ENDIF thisSwitchCam.piPeds[0] = piFranklin thisSwitchCam.piPeds[1] = piMichael ENDPROC PROC SETUP_SPLINE_CAM_NODE_ARRAY_FRANKLIN_TO_MICHAEL_FIRST_PERSON(SWITCH_CAM_STRUCT &thisSwitchCam, PED_INDEX piFranklin, PED_INDEX piMichael) CDEBUG3LN(DEBUG_MISSION, "SETUP_SPLINE_CAM_NODE_ARRAY_FRANKLIN_TO_TREVOR") //IF NOT thisSwitchCam.bInitialized //--- Start of Cam Data --- thisSwitchCam.nodes[0].SwitchCamType = SWITCH_CAM_OLD_SYSTEM thisSwitchCam.nodes[0].iForceCamPointAtEntityIndex = -1 thisSwitchCam.nodes[0].bIsGameplayCamCopy = FALSE thisSwitchCam.nodes[0].iNodeTime = 0 thisSwitchCam.nodes[0].vNodePos = <<-0.0083, 1.3912, 0.2997>> thisSwitchCam.nodes[0].vWorldPosLookAt = <<0.0000, 0.0000, 0.0000>> thisSwitchCam.nodes[0].fNodeOffsetDist = 0.0000 thisSwitchCam.nodes[0].fNodeVerticleOffset = 0.0000 thisSwitchCam.nodes[0].bAttachToOriginPed = FALSE thisSwitchCam.nodes[0].vNodeDir = <<0.4002, 0.1876, 0.4090>> thisSwitchCam.nodes[0].bPointAtEntity = TRUE thisSwitchCam.nodes[0].bPointAtOffsetIsRelative = TRUE thisSwitchCam.nodes[0].bAttachOffsetIsRelative = TRUE thisSwitchCam.nodes[0].fNodeFOV = 40.0000 thisSwitchCam.nodes[0].vClonedNodeOffset = <<0.0000, 0.0000, 0.0000>> thisSwitchCam.nodes[0].iNodeToClone = 0 thisSwitchCam.nodes[0].NodeTimePostFX_Type = NO_EFFECT thisSwitchCam.nodes[0].fNodeTimePostFXBlendTime = 0.0000 thisSwitchCam.nodes[0].fNodeTimePostFXTimeOffset = 0.0000 thisSwitchCam.nodes[0].fNodeMotionBlur = 0.0000 thisSwitchCam.nodes[0].NodeCamShakeType = CAM_SHAKE_MEDIUM thisSwitchCam.nodes[0].fNodeCamShake = 0.3000 thisSwitchCam.nodes[0].iCamEaseType = 0 thisSwitchCam.nodes[0].fCamEaseScaler = 0.0000 thisSwitchCam.nodes[0].fCamNodeVelocityScale = 0.0000 thisSwitchCam.nodes[0].bCamEaseForceLinear = TRUE thisSwitchCam.nodes[0].bCamEaseForceLevel = FALSE thisSwitchCam.nodes[0].fTimeScale = 0.0100 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 = 10 thisSwitchCam.nodes[1].vNodePos = <<-0.0083, 1.3912, 0.2997>> thisSwitchCam.nodes[1].vWorldPosLookAt = <<0.0000, 0.0000, 0.2000>> thisSwitchCam.nodes[1].fNodeOffsetDist = 0.0000 thisSwitchCam.nodes[1].fNodeVerticleOffset = 0.0000 thisSwitchCam.nodes[1].bAttachToOriginPed = FALSE thisSwitchCam.nodes[1].vNodeDir = <<0.4002, 0.1876, 0.4090>> thisSwitchCam.nodes[1].bPointAtEntity = TRUE thisSwitchCam.nodes[1].bPointAtOffsetIsRelative = TRUE thisSwitchCam.nodes[1].bAttachOffsetIsRelative = TRUE thisSwitchCam.nodes[1].fNodeFOV = 40.0000 thisSwitchCam.nodes[1].vClonedNodeOffset = <<0.0000, 0.0000, 0.0000>> thisSwitchCam.nodes[1].iNodeToClone = 0 thisSwitchCam.nodes[1].NodeTimePostFX_Type = NO_EFFECT thisSwitchCam.nodes[1].fNodeTimePostFXBlendTime = 0.0000 thisSwitchCam.nodes[1].fNodeTimePostFXTimeOffset = 0.0000 thisSwitchCam.nodes[1].fNodeMotionBlur = 0.0000 thisSwitchCam.nodes[1].NodeCamShakeType = CAM_SHAKE_MEDIUM thisSwitchCam.nodes[1].fNodeCamShake = 0.3000 thisSwitchCam.nodes[1].iCamEaseType = 2 thisSwitchCam.nodes[1].fCamEaseScaler = 1.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_SwitchShortFranklinIn 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.4000 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 = 600 thisSwitchCam.nodes[2].vNodePos = <<0.0646, 1.3472, 1.4595>> 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.3564, 0.2439, 1.4688>> thisSwitchCam.nodes[2].bPointAtEntity = TRUE thisSwitchCam.nodes[2].bPointAtOffsetIsRelative = TRUE thisSwitchCam.nodes[2].bAttachOffsetIsRelative = TRUE thisSwitchCam.nodes[2].fNodeFOV = 40.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 = 1.0000 thisSwitchCam.nodes[2].NodeCamShakeType = CAM_SHAKE_DEFAULT thisSwitchCam.nodes[2].fNodeCamShake = 0.0000 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.0000 thisSwitchCam.nodes[2].iTimeScaleEaseType = 0 thisSwitchCam.nodes[2].fTimeScaleEaseScaler = 0.0000 thisSwitchCam.nodes[2].bFlashEnabled = TRUE thisSwitchCam.nodes[2].SCFE_FlashEffectUsed = SCFE_SwitchShortMichaelMid 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.5000 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].bIsCamCutNode = TRUE thisSwitchCam.nodes[4].SwitchCamType = SWITCH_CAM_OLD_SYSTEM thisSwitchCam.nodes[4].iForceCamPointAtEntityIndex = -1 thisSwitchCam.nodes[4].bIsGameplayCamCopy = FALSE thisSwitchCam.nodes[4].iNodeTime = 0 thisSwitchCam.nodes[4].vNodePos = <<-1.9125, 1.3081, -2.1774>> 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, -1, -1.4>> thisSwitchCam.nodes[4].bPointAtEntity = TRUE thisSwitchCam.nodes[4].bPointAtOffsetIsRelative = TRUE thisSwitchCam.nodes[4].bAttachOffsetIsRelative = TRUE thisSwitchCam.nodes[4].fNodeFOV = 40.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 = 1.0000 thisSwitchCam.nodes[4].NodeCamShakeType = CAM_SHAKE_MEDIUM 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 = 0.3 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 = FALSE thisSwitchCam.nodes[5].iNodeTime = 600 thisSwitchCam.nodes[5].vNodePos = <<-1.9125, 1.3081, -0.1774>> 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, -1, 0.6>> thisSwitchCam.nodes[5].bPointAtEntity = TRUE thisSwitchCam.nodes[5].bPointAtOffsetIsRelative = TRUE thisSwitchCam.nodes[5].bAttachOffsetIsRelative = TRUE thisSwitchCam.nodes[5].fNodeFOV = 40.0000 thisSwitchCam.nodes[5].vClonedNodeOffset = <<0.0000, 0.0000, 0.0000>> thisSwitchCam.nodes[5].iNodeToClone = 0 thisSwitchCam.nodes[5].NodeTimePostFX_Type = NO_EFFECT thisSwitchCam.nodes[5].fNodeTimePostFXBlendTime = 0.0000 thisSwitchCam.nodes[5].fNodeTimePostFXTimeOffset = 0.0000 thisSwitchCam.nodes[5].fNodeMotionBlur = 1.0000 thisSwitchCam.nodes[5].NodeCamShakeType = CAM_SHAKE_MEDIUM thisSwitchCam.nodes[5].fNodeCamShake = 0.5000 thisSwitchCam.nodes[5].iCamEaseType = 0 thisSwitchCam.nodes[5].fCamEaseScaler = 0.0000 thisSwitchCam.nodes[5].fCamNodeVelocityScale = 0.6000 thisSwitchCam.nodes[5].bCamEaseForceLinear = FALSE thisSwitchCam.nodes[5].bCamEaseForceLevel = FALSE thisSwitchCam.nodes[5].fTimeScale = 0.3 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.nodes[6].SwitchCamType = SWITCH_CAM_OLD_SYSTEM thisSwitchCam.nodes[6].iForceCamPointAtEntityIndex = -1 thisSwitchCam.nodes[6].bIsGameplayCamCopy = FALSE thisSwitchCam.nodes[6].iNodeTime = 400 thisSwitchCam.nodes[6].vNodePos = <<-1.9125, 1.3081, -0.1774>> thisSwitchCam.nodes[6].vWorldPosLookAt = <<0.0000, 0.0000, 0.0000>> thisSwitchCam.nodes[6].fNodeOffsetDist = 0.0000 thisSwitchCam.nodes[6].fNodeVerticleOffset = 0.0000 thisSwitchCam.nodes[6].bAttachToOriginPed = FALSE thisSwitchCam.nodes[6].vNodeDir = <<0, -1, 0.6>> thisSwitchCam.nodes[6].bPointAtEntity = TRUE thisSwitchCam.nodes[6].bPointAtOffsetIsRelative = TRUE thisSwitchCam.nodes[6].bAttachOffsetIsRelative = TRUE thisSwitchCam.nodes[6].fNodeFOV = 40.0000 thisSwitchCam.nodes[6].vClonedNodeOffset = <<0.0000, 0.0000, 0.0000>> thisSwitchCam.nodes[6].iNodeToClone = 0 thisSwitchCam.nodes[6].NodeTimePostFX_Type = NO_EFFECT thisSwitchCam.nodes[6].fNodeTimePostFXBlendTime = 0.0000 thisSwitchCam.nodes[6].fNodeTimePostFXTimeOffset = 0.0000 thisSwitchCam.nodes[6].fNodeMotionBlur = 0.0000 thisSwitchCam.nodes[6].NodeCamShakeType = CAM_SHAKE_MEDIUM thisSwitchCam.nodes[6].fNodeCamShake = 0.5000 thisSwitchCam.nodes[6].iCamEaseType = 0 thisSwitchCam.nodes[6].fCamEaseScaler = 0.0000 thisSwitchCam.nodes[6].fCamNodeVelocityScale = 0.0000 thisSwitchCam.nodes[6].bCamEaseForceLinear = FALSE thisSwitchCam.nodes[6].bCamEaseForceLevel = FALSE thisSwitchCam.nodes[6].fTimeScale = 1.0000 thisSwitchCam.nodes[6].iTimeScaleEaseType = 0 thisSwitchCam.nodes[6].fTimeScaleEaseScaler = 0.0000 thisSwitchCam.nodes[6].bFlashEnabled = FALSE thisSwitchCam.nodes[6].SCFE_FlashEffectUsed = SCFE_CODE_FLASH thisSwitchCam.nodes[6].fMinExposure = 0.0000 thisSwitchCam.nodes[6].fMaxExposure = 0.0000 thisSwitchCam.nodes[6].iRampUpDuration = 0 thisSwitchCam.nodes[6].iRampDownDuration = 0 thisSwitchCam.nodes[6].iHoldDuration = 0 thisSwitchCam.nodes[6].fFlashNodePhaseOffset = 0.0000 thisSwitchCam.nodes[6].bIsLowDetailNode = FALSE thisSwitchCam.nodes[6].bUseCustomDOF = FALSE thisSwitchCam.nodes[6].NodeDOF_Info.fDOF_NearDOF = 0.0000 thisSwitchCam.nodes[6].NodeDOF_Info.fDOF_FarDOF = 0.0000 thisSwitchCam.nodes[6].NodeDOF_Info.fDOF_EffectStrength = 0.0000 thisSwitchCam.iNumNodes = 7 thisSwitchCam.iCamSwitchFocusNode = 3 thisSwitchCam.fSwitchSoundAudioStartPhase = 0.015 thisSwitchCam.fSwitchSoundAudioEndPhase = 0.34 thisSwitchCam.bSwitchSoundPlayOpeningPulse = FALSE thisSwitchCam.bSwitchSoundPlayMoveLoop = FALSE thisSwitchCam.bSwitchSoundPlayExitPulse = FALSE thisSwitchCam.bSplineNoSmoothing = FALSE //thisSwitchCam.bAddGameplayCamAsLastNode = TRUE thisSwitchCam.iGameplayNodeBlendDuration = 0 //--- End of Cam Data --- thisSwitchCam.strOutputStructName = "thisSwitchCam" thisSwitchCam.strOutputFileName = "CameraInfo_FIB2_FranklinToMike.txt" thisSwitchCam.strXMLFileName = "CameraInfo_FIB2_FranklinToMike.xml" thisSwitchCam.bInitialized = TRUE //ENDIF thisSwitchCam.piPeds[0] = piFranklin thisSwitchCam.piPeds[1] = piMichael ENDPROC /// PURPOSE: /// Handle the playback of the switch cam. The will setup, play, shut down and cleanup the switch cam spline /// PARAMS: /// thisSwitchCam - Switch camera to playback /// bReturnTrueOnce - If you only want this function to return TRUE once upon completion. Set to FALSE to have this function to return true every time this is called once the camera is finished playback. /// RETURNS: /// TRUE when camera is complete, FALSE if playback is still active, or if the camera has completed playback and bReturnTrueOnce is set to TRUE. FUNC BOOL HANDLE_SWITCH_CAM_FRANKLIN_TO_HELI(SWITCH_CAM_STRUCT &thisSwitchCam, BOOL bReturnTrueOnce = TRUE) INT iCurrentNode VECTOR vMichaelAimOutSideHeliLoc VECTOR vHeliLocDebug VECTOR vHeliForwardDebug VECTOR vMichaelAimDirection SWITCH eSwitchCamState CASE SWITCH_CAM_IDLE CDEBUG3LN(DEBUG_MISSION, "eSwitchCamState = SWITCH_CAM_IDLE") RETURN FALSE BREAK CASE SWITCH_CAM_SETUP_SPLINE CDEBUG3LN(DEBUG_MISSION, "eSwitchCamState = SWITCH_CAM_SETUP_SPLINE") //SETUP_SPLINE_CAM_NODE_ARRAY_HELI_MICHAEL_TO_TREVOR(thisSwitchCam, PLAYER_PED_ID(), GET_TREVOR_PED()) IF DOES_SWITCH_CAM_EXIST(thisSwitchCam) DESTROY_SWITCH_CAM(thisSwitchCam) ENDIF CREATE_SPLINE_CAM(thisSwitchCam) IF bSwitchToFirstPerson INT i REPEAT COUNT_OF(thisSwitchCam.nodes) i IF DOES_CAM_EXIST(thisSwitchCam.nodes[i].ciSwitchNode) IF i > 3 SET_CAM_INHERIT_ROLL_VEHICLE(thisSwitchCam.nodes[i].ciSwitchNode, snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) ENDIF ENDIF ENDREPEAT ENDIF SET_CAM_ACTIVE(thisSwitchCam.ciSpline, TRUE) RENDER_SCRIPT_CAMS(TRUE, FALSE) DISPLAY_RADAR(FALSE) DISPLAY_HUD(FALSE) SETTIMERB(0) SET_PLAYER_CONTROL(PLAYER_ID(), FALSE) SET_GAME_PAUSES_FOR_STREAMING(FALSE) bPlayerControlGiven = FALSE IF NOT bSwitchToFirstPerson CLEAR_PED_TASKS(GET_MICHAEL_PED()) ENDIF IF NOT IS_SCRIPT_TASK_RUNNING_OR_STARTING(GET_FRANKLIN_PED(), SCRIPT_TASK_PLAY_ANIM) CLEAR_PED_TASKS_IMMEDIATELY(GET_FRANKLIN_PED()) TASK_PLAY_ANIM(GET_FRANKLIN_PED(), GET_SNATCH_AND_GRAB_ANIM_DICT_AS_STRING(SAG_ANIM_DICT_SNIPER), "ig_7_m_door_f_sniping_franklin", INSTANT_BLEND_IN, INSTANT_BLEND_OUT, DEFAULT, AF_FORCE_START, 0.85, FALSE, AIK_DISABLE_ARM_IK) FORCE_PED_AI_AND_ANIMATION_UPDATE(GET_FRANKLIN_PED()) ENDIF eSwitchCamState = SWITCH_CAM_PLAYING_SPLINE RETURN TRUE BREAK CASE SWITCH_CAM_PLAYING_SPLINE CDEBUG3LN(DEBUG_MISSION, "eSwitchCamState = SWITCH_CAM_PLAYING_SPLINE") CDEBUG3LN(DEBUG_MISSION, GET_CAM_SPLINE_PHASE(thisSwitchCam.ciSpline)) IF bSwitchToFirstPerson PRINTSTRING("IS FIRST PERSON") PRINTNL() ELSE PRINTSTRING("IS THIRD PERSON") PRINTNL() ENDIF IF NOT bDoneHitSound IF GET_GAME_TIMER() >= (iSnatchAndGrabCutsceneTime + 20) PLAY_SOUND_FRONTEND(-1, "Hit_Out", "PLAYER_SWITCH_CUSTOM_SOUNDSET") iHitTime = GET_GAME_TIMER() bDoneHitSound = TRUE ENDIF ENDIF IF NOT bWooshStarted IF bDoneHitSound IF GET_GAME_TIMER() >= iHitTime + 200 PLAY_SOUND_FRONTEND(-1, "Short_Transition_In", "PLAYER_SWITCH_CUSTOM_SOUNDSET") bWooshStarted = TRUE ENDIF ENDIF ENDIF IF IS_CAM_ACTIVE(thisSwitchCam.ciSpline) iCurrentNode = UPDATE_SPLINE_CAM(thisSwitchCam) IF iCurrentNode >= (thisSwitchCam.iCamSwitchFocusNode -2) sCamDetails.bOKToSwitchPed = TRUE IF NOT bSwitchToFirstPerson UPDATE_CLONE_NODE_GAMEPLAY_CAM_DATA(thisSwitchCam, iCurrentNode, TRUE) ENDIF ENDIF //[MF] Have Michael already aiming at his target helicopter. IF eCurrentBranchedSwitchState = BRANCHED_SWITCH_FRANKLIN_TO_MICHAEL_ACTIVE OR bSwitchToFirstPerson IF NOT IS_SCRIPT_TASK_RUNNING_OR_STARTING(GET_MICHAEL_PED(), SCRIPT_TASK_DRIVE_BY) OR bSwitchToFirstPerson IF NOT bSwitchToFirstPerson CLEAR_PED_TASKS(GET_MICHAEL_PED()) ENDIF vHeliLocDebug = GET_ENTITY_COORDS(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) vHeliForwardDebug = GET_ENTITY_FORWARD_VECTOR(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) vMichaelAimDirection = ROTATE_VECTOR_ABOUT_Z(vHeliForwardDebug, fSwitchToMike_AimingHeading) vMichaelAimDirection.Z = 0.0 vMichaelAimDirection = GET_VECTOR_OF_LENGTH(vMichaelAimDirection, 150) vMichaelAimOutSideHeliLoc = (vHeliLocDebug + vMichaelAimDirection) PRINTLN("Telling Michael To At Nothing in paricular Loc: X:", vMichaelAimOutSideHeliLoc.x, " Y:", vMichaelAimOutSideHeliLoc.Y, " Z:", vMichaelAimOutSideHeliLoc.Z) PRINTLN("Heli Loc Loc: X:", vHeliLocDebug.x, " Y:", vHeliLocDebug.Y, " Z:", vHeliLocDebug.Z) PRINTLN("Heli Forward X:", vHeliForwardDebug.x, " Y:", vHeliForwardDebug.Y, " Z:", vHeliForwardDebug.Z) TASK_DRIVE_BY(GET_MICHAEL_PED(), NULL, NULL, vMichaelAimOutSideHeliLoc, 10000, 0, FALSE, FIRING_PATTERN_SINGLE_SHOT) printstring("give driveby!") printnl() ENDIF ENDIF //[MF] Once cam is at the end, reset the gameplay cam positon and advance to next state. IF GET_CAM_SPLINE_PHASE(thisSwitchCam.ciSpline) >= 1.00 CDEBUG3LN(DEBUG_MISSION, "eSwitchCamState = SWITCH_CAM_RETURN_TO_GAMEPLAY") RENDER_SCRIPT_CAMS(FALSE, FALSE) eSwitchCamState = SWITCH_CAM_RETURN_TO_GAMEPLAY ENDIF ELSE SCRIPT_ASSERT("Cam Prematurely Deleted! WTF?") RENDER_SCRIPT_CAMS(FALSE, FALSE) eSwitchCamState = SWITCH_CAM_SETUP_SPLINE ENDIF IF IS_GAMEPLAY_HINT_ACTIVE() STOP_GAMEPLAY_HINT(TRUE) ENDIF RETURN TRUE BREAK CASE 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) ENDIF IF DOES_SWITCH_CAM_EXIST(thisSwitchCam) DESTROY_SWITCH_CAM(thisSwitchCam) ENDIF IF NOT bPlayerControlGiven SET_PLAYER_CONTROL(PLAYER_ID(), TRUE) DISPLAY_RADAR(TRUE) DISPLAY_HUD(TRUE) bPlayerControlGiven = TRUE ENDIF SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(GET_MICHAEL_PED(), FALSE) SETTIMERA(0) eSwitchCamState = SWITCH_CAM_IDLE thisSwitchCam.bIsSplineCamFinishedPlaying = TRUE SET_PLAYER_CONTROL(PLAYER_ID(), true) SET_PED_FIRING_PATTERN(GET_MICHAEL_PED(), FIRING_PATTERN_FULL_AUTO) sCamDetails.bSplineCreated = FALSE sCamDetails.bOKToSwitchPed = FALSE SET_GAME_PAUSES_FOR_STREAMING(TRUE) IF IS_VEHICLE_DRIVEABLE(enemyChopperVehicle[2]) TASK_AIM_GUN_AT_ENTITY(GET_FRANKLIN_PED(), enemyChopperVehicle[2], INFINITE_TASK_TIME, TRUE) ELIF IS_VEHICLE_DRIVEABLE(enemyChopperVehicle[iLeadHeli]) TASK_AIM_GUN_AT_ENTITY(GET_FRANKLIN_PED(), enemyChopperVehicle[iLeadHeli], INFINITE_TASK_TIME, TRUE) ELSE TASK_AIM_GUN_AT_ENTITY(GET_FRANKLIN_PED(), snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], INFINITE_TASK_TIME, TRUE) ENDIF eCurrentBranchedSwitchState = BRANCHED_SWITCH_INACTIVE RETURN FALSE BREAK ENDSWITCH IF bReturnTrueOnce RETURN FALSE ELSE RETURN thisSwitchCam.bIsSplineCamFinishedPlaying ENDIF ENDFUNC #IF IS_DEBUG_BUILD PROC HANDLE_SWITCH_CAM_SPECIFIC_WIDGETS() IF bSwitchCamDebugScenarioEnabled SET_ENTITY_INVINCIBLE(GET_MICHAEL_PED(), TRUE) SET_ENTITY_INVINCIBLE(GET_FRANKLIN_PED(), TRUE) SET_ENTITY_INVINCIBLE(GET_TREVOR_PED(), TRUE) SET_ENTITY_INVINCIBLE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], TRUE) ENDIF ENDPROC PROC CREATE_SWITCH_CAM_SPECIFIC_WIDGETS() START_WIDGET_GROUP("Script Specific Widgets") START_WIDGET_GROUP("Hanging To Sniper Sequence") START_WIDGET_GROUP("Mike TO Frank") ADD_WIDGET_FLOAT_SLIDER("Cam Ease Multiplier", fMikeHangingToSniperCamEaseMultiplier, 0.0, 1.0, 0.1) ADD_WIDGET_INT_SLIDER("Cam Ease Index", iMikeHangingToSniperEaseNodeIndex, 0, 5, 1) // ADD_WIDGET_FLOAT_SLIDER("Switch FX In Phase", fMikeHangingToSniper_SwitchInFX_Phase, 0.0, 1.0, 0.1) // ADD_WIDGET_FLOAT_SLIDER("Switch FX Out Phase", fMikeHangingToSniper_SwitchOutFX_Phase, 0.0, 1.0, 0.1) STOP_WIDGET_GROUP() STOP_WIDGET_GROUP() ADD_WIDGET_FLOAT_SLIDER("Franklin Aim Anim Start Phase", fHangingToFranklin_AimAnimStartPhase, 0.0, 1.0, 0.1) ADD_WIDGET_FLOAT_SLIDER("Michael Aim Direction Override", fDEBUG_OverrideMichaelAim, -1.0, 180.0, 1.0) ADD_WIDGET_FLOAT_SLIDER("Franklin Reload Anim Start Phase", fMikeToFranklin_ReloadAnimStartPhase, 0.0, 1.0, 0.1) ADD_WIDGET_FLOAT_SLIDER("Franklin Reload Anim Blend In Delta", fHeliToFrank_ReloadBlendInDelta, 0.1, 1000.0, 100.0) ADD_WIDGET_FLOAT_SLIDER("Michael Aim At Heading", fSwitchToMike_AimingHeading, 0.0, 180.0, 5.0) ADD_WIDGET_INT_SLIDER("Heli To Frank = Focus Ped Index Offset", iHeliToFranklin_SwitchPedIndexOffset, -3, 3, 1) ADD_WIDGET_FLOAT_SLIDER("M To F Start AI Task Phase", fMikeToFranklin_FranklinStartAITaskPhase, 0.0, 1.0, 0.1) ADD_WIDGET_FLOAT_SLIDER("T To F Start AI Task Phase", fTrevToFranklin_FranklinStartAITaskPhase, 0.0, 1.0, 0.1) ADD_WIDGET_FLOAT_SLIDER("Trevor Switch Gameplay Cam Hint Dist", fHangOnTrevor_HintCamFollowDist, 0.2, 3.0, 0.2) ADD_WIDGET_VECTOR_SLIDER("Trevor Switch Gameplay Cam Hint Target", vHangOnTrevor_HintCamLookAtLoc, -500.0, 500.0, 50.0) STOP_WIDGET_GROUP() ENDPROC #ENDIF ////FUNC VECTOR CONVERT_EULER_TO_DIRECTION_VECTOR(VECTOR vEuler) //// // Euler angles assumed to be in YXZ order //// VECTOR vResult //// //b.Set(-cx*sz, cx*cz, sx); //// vResult.x = Cos(vEuler.x) //// vResult.y = Cos(vEuler.z) //// vResult.z = Sin(vEuler.x) //// vResult.y *= vResult.x //// vResult.x *= -Sin(vEuler.z) //// //// RETURN vResult ////ENDFUNC CONST_FLOAT c_fSwapChopperDistance 10.0 CONST_FLOAT c_fSwapSniperDistance 20.0 FUNC BOOL DO_MISSION_HOTSWAP(SELECTOR_SLOTS_ENUM targetCharacter, BOOL bInstantSwap = FALSE, BOOL bKeepTasks = FALSE, HOTSWAP_CAM_ENUM hotswapCam = HOTSWAP_CAM_DEFAULT, TAKE_CONTROL_OF_PED_FLAGS tcfFlags = TCF_NONE) VECTOR vSniperPos = vSniperNodePos3//<<-136.387,-592.535,211.892>> //<<-136.630, -592.565, 211.899>> //<<-136.643, -592.850, 211.776>> VECTOR vSniperRot = vSniperNodeRot3// <<-1.573389,0.000000,-96.932442>> //<<-1.997, 0.0, -96.944>> //<<-3.97, 0.0, -91.14>> ////VECTOR vHalfSniperPos = << -21.744, -605.191, 209.722 >> // halfway to sniper position VECTOR vHangingPos = <<101.513916,-615.483154,206.740265>> VECTOR vHangingRot = <<0.340730,0.0,-103.845039>> // VECTOR vSource // VECTOR vDestination // VECTOR vChopperDirection // VECTOR vSniperDirection // FLOAT fMagnitude // FLOAT fScale = 0.33 // BOOL bFlipAxis = FALSE 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 bStartPushIn = FALSE bDoneHitSound = FALSE bWooshStarted = FALSE pushInData.state = PUSH_IN_NOT_CREATED hotswapStage = MISSION_HOTSWAP_STAGE_DO_SPLINE_CAM FALLTHRU CASE MISSION_HOTSWAP_STAGE_DO_SPLINE_CAM SWITCH hotswapCam CASE HOTSWAP_CAM_SNIPER_TO_HANGING IF NOT sCamDetails.bSplineCreated DO_COMMON_CUSTOM_HOTSWAP_START() /* sCamDetails.camInterpIDs[1] = CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SCRIPTED, vSniperPos, vSniperRot, 35.0, TRUE) ADD_CAM_SPLINE_NODE_USING_CAMERA(sCamDetails.camID, sCamDetails.camInterpIDs[1], 125, CAM_SPLINE_NODE_SMOOTH_ROT | CAM_SPLINE_NODE_SMOOTH_LENS_PARAMS) SET_CAM_MOTION_BLUR_STRENGTH(sCamDetails.camInterpIDs[1], 0.6) SET_CAM_SPLINE_NODE_EASE(sCamDetails.camID, iFranklinToHangingEaseNodeIndex, CAM_SPLINE_NODE_EASE_OUT, fFranklinToHangingCamEaseMultiplier) splineOffset = LERP_VECTOR(vSniperPos, vHangingPos, 0.95) sCamDetails.camInterpIDs[3] = CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SCRIPTED, splineOffset, vHangingRot, 35.0, TRUE) ADD_CAM_SPLINE_NODE_USING_CAMERA(sCamDetails.camID, sCamDetails.camInterpIDs[3], 600, CAM_SPLINE_NODE_SMOOTH_ROT | CAM_SPLINE_NODE_SMOOTH_LENS_PARAMS) SET_CAM_MOTION_BLUR_STRENGTH(sCamDetails.camInterpIDs[3], 0.7) sCamDetails.camInterpIDs[2] = CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SCRIPTED, vHangingPos, vHangingRot, 35.0, TRUE) ADD_CAM_SPLINE_NODE_USING_CAMERA(sCamDetails.camID, sCamDetails.camInterpIDs[2], 100, CAM_SPLINE_NODE_SMOOTH_ROT | CAM_SPLINE_NODE_SMOOTH_LENS_PARAMS) SET_CAM_MOTION_BLUR_STRENGTH(sCamDetails.camInterpIDs[2], 0.3) //ADD_CAM_SPLINE_NODE_USING_GAMEPLAY_FRAME(sCamDetails.camID, 425, CAM_SPLINE_NODE_SMOOTH_ROT | CAM_SPLINE_NODE_SMOOTH_LENS_PARAMS) SET_CAM_SPLINE_SMOOTHING_STYLE(sCamDetails.camID, CAM_SPLINE_SLOW_IN_SMOOTH) // SET_CAM_SPLINE_DURATION(sCamDetails.camID, 600) */ VECTOR vEaseFromMichael sCamDetails.camInterpIDs[0] = CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SCRIPTED, vSniperPos, vSniperRot, 35.0, TRUE) ADD_CAM_SPLINE_NODE_USING_CAMERA(sCamDetails.camID, sCamDetails.camInterpIDs[0], 0, CAM_SPLINE_NODE_SMOOTH_ROT | CAM_SPLINE_NODE_SMOOTH_LENS_PARAMS) SET_CAM_MOTION_BLUR_STRENGTH(sCamDetails.camInterpIDs[0], 0.2) vEaseFromMichael = LERP_VECTOR(vSniperPos, vHangingPos, 0.008) sCamDetails.camInterpIDs[1] = CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SCRIPTED, vEaseFromMichael, vSniperRot, 35, TRUE) ADD_CAM_SPLINE_NODE_USING_CAMERA(sCamDetails.camID, sCamDetails.camInterpIDs[1], 400, CAM_SPLINE_NODE_SMOOTH_LENS_PARAMS) SET_CAM_MOTION_BLUR_STRENGTH(sCamDetails.camInterpIDs[1], 0.4) sCamDetails.camInterpIDs[2] = CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SCRIPTED, vHangingPos, vHangingRot, 35.0, TRUE) ADD_CAM_SPLINE_NODE_USING_CAMERA(sCamDetails.camID, sCamDetails.camInterpIDs[2], 1000, CAM_SPLINE_NODE_SMOOTH_LENS_PARAMS) SET_CAM_MOTION_BLUR_STRENGTH(sCamDetails.camInterpIDs[2], 0.8) SET_CAM_SPLINE_SMOOTHING_STYLE(sCamDetails.camID, CAM_SPLINE_SLOW_IN_SMOOTH) SET_CAM_SPLINE_DURATION(sCamDetails.camID, 1000) bDoneHitSound = FALSE bWooshStarted = FALSE DO_COMMON_CUSTOM_HOTSWAP_END() DESTROY_MISSION_STATIC_CAM(staticCam) ENDIF BREAK CASE HOTSWAP_CAM_HANGING_TO_SNIPER IF NOT sCamDetails.bSplineCreated AND NOT bStartPushIn DO_COMMON_CUSTOM_HOTSWAP_START(CAMTYPE_SPLINE_DEFAULT) FILL_PUSH_IN_DATA(pushInData, dummyFranklinPed, CHAR_FRANKLIN, 0.2, 500, 500, 200, 300) SET_PUSH_IN_DIRECTION_MODIFIER(pushInData, <<0,0,5>>) VECTOR vFinalRot vFinalRot = GET_FINAL_RENDERED_CAM_ROT() VECTOR vEaseFromMichael VECTOR vDiffRot IF vFinalRot.z > 0 vFinalRot.z -= 360 ENDIF sCamDetails.camInterpIDs[0] = CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SCRIPTED, GET_FINAL_RENDERED_CAM_COORD(), vFinalRot, GET_FINAL_RENDERED_CAM_FOV(), TRUE) ADD_CAM_SPLINE_NODE_USING_CAMERA(sCamDetails.camID, sCamDetails.camInterpIDs[0], 0, CAM_SPLINE_NODE_SMOOTH_LENS_PARAMS) SET_CAM_MOTION_BLUR_STRENGTH(sCamDetails.camInterpIDs[0], 0.5) ////ADD_CAM_SPLINE_NODE(sCamDetails.camID, GET_FINAL_RENDERED_CAM_COORD(), GET_FINAL_RENDERED_CAM_ROT(), 0, CAM_SPLINE_NODE_SMOOTH_ROT|CAM_SPLINE_NODE_SMOOTH_LENS_PARAMS) vDiffRot = LERP_VECTOR(vFinalRot, vSniperNodeRot3, 0.6) vDiffRot.y = vSniperNodeRot3.y vEaseFromMichael = LERP_VECTOR(GET_FINAL_RENDERED_CAM_COORD(), vSniperNodePos3, 0.1) sCamDetails.camInterpIDs[1] = CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SCRIPTED, vEaseFromMichael, vDiffRot, GET_FINAL_RENDERED_CAM_FOV(), TRUE) ADD_CAM_SPLINE_NODE_USING_CAMERA(sCamDetails.camID, sCamDetails.camInterpIDs[1], 600, CAM_SPLINE_NODE_SMOOTH_LENS_PARAMS) SET_CAM_MOTION_BLUR_STRENGTH(sCamDetails.camInterpIDs[1], 0.8) sCamDetails.camInterpIDs[3] = CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SCRIPTED, vSniperNodePos3, vSniperNodeRot3, 35, TRUE) ADD_CAM_SPLINE_NODE_USING_CAMERA(sCamDetails.camID, sCamDetails.camInterpIDs[3], 900, CAM_SPLINE_NODE_SMOOTH_LENS_PARAMS) SET_CAM_MOTION_BLUR_STRENGTH(sCamDetails.camInterpIDs[3], 1.0) SET_CAM_SPLINE_SMOOTHING_STYLE(sCamDetails.camID, CAM_SPLINE_SLOW_IN_SMOOTH) SET_CAM_SPLINE_DURATION(sCamDetails.camID, 1000) bDoneHitSound = FALSE bWooshStarted = FALSE DO_COMMON_CUSTOM_HOTSWAP_END() ENDIF BREAK //[MF] Trevor to Michael CASE HOTSWAP_CAM_INSIDE_CHOPPER PRINTLN("HOTSWAP_CAM_INSIDE_CHOPPER") IF NOT sCamDetails.bSplineCreated DO_COMMON_CUSTOM_HOTSWAP_START() eSwitchCamState = SWITCH_CAM_SETUP_SPLINE IF IS_ALLOWED_INDEPENDENT_CAMERA_MODES() IF GET_CAM_VIEW_MODE_FOR_CONTEXT(CAM_VIEW_MODE_CONTEXT_IN_VEHICLE) = CAM_VIEW_MODE_FIRST_PERSON OR GET_CAM_VIEW_MODE_FOR_CONTEXT(CAM_VIEW_MODE_CONTEXT_IN_HELI) = CAM_VIEW_MODE_FIRST_PERSON bSwitchToFirstPerson = TRUE ELSE bSwitchToFirstPerson = FALSE ENDIF ELSE IF GET_CAM_VIEW_MODE_FOR_CONTEXT(GET_CAM_ACTIVE_VIEW_MODE_CONTEXT()) = CAM_VIEW_MODE_FIRST_PERSON bSwitchToFirstPerson = TRUE ELSE bSwitchToFirstPerson = FALSE ENDIF ENDIF DO_COMMON_CUSTOM_HOTSWAP_END() //SET_TIME_SCALE(0.1) ENDIF BREAK CASE HOTSWAP_CAM_OUTSIDE_CHOPPER PRINTLN("HOTSWAP_CAM_OUTSIDE_CHOPPER") IF NOT sCamDetails.bSplineCreated DO_COMMON_CUSTOM_HOTSWAP_START() eSwitchCamState = SWITCH_CAM_SETUP_SPLINE IF IS_ALLOWED_INDEPENDENT_CAMERA_MODES() IF GET_CAM_VIEW_MODE_FOR_CONTEXT(CAM_VIEW_MODE_CONTEXT_IN_VEHICLE) = CAM_VIEW_MODE_FIRST_PERSON OR GET_CAM_VIEW_MODE_FOR_CONTEXT(CAM_VIEW_MODE_CONTEXT_IN_HELI) = CAM_VIEW_MODE_FIRST_PERSON bSwitchToFirstPerson = TRUE ELSE bSwitchToFirstPerson = FALSE ENDIF ELSE IF GET_CAM_VIEW_MODE_FOR_CONTEXT(GET_CAM_ACTIVE_VIEW_MODE_CONTEXT()) = CAM_VIEW_MODE_FIRST_PERSON bSwitchToFirstPerson = TRUE ELSE bSwitchToFirstPerson = FALSE ENDIF ENDIF DO_COMMON_CUSTOM_HOTSWAP_END() ENDIF BREAK CASE HOTSWAP_CAM_CHOPPER_TO_FRANKLIN PRINTLN("HOTSWAP_CAM_CHOPPER_TO_FRANKLIN") IF NOT sCamDetails.bSplineCreated DO_COMMON_CUSTOM_HOTSWAP_START(CAMTYPE_SPLINE_TIMED) IF IS_ALLOWED_INDEPENDENT_CAMERA_MODES() IF PLAYER_PED_ID() = GET_MICHAEL_PED() IF GET_CAM_VIEW_MODE_FOR_CONTEXT(CAM_VIEW_MODE_CONTEXT_IN_VEHICLE) = CAM_VIEW_MODE_FIRST_PERSON bSwitchToFirstPerson = TRUE ELSE bSwitchToFirstPerson = FALSE ENDIF ELSE IF GET_CAM_VIEW_MODE_FOR_CONTEXT(CAM_VIEW_MODE_CONTEXT_IN_HELI) = CAM_VIEW_MODE_FIRST_PERSON bSwitchToFirstPerson = TRUE ELSE bSwitchToFirstPerson = FALSE ENDIF ENDIF ELSE IF GET_CAM_VIEW_MODE_FOR_CONTEXT(GET_CAM_ACTIVE_VIEW_MODE_CONTEXT()) = CAM_VIEW_MODE_FIRST_PERSON bSwitchToFirstPerson = TRUE ELSE bSwitchToFirstPerson = FALSE ENDIF ENDIF IF PLAYER_PED_ID() = GET_MICHAEL_PED() IF NOT bSwitchToFirstPerson SETUP_SPLINE_CAM_NODE_ARRAY_HELI_MICHAEL_TO_FRANKLIN(scsSwitch_Heli_Michael_ToFranklin, GET_MICHAEL_PED(), GET_FRANKLIN_PED()) ELSE SETUP_SPLINE_CAM_NODE_ARRAY_HELI_MICHAEL_TO_FRANKLIN_FIRST_PERSON(scsSwitch_Heli_Michael_ToFranklin, GET_MICHAEL_PED(), GET_FRANKLIN_PED()) ENDIF eCurrentBranchedSwitchState = BRANCHED_SWITCH_MICHAEL_TO_FRANKLIN_ACTIVE ELSE IF NOT bSwitchToFirstPerson SETUP_SPLINE_CAM_NODE_ARRAY_HELI_TREVOR_TO_FRANKLIN(scsSwitch_Heli_Trevor_ToFranklin, snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], GET_FRANKLIN_PED()) ELSE SETUP_SPLINE_CAM_NODE_ARRAY_HELI_TREVOR_TO_FRANKLIN_FIRST_PERSON(scsSwitch_Heli_Trevor_ToFranklin, GET_TREVOR_PED(), GET_FRANKLIN_PED()) ENDIF eCurrentBranchedSwitchState = BRANCHED_SWITCH_TREVOR_TO_FRANKLIN_ACTIVE ENDIF eSwitchCamState = SWITCH_CAM_SETUP_SPLINE DO_COMMON_CUSTOM_HOTSWAP_END() ENDIF BREAK CASE HOTSWAP_CAM_FRANKLIN_TO_CHOPPER PRINTLN("HOTSWAP_CAM_FRANKLIN_TO_CHOPPER") IF NOT sCamDetails.bSplineCreated DO_COMMON_CUSTOM_HOTSWAP_START(CAMTYPE_SPLINE_TIMED) IF IS_ALLOWED_INDEPENDENT_CAMERA_MODES() IF targetCharacter = SELECTOR_PED_MICHAEL IF GET_CAM_VIEW_MODE_FOR_CONTEXT(CAM_VIEW_MODE_CONTEXT_IN_VEHICLE) = CAM_VIEW_MODE_FIRST_PERSON bSwitchToFirstPerson = TRUE ELSE bSwitchToFirstPerson = FALSE ENDIF ELSE IF GET_CAM_VIEW_MODE_FOR_CONTEXT(CAM_VIEW_MODE_CONTEXT_IN_HELI) = CAM_VIEW_MODE_FIRST_PERSON bSwitchToFirstPerson = TRUE ELSE bSwitchToFirstPerson = FALSE ENDIF ENDIF ELSE IF GET_CAM_VIEW_MODE_FOR_CONTEXT(GET_CAM_ACTIVE_VIEW_MODE_CONTEXT()) = CAM_VIEW_MODE_FIRST_PERSON bSwitchToFirstPerson = TRUE ELSE bSwitchToFirstPerson = FALSE ENDIF ENDIF IF NOT sCamDetails.bSplineCreated IF targetCharacter = SELECTOR_PED_MICHAEL IF NOT bSwitchToFirstPerson SETUP_SPLINE_CAM_NODE_ARRAY_FRANKLIN_TO_MICHAEL(scsSwitch_FranklinToHeli_Mike, GET_FRANKLIN_PED(), GET_MICHAEL_PED()) ELSE SETUP_SPLINE_CAM_NODE_ARRAY_FRANKLIN_TO_MICHAEL_FIRST_PERSON(scsSwitch_FranklinToHeli_Mike, GET_FRANKLIN_PED(), GET_MICHAEL_PED()) ENDIF eCurrentBranchedSwitchState = BRANCHED_SWITCH_FRANKLIN_TO_MICHAEL_ACTIVE ELSE IF NOT bSwitchToFirstPerson SETUP_SPLINE_CAM_NODE_ARRAY_FRANKLIN_TO_TREVOR(scsSwitch_FranklinToHeli_Trev, GET_FRANKLIN_PED(), snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) ELSE SETUP_SPLINE_CAM_NODE_ARRAY_FRANKLIN_TO_TREVOR_FIRST_PERSON(scsSwitch_FranklinToHeli_Trev, GET_FRANKLIN_PED(), GET_TREVOR_PED()) ENDIF eCurrentBranchedSwitchState = BRANCHED_SWITCH_FRANKLIN_TO_TREVOR_ACTIVE ENDIF eSwitchCamState = SWITCH_CAM_SETUP_SPLINE DO_COMMON_CUSTOM_HOTSWAP_END() DESTROY_MISSION_STATIC_CAM(staticCam) ENDIF ENDIF BREAK ENDSWITCH IF NOT bInstantSwap BOOL bDoingSwap SWITCH hotswapCam CASE HOTSWAP_CAM_DEFAULT bDoingSwap = RUN_CAM_SPLINE_FROM_PLAYER_TO_PED(sCamDetails) BREAK CASE HOTSWAP_CAM_INSIDE_CHOPPER bDoingSwap = HANDLE_SWITCH_CAM_HELI_TREVOR_TO_MICHAEL(scsSwitch_Heli_TrevorToMichael, TRUE) BREAK CASE HOTSWAP_CAM_FRANKLIN_TO_CHOPPER IF eCurrentBranchedSwitchState = BRANCHED_SWITCH_FRANKLIN_TO_MICHAEL_ACTIVE bDoingSwap = HANDLE_SWITCH_CAM_FRANKLIN_TO_HELI(scsSwitch_FranklinToHeli_Mike, TRUE) ELSE bDoingSwap = HANDLE_SWITCH_CAM_FRANKLIN_TO_HELI(scsSwitch_FranklinToHeli_Trev, TRUE) ENDIF BREAK CASE HOTSWAP_CAM_SNIPER_TO_HANGING bDoingSwap = RUN_CAM_SPLINE_FROM_PLAYER_TO_PED(sCamDetails, 1000.0, 1000.0, SELECTOR_CAM_STRAIGHT_INTERP, 0) BREAK CASE HOTSWAP_CAM_CHOPPER_TO_FRANKLIN IF eCurrentBranchedSwitchState = BRANCHED_SWITCH_MICHAEL_TO_FRANKLIN_ACTIVE bDoingSwap = HANDLE_SWITCH_CAM_HELI_TO_FRANKLIN(scsSwitch_Heli_Michael_ToFranklin, TRUE) ELSE bDoingSwap = HANDLE_SWITCH_CAM_HELI_TO_FRANKLIN(scsSwitch_Heli_Trevor_ToFranklin, TRUE) ENDIF BREAK CASE HOTSWAP_CAM_OUTSIDE_CHOPPER bDoingSwap = HANDLE_SWITCH_CAM_HELI_MICHAEL_TO_TREVOR(scsSwitch_Heli_MichaelToTrevor, TRUE) BREAK CASE HOTSWAP_CAM_HANGING_TO_SNIPER bDoingSwap = TRUE IF NOT bStartPushIn IF NOT RUN_CAM_SPLINE_FROM_PLAYER_TO_CAM(sCamDetails) bStartPushIn = TRUE ENDIF ELSE IF HANDLE_PUSH_IN(pushInData, TRUE, FALSE) bDoingSwap = FALSE ENDIF ENDIF BREAK ENDSWITCH // Disable camera input during transition. DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_LOOK_UD) DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_LOOK_LR) IF bDoingSwap IF sCamDetails.bOKToSwitchPed IF NOT sCamDetails.bPedSwitched IF TAKE_CONTROL_OF_SELECTOR_PED(sSelectorPeds, TRUE, bKeepTasks, tcfFlags) REAPPLY_PLAYER_PED_ATTRIBUTES(FALSE) sCamDetails.bPedSwitched = TRUE ENDIF ENDIF ENDIF ELSE CLEANUP_HOTSWAP_CAMERAS() IF DOES_CAM_EXIST(sCamDetails.camID) DESTROY_CAM(sCamDetails.camID) ENDIF DESTROY_PUSH_IN_CAMS(pushInData) IF hotswapCam = HOTSWAP_CAM_HANGING_TO_SNIPER SET_FIRST_PERSON_AIM_CAM_ZOOM_FACTOR(INIT_SNIPER_ZOOM) ENDIF REAPPLY_PLAYER_PED_ATTRIBUTES() hotswapStage = MISSION_HOTSWAP_STAGE_DONE #IF IS_DEBUG_BUILD bDebugJSkip = FALSE #ENDIF RETURN TRUE ENDIF ELSE IF TAKE_CONTROL_OF_SELECTOR_PED(sSelectorPeds, TRUE, bKeepTasks, tcfFlags) 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 // ensure chopper is hovering PROC MAINTAIN_CHOPPER_HOVER() IF IS_VEHICLE_DRIVEABLE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) IF NOT bPlayingHoverBackwards INT iReverseTime SWITCH currentMissionStage CASE STAGE_CHOPPER_CHASE iReverseTime = 47000 BREAK DEFAULT iReverseTime = 8900 BREAK ENDSWITCH IF GET_TIME_POSITION_IN_RECORDING(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) >= iReverseTime fHoverPlaybackSpeed = -CHOPPER_HOVER_SPEED bPlayingHoverBackwards = TRUE ENDIF ELSE INT iForwardTime SWITCH currentMissionStage CASE STAGE_CHOPPER_CHASE iForwardTime = 43000 BREAK DEFAULT iForwardTime = 1990 BREAK ENDSWITCH IF GET_TIME_POSITION_IN_RECORDING(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) <= iForwardTime fHoverPlaybackSpeed = CHOPPER_HOVER_SPEED bPlayingHoverBackwards = FALSE ENDIF ENDIF SET_PLAYBACK_SPEED(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], fHoverPlaybackSpeed) 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, "FBI2_B1AV1") OR ARE_STRINGS_EQUAL(tBanter, "FBI2_B1BV1") OR ARE_STRINGS_EQUAL(tBanter, "FBI2_B2AV1") OR ARE_STRINGS_EQUAL(tBanter, "FBI2_B2AV2") OR ARE_STRINGS_EQUAL(tBanter, "FBI2_B2BV2") OR ARE_STRINGS_EQUAL(tBanter, "FBI2_MKTALK") OR ARE_STRINGS_EQUAL(tBanter, "FBI2_MKTALK2") OR ARE_STRINGS_EQUAL(tBanter, "FBI2_TOCAR") OR ARE_STRINGS_EQUAL(tBanter, "FBI2_TOCAR2") 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(snatchAndGrabConversation, "FBI2AUD", tSavedBanterRoot, tResumeBanterLabel, CONV_PRIORITY_HIGH) RETURN TRUE ENDIF ENDIF ELSE RETURN TRUE ENDIF RETURN FALSE ENDFUNC // handle text for in car PROC HANDLE_GET_TO_LOCATION(BOOL bWithVehicle, BOOL bWithBuddy, BOOL bEnforceWantedLevel = FALSE, BOOL bRemoveOtherBlips = TRUE) PED_INDEX buddyPed VEHICLE_INDEX vehicle IF currentMissionStage = STAGE_GET_TO_CHOPPER buddyPed = davePed vehicle = snatchAndGrabVehicle[SAGV_MICHAEL_CAR] ELSE buddyPed = sSelectorPeds.pedID[SELECTOR_PED_MICHAEL] vehicle = snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER] ENDIF BOOL bPlayerVehicleOK = TRUE BOOL bBuddyVehicleOK = TRUE BOOL bBuddyGroupOK = TRUE BOOL bWantedLevelOK = TRUE BOOL bAllOK = FALSE IF bWithBuddy IF NOT IS_PED_INJURED(buddyPed) //IF NOT IS_PED_GROUP_MEMBER(buddyPed, PLAYER_GROUP_ID()) IF daveIntoCarState = DAVE_INTO_CAR_STATE_PAUSED bBuddyGroupOK = FALSE ENDIF ENDIF ENDIF IF bWithVehicle IF IS_VEHICLE_DRIVEABLE(vehicle) IF bWithBuddy IF NOT IS_PED_INJURED(buddyPed) IF NOT IS_PED_IN_VEHICLE(buddyPed, vehicle) bBuddyVehicleOK = FALSE ENDIF ENDIF ENDIF IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), vehicle) bPlayerVehicleOK = FALSE ENDIF ENDIF ENDIF IF bEnforceWantedLevel IF GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) > 0 bWantedLevelOK = FALSE ENDIF ENDIF IF bBuddyGroupOK // buddy is group member / not required to be in group IF bPlayerVehicleOK // player is in vehicle IF bWithVehicle IF iGetInTextStage < 2 iGetInTextStage = 2 ENDIF ENDIF IF bBuddyVehicleOK // stuff for first fly chopper stage IF currentMissionStage = STAGE_GET_TO_BUILDING // chopper help IF iHelpStage < 3 IF NOT IS_HELP_MESSAGE_BEING_DISPLAYED() IF GET_GAME_TIMER() >= iChopperHelpTime AND bDoneGotoSpeech SWITCH iHelpStage CASE 0 if not g_bMagDemoActive DO_MISSION_HELP_TEXT("SG_FLYHLP1") endif BREAK CASE 1 if not g_bMagDemoActive DO_MISSION_HELP_TEXT("SG_FLYHLP2") endif BREAK CASE 2 if not g_bMagDemoActive DO_MISSION_HELP_TEXT("SG_FLYHLP3") endif BREAK ENDSWITCH iHelpStage++ ENDIF ENDIF ENDIF // remove altitude help when airborne IF NOT bRemovedAltitudeHelp IF iHelpStage >= 2 bRemovedAltitudeHelp = TRUE ELSE FLOAT fGroundHeight FLOAT fHeightAboveGround VECTOR vPlayerPos = GET_ENTITY_COORDS(PLAYER_PED_ID()) GET_GROUND_Z_FOR_3D_COORD(vPlayerPos, fGroundHeight) IF fGroundHeight < 0 fGroundHeight = 0 ENDIF fHeightAboveGround = vPlayerPos.z - fGroundHeight IF fHeightAboveGround >= 15.0 IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("SG_FLYHLP1") IF GET_GAME_TIMER() >= iClearHelpTime + 1000 CLEAR_HELP(FALSE) iClearHelpTime = GET_GAME_TIMER() ENDIF ENDIF bRemovedAltitudeHelp = TRUE ENDIF ENDIF ENDIF ENDIF IF bWantedLevelOK bAllOK = TRUE bRemovedBlipsForWanted = FALSE //bKilledConversationOnWanted = FALSE bShownLoseWantedPrompt = FALSE // buddy is in the vehicle / not required to be in vehicle //blip the destination IF NOT DOES_BLIP_EXIST(getToBlip) AND currentMissionStage <> STAGE_CHOPPER_CHASE REMOVE_MISSION_TEXT(FALSE, TRUE, FALSE) REMOVE_ALL_BLIPS() SWITCH currentMissionStage CASE STAGE_GET_TO_CHOPPER IF NOT DOES_BLIP_EXIST(g_sMagDemoFBI2Entities.blip) getToBlip = CREATE_MISSION_BLIP_FOR_COORD(GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_MEETING_POINT), TRUE) ELSE g_sMagDemoFBI2Entities.bBlipActive = TRUE ENDIF BREAK CASE STAGE_GET_TO_BUILDING getToBlip = CREATE_MISSION_BLIP_FOR_COORD(GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_HOVER_TARGET)) BREAK CASE STAGE_DROPOFF getToBlip = CREATE_MISSION_BLIP_FOR_COORD(GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_DROPOFF)) BREAK ENDSWITCH ELSE IF DOES_BLIP_EXIST(vehicleBlip) REMOVE_BLIP(vehicleBlip) ENDIF ENDIF IF NOT bDoneGotoSpeech SWITCH currentMissionStage CASE STAGE_GET_TO_BUILDING bDoneGotoSpeech = DO_MISSION_SPEECH("FBI2_MGO") iChopperHelpTime = GET_GAME_TIMER() + 200 BREAK ENDSWITCH ENDIF // show god text IF NOT bShownGodText SWITCH currentMissionStage CASE STAGE_GET_TO_CHOPPER IF bDoneGotoSpeech AND bDoneGetToLotSpeech bShownGodText = DO_MISSION_GOD_TEXT("SG_GOLOC") ENDIF BREAK CASE STAGE_GET_TO_BUILDING IF bDoneGotoSpeech bShownGodText = DO_MISSION_GOD_TEXT("SG_GOBLD") ENDIF BREAK //CASE STAGE_CHOPPER_CHASE CASE STAGE_DROPOFF IF bDoneGotoSpeech bShownGodText = DO_MISSION_GOD_TEXT("SG_GOLND") ENDIF BREAK ENDSWITCH ENDIF ELSE IF NOT bRemovedBlipsForWanted REMOVE_ALL_BLIPS() bRemovedBlipsForWanted = TRUE ENDIF //IF NOT bKilledConversationOnWanted // STORE_BANTER() // KILL_ANY_CONVERSATION() // REMOVE_MISSION_TEXT(FALSE, TRUE, FALSE) // bKilledConversationOnWanted = TRUE //ELSE REMOVE_HELI_BLIP_AND_TEXT() REMOVE_CAR_BLIP_AND_TEXT() IF NOT bShownLoseWantedPrompt IF currentMissionStage <> STAGE_GET_TO_CHOPPER OR bDoneDaveWantedSpeech bShownLoseWantedPrompt = DO_MISSION_GOD_TEXT("LOSE_WANTED") ENDIF ENDIF //ENDIF ENDIF 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(buddyPed) ENDIF IF NOT bWaitForBuddyPrompt IF buddyPed = davePed bWaitForBuddyPrompt = DO_MISSION_GOD_TEXT("SG_WAITD") ELSE bWaitForBuddyPrompt = DO_MISSION_GOD_TEXT("SG_WAIT") ENDIF ENDIF ENDIF ELSE IF DOES_BLIP_EXIST(playerChopperBlip) REMOVE_BLIP(playerChopperBlip) ENDIF // removing help text IF currentMissionStage = STAGE_GET_TO_BUILDING // chopper help IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("SG_FLYHLP1") OR IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("SG_FLYHLP2") OR IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("SG_FLYHLP3") IF GET_GAME_TIMER() >= iClearHelpTime + 1000 CLEAR_HELP(FALSE) iClearHelpTime = GET_GAME_TIMER() ENDIF ENDIF ENDIF IF NOT DOES_BLIP_EXIST(vehicleBlip) REMOVE_MISSION_TEXT(FALSE, TRUE, FALSE) IF bRemoveOtherBlips REMOVE_ALL_BLIPS() ENDIF IF iGetInTextStage = 0 OR iGetInTextStage = 2 bShouldDoGetInText = TRUE ENDIF //IF currentMissionStage < STAGE_CHOPPER_CHASE vehicleBlip = CREATE_MISSION_BLIP_FOR_VEHICLE(vehicle) //ENDIF ENDIF IF bShouldDoGetInText STRING sGetInString IF currentMissionStage = STAGE_GET_TO_CHOPPER SWITCH iGetInTextStage CASE 0 sGetInString = "SG_GETDCAR1" BREAK CASE 2 sGetInString = "SG_GETDCAR2" BREAK ENDSWITCH ELSE SWITCH iGetInTextStage CASE 0 sGetInString = "CMN_GENGETINHE" BREAK CASE 2 sGetInString = "CMN_GENGETBCKHE" BREAK ENDSWITCH ENDIF IF bDoneGotoSpeech AND (bDoneDaveLetsGoSpeech OR currentMissionStage > STAGE_GET_TO_CHOPPER) IF DO_MISSION_GOD_TEXT(sGetInString) bShouldDoGetInText = FALSE iGetInTextStage++ ENDIF ENDIF ENDIF ENDIF ELSE // buddy is not group member IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), buddyPed, <<12, 12, 6>>) // re-add to group //SET_PED_AS_GROUP_MEMBER(buddyPed, 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(buddyPed) ENDIF IF NOT bGetBuddyPrompt IF buddyPed = davePed bGetBuddyPrompt = DO_MISSION_GOD_TEXT("SG_LEAVE") ELSE bGetBuddyPrompt = DO_MISSION_GOD_TEXT("CMN_MLEAVE") ENDIF ENDIF ENDIF ENDIF IF bAllOK IF IS_PLAYER_BROWSING_ITEMS_IN_ANY_SHOP() bAllOK = FALSE ENDIF ENDIF IF NOT bAllOK IF currentMissionStage <> STAGE_GET_TO_CHOPPER OR (bDaveInCar OR NOT bBuddyGroupOK) IF NOT bSavedBanter IF STORE_BANTER() KILL_ANY_CONVERSATION() ENDIF ENDIF ENDIF ENDIF ENDPROC // kill all guards PROC KILL_ALL_GUARDS() INT i REPEAT NUMBER_GUARDS i IF NOT IS_PED_INJURED(guardPed[i]) APPLY_DAMAGE_TO_PED(guardPed[i], 1000, TRUE) ENDIF ENDREPEAT REPEAT NUMBER_REINFORCEMENTS i IF NOT IS_PED_INJURED(reinforcementPed[i]) APPLY_DAMAGE_TO_PED(reinforcementPed[i], 1000, TRUE) ENDIF ENDREPEAT ENDPROC // maintain door open PROC MAINTAIN_DOOR_OPEN() // lock the chairs here too INT i REPEAT NUMBER_FROZEN_CHAIRS i IF NOT DOES_ENTITY_EXIST(frozenChairObject[i]) VECTOR vPos SWITCH i CASE 0 vPos = <<117.18, -621.4, 205.57>> BREAK CASE 1 vPos = <<115.69, -621.74, 205.63>> BREAK ENDSWITCH frozenChairObject[i] = GET_CLOSEST_OBJECT_OF_TYPE(vPos, 1.0, v_corp_offchair, FALSE) IF DOES_ENTITY_EXIST(frozenChairObject[i]) FREEZE_ENTITY_POSITION(frozenChairObject[i], TRUE) ENDIF ENDIF ENDREPEAT // main door needs to stay open - (for david - comment out this whole block to test door system) IF DOES_OBJECT_OF_TYPE_EXIST_AT_COORDS(<<118.78, -619.49, 205.05>>, 3.0, V_iLev_FIB_door1) IF fLockDoorOpen <> 0 SET_STATE_OF_CLOSEST_DOOR_OF_TYPE(V_iLev_FIB_door1, <<118.78, -619.49, 205.05>>, TRUE, fLockDoorOpen) ELSE BOOL bLocked FLOAT fOpenRatio GET_STATE_OF_CLOSEST_DOOR_OF_TYPE(V_iLev_FIB_door1, <<118.78, -619.49, 205.05>>, bLocked, fOpenRatio) IF fOpenRatio > 1.0 OR fOpenRatio < -1.0 fLockDoorOpen = fOpenRatio ENDIF ENDIF ENDIF DOOR_SYSTEM_SET_DOOR_STATE(DOORHASH_CLOSED_DOOR1, DOORSTATE_FORCE_LOCKED_THIS_FRAME) DOOR_SYSTEM_SET_DOOR_STATE(DOORHASH_CLOSED_DOOR2, DOORSTATE_FORCE_LOCKED_THIS_FRAME) // open door (for david - uncomment out to test door system /* DOOR_SYSTEM_SET_OPEN_RATIO(DOORHASH_OPEN_DOOR, DOOR_OPEN_RATIO) DOOR_SYSTEM_SET_DOOR_STATE(DOORHASH_OPEN_DOOR, DOORSTATE_FORCE_OPEN_THIS_FRAME) */ ENDPROC // handle fbi PROC HANDLE_FBI() INT i BOOL bFail // fail on attack REPEAT COUNT_OF(fbiPed) i IF DOES_ENTITY_EXIST(fbiPed[i]) IF NOT IS_PED_INJURED(fbiPed[i]) IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(fbiPed[i], PLAYER_PED_ID()) bFail = TRUE ENDIF IF currentMissionStage = STAGE_GET_TO_CHOPPER IF IS_PED_RAGDOLL(fbiPed[i]) IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), fbiPed[i], <<10,10,10>>, FALSE, FALSE) MISSION_FAILED(FAIL_CAUSED_TROUBLE) ENDIF ENDIF ENDIF ELSE bFail = TRUE ENDIF ENDIF ENDREPEAT IF DOES_ENTITY_EXIST(fbiVanVehicle) IF IS_VEHICLE_DRIVEABLE(fbiVanVehicle) // don't react to hitting the van with the chopper BOOL bCheckDamagerVehicle = TRUE IF IS_VEHICLE_DRIVEABLE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) IF GET_ENTITY_SPEED(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) < 25 bCheckDamagerVehicle = FALSE ENDIF ENDIF ENDIF IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(fbiVanVehicle, PLAYER_PED_ID(), bCheckDamagerVehicle) bFail = TRUE ENDIF ELSE bFail = TRUE ENDIF ENDIF REPEAT COUNT_OF(utilTruckVehicle) i IF DOES_ENTITY_EXIST(utilTruckVehicle[i]) IF IS_ENTITY_DEAD(utilTruckVehicle[i]) MISSION_FAILED(FAIL_CAUSED_TROUBLE) ENDIF ENDIF ENDREPEAT // fail for interfering with meeting IF currentMissionStage = STAGE_GET_TO_CHOPPER IF IS_VEHICLE_DRIVEABLE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], PLAYER_PED_ID()) MISSION_FAILED(FAIL_CAUSED_TROUBLE) ENDIF ENDIF IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR]) IF IS_PED_RAGDOLL(sSelectorPeds.pedID[SELECTOR_PED_TREVOR]) IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), sSelectorPeds.pedID[SELECTOR_PED_TREVOR], <<10,10,10>>, FALSE, FALSE) MISSION_FAILED(FAIL_CAUSED_TROUBLE) ENDIF ENDIF IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], PLAYER_PED_ID()) MISSION_FAILED(FAIL_CAUSED_TROUBLE) ENDIF ENDIF IF NOT IS_PED_INJURED(PLAYER_PED_ID()) IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN]) IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], <<1.5, 1.5, 2.0>>) DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_JUMP) ENDIF //IF IS_VEHICLE_DRIVEABLE(snatchAndGrabVehicle[SAGV_FRANKLIN_BIKE]) // IF GET_ENTITY_SPEED(snatchAndGrabVehicle[SAGV_FRANKLIN_BIKE]) > 0.5 // bTouching = TRUE // ENDIF //ENDIF IF IS_PED_RAGDOLL(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN]) IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], <<10,10,10>>, FALSE, FALSE) MISSION_FAILED(FAIL_CAUSED_TROUBLE) ENDIF ENDIF IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], PLAYER_PED_ID()) MISSION_FAILED(FAIL_CAUSED_TROUBLE) ENDIF ENDIF IF IS_VEHICLE_DRIVEABLE(snatchAndGrabVehicle[SAGV_FRANKLIN_BIKE]) IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(snatchAndGrabVehicle[SAGV_FRANKLIN_BIKE], PLAYER_PED_ID()) IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN]) SET_PED_TO_RAGDOLL(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], 2500, 2500, TASK_RELAX) //CLEAR_PED_TASKS(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN]) ENDIF FREEZE_ENTITY_POSITION(snatchAndGrabVehicle[SAGV_FRANKLIN_BIKE], FALSE) MISSION_FAILED(FAIL_CAUSED_TROUBLE) ENDIF ELSE IF DOES_ENTITY_EXIST(snatchAndGrabVehicle[SAGV_FRANKLIN_BIKE]) IF IS_ENTITY_DEAD(snatchAndGrabVehicle[SAGV_FRANKLIN_BIKE]) OR NOT IS_ENTITY_DEAD(snatchAndGrabVehicle[SAGV_FRANKLIN_BIKE]) FREEZE_ENTITY_POSITION(snatchAndGrabVehicle[SAGV_FRANKLIN_BIKE], FALSE) ENDIF ENDIF ENDIF ENDIF ENDIF IF bFail IF missionFailState = MISSION_FAIL_STATE_NOT_FAILED REPEAT COUNT_OF(fbiPed) i IF NOT IS_PED_INJURED(fbiPed[i]) SET_PED_RELATIONSHIP_GROUP_HASH(fbiPed[i], RELGROUPHASH_HATES_PLAYER) SET_PED_CAN_BE_TARGETTED(fbiPed[i], TRUE) CLEAR_SEQUENCE_TASK(sequence) OPEN_SEQUENCE_TASK(sequence) TASK_PAUSE(NULL, GET_RANDOM_INT_IN_RANGE(0, 800)) TASK_COMBAT_PED(NULL, PLAYER_PED_ID()) CLOSE_SEQUENCE_TASK(sequence) TASK_PERFORM_SEQUENCE(fbiPed[i], sequence) ENDIF ENDREPEAT MISSION_FAILED(FAIL_ATTACKED_FBI) ENDIF ELSE IF currentMissionStage >= STAGE_CHOPPER_CHASE IF IS_VEHICLE_DRIVEABLE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) AND NOT IS_PED_INJURED(GET_TREVOR_PED()) REPEAT COUNT_OF(fbiPed) i IF NOT IS_PED_INJURED(fbiPed[i]) IF i=0 IF NOT IS_PED_HEADTRACKING_ENTITY(fbiPed[i], GET_TREVOR_PED()) TASK_LOOK_AT_ENTITY(fbiPed[i], GET_TREVOR_PED(), -1, SLF_WHILE_NOT_IN_FOV) ENDIF ELSE VECTOR vOffset = GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(fbiPed[i], GET_ENTITY_COORDS(GET_TREVOR_PED())) IF vOffset.z >= 2.0 fBelowWaveHeightTime = 0.0 bResetTimeForBelowHeight = FALSE ELSE fBelowWaveHeightTime = fBelowWaveHeightTime +@ 1.0 IF NOT bResetTimeForBelowHeight iLastFBITaskTime = 0 bResetTimeForBelowHeight = TRUE ENDIF ENDIF IF vOffset.y >= 5 AND fBelowWaveHeightTime <= 1.0 IF NOT bDoneFBIWaveDownChopper IF GET_GAME_TIMER() >= iLastFBITaskTime + 2000 AND fBelowWaveHeightTime = 0.0 TASK_LOOK_AT_ENTITY(fbiPed[i], GET_TREVOR_PED(), -1, SLF_WHILE_NOT_IN_FOV) IF currentMissionStage >= STAGE_DROPOFF TASK_PLAY_ANIM(fbiPed[i], GET_SNATCH_AND_GRAB_ANIM_DICT_AS_STRING(SAG_ANIM_DICT_FLY_HOME), "Direct_Heli_loop", REALLY_SLOW_BLEND_IN, REALLY_SLOW_BLEND_OUT, -1, AF_LOOPING) ENDIF bDoneFBIWaveDownChopper = TRUE bDoneFBITurnToFaceChopper = FALSE iLastFBITaskTime = GET_GAME_TIMER() ENDIF ENDIF ELSE IF NOT bDoneFBITurnToFaceChopper IF GET_GAME_TIMER() >= iLastFBITaskTime + 3000 TASK_TURN_PED_TO_FACE_ENTITY(fbiPed[i], GET_TREVOR_PED()) bDoneFBITurnToFaceChopper = TRUE bDoneFBIWaveDownChopper = FALSE iLastFBITaskTime = GET_GAME_TIMER() ENDIF ELSE IF GET_GAME_TIMER() >= iLastFBITaskTime + 4000 bDoneFBITurnToFaceChopper = FALSE ENDIF ENDIF ENDIF ENDIF ENDIF ENDREPEAT ENDIF ENDIF ENDIF ENDPROC // get high rise area point FUNC VECTOR GET_HIGH_RISE_AREA_POINT(INT iPoint) SWITCH iPoint CASE 0 // bottom left RETURN <<-259.1, -1145.2, 200>> BREAK CASE 1 // bottom right RETURN <<245.1, -1145.2, 200>> BREAK CASE 2 // top right RETURN <<245.1, -483.6, 200>> BREAK CASE 3 // top left RETURN <<-259.1, -483.6, 200>> BREAK ENDSWITCH RETURN <<0,0,0>> ENDFUNC // get escape route point FUNC VECTOR GET_ESCAPE_ROUTE_POINT(INT iPoint) FLOAT fAngle = (360 / NUMBER_ESCAPE_ROUTE_POINTS) * TO_FLOAT(iPoint) VECTOR vCircleCentre = <<-75.12, -819.06, ESCAPE_ROUTE_HEIGHT>> VECTOR vCirclePoint = <<0,0,0>> CONST_FLOAT HELI_CIRCLE_RADIUS 450.0 vCirclePoint.x = vCircleCentre.x + (HELI_CIRCLE_RADIUS * COS(fAngle)) vCirclePoint.y = vCircleCentre.y + (HELI_CIRCLE_RADIUS * SIN(fAngle)) vCirclePoint.z = vCircleCentre.z RETURN vCirclePoint ENDFUNC // get leave high rise area point FUNC VECTOR GET_LEAVE_HIGH_RISE_AREA_POINT(INT iPoint) SWITCH iPoint CASE 0 RETURN <<-268.58, -1165.25, ESCAPE_ROUTE_HEIGHT>> BREAK CASE 1 RETURN <<56.39, -1128.32, ESCAPE_ROUTE_HEIGHT>> BREAK CASE 2 RETURN <<104.41, -999.78, ESCAPE_ROUTE_HEIGHT>> BREAK CASE 3 RETURN <<237.19, -871.54, ESCAPE_ROUTE_HEIGHT>> BREAK CASE 4 RETURN <<288.22, -641.40, ESCAPE_ROUTE_HEIGHT>> BREAK CASE 5 RETURN <<288.70, -548.61, ESCAPE_ROUTE_HEIGHT>> BREAK CASE 6 RETURN <<136.17, -461.98, ESCAPE_ROUTE_HEIGHT>> BREAK CASE 7 RETURN <<-47.05, -461.51, ESCAPE_ROUTE_HEIGHT>> BREAK CASE 8 RETURN <<-320.04, -588.73, ESCAPE_ROUTE_HEIGHT>> BREAK CASE 9 RETURN <<-371.64, -863.03, ESCAPE_ROUTE_HEIGHT>> BREAK ENDSWITCH RETURN <<0,0,0>> ENDFUNC // get escape point from high rise area point FUNC INT GET_NEXT_ESCAPE_POINT_FROM_LEAVE_HIGH_RISE_AREA_POINT(INT iPoint) SWITCH iPoint CASE 0 RETURN 1 BREAK CASE 1 RETURN 1 BREAK CASE 2 RETURN 1 BREAK CASE 3 RETURN 2 BREAK CASE 4 RETURN 2 BREAK CASE 5 RETURN 2 BREAK CASE 6 RETURN 3 BREAK CASE 7 RETURN 3 BREAK CASE 8 RETURN 0 BREAK CASE 9 RETURN 0 BREAK ENDSWITCH RETURN 0 ENDFUNC // is coord in high rise area FUNC BOOL IS_COORD_IN_HIGH_RISE_AREA(VECTOR vCoord) VECTOR vBottomLeft = GET_HIGH_RISE_AREA_POINT(0) VECTOR vTopRight = GET_HIGH_RISE_AREA_POINT(2) IF vCoord.x >= vBottomLeft.x AND vCoord.y >= vBottomLeft.y AND vCoord.x <= vTopRight.x AND vCoord.y <= vTopRight.y // cut out botton right which isn't that high-rise-y IF vCoord.x >= -46 AND vCoord.y <= -874 RETURN FALSE ELSE RETURN TRUE ENDIF ENDIF RETURN FALSE ENDFUNC // does line intersect high rise area? CONST_INT CHECK_LINE_INTERSECT_POINTS 15 FUNC BOOL DOES_LINE_INTERSECT_HIGH_RISE_AREA(VECTOR vPoint1, VECTOR vPoint2) FLOAT fDistX = vPoint2.x - vPoint1.x FLOAT fDistY = vPoint2.y - vPoint1.y FLOAT fPointStepX = fDistX / CHECK_LINE_INTERSECT_POINTS FLOAT fPointStepY = fDistY / CHECK_LINE_INTERSECT_POINTS INT i FOR i=1 TO CHECK_LINE_INTERSECT_POINTS-1 FLOAT fThisPointX = vPoint1.x + (i * fPointStepX) FLOAT fThisPointY = vPoint1.y + (i * fPointStepY) IF IS_COORD_IN_HIGH_RISE_AREA(<>) RETURN TRUE ENDIF ENDFOR RETURN FALSE ENDFUNC // does line intersect buildings CONST_INT CHECK_BUILDING_INTERSECT_POINTS 10 FUNC BOOL DOES_LINE_INTERSECT_BUILDINGS(VECTOR vPoint1, VECTOR vPoint2) FLOAT fCheckGroundHeight FLOAT fStoredGroundHeight FLOAT fDistX = vPoint2.x - vPoint1.x FLOAT fDistY = vPoint2.y - vPoint1.y FLOAT fPointStepX = fDistX / CHECK_BUILDING_INTERSECT_POINTS FLOAT fPointStepY = fDistY / CHECK_BUILDING_INTERSECT_POINTS GET_GROUND_Z_FOR_3D_COORD(vPoint1 + <<0,0,200>>, fStoredGroundHeight) INT i FOR i=1 TO CHECK_BUILDING_INTERSECT_POINTS-1 FLOAT fThisPointX = vPoint1.x + (i * fPointStepX) FLOAT fThisPointY = vPoint1.y + (i * fPointStepY) GET_GROUND_Z_FOR_3D_COORD(<>, fCheckGroundHeight) IF fCheckGroundHeight - fStoredGroundHeight >= 125 RETURN TRUE ENDIF fStoredGroundHeight = fCheckGroundHeight ENDFOR RETURN FALSE ENDFUNC // get best leave area point FUNC INT GET_BEST_LEAVE_HIGH_RISE_AREA_POINT(VECTOR vCoords) INT iReturnPoint = -1 FLOAT fClosestDistance = 99999999.0 FLOAT fThisDistance // which points are allowed INT i REPEAT NUMBER_LEAVE_HIGH_RISE_AREA_POINTS i VECTOR vPoint = GET_LEAVE_HIGH_RISE_AREA_POINT(i) IF NOT DOES_LINE_INTERSECT_BUILDINGS(vCoords, vPoint) fThisDistance = GET_DISTANCE_BETWEEN_COORDS(vCoords, vPoint, FALSE) IF IS_VEHICLE_DRIVEABLE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) // get offset VECTOR vOffset = GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], vPoint) IF vOffset.y >= 0 fThisDistance -= 500 ENDIF ENDIF IF fThisDistance < fClosestDistance fClosestDistance = fThisDistance iReturnPoint = i ENDIF ENDIF ENDREPEAT RETURN iReturnPoint ENDFUNC PROC TASK_TREVOR_MISSION(VECTOR vTarget, FLOAT fSpeed, FLOAT fDist, FLOAT fRot, INT iHeight, INT iMinHeight, BOOL bIsCached = FALSE) PED_INDEX trevorPed = GET_TREVOR_PED() IF NOT IS_PED_INJURED(trevorPed) AND IS_VEHICLE_DRIVEABLE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) IF trevorPed <> PLAYER_PED_ID() OR bIsCached IF NOT bDoneForceTrevorLow TASK_HELI_MISSION(trevorPed, snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], NULL, NULL, vTarget, MISSION_GOTO, fSpeed, fDist, fRot, iHeight, iMinHeight) PRINTSTRING("trevor tasked mission!") printnl() ENDIF ENDIF IF NOT bIsCached bTrevorCachedTarget = TRUE ENDIF ENDIF ENDPROC // trevor fly to route point PROC DO_TREVOR_FLY_TO_ROUTE_POINT(INT iCustomHeight = -1, INT iCustomHeightAboveGround = -1, FLOAT fCustomSpeed = -1.0, FLOAT fCustomDistance = -1.0) IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR]) AND IS_VEHICLE_DRIVEABLE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) INT iFlightHeight INT iMinHeightAboveGround FLOAT fSpeed FLOAT fDistance IF iCustomHeight >= 0 iFlightHeight = iCustomHeight ELSE iFlightHeight = 220 ENDIF IF iCustomHeightAboveGround >= 0 iMinHeightAboveGround = iCustomHeightAboveGround ELSE iMinHeightAboveGround = 50 ENDIF IF fCustomSpeed >= 0 fSpeed = fCustomSpeed ELSE fSpeed = 40 ENDIF IF fCustomDistance >= 0 fDistance = fCustomDistance ELSE fDistance = 8 ENDIF TASK_TREVOR_MISSION(vTrevorRoutePoint[iTrevorRouteStage] + <<0,0,15>>, fSpeed, fDistance, -1, iFlightHeight, iMinHeightAboveGround) ENDIF ENDPROC // trevor fly to leave area point PROC DO_TREVOR_FLY_TO_LEAVE_AREA_POINT() IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR]) AND IS_VEHICLE_DRIVEABLE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) VECTOR vLeavePoint = GET_LEAVE_HIGH_RISE_AREA_POINT(iLeaveHighRiseAreaPoint) //TASK_HELI_MISSION(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], NULL, NULL, vLeavePoint, MISSION_GOTO, 40.0, 1.0, -1, FLOOR(vLeavePoint.z), 50) TASK_TREVOR_MISSION(vLeavePoint, 40.0, 1.0, -1, FLOOR(vLeavePoint.z), 50) ENDIF ENDPROC // does heading match FUNC BOOL IS_VEHICLE_AT_HEADING(VEHICLE_INDEX vehicle, FLOAT fTargetHeading, FLOAT allowAngleFrom0 = 25.0) FLOAT fVehicleHeading = NORMALISE_HEADING(GET_ENTITY_HEADING(vehicle)) FLOAT fHeadingDiff = fVehicleHeading - fTargetHeading IF fHeadingDiff < 0 fHeadingDiff *= -1 ENDIF IF fHeadingDiff <= allowAngleFrom0 OR fHeadingDiff >= 360 - allowAngleFrom0 RETURN TRUE ENDIF RETURN FALSE ENDFUNC // rotate to face leave area point PROC HANDLE_LEAVE_HIGH_RISE_AREA() IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR]) AND IS_VEHICLE_DRIVEABLE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) IF NOT bStartedRotateToLeaveHighRiseArea // give task to rotate to the correct heading first IF iLeaveHighRiseAreaPoint >= 0 VECTOR vChopperPos = GET_ENTITY_COORDS(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) VECTOR vTargetPos = GET_LEAVE_HIGH_RISE_AREA_POINT(iLeaveHighRiseAreaPoint) fTargetChopperRotate = GET_HEADING_FROM_VECTOR_2D(vTargetPos.x - vChopperPos.x, vTargetPos.y - vChopperPos.y) fTargetChopperRotate = NORMALISE_HEADING(fTargetChopperRotate) //TASK_HELI_MISSION(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], NULL, NULL, vChopperPos, MISSION_GOTO, 10, 10, fTargetChopperRotate, FLOOR(vChopperPos.z), 1) TASK_TREVOR_MISSION(vChopperPos, 10, 50, fTargetChopperRotate, FLOOR(vChopperPos.z), 1) ENDIF bStartedRotateToLeaveHighRiseArea = TRUE ELSE IF NOT bStartedJourneyToLeaveHighRiseArea IF IS_VEHICLE_AT_HEADING(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], fTargetChopperRotate, 10) DO_TREVOR_FLY_TO_LEAVE_AREA_POINT() bStartedJourneyToLeaveHighRiseArea = TRUE ENDIF ENDIF ENDIF ENDIF ENDPROC // trevor fly to dropoff PROC DO_TREVOR_FLY_TO_DROPOFF() IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR]) AND IS_VEHICLE_DRIVEABLE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) //IF IS_PED_SITTING_IN_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) VECTOR vHeliCoords = GET_ENTITY_COORDS(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) iLeaveHighRiseAreaPoint = -1 IF IS_COORD_IN_HIGH_RISE_AREA(vHeliCoords) // starting within high rise area. have to plot out first iLeaveHighRiseAreaPoint = GET_BEST_LEAVE_HIGH_RISE_AREA_POINT(vHeliCoords) ENDIF IF iLeaveHighRiseAreaPoint < 0 // not starting within the high rise area IF DOES_LINE_INTERSECT_HIGH_RISE_AREA(vHeliCoords, GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_DROPOFF)) // can we get to 1 straight IF NOT DOES_LINE_INTERSECT_HIGH_RISE_AREA(vHeliCoords, GET_HIGH_RISE_AREA_POINT(1)) iTrevorRouteStage = 1 vTrevorRoutePoint[1] = GET_HIGH_RISE_AREA_POINT(1) // nope? can we get to 2 straight ELIF NOT DOES_LINE_INTERSECT_HIGH_RISE_AREA(vHeliCoords, GET_HIGH_RISE_AREA_POINT(2)) iTrevorRouteStage = 1 vTrevorRoutePoint[1] = GET_HIGH_RISE_AREA_POINT(2) ELSE // can't get to either 1 or 2. plot a route to the closest of 3 and 0, then onto 2 or 1, then destination iTrevorRouteStage = 2 FLOAT fDistTo3 = GET_DISTANCE_BETWEEN_COORDS(vHeliCoords, GET_HIGH_RISE_AREA_POINT(3), FALSE) FLOAT fDistTo0 = GET_DISTANCE_BETWEEN_COORDS(vHeliCoords, GET_HIGH_RISE_AREA_POINT(0), FALSE) IF fDistTo3 < fDistTo0 vTrevorRoutePoint[2] = GET_HIGH_RISE_AREA_POINT(3) vTrevorRoutePoint[1] = GET_HIGH_RISE_AREA_POINT(2) ELSE vTrevorRoutePoint[2] = GET_HIGH_RISE_AREA_POINT(0) vTrevorRoutePoint[1] = GET_HIGH_RISE_AREA_POINT(1) ENDIF ENDIF ELSE // can just go straight iTrevorRouteStage = 0 ENDIF vTrevorRoutePoint[0] = GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_DROPOFF) DO_TREVOR_FLY_TO_ROUTE_POINT() ELSE bStartedRotateToLeaveHighRiseArea = FALSE bStartedJourneyToLeaveHighRiseArea = FALSE ENDIF //ENDIF ENDIF ENDPROC // trevor fly to an escape route point PROC TREVOR_FLY_TO_ESCAPE_ROUTE_POINT(INT iPoint) IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR]) AND IS_VEHICLE_DRIVEABLE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) //IF IS_PED_SITTING_IN_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) // get orientation to fly VECTOR vChopperPos = GET_ENTITY_COORDS(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) VECTOR vTargetPos = GET_ESCAPE_ROUTE_POINT(iPoint) FLOAT fOrientation = GET_HEADING_FROM_VECTOR_2D(vTargetPos.x - vChopperPos.x, vTargetPos.y - vChopperPos.y) //TASK_HELI_MISSION(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], NULL, NULL, vTargetPos, MISSION_GOTO, 40, 1, fOrientation, FLOOR(vTargetPos.z), 20) TASK_TREVOR_MISSION(vTargetPos, 40, 1, fOrientation, FLOOR(vTargetPos.z), 20) //ENDIF ENDIF ENDPROC // get closest escape route point FUNC INT GET_CLOSEST_ESCAPE_ROUTE_POINT FLOAT fClosestDistance = 9999999.0 INT iCLosestPoint = -1 INT i REPEAT NUMBER_ESCAPE_ROUTE_POINTS i VECTOR vPointPos = GET_ESCAPE_ROUTE_POINT(i) FLOAT fThisDistance = GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR]), vPointPos ) // get offset IF IS_VEHICLE_DRIVEABLE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) VECTOR vOffset = GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], vPointPos) IF vOffset.y >= 0 fThisDistance -= 300 ELIF vOffset.y >= -150 fThisDistance -= 150 ENDIF IF IS_ENTITY_AT_COORD(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], vPointPos, <<100,100,100>>) fThisDistance += 10000 ENDIF ENDIF IF fThisDistance < fClosestDistance fClosestDistance = fThisDistance iClosestPoint = i ENDIF ENDREPEAT RETURN iClosestPoint ENDFUNC // trevor fly an escape route PROC DO_TREVOR_FLY_ESCAPE_ROUTE() IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR]) AND IS_VEHICLE_DRIVEABLE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) //IF IS_PED_SITTING_IN_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) IF iTrevorEscapeRoutePoint < 0 IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) VECTOR vChopperPos = GET_ENTITY_COORDS(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) IF NOT bAllowStartEscapeRoute IF iLeaveHighRiseAreaPoint < 0 IF IS_COORD_IN_HIGH_RISE_AREA(vChopperPos) iLeaveHighRiseAreaPoint = GET_BEST_LEAVE_HIGH_RISE_AREA_POINT(vChopperPos) bStartedRotateToLeaveHighRiseArea = FALSE bStartedJourneyToLeaveHighRiseArea = FALSE //PRINTSTRING("setting leave high rise point to ") PRINTINT(iLeaveHighRiseAreaPoint) PRINTNL() // safety just in case can't find a point IF iLeaveHighRiseAreaPoint < 0 bAllowStartEscapeRoute = TRUE ENDIF ELSE bAllowStartEscapeRoute = TRUE ENDIF ELSE HANDLE_LEAVE_HIGH_RISE_AREA() // PRINTSTRING("leaving high rise area") PRINTNL() IF GET_DISTANCE_BETWEEN_COORDS(vChopperPos, GET_LEAVE_HIGH_RISE_AREA_POINT(iLeaveHighRiseAreaPoint), FALSE) <= 30 OR NOT IS_COORD_IN_HIGH_RISE_AREA(vChopperPos) iTrevorEscapeRoutePoint = GET_NEXT_ESCAPE_POINT_FROM_LEAVE_HIGH_RISE_AREA_POINT(iLeaveHighRiseAreaPoint) TREVOR_FLY_TO_ESCAPE_ROUTE_POINT(iTrevorEscapeRoutePoint) bAllowStartEscapeRoute = TRUE ENDIF ENDIF ELSE INT iClosestPoint = GET_CLOSEST_ESCAPE_ROUTE_POINT() IF iClosestPoint >= 0 iTrevorEscapeRoutePoint = iClosestPoint TREVOR_FLY_TO_ESCAPE_ROUTE_POINT(iTrevorEscapeRoutePoint) ENDIF ENDIF ELSE IF GET_TIME_POSITION_IN_RECORDING(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) >= 40000 STOP_PLAYBACK_RECORDED_VEHICLE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) ENDIF ENDIF ELSE IF IS_ENTITY_AT_COORD(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], GET_ESCAPE_ROUTE_POINT(iTrevorEscapeRoutePoint), <<80,80,80>>) INT iClosestPoint = GET_CLOSEST_ESCAPE_ROUTE_POINT() IF iClosestPoint >= 0 iTrevorEscapeRoutePoint = iClosestPoint printstring("do closest route") printnl() TREVOR_FLY_TO_ESCAPE_ROUTE_POINT(iTrevorEscapeRoutePoint) ENDIF ENDIF ENDIF //ENDIF ENDIF ENDPROC /* // close all chopper doors PROC CLOSE_ALL_CHOPPER_DOORS() IF IS_VEHICLE_DRIVEABLE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) SET_VEHICLE_DOOR_CONTROL(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], SC_DOOR_FRONT_RIGHT, DT_DOOR_INTACT, 0.0) SET_VEHICLE_DOOR_CONTROL(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], SC_DOOR_FRONT_LEFT, DT_DOOR_INTACT, 0.0) ENDIF ENDPROC */ // close all chopper doors PROC SHUT_ALL_CHOPPER_DOORS() IF IS_VEHICLE_DRIVEABLE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) SET_VEHICLE_DOOR_SHUT(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], SC_DOOR_FRONT_RIGHT) SET_VEHICLE_DOOR_SHUT(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], SC_DOOR_FRONT_LEFT) ENDIF ENDPROC /* // latch all chopper doors PROC LATCH_ALL_CHOPPER_DOORS() IF IS_VEHICLE_DRIVEABLE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) SET_VEHICLE_DOOR_LATCHED(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], SC_DOOR_FRONT_RIGHT, TRUE, TRUE) SET_VEHICLE_DOOR_LATCHED(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], SC_DOOR_FRONT_LEFT, TRUE, TRUE) ENDIF ENDPROC */ // common stuff for cutscene skip PROC HANDLE_SKIP_CUTSCENE() IF IS_CUTSCENE_SKIP_BUTTON_JUST_PRESSED() AND GET_GAME_TIMER() >= iAllowSkipCutsceneTime + 1000 // PRINTSTRING("handle skip cutscene!!!!") PRINTNL() DO_SCREEN_FADE_OUT(DEFAULT_FADE_TIME) WHILE NOT IS_SCREEN_FADED_OUT() WAIT(0) ENDWHILE HANG_UP_AND_PUT_AWAY_PHONE() KILL_ANY_CONVERSATION() bSkippedCutscene = TRUE cutsceneStage = SAG_CUT_STAGE_CLEANUP ENDIF ENDPROC FUNC RAGDOLL_BLOCKING_FLAGS GET_STEVE_RAGDOLL_BLOCKING() RETURN RBF_PLAYER_IMPACT | RBF_VEHICLE_IMPACT | RBF_IMPACT_OBJECT ENDFUNC // food court cutscene procedure PROC DO_FOOD_COURT_CUTSCENE() SET_ALL_RANDOM_PEDS_FLEE_THIS_FRAME(PLAYER_ID()) SWITCH cutsceneStage CASE SAG_CUT_STAGE_INIT iSnatchAndGrabCutsceneTime = GET_GAME_TIMER() UPDATE_FOOD_COURT(TRUE, STAGE_GET_TO_CHOPPER) REGISTER_ENTITY_FOR_CUTSCENE(PLAYER_PED_ID(), "Michael", CU_ANIMATE_EXISTING_SCRIPT_ENTITY) IF NOT IS_PED_INJURED(davePed) TASK_CLEAR_LOOK_AT(davePed) REGISTER_ENTITY_FOR_CUTSCENE(davePed, "Dave_FBI", CU_ANIMATE_EXISTING_SCRIPT_ENTITY) ENDIF IF NOT IS_PED_INJURED(stevePed) TASK_CLEAR_LOOK_AT(stevePed) REGISTER_ENTITY_FOR_CUTSCENE(stevePed, "Steve_FBI", CU_ANIMATE_EXISTING_SCRIPT_ENTITY) ENDIF IF NOT IS_PED_INJURED(andreasPed) TASK_CLEAR_LOOK_AT(andreasPed) REGISTER_ENTITY_FOR_CUTSCENE(andreasPed, "Andreas_Sanchez", CU_ANIMATE_EXISTING_SCRIPT_ENTITY) ENDIF IF NOT IS_PED_INJURED(PLAYER_PED_ID()) TASK_CLEAR_LOOK_AT(PLAYER_PED_ID()) ENDIF SET_VEHICLE_POPULATION_BUDGET(0) SET_PED_POPULATION_BUDGET(0) START_CUTSCENE() SET_CUTSCENE_FADE_VALUES(FALSE, FALSE, FALSE, FALSE) REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST) bSteveSeated = FALSE bAndreasSeated = FALSE cutsceneStage = SAG_CUT_STAGE_RUNNING BREAK CASE SAG_CUT_STAGE_RUNNING IF NOT bClearedForCutscene IF IS_CUTSCENE_PLAYING() STOP_GAMEPLAY_HINT() DISABLE_PEDS_AT_FOOD_COURT() INT i REPEAT 3 i IF DOES_ENTITY_EXIST(coffeeObject[i]) DELETE_OBJECT(coffeeObject[i]) ENDIF ENDREPEAT RESOLVE_VEHICLES_INSIDE_ANGLED_AREA_WITH_SIZE_LIMIT(<<143.198, -672.684, 40.527>>, <<147.880, -682.373, 45.027>>, 11, <<137.951, -687.184, 41.02800>>, -73.60, GET_DEFAULT_ALLOWABLE_VEHICLE_SIZE_VECTOR(), TRUE, FALSE, TRUE) RESOLVE_VEHICLES_INSIDE_ANGLED_AREA_WITH_SIZE_LIMIT(<<82.758, -675.976, 42.111>>, <<86.172, -666.734, 44.785>>, 10, <<78.49797, -686.12238, 43.10218>>, -23, GET_DEFAULT_ALLOWABLE_VEHICLE_SIZE_VECTOR(), TRUE, FALSE, TRUE) CLEAR_AREA(<<148.27441, -677.23914, 41.84525>>, 3.5, TRUE) CLEAR_AREA_OF_PROJECTILES(<<148.27441, -677.23914, 41.84525>>, 20) STOP_FIRE_IN_RANGE(<<148.27441, -677.23914, 41.84525>>, 20) REMOVE_PARTICLE_FX_IN_RANGE(<<148.27441, -677.23914, 41.84525>>, 20) PREVENT_WANTED_LEVEL_FOR_CUTSCENE() REMOVE_ALL_BLIPS() SET_MISSION_MOCAP_CUTSCENE() IF IS_SCREEN_FADED_OUT() DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME) ENDIF bClearedForCutscene = TRUE ENDIF ENDIF SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0) SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0) // 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_GET_TO_CHOPPER) bDoneIntroCreateEntities = TRUE ENDIF ENDIF ENDIF IF NOT bPrestreamedLine IF GET_GAME_TIMER() >= 1000 PRELOAD_CONVERSATION(snatchAndGrabConversation, "FBI2AUD", "FBI2_OLDDOG", CONV_PRIORITY_MEDIUM) bPrestreamedLine = TRUE ENDIF ENDIF IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("prop_chair_01a") AND CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("prop_chair_01a^1") AND CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("prop_chair_01a^2") AND CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("prop_chair_01a^3") ENDIF IF WAS_CUTSCENE_SKIPPED() bSkippedCutscene = TRUE ENDIF IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Michael") SET_ENTITY_COORDS(PLAYER_PED_ID(), GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_PLAYER_INIT2)) SET_ENTITY_HEADING(PLAYER_PED_ID(), PLAYER_INIT_ROT2) IF GET_FOLLOW_PED_CAM_VIEW_MODE() <> CAM_VIEW_MODE_FIRST_PERSON FORCE_PED_MOTION_STATE(PLAYER_PED_ID(), MS_ON_FOOT_WALK, FALSE, FAUS_CUTSCENE_EXIT) SET_PED_MIN_MOVE_BLEND_RATIO(PLAYER_PED_ID(), PEDMOVE_WALK) ELSE FORCE_PED_MOTION_STATE(PLAYER_PED_ID(), MS_AIMING, FALSE, FAUS_CUTSCENE_EXIT) SIMULATE_PLAYER_INPUT_GAIT(PLAYER_ID(), PEDMOVE_WALK, 2000) ENDIF bSetMichaelToWalk = TRUE ELSE IF bSetMichaelToWalk SET_PED_MIN_MOVE_BLEND_RATIO(PLAYER_PED_ID(), PEDMOVE_WALK) ENDIF ENDIF IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Dave_FBI") IF NOT IS_PED_INJURED(davePed) ENDIF ENDIF IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Steve_FBI") SET_STEVE_SEATED(FALSE) ENDIF IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Andreas_Sanchez") SET_ANDREAS_SEATED(FALSE) ENDIF IF CAN_SET_EXIT_STATE_FOR_CAMERA() BOOL bCacheSkippedCutscene bCacheSkippedCutscene = bSkippedCutscene IF bCacheSkippedCutscene bPrestreamedLine = FALSE ENDIF SET_MISSION_CUTSCENE(FALSE, TRUE, FALSE, FALSE, FALSE, FALSE) SET_MISSION_STAGE(STAGE_GET_TO_CHOPPER, bCacheSkippedCutscene, FALSE, TRUE, FALSE, FALSE) SET_GAMEPLAY_CAM_RELATIVE_HEADING() SET_GAMEPLAY_CAM_RELATIVE_PITCH() REPLAY_STOP_EVENT() ENDIF #IF IS_DEBUG_BUILD IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_J) STOP_CUTSCENE() WHILE NOT IS_SCREEN_FADED_OUT() WAIT(0) ENDWHILE ENDIF #ENDIF BREAK CASE SAG_CUT_STAGE_CLEANUP BREAK ENDSWITCH ENDPROC PROC FAIL_FOOD_COURT() // fail for messing around at food court IF IS_PED_SHOOTING_IN_AREA(PLAYER_PED_ID(), <<112.42545, -697.93341, 38.02730>>, <<180.05025, -654.66302, 53.14103>>, FALSE) OR IS_EXPLOSION_IN_AREA(EXP_TAG_DONTCARE, <<112.42545, -697.93341, 38.02730>>, <<180.05025, -654.66302, 53.14103>>) OR (currentMissionStage = STAGE_FOOD_COURT AND GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) > 0) OR (NOT bDaveInCar AND GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) > 0) MISSION_FAILED(FAIL_TROUBLE_FOOD_COURT) ENDIF IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) VEHICLE_INDEX playerVehicle = GET_VEHICLE_PED_IS_USING(PLAYER_PED_ID()) IF IS_VEHICLE_DRIVEABLE(playerVehicle) IF GET_ENTITY_SPEED(playerVehicle) >= 1 IF DOES_ENTITY_EXIST(foodCourtChairObject[0]) IF IS_ENTITY_TOUCHING_ENTITY(playerVehicle, foodCourtChairObject[0]) MISSION_FAILED(FAIL_TROUBLE_FOOD_COURT) ENDIF ENDIF IF DOES_ENTITY_EXIST(foodCourtChairObject[2]) IF IS_ENTITY_TOUCHING_ENTITY(playerVehicle, foodCourtChairObject[2]) MISSION_FAILED(FAIL_TROUBLE_FOOD_COURT) ENDIF ENDIF ENDIF ENDIF ENDIF ENDPROC // do food court stage PROC DO_STAGE_FOOD_COURT() IF NOT bRunningCutscene UPDATE_FOOD_COURT(FALSE, STAGE_FOOD_COURT) IF NOT bShownGodText bShownGodText = DO_MISSION_GOD_TEXT("SG_GDAVE", TRUE, TRUE) ENDIF // fails IF DOES_ENTITY_EXIST(stevePed) IF IS_PED_INJURED(stevePed) MISSION_FAILED(FAIL_STEVE_DEAD) ELSE IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(stevePed, PLAYER_PED_ID()) MISSION_FAILED(FAIL_TROUBLE_FOOD_COURT) ENDIF ENDIF ENDIF IF DOES_ENTITY_EXIST(andreasPed) IF IS_PED_INJURED(andreasPed) MISSION_FAILED(FAIL_ANDREAS_DEAD) ELSE IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(andreasPed, PLAYER_PED_ID()) MISSION_FAILED(FAIL_TROUBLE_FOOD_COURT) ENDIF ENDIF ENDIF IF DOES_ENTITY_EXIST(davePed) IF IS_PED_INJURED(davePed) MISSION_FAILED(FAIL_DAVE_DEAD) ELSE IF GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), davePed, FALSE) > ABANDON_BUDDY_FAIL_RANGE MISSION_FAILED(FAIL_ABANDONED_DAVE) ENDIF IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(davePed, PLAYER_PED_ID()) MISSION_FAILED(FAIL_TROUBLE_FOOD_COURT) ENDIF ENDIF ENDIF FAIL_FOOD_COURT() // force walk IF GET_FOLLOW_PED_CAM_VIEW_MODE() <> CAM_VIEW_MODE_FIRST_PERSON IF GET_GAME_TIMER() <= iStartMissionStageTime + 1300 SET_PED_MIN_MOVE_BLEND_RATIO(PLAYER_PED_ID(), PEDMOVE_WALK) ENDIF ENDIF VECTOR vTriggerPosition = <<149.32559, -678.15710, 41.02899>> VECTOR vPlayerPos = GET_ENTITY_COORDS(PLAYER_PED_ID()) FLOAT fDistanceSquaredFromTrigger = VDIST2(vPlayerPos, vTriggerPosition) BOOL bDoHintCam = FALSE IF fDistanceSquaredFromTrigger < (14.0 * 14.0) IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) SET_PED_MAX_MOVE_BLEND_RATIO(PLAYER_PED_ID(), PEDMOVE_WALK) DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SPRINT) DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_JUMP) DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK_HEAVY) DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK_LIGHT) DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK_ALTERNATE) IF fDistanceSquaredFromTrigger < (8 * 8) SET_GAMEPLAY_HINT_CAMERA_BLEND_TO_FOLLOW_PED_MEDIUM_VIEW_MODE(TRUE) IF GET_FOLLOW_PED_CAM_VIEW_MODE() <> CAM_VIEW_MODE_FIRST_PERSON SET_GAMEPLAY_COORD_HINT(<<147.9,-676.0, 42.2>>, -1, 2000) SET_GAMEPLAY_HINT_CAMERA_RELATIVE_SIDE_OFFSET(0.02) SET_GAMEPLAY_HINT_CAMERA_RELATIVE_VERTICAL_OFFSET(-0.01) ELSE SET_GAMEPLAY_COORD_HINT(<<148.6, -677.0, 42.3>>, -1, 2000) SET_GAMEPLAY_HINT_CAMERA_RELATIVE_SIDE_OFFSET(0) SET_GAMEPLAY_HINT_CAMERA_RELATIVE_VERTICAL_OFFSET(0) ENDIF SET_GAMEPLAY_HINT_FOLLOW_DISTANCE_SCALAR(0.4) SET_GAMEPLAY_HINT_FOV(40) bDoHintCam = TRUE ENDIF ENDIF ENDIF IF NOT bDoHintCam STOP_GAMEPLAY_HINT() ENDIF IF NOT bTriggeredGreetingAnim HANDLE_STREAMING_MOCAP("fbi_2_int", <<149.32559, -678.15710, 41.02899>>, 28, 40) IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY() IF NOT IS_PED_INJURED(davePed) SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Dave_FBI", davePed) ENDIF IF NOT IS_PED_INJURED(stevePed) SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Steve_FBI", stevePed) ENDIF IF NOT IS_PED_INJURED(andreasPed) SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Andreas_Sanchez", andreasPed) ENDIF ENDIF IF fDistanceSquaredFromTrigger < (9*9) IF vPlayerPos.z > 41.0 AND vPlayerPos.z < 44.0 iSyncScene = CREATE_SYNCHRONIZED_SCENE(<<148.31, -677.19, 41.02>>, <<0,0,0>>) IF NOT IS_PED_INJURED(davePed) TASK_LOOK_AT_ENTITY(PLAYER_PED_ID(), davePed, -1, SLF_WHILE_NOT_IN_FOV) TASK_SYNCHRONIZED_SCENE(davePed, iSyncScene, "MISSFBI2@LeadInOut", "FBI_2_INT_LeadIn_action_DaveN", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, SYNCED_SCENE_USE_PHYSICS | SYNCED_SCENE_DONT_INTERRUPT, GET_STEVE_RAGDOLL_BLOCKING()) // TASK_LOOK_AT_ENTITY(davePed, PLAYER_PED_ID(), -1, SLF_WHILE_NOT_IN_FOV, SLF_LOOKAT_VERY_HIGH) ENDIF IF NOT IS_PED_INJURED(stevePed) TASK_SYNCHRONIZED_SCENE(stevePed, iSyncScene, "MISSFBI2@LeadInOut", "FBI_2_INT_LeadIn_action_Steve", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, SYNCED_SCENE_USE_PHYSICS | SYNCED_SCENE_DONT_INTERRUPT, GET_STEVE_RAGDOLL_BLOCKING()) TASK_LOOK_AT_ENTITY(stevePed, PLAYER_PED_ID(), -1, SLF_WHILE_NOT_IN_FOV, SLF_LOOKAT_VERY_HIGH) ENDIF IF NOT IS_PED_INJURED(andreasPed) TASK_SYNCHRONIZED_SCENE(andreasPed, iSyncScene, "MISSFBI2@LeadInOut", "FBI_2_INT_LeadIn_action_Andreas", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, SYNCED_SCENE_USE_PHYSICS | SYNCED_SCENE_DONT_INTERRUPT, GET_STEVE_RAGDOLL_BLOCKING()) TASK_LOOK_AT_ENTITY(andreasPed, PLAYER_PED_ID(), -1, SLF_WHILE_NOT_IN_FOV, SLF_LOOKAT_VERY_HIGH) ENDIF bTriggeredGreetingAnim = TRUE ENDIF ENDIF ELSE IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) IF IS_VEHICLE_DRIVEABLE(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())) IF BRING_VEHICLE_TO_HALT_AND_DISABLE_VEH_CONTROLS(GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID()), 10) IF NOT bPlayerLeaveVehicle TASK_LEAVE_ANY_VEHICLE(PLAYER_PED_ID()) bPlayerLeaveVehicle = TRUE ENDIF ENDIF ENDIF ENDIF IF NOT bTriggeredGreetingSpeech IF NOT IS_PED_INJURED(davePed) IF IS_SYNCHRONIZED_SCENE_RUNNING(iSyncScene) IF GET_SYNCHRONIZED_SCENE_PHASE(iSyncScene) >= 0.25 bTriggeredGreetingSpeech = DO_MISSION_SPEECH("FBI2_INTL", TRUE) ENDIF ENDIF ENDIF ENDIF IF CAN_PLAYER_START_CUTSCENE() AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() AND CAN_ADVANCE_MISSION() IF IS_SYNCHRONIZED_SCENE_RUNNING(iSyncScene) IF GET_SYNCHRONIZED_SCENE_PHASE(iSyncScene) >= 0.80 IF HAS_CUTSCENE_LOADED_WITH_FAILSAFE() bRunningCutscene = TRUE ENDIF ENDIF ELSE IF HAS_CUTSCENE_LOADED_WITH_FAILSAFE() bRunningCutscene = TRUE ENDIF ENDIF ENDIF ENDIF ELSE DO_FOOD_COURT_CUTSCENE() ENDIF ENDPROC // cleanup meeting cutscene PROC CLEANUP_MEETING_CUTSCENE() IF bSkippedCutscene ENDIF SETUP_PLAYER_CHARACTER_WITH_MISSION_VARIATIONS(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], CHAR_MICHAEL, STAGE_GET_TO_BUILDING) IF g_bMagDemoActive IF IS_VEHICLE_DRIVEABLE(snatchAndGrabVehicle[SAGV_MICHAEL_CAR]) SET_ENTITY_AS_MISSION_ENTITY(snatchAndGrabVehicle[SAGV_MICHAEL_CAR], TRUE, TRUE) ENDIF ENDIF CLEANUP_FBI(TRUE) //CLEANUP_FRANKLIN(TRUE) CLEANUP_DAVE(TRUE) IF IS_VEHICLE_DRIVEABLE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) SET_PLAYER_PED_WITH_HEADSET(CHAR_TREVOR, TRUE) SET_PLAYER_PED_WITH_HEADSET(CHAR_MICHAEL, TRUE) IF NOT IS_PED_INJURED(PLAYER_PED_ID()) SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], VS_DRIVER) ENDIF IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL]) SET_PED_INTO_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], VS_BACK_LEFT) DO_MICHAEL_SIT_IN_CHOPPER() //SET_PED_SIT_IDLE_ANIM(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], "VEH@STD@FRONT_PS", "sit", TRUE) ENDIF //SET_ENTITY_COORDS(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_CHOPPER_INIT)) //SET_ENTITY_HEADING(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], CHOPPER_INIT_ROT) //SET_VEHICLE_ON_GROUND_PROPERLY(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) //CLOSE_ALL_CHOPPER_DOORS() SHUT_ALL_CHOPPER_DOORS() ENDIF IF bSkippedCutscene ENDIF //TRIGGER_MISSION_MUSIC_EVENT("FBI2_TEST_HELI_RIDE_MUSIC") SET_MISSION_CUTSCENE(FALSE, TRUE, TRUE, TRUE, FALSE) SET_MISSION_STAGE(STAGE_GET_TO_BUILDING, FALSE, TRUE, FALSE) ENDPROC // meeting cutscene procedure PROC DO_MEETING_CUTSCENE() SET_ALL_RANDOM_PEDS_FLEE_THIS_FRAME(PLAYER_ID()) SWITCH cutsceneStage CASE SAG_CUT_STAGE_INIT //SET_MISSION_CUTSCENE(TRUE) iSnatchAndGrabCutsceneTime = GET_GAME_TIMER() IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR]) REGISTER_ENTITY_FOR_CUTSCENE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], "Trevor", CU_ANIMATE_EXISTING_SCRIPT_ENTITY) ENDIF IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN]) DETACH_ENTITY(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN]) REGISTER_ENTITY_FOR_CUTSCENE(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], "Franklin", CU_ANIMATE_AND_DELETE_EXISTING_SCRIPT_ENTITY) ENDIF IF NOT IS_PED_INJURED(PLAYER_PED_ID()) TASK_CLEAR_LOOK_AT(PLAYER_PED_ID()) REGISTER_ENTITY_FOR_CUTSCENE(PLAYER_PED_ID(), "Michael", CU_ANIMATE_EXISTING_SCRIPT_ENTITY) ENDIF IF NOT IS_PED_INJURED(davePed) REGISTER_ENTITY_FOR_CUTSCENE(davePed, "Dave_FBI", CU_ANIMATE_AND_DELETE_EXISTING_SCRIPT_ENTITY) ENDIF IF NOT IS_PED_INJURED(fbiPed[0]) REGISTER_ENTITY_FOR_CUTSCENE(fbiPed[0], "FBI_Suit", CU_ANIMATE_AND_DELETE_EXISTING_SCRIPT_ENTITY) ENDIF IF IS_VEHICLE_DRIVEABLE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) REQUEST_VEHICLE_HIGH_DETAIL_MODEL(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) REGISTER_ENTITY_FOR_CUTSCENE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], "Main_Heli", CU_ANIMATE_EXISTING_SCRIPT_ENTITY) ENDIF IF IS_VEHICLE_DRIVEABLE(snatchAndGrabVehicle[SAGV_MICHAEL_CAR]) REGISTER_ENTITY_FOR_CUTSCENE(snatchAndGrabVehicle[SAGV_MICHAEL_CAR], "Michaels_car", CU_ANIMATE_AND_DELETE_EXISTING_SCRIPT_ENTITY) ENDIF IF IS_VEHICLE_DRIVEABLE(snatchAndGrabVehicle[SAGV_FRANKLIN_BIKE]) FREEZE_ENTITY_POSITION(snatchAndGrabVehicle[SAGV_FRANKLIN_BIKE], FALSE) SET_CAN_CLIMB_ON_ENTITY(snatchAndGrabVehicle[SAGV_FRANKLIN_BIKE], FALSE) REGISTER_ENTITY_FOR_CUTSCENE(snatchAndGrabVehicle[SAGV_FRANKLIN_BIKE], "Franklin_Bike", CU_ANIMATE_AND_DELETE_EXISTING_SCRIPT_ENTITY) ENDIF REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST) START_CUTSCENE(CUTSCENE_SUPPRESS_FP_TRANSITION_FLASH) SET_CUTSCENE_FADE_VALUES(FALSE, FALSE, FALSE, FALSE) bDoneFlash = FALSE cutsceneStage = SAG_CUT_STAGE_RUNNING BREAK CASE SAG_CUT_STAGE_RUNNING IF NOT bClearedForCutscene IF IS_CUTSCENE_PLAYING() SET_MISSION_MOCAP_CUTSCENE() STOP_GAMEPLAY_HINT() IF IS_VEHICLE_DRIVEABLE(snatchAndGrabVehicle[SAGV_MICHAEL_CAR]) SET_VEHICLE_DOOR_CONTROL(snatchAndGrabVehicle[SAGV_MICHAEL_CAR], SC_DOOR_FRONT_LEFT, DT_DOOR_INTACT, 0.0) ENDIF STOP_VEHICLE_FIRE(snatchAndGrabVehicle[SAGV_MICHAEL_CAR]) IF IS_VEHICLE_DRIVEABLE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) SET_VEHICLE_DOORS_LOCKED(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], VEHICLELOCK_UNLOCKED) ENDIF STOP_VEHICLE_FIRE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN]) TASK_CLEAR_LOOK_AT(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN]) ENDIF IF DOES_ENTITY_EXIST(davePed) DELETE_PED(davePed) CLEAR_MODEL_REQUEST(ENUM_TO_INT(SAGM_DAVE)) ENDIF SET_VEHICLE_POPULATION_BUDGET(2) SET_PED_POPULATION_BUDGET(1) STOP_SNATCH_AND_GRAB_AUDIO_SCENE(SNATCH_AND_GRAB_AUDIO_SCENE_DRIVE_TO_LOT) // clear the area CLEAR_AREA(GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_TREVOR_INIT), 20.0, TRUE) CLEAR_AREA_OF_PROJECTILES(GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_TREVOR_INIT), 30) STOP_FIRE_IN_RANGE(GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_TREVOR_INIT), 30) REMOVE_PARTICLE_FX_IN_RANGE(GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_TREVOR_INIT), 30) IF bForcePassOnShitskip DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME) bForcePassOnShitskip = FALSE ELSE IF IS_SCREEN_FADED_OUT() DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME) ENDIF ENDIF bClearedForCutscene = TRUE ENDIF ELSE IF IS_VEHICLE_DRIVEABLE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) REQUEST_VEHICLE_HIGH_DETAIL_MODEL(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) ENDIF ENDIF //HANDLE_CREATE_FOLLOW_CAM_ON_FLY() // Fading the music out over the cutscene IF NOT bMusicFaded IF GET_CUTSCENE_TIME() >= 0 //TRIGGER_MISSION_MUSIC_EVENT("FBI2_TEST_ARRIVE_AT_HELI") bMusicFaded = TRUE ENDIF ENDIF // Bringing in music when Michael briefs others about job. IF NOT bMeetingCutsceneMusicStart IF GET_CUTSCENE_TIME() >= 98000.0 //TRIGGER_MISSION_MUSIC_EVENT("FBI2_TEST_HELI_CS_JOB_TALK") bMeetingCutsceneMusicStart = TRUE ENDIF ENDIF // Bringing the music back out after briefing. IF NOT bMeetingCutsceneMusicEnd IF GET_CUTSCENE_TIME() >= 112000.0 //TRIGGER_MISSION_MUSIC_EVENT("FBI2_TEST_STOP_HELI_CS_MUSIC") bMeetingCutsceneMusicEnd = TRUE ENDIF ENDIF IF NOT bChangedClothes IF GET_CUTSCENE_TIME() >= 74975.0 // CLEANUP_FBI(TRUE) // CLEANUP_DAVE(TRUE) SETUP_PLAYER_CHARACTER_WITH_MISSION_VARIATIONS(PLAYER_PED_ID(), CHAR_MICHAEL, STAGE_GET_TO_BUILDING) //CLEAR_PED_PROP(PLAYER_PED_ID(), ANCHOR_HEAD) REMOVE_PED_HELMET(PLAYER_PED_ID(), TRUE) bChangedClothes = TRUE ENDIF ENDIF IF NOT bRemovedFBICar IF GET_CUTSCENE_TIME() >= 15423 // delete FBI car IF DOES_ENTITY_EXIST(utilTruckVehicle[2]) DELETE_VEHICLE(utilTruckVehicle[2]) ENDIF CLEAR_MODEL_REQUEST(ENUM_TO_INT(SAGM_FBI_CAR)) bRemovedFBICar = TRUE ENDIF ENDIF IF NOT bDoneFlash IF GET_CAM_VIEW_MODE_FOR_CONTEXT(CAM_VIEW_MODE_CONTEXT_IN_HELI) = CAM_VIEW_MODE_FIRST_PERSON IF GET_CUTSCENE_TIME() >= GET_CUTSCENE_TOTAL_DURATION() - 300 ANIMPOSTFX_PLAY("CamPushInTrevor", 0, FALSE) PLAY_SOUND_FRONTEND(-1, "1st_Person_Transition", "PLAYER_SWITCH_CUSTOM_SOUNDSET") bDoneFlash = TRUE ENDIF ENDIF ENDIF PED_INDEX trevorPed trevorPed = GET_TREVOR_PED() PED_INDEX michaelped michaelped = GET_MICHAEL_PED() IF IS_VEHICLE_DRIVEABLE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) AND NOT IS_PED_INJURED(trevorPed) AND NOT IS_PED_INJURED(michaelped) IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Trevor") SET_PED_INTO_VEHICLE(trevorPed, snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) CASCADE_SHADOWS_SET_CASCADE_BOUNDS_SCALE(1.0) ENDIF IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Michael") SET_PED_INTO_VEHICLE(michaelped, snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], VS_BACK_LEFT) SETUP_PLAYER_CHARACTER_WITH_MISSION_VARIATIONS(PLAYER_PED_ID(), CHAR_MICHAEL, STAGE_GET_TO_BUILDING) ENDIF IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Main_heli") SHUT_ALL_CHOPPER_DOORS() // delete FBI car IF DOES_ENTITY_EXIST(utilTruckVehicle[2]) DELETE_VEHICLE(utilTruckVehicle[2]) ENDIF MAKE_SELECTOR_PED_SELECTION(sSelectorPeds, SELECTOR_PED_TREVOR) TAKE_CONTROL_OF_SELECTOR_PED(sSelectorPeds, TRUE, TRUE) REAPPLY_PLAYER_PED_ATTRIBUTES() ENDIF ENDIF IF NOT IS_CUTSCENE_PLAYING() IF WAS_CUTSCENE_SKIPPED() bSkippedCutscene = TRUE ENDIF REPLAY_STOP_EVENT() REPLAY_RECORD_BACK_FOR_TIME(0.0, 10.0) CLEANUP_MEETING_CUTSCENE() ENDIF //ENDIF #IF IS_DEBUG_BUILD DEBUG_SKIP_MOCAP() #ENDIF BREAK CASE SAG_CUT_STAGE_CLEANUP //CLEANUP_MEETING_CUTSCENE() BREAK ENDSWITCH ENDPROC // get to the choppah PROC DO_STAGE_GET_TO_CHOPPER() IF NOT bRunningCutscene IF NOT bFrozeChairs IF NOT IS_CUTSCENE_PLAYING() INT i REPEAT NUMBER_FOOD_COURT_CHAIRS i IF i=0 SET_ENTITY_COORDS(foodCourtChairObject[i], << 147.4805, -677.4504, 41.0238 >>) SET_ENTITY_ROTATION(foodCourtChairObject[i], << 0, 0, 100.84 >>) ENDIF IF i=2 SET_ENTITY_COORDS(foodCourtChairObject[i], << 147.8508, -676.3236, 41.0238 >> ) SET_ENTITY_ROTATION(foodCourtChairObject[i], << 0, 0, 36.0963 >>) ENDIF IF i=0 OR i=2 OR i=4 IF DOES_ENTITY_EXIST(foodCourtChairObject[i]) FREEZE_ENTITY_POSITION(foodCourtChairObject[i], TRUE) ENDIF ENDIF ENDREPEAT CREATE_COFFEE() bFrozeChairs = TRUE ENDIF ENDIF // force walk IF GET_FOLLOW_PED_CAM_VIEW_MODE() <> CAM_VIEW_MODE_FIRST_PERSON IF GET_GAME_TIMER() <= iStartMissionStageTime + 2000 VECTOR vPlayerPosForLeadout = GET_ENTITY_COORDS(PLAYER_PED_ID()) IF vPlayerPosForLeadout.x > 145.2 SET_PED_MIN_MOVE_BLEND_RATIO(PLAYER_PED_ID(), PEDMOVE_WALK) ENDIF ENDIF ENDIF INT iWanted = GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) IF NOT bForcePassOnShitskip IF iWanted > 0 IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<1370.22, -2049.72, -10.00>>, <<1401.82, -2087.40, 110.00>>, 97.00) MISSION_FAILED(FAIL_ATTRACTED_COPS) ENDIF ENDIF ENDIF IF g_bMagDemoActive bShownGodText = TRUE ENDIF IF bForcePassOnShitskip IF NOT bWarpedToLot IF IS_VEHICLE_DRIVEABLE(snatchAndGrabVehicle[SAGV_MICHAEL_CAR]) IF NOT IS_PED_INJURED(davePed) IF NOT IS_PED_IN_VEHICLE(davePed, snatchAndGrabVehicle[SAGV_MICHAEL_CAR]) SET_PED_INTO_VEHICLE(davePed, snatchAndGrabVehicle[SAGV_MICHAEL_CAR], VS_FRONT_RIGHT) ENDIF ENDIF bDaveInCar = TRUE bWarpedToLot = TRUE ENDIF ENDIF ENDIF IF NOT bForcePassOnShitskip HANDLE_BUDDY_ACTION_MODE_WHILE_WANTED(davePed, bDaveActionModeTrack, iDaveActionModeDelay) ENDIF IF NOT IS_PED_INJURED(davePed) IF NOT bForcePassOnShitskip IF iDaveDamageSpeechCount < 3 IF GET_GAME_TIMER() >= iNextCheckPlayerDealDamageTime IF HAS_PLAYER_DAMAGED_AT_LEAST_ONE_PED(PLAYER_ID()) IF NOT IS_ENTITY_IN_AREA(PLAYER_PED_ID(), <<140.27911, -689.82959, 41.02893>>, <<158.84610, -661.98206, 45.26525>>) IF NOT bDaveInCar OR NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), davePed, <<20,20,10>>) AND NOT HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(davePed, PLAYER_PED_ID()) IF NOT bKilledDaveSpeechForDamage KILL_ANY_CONVERSATION() bKilledDaveSpeechForDamage = TRUE ENDIF STRING sSpeech SWITCH iDaveDamageSpeechCount CASE 0 sSpeech = "FBI2_DAVDAM" BREAK CASE 1 sSpeech = "FBI2_DAVDAM2" BREAK CASE 2 sSpeech = "FBI2_DAVDAM3" BREAK ENDSWITCH IF DO_MISSION_SPEECH(sSpeech, TRUE) CLEAR_PLAYER_HAS_DAMAGED_AT_LEAST_ONE_PED(PLAYER_ID()) iNextCheckPlayerDealDamageTime = GET_GAME_TIMER() + 10000 iNextRandomSpeechTime = GET_GAME_TIMER() + 17000 iDaveDamageSpeechCount++ bKilledDaveSpeechForDamage = FALSE ENDIF ELSE CLEAR_ENTITY_LAST_DAMAGE_ENTITY(davePed) CLEAR_PLAYER_HAS_DAMAGED_AT_LEAST_ONE_PED(PLAYER_ID()) iNextCheckPlayerDealDamageTime = GET_GAME_TIMER() + 10000 ENDIF ELSE CLEAR_PLAYER_HAS_DAMAGED_AT_LEAST_ONE_PED(PLAYER_ID()) iNextCheckPlayerDealDamageTime = GET_GAME_TIMER() + 10000 ENDIF ELSE MISSION_FAILED(FAIL_TROUBLE_FOOD_COURT) ENDIF ENDIF ENDIF ENDIF IF GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) > 0 IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), davePed, <<20,20,10>>) IF NOT bKilledDaveSpeechForWanted IF NOT bDaveInCar KILL_ANY_CONVERSATION() bKilledDaveSpeechForWanted = TRUE ENDIF ENDIF IF NOT bDoneDaveWantedSpeech IF DO_MISSION_SPEECH("FBI2_DAVWAN1") CLEAR_PLAYER_HAS_DAMAGED_AT_LEAST_ONE_PED(PLAYER_ID()) bDoneDaveWantedSpeech = TRUE iNextRandomSpeechTime = GET_GAME_TIMER() + 17000 ENDIF ELSE DO_RANDOM_SPEECH("FBI2_DAVWAN2", 17000) ENDIF ENDIF ELSE bKilledDaveSpeechForWanted = FALSE bDoneDaveWantedSpeech = FALSE ENDIF ENDIF // see dave's car IF NOT bDoneDaveCarSpeech IF iDriveBanterStage = 0 IF IS_VEHICLE_DRIVEABLE(snatchAndGrabVehicle[SAGV_MICHAEL_CAR]) IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), davePed, <<10,10,10>>) IF NOT bKilledSpeechForDaveCar IF IS_PED_GETTING_INTO_A_VEHICLE(PLAYER_PED_ID()) OR IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) IF GET_VEHICLE_PED_IS_USING(PLAYER_PED_ID()) = snatchAndGrabVehicle[SAGV_MICHAEL_CAR] KILL_ANY_CONVERSATION() bKilledSpeechForDaveCar = TRUE ENDIF ENDIF ELSE bDoneDaveCarSpeech = DO_MISSION_SPEECH("FBI2_CAR") ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF // get rid of steve and andreas IF NOT bRemovedSteveAndAndreas IF DOES_ENTITY_EXIST(stevePed) IF IS_PED_INJURED(stevePed) MISSION_FAILED(FAIL_STEVE_DEAD) ELSE IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(stevePed, PLAYER_PED_ID()) MISSION_FAILED(FAIL_TROUBLE_FOOD_COURT) ENDIF ENDIF ENDIF IF DOES_ENTITY_EXIST(andreasPed) IF IS_PED_INJURED(andreasPed) MISSION_FAILED(FAIL_ANDREAS_DEAD) ELSE IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(andreasPed, PLAYER_PED_ID()) MISSION_FAILED(FAIL_TROUBLE_FOOD_COURT) ENDIF ENDIF ENDIF IF GET_DISTANCE_BETWEEN_COORDS(<<148.34253, -677.21783, 41.84525>>, GET_ENTITY_COORDS(PLAYER_PED_ID())) < 3.5 DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK_HEAVY) DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK_LIGHT) DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK_ALTERNATE) ENDIF IF NOT IS_ENTITY_AT_COORD(PLAYER_PED_ID(), GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_PLAYER_INIT), <<150,150,150>>, FALSE, FALSE) REMOVE_PED_FOR_DIALOGUE(snatchAndGrabConversation, 5) IF DOES_ENTITY_EXIST(stevePed) DELETE_PED(stevePed) ENDIF CLEAR_MODEL_REQUEST(ENUM_TO_INT(SAGM_STEVE)) REMOVE_PED_FOR_DIALOGUE(snatchAndGrabConversation, 6) IF DOES_ENTITY_EXIST(andreasPed) DELETE_PED(andreasPed) ENDIF CLEAR_MODEL_REQUEST(ENUM_TO_INT(SAGM_ANDREAS)) CLEAR_ANIM_DICT_REQUEST(SAG_ANIM_DICT_FOOD_COURT) CLEAR_MODEL_REQUEST(ENUM_TO_INT(SAGM_COFFEE)) //CLEAR_MISC_ASSET_REQUEST(SAG_MISC_ASSET_FOOD_COURT_ANIMS) INT i REPEAT NUMBER_FOOD_COURT_CHAIRS i IF DOES_ENTITY_EXIST(foodCourtChairObject[i]) SET_OBJECT_AS_NO_LONGER_NEEDED(foodCourtChairObject[i]) ENDIF ENDREPEAT REPEAT 3 i IF DOES_ENTITY_EXIST(coffeeObject[i]) DELETE_OBJECT(coffeeObject[i]) ENDIF ENDREPEAT bRemovedSteveAndAndreas = TRUE ELSE IF NOT bLoopSteveAndAndreas IF NOT IS_PED_INJURED(stevePed) AND NOT IS_PED_INJURED(andreasPed) IF IS_SYNCHRONIZED_SCENE_RUNNING(iSteveSyncScene) IF GET_SYNCHRONIZED_SCENE_PHASE(iSteveSyncScene) >= 0.98 SET_STEVE_AND_ANDREAS_LOOP() ENDIF ENDIF ENDIF ELSE IF NOT IS_PED_INJURED(stevePed) IF NOT bDoneSteveLook IF GET_GAME_TIMER() >= iLoopSteveAndAndreasTime + 3000 TASK_LOOK_AT_ENTITY(stevePed, PLAYER_PED_ID(), -1, SLF_WHILE_NOT_IN_FOV) ENDIF ENDIF IF IS_ENTITY_ON_FIRE(stevePed) APPLY_DAMAGE_TO_PED(stevePed, 1000, TRUE) ENDIF IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), stevePed, <<6,6,2>>) DO_RANDOM_SPEECH("FBI2_HANG", GET_RANDOM_INT_IN_RANGE(15000, 20000)) ENDIF ENDIF IF NOT IS_PED_INJURED(andreasPed) IF IS_ENTITY_ON_FIRE(andreasPed) APPLY_DAMAGE_TO_PED(andreasPed, 1000, TRUE) ENDIF IF NOT bDoneAndreasLook IF GET_GAME_TIMER() >= iLoopSteveAndAndreasTime + 3900 TASK_LOOK_AT_ENTITY(andreasPed, PLAYER_PED_ID(), -1, SLF_WHILE_NOT_IN_FOV) ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF FAIL_FOOD_COURT() // create everything at the meeting SWITCH createMeetingStage CASE CREATE_MEETING_STAGE_NOT_STARTED IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_MEETING_POINT), <<450,450,450>>, FALSE, FALSE) AND bDaveInCar ADD_MODEL_REQUEST(ENUM_TO_INT(SAGM_CHOPPER)) ADD_MODEL_REQUEST(ENUM_TO_INT(SAGM_FRANKLIN_BIKE)) createMeetingStage = CREATE_MEETING_STAGE_WAITING_FOR_VEHICLES ENDIF BREAK CASE CREATE_MEETING_STAGE_WAITING_FOR_VEHICLES IF HAVE_ALL_MODEL_REQUESTS_SUCCEEDED() AND HAVE_ALL_ANIM_DICT_REQUESTS_SUCCEEDED() CREATE_FBI_MEETING_VEHICLES() createMeetingStage = CREATE_MEETING_STAGE_VEHICLES_CREATED ENDIF BREAK CASE CREATE_MEETING_STAGE_VEHICLES_CREATED IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_MEETING_POINT), <<380,380,380>>, FALSE, FALSE) ADD_MODEL_REQUEST(ENUM_TO_INT(SAGM_FRANKLIN)) ADD_MODEL_REQUEST(ENUM_TO_INT(SAGM_TREVOR)) ADD_MODEL_REQUEST(ENUM_TO_INT(SAGM_FBI)) ADD_ANIM_DICT_REQUEST(SAG_ANIM_DICT_AT_LOT) createMeetingStage = CREATE_MEETING_STAGE_WAITING_FOR_PEDS ENDIF BREAK CASE CREATE_MEETING_STAGE_WAITING_FOR_PEDS IF HAVE_ALL_MODEL_REQUESTS_SUCCEEDED() AND HAVE_ALL_ANIM_DICT_REQUESTS_SUCCEEDED() CREATE_FBI_MEETING_PEDS() createMeetingStage = CREATE_MEETING_STAGE_DONE ENDIF BREAK CASE CREATE_MEETING_STAGE_DONE IF NOT IS_PED_INJURED(fbiPed[0]) AND NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN]) AND NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR]) AND IS_VEHICLE_DRIVEABLE(snatchAndGrabVehicle[SAGV_FRANKLIN_BIKE]) AND IS_VEHICLE_DRIVEABLE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) IF NOT bForcePassOnShitskip SWITCH pickupChopperLeadinStage CASE PICKUP_CHOPPER_LEADIN_NOT_STARTED iSyncScene = CREATE_SYNCHRONIZED_SCENE(GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_PICKUP_CHOPPER_LEADIN), <<0,0,PICKUP_CHOPPER_LEADIN_ROT>>) iSyncScene2 = CREATE_SYNCHRONIZED_SCENE(GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_PICKUP_CHOPPER_LEADIN), <<0,0,PICKUP_CHOPPER_LEADIN_ROT>>) SET_ENTITY_NO_COLLISION_ENTITY(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], snatchAndGrabVehicle[SAGV_FRANKLIN_BIKE], TRUE) //ATTACH_SYNCHRONIZED_SCENE_TO_ENTITY(iSyncScene, snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], 0) SET_SYNCHRONIZED_SCENE_LOOPED(iSyncScene, TRUE) SET_SYNCHRONIZED_SCENE_LOOPED(iSyncScene2, TRUE) TASK_SYNCHRONIZED_SCENE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], iSyncScene, GET_SNATCH_AND_GRAB_ANIM_DICT_AS_STRING(SAG_ANIM_DICT_AT_LOT), "_leadin_loop_Trevor", NORMAL_BLEND_IN, SLOW_BLEND_OUT, SYNCED_SCENE_USE_PHYSICS) TASK_SYNCHRONIZED_SCENE(fbiPed[0], iSyncScene, GET_SNATCH_AND_GRAB_ANIM_DICT_AS_STRING(SAG_ANIM_DICT_AT_LOT), "_leadin_loop_FBI", NORMAL_BLEND_IN, SLOW_BLEND_OUT, SYNCED_SCENE_USE_PHYSICS) TASK_SYNCHRONIZED_SCENE(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], iSyncScene2, GET_SNATCH_AND_GRAB_ANIM_DICT_AS_STRING(SAG_ANIM_DICT_AT_LOT), "_leadin_loop_Franklin", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, SYNCED_SCENE_USE_PHYSICS) TASK_LOOK_AT_ENTITY(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], PLAYER_PED_ID(), -1, SLF_WHILE_NOT_IN_FOV) pickupChopperLeadinStage = PICKUP_CHOPPER_LEADIN_LOOPING BREAK CASE PICKUP_CHOPPER_LEADIN_LOOPING IF NOT bPreparedTrevorRantAudio IF NOT bSetSceneAudioEntity //SET_SYNCH_SCENE_AUDIO_POSITION(<<1372.76331, -2072.92212, 52.40826>>) //SET_SYNCH_SCENE_AUDIO_ENTITY(sSelectorPeds.pedID[SELECTOR_PED_TREVOR]) INIT_SYNCH_SCENE_AUDIO_WITH_ENTITY("FBI_2_MCS_1_LeadIn", sSelectorPeds.pedID[SELECTOR_PED_TREVOR]) bSetSceneAudioEntity = TRUE ENDIF bPreparedTrevorRantAudio = PREPARE_SYNCHRONIZED_AUDIO_EVENT("FBI_2_MCS_1_LeadIn", 0) ENDIF IF missionFailState = MISSION_FAIL_STATE_NOT_FAILED IF IS_SYNCHRONIZED_SCENE_RUNNING(iSyncScene) IF GET_SYNCHRONIZED_SCENE_PHASE(iSyncScene) >= 0.98 IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), sSelectorPeds.pedID[SELECTOR_PED_TREVOR], <<57,57,57>>) iSyncScene = CREATE_SYNCHRONIZED_SCENE(GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_PICKUP_CHOPPER_LEADIN), <<0,0,PICKUP_CHOPPER_LEADIN_ROT>>) TASK_SYNCHRONIZED_SCENE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], iSyncScene, GET_SNATCH_AND_GRAB_ANIM_DICT_AS_STRING(SAG_ANIM_DICT_AT_LOT), "_leadin_action_Trevor", SLOW_BLEND_IN, SLOW_BLEND_OUT, SYNCED_SCENE_USE_PHYSICS) TASK_SYNCHRONIZED_SCENE(fbiPed[0], iSyncScene, GET_SNATCH_AND_GRAB_ANIM_DICT_AS_STRING(SAG_ANIM_DICT_AT_LOT), "_leadin_action_FBI", SLOW_BLEND_IN, SLOW_BLEND_OUT, SYNCED_SCENE_USE_PHYSICS) SET_SYNCHRONIZED_SCENE_PHASE(iSyncScene, 0) SET_SYNCHRONIZED_SCENE_LOOPED(iSyncScene, FALSE) SET_SYNCHRONIZED_SCENE_HOLD_LAST_FRAME(iSyncScene, TRUE) IF bPreparedTrevorRantAudio //printstring("do leadin audio!") printnl() PLAY_SYNCHRONIZED_AUDIO_EVENT(iSyncScene) ENDIF pickupChopperLeadinStage = PICKUP_CHOPPER_LEADIN_ACTION ENDIF ENDIF ENDIF ENDIF BREAK CASE PICKUP_CHOPPER_LEADIN_ACTION IF missionFailState = MISSION_FAIL_STATE_NOT_FAILED IF IS_SYNCHRONIZED_SCENE_RUNNING(iSyncScene) IF GET_SYNCHRONIZED_SCENE_PHASE(iSyncScene) >= 0.75 bCanRunPickupChopperScene = TRUE ENDIF IF GET_SYNCHRONIZED_SCENE_PHASE(iSyncScene) >= 0.99 iSyncScene = CREATE_SYNCHRONIZED_SCENE(GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_PICKUP_CHOPPER_LEADIN), <<0,0,PICKUP_CHOPPER_LEADIN_ROT>>) TASK_SYNCHRONIZED_SCENE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], iSyncScene, GET_SNATCH_AND_GRAB_ANIM_DICT_AS_STRING(SAG_ANIM_DICT_AT_LOT), "_leadin_loop_Trevor_02_trevor",SLOW_BLEND_IN, NORMAL_BLEND_OUT, SYNCED_SCENE_USE_PHYSICS) TASK_SYNCHRONIZED_SCENE(fbiPed[0], iSyncScene, GET_SNATCH_AND_GRAB_ANIM_DICT_AS_STRING(SAG_ANIM_DICT_AT_LOT), "_leadin_loop_FBI", SLOW_BLEND_IN, NORMAL_BLEND_OUT, SYNCED_SCENE_USE_PHYSICS) SET_SYNCHRONIZED_SCENE_PHASE(iSyncScene, 0) SET_SYNCHRONIZED_SCENE_LOOPED(iSyncScene, TRUE) bCanRunPickupChopperScene = TRUE pickupChopperLeadinStage = PICKUP_CHOPPER_LEADIN_DONE ENDIF ELSE bCanRunPickupChopperScene = TRUE ENDIF ENDIF BREAK ENDSWITCH ENDIF ENDIF // set chopper high lod IF IS_VEHICLE_DRIVEABLE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], <<120,120,120>>, FALSE, FALSE) REQUEST_VEHICLE_HIGH_DETAIL_MODEL(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) ENDIF ENDIF IF NOT bForcePassOnShitskip HANDLE_FBI() ENDIF BREAK ENDSWITCH // create util trucks SWITCH createUtilTrucksStage CASE CREATE_UTIL_TRUCKS_STAGE_NOT_STARTED IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<1393.64, -2053.64, 51.00>>, <<330,330,330>>, FALSE, FALSE) ADD_MODEL_REQUEST(ENUM_TO_INT(SAGM_UTIL_TRUCK_1)) ADD_MODEL_REQUEST(ENUM_TO_INT(SAGM_UTIL_TRUCK_2)) ADD_MODEL_REQUEST(ENUM_TO_INT(SAGM_FBI_CAR)) createUtilTrucksStage = CREATE_UTIL_TRUCKS_STAGE_WAITING ENDIF BREAK CASE CREATE_UTIL_TRUCKS_STAGE_WAITING IF HAVE_ALL_MODEL_REQUESTS_SUCCEEDED() CREATE_UTIL_TRUCKS(STAGE_GET_TO_CHOPPER) createUtilTrucksStage = CREATE_UTIL_TRUCKS_STAGE_DONE ENDIF BREAK CASE CREATE_UTIL_TRUCKS_STAGE_DONE BREAK ENDSWITCH //SET_MICHAEL_INTO_CAR() // Starting music when player enters vehicle. IF NOT bCarIsMoving IF IS_PLAYER_DRIVING_ANY_VEHICLE() // TRIGGER_MISSION_MUSIC_EVENT("FBI2_TEST_MISSION_START") bCarIsMoving = TRUE ENDIF ENDIF IF NOT bForcePassOnShitskip IF NOT bDaveInCar IF IS_VEHICLE_DRIVEABLE(snatchAndGrabVehicle[SAGV_MICHAEL_CAR]) AND NOT IS_PED_INJURED(davePed) VECTOR vDavePos VECTOR vPlayerPos vDavePos = GET_ENTITY_COORDS(davePed) vPlayerPos = GET_ENTITY_COORDS(PLAYER_PED_ID()) SWITCH daveIntoCarState CASE DAVE_INTO_CAR_STATE_WALKING FLOAT fDistAhead fDistAhead = vDavePos.x - vPlayerPos.x IF fDistAhead > 0.0 fDaveWalkSpeed = fDaveWalkSpeed +@ 0.060 ELIF fDistAhead < -1.2 fDaveWalkSpeed = fDaveWalkSpeed -@ 0.060 ELSE // try and get to 1.0 IF fDaveWalkSpeed > 1.0 fDaveWalkSpeed = fDaveWalkSpeed -@ 0.060 IF fDaveWalkSpeed < 1.0 fDaveWalkSpeed = 1.0 ENDIF ELIF fDaveWalkSpeed < 1.0 fDaveWalkSpeed = fDaveWalkSpeed +@ 0.060 IF fDaveWalkSpeed > 1.0 fDaveWalkSpeed = 1.0 ENDIF ENDIF ENDIF IF fDaveWalkSpeed > MAX_DAVE_WALK_SPEED fDaveWalkSpeed = MAX_DAVE_WALK_SPEED ELIF fDaveWalkSpeed < MIN_DAVE_WALK_SPEED fDaveWalkSpeed = MIN_DAVE_WALK_SPEED ENDIF SET_PED_MOVE_RATE_OVERRIDE(davePed, fDaveWalkSpeed) BOOL bAt IF IS_VEHICLE_DRIVEABLE(snatchAndGrabVehicle[SAGV_MICHAEL_CAR]) FLOAT fAtDist fAtDist = DAVE_PAUSE_DIST IF GET_FOLLOW_PED_CAM_VIEW_MODE() = CAM_VIEW_MODE_FIRST_PERSON fAtDist = 4.1 ENDIF bAt = IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), davePed, <>) OR IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), snatchAndGrabVehicle[SAGV_MICHAEL_CAR], <<5,5,5>>) ENDIF IF NOT bAt OR NOT IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), davePed, <<10, 10, 4>>) IF NOT bSavedBanter IF STORE_BANTER() KILL_ANY_CONVERSATION() ENDIF ENDIF ELSE IF bSavedBanter IF RESTORE_BANTER() bSavedBanter = FALSE ENDIF ENDIF ENDIF IF GET_SCRIPT_TASK_STATUS(davePed, SCRIPT_TASK_FOLLOW_WAYPOINT_ROUTE) = FINISHED_TASK IF NOT IS_ENTITY_AT_COORD(davePed, <<84.6,-670.0,43.38>>, <<8,8,8>>, FALSE, FALSE) TASK_CLEAR_LOOK_AT(davePed) INT iClosestDaveWaypoint WAYPOINT_RECORDING_GET_CLOSEST_WAYPOINT("davewalk", GET_ENTITY_COORDS(davePed), iClosestDaveWaypoint) IF iClosestDaveWaypoint < 2 iClosestDaveWaypoint = 2 ENDIF TASK_FOLLOW_WAYPOINT_RECORDING(davePed, "davewalk", iClosestDaveWaypoint+1, EWAYPOINT_NAVMESH_BACK_TO_WAYPOINT_IF_LEFT_ROUTE) ENDIF ENDIF IF NOT bAt IF IS_PED_HEADTRACKING_ENTITY(PLAYER_PED_ID(), davePed) TASK_CLEAR_LOOK_AT(PLAYER_PED_ID()) ENDIF IF vPlayerPos.x > vDavePos.x CLEAR_SEQUENCE_TASK(sequence) OPEN_SEQUENCE_TASK(sequence) TASK_LOOK_AT_ENTITY(NULL, PLAYER_PED_ID(), -1, SLF_WHILE_NOT_IN_FOV) TASK_TURN_PED_TO_FACE_ENTITY(NULL, PLAYER_PED_ID(), -1) CLOSE_SEQUENCE_TASK(sequence) TASK_PERFORM_SEQUENCE(davePed, sequence) daveIntoCarState = DAVE_INTO_CAR_STATE_PAUSED ENDIF ELSE DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SPRINT) DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_JUMP) DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK_HEAVY) DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK_LIGHT) DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK_ALTERNATE) IF IS_ENTITY_AT_ENTITY(davePed, snatchAndGrabVehicle[SAGV_MICHAEL_CAR], <<8,8,8>>, FALSE, FALSE) IF NOT IS_PED_GETTING_INTO_A_VEHICLE(PLAYER_PED_ID()) SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(davePed, TRUE) TASK_ENTER_VEHICLE(davePed, snatchAndGrabVehicle[SAGV_MICHAEL_CAR], DEFAULT_TIME_BEFORE_WARP, VS_FRONT_RIGHT, PEDMOVE_WALK) TASK_CLEAR_LOOK_AT(davePed) daveIntoCarState = DAVE_INTO_CAR_STATE_ENTER ENDIF ENDIF ENDIF bCacheAt = bAt BREAK CASE DAVE_INTO_CAR_STATE_PAUSED IF IS_PED_HEADTRACKING_ENTITY(PLAYER_PED_ID(), davePed) TASK_CLEAR_LOOK_AT(PLAYER_PED_ID()) ENDIF IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), davePed, <>) OR vPlayerPos.x < vDavePos.x daveIntoCarState = DAVE_INTO_CAR_STATE_WALKING ENDIF BREAK CASE DAVE_INTO_CAR_STATE_ENTER IF IS_PED_IN_VEHICLE(davePed, snatchAndGrabVehicle[SAGV_MICHAEL_CAR]) REMOVE_PED_FROM_GROUP(davePed) KILL_ANY_CONVERSATION() TASK_CLEAR_LOOK_AT(davePed) SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(davePed, TRUE) REPLAY_RECORD_BACK_FOR_TIME(5.0, 10.0, REPLAY_IMPORTANCE_HIGHEST) bSavedBanter = FALSE bDaveInCar = TRUE ENDIF BREAK ENDSWITCH ENDIF ENDIF IF NOT bDoneInCarAudioScene IF IS_VEHICLE_DRIVEABLE(snatchAndGrabVehicle[SAGV_MICHAEL_CAR]) IF daveIntoCarState >= DAVE_INTO_CAR_STATE_ENTER OR IS_ENTITY_AT_ENTITY(davePed, snatchAndGrabVehicle[SAGV_MICHAEL_CAR], <<15,15,15>>, FALSE, FALSE) IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), snatchAndGrabVehicle[SAGV_MICHAEL_CAR], <<30,30,30>>, FALSE, FALSE) SET_PED_RESET_FLAG(PLAYER_PED_ID(), PRF_ForcePlayerToEnterVehicleThroughDirectDoorOnly, TRUE) ENDIF ENDIF IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), snatchAndGrabVehicle[SAGV_MICHAEL_CAR]) bDoneInCarAudioScene = START_SNATCH_AND_GRAB_AUDIO_SCENE(SNATCH_AND_GRAB_AUDIO_SCENE_DRIVE_TO_LOT) ENDIF ENDIF ENDIF ENDIF IF NOT IS_PED_INJURED(davePed) // play the music IF g_bMagDemoActive IF NOT bDoneApproachLotCue VECTOR vCarPos = GET_ENTITY_COORDS(snatchAndGrabVehicle[SAGV_MICHAEL_CAR]) IF vCarPos.y <= -1976.2 bDoneApproachLotCue = TRIGGER_MISSION_MUSIC_EVENT("FIB2_HELI_PRE_TAKEOFF") ENDIF ENDIF ENDIF IF createMeetingStage = CREATE_MEETING_STAGE_DONE AND createUtilTrucksStage = CREATE_UTIL_TRUCKS_STAGE_DONE HANDLE_STREAMING_MOCAP("fbi_2_mcs_1", GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_MEETING_POINT), DEFAULT_CUTSCENE_LOAD_DIST, DEFAULT_CUTSCENE_UNLOAD_DIST) IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY() IF NOT IS_PED_INJURED(davePed) SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Dave_FBI", davePed) SET_CUTSCENE_PED_COMPONENT_VARIATION("Dave_FBI", PED_COMP_JBIB, 1, 0) ENDIF IF NOT IS_PED_INJURED(fbiPed[0]) SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("FBI_Suit", fbiPed[0]) ENDIF IF NOT IS_PED_INJURED(GET_FRANKLIN_PED()) SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Franklin", GET_FRANKLIN_PED()) ENDIF IF NOT IS_PED_INJURED(GET_TREVOR_PED()) SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Trevor", GET_TREVOR_PED()) ENDIF ENDIF ENDIF IF NOT bCutsceneWaitStarted // banter IF iWanted = 0 IF NOT bForcePassOnShitskip IF NOT g_bMagDemoActive // dave says get to the lot IF NOT bDoneGetToLotSpeech IF bDoneGotoSpeech AND bDoneDaveLetsGoSpeech IF iGetInTextStage > 0 IF IS_VEHICLE_DRIVEABLE(snatchAndGrabVehicle[SAGV_MICHAEL_CAR]) IF bDaveInCar bDoneGetToLotSpeech = TRUE ELSE IF bCacheAt IF iReplayAttempt % 2 = 0 bDoneGetToLotSpeech = DO_MISSION_SPEECH("FBI2_TOCAR") ELSE bDoneGetToLotSpeech = DO_MISSION_SPEECH("FBI2_TOCAR2") ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF IF NOT g_bMagDemoActive IF bShownGodText AND NOT bKilledBanter IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), snatchAndGrabVehicle[SAGV_MICHAEL_CAR]) AND IS_PED_IN_VEHICLE(davePed, snatchAndGrabVehicle[SAGV_MICHAEL_CAR]) IF NOT bKilledLookAtInCar TASK_CLEAR_LOOK_AT(PLAYER_PED_ID()) bKilledLookAtInCar = TRUE ENDIF IF bSavedBanter IF bDaveInCar OR IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), davePed, <<15,15,4>>) IF RESTORE_BANTER() bSavedBanter = FALSE ENDIF ENDIF ENDIF STRING sBanter SWITCH iDriveBanterStage CASE 0 IF iReplayAttempt % 2 = 0 sBanter = "FBI2_B1AV1" ELSE sBanter = "FBI2_B2AV2" ENDIF // dave and mike chat about franklin IF DO_MISSION_SPEECH(sBanter) iDriveBanterStage++ bSavedBanter = FALSE ENDIF BREAK CASE 1 // michael phones franklin IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() AND NOT IS_MESSAGE_BEING_DISPLAYED() AND IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), snatchAndGrabVehicle[SAGV_MICHAEL_CAR]) IF NOT bKilledBanter IF iReplayAttempt % 2 = 0 sBanter = "FBI2_FCALL" ELSE sBanter = "FBI2_FCALL2" ENDIF IF PLAYER_CALL_CHAR_CELLPHONE(snatchAndGrabConversation, CHAR_FRANKLIN, "FBI2AUD", sBanter, CONV_PRIORITY_HIGH) // Music change over when Michael uses phone //TRIGGER_MISSION_MUSIC_EVENT("FBI2_TEST_DRIVE_TO_HELI_PHONE") iDriveBanterStage++ bSavedBanter = FALSE ENDIF ENDIF ENDIF BREAK CASE 2 // check to see if the call has gone through properly IF NOT bRegisteredCall //IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() // iDriveBanterStage-- //ELSE IF IS_MOBILE_PHONE_CALL_ONGOING() OR IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), snatchAndGrabVehicle[SAGV_MICHAEL_CAR]) bRegisteredCall = TRUE ENDIF //ENDIF ELSE // dave and mike chat about trevor IF NOT bKilledBanter IF iReplayAttempt % 2 = 0 sBanter = "FBI2_B1BV1" ELSE sBanter = "FBI2_B2BV2" ENDIF IF DO_MISSION_SPEECH(sBanter) // Music change when they chat about trev //TRIGGER_MISSION_MUSIC_EVENT("FBI2_TEST_DRIVE_TO_HELI_TREV") iDriveBanterStage++ bSavedBanter = FALSE ENDIF ENDIF ENDIF BREAK CASE 3 /* IF NOT bKilledTrevorDiscussionSpeech IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<1378.04, -2063.69, 51.00>>, <<250,250,250>>, FALSE, FALSE) TEXT_LABEL_23 tCurrentLabel tCurrentLabel = GET_CURRENTLY_PLAYING_STANDARD_CONVERSATION_LABEL() IF ARE_STRINGS_EQUAL(tCurrentLabel, "FBI2_B1BV1_3") OR ARE_STRINGS_EQUAL(tCurrentLabel, "FBI2_B1BV1_5") KILL_ANY_CONVERSATION() bKilledTrevorDiscussionSpeech = TRUE ENDIF ENDIF ELSE IF NOT bRestartedDiscussionSpeech IF NOT bKilledBanter bRestartedDiscussionSpeech = DO_MISSION_SPEECH("FBI2_B1BV1", FALSE, 8, FALSE, TRUE, TRUE) ENDIF ENDIF ENDIF */ // Change music once conversation is complete //IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() //TRIGGER_MISSION_MUSIC_EVENT("FBI2_TEST_DRIVE_TO_HELI") //iDriveBanterStage++ //ENDIF BREAK ENDSWITCH ENDIF ENDIF IF NOT bKilledBanter IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_MEETING_POINT), <<50, 50, 50>>, FALSE, FALSE) KILL_ANY_CONVERSATION() bKilledBanter = TRUE ENDIF //ELSE // IF NOT bDoneBriefTroopsSpeech // bDoneBriefTroopsSpeech = DO_MISSION_SPEECH("FBI2_MCS1_LI") // ENDIF ENDIF ENDIF ENDIF IF CAN_ADVANCE_MISSION() IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), snatchAndGrabVehicle[SAGV_MICHAEL_CAR]) AND IS_PED_IN_VEHICLE(davePed, snatchAndGrabVehicle[SAGV_MICHAEL_CAR]) IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_CHOPPER_INIT), <<9, 9, LOCATE_SIZE_HEIGHT>>) //OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<1365.68, -2057.41, 50.12>>, <<1384.50, -2079.38, 53.12>>, 12) OR IS_ENTITY_AT_COORD(PLAYER_PED_ID(), GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_MEETING_POINT), <<9, 9, LOCATE_SIZE_HEIGHT>>, FALSE) OR IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<1381.35144, -2072.18823, 50.99826>>, <<10, 10, LOCATE_SIZE_HEIGHT>>, FALSE) OR IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<1381.99451, -2058.40039, 50.99815>>, <<9, 7, LOCATE_SIZE_HEIGHT>>, FALSE) IF mocapStreamingStage > MOCAP_STREAMING_STAGE_REQUEST AND IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), snatchAndGrabVehicle[SAGV_MICHAEL_CAR]) AND IS_PED_SITTING_IN_VEHICLE(davePed, snatchAndGrabVehicle[SAGV_MICHAEL_CAR]) //SET_PLAYER_CONTROL(PLAYER_ID(), FALSE, SPC_LEAVE_CAMERA_CONTROL_ON) PREVENT_WANTED_LEVEL_FOR_CUTSCENE() //REMOVE_ALL_BLIPS() KILL_ANY_CONVERSATION() iCutsceneTriggerTime = GET_GAME_TIMER() bCutsceneWaitStarted = TRUE ENDIF ENDIF ENDIF ENDIF ENDIF ELSE PREVENT_WANTED_LEVEL_FOR_CUTSCENE() IF NOT bDoneMichaelLeaveCarSpeech IF NOT bForcePassOnShitskip IF DO_MISSION_SPEECH("FBI2_MCS1_L2") bDoneMichaelLeaveCarSpeech = TRUE iMichaelLeaveCarSpeechTime = GET_GAME_TIMER() ENDIF ENDIF ELSE IF NOT bKilledMichaelLeaveCarSpeechForTime IF GET_GAME_TIMER() >= iMichaelLeaveCarSpeechTime + 6000 KILL_ANY_CONVERSATION() bKilledMichaelLeaveCarSpeechForTime = TRUE ENDIF ENDIF ENDIF IF BRING_VEHICLE_TO_HALT_AND_DISABLE_VEH_CONTROLS(snatchAndGrabVehicle[SAGV_MICHAEL_CAR], 8.0) // 35 OR bForcePassOnShitskip IF IS_PED_SITTING_IN_ANY_VEHICLE(PLAYER_PED_ID()) SET_PLAYER_CONTROL(PLAYER_ID(), FALSE, SPC_LEAVE_CAMERA_CONTROL_ON) TASK_LEAVE_ANY_VEHICLE(PLAYER_PED_ID()) //TASK_FOLLOW_NAV_MESH_TO_COORD(PLAYER_PED_ID(), <<1372.62964, -2073.26221, 50.99822>>, PEDMOVE_WALK, DEFAULT_TIME_NEVER_WARP, 5) ELSE IF NOT bSetNavmesh IF GET_SCRIPT_TASK_STATUS(PLAYER_PED_ID(), SCRIPT_TASK_FOLLOW_NAV_MESH_TO_COORD) = FINISHED_TASK //TASK_GO_TO_ENTITY(PLAYER_PED_ID(), sSelectorPeds.pedID[SELECTOR_PED_TREVOR], DEFAULT_TIME_NEVER_WARP, 5.0, PEDMOVE_WALK) TASK_FOLLOW_NAV_MESH_TO_COORD(PLAYER_PED_ID(), <<1372.62964, -2073.26221, 50.99822>>, PEDMOVE_WALK, DEFAULT_TIME_NEVER_WARP, 5, ENAV_NO_STOPPING) bSetNavmesh = TRUE iSetNavmeshTime = GET_GAME_TIMER() ENDIF ELSE IF GET_GAME_TIMER() <= iSetNavmeshTime + 5000 SET_PED_MIN_MOVE_BLEND_RATIO(PLAYER_PED_ID(), PEDMOVE_WALK) ENDIF ENDIF ENDIF IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) SET_GAMEPLAY_HINT_CAMERA_BLEND_TO_FOLLOW_PED_MEDIUM_VIEW_MODE(TRUE) SET_GAMEPLAY_COORD_HINT(<<1373.1, -2073.4, 52.5>>, -1, 2000) SET_GAMEPLAY_HINT_FOLLOW_DISTANCE_SCALAR(0.5) SET_GAMEPLAY_HINT_CAMERA_RELATIVE_SIDE_OFFSET(-0.8) SET_GAMEPLAY_HINT_CAMERA_RELATIVE_VERTICAL_OFFSET(-0.04) SET_GAMEPLAY_HINT_FOV(30) IF iPushInTime < 0 iPushInTime = GET_GAME_TIMER() ENDIF ENDIF IF NOT IS_PED_HEADTRACKING_ENTITY(PLAYER_PED_ID(), sSelectorPeds.pedID[SELECTOR_PED_TREVOR]) TASK_LOOK_AT_ENTITY(PLAYER_PED_ID(), sSelectorPeds.pedID[SELECTOR_PED_TREVOR], -1, SLF_WHILE_NOT_IN_FOV) ENDIF SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(snatchAndGrabVehicle[SAGV_MICHAEL_CAR], FALSE) DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SPRINT) DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_JUMP) DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK_HEAVY) DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK_LIGHT) DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK_ALTERNATE) IF NOT bDoneDaveShuffle IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), snatchAndGrabVehicle[SAGV_MICHAEL_CAR]) AND NOT IS_PED_INJURED(davePed) TASK_LOOK_AT_ENTITY(davePed, PLAYER_PED_ID(), -1, SLF_WHILE_NOT_IN_FOV) TASK_SHUFFLE_TO_NEXT_VEHICLE_SEAT(davePed, snatchAndGrabVehicle[SAGV_MICHAEL_CAR]) REPLAY_RECORD_BACK_FOR_TIME(5.0, 5.0, REPLAY_IMPORTANCE_HIGHEST) bDoneDaveShuffle = TRUE ENDIF ENDIF IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() AND GET_GAME_TIMER() >= iPushInTime + 2000 AND (bCanRunPickupChopperScene OR bForcePassOnShitskip) IF CAN_ADVANCE_MISSION() IF HAS_CUTSCENE_LOADED_WITH_FAILSAFE() bRunningCutscene = TRUE ENDIF ENDIF ENDIF ENDIF ENDIF //IF NOT bRestoredControlOnStart // IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), snatchAndGrabVehicle[SAGV_MICHAEL_CAR]) // SET_PLAYER_CONTROL(PLAYER_ID(), TRUE) // bRestoredControlOnStart = TRUE // ENDIF //ELSE IF NOT bCutsceneWaitStarted HANDLE_GET_TO_LOCATION(TRUE, NOT bDaveInCar, bDaveInCar, TRUE) ENDIF //ENDIF IF NOT g_bMagDemoActive IF NOT bDoneGotoSpeech IF iWanted = 0 IF bPrestreamedLine IF GET_IS_PRELOADED_CONVERSATION_READY() BEGIN_PRELOADED_CONVERSATION() bDoneGotoSpeech = TRUE ELSE KILL_ANY_CONVERSATION() bPrestreamedLine = FALSE ENDIF ELSE bDoneGotoSpeech = DO_MISSION_SPEECH("FBI2_OLDDOG") ENDIF ELSE bDoneGotoSpeech = TRUE ENDIF ELSE IF iWanted = 0 IF NOT bDoneDaveLetsGoSpeech bDoneDaveLetsGoSpeech = DO_MISSION_SPEECH("FBI2_WALK", FALSE, 1) ENDIF ENDIF ENDIF ENDIF ENDIF ELSE DO_MEETING_CUTSCENE() ENDIF ENDPROC // for rappel scene PROC ENSURE_ENGINE_AND_BLADES_ON() IF IS_VEHICLE_DRIVEABLE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) SET_HELI_BLADES_FULL_SPEED(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) SET_VEHICLE_ENGINE_ON(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], TRUE, TRUE) ENDIF ENDPROC // start rappel cutscene procedure PROC DO_START_RAPPEL_CUTSCENE() //HANDLE_RANDOM_VEHICLE_GENERATION(TRUE) SWITCH cutsceneStage CASE SAG_CUT_STAGE_INIT // jump out IF IS_VEHICLE_DRIVEABLE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) SET_HELI_TURBULENCE_SCALAR(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER],1.0) SET_AIRCRAFT_PILOT_SKILL_NOISE_SCALAR(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER],1.0) ENSURE_ENGINE_AND_BLADES_ON() IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) STOP_PLAYBACK_RECORDED_VEHICLE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) ENDIF ENDIF 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 IF NOT IS_PED_INJURED(PLAYER_PED_ID()) REGISTER_ENTITY_FOR_CUTSCENE(PLAYER_PED_ID(), "Trevor", CU_ANIMATE_EXISTING_SCRIPT_ENTITY) ENDIF IF IS_VEHICLE_DRIVEABLE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) REGISTER_ENTITY_FOR_CUTSCENE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], "Main_Heli", CU_ANIMATE_EXISTING_SCRIPT_ENTITY) ENDIF REGISTER_ENTITY_FOR_CUTSCENE(cutsceneChairObject[0], "P_CS_15M_ROPE_S", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, P_CS_15M_ROPE_S) REGISTER_ENTITY_FOR_CUTSCENE(cutsceneChairObject[1], "P_RPULLEY_S", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, P_RPULLEY_S) TRIGGER_MISSION_MUSIC_EVENT("FIB2_RAPPEL_CS_START") START_CUTSCENE(CUTSCENE_SUPPRESS_FP_TRANSITION_FLASH) SET_CUTSCENE_FADE_VALUES(FALSE, FALSE, FALSE, FALSE) iSnatchAndGrabCutsceneTime = GET_GAME_TIMER() cutsceneStage = SAG_CUT_STAGE_RUNNING BREAK CASE SAG_CUT_STAGE_RUNNING ENSURE_ENGINE_AND_BLADES_ON() IF NOT bClearedForCutscene IF IS_CUTSCENE_PLAYING() SET_MISSION_MOCAP_CUTSCENE() KILL_CHASE_HINT_CAM(localChaseHintCamStruct) //DELETE_CHECKPOINT(jumpCheckpoint) DISABLE_DOWNWASH_PTFX(TRUE) REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST) // mask on IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL]) SETUP_PLAYER_CHARACTER_WITH_MISSION_VARIATIONS(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], CHAR_MICHAEL, STAGE_RAPPEL_DOWN) SET_PLAYER_PED_WITH_HEADSET(CHAR_MICHAEL, TRUE) RELEASE_PED_PRELOAD_PROP_DATA(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL]) ENDIF //SCRIPT_OVERRIDES_WIND_TYPES(TRUE, "WEATHER_TYPES_MAGDEMO_FIB2_RAPPEL","WEATHER_TYPES_MAGDEMO_FIB2_RAPPEL") STOP_SNATCH_AND_GRAB_AUDIO_SCENE(SNATCH_AND_GRAB_AUDIO_SCENE_FLY_TO_AGENCY) STOP_SNATCH_AND_GRAB_AUDIO_SCENE(SNATCH_AND_GRAB_AUDIO_SCENE_FOCUS_ON_ROOF) //CLEAR_AREA(<<91.91, -630.54, 43.27>>, 300, TRUE) //SET_SNATCH_AND_GRAB_ROADS(FALSE, TRUE, TRUE) SET_VEHICLE_POPULATION_BUDGET(2) SET_PED_POPULATION_BUDGET(0) INSTANTLY_FILL_VEHICLE_POPULATION() SET_FAR_DRAW_VEHICLES(TRUE) IF IS_VEHICLE_DRIVEABLE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) CREATE_RAPPEL_ANCHOR(rappelData, snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_ROPE_ANCHOR_OFFSET), GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_ROPE_ANCHOR_ROT)) ENDIF STOP_VEHICLE_FIRE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) IF bForcePassOnShitskip DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME) bForcePassOnShitskip = FALSE ELSE IF IS_SCREEN_FADED_OUT() DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME) ENDIF ENDIF bClearedForCutscene = TRUE ENDIF ENDIF IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Michael") IF GET_CURRENT_PLAYER_PED_ENUM() <> CHAR_MICHAEL MAKE_SELECTOR_PED_SELECTION(sSelectorPeds, SELECTOR_PED_MICHAEL) TAKE_CONTROL_OF_SELECTOR_PED(sSelectorPeds, TRUE, TRUE, TCF_CLEAR_TASK_INTERRUPT_CHECKS) REAPPLY_PLAYER_PED_ATTRIBUTES() ENDIF ENDIF IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Main_Heli") IF IS_VEHICLE_DRIVEABLE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) ENSURE_ENGINE_AND_BLADES_ON() SHUT_ALL_CHOPPER_DOORS() ENDIF ENDIF IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Trevor") IF IS_VEHICLE_DRIVEABLE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR]) IF NOT IS_PED_IN_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) SET_PED_INTO_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) ENDIF ENDIF ENDIF ENDIF IF NOT DOES_ENTITY_EXIST(cutsceneChairObject[0]) IF DOES_ENTITY_EXIST(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("P_CS_15M_ROPE_S")) cutsceneChairObject[0] = GET_OBJECT_INDEX_FROM_ENTITY_INDEX(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("P_CS_15M_ROPE_S")) ENDIF ENDIF IF NOT DOES_ENTITY_EXIST(cutsceneChairObject[1]) IF DOES_ENTITY_EXIST(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("P_RPULLEY_S")) cutsceneChairObject[1] = GET_OBJECT_INDEX_FROM_ENTITY_INDEX(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("P_RPULLEY_S")) ENDIF ENDIF IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("P_CS_15M_ROPE_S") DELETE_OBJECT(cutsceneChairObject[0]) ENDIF IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("P_RPULLEY_S") DELETE_OBJECT(cutsceneChairObject[1]) ENDIF IF CAN_SET_EXIT_STATE_FOR_CAMERA() REPLAY_STOP_EVENT() rappelData.ped = PLAYER_PED_ID() SET_MISSION_CUTSCENE(FALSE, FALSE, FALSE) SET_MISSION_STAGE(STAGE_RAPPEL_DOWN, FALSE, TRUE, FALSE) ENDIF #IF IS_DEBUG_BUILD DEBUG_SKIP_MOCAP() #ENDIF BREAK CASE SAG_CUT_STAGE_CLEANUP BREAK ENDSWITCH IF bClearedForCutscene CASCADE_SHADOWS_SET_CASCADE_BOUNDS_SCALE(CASCADE_SHADOWS_MULTIPLIER_EXTERIOR_OVERRIDE) SET_AMBIENT_VEHICLE_RANGE_MULTIPLIER_THIS_FRAME(RAPPEL_VEHICLE_RANGE_MULTIPLIER) ENDIF ENDPROC // fly the chopper to the top of the FBI building PROC DO_STAGE_GET_TO_BUILDING() IF NOT bRunningCutscene INT iWanted = GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) IF bForcePassOnShitskip IF NOT bWarpedChopperToBuilding IF IS_VEHICLE_DRIVEABLE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) //SET_ENTITY_COORDS(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_HOVER_TARGET)) SET_HELI_BLADES_FULL_SPEED(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) //LOAD_SCENE(GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_HOVER_TARGET)) //WAIT(0) bWarpedChopperToBuilding = TRUE ENDIF ENDIF ENDIF // remove util trucks IF NOT bRemovedUtilTrucks IF NOT IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<1393.64, -2053.64, 51.00>>, <<700,700,700>>, FALSE, FALSE) OR bForcePassOnShitskip INT i REPEAT COUNT_OF(utilTruckVehicle) i IF DOES_ENTITY_EXIST(utilTruckVehicle[i]) SET_VEHICLE_AS_NO_LONGER_NEEDED(utilTruckVehicle[i]) ENDIF ENDREPEAT CLEAR_MODEL_REQUEST(ENUM_TO_INT(SAGM_UTIL_TRUCK_1)) CLEAR_MODEL_REQUEST(ENUM_TO_INT(SAGM_UTIL_TRUCK_2)) bRemovedUtilTrucks = TRUE ENDIF ENDIF IF NOT bForcePassOnShitskip IF bDoneGetInPositionSpeech CONTROL_COORD_CHASE_HINT_CAM_IN_VEHICLE(localChaseHintCamStruct, GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_HOVER_TARGET)) IF NOT IS_GAMEPLAY_HINT_ACTIVE() AND GET_CAM_VIEW_MODE_FOR_CONTEXT(CAM_VIEW_MODE_CONTEXT_IN_HELI) <> CAM_VIEW_MODE_FIRST_PERSON IF NOT bDoneTowerHintCamHelp bDoneTowerHintCamHelp = DO_MISSION_HELP_TEXT("SG_DROHLP") ENDIF ELSE IF GET_CAM_VIEW_MODE_FOR_CONTEXT(CAM_VIEW_MODE_CONTEXT_IN_HELI) <> CAM_VIEW_MODE_FIRST_PERSON bDoneTowerHintCamHelp = TRUE ENDIF IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("SG_DROHLP") IF GET_GAME_TIMER() >= iClearHelpTime + 1000 CLEAR_HELP(FALSE) iClearHelpTime = GET_GAME_TIMER() ENDIF ENDIF ENDIF IF NOT bDoneFocusCamAudioScene IF IS_GAMEPLAY_HINT_ACTIVE() START_SNATCH_AND_GRAB_AUDIO_SCENE(SNATCH_AND_GRAB_AUDIO_SCENE_FOCUS_ON_ROOF) bDoneFocusCamAudioScene = TRUE ENDIF ELSE IF NOT IS_GAMEPLAY_HINT_ACTIVE() STOP_SNATCH_AND_GRAB_AUDIO_SCENE(SNATCH_AND_GRAB_AUDIO_SCENE_FOCUS_ON_ROOF) bDoneFocusCamAudioScene = FALSE ENDIF ENDIF ENDIF ENDIF IF IS_VEHICLE_DRIVEABLE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) AND NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL]) IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_HOVER_TARGET), <<100,100,80>>) SET_HELI_TURBULENCE_SCALAR(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER],0.0) SET_AIRCRAFT_PILOT_SKILL_NOISE_SCALAR(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER],0.0) ELSE SET_HELI_TURBULENCE_SCALAR(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER],1.0) SET_AIRCRAFT_PILOT_SKILL_NOISE_SCALAR(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER],1.0) ENDIF CONST_INT INTERP_BACK_TIME 3000 IF NOT bForcePassOnShitskip IF NOT bDoneInterpBackToGame //DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_LOOK_LR) //DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_LOOK_UD) //DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_EXIT) IF bHeliLiftedOff IF GET_GAME_TIMER() >= iInterpBackToGameTime + INTERP_BACK_TIME bDoneInterpBackToGame = TRUE ENDIF ENDIF ENDIF IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) IF NOT bHeliLiftedOff FLOAT fGroundHeight FLOAT fHeightAboveGround VECTOR vPlayerPos = GET_ENTITY_COORDS(PLAYER_PED_ID()) GET_GROUND_Z_FOR_3D_COORD(vPlayerPos, fGroundHeight) IF fGroundHeight < 0 fGroundHeight = 0 ENDIF fHeightAboveGround = vPlayerPos.z - fGroundHeight IF fHeightAboveGround > 1 //RENDER_SCRIPT_CAMS(FALSE, TRUE, INTERP_BACK_TIME) iInterpBackToGameTime = GET_GAME_TIMER() bHeliLiftedOff = TRUE ENDIF ELSE IF NOT bDoneHalfwayThereCue IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<132.47, -636.71, 261.85>>, <<950,950,950>>, FALSE, FALSE) bDoneHalfwayThereCue = TRIGGER_MISSION_MUSIC_EVENT("FIB2_HALFWAY_THERE") ENDIF ENDIF ENDIF ENDIF ENDIF // advance mission on arrival IF iWanted = 0 CONST_FLOAT HOVER_TARGET_MAX_HEIGHT 284.0 CONST_FLOAT HOVER_TARGET_MIN_HEIGHT 257.0 CONST_FLOAT MARKER_RING_SIZE 18.0 CONST_FLOAT MARKER_CYLINDER_SIZE 17.0 IF CAN_ADVANCE_MISSION() IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) AND IS_PED_IN_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) //IS_ENTITY_AT_COORD(PLAYER_PED_ID(), GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_HOVER_TARGET), <<7,7,7>>, TRUE) ENDIF ENDIF IF IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) AND IS_PED_IN_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) HANDLE_STREAMING_MOCAP("fbi_2_mcs_2", GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_HOVER_TARGET), DEFAULT_CUTSCENE_LOAD_DIST, DEFAULT_CUTSCENE_UNLOAD_DIST) IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY() IF NOT IS_PED_INJURED(GET_MICHAEL_PED()) SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Michael", GET_MICHAEL_PED()) ENDIF IF NOT IS_PED_INJURED(GET_TREVOR_PED()) SET_CUTSCENE_PED_PROP_VARIATION("Trevor", ANCHOR_HEAD, 12) ENDIF ENDIF // IF bDebugSkipMagdemoUseRing // DRAW_MARKER(MARKER_RING, GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_HOVER_TARGET) + <<1,-1, 0>>, <<0,0,0>>, <<90,0,-123>>, <>, 255, 255, 0, 100) // ELSE // DRAW_MARKER(MARKER_CYLINDER, GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_HOVER_TARGET) + <<1,-1,-13.5>>, <<0.0,0.0,0.0>>, <<0.0,0.0,0.0>>, <>, 255, 255, 0, 180) // ENDIF // draw the marker IF NOT bForcePassOnShitSkip IF bSavedBanter IF NOT bDoneGetInPositionSpeech IF RESTORE_BANTER() bSavedBanter = FALSE ENDIF ENDIF ENDIF ENDIF IF NOT bRequestedAtBuildingAssets ADD_RECORDING_REQUEST(001) ADD_MODEL_REQUEST(ENUM_TO_INT(SAGM_HARNESS)) bRequestedAtBuildingAssets = TRUE ENDIF //IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_HOVER_TARGET) ,<<60,60,30>>, FALSE, TRUE) BOOL bAtWall = IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<102.560, -645.660, HOVER_TARGET_MIN_HEIGHT>>, <<116.050, -609.760, HOVER_TARGET_MAX_HEIGHT>>, 20.0, FALSE, FALSE) VECTOR vChopperPos = GET_ENTITY_COORDS(PLAYER_PED_ID()) IF (bAtWall AND vChopperPos.z <= HOVER_TARGET_MAX_HEIGHT AND vChopperPos.z >= HOVER_TARGET_MIN_HEIGHT) OR bForcePassOnShitskip OR bHitCutsceneFailsafe IF (CAN_ADVANCE_MISSION() AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() AND HAVE_ALL_MODEL_REQUESTS_SUCCEEDED() AND HAVE_ALL_RECORDING_REQUESTS_SUCCEEDED()) OR bHitCutsceneFailsafe bHitCutsceneFailsafe = TRUE IF HAS_CUTSCENE_LOADED_WITH_FAILSAFE() bRunningCutscene = TRUE ENDIF ENDIF ELIF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_HOVER_TARGET) ,<<250,250,80>>, FALSE, FALSE) IF NOT bForcePassOnShitskip IF NOT bKilledBanterInChopper KILL_ANY_CONVERSATION() bKilledBanterInChopper = TRUE ELSE IF NOT bDoneGetInPositionSpeech IF DO_MISSION_SPEECH("FBI2_MWHERE") bDoneGetInPositionSpeech = TRUE iNextGetInPositionSpeechTime = GET_GAME_TIMER() + 20000 ENDIF ELSE IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_HOVER_TARGET) ,<<125,125,100>>, FALSE, FALSE) // give prompt about how to get in IF GET_GAME_TIMER() >= iNextGetInPositionSpeechTime BOOL bDoneSpeech = FALSE IF vChopperPos.z >= 340 // too high bDoneSpeech = DO_MISSION_SPEECH("FBI2_MLOW") ELIF vChopperPos.z <= 190 // too low bDoneSpeech = DO_MISSION_SPEECH("FBI2_MHIGH") ELIF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<114.020, -630.170, 266.430>>, <<149.180, -643.460, 266.410>>, 49.000, FALSE, FALSE) AND NOT bAtWall // over roof bDoneSpeech = DO_MISSION_SPEECH("FBI2_MFURT") ELIF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<114.940, -628.940, 266.430>>, <<-43.220, -569.490, 266.410>>, 153.000, FALSE, FALSE) AND NOT bAtWall // too far from wall bDoneSpeech = DO_MISSION_SPEECH("FBI2_MTFAR") ELSE IF NOT bAtWall bDoneSpeech = DO_MISSION_SPEECH("FBI2_MWEST") ELSE // catch all IF vChopperPos.z >= HOVER_TARGET_MAX_HEIGHT // too high bDoneSpeech = DO_MISSION_SPEECH("FBI2_MLOW") ELIF vChopperPos.z <= HOVER_TARGET_MIN_HEIGHT // too low bDoneSpeech = DO_MISSION_SPEECH("FBI2_MHIGH") ENDIF ENDIF ENDIF IF bDoneSpeech iNextGetInPositionSpeechTime = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(28000, 33000) ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF IF NOT bForcePassOnShitskip // Music changes when player gets close to the building IF NOT bCloseToBuilding IF IS_ENTITY_IN_AREA(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], (<<578, -307, 165>>), (<<111, -1472, 150>>), FALSE, FALSE) //TRIGGER_MISSION_MUSIC_EVENT("FBI2_TEST_CLOSE_TO_BUILDING") bCloseToBuilding = TRUE ENDIF ENDIF IF NOT bDoneBanter IF bDoneGotoSpeech AND bShownGodText IF NOT bKilledBanterInChopper bDoneBanter = DO_MISSION_SPEECH("FBI2_B2AV1") ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF IF NOT bForcePassOnShitskip HANDLE_GET_TO_LOCATION(TRUE, FALSE, TRUE, TRUE) ENDIF ENDIF ELSE // Fading music off on arrival at building IF NOT bArrivedAtBuilding //TRIGGER_MISSION_MUSIC_EVENT("FBI2_TEST_ARRIVE_AT_BUILDING_E") bArrivedAtBuilding = TRUE ENDIF DO_START_RAPPEL_CUTSCENE() ENDIF ENDPROC PROC DISABLE_BLUR_ON_RIFLE_MODEL() IF NOT bDisabledBlurOnRifle IF NOT IS_PED_INJURED(dummyFranklinPed) ENTITY_INDEX weaponEntity OBJECT_INDEX weaponObject WEAPON_TYPE weapon GET_CURRENT_PED_WEAPON(dummyFranklinPed, weapon) IF weapon = WEAPONTYPE_HEAVYSNIPER weaponEntity = GET_CURRENT_PED_WEAPON_ENTITY_INDEX(dummyFranklinPed) IF DOES_ENTITY_EXIST(weaponEntity) weaponObject = GET_OBJECT_INDEX_FROM_ENTITY_INDEX(weaponEntity) SET_ENTITY_MOTION_BLUR(weaponObject, FALSE) //PRINTSTRING("disabled blur on rifle") PRINTNL() //bDisabledBlurOnRifle = TRUE ENDIF ENDIF ENDIF ENDIF ENDPROC // smash through and grab prisoner cutscene procedure PROC DO_SMASH_IN_CUTSCENE() INT i SWITCH cutsceneStage CASE SAG_CUT_STAGE_INIT STOP_SYNCHRONIZED_AUDIO_EVENT(iSyncScene) #IF IS_DEBUG_BUILD bDebugJSkip = TRUE #ENDIF INFORM_MISSION_STATS_SYSTEM_OF_TIME_WINDOW_CLOSED() OVERRIDE_PLAYER_GROUND_MATERIAL(GET_HASH_KEY("AM_BASE_GLASS_STRONG"),FALSE) // michael IF NOT IS_PED_INJURED(PLAYER_PED_ID()) TASK_CLEAR_LOOK_AT(PLAYER_PED_ID()) //GIVE_PLAYER_MISSION_PISTOL(FALSE, FALSE) REGISTER_ENTITY_FOR_CUTSCENE(michaelGunObject, "Michaels_weapon", CU_ANIMATE_EXISTING_SCRIPT_ENTITY) REGISTER_ENTITY_FOR_CUTSCENE(PLAYER_PED_ID(), "Michael", CU_ANIMATE_EXISTING_SCRIPT_ENTITY) ENDIF // michelle IF NOT IS_PED_INJURED(michellePed) REGISTER_ENTITY_FOR_CUTSCENE(michellePed, "Michelle", CU_ANIMATE_EXISTING_SCRIPT_ENTITY) ENDIF // mr k IF NOT IS_PED_INJURED(prisonerPed) REGISTER_ENTITY_FOR_CUTSCENE(prisonerPed, "MR_K", CU_ANIMATE_EXISTING_SCRIPT_ENTITY) ENDIF REGISTER_ENTITY_FOR_CUTSCENE(cutsceneChairObject[0], "CIA_Office_Chair", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, V_CORP_OFFCHAIR) REGISTER_ENTITY_FOR_CUTSCENE(cutsceneChairObject[1],"CIA_Office_Chair^1", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, V_CORP_OFFCHAIR) REGISTER_ENTITY_FOR_CUTSCENE(cutsceneChairObject[2],"CIA_Office_Chair^2", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, V_CORP_OFFCHAIR) REGISTER_ENTITY_FOR_CUTSCENE(cutsceneChairObject[3],"CIA_Office_Chair^3", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, V_CORP_OFFCHAIR) REGISTER_ENTITY_FOR_CUTSCENE(cutsceneChairObject[4],"PROP_CS_POLICE_TORCH", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, PROP_CS_POLICE_TORCH) REGISTER_ENTITY_FOR_CUTSCENE(cutsceneChairObject[5],"Mr_K_Harness", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, P_MRK_HARNESS_S) // franklin CREATE_DUMMY_FRANKLIN() // IF NOT IS_PED_INJURED(dummyFranklinPed) // REGISTER_ENTITY_FOR_CUTSCENE(dummyFranklinPed, "Franklin", CU_ANIMATE_EXISTING_SCRIPT_ENTITY) // ENDIF // guards TEXT_LABEL tGuardRegister FOR i=0 TO 2 IF NOT IS_PED_INJURED(guardPed[i]) //SET_CURRENT_PED_WEAPON(guardPed[i], GET_SNATCH_AND_GRAB_WEAPON_TYPE(SAG_WEAPON_CIA_PISTOL), TRUE) SWITCH i CASE 0 tGuardRegister = "CIA_Goon_1" BREAK CASE 1 tGuardRegister = "Lead_CIA" BREAK CASE 2 tGuardRegister = "CIA_Goon_2" BREAK ENDSWITCH REGISTER_ENTITY_FOR_CUTSCENE(guardPed[i], tGuardRegister, CU_ANIMATE_EXISTING_SCRIPT_ENTITY) ENDIF ENDFOR HANDLE_WINDOW_SMASH(TRUE) START_CUTSCENE(CUTSCENE_SUPPRESS_FP_TRANSITION_FLASH) //KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() iGuardSpeech = 0 iWindowSmashStage = 3 iSnatchAndGrabCutsceneTime = GET_GAME_TIMER() cutsceneStage = SAG_CUT_STAGE_RUNNING BREAK CASE SAG_CUT_STAGE_RUNNING IF NOT bClearedForCutscene IF IS_CUTSCENE_PLAYING() SET_MISSION_MOCAP_CUTSCENE() IF DOES_CAM_EXIST(staticCam) DESTROY_CAM(staticCam) ENDIF SET_HIDOF_OVERRIDE(FALSE, TRUE, 0, 0, 0, 0) CASCADE_SHADOWS_ENABLE_FREEZER(TRUE) STOP_SOUND(iRappelWindSoundID) STOP_SNATCH_AND_GRAB_AUDIO_SCENE(SNATCH_AND_GRAB_AUDIO_SCENE_RAPPEL) STOP_SNATCH_AND_GRAB_AUDIO_SCENE(SNATCH_AND_GRAB_AUDIO_SCENE_BREAK_THE_GLASS) MUFFLE_HELI_SOUND_INDOORS(FALSE) CANCEL_RAPPEL(rappelData, TRUE, WEAPONTYPE_UNARMED, TRUE, FALSE) CLEAR_ANIM_DICT_REQUEST(SAG_ANIM_DICT_RAPPEL) FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID()) DELETE_RAPPEL_ROPE(rappelData) CREATE_CHOPPER_ROPE(ROPE_TYPE_INSIDE, STAGE_RAPPEL_DOWN) //HANDLE_CHOPPER_ROPE(ROPE_TYPE_INSIDE) DRAW_ROPE_TO_POINT(TRUE, <<110.51, -618.71, 207.12>>) printstring("created rappel rope!") printnl() printvector(GET_ROPE_VERTEX_COORD(rappelData.rope, get_rope_vertex_count(rappelData.rope)-1)) printnl() FOR i=0 TO 2 IF NOT IS_PED_INJURED(guardPed[i]) SET_PED_COMPONENT_VARIATION(guardPed[i], PED_COMP_HAIR, 3, 0) ENDIF ENDFOR SET_CHOPPER_TO_ESCAPE() IF DOES_ENTITY_EXIST(torchObject) IF bKeepTorch DETACH_ENTITY(torchObject) SET_ENTITY_COORDS_NO_OFFSET(torchObject, <<114.72, -620.69, 205.90>>) SET_ENTITY_ROTATION(torchObject, <<0,0, -79.068>>) FREEZE_ENTITY_POSITION(torchObject, TRUE) ELSE DELETE_OBJECT(torchObject) ENDIF ENDIF IF IS_SCREEN_FADED_OUT() DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME) ENDIF bClearedForCutscene = TRUE ENDIF ENDIF IF NOT DOES_ENTITY_EXIST(cutsceneChairObject[0]) IF DOES_ENTITY_EXIST(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("CIA_Office_Chair")) cutsceneChairObject[0] = GET_OBJECT_INDEX_FROM_ENTITY_INDEX(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("CIA_Office_Chair")) ENDIF ENDIF IF NOT DOES_ENTITY_EXIST(cutsceneChairObject[1]) IF DOES_ENTITY_EXIST(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("CIA_Office_Chair^1")) cutsceneChairObject[1] = GET_OBJECT_INDEX_FROM_ENTITY_INDEX(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("CIA_Office_Chair^1")) ENDIF ENDIF IF NOT DOES_ENTITY_EXIST(cutsceneChairObject[2]) IF DOES_ENTITY_EXIST(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("CIA_Office_Chair^2")) cutsceneChairObject[2] = GET_OBJECT_INDEX_FROM_ENTITY_INDEX(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("CIA_Office_Chair^2")) ENDIF ENDIF IF NOT DOES_ENTITY_EXIST(cutsceneChairObject[3]) IF DOES_ENTITY_EXIST(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("CIA_Office_Chair^3")) cutsceneChairObject[3] = GET_OBJECT_INDEX_FROM_ENTITY_INDEX(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("CIA_Office_Chair^3")) ENDIF ENDIF IF NOT DOES_ENTITY_EXIST(cutsceneChairObject[4]) IF DOES_ENTITY_EXIST(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("PROP_CS_POLICE_TORCH")) cutsceneChairObject[4] = GET_OBJECT_INDEX_FROM_ENTITY_INDEX(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("PROP_CS_POLICE_TORCH")) ENDIF ENDIF IF NOT DOES_ENTITY_EXIST(cutsceneChairObject[5]) IF DOES_ENTITY_EXIST(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Mr_K_Harness")) cutsceneChairObject[5] = GET_OBJECT_INDEX_FROM_ENTITY_INDEX(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Mr_K_Harness")) ENDIF ENDIF HANDLE_CHOPPER_ROPE(ROPE_TYPE_INSIDE) // chopper rope // get rid of traffic - staggering expensive calls throughout first few frames IF NOT bDeletedTraffic REPEAT COUNT_OF(trafficVehicle) i IF DOES_ENTITY_EXIST(trafficVehicle[i]) DELETE_VEHICLE(trafficVehicle[i]) ENDIF ENDREPEAT bDeletedTraffic = TRUE ELSE // create sniper IF NOT bCreatedSniper CREATE_SNIPER_OBJECT() FREEZE_FRANKLIN_AT_SNIPER() bCreatedSniper = TRUE ENDIF ENDIF SWITCH smashThroughShot // smash in mocap CASE SMASH_THROUGH_MOCAP bForcePassOnShitskip = FALSE CASCADE_SHADOWS_SET_CASCADE_BOUNDS_SCALE(CASCADE_SHADOWS_MULTIPLIER_INTERIOR_OVERRIDE) CASCADE_SHADOWS_SET_ENTITY_TRACKER_SCALE(1.0) IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Michelle") // michelle run IF NOT IS_PED_INJURED(michellePed) CLEAR_PED_TASKS_IMMEDIATELY(michellePed) SET_ENTITY_COORDS(michellePed, <<118.60, -619.50, 205.05>>) SET_ENTITY_HEADING(michellePed, -97.16) FORCE_PED_MOTION_STATE(michellePed, MS_ON_FOOT_SPRINT, FALSE, FAUS_CUTSCENE_EXIT) SET_PED_MIN_MOVE_BLEND_RATIO(michellePed, PEDMOVE_SPRINT) TASK_GO_STRAIGHT_TO_COORD(michellePed, <<134.91, -616.71, 205.05>>, PEDMOVE_RUN) ENDIF ENDIF IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Michaels_weapon") IF DOES_ENTITY_EXIST(michaelGunObject) DELETE_OBJECT(michaelGunObject) ENDIF ENDIF IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Michael") AND CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("MR_K") CREATE_DUMMY_FRANKLIN(FALSE) UPDATE_PRISONER_GRAB(PRISONER_GRAB_STATE_INIT) SETUP_PRISONER_WITH_BELT(FALSE, STAGE_RAPPEL_DOWN) DRAW_ROPE_TO_POINT(TRUE, <<112.69, -619.18, 206.48>>) GIVE_PLAYER_MISSION_PISTOL() SET_SELECTOR_PED_HINT(sSelectorPeds, SELECTOR_PED_FRANKLIN, TRUE) SET_SELECTOR_PED_HINT(sSelectorPeds, SELECTOR_PED_TREVOR, FALSE) SET_SELECTOR_PED_HINT(sSelectorPeds, SELECTOR_PED_MICHAEL, FALSE) SET_SELECTOR_PED_BLOCKED(sSelectorPeds, SELECTOR_PED_TREVOR, TRUE) SET_SELECTOR_PED_BLOCKED(sSelectorPeds, SELECTOR_PED_FRANKLIN, FALSE) SET_SELECTOR_PED_BLOCKED(sSelectorPeds, SELECTOR_PED_MICHAEL, TRUE) ENDIF IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("CIA_Goon_1") AND CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Lead_CIA") AND CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("CIA_Goon_2") SET_GUARDS_AIMING_AT_MICHAEL(TRUE, TRUE) ENDIF IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("CIA_Office_Chair") DELETE_OBJECT(cutsceneChairObject[0]) ENDIF IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("CIA_Office_Chair^1") DELETE_OBJECT(cutsceneChairObject[1]) ENDIF IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("CIA_Office_Chair^2") DELETE_OBJECT(cutsceneChairObject[2]) ENDIF IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("CIA_Office_Chair^3") DELETE_OBJECT(cutsceneChairObject[3]) ENDIF IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("PROP_CS_POLICE_TORCH") DELETE_OBJECT(cutsceneChairObject[4]) ENDIF IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Mr_K_Harness") DELETE_OBJECT(cutsceneChairObject[5]) ENDIF HIDE_SELECTOR_THIS_FRAME() FORCE_LOAD_SELECTOR_THIS_FRAME() UPDATE_SELECTOR_HUD(sSelectorPeds, FALSE) IF CAN_SET_EXIT_STATE_FOR_CAMERA() MUFFLE_HELI_SOUND_INDOORS(FALSE) SET_PORTAL_SETTINGS_OVERRIDE("V_CIA_PS_WINDOW_UNBROKEN", "V_CIA_PS_WINDOW_BROKEN") DO_STREAM_VOLUME_ON_OFFICE(TRUE) START_SNATCH_AND_GRAB_AUDIO_SCENE(SNATCH_AND_GRAB_AUDIO_SCENE_MR_K_HOSTAGE) HIDE_HUD_AND_RADAR_THIS_FRAME() CREATE_CAM_FOR_SNATCH_AND_GRAB_SHOT(SAG_SHOT_WAIT_FOR_SWITCH, TRUE, 20000) iSnatchAndGrabCutsceneTime = GET_GAME_TIMER() CASCADE_SHADOWS_SET_CASCADE_BOUNDS_SCALE(CASCADE_SHADOWS_MULTIPLIER_NO_OVERRIDE) INIT_ALL_GUARD_ANIMATION_TIMES() smashThroughShot = SMASH_THROUGH_WAIT_FOR_SWITCH HIDE_SELECTOR_THIS_FRAME(FALSE) ENDIF //HANDLE_WINDOW_SMASH(TRUE) // temp! IF NOT bDoneSmashSound TRIGGER_MISSION_MUSIC_EVENT("FIB2_BREAK_WINDOW") PLAY_SOUND_FROM_COORD(iSmashSoundID, "FBI_02_SNATCH_AND_GRAB_SMASH_WINDOW", GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_WINDOW_SOUND)) bDoneSmashSound = TRUE ENDIF #IF IS_DEBUG_BUILD DEBUG_SKIP_MOCAP() #ENDIF BREAK // wait for player to switch CASE SMASH_THROUGH_WAIT_FOR_SWITCH IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN]) REQUEST_ADDITIONAL_COLLISION_AT_COORD(GET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])) ENDIF HIDE_HUD_AND_RADAR_THIS_FRAME() CASCADE_SHADOWS_SET_CASCADE_BOUNDS_SCALE(CASCADE_SHADOWS_MULTIPLIER_NO_OVERRIDE) SET_ROOM_FOR_GAME_VIEWPORT_BY_NAME("V_CIA01_cur_offc3") IF NOT bShownSwitchText IF DO_MISSION_GOD_TEXT("SG_SWITCH") bShownSwitchText = TRUE ENDIF ENDIF HANDLE_GUARD_ANIMATIONS(0) IF iGuardSpeech < 11 STRING sLabel INT iLine SWITCH iGuardSpeech CASE 0 sLabel = "FBI2_MICH2" iLine = 0 BREAK CASE 1 sLabel = "FBI2_SNIPE" iLine = 1 BREAK CASE 2 sLabel = "FBI2_CIA1" iLine = 0 BREAK CASE 3 sLabel = "FBI2_MRKSHT" iLine = 0 BREAK CASE 4 sLabel = "FBI2_CLEAR" iLine = 0 BREAK CASE 5 sLabel = "FBI_2_BACKUP" iLine = 0 BREAK CASE 6 sLabel = "FBI2_MRKSHT" iLine = 0 BREAK CASE 7 sLabel = "FBI2_ASK" iLine = 0 BREAK CASE 8 sLabel = "FBI2_CIA2" iLine = 0 BREAK CASE 9 sLabel = "FBI2_MRKSHT" iLine = 0 BREAK CASE 10 sLabel = "FBI2_GLIGHT" iLine = 0 BREAK ENDSWITCH IF DO_MISSION_SPEECH(sLabel, TRUE, iLine, FALSE, NOT IS_MESSAGE_BEING_DISPLAYED()) iGuardSpeech++ ENDIF ENDIF IF iGuardAttackTime < 0 IF iGuardSpeech > 10 iGuardAttackTime = GET_GAME_TIMER() + 2000 ENDIF ENDIF IF NOT bDoGuardsKillMichael #IF IS_DEBUG_BUILD IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_J) sSelectorPeds.eNewSelectorPed = SELECTOR_PED_FRANKLIN bDebugJSkip = TRUE ENDIF #ENDIF IF GET_GAME_TIMER() >= iGuardAttackTime AND iGuardAttackTime >= 0 SET_PLAYER_CONTROL(PLAYER_ID(), FALSE, SPC_ALLOW_PLAYER_DAMAGE) IF NOT IS_PED_INJURED(guardPed[2]) SET_PED_ACCURACY(guardPed[2], 100) SET_PED_SHOOT_RATE(guardPed[2], 100) TASK_SHOOT_AT_COORD(guardPed[2], GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_HEADSHOT), -1, FIRING_TYPE_CONTINUOUS) ENDIF iKillMichaelTime = GET_GAME_TIMER() bDoGuardsKillMichael = TRUE ELSE IF CAN_ADVANCE_MISSION() IF UPDATE_SELECTOR_HUD(sSelectorPeds, FALSE) #IF IS_DEBUG_BUILD OR bDebugJSkip #ENDIF IF sSelectorPeds.eNewSelectorPed = SELECTOR_PED_FRANKLIN REMOVE_MISSION_TEXT() CREATE_SPLINE_INTERP_TO_FRANKLIN() mocapStreamingStage = MOCAP_STREAMING_STAGE_REQUEST iSnatchAndGrabCutsceneTime = GET_GAME_TIMER() //REQUEST_REMOTE_SNIPER_ASSETS(remoteSniperData) // moved up to load sooner //HAVE_REMOTE_SNIPER_ASSETS_LOADED(remoteSniperData) SET_ENTITY_HEALTH(PLAYER_PED_ID(), 200) //SCRIPT_OVERRIDES_WIND_TYPES(true,"WEATHER_TYPES_MAGDEMO_FIB2_FRANKLIN","WEATHER_TYPES_MAGDEMO_FIB2_FRANKLIN") //PLAY_SOUND_FRONTEND(-1, "FBI_02_SWITCH_TO_FRANKLIN_MASTER") //PLAY_SOUND_FRONTEND(-1, "Hit_Out", "PLAYER_SWITCH_CUSTOM_SOUNDSET")//"Hit_In", "PLAYER_SWITCH_CUSTOM_SOUNDSET") "Hit_In", "PLAYER_SWITCH_CUSTOM_SOUNDSET" //PLAY_SOUND_FRONTEND(iSniperSwitchSoundID, "Camera_Move_Loop", "PLAYER_SWITCH_CUSTOM_SOUNDSET") bDoneFlash = FALSE STOP_SNATCH_AND_GRAB_AUDIO_SCENE(SNATCH_AND_GRAB_AUDIO_SCENE_MR_K_HOSTAGE) INFORM_MISSION_STATS_OF_INCREMENT(FBI2_SWITCHES) FILL_PUSH_IN_DATA(pushInData, dummyFranklinPed, CHAR_FRANKLIN, 0.2, 500, 500, 200, 300) SET_PUSH_IN_DIRECTION_MODIFIER(pushInData, <<0,0,5>>) smashThroughShot = SMASH_THROUGH_PAN ENDIF ENDIF ENDIF ENDIF ELSE IF NOT IS_PED_INJURED(PLAYER_PED_ID()) AND NOT bFakeKillMichael IF GET_ENTITY_HEALTH(PLAYER_PED_ID()) >= 105 SET_ENTITY_HEALTH(PLAYER_PED_ID(), 105) ENDIF IF GET_GAME_TIMER() >= iKillMichaelTime + 1000 SET_PED_TO_RAGDOLL(PLAYER_PED_ID(), 8000, 8000, TASK_RELAX) MISSION_FAILED(FAIL_MICHAEL_DEAD) bFakeKillMichael = TRUE ENDIF ELSE IF NOT bResetGuardAim IF NOT IS_PED_INJURED(guardPed[2]) TASK_AIM_GUN_AT_COORD(guardPed[2], GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_HEADSHOT), -1) IF NOT IS_PED_INJURED(prisonerPed) VECTOR vSceneMod vSceneMod = <<0,0,1.05>> iSyncScene = CREATE_SYNCHRONIZED_SCENE(GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_INTERROGATION) - vSceneMod, <<0.0, 0.0, INTERROGATION_ROT>>) IF NOT IS_PED_INJURED(prisonerPed) TASK_SYNCHRONIZED_SCENE(prisonerPed, iSyncScene, GET_SNATCH_AND_GRAB_ANIM_DICT_AS_STRING(SAG_ANIM_DICT_IN_OFFICE), "hostage_low_intro_mrk", NORMAL_BLEND_IN, NORMAL_BLEND_OUT) ENDIF ENDIF bResetGuardAim = TRUE ENDIF ENDIF ENDIF ENDIF BREAK // pan to franklin CASE SMASH_THROUGH_PAN IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN]) REQUEST_ADDITIONAL_COLLISION_AT_COORD(GET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN])) ENDIF SET_RADAR_AS_INTERIOR_THIS_FRAME(GET_HASH_KEY("V_FakeDT1_05"), 150.0, -700.0, 0, 1) IF NOT IS_PED_INJURED(GET_FRANKLIN_PED()) SET_MINIMAP_IN_SPECTATOR_MODE(TRUE, GET_FRANKLIN_PED()) ENDIF HIDE_HUD_AND_RADAR_THIS_FRAME() CASCADE_SHADOWS_SET_CASCADE_BOUNDS_SCALE(CASCADE_SHADOWS_MULTIPLIER_EXTERIOR_OVERRIDE) IF NOT bKilledSpeechOnPan IF GET_GAME_TIMER() >= (iSnatchAndGrabCutsceneTime + 100) KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() bKilledSpeechOnPan = TRUE ENDIF ELSE IF NOT bDoneFranklinSniperSpeech IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() bDoneFranklinSniperSpeech = DO_MISSION_SPEECH("FBI2_SNIPE", TRUE, 3) ENDIF ENDIF ENDIF IF NOT bDoneFlash ANIMPOSTFX_STOP_AND_FLUSH_REQUESTS("SwitchHUDMichaelOut") ANIMPOSTFX_STOP_AND_FLUSH_REQUESTS("SwitchHUDFranklinOut") ANIMPOSTFX_PLAY("SwitchShortMichaelIn", 0, FALSE) bDoneFlash = TRUE ENDIF IF NOT bDoneHitSound IF GET_GAME_TIMER() >= (iSnatchAndGrabCutsceneTime + 0) PLAY_SOUND_FRONTEND(-1, "Hit_Out", "PLAYER_SWITCH_CUSTOM_SOUNDSET") iHitTime = GET_GAME_TIMER() bDoneHitSound = TRUE ENDIF ENDIF IF NOT bWooshStarted IF bDoneHitSound IF GET_GAME_TIMER() >= iHitTime + 300 PLAY_SOUND_FRONTEND(-1, "Short_Transition_In", "PLAYER_SWITCH_CUSTOM_SOUNDSET") bWooshStarted = TRUE ENDIF ENDIF ENDIF IF NOT bDoneSwitchToFranklinCue IF GET_GAME_TIMER() >= (iSnatchAndGrabCutsceneTime + 200) bDoneSwitchToFranklinCue = TRIGGER_MISSION_MUSIC_EVENT("FIB2_SWITCHED_TO_FRANK") ENDIF ENDIF IF NOT bHitFranklinSound IF NOT IS_PED_INJURED(dummyFranklinPed) IF GET_GAME_TIMER() >= iSnatchAndGrabCutsceneTime + 1000 //PLAY_SOUND_FRONTEND(-1, "Hit_Out", "PLAYER_SWITCH_CUSTOM_SOUNDSET") STOP_SOUND(iSniperSwitchSoundID) //ANIMPOSTFX_PLAY("SwitchShortFranklinMid", 0, FALSE) bHitFranklinSound = TRUE ENDIF ENDIF ENDIF SWITCH replaceMrKStage CASE REPLACE_MR_K_STAGE_NOT_STARTED IF GET_GAME_TIMER() >= (iSnatchAndGrabCutsceneTime + 400) IF DOES_ENTITY_EXIST(prisonerPed) DELETE_PED(prisonerPed) ADD_MODEL_REQUEST(ENUM_TO_INT(SAGM_PRISONER_LOW)) CLEAR_MODEL_REQUEST(ENUM_TO_INT(SAGM_PRISONER_HIGH)) ENDIF replaceMrKStage = REPLACE_MR_K_STAGE_WAITING ENDIF BREAK CASE REPLACE_MR_K_STAGE_WAITING IF HAVE_ALL_MODEL_REQUESTS_SUCCEEDED() IF DOES_ROPE_EXIST(rappelData.rope) DELETE_ROPE(rappelData.rope) ENDIF CREATE_CHOPPER_ROPE(ROPE_TYPE_INSIDE, STAGE_SNIPE_GUARDS) CREATE_PRISONER_FOR_STAGE(STAGE_SNIPE_GUARDS) SET_ENTITY_VISIBLE(prisonerPed, FALSE) replaceMrKStage = REPLACE_MR_K_STAGE_DONE ENDIF BREAK CASE REPLACE_MR_K_STAGE_DONE BREAK ENDSWITCH IF GET_CURRENT_PLAYER_PED_ENUM() <> CHAR_FRANKLIN WHILE NOT DO_MISSION_HOTSWAP(SELECTOR_PED_FRANKLIN, TRUE, TRUE) WAIT_WITH_RECORD() ENDWHILE // Oneshot for camera pan to franklin //TRIGGER_MISSION_MUSIC_EVENT("FBI2_TEST_SNIPER_ONESHOT") bFrozenFranklin = FALSE ELSE IF NOT bFrozenFranklin FREEZE_FRANKLIN_AT_SNIPER() bFrozenFranklin = TRUE ENDIF SET_PLAYER_FORCE_SKIP_AIM_INTRO(PLAYER_ID(), TRUE) SET_PLAYER_FORCED_AIM(PLAYER_ID(), TRUE) ENDIF //HAVE_REMOTE_SNIPER_ASSETS_LOADED(remoteSniperData) #IF IS_DEBUG_BUILD /* IF GET_GAME_TIMER() < (iSnatchAndGrabCutsceneTime + iSniperNodeTime2+iSniperNodeTime3+iSniperNodeTime4+iSniperNodeTime5+iSniperNodeTime6) // SET_CAM_COORD(sCamDetails.camInterpIDs[0], vSniperNodePos1) // SET_CAM_ROT( sCamDetails.camInterpIDs[0], vSniperNodeRot1) SET_CAM_COORD(sCamDetails.camInterpIDs[1], vSniperNodePos2) SET_CAM_ROT( sCamDetails.camInterpIDs[1], vSniperNodeRot2) SET_CAM_COORD(sCamDetails.camInterpIDs[2], vSniperNodePos3) SET_CAM_ROT( sCamDetails.camInterpIDs[2], vSniperNodeRot3) //SET_CAM_COORD(sCamDetails.camInterpIDs[3], vSniperNodePos4) //SET_CAM_ROT( sCamDetails.camInterpIDs[3], vSniperNodeRot4) //SET_CAM_COORD(sCamDetails.camInterpIDs[4], vSniperNodePos5) //SET_CAM_ROT( sCamDetails.camInterpIDs[4], vSniperNodeRot5) ENDIF */ #ENDIF // Need to hide the fake Franklin floating in mid-air for the transition. //IF IS_ENTITY_VISIBLE(GET_FRANKLIN_PED()) AND GET_GAME_TIMER() < (iSnatchAndGrabCutsceneTime + iSniperNodeTime2 - 200) // SET_ENTITY_VISIBLE(GET_FRANKLIN_PED(), FALSE) //ELIF NOT IS_ENTITY_VISIBLE(GET_FRANKLIN_PED()) AND GET_GAME_TIMER() >= (iSnatchAndGrabCutsceneTime + iSniperNodeTime2) // SET_ENTITY_VISIBLE(GET_FRANKLIN_PED(), TRUE) //ENDIF SET_ENTITY_VISIBLE(GET_FRANKLIN_PED(), FALSE) IF GET_GAME_TIMER() >= iSnatchAndGrabCutsceneTime + 1100//1500//(iSnatchAndGrabCutsceneTime + iSniperNodeTime2+iSniperNodeTime3+1000) // was 4000, but transition is shorter now AND replaceMrKStage = REPLACE_MR_K_STAGE_DONE AND NOT IS_PED_INJURED(prisonerPed) AND HAVE_ALL_STREAMING_REQUESTS_COMPLETED(prisonerPed) IF HANDLE_PUSH_IN(pushInData, TRUE, FALSE) cutsceneStage = SAG_CUT_STAGE_CLEANUP ENDIF ENDIF BREAK ENDSWITCH BREAK CASE SAG_CUT_STAGE_CLEANUP IF bSkippedCutscene ENDIF fLockDoorOpen = DOOR_OPEN_RATIO SET_GAMEPLAY_CAM_RELATIVE_HEADING() //SET_PLAYER_FORCE_SKIP_AIM_INTRO(PLAYER_ID(), TRUE) //SET_PLAYER_FORCED_AIM(PLAYER_ID(), TRUE) // back to gameplay SET_MISSION_CUTSCENE(FALSE, TRUE, TRUE, FALSE) // Clean up the interp cameras we created. CLEANUP_HOTSWAP_CAMERAS() DESTROY_PUSH_IN_CAMS(pushInData) DISPLAY_HUD(TRUE) DISPLAY_RADAR(TRUE) DESTROY_MISSION_STATIC_CAM(interpCam) IF NOT IS_PED_INJURED(GET_FRANKLIN_PED()) SET_MINIMAP_IN_SPECTATOR_MODE(FALSE, NULL) ENDIF IF NOT IS_PED_INJURED(prisonerPed) SET_ENTITY_VISIBLE(prisonerPed, TRUE) ENDIF SET_MISSION_STAGE(STAGE_SNIPE_GUARDS, FALSE, FALSE) BREAK ENDSWITCH DISABLE_BLUR_ON_RIFLE_MODEL() ENDPROC CONST_FLOAT SMASH_IN_HEIGHT -62.90 FUNC VECTOR GET_TOWER_PED_ATTACH_POS(INT iPed) SWITCH iPed CASE 0 RETURN <<0, 0.070, 0.420>> BREAK CASE 1 RETURN <<-1.4, 0.300, 1.010>> BREAK CASE 2 RETURN <<0, 0.070, 0.420>> BREAK CASE 3 RETURN <<0, 0.070, 0.420>> BREAK CASE 4 RETURN <<0.70, 0.070, 1.010>> BREAK ENDSWITCH RETURN <<0,0,0>> ENDFUNC FUNC VECTOR GET_TOWER_PED_ATTACH_ROT(INT iPed) SWITCH iPed CASE 0 RETURN <<0,0,180.000>> BREAK CASE 1 RETURN <<0,0,225.000>> BREAK CASE 2 RETURN <<0,0,180.000>> BREAK CASE 3 RETURN <<0,0,180.000>> BREAK CASE 4 RETURN <<0,0,145.000>> BREAK ENDSWITCH RETURN <<0,0,0>> ENDFUNC FUNC INT GET_TOWER_PED_ATTACH_CHAIR(INT iPed) SWITCH iPed CASE 0 RETURN 0 BREAK CASE 1 RETURN 0 BREAK CASE 2 RETURN 1 BREAK CASE 3 RETURN 2 BREAK CASE 4 RETURN 2 BREAK ENDSWITCH RETURN 0 ENDFUNC // rappel to the window PROC DO_STAGE_RAPPEL_DOWN() INT i MAINTAIN_DOOR_OPEN() USE_SCRIPT_CAM_FOR_AMBIENT_POPULATION_ORIGIN_THIS_FRAME(TRUE, FALSE) SET_AMBIENT_VEHICLE_RANGE_MULTIPLIER_THIS_FRAME(RAPPEL_VEHICLE_RANGE_MULTIPLIER) DISABLE_ON_FOOT_FIRST_PERSON_VIEW_THIS_UPDATE() IF NOT bRunningCutscene // ensure chopper is always hovering //MAINTAIN_CHOPPER_HOVER() SET_RADAR_AS_INTERIOR_THIS_FRAME(GET_HASH_KEY("V_FakeDT1_05"), 150.0, -700.0, 0, 0) // latch doors //IF NOT bLatchedChopperDoors //LATCH_ALL_CHOPPER_DOORS() // SHUT_ALL_CHOPPER_DOORS() //bLatchedChopperDoors = TRUE //ENDIF // random vehicle generation //HANDLE_RANDOM_VEHICLE_GENERATION(FALSE) BOOL bAllowResetToIdle = TRUE // draw rope HANDLE_CHOPPER_ROPE(ROPE_TYPE_RAPPELLING) // prime the window to smash HANDLE_WINDOW_SMASH(FALSE) IF NOT bHasDoneJump IF rappelData.state = RAPPEL_STATE_JUMPING_STATIC OR rappelData.state = RAPPEL_STATE_JUMPING_DOWN bHasDoneJump = TRUE ENDIF ENDIF // Music change over once half way down building IF NOT bRappelMusicStart IF rappelData.vAttachPos.z <= -30 //TRIGGER_MISSION_MUSIC_EVENT("FBI2_TEST_RAPPEL_HALF") bRappelMusicStart = TRUE ENDIF ENDIF IF NOT bForcePassOnShitskip // michael talks to himself IF NOT bInitialisedInterrogation IF rappelData.vAttachPos.z > -50 IF iMichaelRappelSpeechStage < 5 IF GET_GAME_TIMER() >= iNextMichaelRappelSpeechTime IF IS_ENTITY_PLAYING_ANIM(PLAYER_PED_ID(), GET_RAPPEL_ANIM_DICT_NAME(), "Rappel_jump_a") IF GET_ENTITY_ANIM_CURRENT_TIME(PLAYER_PED_ID(), GET_RAPPEL_ANIM_DICT_NAME(), "Rappel_jump_a") <= 0.1 IF DO_MISSION_SPEECH("FBI2_RAPP") iMichaelRappelSpeechStage++ iNextMichaelRappelSpeechTime = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(8000, 10000) ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF // michael does jump and land speech IF NOT bForcePassOnShitskip SWITCH jumpGruntState CASE JUMP_GRUNT_READY IF IS_ENTITY_PLAYING_ANIM(PLAYER_PED_ID(), GET_RAPPEL_ANIM_DICT_NAME(), "Rappel_jump_a") IF GET_ENTITY_ANIM_CURRENT_TIME(PLAYER_PED_ID(), GET_RAPPEL_ANIM_DICT_NAME(), "Rappel_jump_a") <= 0.05 IF GET_RANDOM_INT_IN_RANGE(0,2) = 0 OR bAllowSmashIn jumpGruntState = JUMP_GRUNT_DO_ON_PUSH ELSE jumpGruntState = JUMP_GRUNT_DO_ON_LAND ENDIF ENDIF ENDIF BREAK CASE JUMP_GRUNT_DO_ON_PUSH IF IS_ENTITY_PLAYING_ANIM(PLAYER_PED_ID(), GET_RAPPEL_ANIM_DICT_NAME(), "Rappel_jump_a") IF GET_ENTITY_ANIM_CURRENT_TIME(PLAYER_PED_ID(), GET_RAPPEL_ANIM_DICT_NAME(), "Rappel_jump_a") <= 0.1 IF bInteriorCamIsOutside OR NOT bUsingOfficeCam //IF DO_MISSION_SPEECH("FBI2_JUMP", TRUE, 0, FALSE, FALSE) IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() IF GET_RANDOM_INT_IN_RANGE(0,2) = 0 PLAY_PAIN(PLAYER_PED_ID(), AUD_DAMAGE_REASON_CLIMB_SMALL,0) ELSE PLAY_PAIN(PLAYER_PED_ID(), AUD_DAMAGE_REASON_CLIMB_LARGE,0) ENDIF ENDIF jumpGruntState = JUMP_GRUNT_WAIT_FOR_RESET //ENDIF ELSE jumpGruntState = JUMP_GRUNT_WAIT_FOR_RESET ENDIF ELSE jumpGruntState = JUMP_GRUNT_READY ENDIF ELSE jumpGruntState = JUMP_GRUNT_READY ENDIF BREAK CASE JUMP_GRUNT_DO_ON_LAND IF IS_ENTITY_PLAYING_ANIM(PLAYER_PED_ID(), GET_RAPPEL_ANIM_DICT_NAME(), "Rappel_jump_a") IF GET_ENTITY_ANIM_CURRENT_TIME(PLAYER_PED_ID(), GET_RAPPEL_ANIM_DICT_NAME(), "Rappel_jump_a") >= 0.740 IF bInteriorCamIsOutside OR NOT bUsingOfficeCam IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() PLAY_PAIN(PLAYER_PED_ID(), AUD_DAMAGE_REASON_CLIMB_SMALL,0) ENDIF //IF DO_MISSION_SPEECH("FBI2_LAND", TRUE, 0, FALSE, FALSE) jumpGruntState = JUMP_GRUNT_READY //ENDIF ELSE jumpGruntState = JUMP_GRUNT_READY ENDIF ELIF GET_ENTITY_ANIM_CURRENT_TIME(PLAYER_PED_ID(), GET_RAPPEL_ANIM_DICT_NAME(), "Rappel_jump_a") >= 0.85 jumpGruntState = JUMP_GRUNT_READY ENDIF ELSE jumpGruntState = JUMP_GRUNT_READY ENDIF BREAK CASE JUMP_GRUNT_WAIT_FOR_RESET IF IS_ENTITY_PLAYING_ANIM(PLAYER_PED_ID(), GET_RAPPEL_ANIM_DICT_NAME(), "Rappel_jump_a") IF GET_ENTITY_ANIM_CURRENT_TIME(PLAYER_PED_ID(), GET_RAPPEL_ANIM_DICT_NAME(), "Rappel_jump_a") >= 0.2 jumpGruntState = JUMP_GRUNT_READY ENDIF ELSE jumpGruntState = JUMP_GRUNT_READY ENDIF ENDSWITCH // handle tower ped reactions //PRINTFLOAT(rappelData.vAttachPos.z) PRINTNL() REPEAT NUMBER_TOWER_WINDOWS i IF NOT bAlertedWindow[i] FLOAT fTopKick FLOAT fBottomKick FLOAT fTopLoiter FLOAT fBottomLoiter BOOL bKickedWindow = FALSE SWITCH i CASE 0 fTopKick = -14.77 fBottomKick = -16.98 fTopLoiter = -15.35 fBottomLoiter = -17.88 BREAK CASE 1 fTopKick = -38.86 fBottomKick = -41.10 fTopLoiter = -39.47 fBottomLoiter = -41.91 BREAK CASE 2 fTopKick = -46.82 fBottomKick = -49.15 fTopLoiter = -47.20 fBottomLoiter = -49.91 BREAK ENDSWITCH IF rappelData.vAttachPos.z <= fTopKick AND rappelData.vAttachPos.z >= fBottomKick IF IS_ENTITY_PLAYING_ANIM(rappelData.ped, GET_RAPPEL_ANIM_DICT_NAME(), "Rappel_jump_a") IF GET_ENTITY_ANIM_CURRENT_TIME(rappelData.ped, GET_RAPPEL_ANIM_DICT_NAME(), "Rappel_jump_a") >= 0.77 bKickedWindow = TRUE ENDIF ENDIF ENDIF IF rappelData.vAttachPos.z <= fTopLoiter AND rappelData.vAttachPos.z >= fBottomLoiter fAtWindowTime[i] = fAtWindowTime[i] +@ 1.0 ENDIF IF fAtWindowTime[i] >= 6.0 OR bKickedWindow iAlertedWindowTime[i] = GET_GAME_TIMER() bAlertedWindow[i] = TRUE ENDIF ELSE FLOAT fPassedWindow SWITCH i CASE 0 fPassedWindow = -18.68 BREAK CASE 1 fPassedWindow = -43.08 BREAK CASE 2 fPassedWindow = -50.57 BREAK ENDSWITCH IF rappelData.vAttachPos.z >= fPassedWindow IF GET_GAME_TIMER() >= iAlertedWindowTime[i] + 10000 MISSION_FAILED(FAIL_SEEN) ENDIF ENDIF ENDIF ENDREPEAT REPEAT NUMBER_TOWER_PEDS i IF NOT IS_PED_INJURED(towerPed[i]) INT iWindow INT iReactDelay STRING sEnterReactDict STRING sEnterReactAnim STRING sLoopReactDict STRING sLoopReactAnim SWITCH i CASE 0 iWindow = 1 iReactDelay = 0 sEnterReactDict = GET_SNATCH_AND_GRAB_ANIM_DICT_AS_STRING(SAG_ANIM_DICT_TOWER_SEATED_REACT) sEnterReactAnim = "back_right" sLoopReactDict = GET_SNATCH_AND_GRAB_ANIM_DICT_AS_STRING(SAG_ANIM_DICT_TOWER_SEATED_REACT) sLoopReactAnim = "back_right" BREAK CASE 1 iWindow = 1 iReactDelay = 300 sEnterReactDict = GET_SNATCH_AND_GRAB_ANIM_DICT_AS_STRING(SAG_ANIM_DICT_TOWER_STANDING_REACT_ENTER_L) sEnterReactAnim = "react_left_small_intro_a" sLoopReactDict = GET_SNATCH_AND_GRAB_ANIM_DICT_AS_STRING(SAG_ANIM_DICT_TOWER_STANDING_REACT_IDLE) sLoopReactAnim = "react_small_variations_b" BREAK CASE 2 iWindow = 2 iReactDelay = 0 sEnterReactDict = GET_SNATCH_AND_GRAB_ANIM_DICT_AS_STRING(SAG_ANIM_DICT_TOWER_SEATED_REACT) sEnterReactAnim = "forward" sLoopReactDict = GET_SNATCH_AND_GRAB_ANIM_DICT_AS_STRING(SAG_ANIM_DICT_TOWER_SEATED_REACT) sLoopReactAnim = "forward" BREAK CASE 3 iWindow = 0 iReactDelay = 400 sEnterReactDict = GET_SNATCH_AND_GRAB_ANIM_DICT_AS_STRING(SAG_ANIM_DICT_TOWER_SEATED_REACT) sEnterReactAnim = "back_right" sLoopReactDict = GET_SNATCH_AND_GRAB_ANIM_DICT_AS_STRING(SAG_ANIM_DICT_TOWER_SEATED_REACT) sLoopReactAnim = "back_right" BREAK CASE 4 iWindow = 0 iReactDelay = 0 sEnterReactDict = GET_SNATCH_AND_GRAB_ANIM_DICT_AS_STRING(SAG_ANIM_DICT_TOWER_STANDING_REACT_ENTER_R) sEnterReactAnim = "react_right_small_intro_a" sLoopReactDict = GET_SNATCH_AND_GRAB_ANIM_DICT_AS_STRING(SAG_ANIM_DICT_TOWER_STANDING_REACT_IDLE) sLoopReactAnim = "react_small_variations_a" BREAK ENDSWITCH FLOAT fPhase ANIMATION_FLAGS flags SWITCH towerPedState[i] CASE TOWER_PED_STATE_UNALERTED IF bAlertedWindow[iWindow] IF GET_GAME_TIMER() >= iAlertedWindowTime[iWindow] + iReactDelay //TASK_CLEAR_LOOK_AT(towerPed[i]) IF i=1 OR i=4 flags = AF_HOLD_LAST_FRAME | AF_IGNORE_GRAVITY DETACH_ENTITY(towerPed[i]) ELSE flags = AF_LOOPING ENDIF TASK_PLAY_ANIM(towerPed[i], sEnterReactDict, sEnterReactAnim, SLOW_BLEND_IN, SLOW_BLEND_OUT, -1, flags) TASK_LOOK_AT_ENTITY(towerPed[i], PLAYER_PED_ID(), -1, SLF_WHILE_NOT_IN_FOV) towerPedState[i] = TOWER_PED_STATE_ENTER_REACT ENDIF ENDIF BREAK CASE TOWER_PED_STATE_ENTER_REACT IF IS_ENTITY_PLAYING_ANIM(towerPed[i], sEnterReactDict, sEnterReactAnim) fPhase = GET_ENTITY_ANIM_CURRENT_TIME(towerPed[i], sEnterReactDict, sEnterReactAnim) IF fPhase >= 0.0 AND (i=1 OR i=4) //ATTACH_ENTITY_TO_ENTITY(towerPed[i], towerChairObject[GET_TOWER_PED_ATTACH_CHAIR(i)], 0, GET_ANIM_INITIAL_OFFSET_POSITION(sEnterReactDict, sEnterReactAnim, GET_TOWER_PED_ATTACH_POS(i), GET_TOWER_PED_ATTACH_ROT(i), fPhase) , GET_ANIM_INITIAL_OFFSET_ROTATION(sEnterReactDict, sEnterReactAnim, GET_TOWER_PED_ATTACH_POS(i), GET_TOWER_PED_ATTACH_ROT(i), fPhase)) IF fPhase >= 0.98 IF i=1 OR i=4 flags = AF_LOOPING | AF_IGNORE_GRAVITY ELSE flags = AF_LOOPING ENDIF TASK_PLAY_ANIM(towerPed[i], sLoopReactDict, sLoopReactAnim, SLOW_BLEND_IN, SLOW_BLEND_OUT, -1, flags) towerPedState[i] = TOWER_PED_STATE_REACTING ENDIF ENDIF ENDIF BREAK CASE TOWER_PED_STATE_REACTING IF IS_ENTITY_PLAYING_ANIM(towerPed[i], sLoopReactDict, sLoopReactAnim) fPhase = GET_ENTITY_ANIM_CURRENT_TIME(towerPed[i], sLoopReactDict, sLoopReactAnim) IF fPhase >= 0.0 VECTOR vLastEnterPos vLastEnterPos = GET_ANIM_INITIAL_OFFSET_POSITION(sEnterReactDict, sEnterReactAnim, <<0,0,0>>, <<0,0,0>>, 1.0) vLastEnterPos=vLastEnterPos VECTOR vLastEnterRot vLastEnterRot = GET_ANIM_INITIAL_OFFSET_ROTATION(sEnterReactDict, sEnterReactAnim, <<0,0,0>>, <<0,0,0>>, 1.0) vLastEnterRot=vLastEnterRot //PRINTSTRING("last enter pos = ") PRINTVECTOR(vLastEnterPos) PRINTNL() //PRINTSTRING("last enter rot = ") PRINTVECTOR(vLastEnterRot) PRINTNL() //PRINTSTRING("init offset = ") PRINTVECTOR(GET_ANIM_INITIAL_OFFSET_POSITION(sLoopReactDict, sLoopReactAnim, vLastEnterPos + GET_TOWER_PED_ATTACH_POS(i), vLastEnterRot + GET_TOWER_PED_ATTACH_ROT(i), fPhase)) PRINTNL() //PRINTSTRING("init rot = ") PRINTVECTOR(GET_ANIM_INITIAL_OFFSET_ROTATION(sLoopReactDict, sLoopReactAnim, vLastEnterPos + GET_TOWER_PED_ATTACH_POS(i), vLastEnterRot + GET_TOWER_PED_ATTACH_ROT(i), fPhase)) PRINTNL() //PRINTSTRING("init offset unmodified = ") PRINTVECTOR(GET_ANIM_INITIAL_OFFSET_POSITION(sLoopReactDict, sLoopReactAnim, GET_TOWER_PED_ATTACH_POS(i), GET_TOWER_PED_ATTACH_ROT(i), fPhase)) PRINTNL() //PRINTSTRING("init rot unmodified = ") PRINTVECTOR(GET_ANIM_INITIAL_OFFSET_ROTATION(sLoopReactDict, sLoopReactAnim, GET_TOWER_PED_ATTACH_POS(i), GET_TOWER_PED_ATTACH_ROT(i), fPhase)) PRINTNL() //ATTACH_ENTITY_TO_ENTITY(towerPed[i], towerChairObject[GET_TOWER_PED_ATTACH_CHAIR(i)], 0, GET_ANIM_INITIAL_OFFSET_POSITION(sLoopReactDict, sLoopReactAnim, vLastEnterPos + GET_TOWER_PED_ATTACH_POS(i), vLastEnterRot + GET_TOWER_PED_ATTACH_ROT(i), fPhase) , GET_ANIM_INITIAL_OFFSET_ROTATION(sLoopReactDict, sLoopReactAnim, vLastEnterPos + GET_TOWER_PED_ATTACH_POS(i), vLastEnterRot + GET_TOWER_PED_ATTACH_ROT(i), fPhase)) ENDIF ENDIF BREAK ENDSWITCH ENDIF ENDREPEAT ENDIF // create the interrogation SWITCH createInterrogationStage CASE CREATE_INTERROGATION_STAGE_NOT_STARTED IF rappelData.vAttachPos.z <= -10 ADD_MODEL_REQUEST(ENUM_TO_INT(SAGM_PRISONER_HIGH)) ADD_MODEL_REQUEST(ENUM_TO_INT(SAGM_GUARD)) ADD_MODEL_REQUEST(ENUM_TO_INT(SAGM_MICHELLE)) ADD_MODEL_REQUEST(ENUM_TO_INT(SAGM_TORCH)) // ADD_ANIM_DICT_REQUEST(SAG_ANIM_DICT_MISSION) ADD_ANIM_DICT_REQUEST(SAG_ANIM_DICT_CUTSCENES) ADD_ANIM_DICT_REQUEST(SAG_ANIM_DICT_TOWER_SEATED) ADD_ANIM_DICT_REQUEST(SAG_ANIM_DICT_TOWER_STANDING) ADD_ANIM_DICT_REQUEST(SAG_ANIM_DICT_TOWER_SEATED_REACT) ADD_ANIM_DICT_REQUEST(SAG_ANIM_DICT_TOWER_STANDING_REACT_ENTER_L) ADD_ANIM_DICT_REQUEST(SAG_ANIM_DICT_TOWER_STANDING_REACT_ENTER_R) ADD_ANIM_DICT_REQUEST(SAG_ANIM_DICT_TOWER_STANDING_REACT_IDLE) createInterrogationStage = CREATE_INTERROGATION_STAGE_WAITING ENDIF BREAK CASE CREATE_INTERROGATION_STAGE_WAITING IF HAVE_ALL_MODEL_REQUESTS_SUCCEEDED() AND HAVE_ALL_ANIM_DICT_REQUESTS_SUCCEEDED() AND IS_OFFICE_READY() IF rappelData.vAttachPos.z <= -50 CREATE_OFFICE_PEDS_FOR_RAPPEL() createInterrogationStage = CREATE_INTERROGATION_STAGE_DONE ENDIF ENDIF BREAK CASE CREATE_INTERROGATION_STAGE_DONE BREAK ENDSWITCH IF NOT bForcePassOnShitskip // create tower peds IF createInterrogationStage >= CREATE_INTERROGATION_STAGE_WAITING AND HAVE_ALL_MODEL_REQUESTS_SUCCEEDED() AND HAVE_ALL_ANIM_DICT_REQUESTS_SUCCEEDED() // chairs VECTOR vChairPos FLOAT fChairRot REPEAT NUMBER_TOWER_CHAIRS i IF NOT DOES_ENTITY_EXIST(towerChairObject[i]) AND NOT bInitialisedInterrogation SWITCH i CASE 0 vChairPos = <<113.300,-618.500,229.020>> fChairRot = 57.700 BREAK CASE 1 vChairPos = <<113.000,-620.500,221.000>> fChairRot = 241.700 BREAK CASE 2 vChairPos = <<113.27467, -618.57690,253.16>> fChairRot = 57.700 BREAK ENDSWITCH towerChairObject[i] = GET_CLOSEST_OBJECT_OF_TYPE(vChairPos, 2.0, V_CORP_OFFCHAIR) //PRINTSTRING("grabbed!") PRINTNL() IF DOES_ENTITY_EXIST(towerChairObject[i]) SET_ENTITY_COORDS(towerChairObject[i], vChairPos) SET_ENTITY_HEADING(towerChairObject[i], fChairRot) FREEZE_ENTITY_POSITION(towerChairObject[i], TRUE) ENDIF ENDIF ENDREPEAT // peds STRING sAnim STRING sDict INT iHead INT iHeadTexture INT iTorso INT iTorsoTexture INT iLegTexture INT iHair INT iTask REPEAT NUMBER_TOWER_PEDS i IF NOT DOES_ENTITY_EXIST(towerPed[i]) AND NOT bInitialisedInterrogation SWITCH i CASE 0 iHead = 2 iHeadTexture = 0 iTorso = 1 iTorsoTexture = 1 iLegTexture = 2 iTask = 0 iHair = 1 sAnim = "base" sDict = GET_SNATCH_AND_GRAB_ANIM_DICT_AS_STRING(SAG_ANIM_DICT_TOWER_SEATED) BREAK CASE 1 iHead = 1 iHeadTexture = 0 iTorso = 2 iTorsoTexture = 0 iLegTexture = 0 iTask = 0 iHair = 1 sAnim = "BASE" sDict = GET_SNATCH_AND_GRAB_ANIM_DICT_AS_STRING(SAG_ANIM_DICT_TOWER_STANDING) BREAK CASE 2 iHead = 0 iHeadTexture = 0 iTorso = 1 iTorsoTexture = 0 iLegTexture = 2 iTask = 0 iHair = 1 sAnim = "base" sDict = GET_SNATCH_AND_GRAB_ANIM_DICT_AS_STRING(SAG_ANIM_DICT_TOWER_SEATED) BREAK CASE 3 iHead = 0 iHeadTexture = 0 iTorso = 0 iTorsoTexture = 5 iLegTexture = 0 iTask = 1 iHair = 1 sAnim = "base" sDict = GET_SNATCH_AND_GRAB_ANIM_DICT_AS_STRING(SAG_ANIM_DICT_TOWER_SEATED) BREAK CASE 4 iHead = 2 iHeadTexture = 0 iTorso = 1 iTorsoTexture = 0 iLegTexture = 2 iTask = 1 iHair = 1 sAnim = "BASE" sDict = GET_SNATCH_AND_GRAB_ANIM_DICT_AS_STRING(SAG_ANIM_DICT_TOWER_STANDING) BREAK ENDSWITCH IF DOES_ENTITY_EXIST(towerChairObject[GET_TOWER_PED_ATTACH_CHAIR(i)]) towerPed[i] = CREATE_PED(PEDTYPE_MISSION, GET_MODEL_FOR_SNATCH_AND_GRAB_MODEL_ENUM(SAGM_GUARD), <>) SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(towerPed[i], TRUE) ATTACH_ENTITY_TO_ENTITY(towerPed[i], towerChairObject[GET_TOWER_PED_ATTACH_CHAIR(i)], 0, GET_TOWER_PED_ATTACH_POS(i), GET_TOWER_PED_ATTACH_ROT(i)) TASK_PLAY_ANIM(towerPed[i], sDict, sAnim, NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING) IF i=1 TASK_LOOK_AT_COORD(towerPed[i], <<113.8, -618.9, 230.2>>, -1) ELIF i=4 TASK_LOOK_AT_COORD(towerPed[i], <<113.8, -618.9, 254.2>>, -1) ENDIF SET_PED_COMPONENT_VARIATION(towerPed[i], PED_COMP_HEAD, iHead, iHeadTexture) SET_PED_COMPONENT_VARIATION(towerPed[i], PED_COMP_TORSO, iTorso, iTorsoTexture) SET_PED_COMPONENT_VARIATION(towerPed[i], PED_COMP_LEG, 0, iLegTexture) SET_PED_COMPONENT_VARIATION(towerPed[i], PED_COMP_SPECIAL2, iTask, 0) SET_PED_COMPONENT_VARIATION(towerPed[i], PED_COMP_HAIR, iHair, 0) ENDIF ENDIF ENDREPEAT ENDIF ENDIF //PRINTFLOAT(rappelData.vAttachPos.z) PRINTNL() IF bForcePassOnShitskip rappelData.vAttachPos.z = rappelData.fLimitZ IF NOT bAllowSmashIn IF IS_SYNCHRONIZED_SCENE_RUNNING(iSyncScene) SET_SYNCHRONIZED_SCENE_PHASE(iSyncScene, 0.69) STOP_SYNCHRONIZED_AUDIO_EVENT(iSyncScene) ENDIF ENDIF ENDIF IF createInterrogationStage = CREATE_INTERROGATION_STAGE_DONE IF NOT bInitialisedInterrogation BOOL bDoInitialise bDoInitialise = FALSE IF rappelData.vAttachPos.z <= -60 bDoInitialise = TRUE ENDIF IF NOT IS_PED_INJURED(prisonerPed) IF IS_ENTITY_ON_SCREEN(prisonerPed) bDoInitialise = TRUE ENDIF ENDIF IF bDoInitialise IF DOES_ENTITY_EXIST(chairObject) IF DOES_ENTITY_HAVE_DRAWABLE(chairObject) AND PREPARE_SYNCHRONIZED_AUDIO_EVENT("FBI_02_MCS_3_P1B", 0) // rob 674211 // get rid of tower peds REPEAT NUMBER_TOWER_PEDS i IF DOES_ENTITY_EXIST(towerPed[i]) DELETE_PED(towerPed[i]) ENDIF ENDREPEAT REPEAT NUMBER_TOWER_CHAIRS i IF DOES_ENTITY_EXIST(towerChairObject[i]) SET_OBJECT_AS_NO_LONGER_NEEDED(towerChairObject[i]) ENDIF ENDREPEAT CLEAR_ANIM_DICT_REQUEST(SAG_ANIM_DICT_TOWER_SEATED) CLEAR_ANIM_DICT_REQUEST(SAG_ANIM_DICT_TOWER_STANDING) CLEAR_ANIM_DICT_REQUEST(SAG_ANIM_DICT_TOWER_SEATED_REACT) CLEAR_ANIM_DICT_REQUEST(SAG_ANIM_DICT_TOWER_STANDING_REACT_ENTER_L) CLEAR_ANIM_DICT_REQUEST(SAG_ANIM_DICT_TOWER_STANDING_REACT_ENTER_R) CLEAR_ANIM_DICT_REQUEST(SAG_ANIM_DICT_TOWER_STANDING_REACT_IDLE) INIT_INTERROGATION() bInitialisedInterrogation = TRUE ENDIF ENDIF ENDIF ELSE // PRINTFLOAT(GET_SYNCHRONIZED_SCENE_PHASE(iSyncScene)) PRINTNL() // handle hold shots /* IF iHoldShotStage < 0 IF GET_SYNCHRONIZED_SCENE_PHASE(iSyncScene) > 0 holdShotCam = CREATE_CAM("DEFAULT_SCRIPTED_CAMERA", FALSE) iHoldShotStage = 0 ENDIF ELSE // update hold shot cam FLOAT fUpdatePhase SWITCH iHoldShotStage CASE 0 fUpdatePhase = 0.097 BREAK CASE 1 fUpdatePhase = 0.221 BREAK CASE 2 fUpdatePhase = 0.357 BREAK CASE 3 fUpdatePhase = 0.468 BREAK CASE 4 fUpdatePhase = 0.516 BREAK CASE 5 fUpdatePhase = 0.612 BREAK CASE 6 fUpdatePhase = 0.685 BREAK CASE 7 fUpdatePhase = 0.754 BREAK CASE 8 fUpdatePhase = 0.849 BREAK DEFAULT fUpdatePhase = 1.1 BREAK ENDSWITCH IF GET_SYNCHRONIZED_SCENE_PHASE(iSyncScene) >= fUpdatePhase // PRINTSTRING("UPDATE HOLD SHOT CAM!") PRINTNL() SET_CAM_COORD(holdShotCam, GET_CAM_COORD(animCam)) SET_CAM_ROT(holdShotCam, GET_CAM_ROT(animCam)) SET_CAM_FOV(holdShotCam, GET_CAM_FOV(animCam)) iHoldShotTime = GET_GAME_TIMER() iHoldShotStage++ ENDIF ENDIF */ IF GET_SYNCHRONIZED_SCENE_PHASE(iSyncScene) >= 0.4 HANDLE_STREAMING_MOCAP("fbi_2_mcs_3_p1a", GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_WINDOW_FRAME), DEFAULT_CUTSCENE_LOAD_DIST, DEFAULT_CUTSCENE_UNLOAD_DIST) IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY() IF NOT IS_PED_INJURED(GET_MICHAEL_PED()) SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Michael", GET_MICHAEL_PED()) ENDIF IF NOT IS_PED_INJURED(prisonerPed) SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("MR_K", prisonerPed) //SET_CUTSCENE_PED_COMPONENT_VARIATION("MR_K", PED_COMP_SPECIAL, 2, 0) ENDIF IF NOT IS_PED_INJURED(michellePed) SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Michelle", michellePed) ENDIF IF NOT IS_PED_INJURED(guardPed[0]) SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("CIA_Goon_1", guardPed[0]) ENDIF IF NOT IS_PED_INJURED(guardPed[1]) SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Lead_CIA", guardPed[1]) ENDIF IF NOT IS_PED_INJURED(guardPed[2]) SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("CIA_Goon_2", guardPed[2]) ENDIF ENDIF ENDIF IF NOT bKeepTorch IF GET_SYNCHRONIZED_SCENE_PHASE(iSyncScene) >= 0.96 //PRINTVECTOR(GET_ENTITY_ROTATION(torchObject)) PRINTNL() bKeepTorch = TRUE ENDIF ENDIF IF NOT bForcePassOnShitskip // interrogation subs FLOAT fSubPhase STRING sSubLabel BOOL bIsClear = FALSE SWITCH iInterrogationSubCount CASE 0 fSubPhase = 0.099 sSubLabel = "SG_SUB1" BREAK CASE 1 fSubPhase = 0.161 bIsClear = TRUE BREAK CASE 2 fSubPhase = 0.183 sSubLabel = "SG_SUB2" BREAK CASE 3 fSubPhase = 0.218 bIsClear = TRUE BREAK CASE 4 fSubPhase = 0.235 sSubLabel = "SG_SUB3" BREAK CASE 5 fSubPhase = 0.313 bIsClear = TRUE BREAK CASE 6 fSubPhase = 0.323 sSubLabel = "SG_SUB4" BREAK CASE 7 fSubPhase = 0.339 bIsClear = TRUE BREAK CASE 8 fSubPhase = 0.351 sSubLabel = "SG_SUB5" BREAK CASE 9 fSubPhase = 0.405 bIsClear = TRUE BREAK CASE 10 fSubPhase = 0.463 sSubLabel = "SG_SUB6" BREAK CASE 11 fSubPhase = 0.480 bIsClear = TRUE BREAK CASE 12 fSubPhase = 0.553 sSubLabel = "SG_SUB7" BREAK CASE 13 fSubPhase = 0.590 bIsClear = TRUE BREAK CASE 14 fSubPhase = 0.606 sSubLabel = "SG_SUB8" BREAK CASE 15 fSubPhase = 0.649 bIsClear = TRUE BREAK CASE 16 fSubPhase = 0.677 sSubLabel = "SG_SUB9" BREAK CASE 17 fSubPhase = 0.736 bIsClear = TRUE BREAK CASE 18 fSubPhase = 0.745 sSubLabel = "SG_SUB10" BREAK CASE 19 fSubPhase = 0.756 bIsClear = TRUE BREAK CASE 20 fSubPhase = 0.782 sSubLabel = "SG_SUB11" BREAK CASE 21 fSubPhase = 0.789 bIsClear = TRUE BREAK CASE 22 fSubPhase = 0.810 sSubLabel = "SG_SUB12" BREAK CASE 23 fSubPhase = 0.834 bIsClear = TRUE BREAK CASE 24 fSubPhase = 0.861 sSubLabel = "SG_SUB13" BREAK CASE 25 fSubPhase = 0.910 bIsClear = TRUE BREAK ENDSWITCH IF iInterrogationSubCount < 26 IF GET_SYNCHRONIZED_SCENE_PHASE(iSyncScene) >= fSubPhase IF IS_SUBTITLE_PREFERENCE_SWITCHED_ON() IF NOT bIsClear FORCE_NEXT_MESSAGE_TO_PREVIOUS_BRIEFS_LIST(PREVIOUS_BRIEF_FORCE_DIALOGUE) PRINT_NOW(sSubLabel, DEFAULT_GOD_TEXT_TIME, 1) ELSE CLEAR_PRINTS() ENDIF ELSE CLEAR_PRINTS() ENDIF iInterrogationSubCount++ ENDIF ENDIF ENDIF // request animations IF NOT bRequestedGuardAnims IF GET_SYNCHRONIZED_SCENE_PHASE(iSyncScene) >= 0.5 ADD_ANIM_DICT_REQUEST(SAG_ANIM_DICT_GUARDS) bRequestedGuardAnims = TRUE ENDIF ENDIF // Changing music for the torture cutscene IF NOT bTortureMusicStart IF rappelData.vAttachPos.z <= -60.00 //TRIGGER_MISSION_MUSIC_EVENT("FBI2_TEST_TORTURE_CS_START") bTortureMusicStart = TRUE ENDIF ENDIF //PRINTFLOAT(rappelData.vAttachPos.z) PRINTNL() // smash in IF NOT bAllowSmashIn IF GET_SYNCHRONIZED_SCENE_PHASE(iSyncScene) >= 0.59 AND HAVE_ALL_ANIM_DICT_REQUESTS_SUCCEEDED() //SET_RAPPEL_AI(rappelData, RAPPEL_AI_STOP) // set lower limit for jumping down rappelData.fLimitZ = -64.8 ADD_ANIM_DICT_REQUEST(SAG_ANIM_DICT_IN_OFFICE) ADD_ANIM_DICT_REQUEST(SAG_ANIM_DICT_AIM_VARIATIONS) bAllowSmashIn = TRUE ENDIF ELSE IF NOT bRegisteredSmash IF NOT bGaveGuardWeapon IF GET_SYNCHRONIZED_SCENE_PHASE(iSyncScene) >= 0.800 IF NOT IS_PED_INJURED(guardPed[0]) GIVE_WEAPON_TO_PED(guardPed[0], GET_SNATCH_AND_GRAB_WEAPON_TYPE(SAG_WEAPON_CIA_PISTOL), INFINITE_AMMO, TRUE) SET_PED_COMPONENT_VARIATION(guardPed[0], PED_COMP_HAIR, 3, 0) bGaveGuardWeapon = TRUE ENDIF ENDIF ENDIF IF rappelData.vAttachPos.z <= SMASH_IN_HEIGHT // guard shoots and kills you IF NOT g_bMagDemoActive AND NOT bForcePassOnShitskip #IF IS_DEBUG_BUILD AND NOT bDebugJSkip #ENDIF IF NOT bTriggeredGuardShoot IF GET_SYNCHRONIZED_SCENE_PHASE(iSyncScene) >= 0.800 IF NOT IS_PED_INJURED(guardPed[0]) //SET_CURRENT_PED_WEAPON(guardPed[0], GET_SNATCH_AND_GRAB_WEAPON_TYPE(SAG_WEAPON_CIA_PISTOL), TRUE) SET_PLAYER_CONTROL(PLAYER_ID(), FALSE, SPC_ALLOW_PLAYER_DAMAGE | SPC_REENABLE_CONTROL_ON_DEATH) SET_PED_ACCURACY(guardPed[0], 100) //TASK_SHOOT_AT_COORD(guardPed[0], GET_ENTITY_COORDS(PLAYER_PED_ID()), -1, FIRING_TYPE_CONTINUOUS) ENDIF bTriggeredGuardShoot = TRUE ENDIF ELSE IF iGuardShot < 3 FLOAT fShotPhase SWITCH iGuardShot CASE 0 fShotPhase = 0.935 BREAK CASE 1 fShotPhase = 0.940 BREAK CASE 2 fShotPhase = 0.946 BREAK ENDSWITCH IF GET_SYNCHRONIZED_SCENE_PHASE(iSyncScene) >= fShotPhase IF NOT IS_PED_INJURED(guardPed[0]) SET_PED_SHOOTS_AT_COORD(guardPed[0], GET_ENTITY_COORDS(PLAYER_PED_ID())) iGuardShot++ ENDIF ENDIF ENDIF IF NOT bRegisteredSmash IF NOT IS_PED_INJURED(guardPed[0]) IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(PLAYER_PED_ID(), guardPed[0]) APPLY_DAMAGE_TO_PED(PLAYER_PED_ID(), 1000, TRUE) ENDIF ENDIF IF NOT IS_PED_INJURED(PLAYER_PED_ID()) IF iGuardShot = 3 MISSION_FAILED(FAIL_SEEN) ENDIF ENDIF ENDIF ENDIF ENDIF IF NOT bForcePassOnShitskip DISPLAY_HELP_TEXT_THIS_FRAME("SG_RAPHLP3B", FALSE) ENDIF #IF IS_DEBUG_BUILD IF bDebugJSkip bRegisteredSmash = TRUE ENDIF #ENDIF IF bForcePassOnShitskip bRegisteredSmash = TRUE ENDIF //IF IS_DISABLED_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_SCRIPT_RT) // check point in anim IF IS_ENTITY_PLAYING_ANIM(PLAYER_PED_ID(), GET_RAPPEL_ANIM_DICT_NAME(), "Rappel_jump_a") FLOAT fTime = GET_ENTITY_ANIM_CURRENT_TIME(PLAYER_PED_ID(), GET_RAPPEL_ANIM_DICT_NAME(), "Rappel_jump_a") IF fTime >= 0.1 AND fTime <= 0.80 IF CAN_ADVANCE_MISSION() START_SNATCH_AND_GRAB_AUDIO_SCENE(SNATCH_AND_GRAB_AUDIO_SCENE_BREAK_THE_GLASS) bRegisteredSmash = TRUE ENDIF ENDIF ENDIF //ENDIF ENDIF ELSE IF CAN_ADVANCE_MISSION() IF IS_ENTITY_PLAYING_ANIM(PLAYER_PED_ID(), GET_RAPPEL_ANIM_DICT_NAME(), "Rappel_jump_a") IF GET_ENTITY_ANIM_CURRENT_TIME(PLAYER_PED_ID(), GET_RAPPEL_ANIM_DICT_NAME(), "Rappel_jump_a") >= 0.70 IF HAS_CUTSCENE_LOADED_WITH_FAILSAFE() REPLAY_RECORD_BACK_FOR_TIME(2.0) STOP_SYNCHRONIZED_AUDIO_EVENT(iSyncScene) bRunningCutscene = TRUE ENDIF ENDIF ELSE IF HAS_CUTSCENE_LOADED_WITH_FAILSAFE() REPLAY_RECORD_BACK_FOR_TIME(2.0) STOP_SYNCHRONIZED_AUDIO_EVENT(iSyncScene) bRunningCutscene = TRUE ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF IF NOT bForcePassOnShitskip // see in help IF NOT bDoneSeeHelp IF bInitialisedInterrogation IF GET_SYNCHRONIZED_SCENE_PHASE(iSyncScene) >= 0.01 bDoneSeeHelp = DO_MISSION_HELP_TEXT("SG_SEEHLP", TRUE) ENDIF ENDIF ELSE /* // wait help IF NOT bDoneWaitHelp IF bAllowSmashIn bDoneWaitHelp = TRUE ELSE IF rappelData.vAttachPos.z <= -60.0 bDoneWaitHelp = DO_MISSION_HELP_TEXT("SG_WAIHLP") ENDIF ENDIF ENDIF */ ENDIF ENDIF IF NOT bForcePassOnShitskip // handle interior cam IF bInitialisedInterrogation IF GET_SYNCHRONIZED_SCENE_PHASE(iSyncScene) >= 0.742 bInteriorCamIsOutside = TRUE ENDIF ENDIF BOOL bCancelOfficeCam = FALSE BOOL bForceCamOff = FALSE IF bRegisteredSmash OR NOT DOES_CAM_EXIST(animCam) OR NOT bInitialisedInterrogation bForceCamOff = TRUE ENDIF IF IS_DISABLED_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_SCRIPT_RRIGHT) AND NOT bForceCamOff IF NOT bUsingOfficeCam IF NOT bWaitingOnOfficeCamRelease IF NOT bInteriorCamIsOutside SET_HIDOF_OVERRIDE(TRUE, TRUE, 0, 0, 100000, 100000) MUFFLE_HELI_SOUND_INDOORS(TRUE) SET_VARIABLE_ON_SYNCH_SCENE_AUDIO("INOUT", 1) // rob 674211 ENDIF IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("SG_SEEHLP") IF GET_GAME_TIMER() >= iClearHelpTime + 1000 CLEAR_HELP(FALSE) iClearHelpTime = GET_GAME_TIMER() ENDIF ENDIF SET_CAM_ACTIVE(animCam, TRUE) //Set multihead blinders on SET_MULTIHEAD_SAFE(TRUE,TRUE) DISPLAY_RADAR(FALSE) bDoneSeeHelp = TRUE iActivatedOfficeCamTime = GET_GAME_TIMER() bUsingOfficeCam = TRUE ENDIF ELSE IF bStuckOnOfficeCam bCancelOfficeCam = TRUE //Set multihead blinders off SET_MULTIHEAD_SAFE(FALSE,TRUE) bWaitingOnOfficeCamRelease = TRUE ENDIF ENDIF ELSE bWaitingOnOfficeCamRelease = FALSE //CLEAR_ROOM_FOR_GAME_VIEWPORT() IF bUsingOfficeCam IF (GET_GAME_TIMER() >= iActivatedOfficeCamTime + 500 AND NOT bStuckOnOfficeCam) OR bForceCamOff bCancelOfficeCam = TRUE //Set multihead blinders off SET_MULTIHEAD_SAFE(FALSE,TRUE) ELSE bStuckOnOfficeCam = TRUE ENDIF ENDIF ENDIF IF NOT bUnmuffledRappelAudioScene IF bInteriorCamIsOutside MUFFLE_HELI_SOUND_INDOORS(FALSE) SET_VARIABLE_ON_SYNCH_SCENE_AUDIO("INOUT", 0) // rob 674211 bUnmuffledRappelAudioScene = TRUE ENDIF ENDIF IF bCancelOfficeCam MUFFLE_HELI_SOUND_INDOORS(FALSE) SET_VARIABLE_ON_SYNCH_SCENE_AUDIO("INOUT", 0) // rob 674211 SET_CAM_ACTIVE(animCam, FALSE) SET_HIDOF_OVERRIDE(FALSE, TRUE, 0, 0, 0, 0) //SET_CAM_ACTIVE(holdShotCam, FALSE) DISPLAY_RADAR(TRUE) printstring("radar on!") printnl() //bHoldingShot = FALSE bStuckOnOfficeCam = FALSE bUsingOfficeCam = FALSE ENDIF ENDIF ENDIF IF NOT bRunningCutscene BOOL bForceRappelAI = FALSE IF NOT bForcePassOnShitskip // handle rappel AI IF bInitialisedInterrogation IF rappelData.vAttachPos.z > SMASH_IN_HEIGHT IF bUsingOfficeCam OR GET_SYNCHRONIZED_SCENE_PHASE(iSyncScene) >= 0.58 SET_RAPPEL_AI(rappelData, RAPPEL_AI_MOVE_SLOW) bForceRappelAI = TRUE ENDIF ENDIF ENDIF IF NOT bForceRappelAI SET_RAPPEL_AI(rappelData, RAPPEL_AI_STOP) ENDIF ENDIF // handle rappel HANDLE_RAPPEL_PED(rappelData, bForceRappelAI, TRUE, bAllowResetToIdle, rappelData.vAttachPos.z > SMASH_IN_HEIGHT, bAllowSmashIn AND rappelData.vAttachPos.z <= SMASH_IN_HEIGHT) APPLY_CUSTOM_RAPPEL_CAM() ENDIF IF bInteriorCamIsOutside OR NOT bUsingOfficeCam CASCADE_SHADOWS_SET_CASCADE_BOUNDS_SCALE(CASCADE_SHADOWS_MULTIPLIER_EXTERIOR_OVERRIDE) CASCADE_SHADOWS_SET_ENTITY_TRACKER_SCALE(CASCADE_SHADOWS_ROPE_OVERRIDE) SET_USE_HI_DOF() ELSE CASCADE_SHADOWS_SET_CASCADE_BOUNDS_SCALE(CASCADE_SHADOWS_MULTIPLIER_INTERIOR_OVERRIDE) CASCADE_SHADOWS_SET_ENTITY_TRACKER_SCALE(1.0) OVERRIDE_LODSCALE_THIS_FRAME(1.0) ENDIF ELSE // run the smash in / grab prisoner cutscene DO_SMASH_IN_CUTSCENE() ENDIF ENDPROC // cutscene of being winched in PROC DO_WINCH_CUTSCENE() //HANDLE_CHOPPER_ROPE(ROPE_TYPE_SWINGING) IF bApplyOffsetToWinchRope IF GET_CUTSCENE_TIME() >= 1500 AND HAS_CUTSCENE_CUT_THIS_FRAME() bApplyOffsetToWinchRope = FALSE ENDIF ENDIF DISPLAY_SNIPER_SCOPE_THIS_FRAME() REQUEST_ADDITIONAL_COLLISION_AT_COORD(<<-135.84, -592.13, 210.68>>) SWITCH cutsceneStage CASE SAG_CUT_STAGE_INIT PED_INDEX michaelPed michaelPed = GET_MICHAEL_PED() PED_INDEX trevorPed trevorPed = GET_TREVOR_PED() PED_INDEX franklinPed franklinPed = GET_FRANKLIN_PED() // michael IF NOT IS_PED_INJURED(michaelPed) DETACH_ENTITY(michaelPed) REGISTER_ENTITY_FOR_CUTSCENE(michaelPed, "Michael", CU_ANIMATE_EXISTING_SCRIPT_ENTITY) ENDIF // michael IF NOT IS_PED_INJURED(trevorPed) REGISTER_ENTITY_FOR_CUTSCENE(trevorPed, "Trevor", CU_ANIMATE_EXISTING_SCRIPT_ENTITY) ENDIF // mr k IF NOT IS_PED_INJURED(prisonerPed) DETACH_ENTITY(prisonerPed) REGISTER_ENTITY_FOR_CUTSCENE(prisonerPed, "MR_K", CU_ANIMATE_EXISTING_SCRIPT_ENTITY) ENDIF // franklin IF NOT IS_PED_INJURED(franklinPed) DETACH_ENTITY(franklinPed) ENDIF IF IS_VEHICLE_DRIVEABLE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) REGISTER_ENTITY_FOR_CUTSCENE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], "Main_heli", CU_ANIMATE_EXISTING_SCRIPT_ENTITY) ENDIF START_CUTSCENE(CUTSCENE_SUPPRESS_FP_TRANSITION_FLASH) CLEAR_PED_TASKS(dummyFranklinPed) //[MF] Allow us to have Franklin doing AI aiming when the cutscene ends. DRAW_ROPE_TO_POINT(TRUE, GET_ROPE_LAST_VERTEX_COORD(rappelData.rope)) //[MF] Load helipad geo around Franklin eSwitchCamState = SWITCH_CAM_REQUEST_ASSETS HANDLE_SWITCH_CAM_HANGING_TO_SNIPER(scsSwitch_HangingToSniper) bDoneHitSound = FALSE bWooshStarted = FALSE iSnatchAndGrabCutsceneTime = GET_GAME_TIMER() cutsceneStage = SAG_CUT_STAGE_RUNNING BREAK CASE SAG_CUT_STAGE_RUNNING IF NOT bClearedForCutscene IF IS_CUTSCENE_PLAYING() //SCRIPT_OVERRIDES_WIND_TYPES(true,"WEATHER_TYPES_MAGDEMO_FIB2_OUTSIDE_WINDOW","WEATHER_TYPES_MAGDEMO_FIB2_OUTSIDE_WINDOW") IF IS_NEW_LOAD_SCENE_ACTIVE() NEW_LOAD_SCENE_STOP() ENDIF IF STREAMVOL_IS_VALID(sniperVolume) STREAMVOL_DELETE(sniperVolume) ENDIF IF STREAMVOL_IS_VALID(officeVolume) STREAMVOL_DELETE(officeVolume) ENDIF IF DOES_ROPE_EXIST(rappelData.rope) DELETE_ROPE(rappelData.rope) ENDIF CREATE_CHOPPER_ROPE(ROPE_TYPE_INSIDE) DRAW_ROPE_TO_POINT(FALSE, <<0,0,0>>, bApplyOffsetToWinchRope, TRUE) sniperVolume = STREAMVOL_CREATE_FRUSTUM(<<-133.8, -591.8, 212.0>>, CONVERT_ROTATION_TO_DIRECTION_VECTOR(<<-0.3, 1.6, 116.4>>), 500, FLAG_MAPDATA) //NEW_LOAD_SCENE_START_SPHERE(<<-135.84, -592.13, 210.68>>, 2, NEWLOADSCENE_FLAG_REQUIRE_COLLISION) SET_MISSION_MOCAP_CUTSCENE() CREATE_ENEMY_CHOPPER(TRUE) STOP_SNATCH_AND_GRAB_AUDIO_SCENE(SNATCH_AND_GRAB_AUDIO_SCENE_FRANKLIN_SNIPE_ENEMIES) STOP_SNATCH_AND_GRAB_AUDIO_SCENE(SNATCH_AND_GRAB_AUDIO_SCENE_MICHAEL_SHOOT_ENEMIES) DRAW_ROPE_TO_POINT(FALSE, <<0,0,0>>, bApplyOffsetToWinchRope, TRUE, TRUE) IF IS_SCREEN_FADED_OUT() DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME) ENDIF bClearedForCutscene = TRUE ENDIF ELSE DRAW_ROPE_TO_POINT(FALSE, <<0,0,0>>, bApplyOffsetToWinchRope, TRUE) ENDIF IF NOT bDoneChoppersApproachingCue IF GET_GAME_TIMER() >= iSnatchAndGrabCutsceneTime + 3000 bDoneChoppersApproachingCue = TRIGGER_MISSION_MUSIC_EVENT("FIB2_HELICOPTERS_APPROACHING") ENDIF ENDIF IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Main_Heli") SET_CHOPPER_TO_ESCAPE(TRUE) PRINTSTRING("set chopper escape") PRINTNL() ENDIF IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Trevor") IF NOT IS_PED_INJURED(GET_TREVOR_PED()) IF NOT IS_PED_IN_ANY_VEHICLE(GET_TREVOR_PED()) DETACH_ENTITY(GET_TREVOR_PED()) SET_PED_INTO_VEHICLE(GET_TREVOR_PED(), snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) FORCE_PED_AI_AND_ANIMATION_UPDATE(GET_TREVOR_PED()) ENDIF ENDIF ENDIF IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("MR_K") IF NOT IS_PED_INJURED(prisonerPed) IF NOT IS_PED_IN_ANY_VEHICLE(prisonerPed) DETACH_ENTITY(prisonerPed) SET_PED_INTO_VEHICLE(prisonerPed, snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], VS_BACK_RIGHT) DO_MR_K_AGITATED_ANIM() FORCE_PED_AI_AND_ANIMATION_UPDATE(prisonerPed) ENDIF ENDIF ENDIF IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Michael") PRINTSTRING("hit michael exit state") PRINTNL() IF GET_CURRENT_PLAYER_PED_ENUM() <> CHAR_FRANKLIN MAKE_SELECTOR_PED_SELECTION(sSelectorPeds, SELECTOR_PED_FRANKLIN) TAKE_CONTROL_OF_SELECTOR_PED(sSelectorPeds) REAPPLY_PLAYER_PED_ATTRIBUTES() ENDIF SET_ENTITY_VISIBLE(PLAYER_PED_ID(), FALSE) PRINTSTRING("switched to Franklin") PRINTNL() IF NOT IS_PED_INJURED(GET_MICHAEL_PED()) IF NOT IS_PED_IN_ANY_VEHICLE(GET_MICHAEL_PED()) DETACH_ENTITY(GET_MICHAEL_PED()) ENDIF //SET_MICHAEL_CUSTOM_DRIVEBY_IN_CHOPPER() //FORCE_PED_AI_AND_ANIMATION_UPDATE(GET_MICHAEL_PED()) ENDIF SET_ENTITY_COORDS(PLAYER_PED_ID(), <<-142.83, -593.62, 210.77>>, TRUE, TRUE) //CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID()) PRINTSTRING("set position") PRINTNL() ENDIF IF CAN_SET_EXIT_STATE_FOR_CAMERA() SET_MISSION_CUTSCENE(FALSE) PRINTSTRING("set mission cutscene false") PRINTNL() INT i REPEAT NUMBER_ENEMY_CHOPPERS i IF IS_VEHICLE_DRIVEABLE(enemyChopperVehicle[i]) IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(enemyChopperVehicle[i]) IF i < 2 SKIP_TIME_IN_PLAYBACK_RECORDED_VEHICLE(enemyChopperVehicle[i], AFTER_CUTSCENE_TIME) ELSE SKIP_TIME_IN_PLAYBACK_RECORDED_VEHICLE(enemyChopperVehicle[i], AFTER_CUTSCENE_LONG_TIME) ENDIF ENDIF ENDIF ENDREPEAT DO_STREAM_VOLUME_ON_OFFICE(FALSE) PRINTSTRING("did chopper skips") PRINTNL() eSwitchCamState = SWITCH_CAM_SETUP_SPLINE GIVE_MICHAEL_RIFLE() SET_MICHAEL_CUSTOM_DRIVEBY_IN_CHOPPER() FORCE_PED_AI_AND_ANIMATION_UPDATE(GET_MICHAEL_PED()) WHILE NOT HANDLE_SWITCH_CAM_HANGING_TO_SNIPER(scsSwitch_HangingToSniper) //#IF IS_DEBUG_BUILD //UPDATE_SPLINE_CAM_WIDGETS(scsSwitch_HangingToSniper) //#ENDIF WAIT_WITH_RECORD() ENDWHILE SET_MISSION_STAGE(STAGE_CHOPPER_CHASE) SET_ENTITY_VISIBLE(PLAYER_PED_ID(), TRUE) IF STREAMVOL_IS_VALID(sniperVolume) STREAMVOL_DELETE(sniperVolume) ENDIF NEW_LOAD_SCENE_STOP() PRINTSTRING("set stage successfully") PRINTNL() ENDIF #IF IS_DEBUG_BUILD DEBUG_SKIP_MOCAP() #ENDIF BREAK CASE SAG_CUT_STAGE_CLEANUP BREAK ENDSWITCH ENDPROC // take out the guards threatening Michael from an adjacent building PROC DO_STAGE_SNIPE_GUARDS() DISABLE_CELLPHONE_THIS_FRAME_ONLY() REPLAY_DISABLE_CAMERA_MOVEMENT_THIS_FRAME() DISABLE_ON_FOOT_FIRST_PERSON_VIEW_THIS_UPDATE() DISABLE_BLUR_ON_RIFLE_MODEL() IF NOT IS_PED_INJURED(PLAYER_PED_ID()) SET_PLAYER_SIMULATE_AIMING(PLAYER_ID(), FALSE) ENDIF INT i FLOAT fPhase IF NOT bSetSniperZoom SET_FIRST_PERSON_AIM_CAM_ZOOM_FACTOR(INIT_SNIPER_ZOOM) bSetSniperZoom = TRUE ENDIF SET_FIRST_PERSON_AIM_CAM_RELATIVE_HEADING_LIMITS_THIS_UPDATE(-25, 25) SET_FIRST_PERSON_AIM_CAM_RELATIVE_PITCH_LIMITS_THIS_UPDATE(-10, 10) CASCADE_SHADOWS_SET_CASCADE_BOUNDS_SCALE(CASCADE_SHADOWS_MULTIPLIER_NO_OVERRIDE) SET_RADAR_AS_INTERIOR_THIS_FRAME(GET_HASH_KEY("V_FakeDT1_05"), 150.0, -700.0, 0, 1) // disable michael controls //IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL /// DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SPECIAL_ABILITY) // DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SPECIAL_ABILITY_SECONDARY) //ENDIF DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SELECT_WEAPON) DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_JUMP) DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_ENTER) DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SPRINT) IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_FRANKLIN DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MOVE_UD) DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MOVE_LR) ENDIF IF NOT IS_PED_INJURED(GET_MICHAEL_PED()) SET_PED_CAN_SWITCH_WEAPON(GET_MICHAEL_PED(), FALSE) ENDIF IF NOT IS_PED_INJURED(GET_FRANKLIN_PED()) SET_ENTITY_CAN_BE_DAMAGED_BY_RELATIONSHIP_GROUP(GET_FRANKLIN_PED(), FALSE, agencyRelGroup) SET_PED_CAN_SWITCH_WEAPON(GET_FRANKLIN_PED(), FALSE) ENDIF IF NOT IS_PED_INJURED(GET_TREVOR_PED()) SET_PED_CAN_SWITCH_WEAPON(GET_TREVOR_PED(), FALSE) ENDIF // smash the window if not already smashed HANDLE_WINDOW_SMASH(TRUE, TRUE) // ensure the door is always open MAINTAIN_DOOR_OPEN() PED_INDEX fPed = GET_FRANKLIN_PED() IF NOT IS_PED_INJURED(fPed) IF HAS_PED_GOT_WEAPON(fPed, GET_SNATCH_AND_GRAB_WEAPON_TYPE(SAG_WEAPON_SNIPER_RIFLE)) WEAPON_TYPE weapon GET_CURRENT_PED_WEAPON(fPed, weapon) IF weapon <> GET_SNATCH_AND_GRAB_WEAPON_TYPE(SAG_WEAPON_SNIPER_RIFLE) PRINTSTRING("franklin has a rifle but it is not equipped!!!") PRINTNL() SET_CURRENT_PED_WEAPON(fPed, GET_SNATCH_AND_GRAB_WEAPON_TYPE(SAG_WEAPON_SNIPER_RIFLE), TRUE) ENDIF ELSE PRINTSTRING("franklin doesn't have a rifle!!!") PRINTNL() ENDIF ENDIF IF NOT bRunningCutscene // Starting the sniping section music IF NOT bSniperMusicStarted IF NOT IS_PED_INJURED(PLAYER_PED_ID()) //TRIGGER_MISSION_MUSIC_EVENT("FBI2_TEST_SNIPER_SECTION_MOOD") bSniperMusicStarted = TRUE ENDIF ENDIF IF prisonerGrabState >= PRISONER_GRAB_STATE_EXTRACT IF NOT bPreparedChoppersApproachingCue bPreparedChoppersApproachingCue = PREPARE_MUSIC_EVENT("FIB2_HELICOPTERS_APPROACHING") ENDIF HANDLE_STREAMING_MOCAP("fbi_2_mcs_3b", GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_WINDOW_FRAME), DEFAULT_CUTSCENE_LOAD_DIST, DEFAULT_CUTSCENE_UNLOAD_DIST) IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY() IF NOT IS_PED_INJURED(GET_MICHAEL_PED()) SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Michael", GET_MICHAEL_PED()) ENDIF IF NOT IS_PED_INJURED(GET_TREVOR_PED()) SET_CUTSCENE_PED_PROP_VARIATION("Trevor", ANCHOR_HEAD, 12) ENDIF IF NOT IS_PED_INJURED(prisonerPed) SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("MR_K", prisonerPed) SET_CUTSCENE_PED_COMPONENT_VARIATION("MR_K", PED_COMP_SPECIAL, 0, 0) ENDIF ENDIF ENDIF // handle the chopper //IF extractStage < EXTRACT_STAGE_KILL_REINFORCEMENTS // MAINTAIN_CHOPPER_HOVER() //ENDIF // handle the rope IF bActivatedRopeSwingFromSynced HANDLE_CHOPPER_ROPE(ROPE_TYPE_SWINGING) ELSE HANDLE_CHOPPER_ROPE(ROPE_TYPE_INSIDE) ENDIF // Forces closer fov while Michael is near window and shorter transition to aim camera. SET_PLAYER_FORCE_SKIP_AIM_INTRO(PLAYER_ID(), TRUE) SET_FOLLOW_PED_CAM_THIS_UPDATE("FOLLOW_PED_ATTACHED_TO_ROPE_CAMERA", 0) IF NOT IS_PED_INJURED(PLAYER_PED_ID()) DISABLE_GAMEPLAY_CAM_ALTITUDE_FOV_SCALING_THIS_UPDATE() ENDIF //ENSURE_FRANKLIN_INVISIBLE() // handle hotswapping between michael and franklin IF NOT bActivatedRopeSwingFromSynced DISABLE_SELECTOR_THIS_FRAME() //UPDATE_REMOTE_SNIPER(remoteSniperData) ELSE IF bDebugSwingOutEarlier IF hangingHotswapState <> HANGING_HOTSWAP_ON_TREVOR AND hangingHotswapState <> HANGING_HOTSWAP_ON_FRANKLIN AND hangingHotswapState <> HANGING_HOTSWAP_ON_MICHAEL iSuppressHUDTime = GET_GAME_TIMER() + 100 ENDIF IF GET_GAME_TIMER() <= iSuppressHUDTime HIDE_SELECTOR_THIS_FRAME() DISPLAY_RADAR(FALSE) bTurnedOffRadarForSuppressHud = TRUE ELSE IF bTurnedOffRadarForSuppressHud DISPLAY_RADAR(TRUE) bTurnedOffRadarForSuppressHud = FALSE ENDIF ENDIF IF GET_GAME_TIMER() <= iSuppressHUDTime + 100 HIDE_HUD_COMPONENT_THIS_FRAME(NEW_HUD_STREET_NAME) HIDE_HUD_COMPONENT_THIS_FRAME(NEW_HUD_VEHICLE_NAME) HIDE_HUD_COMPONENT_THIS_FRAME(NEW_HUD_AREA_NAME) HIDE_HUD_COMPONENT_THIS_FRAME(NEW_HUD_DISTRICT_NAME) ENDIF SWITCH hangingHotswapState CASE HANGING_HOTSWAP_ON_FRANKLIN HANDLE_MICHAEL_SHOOTING() // set reinforcement ped 5 no ragdoll IF NOT IS_PED_INJURED(reinforcementPed[5]) SET_PED_CAN_RAGDOLL(reinforcementPed[5], FALSE) ENDIF // switch menu BOOL bSelectorCheck bSelectorCheck = FALSE IF CAN_ADVANCE_MISSION() bSelectorCheck = UPDATE_SELECTOR_HUD(sSelectorPeds, FALSE) ENDIF // remote sniper //UPDATE_REMOTE_SNIPER(remoteSniperData) IF bSelectorCheck //OR bForceSwapFromFranklinToMichael IF sSelectorPeds.eNewSelectorPed = SELECTOR_PED_MICHAEL //OR bForceSwapFromFranklinToMichael // SET_REMOTE_SNIPER_ACTIVE(remoteSniperData, FALSE) // RENDER_SCRIPT_CAMS(TRUE, FALSE) // remoteSniperData.i_sniper_shot_timer = 0 STOP_SNATCH_AND_GRAB_AUDIO_SCENE(SNATCH_AND_GRAB_AUDIO_SCENE_FRANKLIN_SNIPE_ENEMIES) START_SNATCH_AND_GRAB_AUDIO_SCENE(SNATCH_AND_GRAB_AUDIO_SCENE_MICHAEL_SHOOT_ENEMIES) //PLAY_SOUND_FRONTEND(-1, "Hit_In", "PLAYER_SWITCH_CUSTOM_SOUNDSET")//"Hit_In", "PLAYER_SWITCH_CUSTOM_SOUNDSET") //PLAY_SOUND_FRONTEND(iSniperSwitchSoundID, "Camera_Move_Loop", "PLAYER_SWITCH_CUSTOM_SOUNDSET") bHitFranklinSound = FALSE bDoneFlash = FALSE iSwitchTime = GET_GAME_TIMER() michaelTargetPed = NULL bReattachedMichael = FALSE INFORM_MISSION_STATS_OF_INCREMENT(FBI2_SWITCHES) hangingHotswapState = HANGING_HOTSWAP_FRANKLIN_TO_MICHAEL ENDIF ELSE IF IS_SELECTOR_ONSCREEN() SET_PLAYER_FORCE_SKIP_AIM_INTRO(PLAYER_ID(),TRUE) SET_PLAYER_FORCED_AIM(PLAYER_ID(), TRUE) DESTROY_MISSION_STATIC_CAM(staticCam) CREATE_MISSION_STATIC_CAM(staticCam) // HACK: have to hardcode this as Franklin is actually floating in mid-air for the sniper rifle to be close enough to shoot. //SET_CAM_PARAMS(staticCam, <<-136.387,-592.535,211.892>>, <<-1.573389,0.0,-96.932442>>, 35.0) // To match start of character switch (vSniperPos, vSniperRot) SET_CAM_PARAMS(staticCam, vSniperNodePos3, vSniperNodeRot3, 35.0) ////ATTACH_CAM_TO_ENTITY(staticCam, GET_FRANKLIN_PED(), <<0.0,-3.0,0.3>>, TRUE) ////POINT_CAM_AT_ENTITY(staticCam, GET_FRANKLIN_PED(), <<0,0,0.8>>, TRUE) RENDER_SCRIPT_CAMS(TRUE, FALSE) ////PRINTSTRING("Show Franklin here") PRINTNL() ELSE DESTROY_MISSION_STATIC_CAM(staticCam) RENDER_SCRIPT_CAMS(FALSE, FALSE) ENDIF ENDIF BREAK CASE HANGING_HOTSWAP_ON_MICHAEL // set reinforcement ped 5 can ragdoll IF NOT IS_PED_INJURED(reinforcementPed[5]) SET_PED_CAN_RAGDOLL(reinforcementPed[5], TRUE) ENDIF SET_GAMEPLAY_CAM_MAX_MOTION_BLUR_STRENGTH_THIS_UPDATE(0.0) HANDLE_FRANKLIN_SNIPING() // do sound IF HAS_SOUND_FINISHED(iDangleSoundID) PLAY_SOUND_FROM_ENTITY(iDangleSoundID, "FBI_02_SNATCH_AND_GRAB_DANGLE", PLAYER_PED_ID()) SET_VARIABLE_ON_SOUND(iDangleSoundID,"PlayerSpeed",GET_ENTITY_SPEED(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER])) ELSE SET_VARIABLE_ON_SOUND(iDangleSoundID,"PlayerSpeed",GET_ENTITY_SPEED(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER])) ENDIF // switch menu IF CAN_ADVANCE_MISSION() IF UPDATE_SELECTOR_HUD(sSelectorPeds, FALSE) #IF IS_DEBUG_BUILD OR bDebugJSkip #ENDIF IF sSelectorPeds.eNewSelectorPed = SELECTOR_PED_FRANKLIN INFORM_MISSION_STATS_OF_INCREMENT(FBI2_SWITCHES) START_SNATCH_AND_GRAB_AUDIO_SCENE(SNATCH_AND_GRAB_AUDIO_SCENE_FRANKLIN_SNIPE_ENEMIES) STOP_SNATCH_AND_GRAB_AUDIO_SCENE(SNATCH_AND_GRAB_AUDIO_SCENE_MICHAEL_SHOOT_ENEMIES) //PLAY_SOUND_FRONTEND(-1, "Hit_In", "PLAYER_SWITCH_CUSTOM_SOUNDSET")//"Hit_In", "PLAYER_SWITCH_CUSTOM_SOUNDSET") //PLAY_SOUND_FRONTEND(iSniperSwitchSoundID, "Camera_Move_Loop", "PLAYER_SWITCH_CUSTOM_SOUNDSET") bDoneFlash = FALSE bHitFranklinSound = FALSE iSwitchTime = GET_GAME_TIMER() hangingHotswapState = HANGING_HOTSWAP_MICHAEL_TO_FRANKLIN ENDIF ENDIF ENDIF BREAK CASE HANGING_HOTSWAP_MICHAEL_TO_FRANKLIN IF NOT bDoneFlash ANIMPOSTFX_STOP_AND_FLUSH_REQUESTS("SwitchHUDMichaelOut") ANIMPOSTFX_STOP_AND_FLUSH_REQUESTS("SwitchHUDFranklinOut") ANIMPOSTFX_PLAY("SwitchShortMichaelIn", 0, FALSE) bDoneFlash = TRUE ENDIF IF NOT bHitFranklinSound IF NOT IS_PED_INJURED(dummyFranklinPed) IF IS_ENTITY_AT_COORD(dummyFranklinPed, GET_FINAL_RENDERED_CAM_COORD(), <<90,90,90>>, FALSE, FALSE) //PLAY_SOUND_FRONTEND(-1, "Hit_Out", "PLAYER_SWITCH_CUSTOM_SOUNDSET") //STOP_SOUND(iSniperSwitchSoundID) //ANIMPOSTFX_PLAY("SwitchShortFranklinMid", 0, FALSE) // PLAY_SOUND_FRONTEND(-1, "Hit_Out", "PLAYER_SWITCH_CUSTOM_SOUNDSET") bHitFranklinSound = TRUE ENDIF ENDIF ENDIF IF NOT bDoneHitSound IF GET_GAME_TIMER() >= iSwitchTime + 0 PLAY_SOUND_FRONTEND(-1, "Hit_Out", "PLAYER_SWITCH_CUSTOM_SOUNDSET") iHitTime = GET_GAME_TIMER() bDoneHitSound = TRUE ENDIF ENDIF IF NOT bWooshStarted IF bDoneHitSound IF GET_GAME_TIMER() >= iHitTime + 250 PLAY_SOUND_FRONTEND(-1, "Short_Transition_In", "PLAYER_SWITCH_CUSTOM_SOUNDSET") bWooshStarted = TRUE ENDIF ENDIF ENDIF IF DO_MISSION_HOTSWAP(SELECTOR_PED_FRANKLIN, FALSE, TRUE, HOTSWAP_CAM_HANGING_TO_SNIPER) //SET_REMOTE_SNIPER_ACTIVE(remoteSniperData, TRUE) //UPDATE_REMOTE_SNIPER(remoteSniperData) //MAKE_SELECTOR_PED_SELECTION(sSelectorPeds, SELECTOR_PED_FRANKLIN) //TAKE_CONTROL_OF_SELECTOR_PED(sSelectorPeds, TRUE, TRUE) //SET_SELECTOR_PED_HINT(sSelectorPeds, SELECTOR_PED_MICHAEL, TRUE) //SET_SELECTOR_PED_HINT(sSelectorPeds, SELECTOR_PED_FRANKLIN, FALSE) //SET_SELECTOR_PED_HINT(sSelectorPeds, SELECTOR_PED_TREVOR, FALSE) SET_SELECTOR_PED_BLOCKED(sSelectorPeds, SELECTOR_PED_FRANKLIN, FALSE) SET_SELECTOR_PED_BLOCKED(sSelectorPeds, SELECTOR_PED_MICHAEL, FALSE) SET_SELECTOR_PED_BLOCKED(sSelectorPeds, SELECTOR_PED_TREVOR, TRUE) //IF NOT IS_PED_INJURED(PLAYER_PED_ID()) // SET_ENTITY_COORDS(PLAYER_PED_ID(), GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_BEHIND_SNIPER)) // FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), TRUE) //ENDIF IF NOT IS_PED_INJURED(prisonerPed) SET_ENTITY_PROOFS(prisonerPed, FALSE, FALSE, FALSE, FALSE, FALSE) ENDIF //CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID()) FREEZE_FRANKLIN_AT_SNIPER() SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), GET_SNATCH_AND_GRAB_WEAPON_TYPE(SAG_WEAPON_SNIPER_RIFLE), TRUE) PRINTSTRING("setting rifle as current from SNIPE GUARDS SWITCH!") PRINTNL() //DISPLAY_SNIPER_SCOPE_THIS_FRAME() //DISPLAY_HUD(TRUE) ATTACH_MICHAEL_TO_ROPE() IF NOT IS_PED_INJURED(reinforcementPed[0]) CLEAR_ENTITY_LAST_DAMAGE_ENTITY(reinforcementPed[0]) ENDIF IF NOT IS_PED_INJURED(reinforcementPed[5]) CLEAR_ENTITY_LAST_DAMAGE_ENTITY(reinforcementPed[5]) ENDIF //SCRIPT_OVERRIDES_WIND_TYPES(true,"WEATHER_TYPES_MAGDEMO_FIB2_FRANKLIN","WEATHER_TYPES_MAGDEMO_FIB2_FRANKLIN") IF NOT IS_PLAYER_CONTROL_ON(PLAYER_ID()) SET_PLAYER_CONTROL(PLAYER_ID(), TRUE) ENDIF // SET_PLAYER_FORCE_SKIP_AIM_INTRO(PLAYER_ID(),TRUE) // SET_PLAYER_FORCED_AIM(PLAYER_ID(), TRUE) HIDE_HUD_COMPONENT_THIS_FRAME(NEW_HUD_RETICLE) iRecheckMichaelShootTime = 0 michaelTargetPed = NULL hotswapStage = MISSION_HOTSWAP_STAGE_SELECT_CHARACTER hangingHotswapState = HANGING_HOTSWAP_ON_FRANKLIN ELSE IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_FRANKLIN SET_PLAYER_FORCE_SKIP_AIM_INTRO(PLAYER_ID(),TRUE) SET_PLAYER_FORCED_AIM(PLAYER_ID(), TRUE) //DISPLAY_SNIPER_SCOPE_THIS_FRAME() ENDIF ENDIF BREAK CASE HANGING_HOTSWAP_FRANKLIN_TO_MICHAEL IF NOT bDoneFlash ANIMPOSTFX_STOP_AND_FLUSH_REQUESTS("SwitchHUDMichaelOut") ANIMPOSTFX_STOP_AND_FLUSH_REQUESTS("SwitchHUDFranklinOut") ANIMPOSTFX_PLAY("SwitchShortFranklinIn", 0, FALSE) bDoneFlash = TRUE ENDIF IF NOT bHitFranklinSound IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), GET_FINAL_RENDERED_CAM_COORD(), <<170,170,170>>, FALSE, FALSE) //PLAY_SOUND_FRONTEND(-1, "Hit_Out", "PLAYER_SWITCH_CUSTOM_SOUNDSET") STOP_SOUND(iSniperSwitchSoundID) ANIMPOSTFX_PLAY("SwitchShortMichaelMid", 0, FALSE) // PLAY_SOUND_FRONTEND(-1, "Hit_Out", "PLAYER_SWITCH_CUSTOM_SOUNDSET") bHitFranklinSound = TRUE ENDIF ENDIF ENDIF IF NOT bDoneHitSound IF GET_GAME_TIMER() >= iSwitchTime + 0 PLAY_SOUND_FRONTEND(-1, "Hit_Out", "PLAYER_SWITCH_CUSTOM_SOUNDSET") iHitTime = GET_GAME_TIMER() bDoneHitSound = TRUE ENDIF ENDIF IF NOT bWooshStarted IF bDoneHitSound IF GET_GAME_TIMER() >= iHitTime + 300 PLAY_SOUND_FRONTEND(-1, "Short_Transition_In", "PLAYER_SWITCH_CUSTOM_SOUNDSET") bWooshStarted = TRUE ENDIF ENDIF ENDIF IF DO_MISSION_HOTSWAP(SELECTOR_PED_MICHAEL, FALSE, TRUE, HOTSWAP_CAM_SNIPER_TO_HANGING, TCF_CLEAR_TASK_INTERRUPT_CHECKS) IF NOT IS_PED_INJURED(PLAYER_PED_ID()) SET_PED_RELATIONSHIP_GROUP_HASH(PLAYER_PED_ID(), RELGROUPHASH_PLAYER) ENDIF IF NOT IS_PED_INJURED(prisonerPed) SET_ENTITY_PROOFS(prisonerPed, TRUE, TRUE, TRUE, TRUE, TRUE) ENDIF //SET_SELECTOR_PED_HINT(sSelectorPeds, SELECTOR_PED_FRANKLIN, TRUE) //SET_SELECTOR_PED_HINT(sSelectorPeds, SELECTOR_PED_MICHAEL, FALSE) //SET_SELECTOR_PED_HINT(sSelectorPeds, SELECTOR_PED_TREVOR, FALSE) SET_SELECTOR_PED_BLOCKED(sSelectorPeds, SELECTOR_PED_FRANKLIN, FALSE) SET_SELECTOR_PED_BLOCKED(sSelectorPeds, SELECTOR_PED_MICHAEL, FALSE) SET_SELECTOR_PED_BLOCKED(sSelectorPeds, SELECTOR_PED_TREVOR, TRUE) //CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID()) //SET_REMOTE_SNIPER_ACTIVE(remoteSniperData, FALSE) FREEZE_FRANKLIN_AT_SNIPER() ATTACH_MICHAEL_TO_ROPE() iNextFranklinSnipeTime = GET_RANDOM_INT_IN_RANGE(2000, 3000) iRecheckFranklinShootTime = 0 iFranklinTargetPed = -1 //SCRIPT_OVERRIDES_WIND_TYPES(true,"WEATHER_TYPES_MAGDEMO_FIB2_OUTSIDE_WINDOW","WEATHER_TYPES_MAGDEMO_FIB2_OUTSIDE_WINDOW") hotswapStage = MISSION_HOTSWAP_STAGE_SELECT_CHARACTER hangingHotswapState = HANGING_HOTSWAP_ON_MICHAEL ELSE IF NOT bReattachedMichael IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL ATTACH_MICHAEL_TO_ROPE() bReattachedMichael = TRUE ENDIF ENDIF // UPDATE_REMOTE_SNIPER(remoteSniperData) //IF remoteSniperData.b_is_sniping // IF sCamDetails.bSplineCreated // SET_REMOTE_SNIPER_ACTIVE(remoteSniperData, FALSE, FALSE) // ENDIF //ENDIF ENDIF BREAK ENDSWITCH ELSE // UPDATE_REMOTE_SNIPER(remoteSniperData) ENDIF ENDIF // handle the grab SWITCH prisonerGrabState CASE PRISONER_GRAB_STATE_INIT IF bAdvancedGuardAttackTime UPDATE_PRISONER_GRAB(PRISONER_GRAB_STATE_DUCK_INTRO) ENDIF BREAK CASE PRISONER_GRAB_STATE_DUCK_INTRO IF IS_SYNCHRONIZED_SCENE_RUNNING(iSyncScene) IF GET_SYNCHRONIZED_SCENE_PHASE(iSyncScene) >= 0.98 UPDATE_PRISONER_GRAB(PRISONER_GRAB_STATE_DUCK_LOOPING) ENDIF ENDIF BREAK CASE PRISONER_GRAB_STATE_DUCK_LOOPING IF bStartExtraction UPDATE_PRISONER_GRAB(PRISONER_GRAB_STATE_EXTRACT) ENDIF BREAK CASE PRISONER_GRAB_STATE_EXTRACT BREAK CASE PRISONER_GRAB_STATE_DANGLING IF GET_GAME_TIMER() >= iDangleTime + 100 AND (bDebugCanWinch OR NOT bDebugSwingOutEarlier) //SET_ROPE_PHYSICAL() KILL_ANY_CONVERSATION() //START_ROPE_WINDING(rappelData.rope) prisonerGrabState = PRISONER_GRAB_STATE_WINCHING iWinchTime = GET_GAME_TIMER() + 800 ENDIF BREAK ENDSWITCH // handle extraction SWITCH extractStage // killing the guards in the original interrogation CASE EXTRACT_STAGE_KILL_INITIAL_GUARDS INT iThisSpeechLine TEXT_LABEL tThisSpeechLabel IF NOT bAdvancedGuardAttackTime // advance guard attack time when shooting IF iGuardReactionStage > -1 iGuardAttackTime = GET_GAME_TIMER() + GUARD_ATTACK_TIME_SHOOTING iGuardSpeech = 0 iReactToFirstShotTime = GET_GAME_TIMER() bAdvancedGuardAttackTime = TRUE ELSE IF bReactedToFirstShot iGuardReactionStage = 0 ELSE IF iGuardSpeech < 8 AND NOT bLoadedExtractSpeech SWITCH iGuardSpeech CASE 0 tThisSpeechLabel = "FBI2_CIA1" iThisSpeechLine = 0 BREAK CASE 1 tThisSpeechLabel = "FBI2_MRKSHT" iThisSpeechLine = 0 BREAK CASE 2 tThisSpeechLabel = "FBI2_CLEAR" iThisSpeechLine = 0 BREAK CASE 3 tThisSpeechLabel = "FBI2_MRKSHT" iThisSpeechLine = 0 BREAK CASE 4 tThisSpeechLabel = "FBI2_ASK" iThisSpeechLine = 0 BREAK CASE 5 tThisSpeechLabel = "FBI2_CIA2" iThisSpeechLine = 0 BREAK CASE 6 tThisSpeechLabel = "FBI2_MRKSHT" iThisSpeechLine = 0 BREAK CASE 7 tThisSpeechLabel = "FBI2_GLIGHT" iThisSpeechLine = 0 BREAK ENDSWITCH IF bShownGodText AND GET_GAME_TIMER() >= iShownGodTextTime + 2000 IF DO_MISSION_SPEECH(tThisSpeechLabel, TRUE, iThisSpeechLine, FALSE, NOT IS_MESSAGE_BEING_DISPLAYED()) iGuardSpeech++ ENDIF ENDIF ENDIF ENDIF ENDIF ELSE // random dialogue from guards IF iPostKilledGuardsTime = 0 IF iGuardSpeech < 16 iThisSpeechLine = 0 PED_INDEX speechPed SWITCH iGuardSpeech CASE 0 tThisSpeechLabel = "FBI2_SNIP" speechPed = guardPed[0] BREAK CASE 1 tThisSpeechLabel = "FBI2_CHAO2" speechPed = guardPed[1] BREAK CASE 2 tThisSpeechLabel = "FBI2_IAA" speechPed = GET_MICHAEL_PED() BREAK CASE 3 tThisSpeechLabel = "FBI2_MRKSHT" speechPed = prisonerPed BREAK CASE 4 tThisSpeechLabel = "FBI2_SHMIC" speechPed = guardPed[2] BREAK CASE 5 tThisSpeechLabel = "FBI2_CHAOS" speechPed = guardPed[0] BREAK CASE 6 tThisSpeechLabel = "FBI2_IAA" speechPed = GET_MICHAEL_PED() BREAK CASE 7 tThisSpeechLabel = "FBI2_SNIP2" speechPed = guardPed[1] BREAK CASE 8 tThisSpeechLabel = "FBI2_MRKSHT" speechPed = prisonerPed BREAK CASE 9 tThisSpeechLabel = "FBI2_ESCA" speechPed = guardPed[2] BREAK CASE 10 tThisSpeechLabel = "FBI2_SNIP4" speechPed = guardPed[3] BREAK CASE 11 tThisSpeechLabel = "FBI2_IAA" speechPed = GET_MICHAEL_PED() BREAK CASE 12 tThisSpeechLabel = "FBI2_CHAO3" speechPed = guardPed[4] BREAK CASE 13 tThisSpeechLabel = "FBI2_MRKSHT" speechPed = prisonerPed BREAK CASE 14 tThisSpeechLabel = "FBI2_CHAO4" speechPed = guardPed[3] BREAK CASE 15 tThisSpeechLabel = "FBI2_SNIP3" speechPed = guardPed[4] BREAK ENDSWITCH IF bShownGodText AND iReinforcementsEnterTime < 0 AND GET_GAME_TIMER() >= iShownGodTextTime + 2000 IF NOT IS_PED_INJURED(speechPed) IF DO_MISSION_SPEECH(tThisSpeechLabel, TRUE, iThisSpeechLine, FALSE, NOT IS_MESSAGE_BEING_DISPLAYED()) iGuardSpeech++ ENDIF ELSE iGuardSpeech++ ENDIF ENDIF ENDIF ENDIF ENDIF // guards shoot and kill prisoner IF NOT bGuardsAttackPrisoner IF GET_GAME_TIMER() >= iGuardAttackTime IF iGuardAttackTime >= 0 IF NOT IS_MESSAGE_BEING_DISPLAYED() // have the guards attack Michael and the prisoner REPEAT NUMBER_GUARDS i IF NOT IS_PED_INJURED(guardPed[i]) IF NOT IS_PED_INJURED(prisonerPed) TASK_SHOOT_AT_ENTITY(guardPed[i], prisonerPed, -1, FIRING_TYPE_CONTINUOUS) ENDIF ENDIF ENDREPEAT SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(prisonerPed, FALSE) iGuardAttackTime = -1 // set to -1 so only do once bGuardsAttackPrisoner = TRUE ENDIF ELSE IF iGuardSpeech > 7 iGuardAttackTime = GET_GAME_TIMER() + 2000 ENDIF ENDIF ENDIF ELSE IF NOT bGuardsStoppedShooting IF IS_PED_INJURED(prisonerPed) REPEAT NUMBER_GUARDS i IF NOT IS_PED_INJURED(guardPed[i]) TASK_AIM_GUN_AT_COORD(guardPed[i], vCachedPrisonerPos, -1) ENDIF ENDREPEAT bGuardsStoppedShooting = TRUE ELSE vCachedPrisonerPos = GET_ENTITY_COORDS(prisonerPed) ENDIF ENDIF ENDIF // kill the prisoner if damaged by a guard BOOL bDoFakeKillMichael bDoFakeKillMichael = FALSE IF NOT IS_PED_INJURED(prisonerPed) IF HAS_ENTITY_BEEN_DAMAGED_BY_WEAPON(prisonerPed, GET_SNATCH_AND_GRAB_WEAPON_TYPE(SAG_WEAPON_CIA_PISTOL)) APPLY_DAMAGE_TO_PED(prisonerPed, 1000, FALSE) bDoFakeKillMichael = TRUE ENDIF ELSE bDoFakeKillMichael = TRUE ENDIF IF bDoFakeKillMichael IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL]) IF NOT IS_PED_RAGDOLL(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL]) CLEAR_PED_TASKS(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL]) SET_PED_TO_RAGDOLL(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], 25000, 25000, TASK_RELAX) MISSION_FAILED(FAIL_MICHAEL_DEAD) ENDIF ENDIF ENDIF // do remote sniper checks and death count INT iKilledGuards iKilledGuards = 0 REPEAT NUMBER_GUARDS i IF NOT IS_PED_INJURED(guardPed[i]) IF HAS_ENTITY_BEEN_DAMAGED_BY_WEAPON(guardPed[i], GET_SNATCH_AND_GRAB_WEAPON_TYPE(SAG_WEAPON_SNIPER_RIFLE)) APPLY_DAMAGE_TO_PED(guardPed[i], 1000, FALSE) ENDIF // remote sniper //CHECK_PED_WITH_REMOTE_SNIPER(remoteSniperData, guardPed[i]) ELSE // increment death count IF DOES_BLIP_EXIST(guardBlip[i]) REMOVE_BLIP(guardBlip[i]) INFORM_MISSION_STATS_OF_INCREMENT(FBI2_KILLS) ENDIF iKilledGuards++ ENDIF ENDREPEAT // music for killing 3 guards IF NOT bDoneKill3GuardsCue bDoneKill3GuardsCue = TRIGGER_MISSION_MUSIC_EVENT("FIB2_SNIPER_SHOT_THREE") ENDIF // more guards enter IF NOT bGuardsHeardSniper IF iKilledGuards >= 1 SET_GUARDS_HEAR_SNIPER() bGuardsHeardSniper = TRUE ENDIF ELSE IF NOT bAdditionalGuardsToShoot BOOL bDoAdditionalGuardsToShoot bDoAdditionalGuardsToShoot = FALSE IF IS_SYNCHRONIZED_SCENE_RUNNING(iGuardSyncScene[GSS_STANDARD]) IF GET_SYNCHRONIZED_SCENE_PHASE(iGuardSyncScene[GSS_STANDARD]) >= 0.98 bDoAdditionalGuardsToShoot = TRUE ENDIF ELSE bDoAdditionalGuardsToShoot = TRUE ENDIF IF bDoAdditionalGuardsToShoot REPEAT 2 i INT iAdditionalGuard iAdditionalGuard = i+3 guardAI[iAdditionalGuard].iRevertActionTime = 0 INIT_GUARD_ANIMATION_TIME(iAdditionalGuard) ENDREPEAT bAdditionalGuardsToShoot = TRUE ENDIF ENDIF IF NOT bDoneLastGuardEnter IF iKilledGuards >= 5 SET_LAST_GUARD_ENTER() bDoneLastGuardEnter = TRUE ENDIF ELSE IF NOT bLastGuardToShoot BOOL bDoLastGuardToShoot bDoLastGuardToShoot = FALSE IF IS_SYNCHRONIZED_SCENE_RUNNING(iGuardSyncScene[GSS_LAST_GUARD]) IF GET_SYNCHRONIZED_SCENE_PHASE(iGuardSyncScene[GSS_LAST_GUARD]) >= 0.98 bDoLastGuardToShoot = TRUE ENDIF ELSE bDoLastGuardToShoot = TRUE ENDIF IF bDoLastGuardToShoot guardAI[5].iRevertActionTime = 0 INIT_GUARD_ANIMATION_TIME(5) bLastGuardToShoot = TRUE ENDIF ENDIF ENDIF ENDIF HANDLE_GUARD_ANIMATIONS(iKilledGuards) DO_GUARD_REACTIONS(iKilledGuards) // advance to extract when guards dead IF iKilledGuards >= NUMBER_GUARDS IF iReinforcementsEnterTime < 0 iReinforcementsEnterTime = GET_GAME_TIMER() ELSE IF NOT bLoadedExtractSpeech IF PRELOAD_CONVERSATION(snatchAndGrabConversation, "FBI2AUD", "FBI2_PULL", CONV_PRIORITY_MEDIUM) bLoadedExtractSpeech = TRUE iLoadedExtractSpeechTime = GET_GAME_TIMER() ENDIF ELSE //iLoadedExtractSpeechTime=iLoadedExtractSpeechTime IF NOT bDoneExtractSpeech IF GET_GAME_TIMER() >= iLoadedExtractSpeechTime + 200 IF GET_IS_PRELOADED_CONVERSATION_READY() BEGIN_PRELOADED_CONVERSATION() bDoneExtractSpeech = TRUE ELIF GET_GAME_TIMER() >= iLoadedExtractSpeechTime + 3000 KILL_ANY_CONVERSATION() bDoneExtractSpeech = TRUE ENDIF ENDIF ENDIF ENDIF IF bDoneExtractSpeech IF NOT bStartExtraction IF GET_GAME_TIMER() >= iReinforcementsEnterTime + 300 bStartExtraction = TRUE ENDIF ENDIF IF GET_GAME_TIMER() >= iReinforcementsEnterTime + 2500 // setup selector HUD //SET_SELECTOR_PED_HINT(sSelectorPeds, SELECTOR_PED_TREVOR, FALSE) //SET_SELECTOR_PED_HINT(sSelectorPeds, SELECTOR_PED_FRANKLIN, FALSE) //SET_SELECTOR_PED_HINT(sSelectorPeds, SELECTOR_PED_MICHAEL, TRUE) SET_SELECTOR_PED_BLOCKED(sSelectorPeds, SELECTOR_PED_TREVOR, TRUE) SET_SELECTOR_PED_BLOCKED(sSelectorPeds, SELECTOR_PED_FRANKLIN, FALSE) SET_SELECTOR_PED_BLOCKED(sSelectorPeds, SELECTOR_PED_MICHAEL, FALSE) REMOVE_MISSION_TEXT(FALSE, TRUE, FALSE) iGuardSpeech = 0 CREATE_REINFORCEMENTS(1) // advance stage extractStage = EXTRACT_STAGE_REINFORCEMENTS_ENTER ENDIF ELSE iReinforcementsEnterTime = GET_GAME_TIMER() ENDIF ENDIF ENDIF BREAK CASE EXTRACT_STAGE_REINFORCEMENTS_ENTER // additional enemy reinforcements INT iAlive iAlive = HANDLE_ENEMY_FOOT_PEDS() IF NOT bCreatedAdditionalReinforcement[1] IF iAlive < 3 CREATE_REINFORCEMENTS(2) bCreatedAdditionalReinforcement[1] = TRUE ENDIF ENDIF IF NOT bCreatedAdditionalReinforcement[2] IF bCreatedAdditionalReinforcement[0] IF hangingHotswapState = HANGING_HOTSWAP_ON_MICHAEL BOOL bCreateLastGuy bCreateLastGuy = FALSE IF NOT IS_PED_INJURED(reinforcementPed[5]) IF (IS_PLAYER_TARGETTING_ENTITY(PLAYER_ID(), reinforcementPed[5]) OR IS_PLAYER_FREE_AIMING_AT_ENTITY(PLAYER_ID(), reinforcementPed[5])) AND iAlive = 1 bCreateLastGuy = TRUE ENDIF ELSE bCreateLastGuy = TRUE ENDIF IF bCreateLastGuy printstring("create the last guy!") printnl() CREATE_REINFORCEMENTS(4) bCreatedAdditionalReinforcement[2] = TRUE ENDIF ENDIF ENDIF ELSE IF NOT bCreatedAdditionalReinforcement[3] //IF hangingHotswapState = HANGING_HOTSWAP_ON_MICHAEL BOOL bCreateTotallyLastGuy bCreateTotallyLastGuy = FALSE IF NOT IS_PED_INJURED(reinforcementPed[6]) IF (IS_PLAYER_TARGETTING_ENTITY(PLAYER_ID(), reinforcementPed[6]) OR IS_PLAYER_FREE_AIMING_AT_ENTITY(PLAYER_ID(), reinforcementPed[6]) OR hangingHotswapState = HANGING_HOTSWAP_ON_FRANKLIN) AND iAlive = 1 bCreateTotallyLastGuy = TRUE ENDIF ELSE bCreateTotallyLastGuy = TRUE ENDIF IF bCreateTotallyLastGuy printstring("create the TOTALLY last guy!") printnl() CREATE_REINFORCEMENTS(5) bCreatedAdditionalReinforcement[3] = TRUE ENDIF //ENDIF ENDIF ENDIF IF NOT bCreatedAdditionalReinforcement[0] IF iAlive < 2 CREATE_REINFORCEMENTS(3) bCreatedAdditionalReinforcement[0] = TRUE iCreatedLastReinforcementTime = GET_GAME_TIMER() ENDIF ELSE BOOL bLastReinforcementDangerous bLastReinforcementDangerous = FALSE IF NOT IS_PED_INJURED(reinforcementPed[5]) AND iAlive = 1 IF NOT IS_PED_INJURED(reinforcementPed[6]) bLastReinforcementIsLast = TRUE ENDIF IF hangingHotswapState = HANGING_HOTSWAP_ON_FRANKLIN // do can't get shot speech IF GET_GAME_TIMER() >= iCreatedLastReinforcementTime + 4000 IF NOT bDoneCantGetShotSpeech IF DO_MISSION_SPEECH("FBI2_SHOT") IF iGuardSpeech >= 6 AND iGuardSpeech <= 9 iGuardSpeech = 10 ENDIF bDoneCantGetShotSpeech = TRUE iCantGetShotSpeechTime = GET_GAME_TIMER() ENDIF ELSE bLastReinforcementDangerous = TRUE IF NOT bDoneTroubleFlashHelp IF GET_GAME_TIMER() >= iCantGetShotSpeechTime + 2000 bDoneTroubleFlashHelp = DO_MISSION_HELP_TEXT("SG_TROHLP2", FALSE, 12500) ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF IF NOT IS_PED_INJURED(reinforcementPed[6]) bLastReinforcementDangerous = TRUE ENDIF IF bLastReinforcementDangerous SET_SELECTOR_PED_DAMAGED(sSelectorPeds, SELECTOR_PED_MICHAEL, TRUE) SET_SELECTOR_PED_HINT(sSelectorPeds, SELECTOR_PED_MICHAEL, FALSE) BOOL bShooting bShooting = FALSE IF NOT IS_PED_INJURED(reinforcementPed[5]) IF IS_PED_SHOOTING(reinforcementPed[5]) bShooting = TRUE ENDIF ENDIF IF NOT IS_PED_INJURED(reinforcementPed[6]) IF IS_PED_SHOOTING(reinforcementPed[6]) bShooting = TRUE ENDIF ENDIF IF NOT IS_PED_INJURED(reinforcementPed[7]) IF IS_PED_SHOOTING(reinforcementPed[7]) bShooting = TRUE ENDIF ENDIF IF bShooting IF GET_GAME_TIMER() >= iLastFakeDamagedMichaelTime + 1000 IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL]) APPLY_DAMAGE_TO_PED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], 15, TRUE) iLastFakeDamagedMichaelTime = GET_GAME_TIMER() ENDIF ENDIF ENDIF ELSE SET_SELECTOR_PED_DAMAGED(sSelectorPeds, SELECTOR_PED_MICHAEL, FALSE) //SET_SELECTOR_PED_HINT(sSelectorPeds, SELECTOR_PED_MICHAEL, TRUE) IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("SG_TROHLP2") IF GET_GAME_TIMER() >= iClearHelpTime + 1000 CLEAR_HELP(FALSE) iClearHelpTime = GET_GAME_TIMER() ENDIF ENDIF ENDIF ENDIF // set reinforcements to shoot REPEAT NUMBER_REINFORCEMENTS i IF NOT IS_PED_INJURED(reinforcementPed[i]) IF NOT bReinforcementToShoot[i] PED_INDEX targetPed targetPed = GET_MICHAEL_PED() FLOAT fBreakOutPhase SWITCH i CASE 0 fBreakOutPhase = 0.43 BREAK DEFAULT fBreakOutPhase = 0.98 BREAK ENDSWITCH IF NOT IS_PED_INJURED(targetPed) IF GET_SYNCHRONIZED_SCENE_PHASE(iGuardSyncScene[GET_SYNCED_SCENE_FOR_REINFORCEMENT(i)]) >= fBreakOutPhase CLEAR_SEQUENCE_TASK(sequence) OPEN_SEQUENCE_TASK(sequence) TASK_CLEAR_LOOK_AT(NULL) TASK_AIM_GUN_AT_ENTITY(NULL, targetPed, GET_RANDOM_INT_IN_RANGE(100, 4000), TRUE) TASK_SHOOT_AT_ENTITY(NULL, targetPed, -1, FIRING_TYPE_RANDOM_BURSTS) CLOSE_SEQUENCE_TASK(sequence) TASK_PERFORM_SEQUENCE(reinforcementPed[i], sequence) bReinforcementToShoot[i] = TRUE ELSE SET_PED_RESET_FLAG(reinforcementPed[i], PRF_BlockWeaponReactionsUnlessDead, TRUE) FLOAT fFirePhase fFirePhase = 1.1 SWITCH i CASE 1 SWITCH iReinforcementShootWhileMovingStage[i] CASE 0 fFirePhase = 0.605 BREAK CASE 1 fFirePhase = 0.693 BREAK CASE 2 fFirePhase = 0.820 BREAK ENDSWITCH BREAK CASE 2 SWITCH iReinforcementShootWhileMovingStage[i] CASE 0 fFirePhase = 0.260 BREAK CASE 1 fFirePhase = 0.287 BREAK CASE 2 fFirePhase = 0.392 BREAK CASE 3 fFirePhase = 0.420 BREAK CASE 4 fFirePhase = 0.460 BREAK CASE 5 fFirePhase = 0.650 BREAK CASE 6 fFirePhase = 0.705 BREAK CASE 7 fFirePhase = 0.852 BREAK CASE 8 fFirePhase = 0.910 BREAK ENDSWITCH BREAK CASE 3 SWITCH iReinforcementShootWhileMovingStage[i] CASE 0 fFirePhase = 0.775 BREAK CASE 1 fFirePhase = 0.950 BREAK ENDSWITCH BREAK ENDSWITCH IF GET_SYNCHRONIZED_SCENE_PHASE(iGuardSyncScene[GET_SYNCED_SCENE_FOR_REINFORCEMENT(i)]) >= fFirePhase SET_PED_SHOOTS_AT_COORD(reinforcementPed[i], <<0,0,0>>) iReinforcementShootWhileMovingStage[i]++ ENDIF ENDIF ENDIF ENDIF VECTOR vReinforcementPos vReinforcementPos = GET_ENTITY_COORDS(reinforcementPed[i]) IF HAS_ENTITY_BEEN_DAMAGED_BY_WEAPON(reinforcementPed[i], GET_SNATCH_AND_GRAB_WEAPON_TYPE(SAG_WEAPON_SNIPER_RIFLE)) OR (HAS_ENTITY_BEEN_DAMAGED_BY_WEAPON(reinforcementPed[i], GET_SNATCH_AND_GRAB_WEAPON_TYPE(SAG_WEAPON_MICHAEL_PISTOL)) AND GET_SCRIPT_TASK_STATUS(reinforcementPed[i], SCRIPT_TASK_SYNCHRONIZED_SCENE) = PERFORMING_TASK) OR (IS_PED_RAGDOLL(reinforcementPed[i]) AND (vReinforcementPos.y >= -619.2 OR vReinforcementPos.y <= -624.1 OR vReinforcementPos.x >= 124.3)) APPLY_DAMAGE_TO_PED(reinforcementPed[i], 1000, FALSE) ENDIF ENDIF ENDREPEAT // do reinforcement speech IF prisonerGrabState >= PRISONER_GRAB_STATE_EXTRACT IF iAlive > 0 IF iGuardSpeech < 21 AND (iGuardSpeech >=1 OR bDoneExtractSpeech) iThisSpeechLine = 0 PED_INDEX speechPed SWITCH iGuardSpeech CASE 0 tThisSpeechLabel = "FBI2_ESCA2" speechPed = reinforcementPed[1] BREAK CASE 1 tThisSpeechLabel = "FBI2_MIDAIR" speechPed = prisonerPed BREAK CASE 2 tThisSpeechLabel = "FBI2_SNIP5" speechPed = reinforcementPed[0] BREAK CASE 3 tThisSpeechLabel = "FBI2_MSHOOT1" speechPed = reinforcementPed[0] BREAK CASE 4 tThisSpeechLabel = "FBI2_STK2" speechPed = prisonerPed BREAK CASE 5 tThisSpeechLabel = "FBI2_NOMOV" speechPed = GET_MICHAEL_PED() BREAK CASE 6 IF GET_RANDOM_INT_IN_RANGE(0,2) = 0 tThisSpeechLabel = "FBI2_YMOVE" ELSE tThisSpeechLabel = "FBI2_YMOVE2" ENDIF speechPed = GET_TREVOR_PED() BREAK CASE 7 tThisSpeechLabel = "FBI2_SHM2" speechPed = reinforcementPed[1] BREAK CASE 8 tThisSpeechLabel = "FBI2_AHOL" speechPed = GET_MICHAEL_PED() BREAK CASE 9 tThisSpeechLabel = "FBI2_HEHE" speechPed = GET_TREVOR_PED() BREAK CASE 10 tThisSpeechLabel = "FBI2_CHAO5" speechPed = reinforcementPed[0] BREAK CASE 11 tThisSpeechLabel = "FBI2_MIDAIR" speechPed = prisonerPed BREAK CASE 12 tThisSpeechLabel = "FBI2_STK3" speechPed = reinforcementPed[3] BREAK CASE 13 tThisSpeechLabel = "FBI2_MOAN" speechPed = GET_MICHAEL_PED() BREAK CASE 14 tThisSpeechLabel = "FBI2_TALK" speechPed = GET_TREVOR_PED() BREAK CASE 15 tThisSpeechLabel = "FBI2_MSHOOT2" speechPed = prisonerPed BREAK CASE 16 tThisSpeechLabel = "FBI2_SHM3" speechPed = reinforcementPed[3] BREAK CASE 17 tThisSpeechLabel = "FBI2_MIDAIR" speechPed = prisonerPed BREAK CASE 18 tThisSpeechLabel = "FBI2_GETOUT" speechPed = GET_MICHAEL_PED() BREAK CASE 19 tThisSpeechLabel = "FBI2_MSHOOT3" speechPed = prisonerPed BREAK CASE 20 tThisSpeechLabel = "FBI2_FRANS" speechPed = GET_FRANKLIN_PED() BREAK ENDSWITCH IF NOT IS_PED_INJURED(speechPed) IF DO_MISSION_SPEECH(tThisSpeechLabel, TRUE, iThisSpeechLine) iGuardSpeech++ ENDIF ELSE iGuardSpeech++ ENDIF ENDIF ENDIF ENDIF INT iReinforcementsAlive iReinforcementsAlive = 0 REPEAT COUNT_OF(reinforcementPed) i IF NOT IS_PED_INJURED(reinforcementPed[i]) iReinforcementsAlive++ ENDIF ENDREPEAT IF NOT bCreatedAdditionalReinforcement[0] OR NOT bCreatedAdditionalReinforcement[1] OR NOT bCreatedAdditionalReinforcement[2] OR NOT bCreatedAdditionalReinforcement[3] iReinforcementsAlive++ ENDIF IF iReinforcementsAlive = 0 bDebugCanWinch = TRUE ENDIF IF prisonerGrabState < PRISONER_GRAB_STATE_EXTRACT IF NOT bDebugSwingOutEarlier IF iReinforcementsAlive < 3 bStartExtraction = TRUE ENDIF ELSE bStartExtraction = TRUE ENDIF ENDIF IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) SET_PLAYBACK_SPEED(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], 0.0) ENDIF BREAK ENDSWITCH // disable IK on Michael PED_INDEX ikPed = GET_MICHAEL_PED() IF NOT IS_PED_INJURED(ikPed) SET_PED_CAN_TORSO_REACT_IK(ikPed, FALSE) ENDIF // god text IF NOT bShownGodText AND currentMissionStage = STAGE_SNIPE_GUARDS IF NOT bDoneDontShootSpeech IF iGuardSpeech < 8 bDoneDontShootSpeech = DO_MISSION_SPEECH("FBI2_SHTK") ELSE bDoneDontShootSpeech = TRUE ENDIF ELSE //IF DO_MISSION_GOD_TEXT("SG_SNIPE") bShownGodText = TRUE iShownGodTextTime = GET_GAME_TIMER() //ENDIF ENDIF ENDIF IF prisonerGrabState = PRISONER_GRAB_STATE_EXTRACT fPhase = GET_SYNCHRONIZED_SCENE_PHASE(iSyncScene) IF bPinRopeToWindow IF fPhase >= 0.02 bPinRopeToWindow = FALSE ENDIF ENDIF // go to swinging IF NOT bActivatedRopeSwingFromSynced IF IS_SYNCHRONIZED_SCENE_RUNNING(iSyncScene) fPhase = GET_SYNCHRONIZED_SCENE_PHASE(iSyncScene) IF fPhase >= 0.98 //PRINTSTRING("heading = ") PRINTFLOAT(GET_ENTITY_HEADING(GET_MICHAEL_PED())) PRINTNL() prisonerGrabState = PRISONER_GRAB_STATE_DANGLING SET_ROPE_DANGLING(FALSE, TRUE) iDangleTime = GET_GAME_TIMER() HANDLE_CHOPPER_ROPE(ROPE_TYPE_SWINGING) //PRINT_HELP("SG_HOTHLP") SET_SELECTOR_PED_HINT(sSelectorPeds, SELECTOR_PED_MICHAEL, TRUE) iRecheckMichaelShootTime = GET_GAME_TIMER() + 1100 REPLAY_RECORD_BACK_FOR_TIME(3.0) bActivatedRopeSwingFromSynced = TRUE ENDIF IF fPhase >= 0.18//0.24 fRopeTransitionPhase = fRopeTransitionPhase +@ 0.21 IF fRopeTransitionPhase > 1.0 fRopeTransitionPhase = 1.0 ENDIF ENDIF IF NOT bDoneExtractSpeech IF fPhase >= 0.01//0.25 //bDoneExtractSpeech = DO_MISSION_SPEECH("FBI2_PULL", TRUE) ENDIF ENDIF ENDIF ENDIF ENDIF IF prisonerGrabState = PRISONER_GRAB_STATE_WINCHING IF GET_GAME_TIMER() >= iWinchTime // the alt 2500 IF (hangingHotswapState = HANGING_HOTSWAP_ON_MICHAEL OR hangingHotswapState = HANGING_HOTSWAP_ON_FRANKLIN) AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() IF HAS_CUTSCENE_LOADED_WITH_FAILSAFE() fRopeTransitionPhase = 1.0 bRunningCutscene = TRUE ENDIF ENDIF ENDIF ENDIF ELSE DO_WINCH_CUTSCENE() ENDIF ENSURE_FRANKLIN_INVISIBLE() ENDPROC PROC RESET_CHOPPER_PED_DAMAGE_ENTITY() INT i REPEAT COUNT_OF(enemyChopperPed) i IF NOT IS_PED_INJURED(enemyChopperPed[i]) CLEAR_ENTITY_LAST_DAMAGE_ENTITY(enemyChopperPed[i]) ENDIF ENDREPEAT ENDPROC PROC DO_CHOPPER_ESCAPE_COMMON_FUNCTIONS() INT i // TEMP - BLOCK TREVOR ESCAPE //DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_EXIT) SET_ALLOW_CUSTOM_VEHICLE_DRIVE_BY_CAM_THIS_UPDATE(TRUE) // disable control on michael IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SELECT_WEAPON) DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_EXIT) DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_ENTER) DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_SELECT_NEXT_WEAPON) DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_SELECT_PREV_WEAPON) SET_PED_RESET_FLAG(PLAYER_PED_ID(), PRF_AllowSpecialAbilityInVehicle, TRUE) ELIF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_FRANKLIN DISABLE_ON_FOOT_FIRST_PERSON_VIEW_THIS_UPDATE() REPLAY_DISABLE_CAMERA_MOVEMENT_THIS_FRAME() DISABLE_CELLPHONE_THIS_FRAME_ONLY() DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SELECT_WEAPON) DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_JUMP) DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_ENTER) DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SPRINT) ENDIF IF NOT IS_PED_INJURED(GET_MICHAEL_PED()) SET_PED_CAN_SWITCH_WEAPON(GET_MICHAEL_PED(), FALSE) SET_PED_RESET_FLAG(GET_MICHAEL_PED(), PRF_PreventGoingIntoShuntInVehicleState, TRUE) ENDIF IF NOT IS_PED_INJURED(GET_FRANKLIN_PED()) SET_PED_CAN_SWITCH_WEAPON(GET_FRANKLIN_PED(), FALSE) ENDIF IF NOT IS_PED_INJURED(GET_TREVOR_PED()) SET_PED_CAN_SWITCH_WEAPON(GET_TREVOR_PED(), TRUE) ENDIF PED_INDEX fPed = GET_FRANKLIN_PED() IF NOT IS_PED_INJURED(fPed) IF HAS_PED_GOT_WEAPON(fPed, GET_SNATCH_AND_GRAB_WEAPON_TYPE(SAG_WEAPON_SNIPER_RIFLE)) WEAPON_TYPE weapon GET_CURRENT_PED_WEAPON(fPed, weapon) IF weapon <> GET_SNATCH_AND_GRAB_WEAPON_TYPE(SAG_WEAPON_SNIPER_RIFLE) PRINTSTRING("franklin has a rifle but it is not equipped!!!") PRINTNL() SET_CURRENT_PED_WEAPON(fPed, GET_SNATCH_AND_GRAB_WEAPON_TYPE(SAG_WEAPON_SNIPER_RIFLE), TRUE) ENDIF ELSE PRINTSTRING("franklin doesn't have a rifle!!!") PRINTNL() ENDIF ENDIF /* // handle michael reload state IF hangingHotswapState = HANGING_HOTSWAP_ON_MICHAEL PED_INDEX reloadPed = GET_MICHAEL_PED() IF NOT IS_PED_INJURED(reloadPed) INT iAmmo GET_AMMO_IN_CLIP(reloadPed, GET_SNATCH_AND_GRAB_WEAPON_TYPE(SAG_WEAPON_MICHAEL_RIFLE), iAmmo) SWITCH michaelReloadState CASE MICHAEL_RELOAD_HAS_AMMO IF iAmmo = 0 PLAY_SOUND_FROM_ENTITY(-1, "FBI_02_RELOAD", reloadPed) michaelReloadState = MICHAEL_RELOAD_IS_RELOADING ENDIF BREAK CASE MICHAEL_RELOAD_IS_RELOADING IF iAmmo > 0 michaelReloadState = MICHAEL_RELOAD_HAS_AMMO ENDIF BREAK ENDSWITCH ENDIF ELSE michaelReloadState = MICHAEL_RELOAD_HAS_AMMO ENDIF */ // handle fbi HANDLE_FBI() // rotate the sniper rifle to track chopper IF IS_VEHICLE_DRIVEABLE(enemyChopperVehicle[2]) IF hangingHotswapState <> HANGING_HOTSWAP_ON_FRANKLIN AND hangingHotswapState <> HANGING_HOTSWAP_MICHAEL_TO_FRANKLIN AND hangingHotswapState <> HANGING_HOTSWAP_TREVOR_TO_FRANKLIN //VECTOR vSniperCoords = GET_ENTITY_COORDS(remoteSniperData.obj_sniper) // VECTOR vChopperCoords = GET_ENTITY_COORDS(enemyChopperVehicle[2]) //FLOAT fSniperHeading = GET_HEADING_FROM_VECTOR_2D(vChopperCoords.x - vSniperCoords.x, vChopperCoords.y - vSniperCoords.y) //SET_ENTITY_HEADING(remoteSniperData.obj_sniper, fSniperHeading) ENDIF ENDIF // exaggerated spin out on the choppers REPEAT NUMBER_ENEMY_CHOPPERS i IF NOT bDoChopperSpinOut[i] IF NOT IS_ENTITY_DEAD(enemyChopperVehicle[i]) IF IS_PED_INJURED(GET_PED_IN_VEHICLE_SEAT(enemyChopperVehicle[i])) PLAY_SOUND_FROM_ENTITY(-1, "FBI_02_SNATCH_AND_GRAB_HELI_DOWN", enemyChopperVehicle[i]) SET_VEHICLE_OUT_OF_CONTROL(enemyChopperVehicle[i], FALSE) bDoChopperSpinOut[i] = TRUE ENDIF ENDIF ENDIF ENDREPEAT // kill Franklin on chopper collision IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN]) IF currentMissionStage = STAGE_DROPOFF IF NOT IS_PED_HEADTRACKING_ENTITY(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], PLAYER_PED_ID()) TASK_LOOK_AT_ENTITY(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], PLAYER_PED_ID(), -1, SLF_WHILE_NOT_IN_FOV) ENDIF ENDIF SET_PED_RESET_FLAG(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], PRF_UseKinematicPhysics, TRUE) SET_PED_ACCURACY(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], 0) IF IS_ENTITY_ATTACHED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN]) DETACH_ENTITY(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN]) ENDIF SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], TRUE) IF NOT IS_ENTITY_DEAD(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) IF (IS_ENTITY_TOUCHING_ENTITY(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN]) AND GET_ENTITY_SPEED(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) >= 2) OR (IS_PED_RAGDOLL(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN]) AND (hangingHotswapState = HANGING_HOTSWAP_ON_MICHAEL OR hangingHotswapState = HANGING_HOTSWAP_ON_TREVOR)) DETACH_ENTITY(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN]) APPLY_DAMAGE_TO_PED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], 1000, TRUE) ENDIF ENDIF ENDIF // IF bDoChopperSpinOut /* IF IS_PED_INJURED(enemyChopperPed[0]) IF DOES_ENTITY_EXIST(enemyChopperVehicle) IF NOT IS_ENTITY_DEAD(enemyChopperVehicle) VECTOR vRotationVelocity = GET_ENTITY_ROTATION_VELOCITY(enemyChopperVehicle) IF vRotationVelocity.z >= 0 iSpinModifier = -1 ELSE iSpinModifier = 1 ENDIF fSpinForce = fSpinForce +@ (6 * iSpinModifier) // 12 IF fSpinForce >= 50 fSpinForce = 50 ELIF fSpinForce <= -50 fSpinForce = -50 ENDIF fUpwardsForce = fUpwardsForce -@ 1.8 IF fUpwardsForce < 0 fUpwardsForce = 0 ENDIF IF NOT IS_HELI_PART_BROKEN(enemyChopperVehicle, TRUE, TRUE, TRUE) APPLY_FORCE_TO_ENTITY(enemyChopperVehicle, APPLY_TYPE_FORCE, <>, <<0, 2.2, 0>>, 0, TRUE, TRUE, TRUE) APPLY_FORCE_TO_ENTITY(enemyChopperVehicle, APPLY_TYPE_FORCE, <<-fSpinForce, 0, 0>>, <<0, -2.2, 0>>, 0, TRUE, TRUE, TRUE) APPLY_FORCE_TO_ENTITY(enemyChopperVehicle, APPLY_TYPE_EXTERNAL_FORCE, <<0, 0, fUpwardsForce>>, <<0, 0, 0>>, 0, FALSE, TRUE, TRUE) ENDIF IF HAS_ENTITY_COLLIDED_WITH_ANYTHING(enemyChopperVehicle) EXPLODE_VEHICLE(enemyChopperVehicle) ENDIF ENDIF ENDIF ENDIF */ // ELSE /* // set to spin out IF NOT IS_VEHICLE_DRIVEABLE(enemyChopperVehicle) OR IS_PED_INJURED(enemyChopperPed[0]) bDoChopperSpinOut = TRUE ENDIF */ // ENDIF // unpin interior IF NOT bUnpinnedInteriorForChase //IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_WINDOW_FRAME), FALSE) >= 200.0 SET_GUARDS_NO_LONGER_NEEDED() REPEAT NUMBER_REINFORCEMENTS i IF DOES_ENTITY_EXIST(reinforcementPed[i]) IF NOT IS_PED_INJURED(reinforcementPed[i]) CLEAR_PED_TASKS(reinforcementPed[i]) ENDIF SET_PED_AS_NO_LONGER_NEEDED(reinforcementPed[i]) ENDIF ENDREPEAT IF DOES_ENTITY_EXIST(chairObject) SET_OBJECT_AS_NO_LONGER_NEEDED(chairObject) ENDIF IF DOES_ENTITY_EXIST(torchObject) SET_OBJECT_AS_NO_LONGER_NEEDED(torchObject) ENDIF IF DOES_ENTITY_EXIST(michellePed) SET_PED_AS_NO_LONGER_NEEDED(michellePed) ENDIF PIN_OFFICE_INTERIOR(FALSE, FALSE) bUnpinnedInteriorForChase = TRUE //ENDIF ENDIF // handle winding rope IF NOT bStartedWinding IF GET_GAME_TIMER() >= iChopperChaseTime + CHASE_START_WINDING_TIME OR bShortRope OR currentMissionStage = STAGE_DROPOFF IF DOES_ROPE_EXIST(rappelData.rope) STOP_ROPE_UNWINDING_FRONT(rappelData.rope) START_ROPE_WINDING(rappelData.rope) iStartWindingTime = GET_GAME_TIMER() bStartedWinding = TRUE ENDIF ENDIF ELSE IF NOT bStoppedWinding IF NOT bShortRope IF GET_GAME_TIMER() >= iStartWindingTime + WINDING_LENGTH IF DOES_ROPE_EXIST(rappelData.rope) STOP_ROPE_WINDING(rappelData.rope) bStoppedWinding = TRUE ENDIF ENDIF ENDIF ENDIF ENDIF // create the fbi SWITCH createFBIAtEndStage CASE CREATE_FBI_AT_END_STAGE_NOT_STARTED IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<1387.84, -2061.63, 51.00>>, <<500,500,500>>, FALSE, FALSE) ADD_MODEL_REQUEST(ENUM_TO_INT(SAGM_FBIEND)) ADD_MODEL_REQUEST(ENUM_TO_INT(SAGM_FBI_VAN)) ADD_MODEL_REQUEST(ENUM_TO_INT(SAGM_DRIVE_AWAY_CAR)) ADD_MODEL_REQUEST(ENUM_TO_INT(SAGM_UTIL_TRUCK_1)) ADD_MODEL_REQUEST(ENUM_TO_INT(SAGM_UTIL_TRUCK_2)) createFBIAtEndStage = CREATE_FBI_AT_END_STAGE_WAITING ENDIF BREAK CASE CREATE_FBI_AT_END_STAGE_WAITING IF HAVE_ALL_MODEL_REQUESTS_SUCCEEDED() CREATE_FBI_FOR_STAGE(STAGE_CHOPPER_CHASE) CREATE_UTIL_TRUCKS(STAGE_CHOPPER_CHASE) IF SHOULD_USE_MISSION_START_VEHICLE_AT_END() driveAwayVehicle = CREATE_REPLAY_START_VEHICLE(<<1387.10, -2044.61, 51.56>>, 130.9) ELSE driveAwayVehicle = CREATE_VEHICLE(GET_MODEL_FOR_SNATCH_AND_GRAB_MODEL_ENUM(SAGM_DRIVE_AWAY_CAR), <<1387.10, -2044.61, 51.56>>, 130.9) SET_VEHICLE_COLOUR_COMBINATION(driveAwayVehicle, 0) ENDIF IF IS_VEHICLE_DRIVEABLE(driveAwayVehicle) SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(driveAwayVehicle, TRUE) ENDIF SET_VEHICLE_ON_GROUND_PROPERLY(driveAwayVehicle) //createFBIAtEndStage = CREATE_FBI_AT_END_STAGE_MID createFBIAtEndStage = CREATE_FBI_AT_END_STAGE_DONE ENDIF BREAK CASE CREATE_FBI_AT_END_STAGE_DONE BREAK ENDSWITCH // hanging swing cam IF hangingHotswapState = HANGING_HOTSWAP_ON_TREVOR //HANDLE_ROPE_SWING_CAM() ENDIF // michael shooting ai /* IF hangingHotswapState = HANGING_HOTSWAP_ON_TREVOR IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL]) IF GET_GAME_TIMER() >= iRecheckMichaelShootTime BOOL bCanDoShoot = FALSE IF currentMissionStage = STAGE_CHOPPER_CHASE IF IS_VEHICLE_DRIVEABLE(enemyChopperVehicle) IF NOT IS_PED_INJURED(enemyChopperPed[0]) IF GET_DISTANCE_BETWEEN_ENTITIES(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], enemyChopperVehicle, FALSE) <= 110 bCanDoShoot = TRUE ENDIF ENDIF ENDIF ENDIF IF bCanDoShoot IF enemyChopperPed[0] <> michaelTargetPed TASK_AIM_GUN_SCRIPTED_WITH_TARGET(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], enemyChopperPed[0], <<0,0,0>>, SCRIPTED_GUN_TASK_ON_ROPE) michaelTargetPed = enemyChopperPed[0] ENDIF ELSE IF DOES_ENTITY_EXIST(michaelTargetPed) TASK_PLAY_ANIM(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], GET_SNATCH_AND_GRAB_ANIM_DICT_AS_STRING(SAG_ANIM_DICT_MISSION), "idle", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING) michaelTargetPed = NULL ENDIF ENDIF iRecheckMichaelShootTime = GET_GAME_TIMER() + 2000 ENDIF ENDIF ENDIF */ // michael IF NOT IS_PED_INJURED(GET_MICHAEL_PED()) SET_PED_RESET_FLAG(GET_MICHAEL_PED(), PRF_ExtraLongWeaponRange, TRUE) ENDIF // trevor fly to dropoff IF currentMissionStage = STAGE_DROPOFF IF hangingHotswapState <> HANGING_HOTSWAP_ON_TREVOR AND hangingHotswapState <> HANGING_HOTSWAP_MICHAEL_TO_TREVOR AND hangingHotswapState <> HANGING_HOTSWAP_FRANKLIN_TO_TREVOR AND GET_CURRENT_PLAYER_PED_ENUM() <> CHAR_TREVOR IF NOT bDoneTrevorFly IF bDoneGotoSpeech IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) IF GET_GAME_TIMER() >= iNextTrevorAITime DO_TREVOR_FLY_TO_DROPOFF() bDoneTrevorFly = TRUE ENDIF ENDIF ENDIF ELSE IF IS_VEHICLE_DRIVEABLE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) IF iLeaveHighRiseAreaPoint < 0 IF iTrevorRouteStage > 0 IF IS_ENTITY_AT_COORD(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], vTrevorRoutePoint[iTrevorRouteStage], <<40, 40, 40>>, FALSE, FALSE) iTrevorRouteStage-- DO_TREVOR_FLY_TO_ROUTE_POINT() ENDIF ENDIF ELSE VECTOR vHeliPos vHeliPos = GET_ENTITY_COORDS(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) HANDLE_LEAVE_HIGH_RISE_AREA() IF GET_DISTANCE_BETWEEN_COORDS(vHeliPos, GET_LEAVE_HIGH_RISE_AREA_POINT(iLeaveHighRiseAreaPoint), FALSE) <= 30 OR NOT IS_COORD_IN_HIGH_RISE_AREA(vHeliPos) DO_TREVOR_FLY_TO_DROPOFF() ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF IF hangingHotswapState <> HANGING_HOTSWAP_ON_TREVOR AND hangingHotswapState <> HANGING_HOTSWAP_ON_FRANKLIN AND hangingHotswapState <> HANGING_HOTSWAP_ON_MICHAEL iSuppressHUDTime = GET_GAME_TIMER() + 100 ENDIF IF GET_GAME_TIMER() <= iSuppressHUDTime + 100 HIDE_HUD_COMPONENT_THIS_FRAME(NEW_HUD_STREET_NAME) HIDE_HUD_COMPONENT_THIS_FRAME(NEW_HUD_VEHICLE_NAME) HIDE_HUD_COMPONENT_THIS_FRAME(NEW_HUD_AREA_NAME) HIDE_HUD_COMPONENT_THIS_FRAME(NEW_HUD_DISTRICT_NAME) ENDIF // handle hotswap between michael and trevor SWITCH hangingHotswapState CASE HANGING_HOTSWAP_ON_TREVOR IF NOT bClearedAutopilot //BOOL bPressingControl INT iLX, iLY, iRX, iRY GET_CONTROL_VALUE_OF_ANALOGUE_STICKS(iLX, iLY, iRX, iRY) IF GET_GAME_TIMER() >= iClearAutopilotTime OR iLx > 20 OR iLx < -20 OR iLy > 20 OR iLy < -20 OR IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_VEH_FLY_THROTTLE_UP) OR IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_VEH_FLY_THROTTLE_DOWN) OR IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_VEH_FLY_YAW_LEFT) OR IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_VEH_FLY_YAW_RIGHT) IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) STOP_PLAYBACK_RECORDED_VEHICLE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) ENDIF CLEAR_PED_TASKS(PLAYER_PED_ID()) bClearedAutopilot = TRUE ENDIF ENDIF IF currentMissionStage = STAGE_DROPOFF IF NOT bSwitchedBackDuringDropoff IF bShownGodText bSwitchedBackDuringDropoff = TRUE ENDIF ENDIF ENDIF //CASCADE_SHADOWS_SET_CASCADE_BOUNDS_SCALE(CASCADE_SHADOWS_MULTIPLIER_NO_OVERRIDE) // deal with michael driveby HANDLE_MICHAEL_DRIVEBY() HANDLE_FRANKLIN_SHOOT_FROM_ROOF() IF IS_SELECTOR_UI_BUTTON_PRESSED() DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_EXIT) iSelectorPressedTime = GET_GAME_TIMER() ELIF GET_GAME_TIMER() <= iSelectorPressedTime + 200 DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_EXIT) ENDIF //PRINTSTRING("ON TREVOR") PRINTNL() IF CAN_ADVANCE_MISSION() AND IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) AND NOT bDisableSwitchDuringMagDemoEndScene //PRINTSTRING("CAN ADVANCE MISSION") PRINTNL() IF UPDATE_SELECTOR_HUD(sSelectorPeds, FALSE) #IF IS_DEBUG_BUILD OR bDebugJSkip #ENDIF PRINTSTRING("UPDATED SELECTOR HUD") PRINTNL() BOOL bResetTrevor bResetTrevor = FALSE g_fSavedMaxMotionBlur = GET_MOTIONBLUR_MAX_VEL_SCALER() IF sSelectorPeds.eNewSelectorPed = SELECTOR_PED_MICHAEL bDoneReattach = FALSE INFORM_MISSION_STATS_OF_INCREMENT(FBI2_SWITCHES) DO_CHOPPER_TO_PED_AUDIO_SCENE(CHAR_MICHAEL) iSwitchTime = GET_GAME_TIMER() hangingHotswapState = HANGING_HOTSWAP_TREVOR_TO_MICHAEL iNextTrevorAITime = GET_GAME_TIMER() + 3000 bResetTrevor = TRUE ELIF sSelectorPeds.eNewSelectorPed = SELECTOR_PED_FRANKLIN INFORM_MISSION_STATS_OF_INCREMENT(FBI2_SWITCHES) iSwitchTime = GET_GAME_TIMER() hangingHotswapState = HANGING_HOTSWAP_TREVOR_TO_FRANKLIN SET_MOTIONBLUR_MAX_VEL_SCALER(MAX_TRANSITION_BLUR) DO_CHOPPER_TO_PED_AUDIO_SCENE(CHAR_FRANKLIN) bResetTrevor = TRUE ENDIF IF bResetTrevor iTrevorEscapeRoutePoint = -1 iLeaveHighRiseAreaPoint = -1 bAllowStartEscapeRoute = FALSE bDoneTrevorFly = FALSE bDoneForceTrevorLow = FALSE bDoneDangleHelp = TRUE ENDIF ENDIF ENDIF BREAK CASE HANGING_HOTSWAP_ON_MICHAEL // lockon range SET_PLAYER_LOCKON_RANGE_OVERRIDE(PLAYER_ID(), 130) OVERRIDE_LODSCALE_THIS_FRAME(1.0) HANDLE_FRANKLIN_SHOOT_FROM_ROOF() IF GET_GAME_TIMER() <= iBlockMichaelShootTime IF NOT IS_PED_INJURED(GET_MICHAEL_PED()) SET_PED_RESET_FLAG(GET_MICHAEL_PED(), PRF_BlockWeaponFire, TRUE) ENDIF ENDIF //PRINTSTRING("lodscale") PRINTNL() //CASCADE_SHADOWS_SET_CASCADE_BOUNDS_SCALE(CASCADE_SHADOWS_MULTIPLIER_NO_OVERRIDE) //CASCADE_SHADOWS_SET_AIRCRAFT_MODE(TRUE)] IF GET_GAME_TIMER() >= iNextExplosionCheckTime IF IS_EXPLOSION_IN_AREA(EXP_TAG_DONTCARE, GET_ENTITY_COORDS(PLAYER_PED_ID()) - <<6,6,6>>, GET_ENTITY_COORDS(PLAYER_PED_ID()) + <<6,6,6>>) APPLY_DAMAGE_TO_PED(PLAYER_PED_ID(), 20, TRUE) ENDIF iNextExplosionCheckTime = GET_GAME_TIMER() + 5000 ENDIF // switch menu IF bDoneGetOutSpeech IF CAN_ADVANCE_MISSION() AND IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) AND NOT bDisableSwitchDuringMagDemoEndScene IF UPDATE_SELECTOR_HUD(sSelectorPeds, FALSE) #IF IS_DEBUG_BUILD OR bDebugJSkip #ENDIF //BOOL bResetTrevor //bResetTrevor = FALSE g_fSavedMaxMotionBlur = GET_MOTIONBLUR_MAX_VEL_SCALER() IF sSelectorPeds.eNewSelectorPed = SELECTOR_PED_TREVOR IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("SG_HOTHLP2") CLEAR_HELP(FALSE) ENDIF //bResetTrevor = TRUE INFORM_MISSION_STATS_OF_INCREMENT(FBI2_SWITCHES) DO_CHOPPER_TO_PED_AUDIO_SCENE(CHAR_TREVOR) iSwitchTime = GET_GAME_TIMER() hangingHotswapState = HANGING_HOTSWAP_MICHAEL_TO_TREVOR ELIF sSelectorPeds.eNewSelectorPed = SELECTOR_PED_FRANKLIN //bResetTrevor = TRUE INFORM_MISSION_STATS_OF_INCREMENT(FBI2_SWITCHES) iSwitchTime = GET_GAME_TIMER() hangingHotswapState = HANGING_HOTSWAP_MICHAEL_TO_FRANKLIN SET_MOTIONBLUR_MAX_VEL_SCALER(MAX_TRANSITION_BLUR) DO_CHOPPER_TO_PED_AUDIO_SCENE(CHAR_FRANKLIN) ENDIF /* IF bResetTrevor iTrevorEscapeRoutePoint = -1 iLeaveHighRiseAreaPoint = -1 bAllowStartEscapeRoute = FALSE bDoneTrevorFly = FALSE bDoneForceTrevorLow = FALSE bDoneDangleHelp = TRUE ENDIF */ ENDIF ENDIF ENDIF BREAK CASE HANGING_HOTSWAP_ON_FRANKLIN VECTOR vGameplayCamRot vGameplayCamRot = GET_GAMEPLAY_CAM_ROT() SET_ENTITY_ROTATION(franklinAnchorObject, <<0,0,vGameplayCamRot.z>>) IF NOT bChangedPriorityFromSniperToTrevor IF NOT IS_VEHICLE_DRIVEABLE(enemyChopperVehicle[0]) AND NOT IS_VEHICLE_DRIVEABLE(enemyChopperVehicle[1]) AND NOT IS_VEHICLE_DRIVEABLE(enemyChopperVehicle[3]) SET_SELECTOR_PED_PRIORITY(sSelectorPeds, SELECTOR_PED_TREVOR, SELECTOR_PED_MICHAEL, SELECTOR_PED_FRANKLIN) bChangedPriorityFromSniperToTrevor = TRUE ENDIF ENDIF // switch menu BOOL bSelectorCheck bSelectorCheck = FALSE IF CAN_ADVANCE_MISSION() bSelectorCheck = UPDATE_SELECTOR_HUD(sSelectorPeds, FALSE) ENDIF //CASCADE_SHADOWS_SET_CASCADE_BOUNDS_SCALE(CASCADE_SHADOWS_MULTIPLIER_EXTERIOR_OVERRIDE) // force switch to franklin if all destroyed IF NOT bDoneForceGetOutOfThereSpeech IF currentMissionStage = STAGE_DROPOFF bDoneForceGetOutOfThereSpeech = DO_MISSION_SPEECH("FBI2_LEAVE") ENDIF ELSE IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() sSelectorPeds.eNewSelectorPed = SELECTOR_PED_TREVOR bSelectorCheck = TRUE ENDIF ENDIF IF bSelectorCheck #IF IS_DEBUG_BUILD OR bDebugJSkip #ENDIF SET_ENTITY_VISIBLE(GET_FRANKLIN_PED(), TRUE) g_fSavedMaxMotionBlur = GET_MOTIONBLUR_MAX_VEL_SCALER() SET_MOTIONBLUR_MAX_VEL_SCALER(MAX_TRANSITION_BLUR) IF sSelectorPeds.eNewSelectorPed = SELECTOR_PED_MICHAEL OR sSelectorPeds.eNewSelectorPed = SELECTOR_PED_TREVOR IF NOT IS_PED_INJURED(PLAYER_PED_ID()) SET_FACIAL_IDLE_ANIM_OVERRIDE(PLAYER_PED_ID(), "Mood_Angry_1") ENDIF //SET_REMOTE_SNIPER_ACTIVE(remoteSniperData, FALSE) //RENDER_SCRIPT_CAMS(TRUE, FALSE) // CASCADE_SHADOWS_SET_CASCADE_BOUNDS_SCALE(CASCADE_SHADOWS_MULTIPLIER_NO_OVERRIDE) // CASCADE_SHADOWS_SET_AIRCRAFT_MODE(TRUE) IF sSelectorPeds.eNewSelectorPed = SELECTOR_PED_MICHAEL INFORM_MISSION_STATS_OF_INCREMENT(FBI2_SWITCHES) DO_CHOPPER_TO_PED_AUDIO_SCENE(CHAR_MICHAEL) iSwitchTime = GET_GAME_TIMER() hangingHotswapState = HANGING_HOTSWAP_FRANKLIN_TO_MICHAEL ELSE INFORM_MISSION_STATS_OF_INCREMENT(FBI2_SWITCHES) DO_CHOPPER_TO_PED_AUDIO_SCENE(CHAR_TREVOR) iSwitchTime = GET_GAME_TIMER() hangingHotswapState = HANGING_HOTSWAP_FRANKLIN_TO_TREVOR ENDIF ENDIF ELSE IF GET_FOLLOW_PED_CAM_VIEW_MODE() <> CAM_VIEW_MODE_FIRST_PERSON SET_PLAYER_FORCE_SKIP_AIM_INTRO(PLAYER_ID(),TRUE) SET_PLAYER_FORCED_AIM(PLAYER_ID(), TRUE) IF IS_SELECTOR_ONSCREEN() //IF IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_CHARACTER_WHEEL) iWaitToKillCam = 0 //sniper IF NOT DOES_CAM_EXIST(staticCam) CREATE_MISSION_STATIC_CAM(staticCam) SET_ENTITY_VISIBLE(GET_FRANKLIN_PED(), TRUE) SET_CAM_FOV(staticCam, 45.0) ATTACH_CAM_TO_ENTITY(staticCam, GET_FRANKLIN_PED(), <<0.0,-2.5,0.7>>, TRUE) POINT_CAM_AT_ENTITY(staticCam, GET_FRANKLIN_PED(), <<0,0,0.4>>, TRUE) ENDIF RENDER_SCRIPT_CAMS(TRUE, FALSE) ////PRINTSTRING("Show Franklin here") PRINTNL() ELSE IF iWaitToKillCam = 4 //SET_ENTITY_VISIBLE(GET_FRANKLIN_PED(), FALSE) DESTROY_MISSION_STATIC_CAM(staticCam) RENDER_SCRIPT_CAMS(FALSE, FALSE) DISPLAY_SNIPER_SCOPE_THIS_FRAME() ELSE iWaitToKillCam++ ENDIF ENDIF ENDIF ENDIF BREAK CASE HANGING_HOTSWAP_FRANKLIN_TO_TREVOR CASE HANGING_HOTSWAP_MICHAEL_TO_TREVOR //SET_GAMEPLAY_CAM_MAX_MOTION_BLUR_STRENGTH_THIS_UPDATE(0.0) BOOL bSwitchToTrevorComplete bSwitchToTrevorComplete = FALSE IF hangingHotswapState = HANGING_HOTSWAP_FRANKLIN_TO_TREVOR bSwitchToTrevorComplete = DO_MISSION_HOTSWAP(SELECTOR_PED_TREVOR, FALSE, TRUE, HOTSWAP_CAM_FRANKLIN_TO_CHOPPER) ELSE bSwitchToTrevorComplete = DO_MISSION_HOTSWAP(SELECTOR_PED_TREVOR, FALSE, TRUE, HOTSWAP_CAM_OUTSIDE_CHOPPER) ENDIF iBlockMichaelShootTime = GET_GAME_TIMER() + 500 IF NOT IS_PED_INJURED(GET_MICHAEL_PED()) IF currentMissionStage = STAGE_DROPOFF OR NOT bSwitchToFirstPerson SET_PED_RESET_FLAG(GET_MICHAEL_PED(), PRF_BlockWeaponFire, TRUE) ENDIF ENDIF IF bSwitchToTrevorComplete RESET_CHOPPER_PED_DAMAGE_ENTITY() //SET_SELECTOR_PED_HINT(sSelectorPeds, SELECTOR_PED_MICHAEL, FALSE) //SET_SELECTOR_PED_HINT(sSelectorPeds, SELECTOR_PED_FRANKLIN, FALSE) //SET_SELECTOR_PED_HINT(sSelectorPeds, SELECTOR_PED_TREVOR, FALSE) IF currentMissionStage = STAGE_CHOPPER_CHASE SET_SELECTOR_PED_BLOCKED(sSelectorPeds, SELECTOR_PED_FRANKLIN, FALSE) ENDIF SET_SELECTOR_PED_BLOCKED(sSelectorPeds, SELECTOR_PED_MICHAEL, FALSE) SET_SELECTOR_PED_BLOCKED(sSelectorPeds, SELECTOR_PED_TREVOR, FALSE) IF IS_VEHICLE_DRIVEABLE(enemyChopperVehicle[2]) // selector priority SET_SELECTOR_PED_PRIORITY(sSelectorPeds, SELECTOR_PED_FRANKLIN, SELECTOR_PED_MICHAEL, SELECTOR_PED_TREVOR) ELSE // selector priority SET_SELECTOR_PED_PRIORITY(sSelectorPeds, SELECTOR_PED_MICHAEL, SELECTOR_PED_TREVOR, SELECTOR_PED_FRANKLIN) ENDIF // IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN]) SET_RAGDOLL_BLOCKING_FLAGS(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], RBF_PLAYER_IMPACT) ENDIF SET_FAR_DRAW_VEHICLES(FALSE) CASCADE_SHADOWS_SET_CASCADE_BOUNDS_SCALE(CASCADE_SHADOWS_MULTIPLIER_NO_OVERRIDE) CASCADE_SHADOWS_SET_AIRCRAFT_MODE(TRUE) michaelTargetPed = NULL michaelTargetVehicle = NULL DESTROY_MISSION_STATIC_CAM(staticCam) SET_MOTIONBLUR_MAX_VEL_SCALER(g_fSavedMaxMotionBlur) SET_TIME_SCALE(1.0) RENDER_SCRIPT_CAMS(FALSE, FALSE) IF IS_VEHICLE_DRIVEABLE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) CLEAR_ENTITY_LAST_DAMAGE_ENTITY(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) ENDIF //SCRIPT_OVERRIDES_WIND_TYPES(true,"WEATHER_TYPES_MAGDEMO_FIB2_ONBOARD_HELI_SHOOTING","WEATHER_TYPES_MAGDEMO_FIB2_ONBOARD_HELI_SHOOTING") bClearedAutopilot = FALSE iClearAutopilotTime = GET_GAME_TIMER() + 5000 hotswapStage = MISSION_HOTSWAP_STAGE_SELECT_CHARACTER DISABLE_CELLPHONE(FALSE) hangingHotswapState = HANGING_HOTSWAP_ON_TREVOR ELSE //[MF] Having Trevor start his heli task as soon as the switch cam starts. IF bTrevorCachedTarget VECTOR vChopperPos vChopperPos = GET_ENTITY_COORDS(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) VECTOR vTargetPos vTargetPos = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], <<0,500,0>>) vTargetPos.Z = vChopperPos.z TASK_TREVOR_MISSION(vTargetPos, GET_ENTITY_SPEED(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]), fTrevorDist, -1, FLOOR(vChopperPos.z), 1, TRUE) ENDIF bTrevorCachedTarget = FALSE ENDIF BREAK CASE HANGING_HOTSWAP_FRANKLIN_TO_MICHAEL CASE HANGING_HOTSWAP_TREVOR_TO_MICHAEL //SET_GAMEPLAY_CAM_MAX_MOTION_BLUR_STRENGTH_THIS_UPDATE(0.0) //SET_GAMEPLAY_CAM_RELATIVE_HEADING(45.0) BOOL bSwitchToMichaelComplete bSwitchToMichaelComplete = FALSE IF hangingHotswapState = HANGING_HOTSWAP_FRANKLIN_TO_MICHAEL bSwitchToMichaelComplete = DO_MISSION_HOTSWAP(SELECTOR_PED_MICHAEL, FALSE, TRUE, HOTSWAP_CAM_FRANKLIN_TO_CHOPPER) ELSE IF NOT bSwitchToFirstPerson bSwitchToMichaelComplete = DO_MISSION_HOTSWAP(SELECTOR_PED_MICHAEL, FALSE, TRUE, HOTSWAP_CAM_INSIDE_CHOPPER) ELSE TAKE_CONTROL_OF_PED_FLAGS switchFlags switchFlags = TCF_NONE IF GET_SCRIPT_TASK_STATUS(GET_MICHAEL_PED(), SCRIPT_TASK_DRIVE_BY) <> FINISHED_TASK switchFlags = TCF_CLEAR_TASK_INTERRUPT_CHECKS ENDIF bSwitchToMichaelComplete = DO_MISSION_HOTSWAP(SELECTOR_PED_MICHAEL, FALSE, TRUE, HOTSWAP_CAM_INSIDE_CHOPPER, switchFlags) ENDIF ENDIF IF currentMissionStage = STAGE_CHOPPER_CHASE iBlockMichaelShootTime = GET_GAME_TIMER() + 500 ELSE iBlockMichaelShootTime = GET_GAME_TIMER() + 1000 ENDIF IF NOT IS_PED_INJURED(GET_MICHAEL_PED()) IF currentMissionStage = STAGE_DROPOFF OR NOT bSwitchToFirstPerson SET_PED_RESET_FLAG(GET_MICHAEL_PED(), PRF_BlockWeaponFire, TRUE) ENDIF ENDIF //CLEAR_PED_TASKS(GET_MICHAEL_PED()) IF NOT bTrevorToMichaelHeliSwitch_TrevorTasked IF hangingHotswapState = HANGING_HOTSWAP_TREVOR_TO_MICHAEL VECTOR vChopperPos IF IS_VEHICLE_DRIVEABLE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) vChopperPos = GET_ENTITY_COORDS(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) TASK_TREVOR_MISSION(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], <<0,100,0>>), 40, 10, -1, FLOOR(vChopperPos.z), 10) bTrevorToMichaelHeliSwitch_TrevorTasked = true ENDIF ENDIF ENDIF IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL BOOL bSetForceAim bSetForceAim = FALSE IF DOES_CAM_EXIST(scsSwitch_Heli_TrevorToMichael.ciSpline) OR DOES_CAM_EXIST(scsSwitch_FranklinToHeli_Mike.ciSpline) IF DOES_CAM_EXIST(scsSwitch_Heli_TrevorToMichael.ciSpline) IF GET_CAM_SPLINE_PHASE(scsSwitch_Heli_TrevorToMichael.ciSpline) >= 0.0//0.99 bSetForceAim = TRUE ENDIF ENDIF IF DOES_CAM_EXIST(scsSwitch_FranklinToHeli_Mike.ciSpline) IF GET_CAM_SPLINE_PHASE(scsSwitch_FranklinToHeli_Mike.ciSpline) >= 0.0 bSetForceAim = TRUE ENDIF ENDIF ELSE bSetForceAim = TRUE //[MF] This is needed to always be true or else Michael starts firing randomly ENDIF IF hangingHotswapState = HANGING_HOTSWAP_TREVOR_TO_MICHAEL bSetForceAim = TRUE ENDIF IF bSetForceAim SET_PLAYER_FORCED_AIM(PLAYER_ID(), TRUE) SET_PLAYER_FORCE_SKIP_AIM_INTRO(PLAYER_ID(), TRUE) ELSE SET_PLAYER_FORCED_AIM(PLAYER_ID(), FALSE) ENDIF FLOAT fSetCamHeading FLOAT fSetCamPitch IF IS_VEHICLE_DRIVEABLE(enemyChopperVehicle[iLeadHeli]) // VECTOR vTargetVector FLOAT fTargetHeading FLOAT fTargetPitch // vTargetVector = GET_ENTITY_COORDS(enemyChopperVehicle[iLeadHeli]) - GET_ENTITY_COORDS(PLAYER_PED_ID()) // fTargetHeading = GET_HEADING_FROM_VECTOR_2D(vTargetVector.x, vTargetVector.y) - GET_ENTITY_HEADING(PLAYER_PED_ID()) // IF fTargetHeading > 360.0 // fTargetHeading -= 360.0 // ELIF fTargetHeading < 0.0 // fTargetHeading += 360.0 // ENDIF // IF fTargetHeading > 180 // IF fTargetHeading > 270 // fTargetHeading = 0 // ELSE // fTargetHeading = 180 // ENDIF // ENDIF // #IF IS_DEBUG_BUILD // IF fDEBUG_OverrideMichaelAim > -1.0 // fTargetHeading = fDEBUG_OverrideMichaelAim // ENDIF // #ENDIF //[MF] forcing Michael to always be facing this heading. Otherwise there are some nasty camera issues that can occur if helis are crossing from a valid to an invalid aim point. fTargetHeading = fSwitchToMike_AimingHeading //fTargetPitch = GET_HEADING_FROM_VECTOR_2D(vTargetVector.y, vTargetVector.z) - 90.0 - GET_ENTITY_ROLL(PLAYER_PED_ID()) VECTOR vOffset FLOAT fHorizontalDist FLOAT fVerticalDist vOffset = GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(PLAYER_PED_ID(), GET_ENTITY_COORDS(enemyChopperVehicle[iLeadHeli])) fHorizontalDist = GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), enemyChopperVehicle[iLeadHeli], FALSE) fVerticalDist = vOffset.z fTargetPitch = ATAN(fVerticalDist/fHorizontalDist) //PRINTSTRING("target pitch = ") PRINTFLOAT(fTargetPitch) PRINTNL() fSetCamHeading = fTargetHeading fSetCamPitch = fTargetPitch //[MF] Limiting Michael's pitch as well to resolve camera issues IF fTargetPitch > 7.0 fTargetPitch = 7.0 ELIF fTargetPitch < -7.0 fTargetPitch = -7.0 ENDIF ELSE fSetCamHeading = fSwitchToMike_AimingHeading fSetCamPitch = 0.0 ENDIF //printstring("final pitch = ") printfloat(fSetCamPitch) PRINTNL() IF GET_SCRIPT_TASK_STATUS(PLAYER_PED_ID(), SCRIPT_TASK_DRIVE_BY) <> FINISHED_TASK OR NOT bSwitchToFirstPerson SET_GAMEPLAY_CAM_RELATIVE_HEADING(fSetCamHeading) SET_GAMEPLAY_CAM_RELATIVE_PITCH(fSetCamPitch) ELSE SET_GAMEPLAY_CAM_RELATIVE_HEADING(30) SET_GAMEPLAY_CAM_RELATIVE_PITCH(0) ENDIF ENDIF IF bSwitchToMichaelComplete //SET_SELECTOR_PED_HINT(sSelectorPeds, SELECTOR_PED_FRANKLIN, FALSE) //SET_SELECTOR_PED_HINT(sSelectorPeds, SELECTOR_PED_MICHAEL, FALSE) //SET_SELECTOR_PED_HINT(sSelectorPeds, SELECTOR_PED_TREVOR, FALSE) IF currentMissionStage = STAGE_CHOPPER_CHASE SET_SELECTOR_PED_BLOCKED(sSelectorPeds, SELECTOR_PED_FRANKLIN, FALSE) ENDIF SET_SELECTOR_PED_BLOCKED(sSelectorPeds, SELECTOR_PED_MICHAEL, FALSE) SET_SELECTOR_PED_BLOCKED(sSelectorPeds, SELECTOR_PED_TREVOR, FALSE) IF IS_VEHICLE_DRIVEABLE(enemyChopperVehicle[2]) // selector priority SET_SELECTOR_PED_PRIORITY(sSelectorPeds, SELECTOR_PED_FRANKLIN, SELECTOR_PED_MICHAEL, SELECTOR_PED_TREVOR) else // selector priority SET_SELECTOR_PED_PRIORITY(sSelectorPeds, SELECTOR_PED_MICHAEL, SELECTOR_PED_TREVOR, SELECTOR_PED_FRANKLIN) endif IF IS_VEHICLE_DRIVEABLE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) CLEAR_ENTITY_LAST_DAMAGE_ENTITY(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) ENDIF IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN]) SET_RAGDOLL_BLOCKING_FLAGS(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], RBF_PLAYER_IMPACT) ENDIF //CASCADE_SHADOWS_SET_CASCADE_BOUNDS_SCALE(2.0) //CASCADE_SHADOWS_SET_AIRCRAFT_MODE(TRUE) CASCADE_SHADOWS_SET_CASCADE_BOUNDS_SCALE(CASCADE_SHADOWS_MULTIPLIER_NO_OVERRIDE) CASCADE_SHADOWS_SET_AIRCRAFT_MODE(TRUE) SET_FAR_DRAW_VEHICLES(TRUE) RESET_CHOPPER_PED_DAMAGE_ENTITY() //CLEAR_PED_TASKS(PLAYER_PED_ID()) //SET_PLAYER_FORCE_SKIP_AIM_INTRO(PLAYER_ID(), TRUE) //SET_PLAYER_FORCED_AIM(PLAYER_ID(), TRUE) SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), GET_SNATCH_AND_GRAB_WEAPON_TYPE(SAG_WEAPON_MICHAEL_RIFLE), TRUE) IF GET_AMMO_IN_PED_WEAPON(PLAYER_PED_ID(), GET_SNATCH_AND_GRAB_WEAPON_TYPE(SAG_WEAPON_MICHAEL_RIFLE)) = 0 SET_PED_AMMO(PLAYER_PED_ID(), GET_SNATCH_AND_GRAB_WEAPON_TYPE(SAG_WEAPON_MICHAEL_RIFLE), 1) ENDIF SET_PED_INFINITE_AMMO(PLAYER_PED_ID(), TRUE, GET_SNATCH_AND_GRAB_WEAPON_TYPE(SAG_WEAPON_MICHAEL_RIFLE)) SET_PED_INFINITE_AMMO_CLIP(PLAYER_PED_ID(), TRUE) //SET_PLAYER_FORCED_AIM(PLAYER_ID(), TRUE) //PRINTSTRING("setting rifle as current from CHOPPER CHASE SWITCH!") PRINTNL() SET_MOTIONBLUR_MAX_VEL_SCALER(g_fSavedMaxMotionBlur) SET_TIME_SCALE(1.0) hotswapStage = MISSION_HOTSWAP_STAGE_SELECT_CHARACTER //SCRIPT_OVERRIDES_WIND_TYPES(true,"WEATHER_TYPES_MAGDEMO_FIB2_ONBOARD_HELI_SHOOTING","WEATHER_TYPES_MAGDEMO_FIB2_ONBOARD_HELI_SHOOTING") // DISABLE_CELLPHONE(TRUE) hangingHotswapState = HANGING_HOTSWAP_ON_MICHAEL bTrevorToMichaelHeliSwitch_TrevorTasked = FALSE ELSE IF NOT bDoneReattach IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL IF NOT bKnockedOff //ATTACH_MICHAEL_TO_ROPE() bDoneReattach = TRUE ENDIF ENDIF ENDIF ENDIF BREAK CASE HANGING_HOTSWAP_MICHAEL_TO_FRANKLIN CASE HANGING_HOTSWAP_TREVOR_TO_FRANKLIN BOOL bSwitchToFranklinComplete bSwitchToFranklinComplete = FALSE bSwitchToFranklinComplete = DO_MISSION_HOTSWAP(SELECTOR_PED_FRANKLIN, FALSE, TRUE, HOTSWAP_CAM_CHOPPER_TO_FRANKLIN, TCF_CLEAR_TASK_INTERRUPT_CHECKS) IF bSwitchToFranklinComplete // clear michael driveby IF currentMissionStage >= STAGE_CHOPPER_CHASE IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL]) TASK_PAUSE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], 100) ENDIF ENDIF //SET_REMOTE_SNIPER_ACTIVE(remoteSniperData, TRUE) // UPDATE_REMOTE_SNIPER(remoteSniperData) //SET_SELECTOR_PED_HINT(sSelectorPeds, SELECTOR_PED_MICHAEL, FALSE) //SET_SELECTOR_PED_HINT(sSelectorPeds, SELECTOR_PED_FRANKLIN, FALSE) //SET_SELECTOR_PED_HINT(sSelectorPeds, SELECTOR_PED_TREVOR, FALSE) IF currentMissionStage = STAGE_CHOPPER_CHASE SET_SELECTOR_PED_BLOCKED(sSelectorPeds, SELECTOR_PED_FRANKLIN, FALSE) ENDIF SET_SELECTOR_PED_BLOCKED(sSelectorPeds, SELECTOR_PED_MICHAEL, FALSE) SET_SELECTOR_PED_BLOCKED(sSelectorPeds, SELECTOR_PED_TREVOR, FALSE) IF IS_VEHICLE_DRIVEABLE(enemyChopperVehicle[2]) IF bChangedPriorityFromSniperToTrevor SET_SELECTOR_PED_PRIORITY(sSelectorPeds, SELECTOR_PED_FRANKLIN, SELECTOR_PED_TREVOR, SELECTOR_PED_MICHAEL) ELSE // selector priority SET_SELECTOR_PED_PRIORITY(sSelectorPeds, SELECTOR_PED_FRANKLIN, SELECTOR_PED_MICHAEL, SELECTOR_PED_TREVOR) ENDIF ELSE IF bChangedPriorityFromSniperToTrevor SET_SELECTOR_PED_PRIORITY(sSelectorPeds, SELECTOR_PED_TREVOR, SELECTOR_PED_MICHAEL, SELECTOR_PED_FRANKLIN) ELSE // selector priority SET_SELECTOR_PED_PRIORITY(sSelectorPeds, SELECTOR_PED_MICHAEL, SELECTOR_PED_TREVOR, SELECTOR_PED_FRANKLIN) ENDIF ENDIF //IF NOT IS_PED_INJURED(PLAYER_PED_ID()) // SET_ENTITY_COORDS(PLAYER_PED_ID(), GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_BEHIND_SNIPER)) // FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), TRUE) //ENDIF IF NOT IS_PED_INJURED(prisonerPed) SET_ENTITY_PROOFS(prisonerPed, FALSE, FALSE, FALSE, FALSE, FALSE) ENDIF SET_FAR_DRAW_VEHICLES(FALSE) CASCADE_SHADOWS_SET_AIRCRAFT_MODE(FALSE) CASCADE_SHADOWS_SET_CASCADE_BOUNDS_SCALE(CASCADE_SHADOWS_MULTIPLIER_EXTERIOR_OVERRIDE) RESET_CHOPPER_PED_DAMAGE_ENTITY() CLEAR_ENTITY_LAST_DAMAGE_ENTITY(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) SET_MOTIONBLUR_MAX_VEL_SCALER(g_fSavedMaxMotionBlur) //CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID()) CLEAR_RAGDOLL_BLOCKING_FLAGS(PLAYER_PED_ID(), RBF_PLAYER_IMPACT) SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(PLAYER_PED_ID(), FALSE) FREEZE_FRANKLIN_AT_SNIPER(FALSE) SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), GET_SNATCH_AND_GRAB_WEAPON_TYPE(SAG_WEAPON_SNIPER_RIFLE), TRUE) //SET_PLAYER_FORCED_AIM(PLAYER_ID(), TRUE) PRINTSTRING("setting rifle as current from CHOPPER CHASE SWITCH!") PRINTNL() //SCRIPT_OVERRIDES_WIND_TYPES(true,"WEATHER_TYPES_MAGDEMO_FIB2_FRANKLIN","WEATHER_TYPES_MAGDEMO_FIB2_FRANKLIN") michaelTargetVehicle = NULL iRecheckMichaelShootTime = 0 michaelTargetPed = NULL bTrevorToFranklin_TrevorTasked = FALSE hotswapStage = MISSION_HOTSWAP_STAGE_SELECT_CHARACTER hangingHotswapState = HANGING_HOTSWAP_ON_FRANKLIN ELSE IF NOT bTrevorToFranklin_TrevorTasked IF eCurrentBranchedSwitchState = BRANCHED_SWITCH_TREVOR_TO_FRANKLIN_ACTIVE VECTOR vChopperPos vChopperPos = GET_ENTITY_COORDS(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) VECTOR vTargetPos vTargetPos = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], <<0,500,0>>) vTargetPos.Z = (vTargetPos.Z * 0.5)//[MF] Smoothing the heli movement a bit CLEAR_PED_TASKS(GET_TREVOR_PED()) fTrevorDist = 1000 TASK_TREVOR_MISSION(vTargetPos, GET_ENTITY_SPEED(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]), fTrevorDist, -1, FLOOR(vChopperPos.z), 1, TRUE) bTrevorToFranklin_TrevorTasked = TRUE ENDIF ENDIF IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_FRANKLIN PRINTLN("TEST current ped is FRANKLIN enum current ped is FRANKLIN enum current ped is FRANKLIN enum current ped is FRANKLIN enum current ped is FRANKLIN enum current ped is FRANKLIN enum current ped is FRANKLIN") SET_PLAYER_FORCE_SKIP_AIM_INTRO(PLAYER_ID(),TRUE) DISPLAY_SNIPER_SCOPE_THIS_FRAME() VECTOR vTargetVector FLOAT fTargetHeading IF IS_VEHICLE_DRIVEABLE(enemyChopperVehicle[2]) vTargetVector = GET_ENTITY_COORDS(enemyChopperVehicle[2]) - GET_ENTITY_COORDS(PLAYER_PED_ID()) fTargetHeading = GET_HEADING_FROM_VECTOR_2D(vTargetVector.x, vTargetVector.y) - GET_ENTITY_HEADING(PLAYER_PED_ID()) ELSE fTargetHeading = 0.0 ENDIF SET_GAMEPLAY_CAM_RELATIVE_HEADING(fTargetHeading) SET_GAMEPLAY_CAM_RELATIVE_PITCH(5.0) ENDIF ENDIF BREAK ENDSWITCH // fail for trevor bailing out /* PED_INDEX trevorPed = GET_TREVOR_PED() IF NOT IS_PED_INJURED(trevorPed) AND IS_VEHICLE_DRIVEABLE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) IF NOT IS_PED_IN_VEHICLE(trevorPed, snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) IF trevorPed = PLAYER_PED_ID() MISSION_FAILED(FAIL_ABANDONED_CHOPPER) ELSE MISSION_FAILED(FAIL_TREVOR_ABANDONED_CHOPPER) ENDIF ENDIF ENDIF */ IF GET_GAME_TIMER() <= iSuppressHUDTime HIDE_SELECTOR_THIS_FRAME() DISPLAY_RADAR(FALSE) bTurnedOffRadarForSuppressHud = TRUE ELSE IF bTurnedOffRadarForSuppressHud DISPLAY_RADAR(TRUE) bTurnedOffRadarForSuppressHud = FALSE ENDIF ENDIF // fail for knockoff #IF IS_DEBUG_BUILD IF NOT bDebugDontFailOnKnockoff #ENDIF IF NOT bAlternateChopper AND NOT bShortRope //HANDLE_KNOCKOFF_ON_COLLISION() ENDIF #IF IS_DEBUG_BUILD ENDIF #ENDIF ENDPROC // on rails section hanging under heli PROC DO_STAGE_CHOPPER_CHASE() DO_CHOPPER_ESCAPE_COMMON_FUNCTIONS() //PRINTNL() PRINTINT(ENUM_TO_INT(GET_CAM_VIEW_MODE_FOR_CONTEXT(CAM_VIEW_MODE_CONTEXT_IN_VEHICLE))) PRINTNL() IF hangingHotswapState = HANGING_HOTSWAP_ON_TREVOR HANDLE_GET_TO_LOCATION(TRUE, FALSE, FALSE, FALSE) ELSE IF DOES_BLIP_EXIST(vehicleBlip) REMOVE_BLIP(vehicleBlip) ENDIF ENDIF IF NOT bFadedIn IF GET_GAME_TIMER() >= iStartMissionStageTime + 100 IF IS_SCREEN_FADED_OUT() DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME) ENDIF bFadedIn = TRUE ENDIF ENDIF IF NOT bUnproofedChoppers IF GET_GAME_TIMER() >= iStartMissionStageTime + 6000 INT i REPEAT COUNT_OF(enemyChopperVehicle) i IF IS_VEHICLE_DRIVEABLE(enemyChopperVehicle[i]) SET_ENTITY_PROOFS(enemyChopperVehicle[i], FALSE, FALSE, FALSE, FALSE, FALSE) SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(enemyChopperVehicle[i], FALSE) ENDIF ENDREPEAT PRINTSTRING("unproof") printnl() bUnproofedChoppers = TRUE ENDIF ENDIF // handle friendly blips SWITCH GET_CURRENT_PLAYER_PED_ENUM() CASE CHAR_FRANKLIN IF DOES_BLIP_EXIST(franklinSniperBlip) REMOVE_BLIP(franklinSniperBlip) ENDIF IF IS_VEHICLE_DRIVEABLE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) IF NOT DOES_BLIP_EXIST(playerChopperBlip) playerChopperBlip = CREATE_MISSION_BLIP_FOR_VEHICLE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], FALSE) ENDIF ELSE IF DOES_BLIP_EXIST(playerChopperBlip) REMOVE_BLIP(playerChopperBlip) ENDIF ENDIF BREAK CASE CHAR_MICHAEL CASE CHAR_TREVOR IF DOES_BLIP_EXIST(playerChopperBlip) REMOVE_BLIP(playerChopperBlip) ENDIF IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN]) IF NOT DOES_BLIP_EXIST(franklinSniperBlip) IF IS_VEHICLE_DRIVEABLE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) franklinSniperBlip = CREATE_MISSION_BLIP_FOR_PED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], FALSE) ENDIF ENDIF ENDIF ELSE IF DOES_BLIP_EXIST(franklinSniperBlip) REMOVE_BLIP(franklinSniperBlip) ENDIF ENDIF BREAK ENDSWITCH IF NOT bShownSlowmoHelp IF hangingHotswapState = HANGING_HOTSWAP_ON_MICHAEL IF NOT bFilledMichaelMeter SPECIAL_ABILITY_CHARGE_NORMALIZED(PLAYER_ID(), 0.5, TRUE) bFilledMichaelMeter = TRUE ENDIF IF NOT IS_SPECIAL_ABILITY_ACTIVE(PLAYER_ID()) IF iSlowmoHelpTime < 0 iSlowmoHelpTime = GET_GAME_TIMER() ELSE IF GET_GAME_TIMER() >= iSlowmoHelpTime + 3000 IF IS_USING_KEYBOARD_AND_MOUSE(PLAYER_CONTROL) bShownSlowmoHelp = DO_MISSION_HELP_TEXT("SG_SLOHLP_KM") ELSE bShownSlowmoHelp = DO_MISSION_HELP_TEXT("SG_SLOHLP") ENDIF ENDIF ENDIF ELSE bShownSlowmoHelp = TRUE ENDIF ELSE iSlowmoHelpTime = -1 ENDIF ELSE IF hangingHotswapState <> HANGING_HOTSWAP_ON_MICHAEL OR IS_SPECIAL_ABILITY_ACTIVE(PLAYER_ID()) IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("SG_SLOHLP") CLEAR_HELP() ENDIF ENDIF ENDIF BOOL bFranklinInDanger = FALSE BOOL bMichaelTrevorInDanger = FALSE IF hangingHotswapState <> HANGING_HOTSWAP_ON_FRANKLIN AND hangingHotswapState <> HANGING_HOTSWAP_MICHAEL_TO_FRANKLIN AND hangingHotswapState <> HANGING_HOTSWAP_TREVOR_TO_FRANKLIN IF hangingHotswapState = HANGING_HOTSWAP_ON_TREVOR OR hangingHotswapState = HANGING_HOTSWAP_ON_MICHAEL IF DOES_BLIP_EXIST(enemyChopperBlip[2]) IF bDonePanicSpeech bFranklinInDanger = TRUE BOOL bApplyDeath = FALSE IF GET_GAME_TIMER() >= iFranklinDeathTime + 10000 bApplyDeath = TRUE ELSE IF GET_GAME_TIMER() >= iFranklinDeathTime IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN]) IF IS_EXPLOSION_IN_AREA(EXP_TAG_DONTCARE, GET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN]) - <<8,8,8>>, GET_ENTITY_COORDS(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN]) + <<8,8,8>>) bApplyDeath = TRUE ENDIF ENDIF ENDIF ENDIF #IF IS_DEBUG_BUILD IF NOT bSwitchCamDebugScenarioEnabled #ENDIF IF bApplyDeath IF NOT IS_PED_INJURED(GET_FRANKLIN_PED()) APPLY_DAMAGE_TO_PED(GET_FRANKLIN_PED(), 1000, TRUE) ENDIF //MISSION_FAILED(FAIL_FRANKLIN_DEAD) ENDIF #IF IS_DEBUG_BUILD ENDIF #ENDIF ENDIF ENDIF ENDIF ELSE /* IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("SG_TROHLP") OR IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("SG_TROHLP3") IF GET_GAME_TIMER() >= iClearHelpTime + 1000 CLEAR_HELP(FALSE) iClearHelpTime = GET_GAME_TIMER() ENDIF ENDIF */ IF (NOT DOES_BLIP_EXIST(enemyChopperBlip[2]) AND bDoneTrevorEncourageSpeech) OR bDoneWeHitSpeech bMichaelTrevorInDanger = TRUE ENDIF IF GET_GAME_TIMER() >= iFranklinPanicTime iFranklinPanicTime = GET_GAME_TIMER() + 5000 ENDIF IF bDonePanicSpeech IF GET_GAME_TIMER() >= iFranklinDeathTime iFranklinDeathTime = GET_GAME_TIMER() + 6000 ENDIF ENDIF ENDIF IF bFranklinInDanger SET_SELECTOR_PED_DAMAGED(sSelectorPeds, SELECTOR_PED_FRANKLIN, TRUE) IF NOT bDoneTroubleFlashHelp bDoneTroubleFlashHelp = DO_MISSION_HELP_TEXT("SG_TROHLP2", FALSE, 12500) ENDIF ELSE SET_SELECTOR_PED_DAMAGED(sSelectorPeds, SELECTOR_PED_FRANKLIN, FALSE) ENDIF IF bMichaelTrevorInDanger SET_SELECTOR_PED_DAMAGED(sSelectorPeds, SELECTOR_PED_TREVOR, TRUE) SET_SELECTOR_PED_DAMAGED(sSelectorPeds, SELECTOR_PED_MICHAEL, TRUE) IF NOT bDoneTroubleFlashHelp bDoneTroubleFlashHelp = DO_MISSION_HELP_TEXT("SG_TROHLP2", FALSE, 12500) ENDIF //printstring("setting damage") printnl() ELSE SET_SELECTOR_PED_DAMAGED(sSelectorPeds, SELECTOR_PED_MICHAEL, FALSE) SET_SELECTOR_PED_DAMAGED(sSelectorPeds, SELECTOR_PED_TREVOR, FALSE) ENDIF IF NOT bMichaelTrevorInDanger AND NOT bFranklinInDanger IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("SG_TROHLP2") IF GET_GAME_TIMER() >= iClearHelpTime + 1000 CLEAR_HELP(FALSE) iClearHelpTime = GET_GAME_TIMER() ENDIF ENDIF ENDIF // destroy the chopper #IF IS_DEBUG_BUILD IF NOT bSwitchCamDebugScenarioEnabled #ENDIF IF hangingHotswapState = HANGING_HOTSWAP_ON_TREVOR OR hangingHotswapState = HANGING_HOTSWAP_ON_MICHAEL OR hangingHotswapState = HANGING_HOTSWAP_ON_FRANKLIN IF DOES_BLIP_EXIST(enemyChopperBlip[0]) OR DOES_BLIP_EXIST(enemyChopperBlip[1]) OR DOES_BLIP_EXIST(enemyChopperBlip[3]) IF bDoneWeHitSpeech VECTOR vPosForExplosion = GET_ENTITY_COORDS(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) IF (IS_EXPLOSION_IN_AREA(EXP_TAG_DONTCARE, vPosForExplosion - <<6,6,6>>, vPosForExplosion + <<6,6,6>>) AND bRocketsAccurate) OR (bDoneWeHitSpeech AND GET_GAME_TIMER() >= iTrevorSayWeHitTime + 23000) IF NOT IS_PED_INJURED(GET_MICHAEL_PED()) IF IS_PED_IN_VEHICLE(GET_MICHAEL_PED(), snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) APPLY_DAMAGE_TO_PED(GET_MICHAEL_PED(), 1000, TRUE) ENDIF ENDIF IF NOT IS_PED_INJURED(GET_TREVOR_PED()) IF IS_PED_IN_VEHICLE(GET_TREVOR_PED(), snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) APPLY_DAMAGE_TO_PED(GET_TREVOR_PED(), 1000, TRUE) ENDIF ENDIF IF IS_VEHICLE_DRIVEABLE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) EXPLODE_VEHICLE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) ENDIF ENDIF ENDIF ENDIF ENDIF #IF IS_DEBUG_BUILD ENDIF #ENDIF IF hangingHotswapState = HANGING_HOTSWAP_ON_TREVOR IF IS_SELECTOR_ONSCREEN() AND GET_CAM_VIEW_MODE_FOR_CONTEXT(CAM_VIEW_MODE_CONTEXT_IN_HELI) <> CAM_VIEW_MODE_FIRST_PERSON IF NOT IS_GAMEPLAY_HINT_ACTIVE() SET_GAMEPLAY_VEHICLE_HINT(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], vHangOnTrevor_HintCamLookAtLoc, TRUE, iCHASE_HINT_INFINITE_DWELL_TIME, 600, 600) SET_GAMEPLAY_HINT_FOLLOW_DISTANCE_SCALAR(fHangOnTrevor_HintCamFollowDist) SET_GAMEPLAY_HINT_FOV(GET_GAMEPLAY_CAM_FOV()) ENDIF ELSE IF IS_GAMEPLAY_HINT_ACTIVE() STOP_GAMEPLAY_HINT(FALSE) ENDIF ENDIF ENDIF // remove michael pistol IF NOT IS_PED_INJURED(GET_MICHAEL_PED()) WEAPON_TYPE weapon GET_CURRENT_PED_WEAPON(GET_MICHAEL_PED(), weapon) IF weapon <> GET_SNATCH_AND_GRAB_WEAPON_TYPE(SAG_WEAPON_MICHAEL_RIFLE) SET_CURRENT_PED_WEAPON(GET_MICHAEL_PED(), GET_SNATCH_AND_GRAB_WEAPON_TYPE(SAG_WEAPON_MICHAEL_RIFLE), TRUE) IF GET_AMMO_IN_PED_WEAPON(GET_MICHAEL_PED(), GET_SNATCH_AND_GRAB_WEAPON_TYPE(SAG_WEAPON_MICHAEL_RIFLE)) = 0 SET_PED_AMMO(GET_MICHAEL_PED(), GET_SNATCH_AND_GRAB_WEAPON_TYPE(SAG_WEAPON_MICHAEL_RIFLE), 1) ENDIF SET_PED_INFINITE_AMMO(GET_MICHAEL_PED(), TRUE, GET_SNATCH_AND_GRAB_WEAPON_TYPE(SAG_WEAPON_MICHAEL_RIFLE)) SET_PED_INFINITE_AMMO_CLIP(GET_MICHAEL_PED(), TRUE) ENDIF ENDIF // music for michael in chopper IF NOT bDoneMichaelFightsChoppersCue IF hangingHotswapState = HANGING_HOTSWAP_ON_MICHAEL bDoneMichaelFightsChoppersCue = TRIGGER_MISSION_MUSIC_EVENT("FIB2_MICHAEL_FIGHTS_CHOPPERS") ENDIF ENDIF // god text and speech stuff IF NOT bShownGodText OR NOT bDoneFranklinReactToChopperSpeech IF bDoneFranklinReactToChopperSpeech OR NOT IS_SUBTITLE_PREFERENCE_SWITCHED_ON() IF DO_MISSION_GOD_TEXT("SG_DCHOP") bShownGodText = TRUE iSwitchToMichaelPromptTime = GET_GAME_TIMER() + 24000 ENDIF ENDIF // react to chopper attacking speech IF NOT bDoneChopperAttackFranklinSpeech bDoneChopperAttackFranklinSpeech = DO_MISSION_SPEECH("FBI2_RADIO") ELSE // react to chopper speech IF NOT bDoneFranklinReactToChopperSpeech bDoneFranklinReactToChopperSpeech = DO_MISSION_SPEECH("FBI2_FREACT") ENDIF ENDIF ELSE // HANDLE THE SPEECH enumCharacterList currentChar = GET_CURRENT_PLAYER_PED_ENUM() // speech pertaining to franklin's chopper IF DOES_BLIP_EXIST(enemyChopperBlip[2]) // panic speech IF hangingHotswapState <> HANGING_HOTSWAP_ON_FRANKLIN AND hangingHotswapState <> HANGING_HOTSWAP_MICHAEL_TO_FRANKLIN AND hangingHotswapState <> HANGING_HOTSWAP_TREVOR_TO_FRANKLIN IF NOT bDonePanicSpeech IF GET_GAME_TIMER() >= iFranklinPanicTime IF DO_MISSION_SPEECH("FBI2_URGHELP") //iDidPanicSpeechTime = GET_GAME_TIMER() iFranklinDeathTime = GET_GAME_TIMER() + 15000 bDonePanicSpeech = TRUE ENDIF ENDIF ELSE IF NOT bDoneRealPanicSpeech IF GET_GAME_TIMER() >= iFranklinDeathTime - 5000 bDoneRealPanicSpeech = DO_MISSION_SPEECH("FBI2_WTF") ENDIF ENDIF ENDIF ENDIF ELSE // franklin congratulation speech IF NOT bDoneDestroyedChopperSpeech[2] bDoneDestroyedChopperSpeech[2] = DO_MISSION_SPEECH("FBI2_FSHOOT") ELSE IF NOT bDoneFranklinSayChopperDownSpeech bDoneFranklinSayChopperDownSpeech = DO_MISSION_SPEECH("FBI2_FTELL") ELSE IF NOT bDoneTrevorCongratulateFranklinSpeech bDoneTrevorCongratulateFranklinSpeech = DO_MISSION_SPEECH("FBI2_FGET") ENDIF ENDIF ENDIF bDoneChopperAttackFranklinSpeech = TRUE ENDIF // speech about almost hit IF NOT bDoneWeHitSpeech IF GET_GAME_TIMER() >= iTrevorSayWeHitTime IF DOES_BLIP_EXIST(enemyChopperBlip[0]) OR DOES_BLIP_EXIST(enemyChopperBlip[1]) OR DOES_BLIP_EXIST(enemyChopperBlip[3]) IF hangingHotswapState = HANGING_HOTSWAP_ON_FRANKLIN OR hangingHotswapState = HANGING_HOTSWAP_ON_MICHAEL OR hangingHotswapState = HANGING_HOTSWAP_ON_TREVOR IF DO_MISSION_SPEECH("FBI2_WEHIT") bDoneWeHitSpeech = TRUE iTrevorSayWeHitTime = GET_GAME_TIMER() ENDIF ENDIF ELSE bDoneWeHitSpeech = TRUE ENDIF ENDIF ELSE IF NOT bRocketsAccurate IF GET_GAME_TIMER() >= iTrevorSayWeHitTime + 15000 bRocketsAccurate = TRUE ENDIF ENDIF ENDIF IF NOT bDoneTrevorEncourageSpeech IF iAllowGoHomeTime < 0 AND NOT bFranklinInDanger IF GET_GAME_TIMER() >= iSwitchToMichaelPromptTime AND NOT DOES_BLIP_EXIST(enemyChopperBlip[2]) //OR currentChar = CHAR_MICHAEL //OR currentChar = CHAR_TREVOR bDoneTrevorEncourageSpeech = DO_MISSION_SPEECH("FBI2_TAKE1") ENDIF ENDIF ENDIF // character specific stuff IF iAllowGoHomeTime < 0 AND NOT bFranklinInDanger IF currentChar = CHAR_MICHAEL OR currentChar = CHAR_TREVOR INT iMChopper FOR iMChopper = 0 TO 1 IF NOT bDoneDestroyedChopperSpeech[iMChopper] IF NOT DOES_BLIP_EXIST(enemyChopperBlip[iMChopper]) IF currentChar = CHAR_MICHAEL SWITCH GET_RANDOM_INT_IN_RANGE(0,2) CASE 0 bDoneDestroyedChopperSpeech[iMChopper] = DO_MISSION_SPEECH("FBI2_DOWN") BREAK CASE 1 bDoneDestroyedChopperSpeech[iMChopper] = DO_MISSION_SPEECH("FBI2_SPIN") BREAK ENDSWITCH ELSE bDoneDestroyedChopperSpeech[iMChopper] = DO_MISSION_SPEECH("FBI2_DOWN1") ENDIF ENDIF ENDIF ENDFOR // michael and trevor randomness IF GET_GAME_TIMER() >= iNextMrKSpeechTime IF iMrKSpeechStage < 5 STRING sMrKSpeech sMrKSpeech=sMrKSpeech SWITCH iMrKSpeechStage CASE 0 sMrKSpeech = "FBI2_HANG1" BREAK CASE 1 sMrKSpeech = "FBI2_HANG2" BREAK CASE 2 sMrKSpeech = "FBI2_HANG3" BREAK CASE 3 sMrKSpeech = "FBI2_HANG4" BREAK CASE 4 sMrKSpeech = "FBI2_HANG5" BREAK ENDSWITCH //iNextMrKSpeechTime = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(10000, 12000) IF DO_MISSION_SPEECH(sMrKSpeech) iNextMrKSpeechTime = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(14000, 18000) iMrKSpeechStage++ ENDIF ENDIF ELSE IF DOES_BLIP_EXIST(enemyChopperBlip[0]) AND DOES_BLIP_EXIST(enemyChopperBlip[1]) AND DOES_BLIP_EXIST(enemyChopperBlip[3]) IF GET_RANDOM_INT_IN_RANGE(0,2) = 0 DO_RANDOM_SPEECH("FBI2_TAKE3") ELSE IF NOT IS_PED_INJURED(GET_MICHAEL_PED()) IF IS_PED_SHOOTING(GET_MICHAEL_PED()) DO_RANDOM_SPEECH("FBI2_SHOTC") ELSE DO_RANDOM_SPEECH("FBI2_CHASE") ENDIF ENDIF ENDIF ELSE IF NOT bDoneLastOneSpeech IF bCreatedExtraHeli IF (DOES_BLIP_EXIST(enemyChopperBlip[0]) AND NOT DOES_BLIP_EXIST(enemyChopperBlip[1]) AND NOT DOES_BLIP_EXIST(enemyChopperBlip[3])) OR (DOES_BLIP_EXIST(enemyChopperBlip[1]) AND NOT DOES_BLIP_EXIST(enemyChopperBlip[0]) AND NOT DOES_BLIP_EXIST(enemyChopperBlip[3])) OR (DOES_BLIP_EXIST(enemyChopperBlip[3]) AND NOT DOES_BLIP_EXIST(enemyChopperBlip[0]) AND NOT DOES_BLIP_EXIST(enemyChopperBlip[1])) bDoneLastOneSpeech = DO_MISSION_SPEECH("FBI2_TAKEOUT") ENDIF ENDIF ELSE IF GET_RANDOM_INT_IN_RANGE(0,2) = 0 DO_RANDOM_SPEECH("FBI2_TAKE3") ELSE IF NOT IS_PED_INJURED(GET_MICHAEL_PED()) IF IS_PED_SHOOTING(GET_MICHAEL_PED()) DO_RANDOM_SPEECH("FBI2_SHOTC") ELSE DO_RANDOM_SPEECH("FBI2_CHASE") ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF ELSE // franklin IF DOES_BLIP_EXIST(enemyChopperBlip[2]) IF NOT bDoneRocketReactionSpeech IF GET_GAME_TIMER() >= iLastEnemyRocketsTime + 3000 IF DO_MISSION_SPEECH("FBI2_ROCKETS") bDoneRocketReactionSpeech = TRUE iTrevorRemindFranklinTime = GET_GAME_TIMER() + 23000 iNextFranklinRocketReactionTime = GET_GAME_TIMER() + 8000 ENDIF ENDIF ELSE IF GET_GAME_TIMER() >= iNextFranklinRocketReactionTime IF GET_GAME_TIMER() <= iLastEnemyRocketsTime + 3500 AND GET_GAME_TIMER() >= iLastEnemyRocketsTime + 1000 IF DO_MISSION_SPEECH("FBI2_FIRED") iNextFranklinRocketReactionTime = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(13000, 16000) ENDIF ENDIF ELSE IF NOT bDoneTrevorRemindFranklinSpeech IF bDoneRocketReactionSpeech IF GET_GAME_TIMER() >= iTrevorRemindFranklinTime bDoneTrevorRemindFranklinSpeech = DO_MISSION_SPEECH("FBI2_2RADIO") ENDIF ENDIF ENDIF IF GET_RANDOM_INT_IN_RANGE(0,2) = 0 DO_RANDOM_SPEECH("FBI2_FSHOT") ELSE IF NOT IS_PED_INJURED(enemyChopperPed[0]) DO_RANDOM_SPEECH("FBI2_ATTACK") ENDIF ENDIF ENDIF ENDIF ENDIF // friendly fire IF IS_VEHICLE_DRIVEABLE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) IF NOT bCuedFriendlyFireSpeech IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], PLAYER_PED_ID()) IF GET_GAME_TIMER() >= iNextFriendlyFireSpeechTime iCueFriendlyFireSpeechTime = GET_GAME_TIMER() bCuedFriendlyFireSpeech = TRUE ENDIF ENDIF ELSE IF DO_MISSION_SPEECH("FBI2_FRFIRE") CLEAR_ENTITY_LAST_DAMAGE_ENTITY(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) bCuedFriendlyFireSpeech = FALSE iNextFriendlyFireSpeechTime = GET_GAME_TIMER() + 18000 ELSE IF GET_GAME_TIMER() >= iCueFriendlyFireSpeechTime + 3000 CLEAR_ENTITY_LAST_DAMAGE_ENTITY(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) bCuedFriendlyFireSpeech = FALSE ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF IF NOT bDoneChopperLandSpeech IF NOT IS_PED_INJURED(enemyChopperPed[0]) //OR DOES_BLIP_EXIST(enemyChopperBlip[1]) //OR DOES_BLIP_EXIST(enemyChopperBlip[2]) bDoneChopperLandSpeech = DO_MISSION_SPEECH("FBI2_WARN1") ENDIF ENDIF ENDIF // franklin gameplay PED_INDEX franklinPed = GET_FRANKLIN_PED() IF NOT IS_PED_INJURED(franklinPed) IF hangingHotswapState = HANGING_HOTSWAP_ON_FRANKLIN SET_ENTITY_PROOFS(franklinPed, FALSE, FALSE, FALSE, FALSE, FALSE) SET_ENTITY_CAN_BE_DAMAGED_BY_RELATIONSHIP_GROUP(franklinPed, TRUE, agencyRelGroup) //SET_ENTITY_HEALTH(franklinPed, 200) //IF GET_GAME_TIMER() >= iNextFranklinDamageCheckTime //BOOL bWasDamaged = FALSE //IF NOT IS_PED_INJURED(enemyChopperPed[7]) // IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(franklinPed, enemyChopperPed[7]) // APPLY_DAMAGE_TO_ENTITY(franklinPed, 10, TRUE) //bWasDamaged = TRUE // ENDIF //ENDIF //IF NOT IS_PED_INJURED(enemyChopperPed[8]) // IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(franklinPed, enemyChopperPed[8]) // APPLY_DAMAGE_TO_ENTITY(franklinPed, 10, TRUE) //bWasDamaged = TRUE // ENDIF //ENDIF IF IS_EXPLOSION_IN_AREA(EXP_TAG_DONTCARE, GET_ENTITY_COORDS(franklinPed) - <<6,6,6>>, GET_ENTITY_COORDS(franklinPed) + <<6,6,6>>) IF DOES_BLIP_EXIST(enemyChopperBlip[2]) IF GET_GAME_TIMER() >= iNextFranklinDamageCheckTime APPLY_DAMAGE_TO_PED(franklinPed, 40, TRUE) PRINTSTRING("damaged franklin") printnl() iNextFranklinDamageCheckTime = GET_GAME_TIMER() + 1000 ENDIF //bWasDamaged = TRUE ENDIF ENDIF //IF bWasDamaged //iFranklinDamageCount++ //printstring("increment damage count = ") printint(iFranklinDamageCount) printnl() //ENDIF CLEAR_ENTITY_LAST_DAMAGE_ENTITY(franklinPed) //ENDIF ELSE //iFranklinDamageCount = 0 SET_ENTITY_PROOFS(franklinPed, FALSE, TRUE, FALSE, FALSE, FALSE) SET_ENTITY_CAN_BE_DAMAGED_BY_RELATIONSHIP_GROUP(franklinPed, FALSE, agencyRelGroup) ENDIF ENDIF // get playback time IF IS_VEHICLE_DRIVEABLE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) fPlaybackTime = GET_TIME_POSITION_IN_RECORDING(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) ENDIF ENDIF IF NOT bDoneGetOutSpeech IF GET_GAME_TIMER() >= iStartMissionStageTime + 100 //IF DO_MISSION_SPEECH("FBI2_NOWGO", FALSE, 1) bDoneGetOutSpeech = TRUE //SET_SELECTOR_PED_HINT(sSelectorPeds, SELECTOR_PED_FRANKLIN, FALSE) //SET_SELECTOR_PED_HINT(sSelectorPeds, SELECTOR_PED_MICHAEL, FALSE) //SET_SELECTOR_PED_HINT(sSelectorPeds, SELECTOR_PED_TREVOR, FALSE) SET_SELECTOR_PED_BLOCKED(sSelectorPeds, SELECTOR_PED_FRANKLIN, FALSE) SET_SELECTOR_PED_BLOCKED(sSelectorPeds, SELECTOR_PED_MICHAEL, FALSE) SET_SELECTOR_PED_BLOCKED(sSelectorPeds, SELECTOR_PED_TREVOR, FALSE) //ENDIF ENDIF ENDIF INT i REPEAT NUMBER_ENEMY_CHOPPERS i IF IS_VEHICLE_DRIVEABLE(enemyChopperVehicle[i]) INT iFireHealth SWITCH i CASE 0 CASE 1 CASE 3 iFireHealth = 750//910//750 BREAK CASE 2 iFireHealth = 600//880//600 BREAK ENDSWITCH IF GET_ENTITY_HEALTH(enemyChopperVehicle[i]) < iFireHealth IF i <> 2 OR NOT IS_PED_INJURED(GET_PED_IN_VEHICLE_SEAT(enemyChopperVehicle[i])) SET_VEHICLE_ENGINE_HEALTH(enemyChopperVehicle[i], -150) SET_VEHICLE_PETROL_TANK_HEALTH(enemyChopperVehicle[i], -150) ENDIF IF NOT IS_PED_INJURED(GET_PED_IN_VEHICLE_SEAT(enemyChopperVehicle[i])) APPLY_DAMAGE_TO_PED(GET_PED_IN_VEHICLE_SEAT(enemyChopperVehicle[i]), 1000, TRUE) ENDIF ENDIF ENDIF ENDREPEAT // window smash IF bSkippedGlassSmash HANDLE_WINDOW_SMASH(TRUE, TRUE) ENDIF IF NOT bDoneMakeMichaelMoreLethal IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL]) SET_PED_ACCURACY(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], 0) // 5 ENDIF IF GET_GAME_TIMER() >= iStartMissionStageTime + 28000 // REPEAT 3 i // IF NOT IS_PED_INJURED(enemyChopperPed[i]) // CLEAR_ENTITY_LAST_DAMAGE_ENTITY(enemyChopperPed[i]) // ENDIF // ENDREPEAT bDoneMakeMichaelMoreLethal = TRUE ENDIF //IF NOT IS_PED_INJURED(enemyChopperPed[0]) // IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL // SET_PED_SUFFERS_CRITICAL_HITS(enemyChopperPed[0], TRUE) // ELSE // SET_PED_SUFFERS_CRITICAL_HITS(enemyChopperPed[0], FALSE) // ENDIF //ENDIF ELSE //IF NOT IS_PED_INJURED(enemyChopperPed[0]) // SET_PED_SUFFERS_CRITICAL_HITS(enemyChopperPed[0], TRUE) //ENDIF IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL]) SET_PED_ACCURACY(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], 75) // 15 ENDIF ENDIF // deal with enemy chopper peds //fChopperAccuracy = fChopperAccuracy +@ 0.6 //IF fChopperAccuracy > 100 // fChopperAccuracy = 100 //ENDIF //PRINTSTRING("acc = ") PRINTFLOAT(fChopperAccuracy) PRINTNL() REPEAT COUNT_OF(enemyChopperPed) i IF NOT IS_PED_INJURED(enemyChopperPed[i]) BOOL bDoDamage = FALSE //IF bDoneMakeMichaelMoreLethal // IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL]) // IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(enemyChopperPed[i], sSelectorPeds.pedID[SELECTOR_PED_MICHAEL]) // bDoDamage = TRUE // ENDIF // ENDIF //ENDIF IF HAS_ENTITY_BEEN_DAMAGED_BY_WEAPON(enemyChopperPed[i], WEAPONTYPE_HEAVYSNIPER) bDoDamage = TRUE ENDIF IF bDoDamage APPLY_DAMAGE_TO_PED(enemyChopperPed[i], 1000, TRUE) ENDIF ELSE IF NOT bKilledEnemyChopperPed[i] IF DOES_ENTITY_EXIST(enemyChopperPed[i]) INFORM_MISSION_STATS_OF_INCREMENT(FBI2_KILLS) bKilledEnemyChopperPed[i] = TRUE ENDIF ENDIF ENDIF ENDREPEAT IF hangingHotswapState <> HANGING_HOTSWAP_ON_TREVOR AND hangingHotswapState <> HANGING_HOTSWAP_MICHAEL_TO_TREVOR AND hangingHotswapState <> HANGING_HOTSWAP_FRANKLIN_TO_TREVOR IF GET_GAME_TIMER() >= iNextTrevorAITime DO_TREVOR_FLY_ESCAPE_ROUTE() ENDIF ENDIF IF NOT bDoneChopperChoiceSpeech IF iAllowGoHomeTime < 0 IF iEnemyChopperSpeechStage > 0 //IF DO_MISSION_SPEECH("FBI2_SEECHP") bDoneChopperChoiceSpeech = TRUE iChopperHelpTime = GET_GAME_TIMER() + 600 //ENDIF ENDIF ENDIF ELSE IF NOT bDoneDangleHelp IF GET_GAME_TIMER() >= iChopperHelpTime bDoneDangleHelp = DO_MISSION_HELP_TEXT("SG_HOTHLP2", FALSE, 12500) ENDIF ENDIF ENDIF VECTOR vChopperPos IF IS_VEHICLE_DRIVEABLE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) vChopperPos = GET_ENTITY_COORDS(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) ENDIF FLOAT fHeightAboveGround FLOAT fGroundHeight GET_GROUND_Z_FOR_3D_COORD(vChopperPos, fGroundHeight) IF fGroundHeight < 0 fGroundHeight = 0 ENDIF fHeightAboveGround = vChopperPos.z - fGroundHeight IF fHeightAboveGround < 0 fHeightAboveGround *= -1 ENDIF VECTOR vApplyOffsetToHeliTasks vApplyOffsetToHeliTasks = <<0,0,0>> IF fHeightAboveGround < 20 //printstring("apply offset to heli tasks") printnl() vApplyOffsetToHeliTasks = <<0,0,8>> ENDIF IF NOT bCreatedExtraHeli IF (NOT DOES_BLIP_EXIST(enemyChopperBlip[0]) OR NOT DOES_BLIP_EXIST(enemyChopperBlip[1])) AND GET_GAME_TIMER() >= iStartMissionStageTime + 2000 IF iCreateExtraHeliTime < 0 iCreateExtraHeliTime = GET_GAME_TIMER() ELSE IF GET_GAME_TIMER() >= iCreateExtraHeliTime + 3000 CREATE_ENEMY_CHOPPER(FALSE, TRUE) enemyChopperBlip[3] = CREATE_MISSION_BLIP_FOR_VEHICLE(enemyChopperVehicle[3], TRUE) bCreatedExtraHeli = TRUE ENDIF ENDIF ENDIF ENDIF // enemy chopper AI VECTOR vOffset WEAPON_TYPE currentWeapon REPEAT NUMBER_ENEMY_CHOPPERS i IF IS_VEHICLE_DRIVEABLE(enemyChopperVehicle[i]) // bad guys to start shooting IF NOT bEnemyChopperShootersToAttack[i] IF GET_GAME_TIMER() >= iChopperChaseTime + 3700 SET_ENEMY_CHOPPER_SHOOTERS_TO_ATTACK(i) ENDIF ENDIF IF NOT bEnemyChopperToAI[i] BOOL bStopPlayback = FALSE IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(enemyChopperVehicle[i]) bStopPlayback = TRUE ELSE //IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR //AND GET_TIME_POSITION_IN_RECORDING(enemyChopperVehicle[i]) >= 5000 // bStopPlayback = TRUE //ENDIF ENDIF IF bStopPlayback IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(enemyChopperVehicle[i]) STOP_PLAYBACK_RECORDED_VEHICLE(enemyChopperVehicle[i]) ENDIF iNextEnemyChopperSpeechTime = GET_GAME_TIMER() + 9000 bEnemyChopperToAI[i] = TRUE ENDIF ELSE PED_INDEX pilotPed = GET_PED_IN_VEHICLE_SEAT(enemyChopperVehicle[i], VS_DRIVER) PED_INDEX michaelPed = GET_MICHAEL_PED() IF NOT IS_PED_INJURED(michaelPed) AND NOT IS_PED_INJURED(pilotPed) FLOAT fDistance = GET_DISTANCE_BETWEEN_ENTITIES(michaelPed, enemyChopperVehicle[i]) FLOAT fTaskDistance fTaskDistance=999 IF fTaskDistance > 0 ENDIF IF hangingHotswapState = HANGING_HOTSWAP_ON_TREVOR fTaskDistance = 50 ELSE IF fDistance <= 30 fTaskDistance = 40 ELSE fTaskDistance = 20 ENDIF ENDIF // chopper speech IF i=0 IF iEnemyChopperSpeechStage = 1 AND (hangingHotswapState = HANGING_HOTSWAP_ON_MICHAEL OR hangingHotswapState = HANGING_HOTSWAP_ON_TREVOR) IF fDistance <= 130 IF GET_GAME_TIMER() >= iNextEnemyChopperSpeechTime IF DO_MISSION_SPEECH("FBI2_DOWN3") iNextEnemyChopperSpeechTime = GET_GAME_TIMER() + 11000 iEnemyChopperSpeechStage++ ENDIF ENDIF ENDIF ENDIF ENDIF IF GET_GAME_TIMER() >= iEnemyChopperAITime[i] IF NOT IS_PED_INJURED(michaelPed) //VECTOR vMichaelPos = GET_ENTITY_COORDS(michaelPed) IF IS_VEHICLE_DRIVEABLE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) IF i=0 OR i=1 OR i=3 IF NOT DOES_BLIP_EXIST(enemyChopperBlip[1]) IF DOES_BLIP_EXIST(enemyChopperBlip[0]) IF iLeadHeli = 1 IF bDoLeadHeliFireRockets bDoLeadHeliFireRockets = FALSE iLeadHeliFireRocketsTime = GET_GAME_TIMER() + 10000 ENDIF ENDIF iLeadHeli = 0 ELSE IF iLeadHeli = 1 OR iLeadHeli = 0 IF bDoLeadHeliFireRockets bDoLeadHeliFireRockets = FALSE iLeadHeliFireRocketsTime = GET_GAME_TIMER() + 10000 ENDIF ENDIF iLeadHeli = 3 ENDIF ENDIF IF i=iLeadHeli /* IF GET_GAME_TIMER() >= iLeadHeliFireRocketsTime AND IS_ENTITY_AT_ENTITY(pilotPed, snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], <<50,50,50>>, FALSE, FALSE) AND GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL SET_PED_FIRING_PATTERN(pilotPed, FIRING_PATTERN_FULL_AUTO) SET_CURRENT_PED_VEHICLE_WEAPON(pilotPed, WEAPONTYPE_VEHICLE_SPACE_ROCKET) TASK_HELI_MISSION(pilotPed, enemyChopperVehicle[i], NULL, NULL, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(enemyChopperVehicle[i], <<0, 50, 0>>), MISSION_ATTACK, 30.0, 40, -1, ROUND(vChopperPos.z), 10) //TASK_HELI_MISSION(pilotPed, enemyChopperVehicle[i], NULL, NULL, GET_ENTITY_COORDS(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]), MISSION_ATTACK, 40.0, 40, -1, ROUND(vChopperPos.z), 10) iEnemyChopperAITime[i] = GET_GAME_TIMER() + 5000 iLeadHeliFireRocketsTime = GET_GAME_TIMER() + 4000000 ELSE */ IF NOT bDoLeadHeliFireRockets IF GET_GAME_TIMER() >= iLeadHeliFireRocketsTime OR bRocketsAccurate bDoLeadHeliFireRockets = TRUE iLeadHeliFireRocketsTime = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(6000, 8000) ENDIF TASK_HELI_MISSION(pilotPed, enemyChopperVehicle[i], NULL, NULL, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], <<-20, -35, -3>> + vApplyOffsetToHeliTasks), MISSION_GOTO, 120.0, 0.1, GET_ENTITY_HEADING(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]), ROUND(vChopperPos.z), 10, -1) // <<-20, 30, -1>><<-20, 40, 0>> iEnemyChopperAITime[i] = GET_GAME_TIMER() + 10 ELSE IF GET_GAME_TIMER() >= iNextRocketInBarrageTime SET_CURRENT_PED_VEHICLE_WEAPON(pilotPed, WEAPONTYPE_VEHICLE_SPACE_ROCKET) GET_CURRENT_PED_VEHICLE_WEAPON(pilotPed, currentWeapon) IF currentWeapon = WEAPONTYPE_VEHICLE_SPACE_ROCKET VECTOR vHeliOffset vHeliOffset = GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(enemyChopperVehicle[i], GET_ENTITY_COORDS(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER])) IF vHeliOffset.y >= 10 vOffset.x = GET_RANDOM_FLOAT_IN_RANGE(5, 10) vOffset.y = GET_RANDOM_FLOAT_IN_RANGE(5, 10) vOffset.z = GET_RANDOM_FLOAT_IN_RANGE(5, 10) IF GET_RANDOM_INT_IN_RANGE(0,2) = 0 vOffset.x *= -1 ENDIF IF GET_RANDOM_INT_IN_RANGE(0,2) = 0 vOffset.y *= -1 ENDIF IF GET_RANDOM_INT_IN_RANGE(0,2) = 0 vOffset.z *= -1 ENDIF IF bRocketsAccurate SET_VEHICLE_SHOOT_AT_TARGET(pilotPed, snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], <<0,0,0>>) ELSE SET_VEHICLE_SHOOT_AT_TARGET(pilotPed, NULL, GET_ENTITY_COORDS(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) + vOffset) ENDIF ENDIF iNextRocketInBarrageTime = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(1200, 1700) ENDIF ENDIF TASK_HELI_MISSION(pilotPed, enemyChopperVehicle[i], NULL, NULL, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], <<-6, -35, -3>> + vApplyOffsetToHeliTasks), MISSION_GOTO, 120.0, 0.1, GET_ENTITY_HEADING(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]), ROUND(vChopperPos.z), 10, -1) // <<-6, 30, -1>><<-20, 40, 0>> iEnemyChopperAITime[i] = GET_GAME_TIMER() + 10 IF GET_GAME_TIMER() >= iLeadHeliFireRocketsTime AND NOT bRocketsAccurate bDoLeadHeliFireRockets = FALSE iLeadHeliFireRocketsTime = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(18000, 23000) ENDIF ENDIF //ENDIF ELSE TASK_HELI_MISSION(pilotPed, enemyChopperVehicle[i], NULL, NULL, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], <<-40, -5, 2>> + vApplyOffsetToHeliTasks), MISSION_GOTO, 170.0, 0.1, GET_ENTITY_HEADING(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]), ROUND(vChopperPos.z), 10, -1) // <<-40, -2, 7>> <<-40, 15, 6>> iEnemyChopperAITime[i] = GET_GAME_TIMER() + 10 ENDIF ELSE fCircleCentreMod = fCircleCentreMod -@ 0.08 IF fCircleCentreMod < 0.0 fCircleCentreMod = 0.0 ENDIF //PRINTFLOAT(fCircleCentreMod) printnl() SET_VEHICLE_DISABLE_HEIGHT_MAP_AVOIDANCE(enemyChopperVehicle[2], TRUE) IF heliStrafeState = HELI_STRAFE_MOVE VECTOR vCircleTarget = <<0,0,0>> VECTOR vCircleCentre = GET_ENTITY_COORDS(franklinAnchorObject) CONST_FLOAT HELI_CIRCLE_RADIUS 27.0 CONST_FLOAT HELI_CIRCLE_MOD_HEADING 0.0//-95.6 FLOAT fModHeliCircleAngle = fHeliCircleAngle + HELI_CIRCLE_MOD_HEADING vCircleTarget.x = vCircleCentre.x + (HELI_CIRCLE_RADIUS * COS(fModHeliCircleAngle)) vCircleTarget.y = vCircleCentre.y + (HELI_CIRCLE_RADIUS * SIN(fModHeliCircleAngle)) vCircleTarget.z = vCircleCentre.z VECTOR vChopperCoords = GET_ENTITY_COORDS(enemyChopperVehicle[2]) BOOL bNearTower = FALSE IF GET_DISTANCE_BETWEEN_COORDS(<<-166.55, -590.77, 199.13>>, vChopperCoords, FALSE) < 18.5 bNearTower = TRUE ENDIF IF IS_ENTITY_AT_COORD(enemyChopperVehicle[i], vCircleTarget, <<9,9,9>>) fHeliCircleAngle += GET_RANDOM_FLOAT_IN_RANGE(22.5, 28.0) IF fHeliCircleAngle > 360.0 fHeliCircleAngle -= 360.0 ENDIF IF NOT bNearTower SET_PED_FIRING_PATTERN(pilotPed, FIRING_PATTERN_FULL_AUTO) SET_PED_ACCURACY(pilotPed, 100) SET_CURRENT_PED_VEHICLE_WEAPON(pilotPed, WEAPONTYPE_VEHICLE_SPACE_ROCKET) IF fCircleCentreMod <= 0 OR bDonePanicSpeech TASK_HELI_MISSION(pilotPed, enemyChopperVehicle[i], NULL, GET_FRANKLIN_PED(), <<0,0,0>>, MISSION_ATTACK, 10, HELI_CIRCLE_RADIUS, -1, ROUND(vCircleCentre.z), 10) ELSE TASK_HELI_MISSION(pilotPed, enemyChopperVehicle[i], NULL, NULL, <<-139.44576, -594.67993, 211.21364>> + <<0,0,fCircleCentreMod>>, MISSION_ATTACK, 10, HELI_CIRCLE_RADIUS, -1, ROUND(vCircleCentre.z), 10) ENDIF iEnemyChopperAITime[i] = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(1500, 4500) iLastEnemyRocketsTime = GET_GAME_TIMER() heliStrafeState = HELI_STRAFE_ATTACK ELSE iEnemyChopperAITime[i] = GET_GAME_TIMER() + 10 ENDIF ELSE FLOAT fStrafeFacing = GET_HEADING_FROM_VECTOR_2D(vCircleCentre.x - vChopperCoords.x, vCircleCentre.y - vChopperCoords.y) VECTOR vModTargetHeight = <<0,0,0>> IF bNearTower vModTargetHeight.z = 10 ELSE vModTargetHeight.z = 1 ENDIF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), vCircleTarget + vModTargetHeight, <<0.2,0.2,0.2>>) TASK_HELI_MISSION(pilotPed, enemyChopperVehicle[i], NULL, NULL, vCircleTarget + vModTargetHeight, MISSION_GOTO, 15.0, 4, fStrafeFacing, ROUND(vCircleCentre.z + vModTargetHeight.z), 10) iEnemyChopperAITime[i] = GET_GAME_TIMER() + 10 ENDIF ELIF heliStrafeState = HELI_STRAFE_ATTACK heliStrafeState = HELI_STRAFE_MOVE iEnemyChopperAITime[i] = GET_GAME_TIMER() + 10 ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF IF IS_PED_INJURED(GET_PED_IN_VEHICLE_SEAT(enemyChopperVehicle[i])) SET_VEHICLE_AS_NO_LONGER_NEEDED(enemyChopperVehicle[i]) ENDIF ELSE IF DOES_ENTITY_EXIST(enemyChopperVehicle[i]) SET_VEHICLE_AS_NO_LONGER_NEEDED(enemyChopperVehicle[i]) ENDIF ENDIF ENDREPEAT REPEAT COUNT_OF(enemyChopperPed) i IF DOES_ENTITY_EXIST(enemyChopperPed[i]) BOOL bSetNoLongerNeeded = FALSE IF NOT IS_PED_INJURED(enemyChopperPed[i]) IF IS_PED_IN_ANY_VEHICLE(enemyChopperPed[i]) IF NOT IS_VEHICLE_DRIVEABLE(GET_VEHICLE_PED_IS_IN(enemyChopperPed[i])) OR NOT IS_ENTITY_A_MISSION_ENTITY(GET_VEHICLE_PED_IS_IN(enemyChopperPed[i])) bSetNoLongerNeeded = TRUE ENDIF ELSE bSetNoLongerNeeded = TRUE ENDIF ELSE bSetNoLongerNeeded = TRUE ENDIF IF bSetNoLongerNeeded IF i=0 REMOVE_PED_FOR_DIALOGUE(snatchAndGrabConversation, 4) ENDIF SET_PED_AS_NO_LONGER_NEEDED(enemyChopperPed[i]) ENDIF ENDIF ENDREPEAT // vs chopper gameplay IF NOT bSpottedChopper IF fPlaybackTime >= 0//CHASE_SPOT_CHOPPER_TIME IF CAN_ADVANCE_MISSION() //IF DO_MISSION_SPEECH("FBI2_CHP1") REPEAT NUMBER_ENEMY_CHOPPERS i IF IS_VEHICLE_DRIVEABLE(enemyChopperVehicle[i]) enemyChopperBlip[i] = CREATE_MISSION_BLIP_FOR_VEHICLE(enemyChopperVehicle[i], TRUE) ENDIF ENDREPEAT iEnemyChopperSpeechStage++ iNextEnemyChopperSpeechTime = GET_GAME_TIMER() + 11000 bSpottedChopper = TRUE // Music change when chopper is blipped //TRIGGER_MISSION_MUSIC_EVENT("FBI2_TEST_CHOPPER_SPOTTED") //ENDIF ENDIF ENDIF ELSE IF CAN_ADVANCE_MISSION() IF iAllowGoHomeTime < 0 BOOL bAllowGoHome = TRUE REPEAT NUMBER_ENEMY_CHOPPERS i IF IS_VEHICLE_DRIVEABLE(enemyChopperVehicle[i]) IF NOT IS_PED_INJURED(GET_PED_IN_VEHICLE_SEAT(enemyChopperVehicle[i])) bAllowGoHome = FALSE ELSE IF DOES_BLIP_EXIST(enemyChopperBlip[i]) REMOVE_BLIP(enemyChopperBlip[i]) ENDIF ENDIF //IF GET_DISTANCE_BETWEEN_ENTITIES(enemyChopperVehicle[i], snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) < 330 // bAllowGoHome = FALSE //ENDIF ELSE IF DOES_BLIP_EXIST(enemyChopperBlip[i]) REMOVE_BLIP(enemyChopperBlip[i]) ENDIF ENDIF ENDREPEAT IF bAllowGoHome AND bCreatedExtraHeli REPEAT NUMBER_ENEMY_CHOPPERS i IF DOES_BLIP_EXIST(enemyChopperBlip[i]) REMOVE_BLIP(enemyChopperBlip[i]) ENDIF ENDREPEAT // Music change //TRIGGER_MISSION_MUSIC_EVENT("FBI2_TEST_CHOPPER_DONE") bShownChopperPrompt = TRUE bDoneDangleHelp = TRUE REMOVE_MISSION_TEXT(FALSE, TRUE, FALSE) KILL_ANY_CONVERSATION() iAllowGoHomeTime = GET_GAME_TIMER() + 300 ENDIF IF NOT bShownChopperPrompt //IF DO_MISSION_GOD_TEXT("SG_DCHOP") bShownChopperPrompt = TRUE //ENDIF ENDIF ELSE IF NOT bDoneNoMoreThreatCue bDoneNoMoreThreatCue = TRIGGER_MISSION_MUSIC_EVENT("FIB2_HELICOPTERS_GONE") ENDIF IF GET_GAME_TIMER() >= iAllowGoHomeTime AND createFBIAtEndStage <> CREATE_FBI_AT_END_STAGE_WAITING AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() REPEAT NUMBER_ENEMY_CHOPPERS i SET_ENEMY_CHOPPER_AS_GAVE_UP_CHASE(i) ENDREPEAT SET_MISSION_STAGE(STAGE_DROPOFF, FALSE, FALSE, FALSE) ENDIF ENDIF ENDIF ENDIF ENDPROC // dropping off prisoner cutscene PROC DO_DROPOFF_CUTSCENE() SET_ALL_RANDOM_PEDS_FLEE_THIS_FRAME(PLAYER_ID()) SWITCH cutsceneStage CASE SAG_CUT_STAGE_INIT ADD_MODEL_REQUEST(ENUM_TO_INT(SAGM_FBIEND)) SET_PLAYER_FORCED_AIM(PLAYER_ID(), FALSE) IF NOT IS_PED_INJURED(GET_MICHAEL_PED()) SET_PED_CONFIG_FLAG(GET_MICHAEL_PED(), PCF_ForcedAim, FALSE) ENDIF IF NOT IS_PED_INJURED(GET_MICHAEL_PED()) REGISTER_ENTITY_FOR_CUTSCENE(GET_MICHAEL_PED(), "Michael", CU_ANIMATE_EXISTING_SCRIPT_ENTITY) ENDIF IF NOT IS_PED_INJURED(GET_TREVOR_PED()) REGISTER_ENTITY_FOR_CUTSCENE(GET_TREVOR_PED(), "Trevor", CU_ANIMATE_EXISTING_SCRIPT_ENTITY) ENDIF IF NOT IS_PED_INJURED(prisonerPed) REGISTER_ENTITY_FOR_CUTSCENE(prisonerPed, "MR_K", CU_ANIMATE_AND_DELETE_EXISTING_SCRIPT_ENTITY) ENDIF IF NOT IS_PED_INJURED(fbiPed[1]) TASK_CLEAR_LOOK_AT(fbiPed[1]) REGISTER_ENTITY_FOR_CUTSCENE(fbiPed[1], "FIB_Agent_near_heli", CU_ANIMATE_AND_DELETE_EXISTING_SCRIPT_ENTITY) ENDIF IF NOT IS_PED_INJURED(fbiPed[0]) TASK_CLEAR_LOOK_AT(fbiPed[0]) REGISTER_ENTITY_FOR_CUTSCENE(fbiPed[0], "FIB_Agent_near_Van", CU_ANIMATE_AND_DELETE_EXISTING_SCRIPT_ENTITY) ENDIF IF IS_VEHICLE_DRIVEABLE(fbiVanVehicle) REGISTER_ENTITY_FOR_CUTSCENE(fbiVanVehicle, "FBI_2_Burrito_Van", CU_ANIMATE_AND_DELETE_EXISTING_SCRIPT_ENTITY) ENDIF IF IS_VEHICLE_DRIVEABLE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) REGISTER_ENTITY_FOR_CUTSCENE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], "Main_heli", CU_ANIMATE_EXISTING_SCRIPT_ENTITY) ENDIF CUTSCENE_OPTION_FLAGS flags IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL flags = CUTSCENE_NO_OPTIONS ELSE flags = CUTSCENE_PLAYER_FP_FLASH_MICHAEL ENDIF START_CUTSCENE(flags) REPLAY_RECORD_BACK_FOR_TIME(6.0, 0.0, REPLAY_IMPORTANCE_HIGHEST) REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST) SET_CUTSCENE_FADE_VALUES(FALSE, FALSE, FALSE, FALSE) cutsceneStage = SAG_CUT_STAGE_RUNNING BREAK CASE SAG_CUT_STAGE_RUNNING #IF IS_DEBUG_BUILD DEBUG_SKIP_MOCAP() #ENDIF 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 GET_CURRENT_PLAYER_PED_ENUM() <> CHAR_MICHAEL bDoMichaelBoom = TRUE MAKE_SELECTOR_PED_SELECTION(sSelectorPeds, SELECTOR_PED_MICHAEL) TAKE_CONTROL_OF_SELECTOR_PED(sSelectorPeds, TRUE, TRUE, TCF_CLEAR_TASK_INTERRUPT_CHECKS) REAPPLY_PLAYER_PED_ATTRIBUTES() ENDIF REMOVE_ALL_BLIPS() STOP_ALL_SNATCH_AND_GRAB_AUDIO_SCENES() //SCRIPT_OVERRIDES_WIND_TYPES(FALSE, "", "") // temp? //IF DOES_ENTITY_EXIST(fbiPed[0]) // DELETE_PED(fbiPed[0]) //ENDIF CLEAR_AREA(<<1373.97437, -2070.95264, 54.18420>>, 30.0, TRUE) STOP_FIRE_IN_RANGE(<<1373.97437, -2070.95264, 54.18420>>, 30.0) REMOVE_PARTICLE_FX_IN_RANGE(<<1373.97437, -2070.95264, 54.18420>>, 30.0) IF DOES_ROPE_EXIST(rappelData.rope) DELETE_RAPPEL_ROPE(rappelData) ENDIF IF DOES_ENTITY_EXIST(harnessObject) DELETE_OBJECT(harnessObject) ENDIF // stop the dangle sound STOP_SOUND(iDangleSoundID) // get rid of enemy chopper DELETE_ENEMY_CHOPPER() IF NOT IS_PED_INJURED(prisonerPed) SET_PED_COMPONENT_VARIATION(prisonerPed, PED_COMP_SPECIAL, 1, 0) ENDIF IF IS_VEHICLE_DRIVEABLE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) SET_VEHICLE_ENGINE_ON(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], FALSE, FALSE) //SET_HELI_BLADES_SPEED(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], 0) SET_VEHICLE_DOOR_CONTROL(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], SC_DOOR_FRONT_LEFT, DT_DOOR_INTACT, 0.0) ENDIF STOP_VEHICLE_FIRE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) IF NOT IS_PED_INJURED(GET_MICHAEL_PED()) //CLEAR_PED_PROP(GET_MICHAEL_PED(), ANCHOR_HEAD) REMOVE_PED_HELMET(GET_MICHAEL_PED(), TRUE) ENDIF bClearedForCutscene = TRUE ENDIF ENDIF IF NOT bChangedClothes IF GET_CUTSCENE_TIME() >= 23397 //SET_PLAYER_PED_WITH_HEADSET(CHAR_TREVOR, FALSE) RESTORE_PLAYER_PED_VARIATIONS(GET_MICHAEL_PED()) CLEAR_PED_WETNESS(GET_MICHAEL_PED()) CLEAR_PED_ENV_DIRT(GET_MICHAEL_PED()) CLEAR_PED_BLOOD_DAMAGE(GET_MICHAEL_PED()) RESET_PED_VISIBLE_DAMAGE(GET_MICHAEL_PED()) bChangedClothes = TRUE ENDIF ENDIF IF NOT bForceStartedChopper IF GET_CUTSCENE_TIME() >= 47617 IF IS_VEHICLE_DRIVEABLE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) dummyTrevorPed = CREATE_PED_INSIDE_VEHICLE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], PEDTYPE_MISSION, GET_MODEL_FOR_SNATCH_AND_GRAB_MODEL_ENUM(SAGM_FBIEND)) SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(dummyTrevorPed, TRUE) STOP_PED_SPEAKING(dummyTrevorPed, TRUE) SET_ENTITY_VISIBLE(dummyTrevorPed, FALSE) SET_VEHICLE_ENGINE_ON(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], TRUE, FALSE) //SET_HELI_BLADES_FULL_SPEED(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) bForceStartedChopper = TRUE ENDIF ENDIF ENDIF IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Trevor") AND CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Main_Heli") IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR]) AND IS_VEHICLE_DRIVEABLE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) IF DOES_ENTITY_EXIST(dummyTrevorPed) DELETE_PED(dummyTrevorPed) ENDIF SET_PED_INTO_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) VECTOR vChopperPos vChopperPos=vChopperPos vChopperPos = GET_ENTITY_COORDS(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) CLEAR_SEQUENCE_TASK(sequence) OPEN_SEQUENCE_TASK(sequence) TASK_HELI_MISSION(NULL, snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], NULL, NULL, <>, MISSION_GOTO, 100.0, 5.0, -1, 65, 0) TASK_HELI_MISSION(NULL, snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], NULL, NULL, <<1450.54724, -1332.49878, 110.0>>, MISSION_GOTO, 100.0, 0.0, -1, 110, 0) //132 CLOSE_SEQUENCE_TASK(sequence) TASK_PERFORM_SEQUENCE(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], sequence) SHUT_ALL_CHOPPER_DOORS() SET_VEHICLE_ENGINE_ON(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], TRUE, TRUE) SET_HELI_BLADES_FULL_SPEED(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) SET_ENTITY_VELOCITY(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], <<0.0,4,5>>) SET_HELI_TURBULENCE_SCALAR(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER],1.0) SET_AIRCRAFT_PILOT_SKILL_NOISE_SCALAR(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER],1.0) ENDIF ENDIF IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Michael") REPLAY_STOP_EVENT() SET_PED_CONFIG_FLAG(PLAYER_PED_ID(), PCF_WaitingForPlayerControlInterrupt, TRUE) ENDIF IF NOT IS_CUTSCENE_PLAYING() IF WAS_CUTSCENE_SKIPPED() WHILE NOT IS_SCREEN_FADED_OUT() WAIT(0) ENDWHILE RESTORE_PLAYER_PED_VARIATIONS(GET_MICHAEL_PED()) CLEAR_PED_WETNESS(GET_MICHAEL_PED()) CLEAR_PED_ENV_DIRT(GET_MICHAEL_PED()) CLEAR_PED_BLOOD_DAMAGE(GET_MICHAEL_PED()) RESET_PED_VISIBLE_DAMAGE(GET_MICHAEL_PED()) WAIT(1500) ENDIF iTrevorFlyOffTime = GET_GAME_TIMER() bTrevorGone = TRUE SET_PED_CAN_SWITCH_WEAPON(PLAYER_PED_ID(), TRUE) SET_MISSION_CUTSCENE(FALSE, TRUE, TRUE, TRUE, FALSE) CLEANUP_MICHAEL_WEAPON_OVERRIDES() IF bDoMichaelBoom IF GET_FOLLOW_PED_CAM_VIEW_MODE() <> CAM_VIEW_MODE_FIRST_PERSON ANIMPOSTFX_PLAY("SwitchSceneMichael", 0, FALSE) PLAY_SOUND_FRONTEND(-1, "Hit_In", "PLAYER_SWITCH_CUSTOM_SOUNDSET") ENDIF ENDIF ENDIF /* IF CAN_SET_EXIT_STATE_FOR_CAMERA() IF NOT IS_PED_INJURED(PLAYER_PED_ID()) CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID()) SET_ENTITY_COORDS(PLAYER_PED_ID(), GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_END)) SET_ENTITY_HEADING(PLAYER_PED_ID(), END_ROT) ENDIF SET_GAMEPLAY_CAM_RELATIVE_HEADING() ENDIF */ BREAK CASE SAG_CUT_STAGE_CLEANUP BREAK ENDSWITCH ENDPROC // dropoff stage PROC DO_STAGE_DROPOFF() IF NOT bRunningCutscene IF NOT bTrevorGone // remove michael pistol IF NOT IS_PED_INJURED(GET_MICHAEL_PED()) WEAPON_TYPE weapon GET_CURRENT_PED_WEAPON(GET_MICHAEL_PED(), weapon) IF weapon <> GET_SNATCH_AND_GRAB_WEAPON_TYPE(SAG_WEAPON_MICHAEL_RIFLE) SET_CURRENT_PED_WEAPON(GET_MICHAEL_PED(), GET_SNATCH_AND_GRAB_WEAPON_TYPE(SAG_WEAPON_MICHAEL_RIFLE), TRUE) IF GET_AMMO_IN_PED_WEAPON(GET_MICHAEL_PED(), GET_SNATCH_AND_GRAB_WEAPON_TYPE(SAG_WEAPON_MICHAEL_RIFLE)) = 0 SET_PED_AMMO(GET_MICHAEL_PED(), GET_SNATCH_AND_GRAB_WEAPON_TYPE(SAG_WEAPON_MICHAEL_RIFLE), 1) ENDIF SET_PED_INFINITE_AMMO(GET_MICHAEL_PED(), TRUE, GET_SNATCH_AND_GRAB_WEAPON_TYPE(SAG_WEAPON_MICHAEL_RIFLE)) SET_PED_INFINITE_AMMO_CLIP(GET_MICHAEL_PED(), TRUE) ENDIF ENDIF DO_CHOPPER_ESCAPE_COMMON_FUNCTIONS() // get rid of enemy chopper IF NOT bRemovedEnemyChopper //IF GET_GAME_TIMER() >= iStartMissionStageTime + 10000 INT i REPEAT NUMBER_ENEMY_CHOPPERS i IF DOES_ENTITY_EXIST(enemyChopperVehicle[i]) SET_VEHICLE_AS_NO_LONGER_NEEDED(enemyChopperVehicle[i]) ENDIF ENDREPEAT REPEAT COUNT_OF(enemyChopperPed) i IF DOES_ENTITY_EXIST(enemyChopperPed[i]) SET_PED_AS_NO_LONGER_NEEDED(enemyChopperPed[i]) ENDIF ENDREPEAT bRemovedEnemyChopper = TRUE //ENDIF ENDIF FORCE_CHOPPER_UP() IF CAN_ADVANCE_MISSION() IF NOT bForcePassOnShitskip IF hangingHotswapState = HANGING_HOTSWAP_ON_TREVOR OR hangingHotswapState = HANGING_HOTSWAP_ON_MICHAEL IF NOT bDoneGoHomeSpeech bDoneGoHomeSpeech = DO_MISSION_SPEECH("FBI2_GOBACK", TRUE) ELSE IF NOT bDoneGotoSpeech bDoneGotoSpeech = DO_MISSION_SPEECH("FBI2_TCONT") ENDIF ENDIF ENDIF ENDIF ENDIF IF hangingHotswapState = HANGING_HOTSWAP_ON_TREVOR HANDLE_GET_TO_LOCATION(TRUE, FALSE) IF IS_SELECTOR_ONSCREEN() AND GET_CAM_VIEW_MODE_FOR_CONTEXT(CAM_VIEW_MODE_CONTEXT_IN_HELI) <> CAM_VIEW_MODE_FIRST_PERSON IF NOT IS_GAMEPLAY_HINT_ACTIVE() SET_GAMEPLAY_VEHICLE_HINT(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], vHangOnTrevor_HintCamLookAtLoc, TRUE, iCHASE_HINT_INFINITE_DWELL_TIME, 600, 600) SET_GAMEPLAY_HINT_FOLLOW_DISTANCE_SCALAR(fHangOnTrevor_HintCamFollowDist) SET_GAMEPLAY_HINT_FOV(GET_GAMEPLAY_CAM_FOV()) ENDIF ELSE IF IS_GAMEPLAY_HINT_ACTIVE() STOP_GAMEPLAY_HINT(FALSE) ENDIF ENDIF ELIF hangingHotswapState = HANGING_HOTSWAP_ON_MICHAEL // dont blip the dropoff IF DOES_BLIP_EXIST(getToBlip) REMOVE_BLIP(getToBlip) // getToBlip = CREATE_MISSION_BLIP_FOR_COORD(GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_DROPOFF)) ENDIF IF DOES_BLIP_EXIST(vehicleBlip) REMOVE_BLIP(vehicleBlip) ENDIF IF NOT bShownGodText IF bDoneGotoSpeech //bShownGodText = DO_MISSION_GOD_TEXT("SG_GOLND") bShownGodText = TRUE ELSE ENDIF ELSE ENDIF // force trevor to come in low IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_DROPOFF), <<12,12,200>>, FALSE, FALSE) IF NOT bDoneForceTrevorLow TASK_HELI_MISSION(GET_TREVOR_PED(), snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], NULL, NULL, GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_DROPOFF), MISSION_LAND, 10.0, 2.0, -1, 0, 0) PRINTSTRING("force trevor low!") printnl() bDoneForceTrevorLow = TRUE ENDIF ELSE IF bDoneForceTrevorLow bDoneForceTrevorLow = FALSE ENDIF ENDIF ENDIF IF NOT bForcePassOnShitskip IF hangingHotswapState = HANGING_HOTSWAP_ON_MICHAEL OR hangingHotswapState = HANGING_HOTSWAP_ON_TREVOR IF bDoneForceGetOutOfThereSpeech bDoneGetOffRoofSpeech = TRUE ENDIF IF NOT bDoneGetOffRoofSpeech IF bShownGodText bDoneGetOffRoofSpeech = DO_MISSION_SPEECH("FBI2_LEAVE") ENDIF ELSE //IF NOT bDoneKeepSniperSpeech //IF NOT g_bMagDemoActive // bDoneKeepSniperSpeech = DO_MISSION_SPEECH("FBI2_KSNIPER") //ELSE // bDoneKeepSniperSpeech = TRUE //ENDIF //ELSE IF NOT bDoneWayHomeSpeech bDoneWayHomeSpeech = DO_MISSION_SPEECH("FBI2_MKTALK") ELSE IF NOT bDoneWayHomeSpeech2 bDoneWayHomeSpeech2 = DO_MISSION_SPEECH("FBI2_MKTALK2") ENDIF ENDIF //ENDIF ENDIF ENDIF ENDIF IF bDoneGetOffRoofSpeech IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN]) IF NOT IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN], <<200,200,200>>, FALSE, FALSE) DELETE_PED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN]) ENDIF ENDIF ENDIF IF NOT g_bMagDemoActive IF createFBIAtEndStage = CREATE_FBI_AT_END_STAGE_DONE HANDLE_STREAMING_MOCAP("fbi_2_ext", GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_DROPOFF), DEFAULT_CUTSCENE_LOAD_DIST, DEFAULT_CUTSCENE_UNLOAD_DIST) IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY() IF NOT IS_PED_INJURED(GET_MICHAEL_PED()) SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Michael", GET_MICHAEL_PED()) ENDIF IF NOT IS_PED_INJURED(fbiPed[0]) SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("FIB_Agent_near_Van", fbiPed[0]) ENDIF IF NOT IS_PED_INJURED(fbiPed[1]) SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("FIB_Agent_near_heli", fbiPed[1]) ENDIF IF NOT IS_PED_INJURED(prisonerPed) SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("MR_K", prisonerPed) SET_CUTSCENE_PED_COMPONENT_VARIATION("MR_K", PED_COMP_SPECIAL, 0, 0) ENDIF ENDIF ENDIF IF CAN_ADVANCE_MISSION() IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) IS_ENTITY_AT_COORD(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_DROPOFF), <<7,7,LOCATE_SIZE_HEIGHT>>, TRUE) ENDIF ENDIF IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_DROPOFF), <<100,100,60>>) AND GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR SET_HELI_TURBULENCE_SCALAR(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER],0.0) SET_AIRCRAFT_PILOT_SKILL_NOISE_SCALAR(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER],0.0) ELSE SET_HELI_TURBULENCE_SCALAR(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER],1.0) SET_AIRCRAFT_PILOT_SKILL_NOISE_SCALAR(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER],1.0) ENDIF IF IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) IF NOT bForcePassOnShitskip IF NOT bDoneLandSpeech IF NOT bKilledSpeechForLand IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_DROPOFF), GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_DROPOFF_DIMENSIONS)) KILL_ANY_CONVERSATION() bDoneWayHomeSpeech = TRUE bDoneWayHomeSpeech2 = TRUE bDoneGetOffRoofSpeech = TRUE bKilledSpeechForLand = TRUE ENDIF ELSE bDoneLandSpeech = DO_MISSION_SPEECH("FBI2_LAN") ENDIF ELSE IF NOT bDoneLandAudioScene IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() bDoneLandAudioScene = START_SNATCH_AND_GRAB_AUDIO_SCENE(SNATCH_AND_GRAB_AUDIO_SCENE_LAND_THE_HELI) ENDIF ENDIF ENDIF ENDIF // advance mission on arrival FLOAT fLandZ IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR fLandZ = 2 ELSE fLandZ = 2 // 20 ENDIF //IF IS_ENTITY_AT_COORD(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_DROPOFF), <<15,15,fLandZ>>) //OR IS_ENTITY_AT_COORD(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], <<1359.67834, -2077.29883, 50.99810>>, <<11,11,fLandZ>>) IF IS_ENTITY_IN_ANGLED_AREA(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], <<1376.403, -2083.443, 50.998>>, <<1360.366, -2064.322, 50.998 + fLandZ>>, 28) OR IS_ENTITY_IN_ANGLED_AREA(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], <<1374.360, -2059.423, 50.998>>, <<1383.849, -2050.670, 50.998 + fLandZ>>, 10) IF NOT bDoneMissionCompleteCue bDoneMissionCompleteCue = TRIGGER_MISSION_MUSIC_EVENT("FIB2_COMPLETE") ENDIF fAtDropOffTime = fAtDropOffTime +@ 1.0 ELSE fAtDropOffTime = 0.0 bCutsceneWaitStarted = FALSE ENDIF IF NOT bCutsceneWaitStarted IF fAtDropOffTime >= 2.0 AND createFBIAtEndStage = CREATE_FBI_AT_END_STAGE_DONE KILL_ANY_CONVERSATION() bCutsceneWaitStarted = TRUE ENDIF ELSE IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() IF HAS_CUTSCENE_LOADED_WITH_FAILSAFE() bRunningCutscene = TRUE ENDIF ENDIF ENDIF ENDIF ENDIF ELSE SWITCH iHeliFlyOffState CASE 0 IF IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) OR hangingHotswapState = HANGING_HOTSWAP_ON_MICHAEL IF GET_ENTITY_MODEL(PLAYER_PED_ID()) = GET_PLAYER_PED_MODEL(CHAR_TREVOR) IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<1375.57, -2072.22, 51.00>>, <<100,100,100>>, FALSE, FALSE) VECTOR vDest, vDestCamPointPos, vDestCamPos, vChopperPos FLOAT fHeliHeading INT iHeliHeight SET_PLAYER_CONTROL(PLAYER_ID(), FALSE) IF IS_VEHICLE_DRIVEABLE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) vChopperPos = GET_ENTITY_COORDS(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) vDest = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], <<20.0, 300.0, 0.0>>) vDestCamPos = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], <<0.0, 20.0, 0.0>>) vDestCamPointPos = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], <<-150.0, 100.0, 0.0>>) fHeliHeading = GET_ENTITY_HEADING(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) iHeliHeight = ROUND(GET_ENTITY_HEIGHT_ABOVE_GROUND(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER])) //Remove any Z elements (in case the chopper was in a bad orientation when working out the offsets). vDest.z = vChopperPos.z vDestCamPos.z = vChopperPos.z + 20.0 vDestCamPointPos.z = vChopperPos.z + 20.0 IF NOT IS_PED_INJURED(GET_TREVOR_PED()) TASK_HELI_MISSION(GET_TREVOR_PED(), snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], NULL, NULL, vDest, MISSION_GOTO, 30.0, 0.0, fHeliHeading, iHeliHeight, 20) ELSE TASK_HELI_MISSION(PLAYER_PED_ID(), snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], NULL, NULL, vDest, MISSION_GOTO, 30.0, 0.0, fHeliHeading, iHeliHeight, 20) ENDIF ENDIF staticCam = CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SCRIPTED, GET_FINAL_RENDERED_CAM_COORD(), GET_FINAL_RENDERED_CAM_ROT(), GET_FINAL_RENDERED_CAM_FOV(), TRUE) interpCam = CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SCRIPTED, vDestCamPos, GET_FINAL_RENDERED_CAM_ROT(), GET_FINAL_RENDERED_CAM_FOV()) SHAKE_CAM(staticCam, "HAND_SHAKE", 0.2) SHAKE_CAM(interpCam, "HAND_SHAKE", 0.2) POINT_CAM_AT_COORD(interpCam, vDestCamPointPos) SET_CAM_ACTIVE_WITH_INTERP(interpCam, staticCam, 6500, GRAPH_TYPE_ACCEL, GRAPH_TYPE_ACCEL) RENDER_SCRIPT_CAMS(TRUE, FALSE) SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE) DISPLAY_HUD(FALSE) DISPLAY_RADAR(FALSE) bDisableSwitchDuringMagDemoEndScene = TRUE SETTIMERB(0) iHeliFlyOffState++ ENDIF ELSE IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<1375.57, -2072.22, 51.00>>, <<100,100,100>>, FALSE, FALSE) TRIGGER_MISSION_MUSIC_EVENT("FIB2_COMPLETE") DO_SCREEN_FADE_OUT(1000) WHILE NOT IS_SCREEN_FADED_OUT() WAIT(0) ENDWHILE DELETE_ALL_ENTITIES_IN_FADE() MISSION_PASSED() ENDIF ENDIF ENDIF BREAK CASE 1 IF TIMERB() > 5000 TRIGGER_MISSION_MUSIC_EVENT("FIB2_COMPLETE") DO_SCREEN_FADE_OUT(1000) WHILE NOT IS_SCREEN_FADED_OUT() WAIT(0) ENDWHILE DESTROY_ALL_CAMS() RENDER_SCRIPT_CAMS(FALSE, FALSE) SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE) DISPLAY_HUD(TRUE) DISPLAY_RADAR(TRUE) DELETE_ALL_ENTITIES_IN_FADE() MISSION_PASSED() ENDIF BREAK ENDSWITCH /*IF IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) OR hangingHotswapState = HANGING_HOTSWAP_ON_MICHAEL IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<1375.57, -2072.22, 51.00>>, <<100,100,100>>, FALSE, FALSE) TRIGGER_MISSION_MUSIC_EVENT("FIB2_COMPLETE") DO_SCREEN_FADE_OUT(1000) WHILE NOT IS_SCREEN_FADED_OUT() WAIT(0) ENDWHILE DELETE_ALL_ENTITIES_IN_FADE() MISSION_PASSED() ENDIF ENDIF*/ ENDIF ELSE IF GET_GAME_TIMER() >= iTrevorFlyOffTime + 13000 IF DOES_ENTITY_EXIST(sSelectorPeds.pedID[SELECTOR_PED_TREVOR]) SET_PLAYER_PED_WITH_HEADSET(CHAR_TREVOR, FALSE) STORE_PLAYER_PED_VARIATIONS(sSelectorPeds.pedID[SELECTOR_PED_TREVOR], TRUE) printstring("store on trevor") printnl() DELETE_PED(sSelectorPeds.pedID[SELECTOR_PED_TREVOR]) ENDIF IF DOES_ENTITY_EXIST(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN]) DELETE_PED(sSelectorPeds.pedID[SELECTOR_PED_FRANKLIN]) ENDIF IF DOES_ENTITY_EXIST(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) DELETE_VEHICLE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) ENDIF IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) IF IS_VEHICLE_DRIVEABLE(driveAwayVehicle) SET_PLAYERS_LAST_VEHICLE(driveAwayVehicle) ENDIF ENDIF MISSION_PASSED() ENDIF ENDIF ELSE DO_DROPOFF_CUTSCENE() ENDIF ENDPROC // debug only #IF IS_DEBUG_BUILD // create widgets PROC CREATE_SNATCH_AND_GRAB_WIDGETS() /* snatchAndGrabWidgets = START_WIDGET_GROUP("Switch To Sniper Spline") ADD_WIDGET_VECTOR_SLIDER("Prisoner offset", vDebugPrisonerOffset, -20, 20, 0.05) 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) ADD_WIDGET_BOOL("Swing out earlier", bDebugSwingOutEarlier) //ADD_WIDGET_BOOL("Use chopper searchlights", bDebugUseAlternateChopper) ADD_WIDGET_BOOL("Use alternate rappel cam", bDebugUseAlternateRappelCam) // ADD_WIDGET_BOOL("Use ring locate", bDebugSkipMagdemoUseRing) // STOP_WIDGET_GROUP() //sniperSplineWidgets = START_WIDGET_GROUP("Switch To Sniper Spline") // ADD_WIDGET_VECTOR_SLIDER("Node Position 1", vSniperNodePos1, -1000.0, 1000.0, 1.0) // ADD_WIDGET_VECTOR_SLIDER("Node Rotation 1", vSniperNodeRot1, -180.0, 180.0, 1.0) ADD_WIDGET_VECTOR_SLIDER("Node Position 2", vSniperNodePos2, -1000.0, 1000.0, 1.0) ADD_WIDGET_VECTOR_SLIDER("Node Rotation 2", vSniperNodeRot2, -180.0, 180.0, 1.0) ADD_WIDGET_INT_SLIDER("Time from 1 to 2", iSniperNodeTime2, 0, 30000, 1000) ADD_WIDGET_VECTOR_SLIDER("Node Position 3", vSniperNodePos3, -1000.0, 1000.0, 1.0) ADD_WIDGET_VECTOR_SLIDER("Node Rotation 3", vSniperNodeRot3, -180.0, 180.0, 1.0) ADD_WIDGET_INT_SLIDER("Time from 2 to 3", iSniperNodeTime3, 0, 30000, 1000) ////ADD_WIDGET_VECTOR_SLIDER("Node Position 4", vSniperNodePos4, -1000.0, 1000.0, 1.0) //ADD_WIDGET_VECTOR_SLIDER("Node Rotation 4", vSniperNodeRot4, -180.0, 180.0, 1.0) ADD_WIDGET_INT_SLIDER("Time from 3 to 4", iSniperNodeTime4, 0, 30000, 1000) //ADD_WIDGET_VECTOR_SLIDER("Node Position 5", vSniperNodePos5, -1000.0, 1000.0, 1.0) //ADD_WIDGET_VECTOR_SLIDER("Node Rotation 5", vSniperNodeRot5, -180.0, 180.0, 1.0) ADD_WIDGET_INT_SLIDER("Time from 4 to 5", iSniperNodeTime5, 0, 30000, 1000) //ADD_WIDGET_VECTOR_SLIDER("Node Position 6", vSniperNodePos6, -1000.0, 1000.0, 1.0) //ADD_WIDGET_VECTOR_SLIDER("Node Rotation 6", vSniperNodeRot6, -180.0, 180.0, 1.0) ADD_WIDGET_INT_SLIDER("Time from 5 to 6", iSniperNodeTime6, 0, 30000, 1000) CREATE_SWITCH_CAM_SPECIFIC_WIDGETS() STOP_WIDGET_GROUP() SETUP_SPLINE_CAM_NODE_ARRAY_HELI_MICHAEL_TO_FRANKLIN(scsSwitch_Heli_Michael_ToFranklin, GET_MICHAEL_PED(), GET_FRANKLIN_PED()) SETUP_SPLINE_CAM_NODE_ARRAY_HELI_TREVOR_TO_FRANKLIN(scsSwitch_Heli_Trevor_ToFranklin, snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], GET_FRANKLIN_PED()) SETUP_SPLINE_CAM_NODE_ARRAY_FRANKLIN_TO_MICHAEL(scsSwitch_FranklinToHeli_Mike, GET_FRANKLIN_PED(), GET_MICHAEL_PED()) SETUP_SPLINE_CAM_NODE_ARRAY_FRANKLIN_TO_TREVOR(scsSwitch_FranklinToHeli_Trev, GET_FRANKLIN_PED(), snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) SETUP_SPLINE_CAM_NODE_ARRAY_HANGING_TO_SNIPER(scsSwitch_HangingToSniper, GET_FRANKLIN_PED()) SETUP_SPLINE_CAM_NODE_ARRAY_HELI_TREVOR_TO_MICHAEL(scsSwitch_Heli_TrevorToMichael, GET_TREVOR_PED(), GET_MICHAEL_PED()) SETUP_SPLINE_CAM_NODE_ARRAY_HELI_MICHAEL_TO_TREVOR(scsSwitch_Heli_MichaelToTrevor, GET_MICHAEL_PED(), GET_TREVOR_PED()) CREATE_SPLINE_CAM_WIDGETS(scsSwitch_HangingToSniper, "Michael Hanging", "Franklin", snatchAndGrabWidgets) CREATE_SPLINE_CAM_WIDGETS(scsSwitch_Heli_MichaelToTrevor, "Michael", "Trevor", snatchAndGrabWidgets) CREATE_SPLINE_CAM_WIDGETS(scsSwitch_Heli_Michael_ToFranklin, "Michael", "Franklin", snatchAndGrabWidgets) CREATE_SPLINE_CAM_WIDGETS(scsSwitch_FranklinToHeli_Mike, "Franklin", "Mike", snatchAndGrabWidgets) CREATE_SPLINE_CAM_WIDGETS(scsSwitch_FranklinToHeli_Trev, "Franklin", "Trev", snatchAndGrabWidgets) CREATE_SPLINE_CAM_WIDGETS(scsSwitch_Heli_TrevorToMichael, "Trevor", "Michael", snatchAndGrabWidgets) CREATE_SPLINE_CAM_WIDGETS(scsSwitch_Heli_Trevor_ToFranklin, "Trevor", "Franklin", snatchAndGrabWidgets) */ ENDPROC // setup the debug menu PROC SETUP_SNATCH_AND_GRAB_DEBUG_MENU() stageMenu[0].sTxtLabel = GET_DESCRIPTION_FOR_STAGE_AS_STRING(STAGE_FOOD_COURT) stageMenu[1].sTxtLabel = "Cutscene FBI_2_INT" stageMenu[1].bSelectable = FALSE stageMenu[2].sTxtLabel = GET_DESCRIPTION_FOR_STAGE_AS_STRING(STAGE_GET_TO_CHOPPER) stageMenu[3].sTxtLabel = "Cutscene FBI_2_MCS_1" stageMenu[3].bSelectable = FALSE stageMenu[4].sTxtLabel = GET_DESCRIPTION_FOR_STAGE_AS_STRING(STAGE_GET_TO_BUILDING) stageMenu[5].sTxtLabel = "Cutscene FBI_2_MCS_2" stageMenu[5].bSelectable = FALSE stageMenu[6].sTxtLabel = GET_DESCRIPTION_FOR_STAGE_AS_STRING(STAGE_RAPPEL_DOWN) stageMenu[7].sTxtLabel = "Cutscene FBI_2_MCS_3_P1A" stageMenu[7].bSelectable = FALSE stageMenu[8].sTxtLabel = GET_DESCRIPTION_FOR_STAGE_AS_STRING(STAGE_SNIPE_GUARDS) stageMenu[9].sTxtLabel = "Cutscene FBI_2_MCS_3B" stageMenu[9].bSelectable = FALSE stageMenu[10].sTxtLabel = GET_DESCRIPTION_FOR_STAGE_AS_STRING(STAGE_CHOPPER_CHASE) stageMenu[11].sTxtLabel = GET_DESCRIPTION_FOR_STAGE_AS_STRING(STAGE_DROPOFF) stageMenu[12].sTxtLabel = "Cutscene FBI_2_EXT" stageMenu[12].bSelectable = FALSE ENDPROC // debug skips PROC DO_DEBUG_SKIPS() // mission pass S IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_S) IF NOT IS_PED_INJURED(PLAYER_PED_ID()) RESTORE_PLAYER_PED_VARIATIONS(PLAYER_PED_ID()) ENDIF bThoroughCleanup = TRUE IF g_bMagDemoActive DO_SCREEN_FADE_OUT(DEFAULT_FADE_TIME) WHILE NOT IS_SCREEN_FADED_OUT() WAIT(0) ENDWHILE DELETE_ALL_ENTITIES_IN_FADE() ENDIF MISSION_PASSED() ENDIF // mission fail F IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_F) MISSION_FAILED(FAIL_PRISONER_DEAD) ENDIF // skip stage J IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_J) IF NOT bRunningCutscene AND hotswapStage <> MISSION_HOTSWAP_STAGE_DO_SPLINE_CAM IF NOT IS_PED_INJURED(PLAYER_PED_ID()) IF currentMissionStage <> STAGE_RAPPEL_DOWN AND currentMissionStage <> STAGE_SNIPE_GUARDS SET_PLAYER_CONTROL(PLAYER_ID(), TRUE) ENDIF SWITCH currentMissionStage CASE STAGE_FOOD_COURT SET_ENTITY_COORDS(PLAYER_PED_ID(), <<148.61346, -679.18494, 41.02729>>) BREAK CASE STAGE_GET_TO_CHOPPER IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), snatchAndGrabVehicle[SAGV_MICHAEL_CAR]) SET_PLAYER_PED_INTO_SNATCH_AND_GRAB_VEHICLE(SAGV_MICHAEL_CAR, VS_DRIVER) IF NOT IS_PED_INJURED(davePed) IF NOT IS_PED_IN_VEHICLE(davePed, snatchAndGrabVehicle[SAGV_MICHAEL_CAR]) SET_PED_INTO_VEHICLE(davePed, snatchAndGrabVehicle[SAGV_MICHAEL_CAR], VS_FRONT_RIGHT) ENDIF ENDIF ELSE SET_ENTITY_COORDS(snatchAndGrabVehicle[SAGV_MICHAEL_CAR], GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_MEETING_POINT)) ENDIF BREAK CASE STAGE_GET_TO_BUILDING IF IS_VEHICLE_DRIVEABLE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) SET_PLAYER_PED_INTO_SNATCH_AND_GRAB_VEHICLE(SAGV_PLAYER_CHOPPER, VS_DRIVER) IF NOT IS_PED_INJURED(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL]) IF NOT IS_PED_IN_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) SET_PED_INTO_VEHICLE(sSelectorPeds.pedID[SELECTOR_PED_MICHAEL], snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], VS_BACK_LEFT) ENDIF ENDIF IF DOES_BLIP_EXIST(getToBlip) REMOVE_BLIP(getToBlip) ENDIF ELSE KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() SET_ENTITY_COORDS(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_HOVER_TARGET)) ENDIF ENDIF BREAK CASE STAGE_RAPPEL_DOWN IF NOT bInitialisedInterrogation rappelData.vAttachPos.z = rappelData.fLimitZ ELSE KILL_ANY_CONVERSATION() IF NOT bAllowSmashIn SET_SYNCHRONIZED_SCENE_PHASE(iSyncScene, 0.69) STOP_SYNCHRONIZED_AUDIO_EVENT(iSyncScene) ELSE bDebugJSkip = TRUE ENDIF ENDIF BREAK CASE STAGE_SNIPE_GUARDS SWITCH extractStage CASE EXTRACT_STAGE_KILL_INITIAL_GUARDS UPDATE_PRISONER_GRAB(PRISONER_GRAB_STATE_DUCK_LOOPING) KILL_ALL_GUARDS() BREAK CASE EXTRACT_STAGE_REINFORCEMENTS_ENTER KILL_ALL_GUARDS() bCreatedAdditionalReinforcement[0] = TRUE bCreatedAdditionalReinforcement[1] = TRUE bCreatedAdditionalReinforcement[2] = TRUE bCreatedAdditionalReinforcement[3] = TRUE BREAK BREAK ENDSWITCH IF prisonerGrabState = PRISONER_GRAB_STATE_EXTRACT IF NOT bActivatedRopeSwingFromSynced //fTempPhase = 0.98 SET_SYNCHRONIZED_SCENE_PHASE(iSyncScene, 0.98) ENDIF ENDIF BREAK CASE STAGE_CHOPPER_CHASE IF NOT bSpottedChopper IF IS_VEHICLE_DRIVEABLE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) REMOVE_MISSION_TEXT() KILL_ANY_CONVERSATION() STOP_PLAYBACK_RECORDED_VEHICLE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) START_PLAYBACK_RECORDED_VEHICLE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], 002, GET_SNATCH_AND_GRAB_RECORDING_PREFIX()) SKIP_TIME_IN_PLAYBACK_RECORDED_VEHICLE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER], CHASE_SPOT_CHOPPER_TIME) fPlaybackTime = CHASE_SPOT_CHOPPER_TIME ENDIF ENDIF REMOVE_ALL_BLIPS() bShownChopperPrompt = TRUE ELSE //IF IS_VEHICLE_DRIVEABLE(enemyChopperVehicle) // EXPLODE_VEHICLE(enemyChopperVehicle) //ENDIF INT i REPEAT COUNT_OF(enemyChopperPed) i IF NOT IS_PED_INJURED(enemyChopperPed[i]) APPLY_DAMAGE_TO_PED(enemyChopperPed[i], 1000, TRUE) ENDIF ENDREPEAT bDoneGetOutSpeech = TRUE bShownChopperPrompt = TRUE ENDIF BREAK CASE STAGE_DROPOFF IF GET_CURRENT_PLAYER_PED_ENUM() <> CHAR_TREVOR sSelectorPeds.eNewSelectorPed = SELECTOR_PED_TREVOR bDebugJSkip = TRUE ELSE IF IS_VEHICLE_DRIVEABLE(snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), snatchAndGrabVehicle[SAGV_PLAYER_CHOPPER]) SET_PLAYER_PED_INTO_SNATCH_AND_GRAB_VEHICLE(SAGV_PLAYER_CHOPPER, VS_DRIVER) ELSE KILL_ANY_CONVERSATION() bDoneWayHomeSpeech = TRUE bDoneGetOffRoofSpeech = TRUE bDoneLandSpeech = TRUE SET_PED_COORDS_KEEP_VEHICLE(PLAYER_PED_ID(), GET_SNATCH_AND_GRAB_VECTOR(SAGVEC_DROPOFF)) SET_PLAYER_CONTROL(PLAYER_ID(), FALSE) ENDIF ENDIF 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 IF IS_CUTSCENE_PLAYING() STOP_CUTSCENE() WHILE IS_CUTSCENE_PLAYING() WAIT(0) ENDWHILE ENDIF DO_SCREEN_FADE_OUT(500) WHILE NOT IS_SCREEN_FADED_OUT() WAIT(0) ENDWHILE COMMON_MISSION_CLEAR() TRIGGER_MUSIC_EVENT("FIB2_DEATH_FAIL") SWITCH currentMissionStage CASE STAGE_GET_TO_CHOPPER //POSITION_PLAYER_AT_MISSION_INIT(TRUE) SET_MISSION_STAGE(STAGE_GET_TO_CHOPPER, TRUE) BREAK CASE STAGE_GET_TO_BUILDING //POSITION_PLAYER_AT_MISSION_INIT(TRUE) SET_MISSION_STAGE(STAGE_GET_TO_CHOPPER, TRUE) BREAK CASE STAGE_RAPPEL_DOWN SET_MISSION_STAGE(STAGE_GET_TO_BUILDING, TRUE) BREAK CASE STAGE_SNIPE_GUARDS SET_MISSION_STAGE(STAGE_RAPPEL_DOWN, TRUE) BREAK CASE STAGE_CHOPPER_CHASE SET_MISSION_STAGE(STAGE_SNIPE_GUARDS, TRUE) BREAK CASE STAGE_DROPOFF SET_MISSION_STAGE(STAGE_CHOPPER_CHASE, TRUE) BREAK ENDSWITCH DO_SCREEN_FADE_IN(500) ENDIF ENDIF // stage menu IF NOT IS_PED_INJURED(PLAYER_PED_ID()) AND hotswapStage <> MISSION_HOTSWAP_STAGE_DO_SPLINE_CAM AND NOT bRunningCutscene IF LAUNCH_MISSION_STAGE_MENU(stageMenu, iMenuMissionStage) DO_SCREEN_FADE_OUT(500) WHILE NOT IS_SCREEN_FADED_OUT() WAIT(0) ENDWHILE COMMON_MISSION_CLEAR() TRIGGER_MUSIC_EVENT("FIB2_DEATH_FAIL") // convert debug stage to mission stage MISSION_STAGE_ENUM setStage SWITCH iMenuMissionStage CASE 0 setStage = STAGE_FOOD_COURT BREAK CASE 2 setStage = STAGE_GET_TO_CHOPPER BREAK CASE 4 setStage = STAGE_GET_TO_BUILDING BREAK CASE 6 setStage = STAGE_RAPPEL_DOWN BREAK CASE 8 setStage = STAGE_SNIPE_GUARDS BREAK CASE 10 setStage = STAGE_CHOPPER_CHASE BREAK CASE 11 setStage = STAGE_DROPOFF BREAK ENDSWITCH IF setStage = STAGE_GET_TO_CHOPPER IF NOT g_bMagDemoActive // POSITION_PLAYER_AT_MISSION_INIT(TRUE) ELSE bDebugSkipMagdemoStart = TRUE ENDIF ENDIF IF g_bMagDemoActive bDebugSkipMagdemoZskipped = TRUE ENDIF SET_MISSION_STAGE(setStage, TRUE) DO_SCREEN_FADE_IN(500) ENDIF 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) 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 //FLOAT fDof = 1.0 // main script SCRIPT // Keep the radio off - COMMENTED OUT 263828 //SET_FRONTEND_RADIO_ACTIVE(FALSE) //BREAK_ON_NATIVE_COMMAND("CLEAR_AREA", FALSE) SET_MISSION_FLAG(TRUE) IF HAS_FORCE_CLEANUP_OCCURRED() Mission_Flow_Mission_Force_Cleanup() MISSION_CLEANUP() ENDIF #IF IS_DEBUG_BUILD CREATE_SNATCH_AND_GRAB_WIDGETS() SETUP_SNATCH_AND_GRAB_DEBUG_MENU() #ENDIF // for magdemo IF g_bMagDemoActive IF NOT IS_PED_INJURED(PLAYER_PED_ID()) SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 0) SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID()) IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) VEHICLE_INDEX pVehicle = GET_VEHICLE_PED_IS_USING(PLAYER_PED_ID()) IF IS_VEHICLE_DRIVEABLE(pVehicle) SET_ENTITY_AS_MISSION_ENTITY(pVehicle, TRUE, TRUE) IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(pVehicle) // STOP_PLAYBACK_RECORDED_VEHICLE(pVehicle) PRINTSTRING("fbi2.STOP_PLAYBACK_RECORDED_VEHICLE(scene_veh)") PRINTNL() ELSE PRINTSTRING("fbi2.no need(scene_veh)") PRINTNL() ENDIF PED_INDEX pPed = GET_PED_IN_VEHICLE_SEAT(pVehicle, VS_FRONT_RIGHT) IF NOT IS_PED_INJURED(pPed) SET_ENTITY_AS_MISSION_ENTITY(pPed, TRUE, TRUE) ELSE PRINTSTRING("failed to pick up dave - injured!") PRINTNL() ENDIF ELSE PRINTSTRING("failed to pick up tailgater - not driveable!") PRINTNL() ENDIF ELSE PRINTSTRING("failed to pick up tailgater - not in any vehicle!") PRINTNL() ENDIF ENDIF IF DOES_ENTITY_EXIST(g_sMagDemoFBI2Entities.heliVehicle) SET_ENTITY_AS_MISSION_ENTITY(g_sMagDemoFBI2Entities.heliVehicle, TRUE, TRUE) ELSE PRINTSTRING("failed to pick up heli - doesn't exist!") PRINTNL() ENDIF IF DOES_ENTITY_EXIST(g_sMagDemoFBI2Entities.bikeVehicle) SET_ENTITY_AS_MISSION_ENTITY(g_sMagDemoFBI2Entities.bikeVehicle, TRUE, TRUE) ELSE PRINTSTRING("failed to pick up bike - doesn't exist!") PRINTNL() ENDIF IF DOES_ENTITY_EXIST(g_sMagDemoFBI2Entities.trevorPed) SET_ENTITY_AS_MISSION_ENTITY(g_sMagDemoFBI2Entities.trevorPed, TRUE, TRUE) ELSE PRINTSTRING("failed to pick up trevor - doesn't exist!") PRINTNL() ENDIF IF DOES_ENTITY_EXIST(g_sMagDemoFBI2Entities.fibPed) SET_ENTITY_AS_MISSION_ENTITY(g_sMagDemoFBI2Entities.fibPed, TRUE, TRUE) ELSE PRINTSTRING("failed to pick up agent - doesn't exist!") PRINTNL() ENDIF IF DOES_ENTITY_EXIST(g_sMagDemoFBI2Entities.franklinPed) SET_ENTITY_AS_MISSION_ENTITY(g_sMagDemoFBI2Entities.franklinPed, TRUE, TRUE) ELSE PRINTSTRING("failed to pick up franklin - doesn't exist!") PRINTNL() ENDIF IF DOES_ENTITY_EXIST(g_sMagDemoFBI2Entities.truck01Vehicle) SET_ENTITY_AS_MISSION_ENTITY(g_sMagDemoFBI2Entities.truck01Vehicle, TRUE, TRUE) ELSE PRINTSTRING("failed to pick up truck1 - doesn't exist!") PRINTNL() ENDIF IF DOES_ENTITY_EXIST(g_sMagDemoFBI2Entities.truck02Vehicle) SET_ENTITY_AS_MISSION_ENTITY(g_sMagDemoFBI2Entities.truck02Vehicle, TRUE, TRUE) ELSE PRINTSTRING("failed to pick up truck2 - doesn't exist!") PRINTNL() ENDIF IF DOES_ENTITY_EXIST(g_sMagDemoFBI2Entities.fibVehicle) SET_ENTITY_AS_MISSION_ENTITY(g_sMagDemoFBI2Entities.fibVehicle, TRUE, TRUE) ELSE PRINTSTRING("failed to pick up fibvehicle - doesn't exist!") PRINTNL() ENDIF ENDIF bAlternateChopper = FALSE bShortRope = FALSE bShortRope=bShortRope fUpwardsForce=fUpwardsForce iSpinModifier=iSpinModifier fSpinForce=fSpinForce bReattachedMichael = bReattachedMichael iCutsceneTriggerTime=iCutsceneTriggerTime INIT_PC_SCRIPTED_CONTROLS("Rappelling") WHILE TRUE REPLAY_CHECK_FOR_EVENT_THIS_FRAME(GET_RECORD_PREFIX()) IF INIT_MISSION() IF NOT IS_PED_INJURED(PLAYER_PED_ID()) // do streaming for next stage DO_STREAMING_FOR_NEXT_MISSION_STAGE(FALSE) // do fail state #IF IS_DEBUG_BUILD IF NOT bSwitchCamDebugScenarioEnabled #ENDIF HANDLE_MISSION_FAIL_STATE() #IF IS_DEBUG_BUILD ENDIF #ENDIF // head tracking HANDLE_BUDDY_HEAD_TRACK_WHILE_ENTERING_VEHICLE() // run appropriate stage SWITCH currentMissionStage CASE STAGE_FOOD_COURT DO_STAGE_FOOD_COURT() BREAK CASE STAGE_GET_TO_CHOPPER DO_STAGE_GET_TO_CHOPPER() BREAK CASE STAGE_GET_TO_BUILDING DO_STAGE_GET_TO_BUILDING() BREAK CASE STAGE_RAPPEL_DOWN DO_STAGE_RAPPEL_DOWN() BREAK CASE STAGE_SNIPE_GUARDS DO_STAGE_SNIPE_GUARDS() BREAK CASE STAGE_CHOPPER_CHASE DO_STAGE_CHOPPER_CHASE() BREAK CASE STAGE_DROPOFF DO_STAGE_DROPOFF() BREAK ENDSWITCH ENDIF #IF IS_DEBUG_BUILD IF CAN_ADVANCE_MISSION() DO_DEBUG_SKIPS() ENDIF DO_RB_DEBUG_CAM_DUMP() // UPDATE_SPLINE_CAM_WIDGETS(scsSwitch_FranklinToHeli_Mike) // UPDATE_SPLINE_CAM_WIDGETS(scsSwitch_FranklinToHeli_Trev) // UPDATE_SPLINE_CAM_WIDGETS(scsSwitch_HangingToSniper) // UPDATE_SPLINE_CAM_WIDGETS(scsSwitch_Heli_Michael_ToFranklin) // UPDATE_SPLINE_CAM_WIDGETS(scsSwitch_Heli_MichaelToTrevor) // UPDATE_SPLINE_CAM_WIDGETS(scsSwitch_Heli_Trevor_ToFranklin) // UPDATE_SPLINE_CAM_WIDGETS(scsSwitch_Heli_TrevorToMichael) // HANDLE_SWITCH_CAM_SPECIFIC_WIDGETS() #ENDIF ENDIF WAIT(0) ENDWHILE ENDSCRIPT