//+-----------------------------------------------------------------------------+ //¦ Author: Rob Bray Date: 21/02/11 ¦ //¦-----------------------------------------------------------------------------¦ //¦ ¦ //¦ ¦ //¦ Franklin 0: Foot Chase ¦ //¦ ¦ //¦ ¦ //+-----------------------------------------------------------------------------+ //Compile out Title Update changes to header functions. //Must be before includes. //CONST_INT USE_TU_CHANGES 0 // Removed by Kenneth R. CONST_INT TOTAL_NUMBER_OF_TRAFFIC_CARS 51 CONST_INT TOTAL_NUMBER_OF_PARKED_CARS 1 CONST_INT TOTAL_NUMBER_OF_SET_PIECE_CARS 15 CONST_INT MAX_NUMBER_OF_TRAFFIC_CARS_PLAYING_BACK 8 CONST_INT MAX_NUMBER_OF_SET_PIECE_CARS_PLAYING_BACK 8 CONST_INT MAX_NUMBER_OF_PARKED_CARS_PLAYING_BACK 6 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 "selector_public.sch" USING "dialogue_public.sch" USING "cellphone_public.sch" USING "flow_public_core_override.sch" USING "flow_help_public.sch" USING "chase_hint_cam.sch" CHASE_HINT_CAM_STRUCT localChaseHintCamStruct USING "script_ped.sch" USING "script_blips.sch" USING "script_buttons.sch" USING "select_mission_stage.sch" USING "traffic.sch" USING "replay_public.sch" USING "cutscene_public.sch" USING "cam_recording_public.sch" USING "mission_stat_public.sch" USING "vehicle_gen_public.sch" USING "chop_cam_public.sch" USING "clearMissionArea.sch" USING "CompletionPercentage_public.sch" USING "social_public.sch" USING "locates_public.sch" USING "chop_van_public.sch" USING "timelapse.sch" USING "fake_cellphone_public.sch" USING "cheat_controller_public.sch" USING "commands_recording.sch" // 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_GET_TO_BAD_GUY = 0, STAGE_VAN_CHASE, STAGE_FOOT_CHASE, STAGE_FIND_BAD_GUY, STAGE_GET_TO_HOUSE ENDENUM ENUM FAIL_REASON_ENUM FAIL_FRANKLIN_DEAD = 0, FAIL_LAMAR_DEAD, FAIL_CHOP_DEAD, FAIL_LOST_BAD_GUY, FAIL_KILLED_BAD_GUY, FAIL_VAN_DESTROYED, FAIL_SPOOKED_BAD_GUY, FAIL_ABANDONED_LAMAR, FAIL_ABANDONED_VAN, FAIL_ABANDONED_CHOP, FAIL_VAN_STUCK, FAIL_POLICE_ATTENTION ENDENUM ENUM MISSION_FAIL_STATE_ENUM MISSION_FAIL_STATE_NOT_FAILED = 0, MISSION_FAIL_STATE_WAIT_FOR_FADE ENDENUM ENUM MISSION_HOTSWAP_STAGE_ENUM MISSION_HOTSWAP_STAGE_SELECT_CHARACTER = 0, MISSION_HOTSWAP_STAGE_DO_SPLINE_CAM 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 HOOD_MODEL_ENUM HM_FRANKLIN = 0, HM_LAMAR, HM_BAD_GUY, HM_CHOP, HM_COLLIE, HM_GIRL, HM_WORKER, HM_FRANKLIN_VAN, HM_BIKE, HM_TRAFFIC_CAR1, HM_TRAFFIC_CAR2, HM_BUS, HM_TRAILER, HM_ENGINE, HM_TANKER_CARRIAGE, HM_CONTAINER_CARRIAGE, HM_BLOCKING_TRUCK, HM_BLOCKING_CAR, HM_BOXCAR_DOOR, HM_BOXCAR_HANDLE, HM_LAMAR_PHONE, HM_FRANKLIN_MASK, HM_ANCHOR, HM_START_VEHICLE ENDENUM ENUM HOOD_VECTOR_ENUM HVEC_FRANKLIN_VAN_INIT = 0, HVEC_PLAYER_INIT, HVEC_BAD_GUY_HANGOUT, HVEC_HOUSE, HVEC_REC, HVEC_FOOT_CHASE_INIT, HVEC_VAN_CHASE_INIT, HVEC_DRIVE_INIT, HVEC_VAN_IN_ALLEY, HVEC_CONTAINER_ATTACH_ROT, HVEC_GIRL_INIT, HVEC_FRANKLIN_ALLEY_INIT, HVEC_LAMAR_WALK_INIT, HVEC_LAMAR_ALLEY_INIT, HVEC_RUNNER_CHASE_INIT, HVEC_CHOP_WALK_INIT, HVEC_CHOP_CHASE_INIT, HVEC_OFF_ROOF, HVEC_CHASE_TRAIN, HVEC_TRAINYARD, HVEC_LOSE_RUNNER, HVEC_RUNNER_HIDE, HVEC_FIND_GANGSTER, HVEC_CHOP_FIND_INIT, HVEC_COLLIE_INIT, HVEC_CHOP_HUMP_ENTRY, HVEC_CHOP_BEHAVIOUR_SETPIECE_LAUNCH, HVEC_CHOP_BEHAVIOUR_SETPIECE_TERMINATE, HVEC_BLIP_ALLEY, HVEC_LAMAR_SPRINT_TO_VAN, HVEC_MOVE_LAST_PLAYER_VEHICLE, HVEC_VAN_HIDDEN ENDENUM ENUM HOOD_VEHICLE_ENUM HV_FRANKLIN_VAN = 0, HV_BAD_GUY_BIKE ENDENUM ENUM HOOD_SHOT_DETAILS_ENUM H_SHOT_FLIRT = 0, H_SHOT_FLIRTB, H_SHOT_SHOUT, H_SHOT_SHOUTB, H_SHOT_ESCAPE, H_SHOT_ESCAPEB, H_SHOT_LAMAR_SHOUT, H_SHOT_LAMAR_SHOUTB, H_SHOT_CRASH, H_SHOT_LEAVE_CAR, H_SHOT_OFF_ROOF, H_SHOT_OFF_ROOFB, H_SHOT_THROUGH_FENCE, H_SHOT_THROUGH_FENCEB, H_SHOT_ONTO_TRAIN, H_SHOT_ONTO_TRAINB, H_SHOT_LOST, H_SHOT_LOSTB, H_SHOT_FIND, H_SHOT_FINDB, H_SHOT_BOXCAR_FLEE, H_SHOT_TRAPPED, H_SHOT_TRAPPEDB, H_SHOT_INTO_VAN, H_SHOT_INTO_VANB, H_SHOT_HOUSE ENDENUM ENUM HOOD_ANIM_DICT_ENUM //H_ANIM_DICT_MISSION = 0, //H_ANIM_DICT_TAKEDOWN, H_ANIM_DICT_SHARED = 0, H_ANIM_DICT_TO_VAN, H_ANIM_DICT_FOOT_CHASE, H_ANIM_DICT_FIND, H_ANIM_DICT_DRIVE_HOME, H_ANIM_DICT_CHOP_VAN //H_ANIM_DICT_GESTURE_ENT, //H_ANIM_DICT_GESTURE_IDLE1, //H_ANIM_DICT_GESTURE_IDLE2, //H_ANIM_DICT_GESTURE_EXT //H_ANIM_DICT_TAXI ENDENUM ENUM HOOD_WEAPON_ENUM H_WEAPON_PISTOL = 0 ENDENUM ENUM HOOD_PTFX_ENUM H_PTFX_SCRIPT = 0 ENDENUM ENUM HOOD_SFX_ENUM H_SFX_BOXCARS = 0, H_SFX_GENERAL ENDENUM ENUM HOOD_MISC_ASSET_ENUM H_MISC_ASSET_VAN_ANIMS = 0, H_MISC_ASSET_INJURED_CLIPSET, H_MISC_ASSET_FAKE_CELLPHONE, H_MISC_ASSET_GESTURES //H_MISC_ASSET_CHOP_CAM_SFX ENDENUM ENUM HOOD_CUTSCENE_STAGE_ENUM H_CUT_STAGE_INIT = 0, H_CUT_STAGE_RUNNING, H_CUT_STAGE_CLEANUP ENDENUM ENUM ONTO_TRAIN_SHOT_ENUM ONTO_TRAIN_JUMP = 0, ONTO_TRAIN_LOSE ENDENUM ENUM LET_OUT_SHOT_ENUM LET_OUT_PHONE = 0, LET_OUT_DOOR ENDENUM ENUM CHASE_SPEED_STAGE_ENUM CHASE_SPEED_START = 0, CHASE_SPEED_ROUND_FIRST_CORNER, CHASE_SPEED_DOWN_HILL, CHASE_SPEED_THROUGH_JUNCTION, CHASE_SPEED_FOR_SHARP_TURN, CHASE_SPEED_CATCH_BACK_UP, CHASE_SPEED_UNDER_HIGHWAY, CHASE_SPEED_TO_ALLEY, CHASE_SPEED_ALLEY_CORNER, CHASE_SPEED_IN_ALLEY ENDENUM ENUM RUNNER_STAGE_ENUM RUNNER_START_FLEE = 0, RUNNER_TO_CONTAINER, RUNNER_TO_CAR, RUNNER_TO_FENCE, RUNNER_TO_FLATBEDS, RUNNER_TO_BOXCAR, RUNNER_TO_TRAIN, RUNNER_DONE ENDENUM ENUM CHOP_STAGE_ENUM CHOP_START_CHASE = 0, CHOP_TO_ROOF_EDGE, CHOP_TO_CAR, CHOP_TO_FENCE, CHOP_TO_FLATBEDS, CHOP_TO_BOXCAR, CHOP_TO_TRAIN, CHOP_DONE ENDENUM ENUM SETPIECE_STAGE_ENUM SETPIECE_FREE_INTO_STATION = 0, SETPIECE_LOCK_BUS_REVERSING, SETPIECE_FREE_TO_ROOF, SETPIECE_LOCK_CAR_SLIDE, SETPIECE_FREE_ACROSS_CONSTRUCTION, SETPIECE_LOCK_TRAIN_CUT_ACROSS, SETPIECE_FREE_THROUGH_CARRIAGES, SETPIECE_FREE_BACK_OF_CARRIAGES, SETPIECE_LOCK_TRAIN_JUMP ENDENUM ENUM CHASE_ANIM_ENUM CHASE_ANIM_NONE = -1, CHASE_ANIM_G_TOP_FENCE, CHASE_ANIM_G_DOWN_CONTAINER, CHASE_ANIM_G_OVER_CAR, CHASE_ANIM_G_OVER_YARD_FENCE, CHASE_ANIM_G_FLATBEDS, CHASE_ANIM_G_BOXCAR, CHASE_ANIM_G_WAITING_ON_GROUND, CHASE_ANIM_G_GET_UP_FROM_GROUND, CHASE_ANIM_G_ONTO_TRAIN, CHASE_ANIM_F_OFF_ROOF, CHASE_ANIM_F_THROUGH_YARD_FENCE, CHASE_ANIM_C_TOP_FENCE, CHASE_ANIM_C_OFF_ROOF, CHASE_ANIM_C_OVER_CAR, CHASE_ANIM_C_FLATBEDS, CHASE_ANIM_C_BOXCAR, CHASE_ANIM_BAD ENDENUM ENUM CHASE_STATE_ENUM CHASE_STATE_MOVING = 0, CHASE_STATE_PERFORMING_ANIM ENDENUM ENUM RUNNER_FOLLOW_TYPE_ENUM RUNNER_FOLLOW_WAYPOINT = 0, RUNNER_FOLLOW_STRAIGHT, RUNNER_FOLLOW_SPECIAL ENDENUM ENUM YARD_VEHICLE_ENUM //YV_CAR_CARPARK_COME_ROUND_CORNER = 0, YV_CAR_CARPARK_PULL_OUT_FOR_JUMP_OVER = 0, //YV_CAR_STATION_PULL_OUT_TO_LEAVE, YV_CAR_STATION_PULL_INTO_DEPOT, //YV_CAR_ROAD_FROM_RIGHT, YV_BUS_ROAD_FROM_LEFT, YV_CAR_CARPARK_STATIC, YV_BUS_REVERSE, YV_BUS_PULL_OUT, YV_BUS_STATIC ENDENUM ENUM YARD_PED_ENUM YP_STATION_WALK_TO_GATE = 0, YP_STATION_CONV_KNOCK_OVER, YP_STATION_CONV_LOOK, YP_STATION_BACK_TURNED_KNOCK_OVER, //YP_CONSTRUCT_CONV_LOOK1, //YP_CONSTRUCT_CONV_LOOK2, YP_CONSTRUCT_WALK_SOUTH, YP_CONSTRUCT_WALK_NORTH ENDENUM ENUM YARD_PED_TRIGGER_ENUM YARD_PED_TRIGGER_TIME = 0, YARD_PED_TRIGGER_PROXIMITY, YARD_PED_TRIGGER_DEPENDENCY ENDENUM ENUM YARD_PED_STATE_ENUM YARD_PED_STATE_IDLE = 0, YARD_PED_STATE_TALKING, YARD_PED_STATE_ENTER_SHOCKED, YARD_PED_STATE_LOOPING_SHOCKED, YARD_PED_STATE_EXIT_SHOCKED, YARD_PED_STATE_WALKING, YARD_PED_STATE_RAGDOLL, YARD_PED_STATE_TURN_TO_FACE, YARD_PED_STATE_WANDER, YARD_PED_STATE_FLEE ENDENUM ENUM BOXCAR_DOOR_STATE_ENUM BOXCAR_DOOR_AWAITING_PLAYER = 0, BOXCAR_DOOR_TRIGGERED, BOXCAR_DOOR_OPENING, BOXCAR_DOOR_OPEN ENDENUM ENUM CHOP_BEHAVIOUR_SETPIECE_STAGE_ENUM CBS_NOT_STARTED = 0, CBS_WAIT_FOR_FRANKLIN, CBS_SPOT_COLLIE, CBS_GO_TO_COLLIE, CBS_HUMP_AWAY, CBS_OBEY, CBS_RETURN, CBS_DONE ENDENUM ENUM UBER_TRAILER_STATE_ENUM UBER_TRAILER_NOT_CREATED = 0, UBER_TRAILER_STREAMING, UBER_TRAILER_CREATED, UBER_TRAILER_REMOVED ENDENUM ENUM LAMAR_PHONE_STATE_ENUM LAMAR_PHONE_STATE_NOT_STARTED = 0, LAMAR_PHONE_STATE_PRE_CALL, LAMAR_PHONE_STATE_PHONE_UP, LAMAR_PHONE_STATE_ON_PHONE, LAMAR_PHONE_STATE_PHONE_DOWN, LAMAR_PHONE_STATE_POST_CALL, LAMAR_PHONE_STATE_SNATCH, LAMAR_PHONE_STATE_DONE ENDENUM ENUM CHOP_HUMP_STATE_ENUM CHOP_HUMP_STATE_NOT_STARTED = 0, CHOP_HUMP_STATE_ENTERING, CHOP_HUMP_STATE_LOOPING, CHOP_HUMP_STATE_EXITING, CHOP_HUMP_STATE_DONE ENDENUM ENUM CHOP_SNIFF_STATE_ENUM CHOP_SNIFF_STATE_NOT_STARTED = 0, CHOP_SNIFF_STATE_SLOW_DOWN, CHOP_SNIFF_STATE_STOPPED, CHOP_SNIFF_STATE_PLAYING_ANIM, CHOP_SNIFF_STATE_WAIT_AT_BOXCAR ENDENUM ENUM CHOP_WAIT_STATE_ENUM CHOP_WAIT_STATE_NOT_STARTED = 0, CHOP_WAIT_STATE_SLOW_TO_STOP, CHOP_WAIT_STATE_WAITING, CHOP_WAIT_STATE_DONE ENDENUM ENUM CHOP_AUDIO_CONTEXT_ENUM CHOP_AUDIO_CONTEXT_BARK = 0, CHOP_AUDIO_CONTEXT_GROWL, CHOP_AUDIO_CONTEXT_ATTACK, CHOP_AUDIO_CONTEXT_SNARL, CHOP_AUDIO_CONTEXT_LICKS_MOUTH, CHOP_AUDIO_CONTEXT_PANT, CHOP_AUDIO_CONTEXT_SNIFF, CHOP_AUDIO_CONTEXT_PLAYFUL, CHOP_AUDIO_CONTEXT_WHINE_SHORT, CHOP_AUDIO_CONTEXT_WHINE_LONG, CHOP_AUDIO_CONTEXT_WHINE_STOP ENDENUM ENUM CHOP_AUDIO_STATE_ENUM CHOP_AUDIO_STATE_WALK_TO_VAN = 0, CHOP_AUDIO_STATE_IN_VAN_PLACID, CHOP_AUDIO_STATE_IN_VAN_AGITATED, CHOP_AUDIO_STATE_IN_VAN_GUARDING, CHOP_AUDIO_STATE_CHASING, CHOP_AUDIO_STATE_SEARCHING, CHOP_AUDIO_STATE_RUNNING_TO_HUMP, CHOP_AUDIO_STATE_HUMPING, CHOP_AUDIO_STATE_FOUND_SOMETHING, CHOP_AUDIO_STATE_WAITING ENDENUM ENUM DROPOFF_STAGE_ENUM DROPOFF_STAGE_NOT_STARTED = 0, DROPOFF_STAGE_BRIEF, DROPOFF_STAGE_BANTER, DROPOFF_STAGE_PRE_CALL, DROPOFF_STAGE_CALL, DROPOFF_STAGE_POST_CALL, DROPOFF_STAGE_STOP_VAN, DROPOFF_STAGE_END ENDENUM ENUM DRIVER_OUT_STATE_ENUM DRIVER_OUT_INACTIVE = 0, DRIVER_OUT_WAIT, DRIVER_OUT_LEAVE_VEHICLE, DRIVER_OUT_GET_HEADING, DRIVER_OUT_INTO_ANIM, DRIVER_OUT_PLAY_ANIM, DRIVER_OUT_DONE, DRIVER_OUT_FLEE ENDENUM ENUM FRANKLIN_WARP_ENUM FRANKLIN_WARP_TOP_FENCE = 0, FRANKLIN_WARP_FLATBEDS, FRANKLIN_WARP_BOXCAR ENDENUM ENUM VAN_CAMERA_ENUM VAN_CAMERA_REAR = 0, VAN_CAMERA_FRONT ENDENUM ENUM CREATE_POST_INTRO_STAGE_ENUM CREATE_POST_INTRO_STAGE_NOT_STARTED = 0, CREATE_POST_INTRO_STAGE_WAITING, CREATE_POST_INTRO_STAGE_DONE ENDENUM ENUM CREATE_BAD_GUY_STAGE_ENUM CREATE_BAD_GUY_STAGE_NOT_STARTED = 0, CREATE_BAD_GUY_STAGE_WAITING1, CREATE_BAD_GUY_STAGE_WAITING2, CREATE_BAD_GUY_STAGE_WAITING3, CREATE_BAD_GUY_STAGE_CREATE_GIRL, CREATE_BAD_GUY_STAGE_DONE ENDENUM ENUM CREATE_BLOCKING_VEHICLES_STAGE_ENUM CREATE_BLOCKING_VEHICLES_STAGE_NOT_STARTED = 0, CREATE_BLOCKING_VEHICLES_STAGE_WAITING1, CREATE_BLOCKING_VEHICLES_STAGE_WAITING2, CREATE_BLOCKING_VEHICLES_STAGE_DONE ENDENUM ENUM CRASH_TRIGGER_STATE_ENUM CRASH_TRIGGER_WAITING = 0, CRASH_TRIGGER_SLOW_DOWN, CRASH_TRIGGER_GET_CHOP_OUT, CRASH_TRIGGER_RUN ENDENUM ENUM CREATE_YARD_STAGE_ENUM CREATE_YARD_STAGE_NOT_STARTED = 0, CREATE_YARD_STAGE_WAITING, CREATE_YARD_STAGE_DONE ENDENUM ENUM CREATE_CARS_STAGE_ENUM CREATE_CARS_STAGE_NOT_STARTED = 0, CREATE_CARS_STAGE_WAITING, CREATE_CARS_STAGE_DONE ENDENUM ENUM CREATE_TRAINS_STAGE_ENUM CREATE_TRAINS_STAGE_NOT_STARTED = 0, CREATE_TRAINS_STAGE_WAITING, CREATE_TRAINS_STAGE_DONE ENDENUM ENUM CARRIAGE_SEARCH_STATE_ENUM CARRIAGE_SEARCH_STATE_NOT_BLIPPED = 0, CARRIAGE_SEARCH_STATE_BLIPPED, CARRIAGE_SEARCH_STATE_SEARCHED ENDENUM ENUM OPEN_TARGET_CONTAINER_STATE_ENUM OPEN_TARGET_CONTAINER_STATE_NOT_STARTED = 0, OPEN_TARGET_CONTAINER_STATE_OPENING, OPEN_TARGET_CONTAINER_STATE_ESCAPING ENDENUM ENUM CHOP_INTO_VAN_STATE_ENUM CHOP_INTO_VAN_STATE_NOT_STARTED = 0, CHOP_INTO_VAN_WALK_ROUND_BACK, CHOP_INTO_VAN_STATE_GET_IN_POSITION, CHOP_INTO_VAN_STATE_PLAYING, CHOP_INTO_VAN_STATE_DONE ENDENUM ENUM BALLA_DISCOVERED_STATE_ENUM BALLA_DISCOVERED_STATE_NOT_STARTED = 0, BALLA_DISCOVERED_STATE_DOOR_OPENING, BALLA_DISCOVERED_STATE_LEAVE_BOXCAR, BALLA_DISCOVERED_STATE_ESCAPING ENDENUM ENUM RUN_HELP_STATE_ENUM RUN_HELP_STATE_NOT_STARTED = 0, RUN_HELP_PART_2, RUN_HELP_STATE_DONE ENDENUM ENUM FRANKLIN_MASK_REMOVE_STATE_ENUM FRANKLIN_MASK_REMOVE_STATE_NOT_STARTED = 0, FRANKLIN_MASK_REMOVE_STATE_PLAYING_ANIM, FRANKLIN_MASK_REMOVE_STATE_PUTTING_AWAY, FRANKLIN_MASK_REMOVE_STATE_DONE ENDENUM ENUM CALL_CHOP_BACK_STATE_ENUM CALL_CHOP_BACK_STATE_NOT_STARTED = 0, CALL_CHOP_BACK_STATE_QUEUED, CALL_CHOP_BACK_STATE_SUCCESS ENDENUM ENUM HOOD_AUDIO_SCENE_ENUM HOOD_AUDIO_SCENE_WALK_TO_VAN = 0, HOOD_AUDIO_SCENE_DRIVE_TO_VINEWOOD, HOOD_AUDIO_SCENE_CAR_CHASE, HOOD_AUDIO_SCENE_FOOT_CHASE_START, HOOD_AUDIO_SCENE_BREAK_THROUGH_FENCE, HOOD_AUDIO_SCENE_D_ESCAPES, HOOD_AUDIO_SCENE_SEARCH_BOXCARS, HOOD_AUDIO_SCENE_DRIVE_TO_LAMARS, HOOD_AUDIO_SCENE_TAKE_LAMAR_BACK, HOOD_AUDIO_SCENE_CHOP_CAM, HOOD_AUDIO_SCENE_FOCUS_CAM ENDENUM ENUM CHOP_BYPASS_FENCE_STATE_ENUM CHOP_BYPASS_FENCE_NOT_STARTED = 0, CHOP_BYPASS_FENCE_PERFORMING_BYPASS, CHOP_BYPASS_FENCE_DONE ENDENUM ENUM GRAB_SCENARIO_PED_STATE_ENUM GRAB_SCENARIO_PED_STATE_NOT_GRABBED = 0, GRAB_SCENARIO_PED_STATE_GRABBED ENDENUM ENUM CHOP_BEHAVIOUR_SPEECH_STATE_ENUM CHOP_BEHAVIOUR_SPEECH_NOT_STARTED = 0, CHOP_BEHAVIOUR_SPEECH_SAY_GOOD, CHOP_BEHAVIOUR_SPEECH_BARK, CHOP_BEHAVIOUR_SPEECH_SAY_BAD, CHOP_BEHAVIOUR_SPEECH_DONE ENDENUM ENUM SHAPE_TEST_STATE_ENUM SHAPE_TEST_STATE_NOT_STARTED = 0, SHAPE_TEST_STATE_WAITING ENDENUM // Consts CONST_INT NUMBER_MODEL_REQUEST_SLOTS COUNT_OF(HOOD_MODEL_ENUM) CONST_INT NUMBER_RECORDING_REQUEST_SLOTS 14 CONST_INT NUMBER_WAYPOINT_REQUEST_SLOTS 12 CONST_INT MAX_SKIP_MENU_LENGTH 11 CONST_INT SKIP_FADE_WAIT_TIME 200 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 NUMBER_TRAINS 3 CONST_INT NUMBER_YARD_VEHICLES COUNT_OF(YARD_VEHICLE_ENUM) CONST_INT NUMBER_YARD_PEDS COUNT_OF(YARD_PED_ENUM) CONST_INT NUMBER_BOXCARS 5 CONST_INT NUMBER_BLOCKING_VEHICLES 2 CONST_INT CRASH_BUS_ID 14 CONST_INT NUMBER_GRAB_SCENARIO_PEDS 7 CONST_INT MIN_RANDOM_SPEECH_TIME 8000 CONST_INT MAX_RANDOM_SPEECH_TIME 14000 CONST_FLOAT STREAM_FOOT_CHASE_TIME 78000.0 CONST_FLOAT CLEAR_POS_RADIUS 3.2 CONST_FLOAT BOXCAR_DOOR_Z_OFFSET 1.3 //CONST_FLOAT ASSISTED_PATH_WIDTH 1.2 //CONST_FLOAT ASSISTED_TENSION 1.0 CONST_FLOAT CHOP_TURN_MIN_PHASE 0.25 CONST_FLOAT CHOP_TURN_MAX_PHASE 0.80 CONST_FLOAT MAX_LAMAR_SPEED 1.10 CONST_FLOAT MIN_LAMAR_SPEED 0.80 CONST_FLOAT PLAYER_INIT_ROT 93.3 CONST_FLOAT FRANKLIN_VAN_INIT_ROT 210.17 CONST_FLOAT FOOT_CHASE_INIT_ROT -19.4 CONST_FLOAT VAN_CHASE_INIT_ROT 289.94 CONST_FLOAT LAMAR_WALK_INIT_ROT 95.7 CONST_FLOAT LAMAR_ALLEY_INIT_ROT 167.35 CONST_FLOAT FRANKLIN_ALLEY_INIT_ROT 164.80 CONST_FLOAT RUNNER_CHASE_INIT_ROT -8.69 CONST_FLOAT CHOP_CHASE_INIT_ROT 27.1 CONST_FLOAT CHOP_WALK_INIT_ROT 91.93 CONST_FLOAT CHASE_TRAIN_ROT 141.22 CONST_FLOAT CAR_IN_ALLEY_ROT -12.7 CONST_FLOAT DRIVE_INIT_ROT 175.46 CONST_FLOAT RUNNER_HIDE_ROT 173.0//84.92 CONST_FLOAT LOSE_RUNNER_ROT 137.26 CONST_FLOAT BOXCAR_DOOR_ROT 83.89 CONST_FLOAT CHOP_FIND_INIT_ROT 156.2 CONST_FLOAT COLLIE_INIT_ROT 81.09 CONST_FLOAT MOVE_LAST_PLAYER_VEHICLE_ROT 95.68 CONST_FLOAT VAN_HIDDEN_ROT 87.3 // Structs STRUCT CHASE_PROPERTIES PED_INDEX ped CHASE_STATE_ENUM chaseState CHASE_ANIM_ENUM chaseAnim VECTOR vAnimPos VECTOR vAnimRot INT iSyncScene INT iMovingTime BOOL bWaiting ENDSTRUCT STRUCT BOXCAR_DOOR OBJECT_INDEX obj OBJECT_INDEX handleObject BOXCAR_DOOR_STATE_ENUM state FLOAT fOffset ENDSTRUCT STRUCT BOXCAR_CARRIAGE OBJECT_INDEX anchorObject BLIP_INDEX blip CARRIAGE_SEARCH_STATE_ENUM searchState BOXCAR_DOOR boxcarDoor[2] ENDSTRUCT STRUCT YARD_PED PED_INDEX ped YARD_PED_STATE_ENUM state INT iStateTime INT iRecheckLookTime BOOL bReactedToChop ENDSTRUCT STRUCT GRAB_SCENARIO_PED GRAB_SCENARIO_PED_STATE_ENUM state PED_INDEX ped INT iUpdateTime BOOL bDoneSpeech ENDSTRUCT // Script-specific variables MISSION_INIT_STAGE_ENUM missionInitStage = MISSION_INIT_PRE_INTRO MISSION_FAIL_STATE_ENUM missionFailState = MISSION_FAIL_STATE_NOT_FAILED MISSION_STAGE_ENUM currentMissionStage FAIL_REASON_ENUM savedFailReason MISSION_STREAMING_STAGE_ENUM streamingStage MOCAP_STREAMING_STAGE_ENUM mocapStreamingStage HOOD_CUTSCENE_STAGE_ENUM cutsceneStage SELECTOR_PED_STRUCT sSelectorPeds ONTO_TRAIN_SHOT_ENUM ontoTrainShot LET_OUT_SHOT_ENUM letOutShot CHASE_SPEED_STAGE_ENUM chaseSpeedStage CHASE_PROPERTIES runnerChaseProperties CHASE_PROPERTIES chopChaseProperties RUNNER_STAGE_ENUM runnerStage CHOP_STAGE_ENUM chopStage CHOP_VIEW_CAM_DATA chopViewCamData CHOP_BEHAVIOUR_ENUM chopBehaviour CHOP_BEHAVIOUR_SETPIECE_STAGE_ENUM chopBehaviourSetpieceStage SETPIECE_STAGE_ENUM setpieceStage YARD_PED yardPed[COUNT_OF(YARD_PED_ENUM)] BOXCAR_CARRIAGE boxcarCarriage[NUMBER_BOXCARS] GRAB_SCENARIO_PED grabScenarioPed[NUMBER_GRAB_SCENARIO_PEDS] UBER_TRAILER_STATE_ENUM uberTrailerState LAMAR_PHONE_STATE_ENUM lamarPhoneState CHOP_HUMP_STATE_ENUM chopHumpState CHOP_SNIFF_STATE_ENUM chopSniffState CHOP_WAIT_STATE_ENUM chopWaitState CHOP_AUDIO_CONTEXT_ENUM lastChopAudioContext CHOP_BYPASS_FENCE_STATE_ENUM chopBypassFenceState DROPOFF_STAGE_ENUM dropoffStage DRIVER_OUT_STATE_ENUM driverOutState CREATE_POST_INTRO_STAGE_ENUM createPostIntroStage CREATE_BAD_GUY_STAGE_ENUM createBadGuyStage CREATE_BLOCKING_VEHICLES_STAGE_ENUM createBlockingVehiclesStage CRASH_TRIGGER_STATE_ENUM crashTriggerState CHOP_INTO_VAN_STATE_ENUM chopIntoVanState CREATE_YARD_STAGE_ENUM createYardStage CREATE_CARS_STAGE_ENUM createCarsStage CREATE_TRAINS_STAGE_ENUM createTrainsStage OPEN_TARGET_CONTAINER_STATE_ENUM openTargetContainerState BALLA_DISCOVERED_STATE_ENUM ballaDiscoveredState RUN_HELP_STATE_ENUM runHelpState CHOP_LEAN_IN_VAN_STATE_ENUM chopLeanInVanState FRANKLIN_MASK_REMOVE_STATE_ENUM franklinMaskRemoveState CALL_CHOP_BACK_STATE_ENUM callChopBackState FAKE_CELLPHONE_DATA fakeCellphoneData CHOP_BEHAVIOUR_SPEECH_STATE_ENUM chopBehaviourSpeechState SHAPE_TEST_STATE_ENUM shapeTestState // Peds PED_INDEX lamarPed PED_INDEX chopPed PED_INDEX girlPed PED_INDEX colliePed PED_INDEX driverPed[NUMBER_YARD_VEHICLES + NUMBER_TRAINS] // Vehicles VEHICLE_INDEX hoodVehicle[COUNT_OF(HOOD_VEHICLE_ENUM)] VEHICLE_INDEX yardVehicle[NUMBER_YARD_VEHICLES] VEHICLE_INDEX trainVehicle[NUMBER_TRAINS] VEHICLE_INDEX blockingVehicle[NUMBER_BLOCKING_VEHICLES] VEHICLE_INDEX uberTrailerVehicle //VEHICLE_INDEX cameraVehicle // Objects OBJECT_INDEX lamarPhoneObject OBJECT_INDEX franklinBandanaObject // Blips BLIP_INDEX franklinVanBlip BLIP_INDEX lamarBlip BLIP_INDEX runnerBlip BLIP_INDEX badGuyCarBlip BLIP_INDEX destinationBlip //BLIP_INDEX trainBlip BLIP_INDEX chopBlip //BLIP_INDEX alleyBlip // Cameras CAMERA_INDEX staticCam CAMERA_INDEX interpCam //CAMERA_INDEX chaseCam CAMERA_INDEX animCam CAMERA_INDEX chopSwitchCam // Bools BOOL bModelRequestTracker[COUNT_OF(HOOD_MODEL_ENUM)] BOOL bVehicleRecordingRequestTracker[NUMBER_RECORDING_REQUEST_SLOTS] BOOL bAnimDictRequestTracker[COUNT_OF(HOOD_ANIM_DICT_ENUM)] BOOL bWaypointRequestTracker[NUMBER_WAYPOINT_REQUEST_SLOTS] BOOL bWeaponRequestTracker[COUNT_OF(HOOD_WEAPON_ENUM)] BOOL bPTFXRequestTracker[COUNT_OF(HOOD_PTFX_ENUM)] BOOL bSFXRequestTracker[COUNT_OF(HOOD_SFX_ENUM)] BOOL bMiscAssetRequestTracker[COUNT_OF(HOOD_MISC_ASSET_ENUM)] BOOL bThoroughCleanup BOOL bForcePassOnShitskip BOOL bRunningCutscene BOOL bSkippedCutscene BOOL bClearedForCutscene BOOL bCutsceneWaitStarted BOOL bShownGodText BOOL bShouldDoGetInText BOOL bDoneBanter BOOL bSavedBanter BOOL bCheckedKillBanter BOOL bDoneReturnSpeech BOOL bKilledSpeechForArrive BOOL bTriggeredLamarDamageReaction BOOL bDoneIntroCreateEntities BOOL bDoneIntroClearStart //BOOL bDoneConversationAnim[8] BOOL bDoneHurrySpeech BOOL bShownHurryPrompt BOOL bTurnedOffPhoneForWalk BOOL bKilledOnFootConversation BOOL bDoneWaitForLamarPrompt BOOL bDoneGetLamarPrompt BOOL bLamarWalkPaused BOOL bDoneChopGetInSpeech BOOL bDoneLamarIntoVan BOOL bDoneArriveSpeech BOOL bDoneChopBehaviourSpeech BOOL bDoneCreepSpeech BOOL bDoneUphillSpeech BOOL bDoneBadGuySpookedReact BOOL bClearedPlayerRun BOOL bUsingActionCam BOOL bTempLamarvan BOOL bDoneBusSmash BOOL bKnockedOffBike BOOL bPedOffBikeAI BOOL bDoneCrashReactionSpeech BOOL bKilledSpeechForCrashReaction BOOL bResetScriptRagdoll BOOL bForcedRunnerDismount BOOL bDoneGetChopSpeech BOOL bDoneReleaseChopSpeech BOOL bDoneLamarEncourageSpeech BOOL bBlipAlley BOOL bSetWorkerDefault //BOOL bShownAlleyPrompt //BOOL bRemoveAlleyBlip BOOL bDoneWontCatchComplainSpeech BOOL bDoneWontCatchReplySpeech BOOL bDoneDownhillSpeech BOOL bDoneGoingLeftSpeech BOOL bDoneGoingDownAlleySpeech BOOL bDoneUseAbilitySpeech BOOL bShownSpecialAbilityHelp BOOL bSpeedUpBikeInAlley BOOL bPausedBlockingTraffic BOOL bPausedCrashBus BOOL bStartedRunnerMovement BOOL bStartedChopMovement //BOOL bForcedJumpOffRoof BOOL bStartedYardVehicle[NUMBER_YARD_VEHICLES] BOOL bStartedTrain[NUMBER_TRAINS] BOOL bFranklinWarp[COUNT_OF(FRANKLIN_WARP_ENUM)] //BOOL bDoneOffRoofCut BOOL bDoneDriverSwear BOOL bDoneDriverLookAtChop //BOOL bShownChopFenceHelp //BOOL bPlayingChopWaitTurnAnim BOOL bCheckedContainerWait BOOL bBypassedFence BOOL bDoneThroughFenceCut BOOL bDoRunAfterFence BOOL bSmashedFence BOOL bFranklinShoutBeforeTrain BOOL bDoneOnTrainCut BOOL bRepositionedFranklinForTrain BOOL bGotToTrain BOOL bDoneChopGoToTrain BOOL bDoneSecondFindSpeech BOOL bDoneWhereGoingSpeech BOOL bDoneThisWillGetBumpySpeech BOOL bDoneNoChopSpeech BOOL bDoneThreatenChopSpeech BOOL bDoingChopPull BOOL bDoneCommentOnBehaviourSpeech BOOL bShouldCommentOnBehaviour BOOL bDoneGetBackOnSpeech BOOL bDoneGetClosePrompt BOOL bDoneGoAwaySpeech BOOL bDoneItsADudeSpeech BOOL bRepositionedBallaHiding BOOL bDoneChopSniffSFX //BOOL bShownFranklinSwitchPrompt BOOL bDoneReactToRunStatSpeech BOOL bBlippedFirstBoxcars BOOL bBlippedSecondBoxcars BOOL bShownBoxcarPrompt BOOL bOpeningBoxcarInProgress BOOL bDoneBoxcarSpeech BOOL bDoneSearchBoxcarSpeech BOOL bDoneEmptyBoxcarSpeech BOOL bRestoredBoxcarGameplayCam BOOL bDoneDoorSlideSound BOOL bDoneDoorLimitSound BOOL bFoundBadGuy BOOL bDoneFoundBadGuySpeech BOOL bDoneChopChaseFoundBalla BOOL bDoneRunnerFallOver BOOL bAllowKidnapCutscene BOOL bDoneChopTakeDown BOOL bDoneRunnerRelax BOOL bDoneGetHisAssSpeech BOOL bDoneDRunSpeech BOOL bDoneDFallSpeech BOOL bShownLetOutPrompt BOOL bInLoseWantedState BOOL bShownLoseWantedPrompt BOOL bRemovedGirl BOOL bRemovedTraffic BOOL bShownChopViewHelp BOOL bShownQuickSwitchHelp BOOL bCancelledChopHint BOOL bRemovedBusStation BOOL bRemovedChaseSetpieces BOOL bDoneGotoSpeech BOOL bPhoneForceApplied BOOL bChopTurnToIdle BOOL bChopResetInIdle BOOL bDoneLoseWantedSpeech BOOL bDoneLoseReactSpeech BOOL bRemovedBlipsForWanted BOOL bShownCallChopHelp BOOL bShownChopBehaviourHelp BOOL bDoneChaseScent BOOL bDoneGetOutSpeech BOOL bDoneLetOut BOOL bDoneThreatenResponseSpeech BOOL bDoneLamarShoutSpeech BOOL bDoneFranklinShoutSpeech //BOOL bKilledConversationOnLetOut //BOOL bBadGuyRun BOOL bRemovedBike BOOL bFrozenVan BOOL bRestoredBadGuyDamage BOOL bLamarOutOfVan BOOL bCallChopBackSuccess BOOL bDoneFranklinIntoVanSpeech BOOL bKilledSpeechForVan BOOL bResetDirectEntryFlag BOOL bShownFirstDownloadHelp BOOL bDoneBreakFenceAudioScene BOOL bKilledTalkAboutMichaelSpeech BOOL bStoppedChopExcitement BOOL bInterpedToGameCam BOOL bRepositionedPlayerForTOD BOOL bCleanedUpPhone BOOL bCleanedUpBalla BOOL bApplyStartBoost BOOL bShownSwitchToCallHelp BOOL bSetBikeAsSmoking BOOL bShownSwitchToOpenHelp BOOL bOpenedAnyCarriage BOOL bResetOpenedAnyCarriage BOOL bLamarWaitingAtVan BOOL bFranklinWentAhead BOOL bLamarWasInGroup BOOL bDoneLamarWalkToVan BOOL bDoneJumpHelp BOOL bDoingDistantSiren BOOL bShownNoStaminaHelp BOOL bSetDamageOnBadGuy BOOL bStartedLetOutCutscene BOOL bAllowRunnerMovement BOOL bShutLDoor BOOL bShutRDoor BOOL bWasTimeLapseRunning BOOL bClearedChopTask BOOL bWarpedVanToAlley BOOL bWarpedToChaseEnd BOOL bLamarShouldBeInGroup BOOL bAddedChopToMixGroup BOOL bShownHoodSlideHelp BOOL bStoppedVanAnim BOOL bRunningWhenTriggeredChopCam BOOL bDisabledCamOnMediumSwitch BOOL bEnabledCamOnMediumSwitch BOOL bSkippedIntro BOOL bKilledSpeechAtCutscene BOOL bRemovedBuses BOOL bRemovedCarpark BOOL bDoneCutsceneBlood BOOL bDoneWhistleSound BOOL bFirstDownloadHelpOnCutscene BOOL bSetIssiNoCollision BOOL bForcedIntoVan BOOL bDoneHelloChopSpeech BOOL bDoneAreYouOKChopSpeech BOOL bDoneLaughAtFranklinSpeech BOOL bUsedAbility BOOL bDoneBoxcarCutsceneCam BOOL bKilledPreloadSpeech BOOL bDoneFocusOnBikeAudioScene BOOL bWarpedLamarToVan BOOL bBlockedCustoms BOOL bResetBallaGetUp BOOL bDoneLamarPullGunCue BOOL bDoneBikeSpeedOffCue BOOL bDoneInVanCue BOOL bDoneGetOutCue BOOL bDoneChopCamCue BOOL bPreparedSmashFenceCue BOOL bDoneSmashFenceCue BOOL bDoneBypassFenceCue BOOL bDoneGotoCollieCue BOOL bDoneMountCue BOOL bDoneDismountCue BOOL bDoneBlipSecondBoxcarsCue BOOL bDoneFoundCue BOOL bPreparedBaddyCue BOOL bDoneBaddyCue BOOL bSuppressFutureReplaySetups BOOL bShutVanDoors BOOL bSetTrevorUnavailable BOOL bBackBlocked BOOL bHadFirstLineOfBanter BOOL bDoneTrainingSpeech BOOL bFailForLost BOOL bDonePoliceReport BOOL bRevertedReverseBusAudio // NG BOOL bDoneFlash // Vectors VECTOR vRunnerAttachToVanPos VECTOR vRunnerAttachToVanRot VECTOR vHumpPos VECTOR vHumpEntry VECTOR vLamarSyncScenePos VECTOR vChopSyncScenePos VECTOR vLamarSyncSceneRot VECTOR vChopSyncSceneRot VECTOR vTargetTakedownPos VECTOR vTargetTakedownRot VECTOR vPlayerSyncScenePos VECTOR vPlayerSyncSceneRot VECTOR vTargetOpenPos VECTOR vTargetOpenRot //VECTOR vLastChopPTFXPos // Floats FLOAT fCarChaseSpeed FLOAT fDesiredSpeed FLOAT fHumpRot FLOAT fLamarWalkSpeed FLOAT fNoSpeechTime FLOAT fCachedVanSpeed FLOAT fDisplayBadPositionTime FLOAT fLamarJammedTime FLOAT fChopOverride FLOAT fChopThroughBoxcarSpeed FLOAT fTrainCruiseSpeed[NUMBER_TRAINS] // Ints INT iCachedVanHealth INT iReplayAttempt INT iAllowSkipCutsceneTime INT iHoodCutsceneTime INT iCutsceneTriggerTime INT iGetInTextStage INT iNextRandomSpeechTime INT iNextChopSoundTime INT iStageStartTime INT iNextLamarHurrySpeechTime INT iVanChaseSpeechStage INT iDontShootSpeechStage INT iNextDontShootSpeechTime INT iUseAbilitySpeechTime INT iRunnerStageStartTime INT iRunnerWaitTime INT iSetpieceStageStartTime INT iNextCheckVanHealthTime INT iTriggerPostBanterSpeechTime //INT iNextMaulTime INT iTrainStartedTime[NUMBER_TRAINS] //INT iActivateChopCamTime INT iShowChopHelpTime INT iClearHelpTime INT iChopBehaviourHelpTime INT iChopBehaviourStageTime INT iLastCallSpeechTime INT iLetOutPromptTime INT iCurrentFootChaseCutscene INT iChopSniffStateTime INT iNextChopSniffTime INT iLamarSyncScene INT iCollieSyncScene //INT iChopWaitTime INT iChopWaypointProgress INT iScentWaypoint INT iDriverOutTime INT iSpeedZone INT iChopBounceOnCarStage //INT iBusSmashTime INT iOpenTargetBoxcarTime INT iStartHumpTime INT iCreateVanTime INT iOpenBoxcarTime INT iSyncScene INT iDoorSyncScene INT iHandleSyncScene INT iBoxcarCamSyncScene INT iRunnerFallOverTime INT iLastChopGotoTime INT iThroughFenceTime INT iRestoreBadGuyDamageTime INT iLamarOutOfVanTime INT iFranklinMaskRemoveTime INT iStopChopExcitementTime INT iNextChopExcitementTime INT iNextFindSpeechTime INT iGetHisAssSpeechTime INT iInitialStaminaValue INT iKnockOffBikeTime INT iOpenVanDoorSoundStage INT iLoseWantedTime INT iDidCallBackAnimTime INT iNextChopAnimTime INT iNextBarkTime INT iStartedLetOutCutsceneTime INT iLetOutShotTime INT iLeftBoxcarCam INT iRightBoxcarCam INT iNextBallaVanChaseSpeechTime INT iCurrentChopCollar INT iSlowDownTime INT iEnterVanTaskTime INT iForceChopIntoVanTime INT iLastChopMoveCommandTime INT iDoLetOutPromptTime INT iLaughAtFranklinTime INT iFailWantedTime INT iWhistleSoundID = GET_SOUND_ID() INT iFailForLostTime INT iBoxcarTriggerTime INT iBlockJumpTime INT iCreateBadGuyTime INT iCreateBlockingVehiclesTime FLOAT fLamarSpeedCount // Other variables SEQUENCE_INDEX sequence PTFX_ID scentPTFX //PTFX_ID bloodPTFX SCRIPTTASKSTATUS taskStatus structPedsForConversation hoodConversation RAGDOLL_BLOCKING_FLAGS chaseRagdollBlockingFlags = RBF_PLAYER_IMPACT | RBF_VEHICLE_IMPACT TEXT_LABEL_23 tSavedBanterRoot TEXT_LABEL_23 tResumeBanterLabel structTimelapse sTimelapse SCENARIO_BLOCKING_INDEX entranceScenarioBlocking SCENARIO_BLOCKING_INDEX recScenarioBlocking SCENARIO_BLOCKING_INDEX alleyScenarioBlocking SCENARIO_BLOCKING_INDEX outsideYardScenarioBlocking SCENARIO_BLOCKING_INDEX offPathScenarioBlocking SHAPETEST_INDEX vanShapeTest STREAMVOL_ID missionStreamingVolume // Debug #IF IS_DEBUG_BUILD WIDGET_GROUP_ID hoodWidgets TEXT_WIDGET_ID RBCamPosWidget, RBCamRotWidget BOOL bRBDebugCamDoDump VECTOR vRBDebugCamPos VECTOR vRBDebugCamRot FLOAT fRBDebugCamFOV VECTOR vDebugVanCamOffset = <<0,0,0>> VECTOR vDebugVanCamPoint = <<0,0,0>> FLOAT fDebugVanCamFOV = 50 VECTOR vDebugBoxcarCamOffset = <<1.800,-0.400,1.050>> VECTOR vDebugBoxcarCamPoint = <<0.500,1.800,1.440>> FLOAT fDebugBoxcarCamFOV = 26.500 MissionStageMenuTextStruct stageMenu[MAX_SKIP_MENU_LENGTH] INT iMenuMissionStage INT iDebugStage = -1 BOOl bDebugDoUber = FALSE BOOL bDebugDoneFootChaseSkip BOOL bDrawVehicleRecordingDebug = FALSE BOOL bDebugForceOpenBoxcar = FALSE #ENDIF // get cutscene name FUNC STRING GET_FRANKLIN0_INTRO_CUTSCENE_NAME() RETURN "fra_0_int" ENDFUNC // get recording prefix FUNC STRING GET_HOOD_RECORDING_PREFIX() RETURN "fchase" ENDFUNC FUNC STRING GET_HOOD_UBER_RECORDING_PREFIX() RETURN "fcuber" ENDFUNC FUNC STRING GET_INJURED_CLIPSET_NAME() RETURN "move_injured_generic" ENDFUNC FUNC STRING GET_DESCRIPTION_FOR_STAGE_AS_STRING(MISSION_STAGE_ENUM thisStage) SWITCH thisStage CASE STAGE_GET_TO_BAD_GUY RETURN "Get to Vinewood" BREAK CASE STAGE_VAN_CHASE RETURN "Van chase" BREAK CASE STAGE_FOOT_CHASE RETURN "Foot chase" BREAK CASE STAGE_FIND_BAD_GUY RETURN "Find hiding bad guy" BREAK CASE STAGE_GET_TO_HOUSE RETURN "Drop off gangster" BREAK ENDSWITCH RETURN "invalid" ENDFUNC // can advance mission FUNC BOOL CAN_ADVANCE_MISSION() IF missionFailState = MISSION_FAIL_STATE_NOT_FAILED AND NOT IS_PLAYER_BROWSING_ITEMS_IN_ANY_SHOP() RETURN TRUE ENDIF RETURN FALSE ENDFUNC // do mission god text FUNC BOOL DO_MISSION_GOD_TEXT(STRING sGodText, BOOL bSupercedeText = TRUE, BOOL bSupercedeSpeech = FALSE, INT iTime = DEFAULT_GOD_TEXT_TIME) IF bSupercedeText OR NOT IS_MESSAGE_BEING_DISPLAYED() IF bSupercedeSpeech OR NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() OR NOT IS_SUBTITLE_PREFERENCE_SWITCHED_ON() IF CAN_ADVANCE_MISSION() PRINT_NOW(sGodText, iTime, 1) RETURN TRUE ENDIF ENDIF ENDIF RETURN FALSE ENDFUNC // do mission help text FUNC BOOL DO_MISSION_HELP_TEXT(STRING sHelpText, BOOL bSupercedeHelp = TRUE, INT iOverrideTime = -1) IF bSupercedeHelp OR NOT IS_HELP_MESSAGE_BEING_DISPLAYED() IF CAN_ADVANCE_MISSION() PRINT_HELP(sHelpText, iOverrideTime) RETURN TRUE ENDIF ENDIF RETURN FALSE ENDFUNC // do mission speech FUNC BOOL DO_MISSION_SPEECH(STRING sSpeech, BOOL bSupercedeText = FALSE, INT iLine = 0, BOOL bFromSpecifiedLine = FALSE, BOOL bDisplaySubtitles = TRUE) IF bSupercedeText OR NOT IS_MESSAGE_BEING_DISPLAYED() OR NOT IS_SUBTITLE_PREFERENCE_SWITCHED_ON() IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() IF CAN_ADVANCE_MISSION() enumSubtitlesState subtitlesState IF bDisplaySubtitles subtitlesState = DISPLAY_SUBTITLES ELSE subtitlesState = DO_NOT_DISPLAY_SUBTITLES ENDIF IF iLine = 0 RETURN CREATE_CONVERSATION(hoodConversation, "FKN0AUD", sSpeech, CONV_PRIORITY_HIGH, subtitlesState) ELSE TEXT_LABEL tLine tLine = sSpeech tLine+="_" tLine+=iLine IF NOT bFromSpecifiedLine RETURN PLAY_SINGLE_LINE_FROM_CONVERSATION(hoodConversation, "FKN0AUD", sSpeech, tLine, CONV_PRIORITY_HIGH, subtitlesState) ELSE RETURN CREATE_CONVERSATION_FROM_SPECIFIC_LINE(hoodConversation, "FKN0AUD", 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, enumCharacterList useCharsheetName = NO_CHARACTER) IF CAN_ADVANCE_MISSION() RETURN CREATE_BLIP_FOR_PED(ped, isEnemyPed, useCharsheetName) ENDIF RETURN NULL ENDFUNC FUNC BLIP_INDEX CREATE_MISSION_BLIP_FOR_OBJECT(OBJECT_INDEX object) IF CAN_ADVANCE_MISSION() RETURN CREATE_BLIP_FOR_OBJECT(object) ENDIF RETURN NULL ENDFUNC FUNC BLIP_INDEX CREATE_MISSION_BLIP_FOR_COORD(VECTOR vCoords, BOOL bSetRoute = FALSE) IF CAN_ADVANCE_MISSION() RETURN CREATE_BLIP_FOR_COORD(vCoords, bSetRoute) ENDIF RETURN NULL ENDFUNC FUNC BOOL TRIGGER_MISSION_MUSIC_EVENT(STRING sEvent) RETURN TRIGGER_MUSIC_EVENT(sEvent) ENDFUNC // get model for a hood model enum FUNC MODEL_NAMES GET_MODEL_FOR_HOOD_MODEL_ENUM(HOOD_MODEL_ENUM hModel) SWITCH hModel CASE HM_FRANKLIN RETURN GET_PLAYER_PED_MODEL(CHAR_FRANKLIN) BREAK CASE HM_LAMAR RETURN GET_NPC_PED_MODEL(CHAR_LAMAR) BREAK CASE HM_BAD_GUY RETURN IG_BALLASOG BREAK CASE HM_CHOP RETURN GET_CHOP_MODEL() BREAK CASE HM_COLLIE RETURN A_C_ROTTWEILER BREAK CASE HM_GIRL RETURN A_F_Y_GENHOT_01 BREAK CASE HM_WORKER RETURN S_M_Y_Construct_02 BREAK CASE HM_FRANKLIN_VAN RETURN GET_NPC_VEH_MODEL(CHAR_LAMAR) BREAK CASE HM_BIKE RETURN BATI BREAK CASE HM_TRAFFIC_CAR1 RETURN EMPEROR BREAK CASE HM_TRAFFIC_CAR2 RETURN BISON BREAK CASE HM_BUS RETURN BUS BREAK CASE HM_TRAILER RETURN TRAILERS2 BREAK CASE HM_ENGINE RETURN FREIGHT BREAK CASE HM_TANKER_CARRIAGE RETURN TANKERCAR BREAK CASE HM_CONTAINER_CARRIAGE RETURN FREIGHTCONT2 BREAK CASE HM_BLOCKING_TRUCK RETURN RUBBLE BREAK CASE HM_BLOCKING_CAR RETURN ROCOTO BREAK CASE HM_BOXCAR_DOOR RETURN PROP_RAIL_BOXCAR5_D BREAK CASE HM_BOXCAR_HANDLE RETURN PROP_BOXCAR5_HANDLE BREAK CASE HM_LAMAR_PHONE RETURN PROP_NPC_PHONE BREAK CASE HM_FRANKLIN_MASK RETURN P_CS_BANDANA_S BREAK CASE HM_ANCHOR RETURN Prop_LD_Test_01 BREAK CASE HM_START_VEHICLE RETURN GET_REPLAY_START_VEHICLE_MODEL() BREAK ENDSWITCH RETURN DUMMY_MODEL_FOR_SCRIPT ENDFUNC // suppress vehicles PROC SUPPRESS_MISSION_MODELS(BOOL bSuppress) SET_VEHICLE_MODEL_IS_SUPPRESSED(GET_MODEL_FOR_HOOD_MODEL_ENUM(HM_FRANKLIN_VAN), bSuppress) SET_VEHICLE_MODEL_IS_SUPPRESSED(GET_MODEL_FOR_HOOD_MODEL_ENUM(HM_BIKE), bSuppress) SET_VEHICLE_MODEL_IS_SUPPRESSED(FORKLIFT, bSuppress) SET_VEHICLE_MODEL_IS_SUPPRESSED(GET_MODEL_FOR_HOOD_MODEL_ENUM(HM_BLOCKING_TRUCK), bSuppress) SET_VEHICLE_MODEL_IS_SUPPRESSED(GET_MODEL_FOR_HOOD_MODEL_ENUM(HM_BLOCKING_CAR), bSuppress) SET_PED_MODEL_IS_SUPPRESSED(GET_MODEL_FOR_HOOD_MODEL_ENUM(HM_BAD_GUY), bSuppress) SET_PED_MODEL_IS_SUPPRESSED(GET_MODEL_FOR_HOOD_MODEL_ENUM(HM_LAMAR), bSuppress) IF bSuppress = FALSE SET_VEHICLE_MODEL_IS_SUPPRESSED(BUS, bSuppress) ENDIF ENDPROC // set player out of any vehicle PROC SET_PLAYER_OUT_OF_ANY_VEHICLE() IF NOT IS_PED_INJURED(PLAYER_PED_ID()) IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) VECTOR vCoords = GET_ENTITY_COORDS(PLAYER_PED_ID()) SET_ENTITY_COORDS(PLAYER_PED_ID(), <>) ENDIF ENDIF ENDPROC // disable/reenable cargens PROC ENABLE_CARGENS_FOR_MISSION(BOOL bEnable) SET_ALL_VEHICLE_GENERATORS_ACTIVE_IN_AREA(<<428.19, -688.97, 10.0>>, <<677.84, -388.92, 36.0>>, bEnable) SET_ALL_VEHICLE_GENERATORS_ACTIVE_IN_AREA(<<-233, -1505.74, -10.0>>, <<-199, -1467, 110.0>>, bEnable) SET_ALL_VEHICLE_GENERATORS_ACTIVE_IN_AREA(<<495.9, -652.6, -10.0>>, <<513.0, -635.9, 110.0>>, bEnable) //SET_PARKED_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0) ENDPROC // clear cargens for foot chase PROC CLEAR_CARGENS_FOR_FOOT_CHASE() CLEAR_AREA(<<466, -579, 28>>, 5.0, TRUE) REMOVE_VEHICLES_FROM_GENERATORS_IN_AREA(<<461, -584, 23>>, <<471, -574, 33>>) CLEAR_AREA(<<512, -509, 25>>, 5.0, TRUE) REMOVE_VEHICLES_FROM_GENERATORS_IN_AREA(<<507, -514, 20>>, <<517, -504, 30>>) ENDPROC // switch off roads for mission PROC SET_HOOD_ROADS_OFF(BOOL bSwitchOff, BOOL bSwitchOffJunction = FALSE) INT i VECTOR vMin VECTOR vMax // roads REPEAT 4 i SWITCH i CASE 0 vMin = <<271.58, -842.98, 16.61>> vMax = <<554.26, -619.07, 48.80>> BREAK CASE 1 vMin = <<365.07, 67.98, 75.12>> vMax = <<509.20, 151.22, 121.17>> BREAK CASE 2 vMin = <<-91.34664, -1457.38464, 0.78976>> vMax = <<-73.12756, -1381.66003, 48.33570>> BREAK CASE 3 vMin = <<454.75815, -817.23328, 0.70810>> vMax = <<459.41602, -685.39819, 56.66263>> BREAK ENDSWITCH IF bSwitchOff IF bSwitchOffJunction OR i < 3 SET_ROADS_IN_AREA(vMin, vMax, FALSE) ENDIF ELSE SET_ROADS_BACK_TO_ORIGINAL(vMin, vMax) ENDIF ENDREPEAT PRINTSTRING("turn off ped paths") PRINTNL() // ped paths REPEAT 4 i SWITCH i CASE 0 vMin = <<-76.73, -1477.92, 21.17>> vMax = <<16.05, -1447.28, 59.54>> BREAK CASE 1 vMin = <<487.24, -670.92, 0>> vMax = <<591.02, -527.37, 100>> BREAK CASE 2 vMin = <<515.81, -729.95, 0>> vMax = <<567.66, -647.36, 100>> BREAK CASE 3 vMin = <<454.75815, -817.23328, 0.70810>> vMax = <<459.41602, -685.39819, 56.66263>> BREAK ENDSWITCH IF bSwitchOff PRINTSTRING("OFF ") PRINTINT(i) PRINTNL() SET_PED_PATHS_IN_AREA(vMin, vMax, FALSE) IF i=3 PRINTSTRING("set the non creation area") PRINTINT(i) PRINTNL() SET_PED_NON_CREATION_AREA(vMin, vMax) ENDIF ELSE SET_PED_PATHS_BACK_TO_ORIGINAL(vMin, vMax) CLEAR_PED_NON_CREATION_AREA() ENDIF ENDREPEAT ENDPROC FUNC STRING GET_HOOD_AUDIO_SCENE_AS_STRING(HOOD_AUDIO_SCENE_ENUM thisScene) SWITCH thisScene CASE HOOD_AUDIO_SCENE_WALK_TO_VAN RETURN "FRANKLIN_0_WALK_TO_VAN" BREAK CASE HOOD_AUDIO_SCENE_DRIVE_TO_VINEWOOD RETURN "FRANKLIN_0_DRIVE_TO_VINEWOOD" BREAK CASE HOOD_AUDIO_SCENE_CAR_CHASE RETURN "FRANKLIN_0_CAR_CHASE" BREAK CASE HOOD_AUDIO_SCENE_FOOT_CHASE_START RETURN "FRANKLIN_0_FOOT_CHASE_START" BREAK CASE HOOD_AUDIO_SCENE_BREAK_THROUGH_FENCE RETURN "FRANKLIN_0_BREAK_THROUGH_FENCE" BREAK CASE HOOD_AUDIO_SCENE_D_ESCAPES RETURN "FRANKLIN_0_D_ESCAPES" BREAK CASE HOOD_AUDIO_SCENE_SEARCH_BOXCARS RETURN "FRANKLIN_0_SEARCH_BOXCARS" BREAK CASE HOOD_AUDIO_SCENE_DRIVE_TO_LAMARS RETURN "FRANKLIN_0_DRIVE_TO_LAMARS" BREAK CASE HOOD_AUDIO_SCENE_TAKE_LAMAR_BACK RETURN "FRANKLIN_0_TAKE_LAMAR_BACK" BREAK CASE HOOD_AUDIO_SCENE_CHOP_CAM RETURN "FRANKLIN_0_CHOP_CAM" BREAK CASE HOOD_AUDIO_SCENE_FOCUS_CAM RETURN "FRANKLIN_0_FOCUS_ON_BIKER" BREAK ENDSWITCH RETURN "" ENDFUNC // start train crash audio scene FUNC BOOL START_HOOD_AUDIO_SCENE(HOOD_AUDIO_SCENE_ENUM thisScene) RETURN START_AUDIO_SCENE(GET_HOOD_AUDIO_SCENE_AS_STRING(thisScene)) ENDFUNC // stop train crash audio scene PROC STOP_HOOD_AUDIO_SCENE(HOOD_AUDIO_SCENE_ENUM thisScene) STOP_AUDIO_SCENE(GET_HOOD_AUDIO_SCENE_AS_STRING(thisScene)) ENDPROC // stop all train crash audio scenes PROC STOP_ALL_HOOD_AUDIO_SCENES() INT i REPEAT COUNT_OF(HOOD_AUDIO_SCENE_ENUM) i STOP_HOOD_AUDIO_SCENE(INT_TO_ENUM(HOOD_AUDIO_SCENE_ENUM, i)) ENDREPEAT ENDPROC // set franklin mask PROC SET_FRANKLIN_MASK(BOOL bSet) IF NOT IS_PED_INJURED(PLAYER_PED_ID()) IF bSet SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(),COMP_TYPE_SPECIAL, SPECIAL_P1_MASK, FALSE) //SET_PED_COMPONENT_VARIATION(PLAYER_PED_ID(), PED_COMP_SPECIAL, 9, 0) ELSE REMOVE_PED_COMP_ITEM_SP(PLAYER_PED_ID(), COMP_TYPE_SPECIAL, SPECIAL_P1_MASK) //SET_PED_COMPONENT_VARIATION(PLAYER_PED_ID(), PED_COMP_SPECIAL, 0, 0) ENDIF ENDIF ENDPROC // set lamar mask PROC SET_LAMAR_MASK(BOOL bSet) IF NOT IS_PED_INJURED(lamarPed) IF bSet SET_PED_COMPONENT_VARIATION(lamarPed, PED_COMP_SPECIAL, 1, 0) ELSE SET_PED_COMPONENT_VARIATION(lamarPed, PED_COMP_SPECIAL, 0, 0) ENDIF ENDIF ENDPROC // remove blips PROC REMOVE_ALL_BLIPS() IF DOES_BLIP_EXIST(franklinVanBlip) REMOVE_BLIP(franklinVanBlip) ENDIF IF DOES_BLIP_EXIST(lamarBlip) REMOVE_BLIP(lamarBlip) ENDIF IF DOES_BLIP_EXIST(runnerBlip) REMOVE_BLIP(runnerBlip) ENDIF IF DOES_BLIP_EXIST(badGuyCarBlip) REMOVE_BLIP(badGuyCarBlip) ENDIF IF DOES_BLIP_EXIST(destinationBlip) REMOVE_BLIP(destinationBlip) ENDIF //IF DOES_BLIP_EXIST(trainBlip) // REMOVE_BLIP(trainBlip) //ENDIF IF DOES_BLIP_EXIST(chopBlip) REMOVE_BLIP(chopBlip) ENDIF //IF DOES_BLIP_EXIST(alleyBlip) // REMOVE_BLIP(alleyBlip) //ENDIF INT i REPEAT NUMBER_BOXCARS i IF DOES_BLIP_EXIST(boxcarCarriage[i].blip) REMOVE_BLIP(boxcarCarriage[i].blip) ENDIF 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) CLEAR_TIMECYCLE_MODIFIER() SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE) DISABLE_CELLPHONE(FALSE) KILL_CHASE_HINT_CAM(localChaseHintCamStruct) ENDPROC // remove chop scent PROC REMOVE_CHOP_SCENT(BOOL bInstant) IF DOES_PARTICLE_FX_LOOPED_EXIST(scentPTFX) IF bInstant REMOVE_PARTICLE_FX(scentPTFX) ELSE STOP_PARTICLE_FX_LOOPED(scentPTFX) ENDIF ENDIF IF bInstant REMOVE_PARTICLE_FX_IN_RANGE(chopViewCamData.vLastPTFXPos, 2) ENDIF ENDPROC PROC TOGGLE_CAR_MOD_SHOPS_UNAVAILABLE(BOOL bToggleFlag) SET_SHOP_IS_TEMPORARILY_UNAVAILABLE(CARMOD_SHOP_01_AP, bToggleFlag) SET_SHOP_IS_TEMPORARILY_UNAVAILABLE(CARMOD_SHOP_05_ID2, bToggleFlag) SET_SHOP_IS_TEMPORARILY_UNAVAILABLE(CARMOD_SHOP_06_BT1, bToggleFlag) SET_SHOP_IS_TEMPORARILY_UNAVAILABLE(CARMOD_SHOP_07_CS1, bToggleFlag) SET_SHOP_IS_TEMPORARILY_UNAVAILABLE(CARMOD_SHOP_08_CS6, bToggleFlag) SET_SHOP_IS_TEMPORARILY_UNAVAILABLE(CARMOD_SHOP_SUPERMOD, bToggleFlag) ENDPROC // cleanup the mission PROC MISSION_CLEANUP() TRIGGER_MUSIC_EVENT("FRA0_MISSION_FAIL") REMOVE_MISSION_TEXT() RELEASE_CHOP_CAM_SFX(chopViewCamData) IF ANIMPOSTFX_IS_RUNNING("ChopVision") ANIMPOSTFX_STOP("ChopVision") ENDIF CLEAR_CONTROL_LIGHT_EFFECT(PLAYER_CONTROL) DISTANT_COP_CAR_SIRENS(FALSE) STOP_ALL_HOOD_AUDIO_SCENES() SET_PARTICLE_FX_FOOT_LODRANGE_SCALE(1.0) KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() SET_AUDIO_FLAG("DisableAbortConversationForRagdoll", FALSE) DISABLE_CHEAT(CHEAT_TYPE_SUPER_JUMP, FALSE) DISABLE_CHEAT(CHEAT_TYPE_FAST_RUN, FALSE) SET_WANTED_LEVEL_MULTIPLIER(1.0) SET_MAX_WANTED_LEVEL(5) RESET_WANTED_LEVEL_DIFFICULTY(PLAYER_ID()) IF STREAMVOL_IS_VALID(missionStreamingVolume) STREAMVOL_DELETE(missionStreamingVolume) ENDIF TOGGLE_CAR_MOD_SHOPS_UNAVAILABLE(FALSE) ENABLE_DISPATCH_SERVICE(DT_AMBULANCE_DEPARTMENT, TRUE) ENABLE_DISPATCH_SERVICE(DT_FIRE_DEPARTMENT, TRUE) REMOVE_CHOP_SCENT(TRUE) //IF mocapStreamingStage >= MOCAP_STREAMING_STAGE_WAIT REMOVE_CUTSCENE() //ENDIF SET_INSTANCE_PRIORITY_HINT(INSTANCE_HINT_NONE) ENABLE_CARGENS_FOR_MISSION(TRUE) //DISABLE_VEHICLE_GEN_ON_MISSION(FALSE) SET_HOOD_ROADS_OFF(FALSE) SUPPRESS_MISSION_MODELS(FALSE) SET_GPS_DISABLED_ZONE(<<0,0,0>>, <<0,0,0>>) REMOVE_ROAD_NODE_SPEED_ZONE(iSpeedZone) REMOVE_SCENARIO_BLOCKING_AREA(entranceScenarioBlocking) REMOVE_SCENARIO_BLOCKING_AREA(recScenarioBlocking) REMOVE_SCENARIO_BLOCKING_AREA(alleyScenarioBlocking) REMOVE_SCENARIO_BLOCKING_AREA(outsideYardScenarioBlocking) REMOVE_SCENARIO_BLOCKING_AREA(offPathScenarioBlocking) //SET_FRANKLIN_MASK(FALSE) RELEASE_NPC_PHONE_RENDERTARGET() // reenable shops and shop robberies SET_ALL_SHOPS_TEMPORARILY_UNAVAILABLE(FALSE) g_bBlockShopRoberies = FALSE SET_PED_POPULATION_BUDGET(3) SET_VEHICLE_POPULATION_BUDGET(3) //SET_REQUESTED_MODEL_ASSERT(TRUE) IF IS_VEHICLE_DRIVEABLE(hoodVehicle[HV_FRANKLIN_VAN]) SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(hoodVehicle[HV_FRANKLIN_VAN], TRUE) SET_VEHICLE_STRONG(hoodVehicle[HV_FRANKLIN_VAN], FALSE) SET_DISABLE_VEHICLE_PETROL_TANK_FIRES(hoodVehicle[HV_FRANKLIN_VAN], FALSE) SET_VEHICLE_CAN_LEAK_OIL(hoodVehicle[HV_FRANKLIN_VAN], TRUE) SET_VEHICLE_CAN_LEAK_PETROL(hoodVehicle[HV_FRANKLIN_VAN], TRUE) SET_VEHICLE_HAS_STRONG_AXLES(hoodVehicle[HV_FRANKLIN_VAN], FALSE) SET_VEHICLE_TYRES_CAN_BURST(hoodVehicle[HV_FRANKLIN_VAN], TRUE) //SET_VEHICLE_RADIO_ENABLED(hoodVehicle[HV_FRANKLIN_VAN], TRUE) ENDIF IF IS_VEHICLE_DRIVEABLE(hoodVehicle[HV_BAD_GUY_BIKE]) SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(hoodVehicle[HV_BAD_GUY_BIKE], TRUE) SET_ENTITY_PROOFS(hoodVehicle[HV_BAD_GUY_BIKE], FALSE, FALSE, FALSE, FALSE, FALSE) SET_DISABLE_VEHICLE_PETROL_TANK_FIRES(hoodVehicle[HV_BAD_GUY_BIKE], FALSE) SET_VEHICLE_CAN_LEAK_OIL(hoodVehicle[HV_BAD_GUY_BIKE], TRUE) SET_VEHICLE_CAN_LEAK_PETROL(hoodVehicle[HV_BAD_GUY_BIKE], TRUE) SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(hoodVehicle[HV_BAD_GUY_BIKE], FALSE) ENDIF // NG IF IS_VEHICLE_DRIVEABLE(yardVehicle[YV_BUS_REVERSE]) SET_AUDIO_VEHICLE_PRIORITY(yardVehicle[YV_BUS_REVERSE], AUDIO_VEHICLE_PRIORITY_NORMAL) ENDIF IF NOT IS_PED_INJURED(lamarPed) IF IS_PED_GROUP_MEMBER(lamarPed, PLAYER_GROUP_ID()) REMOVE_PED_FROM_GROUP(lamarPed) ENDIF ENDIF STOP_SOUND(iWhistleSoundID) RELEASE_SOUND_ID(iWhistleSoundID) IF bThoroughCleanup IF DOES_ENTITY_EXIST(lamarPhoneObject) DELETE_OBJECT(lamarPhoneObject) ENDIF IF DOES_ENTITY_EXIST(lamarPed) DELETE_PED(lamarPed) ENDIF IF DOES_ENTITY_EXIST(runnerChaseProperties.ped) DELETE_PED(runnerChaseProperties.ped) ENDIF ENDIF IF NOT IS_PED_INJURED(PLAYER_PED_ID()) TASK_CLEAR_LOOK_AT(PLAYER_PED_ID()) IF GET_SCRIPT_TASK_STATUS(PLAYER_PED_ID(), SCRIPT_TASK_FOLLOW_TO_OFFSET_OF_ENTITY) <> FINISHED_TASK OR GET_SCRIPT_TASK_STATUS(PLAYER_PED_ID(), SCRIPT_TASK_GO_TO_ENTITY) <> FINISHED_TASK OR GET_SCRIPT_TASK_STATUS(PLAYER_PED_ID(), SCRIPT_TASK_FOLLOW_WAYPOINT_ROUTE) <> FINISHED_TASK OR GET_SCRIPT_TASK_STATUS(PLAYER_PED_ID(), SCRIPT_TASK_TURN_PED_TO_FACE_ENTITY) <> FINISHED_TASK CLEAR_PED_TASKS(PLAYER_PED_ID()) ENDIF 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 IF NOT IS_PED_INJURED(chopPed) CLEAR_PED_TASKS(chopPed) ENDIF IF NOT IS_PED_INJURED(colliePed) CLEAR_PED_TASKS(colliePed) ENDIF IF NOT IS_PED_INJURED(runnerChaseProperties.ped) CLEAR_PED_TASKS(runnerChaseProperties.ped) ENDIF IF DOES_CAM_EXIST(animCam) DESTROY_CAM(animCam) ENDIF INT i INT j REPEAT NUMBER_BOXCARS i REPEAT 2 j IF DOES_ENTITY_EXIST(boxcarCarriage[i].boxcarDoor[j].obj) DETACH_ENTITY(boxcarCarriage[i].boxcarDoor[j].obj, TRUE) FREEZE_ENTITY_POSITION(boxcarCarriage[i].boxcarDoor[j].obj, TRUE) ENDIF ENDREPEAT ENDREPEAT // get rid of trains REPEAT NUMBER_TRAINS i IF DOES_ENTITY_EXIST(trainVehicle[i]) IF bThoroughCleanup DELETE_MISSION_TRAIN(trainVehicle[i]) ELSE SET_MISSION_TRAIN_AS_NO_LONGER_NEEDED(trainVehicle[i], ENUM_TO_INT(RTF_KEEP_OLD_SPEED)) ENDIF ENDIF ENDREPEAT DO_COMMON_PLAYER_AND_CAM_CLEANUP() CLEANUP_UBER_PLAYBACK() //SET_ALL_RANDOM_PEDS_FLEE(PLAYER_ID(), FALSE) //CLEANUP_HOOD_ASSISTED_MOVEMENT() //SET_MISSION_FLOW_FLAG_STATE(FLOWFLAG_PLAYER_PED_INTRODUCED_T, FALSE) IF bSetTrevorUnavailable SET_PLAYER_PED_AVAILABLE(CHAR_TREVOR, TRUE) ENDIF SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE) #IF IS_DEBUG_BUILD IF DOES_WIDGET_GROUP_EXIST(hoodWidgets) DELETE_WIDGET_GROUP(hoodWidgets) ENDIF #ENDIF TERMINATE_THIS_THREAD() ENDPROC // mission passed PROC MISSION_PASSED() Mission_Flow_Mission_Passed() MISSION_CLEANUP() ENDPROC // mission failed PROC MISSION_FAILED(FAIL_REASON_ENUM reasonForFail) IF CAN_ADVANCE_MISSION() REMOVE_ALL_BLIPS() REMOVE_MISSION_TEXT(TRUE, TRUE, TRUE, TRUE) TRIGGER_MUSIC_EVENT("FRA0_MISSION_FAIL") missionFailState = MISSION_FAIL_STATE_WAIT_FOR_FADE savedFailReason = reasonForFail STRING failText SWITCH savedFailReason CASE FAIL_LAMAR_DEAD failText = "FC_FAIL1" BREAK CASE FAIL_CHOP_DEAD failText = "FC_FAIL4" BREAK CASE FAIL_LOST_BAD_GUY failText = "FC_FAIL2" BREAK CASE FAIL_KILLED_BAD_GUY failText = "FC_FAIL3" BREAK CASE FAIL_VAN_DESTROYED failText = "FC_FAIL5" BREAK CASE FAIL_SPOOKED_BAD_GUY failText = "FC_FAIL6" BREAK CASE FAIL_ABANDONED_LAMAR failText = "FC_FAIL7" BREAK CASE FAIL_ABANDONED_VAN failText = "FC_FAIL8" BREAK CASE FAIL_ABANDONED_CHOP failText = "FC_FAIL11" BREAK CASE FAIL_VAN_STUCK failText = "FC_FAIL10" BREAK CASE FAIL_POLICE_ATTENTION failText = "FC_FAIL9" BREAK ENDSWITCH MISSION_FLOW_MISSION_FAILED_WITH_REASON(failText) ENDIF ENDPROC // remove van blip and text PROC REMOVE_VAN_BLIP_AND_TEXT() IF DOES_BLIP_EXIST(franklinVanBlip) REMOVE_BLIP(franklinVanBlip) ENDIF IF IS_THIS_PRINT_BEING_DISPLAYED("FC_GOVAN2") OR IS_THIS_PRINT_BEING_DISPLAYED("FC_GOVAN1") REMOVE_MISSION_TEXT(TRUE, TRUE, FALSE) ENDIF ENDPROC // check all peds and vehicles for fail PROC HANDLE_MISSION_FAIL_CHECKS() IF NOT bRunningCutscene IF IS_PED_INJURED(lamarPed) IF DOES_BLIP_EXIST(lamarBlip) REMOVE_BLIP(lamarBlip) ENDIF IF IS_THIS_PRINT_BEING_DISPLAYED("FC_FOLLAM") REMOVE_MISSION_TEXT(TRUE, TRUE, FALSE) ENDIF MISSION_FAILED(FAIL_LAMAR_DEAD) ELSE // abandon IF currentMissionStage = STAGE_GET_TO_BAD_GUY IF NOT bDoneLamarIntoVan IF NOT bForcePassOnShitskip IF GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), lamarPed, FALSE) > ABANDON_BUDDY_FAIL_RANGE MISSION_FAILED(FAIL_ABANDONED_LAMAR) ENDIF ENDIF ENDIF ENDIF ENDIF IF IS_PED_INJURED(chopPed) IF DOES_BLIP_EXIST(chopBlip) REMOVE_BLIP(chopBlip) ENDIF IF IS_THIS_PRINT_BEING_DISPLAYED("FC_GOCHOP") OR IS_THIS_PRINT_BEING_DISPLAYED("FC_CLOSER") REMOVE_MISSION_TEXT(TRUE, TRUE, FALSE) ENDIF MISSION_FAILED(FAIL_CHOP_DEAD) ENDIF IF DOES_ENTITY_EXIST(runnerChaseProperties.ped) IF IS_PED_INJURED(runnerChaseProperties.ped) IF DOES_BLIP_EXIST(runnerBlip) REMOVE_BLIP(runnerBlip) ENDIF IF IS_THIS_PRINT_BEING_DISPLAYED("FC_CHASE") REMOVE_MISSION_TEXT(TRUE, TRUE, FALSE) ENDIF IF currentMissionStage = STAGE_VAN_CHASE IF IS_VEHICLE_DRIVEABLE(hoodVehicle[HV_BAD_GUY_BIKE]) IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(hoodVehicle[HV_BAD_GUY_BIKE]) STOP_PLAYBACK_RECORDED_VEHICLE(hoodVehicle[HV_BAD_GUY_BIKE]) ENDIF ENDIF ENDIF MISSION_FAILED(FAIL_KILLED_BAD_GUY) ELSE IF currentMissionStage = STAGE_FOOT_CHASE FLOAT fFailDist IF NOT IS_TRACKED_PED_VISIBLE(runnerChaseProperties.ped) VECTOR vPlayerPos = GET_ENTITY_COORDS(PLAYER_PED_ID()) IF vPlayerPos.x >= 487.3 AND vPlayerPos.y <= -614.0 AND vPlayerPos.z <= 27.2 fFailDist = 70.0 ELSE fFailDist = 90.0 ENDIF ELSE fFailDist = 160.0 ENDIF UPDATE_CHASE_BLIP(runnerBlip, runnerChaseProperties.ped, fFailDist) IF GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), runnerChaseProperties.ped, FALSE) >= fFailDist AND chopViewCamData.state = CHOP_VIEW_CAM_DISABLED IF DOES_BLIP_EXIST(runnerBlip) REMOVE_BLIP(runnerBlip) ENDIF MISSION_FAILED(FAIL_LOST_BAD_GUY) ENDIF ENDIF ENDIF ENDIF IF DOES_ENTITY_EXIST(hoodVehicle[HV_FRANKLIN_VAN]) IF NOT IS_VEHICLE_DRIVEABLE(hoodVehicle[HV_FRANKLIN_VAN], TRUE) MISSION_FAILED(FAIL_VAN_DESTROYED) ELSE IF (currentMissionStage = STAGE_GET_TO_BAD_GUY AND bDoneLamarIntoVan) OR currentMissionStage = STAGE_VAN_CHASE OR currentMissionStage = STAGE_GET_TO_HOUSE IF NOT bForcePassOnShitskip IF GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), hoodVehicle[HV_FRANKLIN_VAN], FALSE) > STUCK_FAIL_RANGE_m MISSION_FAILED(FAIL_ABANDONED_VAN) ENDIF ENDIF IF IS_VEHICLE_STUCK_TIMER_UP(hoodVehicle[HV_FRANKLIN_VAN], VEH_STUCK_JAMMED, JAMMED_TIME) OR IS_VEHICLE_STUCK_TIMER_UP(hoodVehicle[HV_FRANKLIN_VAN], VEH_STUCK_HUNG_UP, HUNG_UP_TIME) OR IS_VEHICLE_STUCK_TIMER_UP(hoodVehicle[HV_FRANKLIN_VAN], VEH_STUCK_ON_SIDE, SIDE_TIME) OR IS_VEHICLE_STUCK_TIMER_UP(hoodVehicle[HV_FRANKLIN_VAN], VEH_STUCK_ON_ROOF, ROOF_TIME) MISSION_FAILED(FAIL_VAN_STUCK) ENDIF 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() SET_FRANKLIN_MASK(FALSE) // check if we need to respawn the player in a different position, // if so call MISSION_FLOW_SET_FAIL_WARP_LOCATION() + SET_REPLAY_DECLINED_VEHICLE_WARP_LOCATION here 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 // get mission vector FUNC VECTOR GET_HOOD_VECTOR(HOOD_VECTOR_ENUM hVec) SWITCH hVec CASE HVEC_FRANKLIN_VAN_INIT RETURN <<-77.80, -1456.70, 31.03>> BREAK CASE HVEC_PLAYER_INIT //RETURN <<-18.56, -1451.07, 29.59>> RETURN <<-15.79069, -1451.12012, 29.55704>> BREAK CASE HVEC_BAD_GUY_HANGOUT //RETURN <<363.82, 322.32, 102.70>> RETURN <<363.74927, 323.37021, 102.71001>> BREAK CASE HVEC_HOUSE RETURN <<-52.78, -1456.56, 31.03>> BREAK CASE HVEC_REC RETURN <<-216.77869, -1494.96509, 30.23503>>//<<-214.96, -1492.64, 30.24>> BREAK CASE HVEC_FOOT_CHASE_INIT RETURN <<456.04520, -691.47260, 26.83633>> BREAK CASE HVEC_VAN_CHASE_INIT RETURN <<360.19, 323.68, 102.81>> BREAK CASE HVEC_VAN_IN_ALLEY //RETURN <<455.83, -706.46, 27.37>> RETURN <<458.02, -691.39, 27.43>> BREAK CASE HVEC_DRIVE_INIT RETURN <<509.78, -654.11, 23.75>> BREAK CASE HVEC_GIRL_INIT RETURN <<387.98, 358.86, 101.45>> BREAK CASE HVEC_FRANKLIN_ALLEY_INIT RETURN <<372.32019, 353.49075, 101.71169>> BREAK CASE HVEC_LAMAR_WALK_INIT RETURN <<-17.96112, -1452.73389, 29.57574>> BREAK CASE HVEC_LAMAR_ALLEY_INIT RETURN <<369.86670, 350.72247, 101.84525>> BREAK CASE HVEC_CONTAINER_ATTACH_ROT RETURN <<0,0,-90>> BREAK CASE HVEC_RUNNER_CHASE_INIT //RETURN <<461.16, -648.93, 27.17>> RETURN <<460.10, -656.61, 26.67>> BREAK CASE HVEC_CHOP_WALK_INIT RETURN <<-15.26298, -1453.30530, 29.50939>> BREAK CASE HVEC_CHOP_CHASE_INIT RETURN <<459.37540, -679.71918, 26.55455>> BREAK CASE HVEC_OFF_ROOF RETURN <<491.34, -556.23, 26.54>> BREAK CASE HVEC_CHASE_TRAIN RETURN <<552.57, -561.89, 23.80>> BREAK CASE HVEC_TRAINYARD RETURN <<514.25, -640.73, 23.75>> BREAK CASE HVEC_LOSE_RUNNER RETURN <<556.65, -565.12, 23.80>> BREAK CASE HVEC_RUNNER_HIDE RETURN <<525.98217, -679.14313, 24.80665>>//<<526.05, -679.82, 24.91>> BREAK CASE HVEC_FIND_GANGSTER RETURN <<529.37, -679.52, 23.76>> BREAK CASE HVEC_CHOP_FIND_INIT RETURN <<558.05817, -566.79877, 23.78100>> BREAK CASE HVEC_COLLIE_INIT RETURN <<501.49, -647.84, 23.75>> BREAK CASE HVEC_CHOP_HUMP_ENTRY RETURN <<503.14, -648.65, 23.75>> BREAK CASE HVEC_CHOP_BEHAVIOUR_SETPIECE_LAUNCH RETURN <<533.38, -664.49, 23.80>> BREAK CASE HVEC_CHOP_BEHAVIOUR_SETPIECE_TERMINATE RETURN <<531.43, -669.40, 23.80>> BREAK CASE HVEC_BLIP_ALLEY RETURN <<456.95, -805.38, 26.46>> BREAK CASE HVEC_LAMAR_SPRINT_TO_VAN RETURN <<363.46, 322.00, 102.71>> BREAK CASE HVEC_MOVE_LAST_PLAYER_VEHICLE RETURN <<-19.31, -1457.80, 29.47>> BREAK CASE HVEC_VAN_HIDDEN RETURN <<444.75775, -816.03680, 27.24718>> BREAK ENDSWITCH RETURN <<0,0,0>> ENDFUNC // fill position, rotation, FOV for a camera shot PROC FILL_CAMERA_PROPERTIES_FOR_HOOD_SHOT(HOOD_SHOT_DETAILS_ENUM cutsceneShot, VECTOR &vCamPos, VECTOR &vCamRot, FLOAT &fCamFOV) SWITCH cutsceneShot CASE H_SHOT_FLIRT vCamPos = <<383.42, 357.86, 102.65>> vCamRot = <<-1.53, 0.0, -89.85>> fCamFOV = 31.64 BREAK CASE H_SHOT_FLIRTB vCamPos = <<383.42, 357.86, 102.65>> vCamRot = <<-1.53, 0.0, -89.85>> fCamFOV = 29.64 BREAK CASE H_SHOT_SHOUT vCamPos = <<390.96, 357.80, 102.85>> vCamRot = <<-1.62, 0.0, 85.38>> fCamFOV = 31.24 BREAK CASE H_SHOT_SHOUTB vCamPos = <<390.96, 357.80, 102.85>> vCamRot = <<-1.62, 0.0, 85.38>> fCamFOV = 29.24 BREAK CASE H_SHOT_ESCAPE vCamPos = <<374.79, 360.54, 101.92>> vCamRot = <<8.38, 0.0, -102.25>> fCamFOV = 41.09 BREAK CASE H_SHOT_ESCAPEB vCamPos = <<374.79, 360.54, 101.92>> vCamRot = <<8.38, 0.0, -102.25>> fCamFOV = 39.09 BREAK CASE H_SHOT_LAMAR_SHOUT vCamPos = <<367.78, 366.68, 108.92>> vCamRot = <<-22.82, 0.0, -145.50>> fCamFOV = 41.09 BREAK CASE H_SHOT_LAMAR_SHOUTB vCamPos = <<367.78, 366.68, 108.92>> vCamRot = <<-22.82, 0.0, -145.50>> fCamFOV = 39.09 BREAK CASE H_SHOT_CRASH vCamPos = <<457.50, -704.22, 27.60>> vCamRot = <<-6.90, 0.0, -24.43>> fCamFOV = 38.53 BREAK CASE H_SHOT_LEAVE_CAR vCamPos = <<456.10, -696.84, 26.64>> vCamRot = <<10.45, 0.0, -138.80>> fCamFOV = 33.53 BREAK CASE H_SHOT_OFF_ROOF vCamPos = <<494.95, -562.77, 26.80>> vCamRot = <<36.68, 0.31, 98.29>> fCamFOV = 39.01 BREAK CASE H_SHOT_OFF_ROOFB vCamPos = <<494.95, -562.77, 26.80>> vCamRot = <<7.33, 1.25, 42.55>> fCamFOV = 39.01 BREAK CASE H_SHOT_THROUGH_FENCE vCamPos = <<493.14, -519.10, 24.76>> vCamRot = <<6.54, 0.98, -39.25>> fCamFOV = 50.0 BREAK CASE H_SHOT_THROUGH_FENCEB vCamPos = <<494.61, -516.30, 25.27>>//<<494.20, -518.85, 24.78>> vCamRot = <<-2.87, 0.57, -15.58>>//<<6.55, 0.99, -8.69>> fCamFOV = 50.0 BREAK CASE H_SHOT_ONTO_TRAIN vCamPos = <<555.54, -559.33, 27.13>> vCamRot = <<-10.37, 4.4, 143.73>> fCamFOV = 46.164 BREAK CASE H_SHOT_ONTO_TRAINB vCamPos = <<555.54, -559.33, 27.13>> vCamRot = <<-10.37, 4.4, 135.10>> fCamFOV = 46.164 BREAK CASE H_SHOT_LOST vCamPos = <<563.90, -560.71, 29.68>> vCamRot = <<-19.32, 5.88, 130.27>> fCamFOV = 55 BREAK CASE H_SHOT_LOSTB vCamPos = <<563.90, -560.71, 29.68>> vCamRot = <<-15.81, 5.88, 130.27>> fCamFOV = 55 BREAK CASE H_SHOT_FIND vCamPos = <<532.45, -678.69, 25.22>> vCamRot = <<-2.12, 0.0, 99.72>> fCamFOV = 37.88 BREAK CASE H_SHOT_FINDB vCamPos = <<531.91, -677.94, 25.20>> vCamRot = <<-2.12, 0.0, 111.87>> fCamFOV = 37.88 BREAK CASE H_SHOT_BOXCAR_FLEE vCamPos = <<527.40, -674.36, 25.92>> vCamRot = <<-7.43, 0.0, 162.87>> fCamFOV = 43.79 BREAK CASE H_SHOT_TRAPPED vCamPos = <<506.18, -643.42, 24.17>> vCamRot = <<3.93, 0.0, -119.93>> fCamFOV = 24.91 BREAK CASE H_SHOT_TRAPPEDB vCamPos = <<506.18, -643.42, 24.17>> vCamRot = <<3.93, 0.0, -119.93>> fCamFOV = 21.91 BREAK CASE H_SHOT_INTO_VAN vCamPos = <<510.37, -639.15, 25.56>> vCamRot = <<-6.17, 0.0, -170.88>> fCamFOV = 27.60 BREAK CASE H_SHOT_INTO_VANB vCamPos = <<510.37, -639.15, 25.56>> vCamRot = <<-6.17, 0.0, -170.88>> fCamFOV = 24.60 BREAK CASE H_SHOT_HOUSE vCamPos = <<-24.62, -1472.97, 36.19>> vCamRot = <<-13.11, 0.0, -21.69>> fCamFOV = 45.00 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_HOOD_SHOT(HOOD_SHOT_DETAILS_ENUM cutsceneShot, BOOL bIsInterp = FALSE, INT iInterpTime = 10000) VECTOR vCamPos, vCamRot FLOAT fCamFOV FILL_CAMERA_PROPERTIES_FOR_HOOD_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 FILL_CAMERA_PROPERTIES_FOR_HOOD_SHOT(INT_TO_ENUM(HOOD_SHOT_DETAILS_ENUM, ENUM_TO_INT(cutsceneShot)+1), vCamPos, vCamRot, fCamFOV) CREATE_MISSION_STATIC_CAM(interpCam) SET_CAM_COORD(interpCam, vCamPos) SET_CAM_ROT(interpCam, vCamRot) SET_CAM_FOV(interpCam, fCamFOV) SET_CAM_ACTIVE_WITH_INTERP(interpCam, staticCam, iInterpTime) ENDIF RENDER_SCRIPT_CAMS(TRUE, FALSE) ENDPROC // create an anim cam for sync scenes PROC CREATE_MISSION_ANIM_CAM() IF DOES_CAM_EXIST(animCam) DESTROY_CAM(animCam) ENDIF animCam = CREATE_CAM("DEFAULT_ANIMATED_CAMERA", TRUE) RENDER_SCRIPT_CAMS(TRUE, FALSE) ENDPROC // cam attached to car PROC CREATE_CAM_ATTACHED_TO_VAN(VAN_CAMERA_ENUM vanCamera) IF IS_VEHICLE_DRIVEABLE(hoodVehicle[HV_FRANKLIN_VAN]) CREATE_MISSION_STATIC_CAM(staticCam) SWITCH vanCamera CASE VAN_CAMERA_REAR //ATTACH_CAM_TO_ENTITY(staticCam, hoodVehicle[HV_FRANKLIN_VAN], <<-1.0, -5.7, 0.1>>) //POINT_CAM_AT_ENTITY(staticCam, hoodVehicle[HV_FRANKLIN_VAN], <<3.3,0.0,1.75>>) //SET_CAM_FOV(staticCam, 40.0) ATTACH_CAM_TO_ENTITY(staticCam, hoodVehicle[HV_FRANKLIN_VAN], <<-0.600, -2.400, 0.600>>) POINT_CAM_AT_ENTITY(staticCam, hoodVehicle[HV_FRANKLIN_VAN], <<0.800,-1.300,0.800>>) SET_CAM_FOV(staticCam, 55.0) BREAK CASE VAN_CAMERA_FRONT ATTACH_CAM_TO_ENTITY(staticCam, hoodVehicle[HV_FRANKLIN_VAN], <<-1.8, 2.400, 1.100>>) POINT_CAM_AT_ENTITY(staticCam, hoodVehicle[HV_FRANKLIN_VAN], <<0.300,0.200,0.350>>) SET_CAM_FOV(staticCam, 45.0) //ATTACH_CAM_TO_ENTITY(staticCam, hoodVehicle[HV_FRANKLIN_VAN], <<-1.5, 2.8, 1.2>>) //POINT_CAM_AT_ENTITY(staticCam, hoodVehicle[HV_FRANKLIN_VAN], <<0.3,0.0,0.45>>) //SET_CAM_FOV(staticCam, 40.0) BREAK ENDSWITCH RENDER_SCRIPT_CAMS(TRUE, FALSE) ENDIF ENDPROC // cam attached to car PROC CREATE_CAM_ATTACHED_TO_TRAIN() IF IS_VEHICLE_DRIVEABLE(GET_TRAIN_CARRIAGE(trainVehicle[1], 2)) CREATE_MISSION_STATIC_CAM(staticCam) ATTACH_CAM_TO_ENTITY(staticCam, GET_TRAIN_CARRIAGE(trainVehicle[1], 2), <<0.8, -3.2, 2.0>>) POINT_CAM_AT_ENTITY(staticCam, GET_TRAIN_CARRIAGE(trainVehicle[1], 2), <<0.8,-12.0,1.5>>) SET_CAM_FOV(staticCam, 58.72) SHAKE_CAM(staticCam, "road_vibration_shake") RENDER_SCRIPT_CAMS(TRUE, FALSE) ENDIF ENDPROC //HUD elements PROC SET_CUTSCENE_HUD_ELEMENTS() DISABLE_CELLPHONE(TRUE) SET_CHOP_VIEW_CAM_DISABLED(chopViewCamData, sSelectorPeds) CLEAR_CONTROL_LIGHT_EFFECT(PLAYER_CONTROL) STOP_HOOD_AUDIO_SCENE(HOOD_AUDIO_SCENE_CHOP_CAM) INFORM_MISSION_STATS_SYSTEM_OF_TIME_WINDOW_CLOSED() REMOVE_CHOP_SCENT(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 PROC COMMON_MISSION_CUTSCENE_BLENDOUT(FLOAT fBlend = 0.0, CAM_SPLINE_SMOOTHING_FLAGS smoothFlags = CAM_SPLINE_SLOW_IN_OUT_SMOOTH, BOOL bSpecifyModelForVan = FALSE) SET_PLAYER_CONTROL(PLAYER_ID(), TRUE) DISPLAY_RADAR(TRUE) DISPLAY_HUD(TRUE) DISABLE_CELLPHONE(FALSE) IF bSpecifyModelForVan SET_FIRST_PERSON_FLASH_EFFECT_VEHICLE_MODEL_NAME("SPEEDO") DISABLE_FIRST_PERSON_FLASH_EFFECT_THIS_UPDATE() ENDIF STOP_RENDERING_SCRIPT_CAMS_USING_CATCH_UP(FALSE, fBlend, smoothFlags) SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE) bRunningCutscene = FALSE bSkippedCutscene = FALSE bClearedForCutscene = FALSE bCutsceneWaitStarted = FALSE cutsceneStage = H_CUT_STAGE_INIT IF IS_SCREEN_FADED_OUT() IF DOES_CAM_EXIST(animCam) DESTROY_CAM(animCam) ENDIF DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME) ENDIF ENDPROC // setup stuff for hood cutscene PROC SET_MISSION_CUTSCENE(BOOL bStart, BOOL bResetControlAndCameras = TRUE, INT iInterpCams = -1, BOOL bResetCamHeading = TRUE, BOOL bRemoveText = TRUE, BOOL bDoFade = TRUE, BOOL bRenderScriptCams = TRUE, BOOL bToggleMultihead = TRUE) IF bRemoveText REMOVE_MISSION_TEXT() ENDIF IF bStart SET_CUTSCENE_HUD_ELEMENTS() SET_SCRIPTS_SAFE_FOR_CUTSCENE(TRUE,DEFAULT,bToggleMultihead) //Only toggle multihead blinders in some cases DISPLAY_RADAR(FALSE) DISPLAY_HUD(FALSE) iAllowSkipCutsceneTime = GET_GAME_TIMER() ELSE SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE, DEFAULT, bToggleMultihead) IF bResetControlAndCameras SET_PLAYER_CONTROL(PLAYER_ID(), TRUE) DISPLAY_RADAR(TRUE) DISPLAY_HUD(TRUE) DISABLE_CELLPHONE(FALSE) BOOL bInterpCams IF iInterpCams < 0 bInterpCams = FALSE ELSE bInterpCams = TRUE ENDIF IF bRenderScriptCams RENDER_SCRIPT_CAMS(FALSE, bInterpCams, iInterpCams) ENDIF IF DOES_CAM_EXIST(animCam) DESTROY_CAM(animCam) ENDIF IF DOES_CAM_EXIST(chopSwitchCam) DESTROY_CAM(chopSwitchCam) ENDIF DESTROY_MISSION_STATIC_CAM(staticCam) DESTROY_MISSION_STATIC_CAM(interpCam) IF bResetCamHeading SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0) ENDIF ENDIF bRunningCutscene = FALSE bSkippedCutscene = FALSE bClearedForCutscene = FALSE bCutsceneWaitStarted = FALSE cutsceneStage = H_CUT_STAGE_INIT IF bDoFade IF IS_SCREEN_FADED_OUT() DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME) ENDIF ENDIF ENDIF ENDPROC // prevent wanted level for cut PROC PREVENT_WANTED_LEVEL_FOR_CUTSCENE() SET_WANTED_LEVEL_MULTIPLIER(0.0) SET_MAX_WANTED_LEVEL(0) SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 0) SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID()) ENDPROC // get correct model for mission vehicle FUNC HOOD_MODEL_ENUM GET_MODEL_ENUM_FOR_HOOD_VEHICLE(HOOD_VEHICLE_ENUM hVehicle) SWITCH hVehicle CASE HV_FRANKLIN_VAN RETURN HM_FRANKLIN_VAN BREAK CASE HV_BAD_GUY_BIKE RETURN HM_BIKE BREAK ENDSWITCH RETURN HM_FRANKLIN_VAN ENDFUNC // 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 // is this model required on this stage? FUNC BOOL IS_MODEL_REQUIRED_FOR_MISSION_STAGE(HOOD_MODEL_ENUM pfModel, MISSION_STAGE_ENUM reqStage) SWITCH pfModel CASE HM_FRANKLIN RETURN TRUE BREAK CASE HM_LAMAR RETURN TRUE BREAK CASE HM_BAD_GUY IF reqStage > STAGE_GET_TO_BAD_GUY RETURN TRUE ENDIF BREAK CASE HM_CHOP RETURN TRUE BREAK CASE HM_COLLIE IF reqStage = STAGE_FIND_BAD_GUY RETURN TRUE ENDIF BREAK CASE HM_GIRL IF reqStage = STAGE_VAN_CHASE RETURN TRUE ENDIF BREAK CASE HM_WORKER IF reqStage = STAGE_FOOT_CHASE RETURN TRUE ENDIF BREAK CASE HM_FRANKLIN_VAN IF reqStage > STAGE_GET_TO_BAD_GUY RETURN TRUE ENDIF BREAK CASE HM_BIKE IF reqStage <= STAGE_FOOT_CHASE AND reqStage > STAGE_GET_TO_BAD_GUY RETURN TRUE ENDIF BREAK CASE HM_BUS CASE HM_TRAFFIC_CAR1 CASE HM_TRAFFIC_CAR2 IF reqStage = STAGE_FOOT_CHASE RETURN TRUE ENDIF BREAK CASE HM_LAMAR_PHONE CASE HM_FRANKLIN_MASK IF reqStage = STAGE_GET_TO_HOUSE RETURN TRUE ENDIF BREAK CASE HM_START_VEHICLE IF reqStage = STAGE_GET_TO_BAD_GUY IF Is_Replay_In_Progress() IF IS_REPLAY_START_VEHICLE_AVAILABLE() IF IS_REPLAY_VEHICLE_MODEL_UNDER_SIZE_LIMIT(GET_REPLAY_START_VEHICLE_MODEL(), <<0,0,0>>) RETURN TRUE ENDIF ENDIF ENDIF ENDIF BREAK CASE HM_ENGINE CASE HM_TANKER_CARRIAGE CASE HM_CONTAINER_CARRIAGE CASE HM_BOXCAR_DOOR CASE HM_BOXCAR_HANDLE CASE HM_ANCHOR //IF reqStage = STAGE_FOOT_CHASE IF reqStage = STAGE_FIND_BAD_GUY 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_HOOD_MODEL_ENUM(INT_TO_ENUM(HOOD_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_HOOD_MODEL_ENUM(INT_TO_ENUM(HOOD_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_HOOD_MODEL_ENUM(INT_TO_ENUM(HOOD_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(HOOD_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(HOOD_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 // setpieces //CASE 002 //CASE 003 //CASE 004 //CASE 005 //CASE 006 //CASE 007 CASE 011 CASE 012 IF reqStage = STAGE_FOOT_CHASE RETURN TRUE ENDIF BREAK //CASE 008 // crash cut //CASE 009 // IF reqStage = STAGE_VAN_CHASE // RETURN TRUE // ENDIF //BREAK //CASE 010 // lamar backs van up // IF reqStage = STAGE_FIND_BAD_GUY // RETURN TRUE // ENDIF //BREAK //CASE 013 // camera recording for bike // IF reqStage = STAGE_VAN_CHASE // RETURN TRUE // ENDIF //BREAK CASE 014 // bad guy alley escape IF reqStage = STAGE_GET_TO_BAD_GUY 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_HOOD_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_HOOD_RECORDING_PREFIX()) REMOVE_VEHICLE_RECORDING(iRec, GET_HOOD_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_HOOD_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 // this is decidedly unpleasant but what are you gonna do IF requestStage = STAGE_VAN_CHASE OR requestStage = STAGE_GET_TO_BAD_GUY // TEMP REQUEST_VEHICLE_RECORDING(001, GET_HOOD_UBER_RECORDING_PREFIX()) ENDIF // 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 IF requestStage = STAGE_VAN_CHASE WHILE NOT HAS_VEHICLE_RECORDING_BEEN_LOADED(001, GET_HOOD_UBER_RECORDING_PREFIX()) WAIT(0) ENDWHILE ENDIF ENDIF ENDPROC // is this waypoint required on this stage? FUNC BOOL IS_WAYPOINT_REQUIRED_FOR_MISSION_STAGE(INT iWaypoint, MISSION_STAGE_ENUM reqStage) SWITCH iWaypoint + 1 CASE 1 // bad guy on foot chase IF reqStage = STAGE_FOOT_CHASE OR reqStage = STAGE_VAN_CHASE RETURN TRUE ENDIF BREAK CASE 2 CASE 3 IF reqStage = STAGE_FOOT_CHASE RETURN TRUE ENDIF BREAK CASE 4 // franklin chase IF reqStage = STAGE_FOOT_CHASE RETURN TRUE ENDIF BREAK CASE 5 // bad guy escape attempt IF reqStage = STAGE_FIND_BAD_GUY RETURN TRUE ENDIF BREAK CASE 6 // chop follow to van IF reqStage = STAGE_GET_TO_BAD_GUY RETURN TRUE ENDIF BREAK CASE 7 // chop chase IF reqStage = STAGE_FOOT_CHASE OR reqStage = STAGE_VAN_CHASE RETURN TRUE ENDIF BREAK CASE 8 // chop find IF reqStage = STAGE_FIND_BAD_GUY RETURN TRUE ENDIF BREAK CASE 9 // lamar walk at end CASE 10 // chop walk at end IF reqStage = STAGE_GET_TO_HOUSE RETURN TRUE ENDIF BREAK CASE 11 // chop bypass fence IF reqStage = STAGE_FOOT_CHASE RETURN TRUE ENDIF BREAK CASE 12 // chop enter van IF reqStage = STAGE_GET_TO_BAD_GUY RETURN TRUE ENDIF BREAK ENDSWITCH RETURN FALSE ENDFUNC FUNC TEXT_LABEL GET_WAYPOINT_LABEL_FROM_INT(INT iWaypoint) TEXT_LABEL tWaypoint = "hood" tWaypoint += (iWaypoint+1) RETURN tWaypoint ENDFUNC // add a request for a waypoint PROC ADD_WAYPOINT_REQUEST(INT iWaypoint) bWaypointRequestTracker[iWaypoint] = TRUE TEXT_LABEL tWaypoint = GET_WAYPOINT_LABEL_FROM_INT(iWaypoint) REQUEST_WAYPOINT_RECORDING(tWaypoint) ENDPROC // clear a waypoint request slot PROC CLEAR_WAYPOINT_REQUEST(INT iWaypoint) IF bWaypointRequestTracker[iWaypoint] bWaypointRequestTracker[iWaypoint] = FALSE TEXT_LABEL tWaypoint = GET_WAYPOINT_LABEL_FROM_INT(iWaypoint) IF GET_IS_WAYPOINT_RECORDING_LOADED(tWaypoint) = FALSE REMOVE_WAYPOINT_RECORDING(tWaypoint) ENDIF ENDIF ENDPROC // have all requests for waypoints succeeded? FUNC BOOL HAVE_ALL_WAYPOINT_REQUESTS_SUCCEEDED() INT i // loop through and check for empty REPEAT NUMBER_WAYPOINT_REQUEST_SLOTS i IF bWaypointRequestTracker[i] TEXT_LABEL tWaypoint = GET_WAYPOINT_LABEL_FROM_INT(i) IF NOT GET_IS_WAYPOINT_RECORDING_LOADED(tWaypoint) // a full slot is not loaded, return false RETURN FALSE ENDIF ENDIF ENDREPEAT RETURN TRUE ENDFUNC // get recordings for particular stage PROC REQUEST_WAYPOINT_RECORDINGS_FOR_STAGE(MISSION_STAGE_ENUM requestStage, BOOL bWaitForLoad, BOOL bKeepWaypointsForCurrentStage) INT i REPEAT NUMBER_WAYPOINT_REQUEST_SLOTS i IF IS_WAYPOINT_REQUIRED_FOR_MISSION_STAGE(i, requestStage) // if we need this waypoint, request it ADD_WAYPOINT_REQUEST(i) ELSE // otherwise try and get rid of it IF NOT IS_WAYPOINT_REQUIRED_FOR_MISSION_STAGE(i, currentMissionStage) OR NOT bKeepWaypointsForCurrentStage CLEAR_WAYPOINT_REQUEST(i) ENDIF ENDIF ENDREPEAT // if wait for load, don't quit out 'til all the waypoints are in IF bWaitForLoad IF NOT HAVE_ALL_WAYPOINT_REQUESTS_SUCCEEDED() LOAD_ALL_OBJECTS_IF_SCREEN_FADED_OUT() WHILE NOT HAVE_ALL_WAYPOINT_REQUESTS_SUCCEEDED() WAIT(0) ENDWHILE ENDIF ENDIF ENDPROC // get an anim dict enum as string FUNC STRING GET_HOOD_ANIM_DICT_AS_STRING(HOOD_ANIM_DICT_ENUM animDict) SWITCH animDict CASE H_ANIM_DICT_SHARED RETURN "missfra0_chop_shared" BREAK CASE H_ANIM_DICT_TO_VAN RETURN "missfra0_chop_tovan" BREAK CASE H_ANIM_DICT_FOOT_CHASE RETURN "missfra0_chop_fchase" BREAK CASE H_ANIM_DICT_FIND RETURN "missfra0_chop_find" BREAK CASE H_ANIM_DICT_DRIVE_HOME RETURN "missfra0_chop_drhome" BREAK CASE H_ANIM_DICT_CHOP_VAN RETURN GET_CHOP_IN_VAN_ANIM_DICT() BREAK ENDSWITCH RETURN "invalid!" ENDFUNC // is this anim dict required on this stage? FUNC BOOL IS_ANIM_DICT_REQUIRED_FOR_MISSION_STAGE(HOOD_ANIM_DICT_ENUM animDict, MISSION_STAGE_ENUM reqStage) reqStage=reqStage SWITCH animDict CASE H_ANIM_DICT_SHARED RETURN TRUE BREAK CASE H_ANIM_DICT_TO_VAN IF reqStage = STAGE_GET_TO_BAD_GUY RETURN TRUE ENDIF BREAK CASE H_ANIM_DICT_FOOT_CHASE IF reqStage = STAGE_FOOT_CHASE RETURN TRUE ENDIF BREAK CASE H_ANIM_DICT_FIND IF reqStage = STAGE_FIND_BAD_GUY RETURN TRUE ENDIF BREAK CASE H_ANIM_DICT_DRIVE_HOME IF reqStage = STAGE_GET_TO_HOUSE OR reqStage = STAGE_VAN_CHASE RETURN TRUE ENDIF BREAK //CASE H_ANIM_DICT_TAKEDOWN // IF reqStage = STAGE_FIND_BAD_GUY // RETURN TRUE // ENDIF //BREAK CASE H_ANIM_DICT_CHOP_VAN IF reqStage <= STAGE_VAN_CHASE OR reqStage = STAGE_GET_TO_HOUSE RETURN TRUE ENDIF BREAK //CASE H_ANIM_DICT_GESTURE_ENT //CASE H_ANIM_DICT_GESTURE_IDLE1 //CASE H_ANIM_DICT_GESTURE_IDLE2 //CASE H_ANIM_DICT_GESTURE_EXT // IF reqStage = STAGE_FOOT_CHASE // RETURN TRUE // ENDIF //BREAK //CASE H_ANIM_DICT_TAXI // IF reqStage = STAGE_FIND_BAD_GUY /// RETURN TRUE // ENDIF //BREAK ENDSWITCH RETURN FALSE ENDFUNC // add a request for an anim PROC ADD_ANIM_DICT_REQUEST(HOOD_ANIM_DICT_ENUM animDict) bAnimDictRequestTracker[animDict] = TRUE STRING sAnimDict = GET_HOOD_ANIM_DICT_AS_STRING(animDict) REQUEST_ANIM_DICT(sAnimDict) ENDPROC // clear an anim request slot PROC CLEAR_ANIM_DICT_REQUEST(HOOD_ANIM_DICT_ENUM animDict) IF bAnimDictRequestTracker[animDict] bAnimDictRequestTracker[animDict] = FALSE STRING sAnimDict = GET_HOOD_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(HOOD_ANIM_DICT_ENUM) i IF bAnimDictRequestTracker[i] IF NOT HAS_ANIM_DICT_LOADED(GET_HOOD_ANIM_DICT_AS_STRING(INT_TO_ENUM(HOOD_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(HOOD_ANIM_DICT_ENUM) i HOOD_ANIM_DICT_ENUM thisAnimDict = INT_TO_ENUM(HOOD_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 // get a weapon enum as a weapontype FUNC WEAPON_TYPE GET_HOOD_WEAPON_TYPE(HOOD_WEAPON_ENUM weapon) SWITCH weapon CASE H_WEAPON_PISTOL RETURN WEAPONTYPE_PISTOL BREAK ENDSWITCH RETURN WEAPONTYPE_UNARMED ENDFUNC // is this weapon required on this stage? FUNC BOOL IS_WEAPON_REQUIRED_FOR_MISSION_STAGE(HOOD_WEAPON_ENUM weapon, MISSION_STAGE_ENUM reqStage) SWITCH weapon CASE H_WEAPON_PISTOL IF reqStage <= STAGE_VAN_CHASE RETURN TRUE ENDIF BREAK ENDSWITCH RETURN FALSE ENDFUNC // add a request for a weapon PROC ADD_WEAPON_REQUEST(HOOD_WEAPON_ENUM weapon) bWeaponRequestTracker[weapon] = TRUE WEAPON_TYPE weaponType = GET_HOOD_WEAPON_TYPE(weapon) REQUEST_WEAPON_ASSET(weaponType) ENDPROC // clear a weapon request slot PROC CLEAR_WEAPON_REQUEST(HOOD_WEAPON_ENUM weapon) IF bWeaponRequestTracker[weapon] bWeaponRequestTracker[weapon] = FALSE WEAPON_TYPE weaponType = GET_HOOD_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(HOOD_WEAPON_ENUM) i IF bWeaponRequestTracker[i] IF NOT HAS_WEAPON_ASSET_LOADED(GET_HOOD_WEAPON_TYPE(INT_TO_ENUM(HOOD_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(HOOD_WEAPON_ENUM) i HOOD_WEAPON_ENUM thisWeapon = INT_TO_ENUM(HOOD_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_HOOD_PTFX_AS_STRING(HOOD_PTFX_ENUM ptfx) SWITCH ptfx CASE H_PTFX_SCRIPT RETURN "script" BREAK ENDSWITCH RETURN "invalid!" ENDFUNC */ // is this ptfx required on this stage? FUNC BOOL IS_PTFX_REQUIRED_FOR_MISSION_STAGE(HOOD_PTFX_ENUM ptfx, MISSION_STAGE_ENUM reqStage) SWITCH ptfx CASE H_PTFX_SCRIPT IF reqStage >= STAGE_FOOT_CHASE RETURN TRUE ENDIF BREAK ENDSWITCH RETURN FALSE ENDFUNC // add a request for a ptfx PROC ADD_PTFX_REQUEST(HOOD_PTFX_ENUM ptfx) bPTFXRequestTracker[ptfx] = TRUE // STRING sPTFX = GET_HOOD_PTFX_AS_STRING(ptfx) REQUEST_PTFX_ASSET() ENDPROC // clear a ptfx request slot PROC CLEAR_PTFX_REQUEST(HOOD_PTFX_ENUM ptfx) IF bPTFXRequestTracker[ptfx] bPTFXRequestTracker[ptfx] = FALSE // STRING sPTFX = GET_HOOD_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(HOOD_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(HOOD_PTFX_ENUM) i HOOD_PTFX_ENUM thisPTFX = INT_TO_ENUM(HOOD_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_HOOD_SFX_AS_STRING(HOOD_SFX_ENUM sfx) SWITCH sfx CASE H_SFX_BOXCARS RETURN "FRANKLIN_0_BOXCARS" BREAK CASE H_SFX_GENERAL RETURN "FRANKLIN_0_GENERAL" BREAK ENDSWITCH RETURN "invalid!" ENDFUNC // is this sfx required on this stage? FUNC BOOL IS_SFX_REQUIRED_FOR_MISSION_STAGE(HOOD_SFX_ENUM sfx, MISSION_STAGE_ENUM reqStage) SWITCH sfx CASE H_SFX_BOXCARS IF reqStage = STAGE_FIND_BAD_GUY RETURN TRUE ENDIF BREAK CASE H_SFX_GENERAL IF reqStage = STAGE_FOOT_CHASE OR reqStage = STAGE_VAN_CHASE RETURN TRUE ENDIF BREAK ENDSWITCH RETURN FALSE ENDFUNC // add a request for a sfx PROC ADD_SFX_REQUEST(HOOD_SFX_ENUM sfx) bSFXRequestTracker[sfx] = TRUE STRING sSFX = GET_HOOD_SFX_AS_STRING(sfx) REQUEST_SCRIPT_AUDIO_BANK(sSFX) ENDPROC // clear a sfx request slot PROC CLEAR_SFX_REQUEST(HOOD_SFX_ENUM sfx) IF bSFXRequestTracker[sfx] bSFXRequestTracker[sfx] = FALSE STRING sSFX = GET_HOOD_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(HOOD_SFX_ENUM) i IF bSFXRequestTracker[i] IF NOT REQUEST_SCRIPT_AUDIO_BANK(GET_HOOD_SFX_AS_STRING(INT_TO_ENUM(HOOD_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(HOOD_SFX_ENUM) i HOOD_SFX_ENUM thisSFX = INT_TO_ENUM(HOOD_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(HOOD_MISC_ASSET_ENUM miscAsset, MISSION_STAGE_ENUM reqStage) SWITCH miscAsset CASE H_MISC_ASSET_VAN_ANIMS IF reqStage = STAGE_GET_TO_HOUSE OR reqStage = STAGE_VAN_CHASE RETURN TRUE ENDIF BREAK CASE H_MISC_ASSET_INJURED_CLIPSET //IF reqStage = STAGE_GET_TO_HOUSE // RETURN TRUE //ENDIF BREAK //CASE H_MISC_ASSET_CHOP_CAM_SFX // IF reqStage = STAGE_FOOT_CHASE // OR reqStage = STAGE_FIND_BAD_GUY // RETURN TRUE // ENDIF //BREAK CASE H_MISC_ASSET_FAKE_CELLPHONE IF reqStage = STAGE_GET_TO_HOUSE RETURN TRUE ENDIF BREAK CASE H_MISC_ASSET_GESTURES IF reqStage = STAGE_GET_TO_BAD_GUY RETURN TRUE ENDIF BREAK ENDSWITCH RETURN FALSE ENDFUNC // add a request for a misc asset PROC ADD_MISC_ASSET_REQUEST(HOOD_MISC_ASSET_ENUM miscAsset) bMiscAssetRequestTracker[miscAsset] = TRUE SWITCH miscAsset CASE H_MISC_ASSET_VAN_ANIMS REQUEST_VEHICLE_ASSET(GET_MODEL_FOR_HOOD_MODEL_ENUM(HM_FRANKLIN_VAN)) BREAK CASE H_MISC_ASSET_INJURED_CLIPSET REQUEST_ANIM_SET(GET_INJURED_CLIPSET_NAME()) BREAK CASE H_MISC_ASSET_FAKE_CELLPHONE REQUEST_FAKE_CELLPHONE_MOVIE(fakeCellphoneData) BREAK CASE H_MISC_ASSET_GESTURES REQUEST_CLIP_SET("ANIM_GROUP_GESTURE_MISS_FRA0") BREAK //CASE H_MISC_ASSET_CHOP_CAM_SFX // REQUEST_CHOP_CAM_SFX() //BREAK ENDSWITCH ENDPROC // clear a misc asset slot PROC CLEAR_MISC_ASSET_REQUEST(HOOD_MISC_ASSET_ENUM miscAsset) IF bMiscAssetRequestTracker[miscAsset] bMiscAssetRequestTracker[miscAsset] = FALSE SWITCH miscAsset CASE H_MISC_ASSET_VAN_ANIMS REMOVE_VEHICLE_ASSET(GET_MODEL_FOR_HOOD_MODEL_ENUM(HM_FRANKLIN_VAN)) BREAK CASE H_MISC_ASSET_INJURED_CLIPSET REMOVE_ANIM_SET(GET_INJURED_CLIPSET_NAME()) BREAK CASE H_MISC_ASSET_FAKE_CELLPHONE RELEASE_FAKE_CELLPHONE_MOVIE(fakeCellphoneData) BREAK CASE H_MISC_ASSET_GESTURES REMOVE_CLIP_SET("ANIM_GROUP_GESTURE_MISS_FRA0") BREAK //CASE H_MISC_ASSET_CHOP_CAM_SFX // RELEASE_CHOP_CAM_SFX(chopViewCamData) //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(HOOD_MISC_ASSET_ENUM) i IF bMiscAssetRequestTracker[i] SWITCH INT_TO_ENUM(HOOD_MISC_ASSET_ENUM, i) CASE H_MISC_ASSET_VAN_ANIMS IF NOT HAS_VEHICLE_ASSET_LOADED(GET_MODEL_FOR_HOOD_MODEL_ENUM(HM_FRANKLIN_VAN)) RETURN FALSE ENDIF BREAK CASE H_MISC_ASSET_INJURED_CLIPSET IF NOT HAS_ANIM_SET_LOADED(GET_INJURED_CLIPSET_NAME()) RETURN FALSE ENDIF BREAK CASE H_MISC_ASSET_FAKE_CELLPHONE IF NOT HAS_FAKE_CELLPHONE_MOVIE_LOADED(fakeCellphoneData) RETURN FALSE ENDIF BREAK CASE H_MISC_ASSET_GESTURES IF NOT HAS_CLIP_SET_LOADED("ANIM_GROUP_GESTURE_MISS_FRA0") RETURN FALSE ENDIF BREAK //CASE H_MISC_ASSET_CHOP_CAM_SFX // IF NOT REQUEST_CHOP_CAM_SFX() // 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(HOOD_MISC_ASSET_ENUM) i HOOD_MISC_ASSET_ENUM thisMiscAsset = INT_TO_ENUM(HOOD_MISC_ASSET_ENUM, i) IF IS_MISC_ASSET_REQUIRED_FOR_MISSION_STAGE(thisMiscAsset, requestStage) // if we need this asset, request it ADD_MISC_ASSET_REQUEST(thisMiscAsset) ELSE // otherwise try and get rid of it IF NOT IS_MISC_ASSET_REQUIRED_FOR_MISSION_STAGE(thisMiscAsset, currentMissionStage) OR NOT bKeepMiscAssetsForCurrentStage CLEAR_MISC_ASSET_REQUEST(thisMiscAsset) ENDIF ENDIF ENDREPEAT // if wait for load, don't quit out 'til all the recordings are in IF bWaitForLoad IF NOT HAVE_ALL_MISC_ASSET_REQUESTS_SUCCEEDED() LOAD_ALL_OBJECTS_IF_SCREEN_FADED_OUT() WHILE NOT HAVE_ALL_MISC_ASSET_REQUESTS_SUCCEEDED() WAIT(0) ENDWHILE ENDIF ENDIF ENDPROC // request the text for the mission PROC REQUEST_TEXT(BOOL bWaitForLoad) REQUEST_ADDITIONAL_TEXT("FCHASE", MISSION_TEXT_SLOT) IF bWaitForLoad WHILE NOT HAS_ADDITIONAL_TEXT_LOADED(MISSION_TEXT_SLOT) WAIT(0) ENDWHILE ENDIF ENDPROC // reset foot chase values PROC RESET_FOOT_CHASE_VALUES() INT i runnerStage = RUNNER_START_FLEE chopStage = CHOP_START_CHASE setpieceStage = SETPIECE_FREE_INTO_STATION runnerChaseProperties.chaseState = CHASE_STATE_MOVING runnerChaseProperties.chaseAnim = CHASE_ANIM_NONE runnerChaseProperties.bWaiting = FALSE REPEAT NUMBER_YARD_VEHICLES i bStartedYardVehicle[i] = FALSE ENDREPEAT REPEAT NUMBER_TRAINS i bStartedTrain[i] = FALSE ENDREPEAT REPEAT NUMBER_YARD_PEDS i yardPed[i].state = YARD_PED_STATE_IDLE ENDREPEAT REPEAT COUNT_OF(FRANKLIN_WARP_ENUM) i bFranklinWarp[i] = FALSE ENDREPEAT iChopBounceOnCarStage = 0 bStartedRunnerMovement = FALSE bDoneDriverSwear = FALSE bDoneDriverLookAtChop = FALSE driverOutState = DRIVER_OUT_INACTIVE 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 sSelectorPeds.eNewSelectorPed = NUMBER_OF_SELECTOR_PEDS cutsceneStage = H_CUT_STAGE_INIT bRunningCutscene = FALSE bSkippedCutscene = FALSE bClearedForCutscene = FALSE bCutsceneWaitStarted = FALSE bShownGodText = FALSE bShouldDoGetInText = FALSE bDoneBanter = FALSE bSavedBanter = FALSE bCheckedKillBanter = FALSE bDoneReturnSpeech = FALSE //bKilledInVanConversationOnGetOut = FALSE //bKilledVanConversationOnWanted = FALSE bDoneLoseWantedSpeech = FALSE bShownLoseWantedPrompt = FALSE bRemovedBlipsForWanted = FALSE bTriggeredLamarDamageReaction = FALSE iNextRandomSpeechTime = -1 iNextCheckVanHealthTime = -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_GET_TO_BAD_GUY createPostIntroStage = CREATE_POST_INTRO_STAGE_NOT_STARTED createBadGuyStage = CREATE_BAD_GUY_STAGE_NOT_STARTED createBlockingVehiclesStage = CREATE_BLOCKING_VEHICLES_STAGE_NOT_STARTED chopIntoVanState = CHOP_INTO_VAN_STATE_NOT_STARTED chopBehaviourSpeechState = CHOP_BEHAVIOUR_SPEECH_NOT_STARTED bDoneWaitForLamarPrompt = FALSE bDoneHurrySpeech = FALSE bShownHurryPrompt = FALSE bTurnedOffPhoneForWalk = FALSE bKilledOnFootConversation = FALSE bDoneGetLamarPrompt = FALSE bDoneLamarIntoVan = FALSE bDoneChopGetInSpeech = FALSE bDoneArriveSpeech = FALSE bDoneGotoSpeech = FALSE bLamarWalkPaused = FALSE bDoneChopBehaviourSpeech = FALSE bDoneUphillSpeech = FALSE bDoneCreepSpeech = FALSE bDoneBadGuySpookedReact = FALSE bKilledSpeechForArrive = FALSE bFrozenVan = FALSE bDoneLamarPullGunCue = FALSE bDoneBikeSpeedOffCue = FALSE bClearedPlayerRun = FALSE bDoneFranklinIntoVanSpeech = FALSE bShownFirstDownloadHelp = FALSE bKilledSpeechForVan = FALSE bLamarWaitingAtVan = FALSE bFranklinWentAhead = FALSE bLamarWasInGroup = FALSE bDoneLamarWalkToVan = FALSE bStoppedChopExcitement = FALSE bWarpedVanToAlley = FALSE bKilledSpeechAtCutscene = FALSE bShutVanDoors = FALSE bForcedIntoVan = FALSE bHadFirstLineOfBanter = FALSE bDoneHelloChopSpeech = FALSE bDoneAreYouOKChopSpeech = FALSE bWarpedLamarToVan = FALSE iOpenVanDoorSoundStage = 0 fLamarSpeedCount = 0 fLamarJammedTime = 0 //REPEAT COUNT_OF(bDoneConversationAnim) i // bDoneConversationAnim[i] = FALSE //ENDREPEAT iFailWantedTime = -1 iGetInTextStage = 0 iTriggerPostBanterSpeechTime = -1 fLamarWalkSpeed = MIN_LAMAR_SPEED BREAK CASE STAGE_VAN_CHASE chaseSpeedStage = CHASE_SPEED_START crashTriggerState = CRASH_TRIGGER_WAITING uberTrailerState = UBER_TRAILER_NOT_CREATED createYardStage = CREATE_YARD_STAGE_NOT_STARTED fCarChaseSpeed = 1.0 fDesiredSpeed = 1.0 fNoSpeechTime = 0.0 iGetInTextStage = 2 iVanChaseSpeechStage = 0 iDontShootSpeechStage = 0 bUsingActionCam = FALSE bTempLamarvan = FALSE bKnockedOffBike = FALSE bPedOffBikeAI = FALSE bResetScriptRagdoll = FALSE bForcedRunnerDismount = FALSE bDoneWontCatchComplainSpeech = FALSE bDoneWontCatchReplySpeech = FALSE bDoneCrashReactionSpeech = FALSE bKilledSpeechForCrashReaction = FALSE bDoneGetChopSpeech = FALSE bDoneReleaseChopSpeech = FALSE bDoneBusSmash = FALSE bDoneDownhillSpeech = FALSE bDoneGoingLeftSpeech = FALSE bDoneGoingDownAlleySpeech = FALSE bDoneUseAbilitySpeech = FALSE bShownSpecialAbilityHelp = FALSE bKilledSpeechAtCutscene = FALSE bRemovedGirl = FALSE bSpeedUpBikeInAlley = FALSE bPausedBlockingTraffic = FALSE bPausedCrashBus = FALSE bClearedPlayerRun = FALSE bBlipAlley = FALSE bSetWorkerDefault = FALSE bDoneInVanCue = FALSE bDoneGetOutCue = FALSE bResetDirectEntryFlag = FALSE bStoppedChopExcitement = FALSE bSetBikeAsSmoking = FALSE bClearedChopTask = FALSE bAllowRunnerMovement = FALSE bLamarShouldBeInGroup = FALSE bDoneThisWillGetBumpySpeech = FALSE bSetIssiNoCollision = FALSE bDoneLaughAtFranklinSpeech = FALSE bUsedAbility = FALSE bDoneFocusOnBikeAudioScene = FALSE iOpenVanDoorSoundStage = 0 iLaughAtFranklinTime = -1 //bRemoveAlleyBlip = FALSE //bShownAlleyPrompt = FALSE RESET_FOOT_CHASE_VALUES() BREAK CASE STAGE_FOOT_CHASE ontoTrainShot = ONTO_TRAIN_JUMP chopChaseProperties.chaseState = CHASE_STATE_MOVING chopChaseProperties.chaseAnim = CHASE_ANIM_NONE chopChaseProperties.bWaiting = FALSE chopViewCamData.state = CHOP_VIEW_CAM_DISABLED chopBehaviourSetpieceStage = CBS_NOT_STARTED chopWaitState = CHOP_WAIT_STATE_NOT_STARTED createTrainsStage = CREATE_TRAINS_STAGE_NOT_STARTED chopBypassFenceState = CHOP_BYPASS_FENCE_NOT_STARTED createCarsStage = CREATE_CARS_STAGE_NOT_STARTED bDoneLamarEncourageSpeech = FALSE bStartedChopMovement = FALSE bDoneChaseScent = FALSE //bForcedJumpOffRoof = FALSE bClearedPlayerRun = FALSE //bShownChopFenceHelp = FALSE bCheckedContainerWait = FALSE bDoneThroughFenceCut = FALSE bBypassedFence = FALSE bSmashedFence = FALSE bDoRunAfterFence = FALSE bFranklinShoutBeforeTrain = FALSE //bPlayingChopWaitTurnAnim = FALSE bDoneOnTrainCut = FALSE bRepositionedFranklinForTrain = FALSE bRemovedTraffic = FALSE bRemovedBusStation = FALSE bShownChopViewHelp = FALSE bCancelledChopHint = FALSE bDoneLoseReactSpeech = FALSE bRemovedBike = FALSE bDoneReactToRunStatSpeech = FALSE bPreparedSmashFenceCue = FALSE bDoneSmashFenceCue = FALSE bDoneBypassFenceCue = FALSE bDoneChopCamCue = FALSE bDoneBreakFenceAudioScene = FALSE bInterpedToGameCam = FALSE bDoneJumpHelp = FALSE bShownNoStaminaHelp = FALSE bShownHoodSlideHelp = FALSE bRemovedBuses = FALSE bRemovedCarpark = FALSE bFailForLost = FALSE bResetBallaGetUp = FALSE runHelpState = RUN_HELP_STATE_NOT_STARTED iInitialStaminaValue = GET_SP_PLAYER_PED_STAT_VALUE(CHAR_FRANKLIN, PS_STAMINA) REPEAT NUMBER_GRAB_SCENARIO_PEDS i grabScenarioPed[i].ped = NULL grabScenarioPed[i].state = GRAB_SCENARIO_PED_STATE_NOT_GRABBED grabScenarioPed[i].bDoneSpeech = FALSE ENDREPEAT BREAK CASE STAGE_FIND_BAD_GUY chopViewCamData.state = CHOP_VIEW_CAM_DISABLED chopBehaviourSetpieceStage = CBS_NOT_STARTED chopHumpState = CHOP_HUMP_STATE_NOT_STARTED chopSniffState = CHOP_SNIFF_STATE_NOT_STARTED openTargetContainerState = OPEN_TARGET_CONTAINER_STATE_NOT_STARTED ballaDiscoveredState = BALLA_DISCOVERED_STATE_NOT_STARTED callChopBackState = CALL_CHOP_BACK_STATE_NOT_STARTED bDoneChaseScent = FALSE bShownChopBehaviourHelp = FALSE bShownCallChopHelp = FALSE bDoneGotoSpeech = FALSE bGotToTrain = FALSE bDoneChopGoToTrain = FALSE bDoneWhereGoingSpeech = FALSE bDoneNoChopSpeech = FALSE bDoneThreatenChopSpeech = FALSE bDoneGetBackOnSpeech = FALSE bDoneCommentOnBehaviourSpeech = FALSE bShouldCommentOnBehaviour = FALSE bDoingChopPull = FALSE bDoneGetClosePrompt = FALSE bDoneGoAwaySpeech = FALSE bDoneItsADudeSpeech = FALSE bRepositionedBallaHiding = FALSE bDoneChopSniffSFX = FALSE bFoundBadGuy = FALSE bDoneFoundBadGuySpeech = FALSE bDoneChopChaseFoundBalla = FALSE bDoneRunnerFallOver = FALSE bAllowKidnapCutscene = FALSE bDoneRunnerRelax = FALSE bDoneChopTakeDown = FALSE bClearedPlayerRun = FALSE bDoneSecondFindSpeech = FALSE //bShownFranklinSwitchPrompt = FALSE bBlippedFirstBoxcars = FALSE bBlippedSecondBoxcars = FALSE bShownBoxcarPrompt = FALSE bDoneBoxcarSpeech = FALSE bDoneSearchBoxcarSpeech = FALSE bDoneEmptyBoxcarSpeech = FALSE bRestoredBoxcarGameplayCam = FALSE bDoneDoorSlideSound = FALSE bDoneDoorLimitSound = FALSE bPreparedBaddyCue = FALSE bDoneBaddyCue = FALSE bDoneGotoCollieCue = FALSE bDoneMountCue = FALSE bDoneDismountCue = FALSE bDoneBlipSecondBoxcarsCue = FALSE bDoneFoundCue = FALSE bCallChopBackSuccess = FALSE bDoneDRunSpeech = FALSE bDoneDFallSpeech = FALSE bDoneGetHisAssSpeech = FALSE bDoneCutsceneBlood = FALSE bShownSwitchToOpenHelp = FALSE bShownSwitchToCallHelp = FALSE bOpenedAnyCarriage = FALSE bResetOpenedAnyCarriage = FALSE bShownQuickSwitchHelp = FALSE bSetDamageOnBadGuy = FALSE bWarpedToChaseEnd = FALSE bDoneWhistleSound = FALSE bDoneBoxcarCutsceneCam = FALSE iScentWaypoint = 0 iChopBehaviourHelpTime = 0 iChopWaypointProgress = 0 iLeftBoxcarCam = 0 iRightBoxcarCam = 0 fChopOverride = 1.0 bStartedTrain[0] = TRUE bStartedTrain[1] = TRUE bStartedTrain[2] = TRUE fChopThroughBoxcarSpeed = 0.1 #IF IS_DEBUG_BUILD bDebugForceOpenBoxcar = FALSE #ENDIF BREAK CASE STAGE_GET_TO_HOUSE dropoffStage = DROPOFF_STAGE_NOT_STARTED lamarPhoneState = LAMAR_PHONE_STATE_NOT_STARTED franklinMaskRemoveState = FRANKLIN_MASK_REMOVE_STATE_NOT_STARTED shapeTestState = SHAPE_TEST_STATE_NOT_STARTED letOutShot = LET_OUT_PHONE vRunnerAttachToVanPos = <<0,0,0>> vRunnerAttachToVanRot = <<0,0,0>> bDoneGotoSpeech = FALSE bShownLetOutPrompt = FALSE bInLoseWantedState = FALSE bRemovedChaseSetpieces = FALSE bPhoneForceApplied = FALSE bChopTurnToIdle = FALSE bChopResetInIdle = FALSE bDoneGetOutSpeech = FALSE bDoneLetOut = FALSE // bKilledConversationOnLetOut = FALSE bDoneThreatenResponseSpeech = FALSE bDoneLamarShoutSpeech = FALSE bDoneFranklinShoutSpeech = FALSE //bBadGuyRun = FALSE bRestoredBadGuyDamage = FALSE bLamarOutOfVan = FALSE bKilledTalkAboutMichaelSpeech = FALSE bCleanedUpPhone = FALSE bCleanedUpBalla = FALSE bDoingDistantSiren = FALSE bSetDamageOnBadGuy = FALSE bStartedLetOutCutscene = FALSE bShutLDoor = FALSE bShutRDoor = FALSE bStoppedVanAnim = FALSE bBackBlocked = TRUE bDoneTrainingSpeech = FALSE bKilledPreloadSpeech = FALSE bDonePoliceReport = FALSE bBlockedCustoms = FALSE iGetInTextStage = 2 fDisplayBadPositionTime = 0.0 BREAK ENDSWITCH ENDPROC // return the correct character to start a particular stage on FUNC enumCharacterList GET_CHARACTER_FOR_MISSION_STAGE(MISSION_STAGE_ENUM getStage) getStage = getStage RETURN CHAR_FRANKLIN ENDFUNC // create a player vehicle for the mission PROC HOOD_CREATE_VEHICLE(HOOD_VEHICLE_ENUM hVehicle, VECTOR vCreatePos, FLOAT fCreateRot, BOOL bKeepModel = TRUE, BOOL bKeepVehicle = TRUE, BOOL bMakeInvincible = FALSE) IF NOT IS_VEHICLE_DRIVEABLE(hoodVehicle[hVehicle]) HOOD_MODEL_ENUM vehicleModelEnum = GET_MODEL_ENUM_FOR_HOOD_VEHICLE(hVehicle) IF hVehicle = HV_FRANKLIN_VAN CREATE_NPC_VEHICLE(hoodVehicle[hVehicle], CHAR_LAMAR, vCreatePos, fCreateRot, FALSE) ELSE hoodVehicle[hVehicle] = CREATE_VEHICLE(GET_MODEL_FOR_HOOD_MODEL_ENUM(vehicleModelEnum), vCreatePos, fCreateRot) ENDIF SET_VEHICLE_ON_GROUND_PROPERLY(hoodVehicle[hVehicle]) IF NOT bKeepModel CLEAR_MODEL_REQUEST(ENUM_TO_INT(vehicleModelEnum)) ENDIF IF bMakeInvincible SET_VEHICLE_CAN_BE_VISIBLY_DAMAGED(hoodVehicle[hVehicle], FALSE) SET_VEHICLE_CAN_BREAK(hoodVehicle[hVehicle], FALSE) SET_ENTITY_PROOFS(hoodVehicle[hVehicle], TRUE, TRUE, TRUE, TRUE, TRUE) ENDIF IF NOT bKeepVehicle SET_VEHICLE_AS_NO_LONGER_NEEDED(hoodVehicle[hVehicle]) ENDIF SET_VEHICLE_CAN_LEAK_OIL(hoodVehicle[hVehicle], FALSE) SET_VEHICLE_CAN_LEAK_PETROL(hoodVehicle[hVehicle], FALSE) SET_DISABLE_VEHICLE_PETROL_TANK_FIRES(hoodVehicle[hVehicle], TRUE) SWITCH hVehicle CASE HV_FRANKLIN_VAN //SET_VEHICLE_COLOUR_COMBINATION(hoodVehicle[hVehicle], 1) //SET_VEHICLE_DIRT_LEVEL(hoodVehicle[hVehicle], 10.0) SET_VEHICLE_STRONG(hoodVehicle[hVehicle], TRUE) //INT i //FOR i=1 TO 8 // SET_VEHICLE_EXTRA(hoodVehicle[hVehicle], i, TRUE) //ENDFOR SET_VEHICLE_CAN_BREAK(hoodVehicle[hVehicle], FALSE) SET_DOOR_ALLOWED_TO_BE_BROKEN_OFF(hoodVehicle[hVehicle], SC_DOOR_FRONT_LEFT, FALSE) SET_DOOR_ALLOWED_TO_BE_BROKEN_OFF(hoodVehicle[hVehicle], SC_DOOR_FRONT_RIGHT, FALSE) SET_DOOR_ALLOWED_TO_BE_BROKEN_OFF(hoodVehicle[hVehicle], SC_DOOR_REAR_LEFT, FALSE) SET_DOOR_ALLOWED_TO_BE_BROKEN_OFF(hoodVehicle[hVehicle], SC_DOOR_REAR_RIGHT, FALSE) SET_VEHICLE_HAS_STRONG_AXLES(hoodVehicle[hVehicle], TRUE) SET_VEHICLE_TYRES_CAN_BURST(hoodVehicle[hVehicle], FALSE) INFORM_MISSION_STATS_OF_DAMAGE_WATCH_ENTITY(hoodVehicle[hVehicle]) INFORM_MISSION_STATS_OF_SPEED_WATCH_ENTITY(hoodVehicle[hVehicle]) iCachedVanHealth = GET_ENTITY_HEALTH(hoodVehicle[hVehicle]) BREAK CASE HV_BAD_GUY_BIKE SET_VEHICLE_COLOUR_COMBINATION(hoodVehicle[hVehicle], 1) SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(hoodVehicle[hVehicle], TRUE) SET_AUDIO_VEHICLE_PRIORITY(hoodVehicle[hVehicle], AUDIO_VEHICLE_PRIORITY_MAX) BREAK ENDSWITCH ENDIF ENDPROC // setup player character with their correct variations PROC SETUP_PLAYER_CHARACTER_WITH_MISSION_VARIATIONS(PED_INDEX ped, enumCharacterList createChar, MISSION_STAGE_ENUM setStage) setStage = setStage // temp IF NOT IS_PED_INJURED(ped) SWITCH createChar CASE CHAR_FRANKLIN BREAK CASE CHAR_TREVOR BREAK ENDSWITCH ENDIF ENDPROC // create player character PROC HOOD_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 SWITCH createChar CASE CHAR_TREVOR BREAK CASE CHAR_FRANKLIN BREAK ENDSWITCH SETUP_PLAYER_CHARACTER_WITH_MISSION_VARIATIONS(sSelectorPeds.pedID[selectorSlot], createChar, setStage) SET_PED_RELATIONSHIP_GROUP_HASH(sSelectorPeds.pedID[selectorSlot], RELGROUPHASH_PLAYER) SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sSelectorPeds.pedID[selectorSlot], TRUE) ENDIF ENDPROC // set player in vehicle if not already in PROC SET_PLAYER_PED_INTO_HOOD_VEHICLE(HOOD_VEHICLE_ENUM hVehicle, VEHICLE_SEAT seat, BOOL bKeepVehicle = TRUE) IF NOT IS_PED_INJURED(PLAYER_PED_ID()) IF IS_VEHICLE_DRIVEABLE(hoodVehicle[hVehicle]) IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), hoodVehicle[hVehicle]) SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), hoodVehicle[hVehicle], seat) IF NOT bKeepVehicle SET_VEHICLE_AS_NO_LONGER_NEEDED(hoodVehicle[hVehicle]) 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) // create transport SWITCH setStage CASE STAGE_GET_TO_BAD_GUY //HOOD_CREATE_VEHICLE(HV_FRANKLIN_VAN, GET_HOOD_VECTOR(HVEC_FRANKLIN_VAN_INIT), FRANKLIN_VAN_INIT_ROT) BREAK CASE STAGE_VAN_CHASE HOOD_CREATE_VEHICLE(HV_FRANKLIN_VAN, GET_HOOD_VECTOR(HVEC_VAN_CHASE_INIT), VAN_CHASE_INIT_ROT) BREAK CASE STAGE_FOOT_CHASE HOOD_CREATE_VEHICLE(HV_FRANKLIN_VAN, GET_HOOD_VECTOR(HVEC_VAN_IN_ALLEY), CAR_IN_ALLEY_ROT) BREAK CASE STAGE_FIND_BAD_GUY HOOD_CREATE_VEHICLE(HV_FRANKLIN_VAN, GET_HOOD_VECTOR(HVEC_VAN_HIDDEN), VAN_HIDDEN_ROT) BREAK CASE STAGE_GET_TO_HOUSE IF NOT bForcePassOnShitskip HOOD_CREATE_VEHICLE(HV_FRANKLIN_VAN, GET_HOOD_VECTOR(HVEC_DRIVE_INIT), DRIVE_INIT_ROT) ELSE HOOD_CREATE_VEHICLE(HV_FRANKLIN_VAN, GET_HOOD_VECTOR(HVEC_REC), 143.1) ENDIF BREAK ENDSWITCH IF setStage >= STAGE_VAN_CHASE AND setStage < STAGE_GET_TO_HOUSE //SET_VEHICLE_RADIO_ENABLED(hoodVehicle[HV_FRANKLIN_VAN], FALSE) ENDIF // create the player characters SWITCH setStage CASE STAGE_GET_TO_BAD_GUY BREAK CASE STAGE_VAN_CHASE IF NOT IS_PED_INJURED(PLAYER_PED_ID()) SET_ENTITY_COORDS(PLAYER_PED_ID(), GET_HOOD_VECTOR(HVEC_FRANKLIN_ALLEY_INIT)) SET_ENTITY_HEADING(PLAYER_PED_ID(), FRANKLIN_ALLEY_INIT_ROT) ENDIF BREAK CASE STAGE_FOOT_CHASE IF NOT IS_PED_INJURED(PLAYER_PED_ID()) SET_ENTITY_COORDS(PLAYER_PED_ID(), GET_HOOD_VECTOR(HVEC_FOOT_CHASE_INIT)) SET_ENTITY_HEADING(PLAYER_PED_ID(), FOOT_CHASE_INIT_ROT) ENDIF BREAK CASE STAGE_FIND_BAD_GUY IF NOT IS_PED_INJURED(PLAYER_PED_ID()) SET_ENTITY_COORDS(PLAYER_PED_ID(), GET_HOOD_VECTOR(HVEC_LOSE_RUNNER)) SET_ENTITY_HEADING(PLAYER_PED_ID(), LOSE_RUNNER_ROT) ENDIF BREAK CASE STAGE_GET_TO_HOUSE IF NOT IS_PED_INJURED(PLAYER_PED_ID()) SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), hoodVehicle[HV_FRANKLIN_VAN], VS_DRIVER) ENDIF BREAK ENDSWITCH ENDPROC // lamar sprint to van PROC SET_LAMAR_SPRINT_TO_VAN(BOOL bReposition = FALSE) IF NOT IS_PED_INJURED(lamarPed) IF bReposition SET_ENTITY_COORDS(lamarPed, GET_HOOD_VECTOR(HVEC_LAMAR_ALLEY_INIT)) SET_ENTITY_HEADING(lamarPed, LAMAR_ALLEY_INIT_ROT) CLEAR_PED_TASKS_IMMEDIATELY(lamarPed) ENDIF TASK_GO_STRAIGHT_TO_COORD(lamarPed, GET_HOOD_VECTOR(HVEC_LAMAR_SPRINT_TO_VAN), PEDMOVE_SPRINT) FORCE_PED_MOTION_STATE(lamarPed, MS_ON_FOOT_SPRINT, bReposition, FAUS_CUTSCENE_EXIT) SET_PED_MIN_MOVE_BLEND_RATIO(lamarPed, PEDMOVE_SPRINT) ENDIF ENDPROC // create lamar PROC CREATE_LAMAR_FOR_STAGE(MISSION_STAGE_ENUM createStage, BOOL bWaitForStreaming = TRUE) IF NOT DOES_ENTITY_EXIST(lamarPed) printstring("creating new lamar ped!") printnl() SWITCH createStage CASE STAGE_GET_TO_BAD_GUY CREATE_NPC_PED_ON_FOOT(lamarPed, CHAR_LAMAR, GET_HOOD_VECTOR(HVEC_LAMAR_WALK_INIT), LAMAR_WALK_INIT_ROT, FALSE) BREAK CASE STAGE_VAN_CHASE IF IS_VEHICLE_DRIVEABLE(hoodVehicle[HV_FRANKLIN_VAN]) CREATE_NPC_PED_ON_FOOT(lamarPed, CHAR_LAMAR, GET_HOOD_VECTOR(HVEC_LAMAR_ALLEY_INIT), LAMAR_ALLEY_INIT_ROT, FALSE) SET_LAMAR_SPRINT_TO_VAN() ENDIF BREAK DEFAULT IF IS_VEHICLE_DRIVEABLE(hoodVehicle[HV_FRANKLIN_VAN]) VEHICLE_SEAT seat IF createStage < STAGE_GET_TO_HOUSE seat = VS_DRIVER ELSE seat = VS_FRONT_RIGHT ENDIF CREATE_NPC_PED_INSIDE_VEHICLE(lamarPed, CHAR_LAMAR, hoodVehicle[HV_FRANKLIN_VAN], seat, FALSE) ENDIF BREAK ENDSWITCH IF NOT IS_PED_INJURED(lamarPed) // UPDATE CS VARS IF UPDATING SET_PED_COMPONENT_VARIATION(lamarPed, PED_COMP_HEAD, 0, 0) SET_PED_COMPONENT_VARIATION(lamarPed, PED_COMP_BERD, 1, 0) SET_PED_COMPONENT_VARIATION(lamarPed, PED_COMP_HAIR, 2, 0) SET_PED_COMPONENT_VARIATION(lamarPed, PED_COMP_TORSO, 2, 1) SET_PED_COMPONENT_VARIATION(lamarPed, PED_COMP_LEG, 4, 0) SET_PED_COMPONENT_VARIATION(lamarPed, PED_COMP_HAND, 0, 0) SET_PED_COMPONENT_VARIATION(lamarPed, PED_COMP_SPECIAL, 0, 0) SET_PED_COMPONENT_VARIATION(lamarPed, PED_COMP_SPECIAL2, 0, 0) SET_PED_COMPONENT_VARIATION(lamarPed, PED_COMP_FEET, 1, 0) ENDIF IF bWaitForStreaming LOAD_ALL_OBJECTS_IF_SCREEN_FADED_OUT() BOOL bLamarStreamingCompleted = FALSE WHILE NOT bLamarStreamingCompleted IF NOT IS_PED_INJURED(lamarPed) IF HAVE_ALL_STREAMING_REQUESTS_COMPLETED(lamarPed) bLamarStreamingCompleted = TRUE ENDIF ELSE bLamarStreamingCompleted = TRUE ENDIF WAIT(0) ENDWHILE ENDIF ENDIF IF NOT IS_PED_INJURED(lamarPed) // temp //IF createStage = STAGE_GET_TO_BAD_GUY // SET_ENTITY_COORDS(lamarPed, <<-22.04, -1453.26, 29.64>>) // SET_ENTITY_HEADING(lamarPed, 94.5) //ENDIF SET_PED_GROUP_MEMBER_PASSENGER_INDEX(lamarPed, VS_FRONT_RIGHT) SET_PED_RELATIONSHIP_GROUP_HASH(lamarPed, RELGROUPHASH_PLAYER) SET_PED_CAN_BE_TARGETTED(lamarPed, FALSE) SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(lamarPed, TRUE) SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(lamarPed, TRUE) //SET_PED_CAN_FLY_THROUGH_WINDSCREEN(lamarPed, FALSE) SET_PED_GET_OUT_UPSIDE_DOWN_VEHICLE(lamarPed, FALSE) SET_PED_CONFIG_FLAG(lamarPed, PCF_WillFlyThroughWindscreen, FALSE) SET_PED_CONFIG_FLAG(lamarPed, PCF_DontAllowToBeDraggedOutOfVehicle, TRUE) SET_PED_CONFIG_FLAG(lamarPed, PCF_RunFromFiresAndExplosions, FALSE) SET_PED_CONFIG_FLAG(lamarPed, PCF_ForcedToUseSpecificGroupSeatIndex, TRUE) SET_PED_CONFIG_FLAG(lamarPed, PCF_LawWillOnlyAttackIfPlayerIsWanted, TRUE) SET_PED_CONFIG_FLAG(lamarPed, PCF_OnlyAttackLawIfPlayerIsWanted, TRUE) SET_PED_KEEP_TASK(lamarPed, TRUE) SET_PED_DIES_WHEN_INJURED(lamarPed, TRUE) GIVE_WEAPON_TO_PED(lamarPed, GET_HOOD_WEAPON_TYPE(H_WEAPON_PISTOL), INFINITE_AMMO, FALSE, FALSE) ADD_PED_FOR_DIALOGUE(hoodConversation, 3, lamarPed, "LAMAR") ENDIF ENDPROC // lamar follow pavement PROC DO_LAMAR_FOLLOW_PAVEMENT() INT iClosestLamarWaypoint WAYPOINT_RECORDING_GET_CLOSEST_WAYPOINT("hood6", GET_ENTITY_COORDS(lamarPed), iClosestLamarWaypoint) IF iClosestLamarWaypoint < 2 iClosestLamarWaypoint = 2 ENDIF //IF iClosestLamarWaypoint < 33 TASK_FOLLOW_WAYPOINT_RECORDING(lamarPed, "hood6", iClosestLamarWaypoint+1, EWAYPOINT_NAVMESH_BACK_TO_WAYPOINT_IF_LEFT_ROUTE | EWAYPOINT_TURN_TO_FACE_WAYPOINT_HEADING_AT_END | EWAYPOINT_USE_TIGHTER_TURN_SETTINGS) //ENDIF ENDPROC // create chop PROC CREATE_CHOP_FOR_STAGE(MISSION_STAGE_ENUM createStage, BOOL bWaitForStreaming = TRUE) //BOOL bJustCreated = FALSE IF NOT DOES_ENTITY_EXIST(chopPed) VECTOR vPos = <<0,0,0>> FLOAT fRot = 0.0 SWITCH createStage CASE STAGE_GET_TO_BAD_GUY vPos = GET_HOOD_VECTOR(HVEC_CHOP_WALK_INIT) fRot = CHOP_WALK_INIT_ROT BREAK CASE STAGE_FOOT_CHASE vPos = GET_HOOD_VECTOR(HVEC_CHOP_CHASE_INIT) fRot = CHOP_CHASE_INIT_ROT BREAK CASE STAGE_FIND_BAD_GUY vPos = GET_HOOD_VECTOR(HVEC_CHOP_FIND_INIT) fRot = CHOP_FIND_INIT_ROT BREAK ENDSWITCH CREATE_CHOP(chopPed, vPos, fRot, FALSE) bAddedChopToMixGroup = FALSE // bJustCreated = TRUE ENDIF IF NOT IS_PED_INJURED(chopPed) SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(chopPed, TRUE) SET_PED_KEEP_TASK(chopPed, TRUE) SET_PED_DIES_WHEN_INJURED(chopPed, TRUE) SET_PED_CAN_BE_TARGETTED(chopPed, FALSE) SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(chopPed, TRUE) SET_PED_RELATIONSHIP_GROUP_HASH(chopPed, RELGROUPHASH_PLAYER) ADD_PED_FOR_DIALOGUE(hoodConversation, 5, chopPed, "CHOP") SET_PED_COMPONENT_VARIATION(chopPed, PED_COMP_TORSO, 0, iCurrentChopCollar) sSelectorPeds.pedID[SELECTOR_PED_MICHAEL] = chopPed chopViewCamData.chopPed = chopPed IF bWaitForStreaming LOAD_ALL_OBJECTS_IF_SCREEN_FADED_OUT() BOOL bChopStreamingCompleted = FALSE WHILE NOT bChopStreamingCompleted IF NOT IS_PED_INJURED(chopPed) IF HAVE_ALL_STREAMING_REQUESTS_COMPLETED(chopPed) bChopStreamingCompleted = TRUE ENDIF ELSE bChopStreamingCompleted = TRUE ENDIF WAIT(0) ENDWHILE ENDIF IF NOT IS_PED_INJURED(chopPed) SWITCH createStage CASE STAGE_GET_TO_BAD_GUY STOP_PED_SPEAKING(chopPed, TRUE) SET_ENTITY_PROOFS(chopPed, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE) //IF NOT bJustCreated /// SET_ENTITY_COORDS(chopPed, GET_HOOD_VECTOR(HVEC_CHOP_WALK_INIT)) // SET_ENTITY_HEADING(chopPed, CHOP_WALK_INIT_ROT) //ENDIF //TASK_GO_STRAIGHT_TO_COORD(chopPed, <<-25.52, -1453.39, 29.77>>, 2.8, DEFAULT_TIME_NEVER_WARP) BREAK CASE STAGE_VAN_CHASE SET_CHOP_INTO_VAN(chopPed, hoodVehicle[HV_FRANKLIN_VAN], chopLeanInVanState, fCachedVanSpeed, FALSE) SET_ENTITY_PROOFS(chopPed, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, TRUE) SET_PED_CAN_RAGDOLL(chopPed, FALSE) BREAK CASE STAGE_GET_TO_HOUSE SET_CHOP_INTO_VAN(chopPed, hoodVehicle[HV_FRANKLIN_VAN], chopLeanInVanState, fCachedVanSpeed, TRUE) SET_ENTITY_PROOFS(chopPed, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, TRUE) SET_PED_CAN_RAGDOLL(chopPed, FALSE) BREAK DEFAULT SET_ENTITY_PROOFS(chopPed, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE) BREAK ENDSWITCH ENDIF ENDIF ENDPROC PROC HANDLE_GRAB_SCENARIO_PEDS() INT i REPEAT NUMBER_GRAB_SCENARIO_PEDS i SWITCH grabScenarioPed[i].state CASE GRAB_SCENARIO_PED_STATE_NOT_GRABBED IF GET_GAME_TIMER() >= grabScenarioPed[i].iUpdateTime VECTOR vGrabPos SWITCH i CASE 0 vGrabPos = <<505.19144, -498.64182, 23.79694>> BREAK CASE 1 vGrabPos = <<505.66849, -499.35410, 23.86925>> BREAK CASE 2 vGrabPos = <<508.44058, -499.53983, 23.84134>> BREAK CASE 3 vGrabPos = <<508.14767, -508.43143, 23.88753>> BREAK CASE 4 vGrabPos = <<507.51636, -509.31439, 23.89202>> BREAK CASE 5 vGrabPos = <<508.47632, -509.69901, 23.83075>> BREAK CASE 6 vGrabPos = <<492.78287, -506.41846, 23.79152>> BREAK ENDSWITCH SET_SCENARIO_PEDS_TO_BE_RETURNED_BY_NEXT_COMMAND(TRUE) GET_CLOSEST_PED(vGrabPos, 1, TRUE, FALSE, grabScenarioPed[i].ped) IF NOT IS_PED_INJURED(grabScenarioPed[i].ped) grabScenarioPed[i].state = GRAB_SCENARIO_PED_STATE_GRABBED grabScenarioPed[i].iUpdateTime = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(0, 2000) ELSE grabScenarioPed[i].iUpdateTime = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(500, 1500) ENDIF ENDIF BREAK CASE GRAB_SCENARIO_PED_STATE_GRABBED IF GET_GAME_TIMER() >= grabScenarioPed[i].iUpdateTime IF NOT IS_PED_INJURED(grabScenarioPed[i].ped) AND NOT IS_PED_INJURED(runnerChaseProperties.ped) AND NOT IS_PED_INJURED(chopPed) PED_INDEX targetPedLookAt FLOAT fDistanceToPlayer fDistanceToPlayer = GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(grabScenarioPed[i].ped)) FLOAT fDistanceToBalla fDistanceToBalla = GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(runnerChaseProperties.ped), GET_ENTITY_COORDS(grabScenarioPed[i].ped)) FLOAT fDistanceToChop fDistanceToChop = GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(chopPed), GET_ENTITY_COORDS(grabScenarioPed[i].ped)) IF fDistanceToPlayer < fDistanceToChop IF fDistanceToPlayer < fDistanceToBalla targetPedLookAt = PLAYER_PED_ID() ELSE targetPedLookAt = runnerChaseProperties.ped ENDIF ELSE IF fDistanceToBalla < fDistanceToChop targetPedLookAt = runnerChaseProperties.ped ELSE targetPedLookAt = chopPed ENDIF ENDIF IF NOT IS_PED_HEADTRACKING_ENTITY(grabScenarioPed[i].ped, targetPedLookAt) TASK_LOOK_AT_ENTITY(grabScenarioPed[i].ped, targetPedLookAt, -1, SLF_WHILE_NOT_IN_FOV, SLF_LOOKAT_VERY_HIGH) ENDIF IF NOT grabScenarioPed[i].bDoneSpeech IF IS_ENTITY_AT_ENTITY(grabScenarioPed[i].ped, chopPed, <<6,6,6>>, FALSE) IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() PLAY_PED_AMBIENT_SPEECH(grabScenarioPed[i].ped, "GENERIC_SHOCKED_MED", SPEECH_PARAMS_FORCE_SHOUTED) grabScenarioPed[i].bDoneSpeech = TRUE ENDIF ENDIF ENDIF grabScenarioPed[i].iUpdateTime = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(500, 2000) ENDIF ENDIF BREAK ENDSWITCH ENDREPEAT ENDPROC // do damage from Chop takedown on bad guy PROC SET_DAMAGE_ON_BAD_GUY(BOOL bForce = FALSE) IF bForce OR NOT bSetDamageOnBadGuy IF NOT IS_PED_INJURED(runnerChaseProperties.ped) APPLY_PED_BLOOD_SPECIFIC(runnerChaseProperties.ped, ENUM_TO_INT(PDZ_LEFT_ARM), 0.536, 0.601, 93.240, 0.695, -1, 0, "stab") APPLY_PED_BLOOD_SPECIFIC(runnerChaseProperties.ped, ENUM_TO_INT(PDZ_LEFT_ARM), 0.536, 0.561, 95.040, 0.695, -1, 0, "stab") APPLY_PED_BLOOD_SPECIFIC(runnerChaseProperties.ped, ENUM_TO_INT(PDZ_LEFT_ARM), 0.476, 0.531, 95.140, 0.695, -1, 0, "stab") bSetDamageOnBadGuy = TRUE ENDIF ENDIF ENDPROC // create runner PROC CREATE_BAD_GUY_FOR_STAGE(MISSION_STAGE_ENUM createStage) VECTOR vPos FLOAT fRot SWITCH createStage CASE STAGE_GET_TO_BAD_GUY CASE STAGE_VAN_CHASE CASE STAGE_GET_TO_HOUSE vPos = <<0,10,0>> fRot = 0.0 BREAK CASE STAGE_FOOT_CHASE vPos = GET_HOOD_VECTOR(HVEC_RUNNER_CHASE_INIT) fRot = RUNNER_CHASE_INIT_ROT BREAK CASE STAGE_FIND_BAD_GUY vPos = GET_HOOD_VECTOR(HVEC_RUNNER_HIDE) fRot = RUNNER_HIDE_ROT BREAK ENDSWITCH runnerChaseProperties.ped = CREATE_PED(PEDTYPE_MISSION, GET_MODEL_FOR_HOOD_MODEL_ENUM(HM_BAD_GUY), vPos, fRot) IF createStage <= STAGE_GET_TO_HOUSE //SET_PED_CAN_BE_TARGETTED(runnerChaseProperties.ped, FALSE) SET_ENTITY_PROOFS(runnerChaseProperties.ped, FALSE, FALSE, FALSE, TRUE, TRUE) ENDIF SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(runnerChaseProperties.ped, TRUE) SET_PED_DIES_WHEN_INJURED(runnerChaseProperties.ped, TRUE) SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(runnerChaseProperties.ped, TRUE) SET_PED_KEEP_TASK(runnerChaseProperties.ped, TRUE) SET_PED_GET_OUT_UPSIDE_DOWN_VEHICLE(runnerChaseProperties.ped, FALSE) //SET_PED_LOD_MULTIPLIER(runnerChaseProperties.ped, 10.0) SET_PED_CAN_BE_KNOCKED_OFF_VEHICLE(runnerChaseProperties.ped, KNOCKOFFVEHICLE_NEVER) CLEAR_ALL_PED_PROPS(runnerChaseProperties.ped) SET_PED_PROP_INDEX(runnerChaseProperties.ped, ANCHOR_HEAD, 0, 0) SET_PED_COMPONENT_VARIATION(runnerChaseProperties.ped, PED_COMP_TORSO, 0, 0) SET_PED_COMPONENT_VARIATION(runnerChaseProperties.ped, PED_COMP_LEG, 0, 0) SET_PED_COMPONENT_VARIATION(runnerChaseProperties.ped, PED_COMP_DECL, 0, 0) SET_PED_CONFIG_FLAG(runnerChaseProperties.ped, PCF_DisableExplosionReactions, TRUE) SET_PED_CONFIG_FLAG(runnerChaseProperties.ped, PCF_RunFromFiresAndExplosions, FALSE) SET_PED_CONFIG_FLAG(runnerChaseProperties.ped, PCF_DontAllowToBeDraggedOutOfVehicle, TRUE) //SET_PED_CAN_RAGDOLL(runnerChaseProperties.ped, FALSE) // TEMP ADD_PED_FOR_DIALOGUE(hoodConversation, 4, runnerChaseProperties.ped, "BALLASOG") IF createStage <= STAGE_FOOT_CHASE HOOD_CREATE_VEHICLE(HV_BAD_GUY_BIKE, <<0,2,4>>, 0.0) IF createStage < STAGE_FOOT_CHASE SET_PED_INTO_VEHICLE(runnerChaseProperties.ped, hoodVehicle[HV_BAD_GUY_BIKE]) SET_ENTITY_PROOFS(hoodVehicle[HV_BAD_GUY_BIKE], FALSE, FALSE, FALSE, TRUE, TRUE) SET_DISABLE_VEHICLE_PETROL_TANK_FIRES(hoodVehicle[HV_BAD_GUY_BIKE], TRUE) SET_VEHICLE_CAN_LEAK_OIL(hoodVehicle[HV_BAD_GUY_BIKE], FALSE) SET_VEHICLE_CAN_LEAK_PETROL(hoodVehicle[HV_BAD_GUY_BIKE], FALSE) ENDIF SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(hoodVehicle[HV_BAD_GUY_BIKE], FALSE) ENDIF // mix group IF createStage >= STAGE_FOOT_CHASE ADD_ENTITY_TO_AUDIO_MIX_GROUP(runnerChaseProperties.ped, "FRANKLIN_0_D_Group") ENDIF SWITCH createStage CASE STAGE_GET_TO_BAD_GUY START_PLAYBACK_RECORDED_VEHICLE(hoodVehicle[HV_BAD_GUY_BIKE], 014, GET_HOOD_RECORDING_PREFIX()) PAUSE_PLAYBACK_RECORDED_VEHICLE(hoodVehicle[HV_BAD_GUY_BIKE]) BREAK CASE STAGE_VAN_CHASE START_PLAYBACK_RECORDED_VEHICLE(hoodVehicle[HV_BAD_GUY_BIKE], 001, GET_HOOD_UBER_RECORDING_PREFIX()) BREAK CASE STAGE_FOOT_CHASE SET_ENTITY_COORDS_NO_OFFSET(hoodVehicle[HV_BAD_GUY_BIKE], << 460.669, -682.118, 26.5919 >>) SET_ENTITY_ROTATION(hoodVehicle[HV_BAD_GUY_BIKE], << 0.0150743, 85.4796, 10.1482 >>) BREAK CASE STAGE_GET_TO_HOUSE //IF IS_VEHICLE_DRIVEABLE(hoodVehicle[HV_FRANKLIN_VAN]) //SET_PED_CAN_PLAY_AMBIENT_BASE_ANIMS(runnerChaseProperties.ped, FALSE) //SET_PED_CAN_PLAY_AMBIENT_ANIMS(runnerChaseProperties.ped, FALSE) //SET_PED_INTO_VEHICLE(runnerChaseProperties.ped, hoodVehicle[HV_FRANKLIN_VAN], VS_BACK_RIGHT) //ENDIF BREAK CASE STAGE_FIND_BAD_GUY //TASK_COWER(runnerChaseProperties.ped) FREEZE_ENTITY_POSITION(runnerChaseProperties.ped, TRUE) BREAK ENDSWITCH ENDPROC // create girl for bad guy to flirt with PROC CREATE_GIRL_FOR_STAGE(MISSION_STAGE_ENUM createStage) girlPed = CREATE_PED(PEDTYPE_MISSION, GET_MODEL_FOR_HOOD_MODEL_ENUM(HM_GIRL), GET_HOOD_VECTOR(HVEC_GIRL_INIT), 157.24) SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(girlPed, TRUE) SET_PED_KEEP_TASK(girlPed, TRUE) SET_PED_COMPONENT_VARIATION(girlPed, PED_COMP_HEAD, 0, 1) SET_PED_COMPONENT_VARIATION(girlPed, PED_COMP_HAIR, 2, 2) SET_PED_COMPONENT_VARIATION(girlPed, PED_COMP_TORSO, 0, 2) SET_PED_COMPONENT_VARIATION(girlPed, PED_COMP_LEG, 1, 2) SET_PED_COMPONENT_VARIATION(girlPed, PED_COMP_SPECIAL, 0, 1) CLEAR_ALL_PED_PROPS(girlPed) IF createStage = STAGE_GET_TO_BAD_GUY IF NOT IS_PED_INJURED(runnerChaseProperties.ped) TASK_LOOK_AT_ENTITY(girlPed, runnerChaseProperties.ped, -1, SLF_WHILE_NOT_IN_FOV) TASK_LOOK_AT_ENTITY(runnerChaseProperties.ped, girlPed, -1, SLF_WHILE_NOT_IN_FOV) ENDIF ELSE TASK_LOOK_AT_ENTITY(girlPed, PLAYER_PED_ID(), -1, SLF_WHILE_NOT_IN_FOV) ENDIF ENDPROC // create blocking vehicle PROC CREATE_BLOCKING_VEHICLES() INT i HOOD_MODEL_ENUM thisModel VECTOR vPos FLOAT fRot REPEAT NUMBER_BLOCKING_VEHICLES i SWITCH i CASE 0 thisModel = HM_BLOCKING_TRUCK vPos = <<343.02, 333.05, 104.87>> fRot = -138.08 BREAK CASE 1 thisModel = HM_BLOCKING_CAR vPos = <<338.54, 340.18, 105.06>> fRot = -15.46 BREAK ENDSWITCH blockingVehicle[i] = CREATE_VEHICLE(GET_MODEL_FOR_HOOD_MODEL_ENUM(thisModel), vPos, fRot) SET_VEHICLE_ON_GROUND_PROPERLY(blockingVehicle[i]) SET_VEHICLE_DOORS_LOCKED(blockingVehicle[i], VEHICLELOCK_LOCKOUT_PLAYER_ONLY) ENDREPEAT ENDPROC // create collie to tempt chop PROC CREATE_COLLIE() colliePed = CREATE_PED(PEDTYPE_MISSION, GET_MODEL_FOR_HOOD_MODEL_ENUM(HM_COLLIE), GET_HOOD_VECTOR(HVEC_COLLIE_INIT), COLLIE_INIT_ROT) SET_PED_COMPONENT_VARIATION(colliePed, PED_COMP_TORSO, 0, 0) SET_PED_COMPONENT_VARIATION(colliePed, PED_COMP_LEG, 0, 1) SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(colliePed, TRUE) SET_PED_KEEP_TASK(colliePed, TRUE) SET_PED_DIES_WHEN_INJURED(colliePed, TRUE) SET_PED_CAN_BE_TARGETTED(colliePed, FALSE) SET_ENTITY_PROOFS(colliePed, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE) TASK_PLAY_ANIM(colliePed, GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_FIND), "FRA_0_IG_15_FEMALE_DOG_IDLE", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING | AF_NOT_INTERRUPTABLE | AF_USE_KINEMATIC_PHYSICS) ENDPROC // set bike as smoking PROC SET_BIKE_AS_SMOKING() IF IS_VEHICLE_DRIVEABLE(hoodVehicle[HV_BAD_GUY_BIKE]) IF GET_VEHICLE_ENGINE_HEALTH(hoodVehicle[HV_BAD_GUY_BIKE]) > 300 SET_VEHICLE_ENGINE_HEALTH(hoodVehicle[HV_BAD_GUY_BIKE], 300) ENDIF bSetBikeAsSmoking = TRUE ENDIF ENDPROC // create driver in a train yard vehicle PROC CREATE_DRIVER_FOR_SETPIECE_VEHICLE(BOOL bIsTrain, INT iVehicle, BOOL bBlockEvents = TRUE, BOOL bIsWorker = FALSE) VEHICLE_INDEX thisVehicle INT iDriver IF bIsTrain thisVehicle = trainVehicle[iVehicle] iDriver = iVehicle + NUMBER_YARD_VEHICLES ELSE thisVehicle = yardVehicle[iVehicle] iDriver = iVehicle ENDIF IF IS_VEHICLE_DRIVEABLE(thisVehicle) BOOL bCreateAsWorker = bIsWorker IF NOT DOES_ENTITY_EXIST(driverPed[iDriver]) IF NOT bCreateAsWorker IF CAN_CREATE_RANDOM_DRIVER() driverPed[iDriver] = CREATE_RANDOM_PED_AS_DRIVER(thisVehicle) ELSE bCreateAsWorker = TRUE ENDIF ENDIF IF bCreateAsWorker REQUEST_MODEL(GET_MODEL_FOR_HOOD_MODEL_ENUM(HM_WORKER)) // idiocy to get around assert IF HAS_MODEL_LOADED(GET_MODEL_FOR_HOOD_MODEL_ENUM(HM_WORKER)) driverPed[iDriver] = CREATE_PED_INSIDE_VEHICLE(thisVehicle, PEDTYPE_MISSION, GET_MODEL_FOR_HOOD_MODEL_ENUM(HM_WORKER)) ENDIF ENDIF ENDIF IF NOT IS_PED_INJURED(driverPed[iDriver]) IF bBlockEvents SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(driverPed[iDriver], TRUE) ENDIF TASK_LOOK_AT_ENTITY(driverPed[iDriver], PLAYER_PED_ID(), -1, SLF_WHILE_NOT_IN_FOV) ENDIF ENDIF ENDPROC PROC CREATE_YARD_TRAIN_FOR_STAGE(INT iTrain, MISSION_STAGE_ENUM createStage, BOOL bIsCutscene = FALSE) INT iConfig VECTOR vPos BOOL bDirection FLOAT fSpeed SWITCH iTrain CASE 0 iConfig = 18 vPos = <<526.88, -534.26, 24.12>> bDirection = FALSE fSpeed = 0.0 BREAK CASE 1 iConfig = 19 IF createStage = STAGE_FOOT_CHASE vPos = <<543.18, -579.82, 25.41>> fSpeed = 0.0 ELSE vPos = <<538.92, -615.0, 24.22>> fSpeed = 2.67 ENDIF bDirection = TRUE BREAK CASE 2 iConfig = 20 bDirection = TRUE IF createStage = STAGE_FOOT_CHASE IF bIsCutscene vPos = <<547.80, -608.82, 24.90>> fSpeed = 8.0 ELSE vPos = <<532.1, -741.2, 24.0>> fSpeed = 0.0 ENDIF ELSE vPos = <<556.5, -530.7, 24.2>> fSpeed = 5.5 ENDIF BREAK ENDSWITCH trainVehicle[iTrain] = CREATE_MISSION_TRAIN(iConfig, vPos, bDirection) SET_TRAIN_CRUISE_SPEED(trainVehicle[iTrain], fSpeed) SET_TRAIN_SPEED(trainVehicle[iTrain], fSpeed) IF createStage = STAGE_FOOT_CHASE CREATE_DRIVER_FOR_SETPIECE_VEHICLE(TRUE, iTrain, TRUE, TRUE) ENDIF fTrainCruiseSpeed[iTrain] = fSpeed SWITCH iTrain CASE 1 SET_VEHICLE_EXTRA(GET_TRAIN_CARRIAGE(trainVehicle[iTrain], 1), 1, TRUE) SET_VEHICLE_EXTRA(GET_TRAIN_CARRIAGE(trainVehicle[iTrain], 2), 1, FALSE) BREAK CASE 2 SET_VEHICLE_COLOUR_COMBINATION(GET_TRAIN_CARRIAGE(trainVehicle[iTrain], 1), 3) SET_VEHICLE_COLOUR_COMBINATION(GET_TRAIN_CARRIAGE(trainVehicle[iTrain], 2), 1) SET_VEHICLE_COLOUR_COMBINATION(GET_TRAIN_CARRIAGE(trainVehicle[iTrain], 3), 2) //SET_VEHICLE_EXTRA(GET_TRAIN_CARRIAGE(trainVehicle[iTrain], 1), 1, TRUE) //SET_VEHICLE_EXTRA(GET_TRAIN_CARRIAGE(trainVehicle[iTrain], 2), 1, TRUE) //SET_VEHICLE_EXTRA(GET_TRAIN_CARRIAGE(trainVehicle[iTrain], 3), 1, TRUE) BREAK ENDSWITCH ENDPROC // create yard trains PROC CREATE_YARD_TRAINS() CREATE_YARD_TRAIN_FOR_STAGE(0, STAGE_FOOT_CHASE) CREATE_YARD_TRAIN_FOR_STAGE(1, STAGE_FOOT_CHASE) CREATE_YARD_TRAIN_FOR_STAGE(2, STAGE_FOOT_CHASE) ENDPROC PROC CREATE_CHASE_SETPIECES(BOOL bJumpingTo, BOOL bCreateTrains, BOOL bCreateCars, BOOL bCreateBuses, BOOL bCreatePeds) INT i INT iRec INT iColour VECTOR vPos FLOAT fRot FLOAT fSkip FLOAT fSpeed BOOL bJustCreated // vehicles REPEAT NUMBER_YARD_VEHICLES i BOOL bVehicleHasDriver = TRUE BOOL bVehicleDriverIsWorker = FALSE BOOL bNoRec = FALSE bJustCreated = FALSE HOOD_MODEL_ENUM trafficModelEnum vPos = <> fRot = 0.0 iRec = 000 iColour = -1 fSkip = 0.0 fSpeed = 1.0 SWITCH INT_TO_ENUM(YARD_VEHICLE_ENUM, i) CASE YV_CAR_CARPARK_PULL_OUT_FOR_JUMP_OVER vPos = <<491.43, -537.62, 23.75>> fRot = -92.24 iColour = 2 bNoRec = TRUE trafficModelEnum = HM_TRAFFIC_CAR1 bVehicleDriverIsWorker = TRUE BREAK CASE YV_CAR_STATION_PULL_INTO_DEPOT iRec = 011 iColour = 2 trafficModelEnum = HM_TRAFFIC_CAR2 fSpeed = 0.7 BREAK //CASE YV_CAR_ROAD_FROM_RIGHT // vPos = <<479.36, -674.25, 25.28>> // fRot = 91.05 // iColour = 3 // trafficModelEnum = HM_TRAFFIC_CAR1 //BREAK CASE YV_BUS_ROAD_FROM_LEFT vPos = <<451.5, -681.2, 28.1>> fRot = -95.1 iColour = 0 trafficModelEnum = HM_BUS bVehicleDriverIsWorker = TRUE BREAK CASE YV_CAR_CARPARK_STATIC vPos = <<488.74, -541.46, 23.75>> fRot = 85.92 iColour = 1 trafficModelEnum = HM_TRAFFIC_CAR2 bVehicleHasDriver = FALSE BREAK CASE YV_BUS_REVERSE iRec = 001 fSkip = 700 fSpeed = 0.80 iColour = 0 trafficModelEnum = HM_BUS bVehicleDriverIsWorker = TRUE BREAK CASE YV_BUS_PULL_OUT bNoRec = TRUE vPos = <<464.37, -651.16, 28.06>> fRot = 173.0 iColour = 0 trafficModelEnum = HM_BUS bVehicleDriverIsWorker = TRUE BREAK CASE YV_BUS_STATIC iRec = 012 iColour = 1 trafficModelEnum = HM_BUS bVehicleHasDriver = FALSE BREAK ENDSWITCH IF INT_TO_ENUM(YARD_VEHICLE_ENUM, i) <> YV_BUS_ROAD_FROM_LEFT OR bJumpingTo IF (trafficModelEnum = HM_BUS AND bCreateBuses) OR (trafficModelEnum <> HM_BUS AND bCreateCars) IF NOT DOES_ENTITY_EXIST(yardVehicle[i]) yardVehicle[i] = CREATE_VEHICLE(GET_MODEL_FOR_HOOD_MODEL_ENUM(trafficModelEnum), vPos, fRot) bJustCreated = TRUE ENDIF ENDIF ENDIF IF IS_VEHICLE_DRIVEABLE(yardVehicle[i]) AND bJustCreated IF bVehicleHasDriver CREATE_DRIVER_FOR_SETPIECE_VEHICLE(FALSE, i, TRUE, bVehicleDriverIsWorker) ENDIF IF iColour >= 0 SET_VEHICLE_COLOUR_COMBINATION(yardVehicle[i], iColour) ENDIF IF INT_TO_ENUM(YARD_VEHICLE_ENUM, i) = YV_BUS_REVERSE ADD_ENTITY_TO_AUDIO_MIX_GROUP(yardVehicle[i], "FRANKLIN_0_Reversing_Bus") ENDIF //SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(yardVehicle[i], FALSE) SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(yardVehicle[i], TRUE) SET_VEHICLE_DOORS_LOCKED(yardVehicle[i], VEHICLELOCK_LOCKOUT_PLAYER_ONLY) IF iRec > 000 AND NOT bNoRec START_PLAYBACK_RECORDED_VEHICLE(yardVehicle[i], iRec, GET_HOOD_RECORDING_PREFIX()) SKIP_TIME_IN_PLAYBACK_RECORDED_VEHICLE(yardVehicle[i], fSkip) SET_PLAYBACK_SPEED(yardVehicle[i], fSpeed) FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(yardVehicle[i]) PAUSE_PLAYBACK_RECORDED_VEHICLE(yardVehicle[i]) ELSE SET_VEHICLE_ON_GROUND_PROPERLY(yardVehicle[i]) IF bVehicleHasDriver PED_INDEX thisDriverPed = GET_PED_IN_VEHICLE_SEAT(yardVehicle[i]) IF NOT IS_PED_INJURED(thisDriverPed) SWITCH INT_TO_ENUM(YARD_VEHICLE_ENUM, i) //CASE YV_CAR_ROAD_FROM_RIGHT // TASK_VEHICLE_DRIVE_TO_COORD(thisDriverPed, yardVehicle[i], <<470.28, -674.36, 26.09>>, 7.0, DRIVINGSTYLE_NORMAL, GET_ENTITY_MODEL(yardVehicle[i]), DRIVINGMODE_STOPFORCARS, 2.0, 100000) //BREAK CASE YV_BUS_ROAD_FROM_LEFT TASK_VEHICLE_TEMP_ACTION(thisDriverPed, yardVehicle[i], TEMPACT_BRAKE, 20000) BREAK DEFAULT IF NOT bNoRec TASK_VEHICLE_DRIVE_WANDER(thisDriverPed, yardVehicle[i], 2.5, DRIVINGMODE_STOPFORCARS) ENDIF BREAK ENDSWITCH ENDIF ENDIF ENDIF ENDIF ENDREPEAT // trains IF bCreateTrains CREATE_YARD_TRAINS() ENDIF // peds IF bCreatePeds REPEAT NUMBER_YARD_PEDS i BOOL bWorkerPed = FALSE YARD_PED_ENUM thisPed = INT_TO_ENUM(YARD_PED_ENUM, i) IF thisPed <> YP_STATION_CONV_KNOCK_OVER AND thisPed <> YP_STATION_CONV_LOOK SWITCH thisPed // in bus station CASE YP_STATION_WALK_TO_GATE vPos = <<459.48, -618.58, 27.51>> fRot = 168.82 bWorkerPed = TRUE BREAK CASE YP_STATION_CONV_KNOCK_OVER vPos = <<466.44, -630.26, 27.51>> fRot = 61.25 BREAK CASE YP_STATION_CONV_LOOK vPos = <<464.38, -629.01, 27.51>> fRot = 240.21 BREAK CASE YP_STATION_BACK_TURNED_KNOCK_OVER vPos = <<471.04, -591.71, 27.51>> fRot = -27.00 bWorkerPed = TRUE BREAK // in construction site //CASE YP_CONSTRUCT_CONV_LOOK1 // vPos = <<503.53, -510.70, 23.75>> // fRot = -7.33 // bWorkerPed = TRUE //BREAK //CASE YP_CONSTRUCT_CONV_LOOK2 // vPos = <<503.60, -509.09, 23.75>> // fRot = -187.33 // bWorkerPed = TRUE //BREAK CASE YP_CONSTRUCT_WALK_SOUTH vPos = <<525.01, -475.66, 23.73>> fRot = 173.22 bWorkerPed = TRUE BREAK CASE YP_CONSTRUCT_WALK_NORTH vPos = <<515.01, -512.17, 23.75>> fRot = -4.39 bWorkerPed = TRUE BREAK ENDSWITCH BOOL bCreateAsWorker = bWorkerPed IF NOT bCreateAsWorker IF CAN_CREATE_RANDOM_PED(RPM_DONT_CARE) yardPed[i].ped = CREATE_RANDOM_PED(vPos) SET_ENTITY_HEADING(yardPed[i].ped, fRot) ELSE bCreateAsWorker = TRUE ENDIF ENDIF IF bCreateAsWorker yardPed[i].ped = CREATE_PED(PEDTYPE_MISSION, GET_MODEL_FOR_HOOD_MODEL_ENUM(HM_WORKER), vPos, fRot) ENDIF IF NOT IS_PED_INJURED(yardPed[i].ped) SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(yardPed[i].ped, TRUE) SET_PED_KEEP_TASK(yardPed[i].ped, TRUE) ENDIF yardPed[i].bReactedToChop = FALSE ENDIF ENDREPEAT ENDIF ENDPROC CONST_FLOAT SHIFT_POS_SPEED 0.85 CONST_FLOAT SHIFT_ROT_SPEED 7.5 PROC SET_FLOAT_CLOSEST_TO_IDEAL(FLOAT &fFloat, FLOAT fIdeal) FLOAT fPositiveFloat FLOAT fNegativeFloat IF fFloat > 0 fPositiveFloat = fFloat fNegativeFloat = fFloat - 360 ELIF fFloat < 0 fPositiveFloat = fFloat + 360 fNegativeFloat = fFloat ENDIF FLOAT fPositiveDiff = fPositiveFloat - fIdeal IF fPositiveDiff < 0 fPositiveDiff *= -1 ENDIF FLOAT fNegativeDiff = fNegativeFloat - fIdeal IF fNegativeDiff < 0 fNegativeDiff *= -1 ENDIF IF fPositiveDiff < fNegativeDiff fFloat = fPositiveFloat ELSE fFloat = fNegativeFloat ENDIF ENDPROC PROC SET_VECTOR_CLOSEST_TO_IDEAL(VECTOR &vVector, VECTOR vIdeal) SET_FLOAT_CLOSEST_TO_IDEAL(vVector.x, vIdeal.x) SET_FLOAT_CLOSEST_TO_IDEAL(vVector.y, vIdeal.y) SET_FLOAT_CLOSEST_TO_IDEAL(vVector.z, vIdeal.z) ENDPROC PROC SHIFT_FLOAT_TO_IDEAL_FLOAT(FLOAT &fCurrent, FLOAT fIdeal, FLOAT fSpeed) IF fCurrent < fIdeal fCurrent = fCurrent +@ fSpeed IF fCurrent > fIdeal fCurrent = fIdeal ENDIF ELIF fCurrent > fIdeal fCurrent = fCurrent -@ fSpeed IF fCurrent < fIdeal fCurrent = fIdeal ENDIF ENDIF ENDPROC PROC SHIFT_VECTOR_TO_IDEAL_VECTOR(VECTOR &vCurrent, VECTOR vIdeal, FLOAT fSpeed) SHIFT_FLOAT_TO_IDEAL_FLOAT(vCurrent.x, vIdeal.x, fSpeed) SHIFT_FLOAT_TO_IDEAL_FLOAT(vCurrent.y, vIdeal.y, fSpeed) SHIFT_FLOAT_TO_IDEAL_FLOAT(vCurrent.z, vIdeal.z, fSpeed) ENDPROC CONST_FLOAT BOXCAR_WIDTH 1.468 // 1.45 CONST_FLOAT BOXCAR_HEIGHT 2.4635//2.43//2.40 // attach door to boxcar PROC ATTACH_DOOR_TO_BOXCAR(INT iBoxcar, INT iDoor) FLOAT fAttachX FLOAT fAttachY FLOAT fAttachRot IF iDoor=0 fAttachX = -boxcarCarriage[iBoxcar].boxcarDoor[iDoor].fOffset fAttachY = BOXCAR_WIDTH fAttachRot = 180 ELSE fAttachX = boxcarCarriage[iBoxcar].boxcarDoor[iDoor].fOffset fAttachY = -BOXCAR_WIDTH fAttachRot = 0 ENDIF ATTACH_ENTITY_TO_ENTITY(boxcarCarriage[iBoxcar].boxcarDoor[iDoor].obj, boxcarCarriage[iBoxcar].anchorObject, 0, <>, <<0,0,fAttachRot>>, FALSE, FALSE, TRUE) ENDPROC FUNC FLOAT GET_BOXCAR_DOOR_Z_MOD(INT iBoxcar, INT iDoor) SWITCH iBoxcar CASE 0 IF iDoor = 0 RETURN -0.145 ELSE RETURN -0.105 ENDIF BREAK CASE 1 IF iDoor = 0 RETURN -0.148 ELSE RETURN -0.145 ENDIF BREAK CASE 3 IF iDoor = 0 RETURN -0.07 ELSE RETURN -0.05 ENDIF BREAK CASE 4 IF iDoor = 0 RETURN -0.02 ELSE RETURN -0.065 ENDIF BREAK ENDSWITCH RETURN 0.0 ENDFUNC // attach handle to boxcar PROC ATTACH_HANDLE_TO_BOXCAR(INT iBoxcar, INT iDoor) /* VECTOR vOffset FLOAT fHandleRot IF iDoor=0 vOffset = <<1.581, 1.516, 1.282>> fHandleRot = 180 ELSE vOffset = <<-1.572, -1.515, 1.272>> fHandleRot = 0 ENDIF vOffset += <<0,0,GET_BOXCAR_DOOR_Z_MOD(iBoxcar,iDoor)>> */ VECTOR vPos VECTOR vRot SWITCH iBoxcar CASE 0 IF iDoor = 0 vPos = <<547.6336, -625.1866, 25.0932>> vRot = <<0,0,-97.00>> ELSE vPos = <<550.2516, -628.7438, 25.1332>> vRot = <<0,0,83.00>> ENDIF BREAK CASE 1 IF iDoor = 0 vPos = <<545.6388, -641.4614, 25.0902>> vRot = <<0,0,-97.00>> ELSE vPos = <<548.2568, -645.0185, 25.0932>> vRot = <<0,0,83.00>> ENDIF BREAK CASE 2 vPos = <<528.0478, -680.6921, 25.1482>> vRot = <<0,0,83.36>> BREAK CASE 3 IF iDoor = 0 vPos = <<523.6058, -693.3036, 25.1182>> vRot = <<0,0,-96.00>> ELSE vPos = <<526.2855, -696.8145, 25.1382>> vRot = <<0,0,84.00>> ENDIF BREAK CASE 4 IF iDoor = 0 vPos = <<517.8303, -704.0568, 25.1782>> vRot = <<0,0,-95.66>> ELSE vPos = <<520.5307, -707.5518, 25.1332>> vRot = <<0,0,84.34>> ENDIF BREAK ENDSWITCH SET_ENTITY_COORDS_NO_OFFSET(boxcarCarriage[iBoxcar].boxcarDoor[iDoor].handleObject, vPos) SET_ENTITY_ROTATION(boxcarCarriage[iBoxcar].boxcarDoor[iDoor].handleObject, vRot) FREEZE_ENTITY_POSITION(boxcarCarriage[iBoxcar].boxcarDoor[iDoor].handleObject, TRUE) //ATTACH_ENTITY_TO_ENTITY(boxcarCarriage[iBoxcar].boxcarDoor[iDoor].handleObject, boxcarCarriage[iBoxcar].anchorObject, -1, vOffset, <<0,fRot,fHandleRot>>, FALSE, FALSE, TRUE) ENDPROC FUNC VECTOR GET_BOXCAR_POS(INT iBoxcar) SWITCH iBoxcar CASE 0 RETURN <<548.9426, -626.9652, 23.91>> BREAK CASE 1 RETURN <<546.9478, -643.2399, 23.91>> BREAK CASE 2 RETURN <<526.7276, -678.9218, 23.82>> BREAK CASE 3 RETURN <<524.9456, -695.0590, 23.86>> BREAK CASE 4 RETURN <<519.1805, -705.8043, 23.87>> BREAK ENDSWITCH RETURN <<0,0,0>> ENDFUNC FUNC FLOAT GET_BOXCAR_ROT(INT iBoxcar) SWITCH iBoxcar CASE 0 RETURN 83.0 BREAK CASE 1 RETURN 83.0 BREAK CASE 2 RETURN 83.36 BREAK CASE 3 RETURN 84.0 BREAK CASE 4 RETURN 84.34 BREAK ENDSWITCH RETURN 0.0 ENDFUNC // create the doors for hiding boxcar PROC CREATE_BOXCAR_DOORS() INT i,j REPEAT NUMBER_BOXCARS i VECTOR vPos = GET_BOXCAR_POS(i) FLOAT fRot = GET_BOXCAR_ROT(i) boxcarCarriage[i].anchorObject = CREATE_OBJECT(GET_MODEL_FOR_HOOD_MODEL_ENUM(HM_ANCHOR), vPos) SET_ENTITY_COORDS_NO_OFFSET(boxcarCarriage[i].anchorObject, vPos) SET_ENTITY_HEADING(boxcarCarriage[i].anchorObject, fRot) SET_ENTITY_COLLISION(boxcarCarriage[i].anchorObject, FALSE) SET_ENTITY_VISIBLE(boxcarCarriage[i].anchorObject, FALSE) FREEZE_ENTITY_POSITION(boxcarCarriage[i].anchorObject, TRUE) boxcarCarriage[i].searchState = CARRIAGE_SEARCH_STATE_NOT_BLIPPED REPEAT 2 j boxcarCarriage[i].boxcarDoor[j].state = BOXCAR_DOOR_AWAITING_PLAYER boxcarCarriage[i].boxcarDoor[j].fOffset = 0.0348647 boxcarCarriage[i].boxcarDoor[j].obj = CREATE_OBJECT(GET_MODEL_FOR_HOOD_MODEL_ENUM(HM_BOXCAR_DOOR), vPos) ATTACH_DOOR_TO_BOXCAR(i,j) IF NOT (i=2 AND j=0) // disable back one of target carriage boxcarCarriage[i].boxcarDoor[j].handleObject = CREATE_OBJECT(GET_MODEL_FOR_HOOD_MODEL_ENUM(HM_BOXCAR_HANDLE), vPos) ATTACH_HANDLE_TO_BOXCAR(i,j) ENDIF ENDREPEAT ENDREPEAT ENDPROC CONST_FLOAT BOXCAR_CAM_X_OFFSET 1.800 CONST_FLOAT BOXCAR_CAM_Y_OFFSET -0.400 CONST_FLOAT BOXCAR_CAM_Z_OFFSET 1.050 CONST_FLOAT BOXCAR_CAM_X_POINT 0.500 CONST_FLOAT BOXCAR_CAM_Y_POINT 1.800 CONST_FLOAT BOXCAR_CAM_Z_POINT 1.440 CONST_FLOAT BOXCAR_CAM_FOV 26.500 PROC UPDATE_INSIDE_BOXCAR_CAM(INT iBoxcar, INT iDoor) /* VECTOR vOffset IF iDoor = 0 vOffset.x = BOXCAR_CAM_X_OFFSET vOffset.y = BOXCAR_CAM_Y_OFFSET ELSE vOffset.x = -BOXCAR_CAM_X_OFFSET vOffset.y = -BOXCAR_CAM_Y_OFFSET ENDIF vOffset.z = BOXCAR_CAM_Z_OFFSET VECTOR vPoint IF iDoor = 0 vPoint.x = BOXCAR_CAM_X_POINT vPoint.y = BOXCAR_CAM_Y_POINT ELSE vPoint.x = -BOXCAR_CAM_X_POINT vPoint.y = -BOXCAR_CAM_Y_POINT ENDIF vPoint.z = BOXCAR_CAM_Z_POINT ATTACH_CAM_TO_ENTITY(staticCam, boxcarCarriage[iBoxcar].anchorObject, vOffset) POINT_CAM_AT_ENTITY(staticCam, boxcarCarriage[iBoxcar].anchorObject, vPoint) SET_CAM_FOV(staticCam, BOXCAR_CAM_FOV) */ VECTOR vPos VECTOR vRot FLOAT fFOV vPos = <<549.67, -624.49, 25.65>> vRot = <<2.11, 0.0, 121.17>> fFOV = 50.0 SWITCH iBoxcar CASE 0 SWITCH iDoor CASE 0 vPos = <<548.45, -625.39, 25.12>> vRot = <<1.69, 3.86, 115.96>> fFOV = 42.79 BREAK CASE 1 vPos = <<549.40, -627.56, 25.12>> vRot = <<7.45, 2.51, -119.90>> fFOV = 38.65 BREAK ENDSWITCH BREAK CASE 1 SWITCH iDoor CASE 0 vPos = <<546.21, -642.82, 24.98>> vRot = <<15.40, 7.15, 45.11>> fFOV = 42.55 BREAK CASE 1 vPos = <<547.78, -644.89, 25.43>> vRot = <<-9.66, 5.28, -46.60>> fFOV = 43.85 BREAK ENDSWITCH BREAK CASE 2 SWITCH iDoor CASE 0 vPos = <<546.21, -642.82, 24.98>> vRot = <<15.40, 7.15, 45.11>> fFOV = 49.38 BREAK CASE 1 vPos = <<527.46, -679.55, 24.82>> vRot = <<21.60, 4.67, -134.84>> fFOV = 48.47 BREAK ENDSWITCH BREAK CASE 3 SWITCH iDoor CASE 0 vPos = <<526.34, -695.16, 27.80>> vRot = <<-39.4, 7.88, 76.29>> fFOV = 19.69 BREAK CASE 1 vPos = <<525.24, -695.54, 25.17>> vRot = <<2.83, -1.28, -120.16>> fFOV = 44.53 BREAK ENDSWITCH BREAK CASE 4 SWITCH iDoor CASE 0 vPos = <<519.53, -707.70, 25.22>> vRot = <<4.41, 0.0, 37.62>> fFOV = 24.44 BREAK CASE 1 vPos = <<519.56, -707.48, 25.10>> vRot = <<7.97, 0.0, -56.17>> fFOV = 41.51 BREAK ENDSWITCH BREAK ENDSWITCH SET_CAM_COORD(staticCam, vPos) SET_CAM_ROT(staticCam, vRot) SET_CAM_FOV(staticCam, fFOV) //#IF IS_DEBUG_BUILD // ATTACH_CAM_TO_ENTITY(staticCam, boxcarCarriage[iBoxcar].anchorObject, vDebugBoxcarCamOffset) // POINT_CAM_AT_ENTITY(staticCam, boxcarCarriage[iBoxcar].anchorObject, vDebugBoxcarCamPoint) // SET_CAM_FOV(staticCam, fDebugBoxcarCamFOV) //#ENDIF ENDPROC PROC CREATE_INSIDE_BOXCAR_CAM(INT iBoxcar, INT iDoor) // comment out to test animated cam //CREATE_MISSION_STATIC_CAM(staticCam) //UPDATE_INSIDE_BOXCAR_CAM(iBoxcar, iDoor) // animated cam stuff CREATE_MISSION_ANIM_CAM() STRING sBoxcarCam IF iBoxcar=2 sBoxcarCam = "open_train_car_cam" PRINTSTRING("open_train_car_cam") PRINTNL() PRINTSTRING("clear area of vehicles") PRINTNL() //CLEAR_ANGLED_AREA_OF_VEHICLES(<<525.33466, -679.05676, 22.22347>>, <<509.89377, -676.02429, 28.29614>>, 12, FALSE, FALSE, FALSE, FALSE, FALSE) //CLEAR_ANGLED_AREA_OF_VEHICLES(<<510.64154, -677.39349, 22.28662>>, <<515.40167, -626.52264, 23.75104>>, 12, FALSE, FALSE, FALSE, FALSE, FALSE) CLEAR_AREA(<<516.24835, -677.81812, 24.24440>>, 10, TRUE) CLEAR_AREA(<<511.58005, -651.00690, 23.75105>>, 24, TRUE) CLEAR_AREA_OF_PROJECTILES(<<517.10986, -665.34436, 23.80532>>, 25) STOP_FIRE_IN_RANGE(<<517.10986, -665.34436, 23.80532>>, 25) REMOVE_PARTICLE_FX_IN_RANGE(<<517.10986, -665.34436, 23.80532>>, 25) ELSE VECTOR vOffset = GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(boxcarCarriage[iBoxcar].boxcarDoor[iDoor].obj, GET_ENTITY_COORDS(PLAYER_PED_ID())) PRINTSTRING("offset = ") PRINTVECTOR(vOffset) PRINTNL() IF vOffset.x <= 0 IF iLeftBoxcarCam = 0 sBoxcarCam = "open_train_car_CAML1" PRINTSTRING("open_train_car_CAML1") PRINTNL() iLeftBoxcarCam = 1 ELSE sBoxcarCam = "open_train_car_CAML2" PRINTSTRING("open_train_car_CAML2") PRINTNL() iLeftBoxcarCam = 0 ENDIF ELSE IF iRightBoxcarCam = 0 sBoxcarCam = "open_train_car_CAMR1" PRINTSTRING("open_train_car_CAMR1") PRINTNL() iRightBoxcarCam = 1 ELSE sBoxcarCam = "open_train_car_CAMR2" PRINTSTRING("open_train_car_CAMR2") PRINTNL() iRightBoxcarCam = 0 ENDIF ENDIF CLEAR_AREA_OF_PROJECTILES(GET_ENTITY_COORDS(PLAYER_PED_ID()), 8) STOP_FIRE_IN_RANGE(GET_ENTITY_COORDS(PLAYER_PED_ID()), 8) REMOVE_PARTICLE_FX_IN_RANGE(GET_ENTITY_COORDS(PLAYER_PED_ID()), 8) ENDIF PLAY_SYNCHRONIZED_CAM_ANIM(animCam, iBoxcarCamSyncScene, sBoxcarCam, GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_FIND)) SET_SYNCHRONIZED_SCENE_HOLD_LAST_FRAME(iBoxcarCamSyncScene, FALSE) ENDPROC CONST_FLOAT GOTO_BOXCAR_HANDLE_OFFSET 1.6//1.7 CONST_FLOAT GOTO_BOXCAR_SIDE_OFFSET 2.36//2.0 CONST_FLOAT INITIAL_DOOR_OPEN_PHASE 0.36 //0.0 // handle boxcar doors PROC HANDLE_BOXCAR_DOORS() INT i,j BOOL bDisplayHelp = FALSE REPEAT NUMBER_BOXCARS i REPEAT 2 j IF DOES_ENTITY_EXIST(boxcarCarriage[i].boxcarDoor[j].obj) SWITCH boxcarCarriage[i].boxcarDoor[j].state CASE BOXCAR_DOOR_AWAITING_PLAYER IF chopViewCamData.state = CHOP_VIEW_CAM_DISABLED IF boxcarCarriage[i].searchState > CARRIAGE_SEARCH_STATE_NOT_BLIPPED IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) AND NOT IS_PHONE_ONSCREEN() AND CAN_ADVANCE_MISSION() AND NOT bFoundBadGuy IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), boxcarCarriage[i].boxcarDoor[j].obj, <<3.7,3.7,LOCATE_SIZE_HEIGHT>>) IF NOT (i=2 AND j=0) // disable back one of target carriage //AND NOT (i=0 AND j=1) VECTOR vPlayerOffset vPlayerOffset = GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(boxcarCarriage[i].boxcarDoor[j].obj, GET_ENTITY_COORDS(PLAYER_PED_ID())) VEHICLE_INDEX closestVehicle closestVehicle = GET_CLOSEST_VEHICLE(GET_ENTITY_COORDS(boxcarCarriage[i].boxcarDoor[j].obj), 3.5, DUMMY_MODEL_FOR_SCRIPT, VEHICLE_SEARCH_FLAG_RETURN_LAW_ENFORCER_VEHICLES | VEHICLE_SEARCH_FLAG_RETURN_MISSION_VEHICLES | VEHICLE_SEARCH_FLAG_RETURN_RANDOM_VEHICLES) //PRINTSTRING("offset = ") PRINTVECTOR(vPlayerOffset) PRINTNL() IF vPlayerOffset.y < 0 AND NOT DOES_ENTITY_EXIST(closestVehicle) AND (i <> 0 OR j <> 1 OR vPlayerOffset.x < 0) // disable door if blocked by crane legs // bDisplayHelp = TRUE IF (IS_CONTROL_JUST_PRESSED(PLAYER_CONTROL, INPUT_CONTEXT) AND NOT IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_SELECT_WEAPON)) #IF IS_DEBUG_BUILD OR bDebugForceOpenBoxcar #ENDIF VECTOR vGotoOffset vGotoOffset = <<0,0,0>> FLOAT fGotoHeading IF j=0 vGotoOffset.x = GOTO_BOXCAR_HANDLE_OFFSET vGotoOffset.y = GOTO_BOXCAR_SIDE_OFFSET fGotoHeading = GET_BOXCAR_ROT(i) - 180 + 6.7 ELSE vGotoOffset.x = -GOTO_BOXCAR_HANDLE_OFFSET vGotoOffset.y = -GOTO_BOXCAR_SIDE_OFFSET fGotoHeading = GET_BOXCAR_ROT(i) + 6.7 ENDIF VECTOR vGo vGo = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(boxcarCarriage[i].anchorObject, vGotoOffset) SET_PLAYER_CONTROL(PLAYER_ID(), FALSE, SPC_LEAVE_CAMERA_CONTROL_ON) CLEAR_SEQUENCE_TASK(sequence) OPEN_SEQUENCE_TASK(sequence) TASK_CLEAR_LOOK_AT(NULL) PRINTSTRING("speed = ") printfloat(GET_ENTITY_SPEED(PLAYER_PED_ID())) PRINTNL() IF GET_ENTITY_SPEED(PLAYER_PED_ID()) > 1.8 TASK_STAND_STILL(NULL, 1000) ENDIF //IF IS_PED_RUNNING(PLAYER_PED_ID()) // PRINTSTRING("STAND STILL 1") PRINTNL() // TASK_STAND_STILL(NULL, 1000) //ELIF IS_PED_SPRINTING(PLAYER_PED_ID()) // PRINTSTRING("STAND STILL 2") PRINTNL() // TASK_STAND_STILL(NULL, 1200) //ENDIF IF (i=0 AND j=1) OR (i=1 AND j=1) TASK_GO_STRAIGHT_TO_COORD(NULL, vGo, PEDMOVE_WALK, DEFAULT_TIME_BEFORE_WARP, fGotoHeading) ELSE TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, vGo, PEDMOVE_WALK, DEFAULT_TIME_BEFORE_WARP, DEFAULT_NAVMESH_RADIUS,ENAV_DEFAULT, fGotoHeading) ENDIF //TASK_TURN_PED_TO_FACE_COORD(NULL, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(boxcarCarriage[i].anchorObject, <>), 3000) CLOSE_SEQUENCE_TASK(sequence) TASK_PERFORM_SEQUENCE(PLAYER_PED_ID(), sequence) IF GET_FOLLOW_PED_CAM_VIEW_MODE() = CAM_VIEW_MODE_FIRST_PERSON SET_PED_DESIRED_HEADING(PLAYER_PED_ID(), fGotoHeading) ENDIF bDisplayHelp = FALSE iBoxcarTriggerTime = GET_GAME_TIMER() boxcarCarriage[i].boxcarDoor[j].state = BOXCAR_DOOR_TRIGGERED ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF BREAK CASE BOXCAR_DOOR_TRIGGERED DISABLE_CELLPHONE_THIS_FRAME_ONLY() IF GET_FOLLOW_PED_CAM_VIEW_MODE() = CAM_VIEW_MODE_FIRST_PERSON // If the player is running the FPS mode force the aiming state // to make sure that he faces the door instead of face the next // point in the navmesh IF NOT GET_PED_CONFIG_FLAG(PLAYER_PED_ID(), PCF_IsAimingGun) FORCE_PED_MOTION_STATE(PLAYER_PED_ID(), MS_AIMING) ENDIF SET_PED_RESET_FLAG(PLAYER_PED_ID(), PRF_ForcePedToStrafe, TRUE) ENDIF SET_PED_MAX_MOVE_BLEND_RATIO(PLAYER_PED_ID(), PEDMOVE_WALK) BOOL bShouldTrigger bShouldTrigger = FALSE IF GET_SCRIPT_TASK_STATUS(PLAYER_PED_ID(), SCRIPT_TASK_PERFORM_SEQUENCE) = FINISHED_TASK OR GET_GAME_TIMER() >= iBoxcarTriggerTime + 21000 bShouldTrigger = TRUE ENDIF IF bShouldTrigger FLOAT fGotoHeading IF j=0 fGotoHeading = 180//-96.921 ELSE fGotoHeading = 0//83.079 ENDIF bShownBoxcarPrompt = TRUE IF IS_THIS_PRINT_BEING_DISPLAYED("FC_GOBOX") REMOVE_MISSION_TEXT(FALSE, TRUE, FALSE) ENDIF CLEAR_HELP() IF boxcarCarriage[i].searchState = CARRIAGE_SEARCH_STATE_SEARCHED bDoneSearchBoxcarSpeech = TRUE bDoneEmptyBoxcarSpeech = TRUE ELSE bDoneSearchBoxcarSpeech = FALSE bDoneEmptyBoxcarSpeech = FALSE ENDIF bRestoredBoxcarGameplayCam = FALSE bDoneDoorSlideSound = FALSE bDoneDoorLimitSound = FALSE bOpenedAnyCarriage = TRUE SET_PLAYER_CONTROL(PLAYER_ID(), FALSE, SPC_LEAVE_CAMERA_CONTROL_ON) TASK_CLEAR_LOOK_AT(PLAYER_PED_ID()) boxcarCarriage[i].boxcarDoor[j].state = BOXCAR_DOOR_OPENING SET_PED_STEALTH_MOVEMENT(PLAYER_PED_ID(), FALSE) iSyncScene = CREATE_SYNCHRONIZED_SCENE(<<0,0,0>>, <<0,0,0>>) //IF i = 2 // ATTACH_SYNCHRONIZED_SCENE_TO_ENTITY(iSyncScene, boxcarCarriage[i].anchorObject, -1) // SET_SYNCHRONIZED_SCENE_ORIGIN(iSyncScene, <<0,0,GET_BOXCAR_DOOR_Z_MOD(i,j)>>, <<0,0,fGotoHeading>>) //ELSE vPlayerSyncScenePos = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(PLAYER_PED_ID(), <<1.9, 2.2, -1.0>>) vPlayerSyncSceneRot = <<0,0,GET_ENTITY_HEADING(PLAYER_PED_ID()) - 6.650>> vTargetOpenPos = GET_ENTITY_COORDS(boxcarCarriage[i].anchorObject) + <<0,0,GET_BOXCAR_DOOR_Z_MOD(i,j)>> vTargetOpenRot = <<0,0,fGotoHeading + GET_BOXCAR_ROT(i)>> SET_SYNCHRONIZED_SCENE_ORIGIN(iSyncScene, vPlayerSyncScenePos, vPlayerSyncSceneRot) //ENDIF SET_SYNCHRONIZED_SCENE_HOLD_LAST_FRAME(iSyncScene, FALSE) iDoorSyncScene = CREATE_SYNCHRONIZED_SCENE(<<0,0,0>>, <<0,0,0>>) ATTACH_SYNCHRONIZED_SCENE_TO_ENTITY(iDoorSyncScene, boxcarCarriage[i].anchorObject, -1) SET_SYNCHRONIZED_SCENE_ORIGIN(iDoorSyncScene, <<0,0,0>>, <<0,0,fGotoHeading>>) SET_SYNCHRONIZED_SCENE_HOLD_LAST_FRAME(iDoorSyncScene, FALSE) iHandleSyncScene = CREATE_SYNCHRONIZED_SCENE(<<0,0,0>>, <<0,0,0>>) SET_SYNCHRONIZED_SCENE_ORIGIN(iHandleSyncScene, vTargetOpenPos, vTargetOpenRot) SET_SYNCHRONIZED_SCENE_HOLD_LAST_FRAME(iHandleSyncScene, FALSE) SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_UNARMED, TRUE) TASK_SYNCHRONIZED_SCENE(PLAYER_PED_ID(), iSyncScene, GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_FIND), "open_train_car_fra", SLOW_BLEND_IN, REALLY_SLOW_BLEND_OUT, SYNCED_SCENE_DONT_INTERRUPT | SYNCED_SCENE_USE_PHYSICS) DETACH_ENTITY(boxcarCarriage[i].boxcarDoor[j].obj) PLAY_SYNCHRONIZED_ENTITY_ANIM(boxcarCarriage[i].boxcarDoor[j].obj, iDoorSyncScene, "open_train_car_door", GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_FIND), SLOW_BLEND_IN) //SET_ENTITY_COLLISION(boxcarCarriage[i].boxcarDoor[j].obj, FALSE) DETACH_ENTITY(boxcarCarriage[i].boxcarDoor[j].handleObject) FREEZE_ENTITY_POSITION(boxcarCarriage[i].boxcarDoor[j].handleObject, FALSE) PLAY_SYNCHRONIZED_ENTITY_ANIM(boxcarCarriage[i].boxcarDoor[j].handleObject, iHandleSyncScene, "open_train_car_handle", GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_FIND), INSTANT_BLEND_IN) SET_ENTITY_COLLISION(boxcarCarriage[i].boxcarDoor[j].handleObject, FALSE) FORCE_ENTITY_AI_AND_ANIMATION_UPDATE(boxcarCarriage[i].boxcarDoor[j].handleObject) //IF i = 2 // SET_SYNCHRONIZED_SCENE_PHASE(iSyncScene, INITIAL_DOOR_OPEN_PHASE) // SET_SYNCHRONIZED_SCENE_PHASE(iDoorSyncScene, INITIAL_DOOR_OPEN_PHASE) // FORCE_ENTITY_AI_AND_ANIMATION_UPDATE(boxcarCarriage[i].boxcarDoor[j].obj) // FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID()) //ENDIF //ATTACH_HANDLE_TO_BOXCAR(i,j,77) //DETACH_ENTITY(boxcarCarriage[i].boxcarDoor[j].handleObject) //FREEZE_ENTITY_POSITION(boxcarCarriage[i].boxcarDoor[j].handleObject, FALSE) //PLAY_SYNCHRONIZED_ENTITY_ANIM(boxcarCarriage[i].boxcarDoor[j].handleObject, iDoorSyncScene, "open_train_car_boxcar", GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_FIND), INSTANT_BLEND_IN) //SET_ENTITY_COLLISION(boxcarCarriage[i].boxcarDoor[j].handleObject, FALSE) iOpenBoxcarTime = GET_GAME_TIMER() ENDIF BREAK CASE BOXCAR_DOOR_OPENING //PRINTSTRING("HERE1") PRINTNL() DISABLE_CELLPHONE_THIS_FRAME_ONLY() IF NOT bRestoredBoxcarGameplayCam IF GET_GAME_TIMER() >= iOpenBoxcarTime + 3500 IF i <> 2 SET_PLAYER_CONTROL(PLAYER_ID(), TRUE) //RENDER_SCRIPT_CAMS(FALSE, FALSE) //DISPLAY_HUD(TRUE) //DISPLAY_RADAR(TRUE) //SET_GAMEPLAY_CAM_RELATIVE_HEADING() //SET_GAMEPLAY_CAM_RELATIVE_PITCH() bRestoredBoxcarGameplayCam = TRUE ENDIF ENDIF ENDIF IF IS_SYNCHRONIZED_SCENE_RUNNING(iSyncScene) SHIFT_VECTOR_TO_IDEAL_VECTOR(vPlayerSyncScenePos, vTargetOpenPos, SHIFT_POS_SPEED/2) SHIFT_VECTOR_TO_IDEAL_VECTOR(vPlayerSyncSceneRot, vTargetOpenRot, SHIFT_ROT_SPEED/2) SET_SYNCHRONIZED_SCENE_ORIGIN(iSyncScene, vPlayerSyncScenePos, vPlayerSyncSceneRot) FLOAT fDoorPhase fDoorPhase = GET_SYNCHRONIZED_SCENE_PHASE(iSyncScene) IF IS_SYNCHRONIZED_SCENE_RUNNING(iDoorSyncScene) SET_SYNCHRONIZED_SCENE_PHASE(iDoorSyncScene, fDoorPhase) ENDIF IF IS_SYNCHRONIZED_SCENE_RUNNING(iHandleSyncScene) SET_SYNCHRONIZED_SCENE_PHASE(iHandleSyncScene, fDoorPhase) ENDIF IF i=2 IF NOT bDoneBoxcarCutsceneCam IF fDoorPhase >= INITIAL_DOOR_OPEN_PHASE iBoxcarCamSyncScene = CREATE_SYNCHRONIZED_SCENE(<<0,0,0>>, <<0,0,0>>) ATTACH_SYNCHRONIZED_SCENE_TO_ENTITY(iBoxcarCamSyncScene, boxcarCarriage[i].anchorObject, -1) SET_SYNCHRONIZED_SCENE_ORIGIN(iBoxcarCamSyncScene, <<0,0,0>>, <<0,0,0>>) SET_SYNCHRONIZED_SCENE_HOLD_LAST_FRAME(iBoxcarCamSyncScene, FALSE) CREATE_INSIDE_BOXCAR_CAM(i,j) SET_SYNCHRONIZED_SCENE_PHASE(iBoxcarCamSyncScene, 0.273) DISPLAY_RADAR(FALSE) DISPLAY_HUD(FALSE) RENDER_SCRIPT_CAMS(TRUE, FALSE) bDoneBoxcarCutsceneCam = TRUE ENDIF ENDIF ENDIF // sounds IF NOT bDoneDoorSlideSound IF fDoorPhase >= 0.51 PLAY_SOUND_FROM_ENTITY(-1, "Boxcar_Door_Slide", boxcarCarriage[i].boxcarDoor[j].obj, "FRANKLIN_0_SOUNDS") bDoneDoorSlideSound = TRUE ENDIF ENDIF IF NOT bDoneDoorLimitSound IF fDoorPhase >= 0.843 PLAY_SOUND_FROM_ENTITY(-1, "Boxcar_Door_Limit", boxcarCarriage[i].boxcarDoor[j].obj, "FRANKLIN_0_SOUNDS") bDoneDoorLimitSound = TRUE ENDIF ENDIF ENDIF FLOAT fPhase BOOL bIsSceneRunning IF i=2 IF IS_SYNCHRONIZED_SCENE_RUNNING(iBoxcarCamSyncScene) bIsSceneRunning = TRUE fPhase = GET_SYNCHRONIZED_SCENE_PHASE(iBoxcarCamSyncScene) ELSE IF bDoneBoxcarCutsceneCam bIsSceneRunning = FALSE else bIsSceneRunning = TRUE ENDIF ENDIF ELSE IF IS_SYNCHRONIZED_SCENE_RUNNING(iSyncScene) bIsSceneRunning = TRUE fPhase = GET_SYNCHRONIZED_SCENE_PHASE(iSyncScene) ELSE bIsSceneRunning = FALSE ENDIF ENDIF IF bIsSceneRunning IF NOT bDoneSearchBoxcarSpeech IF fPhase >= 0.3 bDoneSearchBoxcarSpeech = DO_MISSION_SPEECH("FKN0_ISHE2") IF bDoneSearchBoxcarSpeech REPLAY_RECORD_BACK_FOR_TIME(1.0, 5.0, REPLAY_IMPORTANCE_HIGHEST) ENDIF ENDIF ENDIF IF i <> 2 IF fPhase >= 0.88 IF NOT bDoneEmptyBoxcarSpeech bDoneEmptyBoxcarSpeech = DO_MISSION_SPEECH("FKN0_ISHE3") ENDIF ENDIF ENDIF ELSE PRINTSTRING("HERE3") PRINTNL() FREEZE_ENTITY_POSITION(boxcarCarriage[i].boxcarDoor[j].obj, TRUE) SET_ENTITY_COLLISION(boxcarCarriage[i].boxcarDoor[j].obj, TRUE) FREEZE_ENTITY_POSITION(boxcarCarriage[i].boxcarDoor[j].handleObject, TRUE) SET_ENTITY_COLLISION(boxcarCarriage[i].boxcarDoor[j].handleObject, TRUE) boxcarCarriage[i].boxcarDoor[j].state = BOXCAR_DOOR_OPEN bRestoredBoxcarGameplayCam = TRUE IF i=2 COMMON_MISSION_CUTSCENE_BLENDOUT() ENDIF ENDIF BREAK CASE BOXCAR_DOOR_OPEN BREAK ENDSWITCH IF boxcarCarriage[i].boxcarDoor[j].state = BOXCAR_DOOR_TRIGGERED OR boxcarCarriage[i].boxcarDoor[j].state = BOXCAR_DOOR_OPENING bOpeningBoxcarInProgress = TRUE ENDIF ENDIF ENDREPEAT ENDREPEAT IF bDisplayHelp IF NOT IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("FC_BOXHLP") PRINT_HELP_FOREVER("FC_BOXHLP") ENDIF ELSE IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("FC_BOXHLP") CLEAR_HELP(TRUE) ENDIF ENDIF ENDPROC // handle the searching of the boxcars PROC HANDLE_BOXCAR_SEARCHING() INT i, j REPEAT NUMBER_BOXCARS i SWITCH boxcarCarriage[i].searchState CASE CARRIAGE_SEARCH_STATE_NOT_BLIPPED BOOL bDoBlip bDoBlip = FALSE IF NOT IS_PED_INJURED(chopPed) VECTOR vChopPos vChopPos = GET_ENTITY_COORDS(chopPed) IF i<2 IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<547.56909, -635.45868, 27.41334>>, <<28,28,28>>) IF IS_ENTITY_IN_AREA(chopPed, <<534.9, -648.8,-20>>, <<550.8, -620.1, 100>>, FALSE, FALSE) OR vChopPos.y < -643.6 bBlippedFirstBoxcars = TRUE bDoBlip = TRUE ENDIF ENDIF ELSE IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<522.83582, -691.15991, 23.76571>>, <<40,40,40>>) IF chopBehaviourSetpieceStage = CBS_DONE IF IS_ENTITY_IN_AREA(chopPed, <<526.3, -685.8,-20>>, <<534.8, -665.1, 100>>, FALSE, FALSE) bBlippedSecondBoxcars = TRUE bDoBlip = TRUE IF NOT bResetOpenedAnyCarriage bShownSwitchToOpenHelp = FALSE bOpenedAnyCarriage = FALSE bDoneChopGoToTrain = TRUE bResetOpenedAnyCarriage = TRUE ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF IF bDoBlip boxcarCarriage[i].blip = CREATE_MISSION_BLIP_FOR_COORD(GET_BOXCAR_POS(i)) boxcarCarriage[i].searchState = CARRIAGE_SEARCH_STATE_BLIPPED ENDIF BREAK CASE CARRIAGE_SEARCH_STATE_BLIPPED REPEAT 2 j IF boxcarCarriage[i].boxcarDoor[j].state >= BOXCAR_DOOR_OPENING IF DOES_BLIP_EXIST(boxcarCarriage[i].blip) REMOVE_BLIP(boxcarCarriage[i].blip) ENDIF boxcarCarriage[i].searchState = CARRIAGE_SEARCH_STATE_SEARCHED ENDIF ENDREPEAT BREAK CASE CARRIAGE_SEARCH_STATE_SEARCHED BREAK ENDSWITCH ENDREPEAT IF NOT bBlippedFirstBoxcars ELSE IF NOT bShownBoxcarPrompt IF NOT bDoneBoxcarSpeech bDoneBoxcarSpeech = DO_MISSION_SPEECH("FKN0_ISHE1") ELSE IF chopViewCamData.state = CHOP_VIEW_CAM_DISABLED bShownBoxcarPrompt = DO_MISSION_GOD_TEXT("FC_GOBOX") ENDIF ENDIF ENDIF IF bDoneBoxcarSpeech IF NOT bShownSwitchToOpenHelp IF (chopBehaviourSetpieceStage = CBS_NOT_STARTED OR chopBehaviourSetpieceStage = CBS_DONE OR bBlippedSecondBoxcars) AND bDoneChopGoToTrain AND NOT bOpenedAnyCarriage IF chopViewCamData.state = CHOP_VIEW_CAM_ON_CHOP IF bBlippedSecondBoxcars OR NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() IF DO_MISSION_HELP_TEXT("FC_SWFHLP2", FALSE) SET_SELECTOR_PED_HINT(sSelectorPeds, SELECTOR_PED_FRANKLIN, TRUE) bShownSwitchToOpenHelp = TRUE ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF ENDPROC PROC LOAD_CHASE_UBER_DATA() TrafficCarPos[0] = << 370.608, 148.292, 102.507 >> TrafficCarQuatX[0] = -0.006632 TrafficCarQuatY[0] = 0.014155 TrafficCarQuatZ[0] = -0.182076 TrafficCarQuatW[0] = 0.983160 TrafficCarRecording[0] = 3 TrafficCarStartime[0] = 6300.000000 TrafficCarModel[0] = emperor TrafficCarPos[1] = << 331.042, 319.164, 104.564 >> TrafficCarQuatX[1] = 0.003140 TrafficCarQuatY[1] = -0.035098 TrafficCarQuatZ[1] = 0.793992 TrafficCarQuatW[1] = -0.606906 TrafficCarRecording[1] = 6 TrafficCarStartime[1] = 6900.000000 TrafficCarModel[1] = emperor TrafficCarPos[2] = << 354.004, 101.885, 101.654 >> TrafficCarQuatX[2] = 0.074331 TrafficCarQuatY[2] = 0.014374 TrafficCarQuatZ[2] = -0.163023 TrafficCarQuatW[2] = 0.983713 TrafficCarRecording[2] = 5 TrafficCarStartime[2] = 9000.000000 TrafficCarModel[2] = surfer TrafficCarPos[3] = << 338.717, 94.4636, 99.6961 >> TrafficCarQuatX[3] = -0.047298 TrafficCarQuatY[3] = -0.086009 TrafficCarQuatZ[3] = 0.979703 TrafficCarQuatW[3] = 0.174778 TrafficCarRecording[3] = 4 TrafficCarStartime[3] = 10800.000000 TrafficCarModel[3] = surfer TrafficCarPos[6] = <<289.1492, -78.1900, 69.8117>> TrafficCarQuatX[6] = -0.0056 TrafficCarQuatY[6] = 0.0028 TrafficCarQuatZ[6] = -0.1669 // HERE TrafficCarQuatW[6] = 0.9860 TrafficCarRecording[6] = 9 TrafficCarStartime[6] = 22029.0000 TrafficCarModel[6] = surge TrafficCarPos[7] = << 277.135, -76.6118, 69.5846 >> TrafficCarQuatX[7] = -0.018861 TrafficCarQuatY[7] = -0.000088 TrafficCarQuatZ[7] = 0.983353 TrafficCarQuatW[7] = 0.180722 TrafficCarRecording[7] = 10 TrafficCarStartime[7] = 22491.000000 TrafficCarModel[7] = emperor TrafficCarPos[8] = << 290.813, -40.5747, 71.6218 >> TrafficCarQuatX[8] = -0.031225 TrafficCarQuatY[8] = -0.068270 TrafficCarQuatZ[8] = 0.981420 TrafficCarQuatW[8] = 0.176577 TrafficCarRecording[8] = 8 TrafficCarStartime[8] = 22577.000000 TrafficCarModel[8] = picador TrafficCarPos[9] = <<283.2936, -92.4837, 69.7937>> // HERE TrafficCarQuatX[9] = -0.0028 TrafficCarQuatY[9] = 0.0039 TrafficCarQuatZ[9] = -0.2089 TrafficCarQuatW[9] = 0.9779 TrafficCarRecording[9] = 11 TrafficCarStartime[9] = 22100.0000 TrafficCarModel[9] = picador TrafficCarPos[10] = << 260.135, -121.876, 67.5997 >> TrafficCarQuatX[10] = -0.032570 TrafficCarQuatY[10] = -0.065471 TrafficCarQuatZ[10] = 0.982638 TrafficCarQuatW[10] = 0.170511 TrafficCarRecording[10] = 12 TrafficCarStartime[10] = 22200.000000 TrafficCarModel[10] = dominator // crossing TrafficCarPos[11] = << 181.29, -208.808, 53.4241 >> TrafficCarQuatX[11] = 0.000229 TrafficCarQuatY[11] = -0.000583 TrafficCarQuatZ[11] = 0.818823 TrafficCarQuatW[11] = -0.574044 TrafficCarRecording[11] = 15 TrafficCarStartime[11] = 25705.000000 TrafficCarModel[11] = dominator TrafficCarPos[12] = << 193.856, -218.429, 53.6124 >> TrafficCarQuatX[12] = -0.019551 TrafficCarQuatY[12] = -0.006410 TrafficCarQuatZ[12] = 0.817768 TrafficCarQuatW[12] = -0.575179 TrafficCarRecording[12] = 16 TrafficCarStartime[12] = 26211.0 TrafficCarModel[12] = picador TrafficCarPos[13] = << 179.383, -213.776, 53.5721 >> TrafficCarQuatX[13] = -0.009170 TrafficCarQuatY[13] = -0.024153 TrafficCarQuatZ[13] = 0.815156 TrafficCarQuatW[13] = -0.578666 TrafficCarRecording[13] = 18 TrafficCarStartime[13] = 26100.000000 TrafficCarModel[13] = emperor TrafficCarPos[14] = << 250.805, -222.757, 53.7297 >> TrafficCarQuatX[14] = -0.008553 TrafficCarQuatY[14] = -0.006151 TrafficCarQuatZ[14] = 0.578679 TrafficCarQuatW[14] = 0.815488 TrafficCarRecording[14] = 13 TrafficCarStartime[14] = 26500.000000 TrafficCarModel[14] = issi2 TrafficCarPos[15] = << 268.287, -229.843, 53.546 >> TrafficCarQuatX[15] = -0.011404 TrafficCarQuatY[15] = -0.006868 TrafficCarQuatZ[15] = 0.562785 TrafficCarQuatW[15] = 0.826496 TrafficCarRecording[15] = 17 TrafficCarStartime[15] = 26800.000000 TrafficCarModel[15] = DUMMY_MODEL_FOR_SCRIPT // end of crossing TrafficCarPos[20] = << 184.405, -360.884, 43.522 >> TrafficCarQuatX[20] = 0.028156 TrafficCarQuatY[20] = -0.004063 TrafficCarQuatZ[20] = -0.187644 TrafficCarQuatW[20] = 0.981825 TrafficCarRecording[20] = 19 TrafficCarStartime[20] = 27100.000000 TrafficCarModel[20] = picador TrafficCarPos[21] = << 149.265, -402.928, 40.8279 >> TrafficCarQuatX[21] = -0.016245 TrafficCarQuatY[21] = -0.006338 TrafficCarQuatZ[21] = 0.988408 TrafficCarQuatW[21] = 0.150818 TrafficCarRecording[21] = 25 TrafficCarStartime[21] = 30000.000000 TrafficCarModel[21] = picador TrafficCarPos[22] = << 184.745, -374.707, 42.5835 >> TrafficCarQuatX[22] = 0.023113 TrafficCarQuatY[22] = 0.022802 TrafficCarQuatZ[22] = -0.207431 TrafficCarQuatW[22] = 0.977711 TrafficCarRecording[22] = 22 TrafficCarStartime[22] = 31000.000000 TrafficCarModel[22] = emperor TrafficCarPos[23] = << 142.21, -473.939, 42.6967 >> TrafficCarQuatX[23] = -0.015556 TrafficCarQuatY[23] = 0.005188 TrafficCarQuatZ[23] = -0.163600 TrafficCarQuatW[23] = 0.986390 TrafficCarRecording[23] = 27 TrafficCarStartime[23] = 32500.000000 TrafficCarModel[23] = ruiner TrafficCarPos[24] = <<163.8123, -430.8667, 40.8155>> TrafficCarQuatX[24] = -0.0114 TrafficCarQuatY[24] = 0.0023 TrafficCarQuatZ[24] = -0.1527 TrafficCarQuatW[24] = 0.9882 TrafficCarRecording[24] = 24 TrafficCarStartime[24] = 33039.0000 TrafficCarModel[24] = surge TrafficCarPos[25] = << 141.901, -496.677, 42.9011 >> TrafficCarQuatX[25] = -0.008686 TrafficCarQuatY[25] = 0.008488 TrafficCarQuatZ[25] = -0.139259 TrafficCarQuatW[25] = 0.990182 TrafficCarRecording[25] = 29 TrafficCarStartime[25] = 34000.000000 TrafficCarModel[25] = surge TrafficCarPos[27] = << 151.388, -465.998, 41.923 >> TrafficCarQuatX[27] = -0.035501 TrafficCarQuatY[27] = 0.005991 TrafficCarQuatZ[27] = -0.151597 TrafficCarQuatW[27] = 0.987786 TrafficCarRecording[27] = 28 TrafficCarStartime[27] = 35500.000000 TrafficCarModel[27] = serrano TrafficCarPos[29] = << 126.577, -495.934, 42.7229 >> TrafficCarQuatX[29] = 0.004987 TrafficCarQuatY[29] = 0.000985 TrafficCarQuatZ[29] = 0.986378 TrafficCarQuatW[29] = 0.164417 TrafficCarRecording[29] = 30 TrafficCarStartime[29] = 37500.000000 TrafficCarModel[29] = serrano TrafficCarPos[30] = << 109.107, -551.095, 42.9767 >> TrafficCarQuatX[30] = 0.003323 TrafficCarQuatY[30] = 0.006051 TrafficCarQuatZ[30] = 0.985997 TrafficCarQuatW[30] = 0.166621 TrafficCarRecording[30] = 34 TrafficCarStartime[30] = 38300.000000 TrafficCarModel[30] = picador TrafficCarPos[33] = << 138.572, -587.025, 43.6916 >> TrafficCarQuatX[33] = -0.009659 TrafficCarQuatY[33] = -0.014386 TrafficCarQuatZ[33] = 0.824594 TrafficCarQuatW[33] = -0.565459 TrafficCarRecording[33] = 35 TrafficCarStartime[33] = 40500.000000 TrafficCarModel[33] = issi2 TrafficCarPos[34] = << 231.514, -688.146, 36.2398 >> TrafficCarQuatX[34] = 0.034012 TrafficCarQuatY[34] = 0.021372 TrafficCarQuatZ[34] = -0.157919 TrafficCarQuatW[34] = 0.986635 TrafficCarRecording[34] = 40 TrafficCarStartime[34] = 44000.000000 TrafficCarModel[34] = dilettante TrafficCarPos[35] = << 244.913, -595.018, 42.6265 >> TrafficCarQuatX[35] = -0.022264 TrafficCarQuatY[35] = -0.018083 TrafficCarQuatZ[35] = 0.975585 TrafficCarQuatW[35] = 0.217742 TrafficCarRecording[35] = 36 TrafficCarStartime[35] = 45000.000000 TrafficCarModel[35] = surge TrafficCarPos[36] = << 232.357, -637.287, 39.5948 >> TrafficCarQuatX[36] = -0.007482 TrafficCarQuatY[36] = -0.045975 TrafficCarQuatZ[36] = 0.982940 TrafficCarQuatW[36] = 0.177930 TrafficCarRecording[36] = 37 TrafficCarStartime[36] = 45800.000000 TrafficCarModel[36] = issi2 TrafficCarPos[37] = << 190.257, -798.034, 31.049 >> TrafficCarQuatX[37] = 0.023148 TrafficCarQuatY[37] = 0.011794 TrafficCarQuatZ[37] = -0.181103 TrafficCarQuatW[37] = 0.983120 TrafficCarRecording[37] = 41 TrafficCarStartime[37] = 47700.000000 TrafficCarModel[37] = ruiner TrafficCarPos[38] = << 185.226, -799.949, 30.9391 >> TrafficCarQuatX[38] = 0.009881 TrafficCarQuatY[38] = -0.000991 TrafficCarQuatZ[38] = -0.157923 TrafficCarQuatW[38] = 0.987401 TrafficCarRecording[38] = 42 TrafficCarStartime[38] = 47700.000000 TrafficCarModel[38] = issi2 TrafficCarPos[39] = << 209.914, -698.063, 35.545 >> TrafficCarQuatX[39] = -0.006113 TrafficCarQuatY[39] = -0.035622 TrafficCarQuatZ[39] = 0.983831 TrafficCarQuatW[39] = 0.175416 TrafficCarRecording[39] = 38 TrafficCarStartime[39] = 49000.000000 TrafficCarModel[39] = surge TrafficCarPos[40] = << 210.827, -712.926, 34.6642 >> TrafficCarQuatX[40] = -0.003782 TrafficCarQuatY[40] = -0.025728 TrafficCarQuatZ[40] = 0.980536 TrafficCarQuatW[40] = 0.194608 TrafficCarRecording[40] = 39 TrafficCarStartime[40] = 49000.000000 TrafficCarModel[40] = dilettante TrafficCarPos[41] = << 178.818, -847.36, 30.6204 >> TrafficCarQuatX[41] = 0.013997 TrafficCarQuatY[41] = 0.004302 TrafficCarQuatZ[41] = -0.155335 TrafficCarQuatW[41] = 0.987753 TrafficCarRecording[41] = 44 TrafficCarStartime[41] = 51000.000000 TrafficCarModel[41] = ruiner // CHANGE THE UBER TRAILER PROC IF NUMBER CHANGES TrafficCarPos[42] = << 389.96, -854.675, 29.5846 >> TrafficCarQuatX[42] = 0.005696 TrafficCarQuatY[42] = 0.002982 TrafficCarQuatZ[42] = 0.725659 TrafficCarQuatW[42] = 0.688024 TrafficCarRecording[42] = 48 TrafficCarStartime[42] = 51600.000000 TrafficCarModel[42] = hauler TrafficCarPos[43] = << 146.167, -815.117, 30.7372 >> TrafficCarQuatX[43] = 0.000773 TrafficCarQuatY[43] = -0.001176 TrafficCarQuatZ[43] = 0.802925 TrafficCarQuatW[43] = -0.596078 TrafficCarRecording[43] = 46 TrafficCarStartime[43] = 52000.000000 TrafficCarModel[43] = dilettante TrafficCarPos[45] = << 269.023, -847.023, 28.8521 >> TrafficCarQuatX[45] = -0.008970 TrafficCarQuatY[45] = -0.000601 TrafficCarQuatZ[45] = 0.549913 TrafficCarQuatW[45] = 0.835174 TrafficCarRecording[45] = 45 TrafficCarStartime[45] = 54500.000000 TrafficCarModel[45] = emperor TrafficCarPos[46] = << 474.185, -848.452, 36.2803 >> TrafficCarQuatX[46] = -0.036736 TrafficCarQuatY[46] = -0.035333 TrafficCarQuatZ[46] = 0.709033 TrafficCarQuatW[46] = 0.703331 TrafficCarRecording[46] = 51 TrafficCarStartime[46] = 56000.000000 TrafficCarModel[46] = dilettante TrafficCarPos[48] = << 338.219, -865.494, 28.824 >> TrafficCarQuatX[48] = 0.015373 TrafficCarQuatY[48] = 0.015142 TrafficCarQuatZ[48] = -0.706160 TrafficCarQuatW[48] = 0.707723 TrafficCarRecording[48] = 50 TrafficCarStartime[48] = 59000.000000 TrafficCarModel[48] = dilettante // setpieces SetpieceCarPos[1] = << 285.644, 159.194, 103.819 >> SetpieceCarQuatX[1] = 0.009833 SetpieceCarQuatY[1] = -0.014362 SetpieceCarQuatZ[1] = 0.808141 SetpieceCarQuatW[1] = -0.588732 SetpieceCarRecording[1] = 7 SetpieceCarStartime[1] = 14800.000000 SetPieceCarRecordingSpeed[1] = 1.0 SetpieceCarModel[1] = emperor SetpieceCarPos[2] = << 443.814, 112.308, 99.295 >> SetpieceCarQuatX[2] = 0.017590 SetpieceCarQuatY[2] = 0.011825 SetpieceCarQuatZ[2] = 0.579222 SetpieceCarQuatW[2] = 0.814895 SetpieceCarRecording[2] = 2 SetpieceCarStartime[2] = 15500.000000 SetPieceCarRecordingSpeed[2] = 1.0 SetpieceCarModel[2] = surge SetpieceCarPos[3] = << 265.923, 167.687, 104.4 >> SetpieceCarQuatX[3] = 0.011139 SetpieceCarQuatY[3] = -0.011657 SetpieceCarQuatZ[3] = 0.806724 SetpieceCarQuatW[3] = -0.590708 SetpieceCarRecording[3] = 14 SetpieceCarStartime[3] = 16100.000000 SetPieceCarRecordingSpeed[3] = 0.9 SetpieceCarModel[3] = surge SetpieceCarPos[4] = << 278.781, -233.142, 53.7075 >> SetpieceCarQuatX[4] = -0.001098 SetpieceCarQuatY[4] = 0.002631 SetpieceCarQuatZ[4] = 0.574218 SetpieceCarQuatW[4] = 0.818697 SetpieceCarRecording[4] = 20 SetpieceCarStartime[4] = 28500.000000 SetPieceCarRecordingSpeed[4] = 0.8 SetpieceCarModel[4] = picador SetpieceCarPos[5] = << 294.562, -239.728, 53.3336 >> SetpieceCarQuatX[5] = 0.006082 SetpieceCarQuatY[5] = 0.003727 SetpieceCarQuatZ[5] = 0.558519 SetpieceCarQuatW[5] = 0.829461 SetpieceCarRecording[5] = 21 SetpieceCarStartime[5] = 28600.000000 SetPieceCarRecordingSpeed[5] = 0.8 SetpieceCarModel[5] = Dominator SetpieceCarPos[6] = << 160.448, -202.345, 53.9951 >> SetpieceCarQuatX[6] = 0.006110 SetpieceCarQuatY[6] = -0.010066 SetpieceCarQuatZ[6] = 0.799184 SetpieceCarQuatW[6] = -0.600971 SetpieceCarRecording[6] = 23 SetpieceCarStartime[6] = 28300.000000 SetPieceCarRecordingSpeed[6] = 0.9 SetpieceCarModel[6] = issi2 SetpieceCarPos[7] = << 236.955, -354.8, 43.9326 >> SetpieceCarQuatX[7] = -0.012410 SetpieceCarQuatY[7] = -0.009908 SetpieceCarQuatZ[7] = 0.575418 SetpieceCarQuatW[7] = 0.817706 SetpieceCarRecording[7] = 26 SetpieceCarStartime[7] = 32500.000000 SetPieceCarRecordingSpeed[7] = 0.9 SetpieceCarModel[7] = emperor SetpieceCarPos[8] = << 243.385, -350.767, 44.1248 >> SetpieceCarQuatX[8] = -0.011465 SetpieceCarQuatY[8] = 0.013013 SetpieceCarQuatZ[8] = 0.588918 SetpieceCarQuatW[8] = 0.808007 SetpieceCarRecording[8] = 31 SetpieceCarStartime[8] = 33500.000000 SetPieceCarRecordingSpeed[8] = 0.9 SetpieceCarModel[8] = ruiner SetpieceCarPos[9] = << 113.611, -316.672, 45.3552 >> SetpieceCarQuatX[9] = 0.008460 SetpieceCarQuatY[9] = -0.018241 SetpieceCarQuatZ[9] = 0.827523 SetpieceCarQuatW[9] = -0.561072 SetpieceCarRecording[9] = 32 SetpieceCarStartime[9] = 32200.000000 SetPieceCarRecordingSpeed[9] = 0.9 SetpieceCarModel[9] = surge SetPieceCarPos[10] = << 110.55, -592.478, 44.2156 >> SetpieceCarQuatX[10] = -0.007297 SetpieceCarQuatY[10] = 0.028491 SetpieceCarQuatZ[10] = -0.184284 SetpieceCarQuatW[10] = 0.982433 SetpieceCarRecording[10] = 33 SetpieceCarStartime[10] = 33300.0 SetPieceCarRecordingSpeed[10] = 0.0000001 SetpieceCarModel[10] = hauler SetpieceCarPos[11] = << 105.86, -590.119, 43.7371 >> SetpieceCarQuatX[11] = -0.003333 SetpieceCarQuatY[11] = 0.011106 SetpieceCarQuatZ[11] = -0.189616 SetpieceCarQuatW[11] = 0.981790 SetpieceCarRecording[11] = 49 SetpieceCarStartime[11] = 33300.000000 SetPieceCarRecordingSpeed[11] = 0.0000001 SetpieceCarModel[11] = ruiner SetpieceCarPos[12] = << 498.819, -821.764, 24.9128 >> SetpieceCarQuatX[12] = -0.006844 SetpieceCarQuatY[12] = 0.004888 SetpieceCarQuatZ[12] = 0.711778 SetpieceCarQuatW[12] = 0.702352 SetpieceCarRecording[12] = 53 SetpieceCarStartime[12] = 58500.000000 SetPieceCarRecordingSpeed[12] = 1.0 SetpieceCarModel[12] = BUS SetpieceCarPos[13] = << 457.43, -827.98, 27.4745 >> SetpieceCarQuatX[13] = 0.001460 SetpieceCarQuatY[13] = -0.052743 SetpieceCarQuatZ[13] = 0.710800 SetpieceCarQuatW[13] = -0.701412 SetpieceCarRecording[13] = 52 SetpieceCarStartime[13] = 65000.000000 SetPieceCarRecordingSpeed[13] = 1.0 SetpieceCarModel[13] = bus SetpieceCarPos[14] = << 427.612, -680.204, 29.2124 >> SetpieceCarQuatX[14] = 0.009204 SetpieceCarQuatY[14] = 0.021699 SetpieceCarQuatZ[14] = -0.705913 SetpieceCarQuatW[14] = 0.707905 SetpieceCarRecording[14] = 54 SetpieceCarStartime[14] = 69570//70100.000000 SetPieceCarRecordingSpeed[14] = 1.0 SetpieceCarModel[14] = bus ENDPROC // set Balla on bike PROC SET_BALLA_ON_BIKE() IF NOT IS_PED_INJURED(runnerChaseProperties.ped) AND IS_VEHICLE_DRIVEABLE(hoodVehicle[HV_BAD_GUY_BIKE]) //FREEZE_ENTITY_POSITION(runnerChaseProperties.ped, FALSE) SET_PED_INTO_VEHICLE(runnerChaseProperties.ped, hoodVehicle[HV_BAD_GUY_BIKE]) ENDIF ENDPROC // set bike to escape PROC SET_BIKE_TO_ESCAPE() IF IS_VEHICLE_DRIVEABLE(hoodVehicle[HV_BAD_GUY_BIKE]) IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(hoodVehicle[HV_BAD_GUY_BIKE]) STOP_PLAYBACK_RECORDED_VEHICLE(hoodVehicle[HV_BAD_GUY_BIKE]) ENDIF SET_VEHICLE_ENGINE_ON(hoodVehicle[HV_BAD_GUY_BIKE], TRUE, TRUE) START_PLAYBACK_RECORDED_VEHICLE(hoodVehicle[HV_BAD_GUY_BIKE], 001, GET_HOOD_UBER_RECORDING_PREFIX()) SKIP_TIME_IN_PLAYBACK_RECORDED_VEHICLE(hoodVehicle[HV_BAD_GUY_BIKE], 6500) FORCE_PLAYBACK_RECORDED_VEHICLE_UPDATE(hoodVehicle[HV_BAD_GUY_BIKE]) ENDIF ENDPROC // calculate correct time PROC HANDLE_CHASE_SPEED(FLOAT fPlaybackTime) // should update chase stage FLOAT fAdvanceSpeedTime SWITCH chaseSpeedStage CASE CHASE_SPEED_START fAdvanceSpeedTime = 15710 BREAK CASE CHASE_SPEED_ROUND_FIRST_CORNER fAdvanceSpeedTime = 20500 BREAK CASE CHASE_SPEED_DOWN_HILL fAdvanceSpeedTime = 24900 BREAK CASE CHASE_SPEED_THROUGH_JUNCTION fAdvanceSpeedTime = 36000 BREAK CASE CHASE_SPEED_FOR_SHARP_TURN fAdvanceSpeedTime = 44100 BREAK CASE CHASE_SPEED_CATCH_BACK_UP fAdvanceSpeedTime = 50000 BREAK CASE CHASE_SPEED_UNDER_HIGHWAY fAdvanceSpeedTime = 56000 BREAK CASE CHASE_SPEED_TO_ALLEY fAdvanceSpeedTime = 64000 BREAK CASE CHASE_SPEED_ALLEY_CORNER fAdvanceSpeedTime = 67500 BREAK CASE CHASE_SPEED_IN_ALLEY fAdvanceSpeedTime = 99999999 BREAK ENDSWITCH IF fPlaybackTime >= fAdvanceSpeedTime chaseSpeedStage = INT_TO_ENUM(CHASE_SPEED_STAGE_ENUM, ENUM_TO_INT(chaseSpeedStage)+1) ENDIF FLOAT fDefaultSpeed = 1.0 FLOAT fMinDist = 10.0 FLOAT fIdealDist = 25.0 FLOAT fSlowDownDist = 52.0 FLOAT fMaxPlaybackSpeed = 2.2 FLOAT fMinSpeedIfBehind = 0.60 FLOAT fMinSpeedIfLosingTrigger = 0.45 FLOAT fAccel = 0.03 SWITCH chaseSpeedStage CASE CHASE_SPEED_START fMinSpeedIfBehind = 0.60 fMinSpeedIfLosingTrigger = 0.60 BREAK CASE CHASE_SPEED_ROUND_FIRST_CORNER fSlowDownDist = 110.0 fMinSpeedIfBehind = 0.60 fMinSpeedIfLosingTrigger = 0.50 BREAK CASE CHASE_SPEED_DOWN_HILL BREAK CASE CHASE_SPEED_THROUGH_JUNCTION fMinDist = 13.0 fIdealDist = 35.0 BREAK CASE CHASE_SPEED_FOR_SHARP_TURN fMinDist = 15.0 fIdealDist = 40.0 BREAK CASE CHASE_SPEED_CATCH_BACK_UP BREAK CASE CHASE_SPEED_UNDER_HIGHWAY BREAK CASE CHASE_SPEED_TO_ALLEY BREAK CASE CHASE_SPEED_ALLEY_CORNER IF NOT IS_SPECIAL_ABILITY_ACTIVE(PLAYER_ID()) OR NOT IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), hoodVehicle[HV_BAD_GUY_BIKE], <<15,15,15>>, false, false) fMinDist = 12.0 fIdealDist = 28.0 ELSE fMinDist = 22.0 fIdealDist = 28.0 fMaxPlaybackSpeed = 2.5 fAccel = 0.1 ENDIF BREAK CASE CHASE_SPEED_IN_ALLEY IF bSpeedUpBikeInAlley VECTOR vBikePos vBikePos = GET_ENTITY_COORDS(hoodVehicle[HV_BAD_GUY_BIKE]) VECTOR vPlayerPos vPlayerPos = GET_ENTITY_COORDS(PLAYER_PED_ID()) IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), hoodVehicle[HV_BAD_GUY_BIKE], <<8,8,8>>, FALSE, FALSE) OR vPlayerPos.y > vBikePos.y - 3 fMinDist = 260.0 fIdealDist = 300.0 fSlowDownDist = 550.0 fMinSpeedIfBehind = 1.0 fMinSpeedIfLosingTrigger = 1.0 fMaxPlaybackSpeed = 2.5 fAccel = 0.2 ELSE fMinDist = 8.0 fIdealDist = 12.0 fSlowDownDist = 18.0 fMinSpeedIfBehind = 0.85 fMinSpeedIfLosingTrigger = 0.7 ENDIF ELSE fMinDist = 0.9 fIdealDist = 1.0 fSlowDownDist = 2.0 fMinSpeedIfBehind = 0.05 fMinSpeedIfLosingTrigger = 0.05 ENDIF BREAK ENDSWITCH // offset CONST_FLOAT SPEED_UP_DISTANCE_SIDE 60.0 VECTOR vOffset = GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(hoodVehicle[HV_BAD_GUY_BIKE], GET_ENTITY_COORDS(PLAYER_PED_ID())) IF chaseSpeedStage = CHASE_SPEED_THROUGH_JUNCTION OR chaseSpeedStage = CHASE_SPEED_FOR_SHARP_TURN IF (vOffset.x < -SPEED_UP_DISTANCE_SIDE OR vOffset.x > SPEED_UP_DISTANCE_SIDE OR vOffset.y > 0) AND vOffset.y > -130 printstring("apply") printnl() fMinDist = 260.0 fIdealDist = 300.0 fSlowDownDist = 550.0 fMinSpeedIfBehind = 1.0 fMinSpeedIfLosingTrigger = 1.0 fMaxPlaybackSpeed = 2.5 fAccel = 0.1 ENDIF ENDIF IF fPlaybackTime >= 8000 IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), hoodVehicle[HV_FRANKLIN_VAN]) OR fPlaybackTime < 22000 CALCULATE_DESIRED_PLAYBACK_SPEED_FROM_TRIGGER_CAR(fDesiredSpeed, hoodVehicle[HV_FRANKLIN_VAN], hoodVehicle[HV_BAD_GUY_BIKE], fMinDist, // fClosestDist = 5.0 fIdealDist, // fIdealDist = 10.0 fSlowDownDist,// fMaxDist = 50.0 DEFAULT, // fLosingTriggerDist = 100.0 DEFAULT, // fMaxDistInFront = 30.0 fDefaultSpeed, // fDefaultPlaybackSpeed = 1.0 fMinSpeedIfBehind, // fMinSpeedIfBehind = 0.7 fMinSpeedIfLosingTrigger, // fMinSpeedIfLosingTrigger = 0.5 fMaxPlaybackSpeed,// fMaxSpeedIfTooClose = 2.0 TRUE) ELSE fDesiredSpeed = 0.75 ENDIF //printstring("fdesiredspeed = ") printfloat(fDesiredSpeed) printnl() UPDATE_CURRENT_PLAYBACK_SPEED_WITH_SMOOTHING(fCarChaseSpeed, fDesiredSpeed, fAccel)//0.06) ELSE fCarChaseSpeed = 1.0 ENDIF //CALCULATE_NEW_PLAYBACK_SPEED_FROM_CHAR(hoodVehicle[HV_BAD_GUY_BIKE], PLAYER_PED_ID(), fCarChaseSpeed, fDefaultSpeed, fMinDist, fIdealDist, fSlowDownDist, fMaxPlaybackSpeed, fAirResistanceMultiplier, fCatchupSpeedMultiplier) //IF GET_DISTANCE_BETWEEN_ENTITIES(hoodVehicle[HV_BAD_GUY_BIKE], PLAYER_PED_ID(), FALSE) < fMegaSpeedDistance // fCarChaseSpeed = fCarChaseSpeed +@ fMegaSpeedAccel //ELIF fPlaybackTime <= 8000 // fCarChaseSpeed = 1.0 //ENDIF //printstring("speed = ") printfloat(fCarChaseSpeed) printnl() ENDPROC // move the last player vehicle if at coord PROC CLEAR_INIT_POS(VECTOR vCheckPos) CLEAR_AREA(vCheckPos, CLEAR_POS_RADIUS, TRUE) ENDPROC // set next random speech time PROC SET_NEXT_RANDOM_SPEECH_TIME(INT iTime = -1, INT iRandomMin = -1, INT iRandomMax = -1) IF iTime >= 0 // if supplied an argument, set it to that iNextRandomSpeechTime = GET_GAME_TIMER() + iTime ELSE INT iNextTimeMin INT iNextTimeMax IF iRandomMin < 0 iNextTimeMin = MIN_RANDOM_SPEECH_TIME ELSE iNextTimeMin = iRandomMin ENDIF IF iRandomMax < 0 iNextTimeMax = MAX_RANDOM_SPEECH_TIME ELSE iNextTimeMax = iRandomMax ENDIF iNextRandomSpeechTime = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(iNextTimeMin, iNextTimeMax) ENDIF ENDPROC // handle random speech PROC DO_RANDOM_SPEECH(STRING sSpeech, INT iNextTime = -1, INT iRandomMin = -1, INT iRandomMax = -1, BOOL bOverrideText = FALSE) // 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, bOverrideText) IF iNextTime >= 0 SET_NEXT_RANDOM_SPEECH_TIME(iNextTime) ELSE SET_NEXT_RANDOM_SPEECH_TIME(-1, iRandomMin, iRandomMax) ENDIF ENDIF ENDIF ENDPROC // handle reaction to run stat increasing while on mission PROC HANDLE_REACT_TO_RUN_STAT() // help text teaching run stat SWITCH runHelpState CASE RUN_HELP_STATE_NOT_STARTED IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<488.903, -495.385, 23.597>>, <<562.402, -504.983, 26.316>>, 41.0) OR currentMissionStage = STAGE_FIND_BAD_GUY OR bDoneReactToRunStatSpeech IF NOT bRunningCutscene IF chopViewCamData.state = CHOP_VIEW_CAM_DISABLED IF DO_MISSION_HELP_TEXT("FC_RUNHLP1", FALSE) runHelpState = RUN_HELP_PART_2 ENDIF ENDIF ENDIF ENDIF BREAK CASE RUN_HELP_PART_2 IF NOT bRunningCutscene IF chopViewCamData.state = CHOP_VIEW_CAM_DISABLED IF DO_MISSION_HELP_TEXT("FC_RUNHLP2", FALSE) runHelpState = RUN_HELP_STATE_DONE ENDIF ENDIF ENDIF BREAK CASE RUN_HELP_STATE_DONE BREAK ENDSWITCH IF NOT bDoneReactToRunStatSpeech IF GET_SP_PLAYER_PED_STAT_VALUE(CHAR_FRANKLIN, PS_STAMINA) > iInitialStaminaValue AND NOT bRunningCutscene IF DO_MISSION_SPEECH("FKN0_RUNUP") SET_NEXT_RANDOM_SPEECH_TIME() bDoneReactToRunStatSpeech = TRUE ENDIF ENDIF ENDIF ENDPROC // get string for audio context FUNC STRING GET_STRING_FOR_CHOP_AUDIO_CONTEXT(CHOP_AUDIO_CONTEXT_ENUM audioContext) SWITCH audioContext CASE CHOP_AUDIO_CONTEXT_BARK RETURN "BARK" BREAK CASE CHOP_AUDIO_CONTEXT_GROWL RETURN "GROWL" BREAK CASE CHOP_AUDIO_CONTEXT_ATTACK RETURN "ATTACK" BREAK CASE CHOP_AUDIO_CONTEXT_SNARL RETURN "SNARL" BREAK CASE CHOP_AUDIO_CONTEXT_LICKS_MOUTH RETURN "CHOP_LICKS_MOUTH" BREAK CASE CHOP_AUDIO_CONTEXT_PANT RETURN "CHOP_PANT" BREAK CASE CHOP_AUDIO_CONTEXT_SNIFF RETURN "CHOP_SNIFF_SEQ" BREAK CASE CHOP_AUDIO_CONTEXT_PLAYFUL RETURN "CHOP_PLAYFUL" BREAK CASE CHOP_AUDIO_CONTEXT_WHINE_SHORT RETURN "CHOP_WHINE" BREAK CASE CHOP_AUDIO_CONTEXT_WHINE_LONG RETURN "CHOP_LONG_WHINE" BREAK CASE CHOP_AUDIO_CONTEXT_WHINE_STOP RETURN "CHOP_WHINE_STOP" BREAK ENDSWITCH RETURN "" ENDFUNC PROC PLAY_CHOP_AUDIO_CONTEXT(CHOP_AUDIO_CONTEXT_ENUM audioContext) IF NOT IS_PED_INJURED(chopPed) //PLAY_ANIMAL_VOCALIZATION(chopPed, AUD_ANIMAL_DOG_ROTTWEILER, GET_STRING_FOR_CHOP_AUDIO_CONTEXT(audioContext)) lastChopAudioContext = audioContext //PRINTSTRING("playing chop audio!") PRINTNL() ENDIF ENDPROC CONST_INT SHORT_NEXT_TIME_MIN 400 CONST_INT MED_NEXT_TIME_MIN 800 CONST_INT LONG_NEXT_TIME_MIN 2000 CONST_INT SHORT_NEXT_TIME_MAX 700 CONST_INT MED_NEXT_TIME_MAX 3000 CONST_INT LONG_NEXT_TIME_MAX 6000 // do chop audio PROC DO_CHOP_AUDIO(CHOP_AUDIO_STATE_ENUM audioState) IF GET_GAME_TIMER() >= iNextChopSoundTime INT iNextTimeMin = MED_NEXT_TIME_MIN INT iNextTimeMax = MED_NEXT_TIME_MAX INT iRandom = GET_RANDOM_INT_IN_RANGE(0,100) CHOP_AUDIO_CONTEXT_ENUM audioContext SWITCH audioState CASE CHOP_AUDIO_STATE_WALK_TO_VAN SWITCH GET_RANDOM_INT_IN_RANGE(0,2) CASE 0 audioContext = CHOP_AUDIO_CONTEXT_BARK BREAK CASE 1 audioContext = CHOP_AUDIO_CONTEXT_PANT BREAK ENDSWITCH iNextTimeMin = LONG_NEXT_TIME_MIN iNextTimeMax = LONG_NEXT_TIME_MAX BREAK CASE CHOP_AUDIO_STATE_IN_VAN_PLACID IF iRandom >= 90 audioContext = CHOP_AUDIO_CONTEXT_LICKS_MOUTH ELIF iRandom >= 70 audioContext = CHOP_AUDIO_CONTEXT_PLAYFUL ELIF iRandom >= 40 audioContext = CHOP_AUDIO_CONTEXT_BARK ELSE audioContext = CHOP_AUDIO_CONTEXT_PANT ENDIF iNextTimeMin = LONG_NEXT_TIME_MIN iNextTimeMax = LONG_NEXT_TIME_MAX - 500 BREAK CASE CHOP_AUDIO_STATE_IN_VAN_AGITATED IF lastChopAudioContext = CHOP_AUDIO_CONTEXT_WHINE_SHORT OR lastChopAudioContext = CHOP_AUDIO_CONTEXT_WHINE_LONG IF iRandom >= 80 audioContext = CHOP_AUDIO_CONTEXT_WHINE_STOP ELIF iRandom <= 20 audioContext = CHOP_AUDIO_CONTEXT_WHINE_LONG iNextTimeMin = SHORT_NEXT_TIME_MIN iNextTimeMax = SHORT_NEXT_TIME_MAX ELSE audioContext = CHOP_AUDIO_CONTEXT_WHINE_SHORT iNextTimeMin = SHORT_NEXT_TIME_MIN iNextTimeMax = SHORT_NEXT_TIME_MAX ENDIF ELSE SWITCH GET_RANDOM_INT_IN_RANGE(0,4) CASE 0 audioContext = CHOP_AUDIO_CONTEXT_BARK BREAK CASE 1 audioContext = CHOP_AUDIO_CONTEXT_PANT BREAK CASE 2 audioContext = CHOP_AUDIO_CONTEXT_WHINE_SHORT iNextTimeMin = SHORT_NEXT_TIME_MIN iNextTimeMax = SHORT_NEXT_TIME_MAX BREAK CASE 3 audioContext = CHOP_AUDIO_CONTEXT_WHINE_LONG iNextTimeMin = SHORT_NEXT_TIME_MIN iNextTimeMax = SHORT_NEXT_TIME_MAX BREAK ENDSWITCH ENDIF BREAK CASE CHOP_AUDIO_STATE_IN_VAN_GUARDING SWITCH GET_RANDOM_INT_IN_RANGE(0,2) CASE 0 audioContext = CHOP_AUDIO_CONTEXT_GROWL BREAK CASE 1 audioContext = CHOP_AUDIO_CONTEXT_SNARL BREAK ENDSWITCH BREAK CASE CHOP_AUDIO_STATE_SEARCHING audioContext = CHOP_AUDIO_CONTEXT_PANT IF chopViewCamData.state = CHOP_VIEW_CAM_ON_CHOP OR chopViewCamData.state = CHOP_VIEW_CAM_TO_CHOP iNextTimeMin = SHORT_NEXT_TIME_MIN iNextTimeMax = SHORT_NEXT_TIME_MAX ENDIF BREAK CASE CHOP_AUDIO_STATE_RUNNING_TO_HUMP SWITCH GET_RANDOM_INT_IN_RANGE(0,2) CASE 0 audioContext = CHOP_AUDIO_CONTEXT_BARK BREAK CASE 1 audioContext = CHOP_AUDIO_CONTEXT_PANT BREAK ENDSWITCH IF chopViewCamData.state = CHOP_VIEW_CAM_ON_CHOP OR chopViewCamData.state = CHOP_VIEW_CAM_TO_CHOP iNextTimeMin = SHORT_NEXT_TIME_MIN iNextTimeMax = SHORT_NEXT_TIME_MAX ELSE iNextTimeMin -= 100 iNextTimeMax -= 800 ENDIF BREAK CASE CHOP_AUDIO_STATE_HUMPING IF lastChopAudioContext = CHOP_AUDIO_CONTEXT_WHINE_SHORT OR lastChopAudioContext = CHOP_AUDIO_CONTEXT_WHINE_LONG IF iRandom >= 90 audioContext = CHOP_AUDIO_CONTEXT_WHINE_STOP iNextTimeMin = SHORT_NEXT_TIME_MIN iNextTimeMax = SHORT_NEXT_TIME_MAX ELIF iRandom <= 20 audioContext = CHOP_AUDIO_CONTEXT_WHINE_LONG iNextTimeMin = SHORT_NEXT_TIME_MIN iNextTimeMax = SHORT_NEXT_TIME_MAX ELSE audioContext = CHOP_AUDIO_CONTEXT_WHINE_SHORT ENDIF ELSE SWITCH GET_RANDOM_INT_IN_RANGE(0,3) CASE 0 audioContext = CHOP_AUDIO_CONTEXT_WHINE_SHORT iNextTimeMin = SHORT_NEXT_TIME_MIN iNextTimeMax = SHORT_NEXT_TIME_MAX BREAK CASE 1 audioContext = CHOP_AUDIO_CONTEXT_WHINE_LONG iNextTimeMin = SHORT_NEXT_TIME_MIN iNextTimeMax = SHORT_NEXT_TIME_MAX BREAK CASE 2 audioContext = CHOP_AUDIO_CONTEXT_PLAYFUL BREAK ENDSWITCH ENDIF BREAK CASE CHOP_AUDIO_STATE_CHASING SWITCH GET_RANDOM_INT_IN_RANGE(0,4) CASE 0 audioContext = CHOP_AUDIO_CONTEXT_BARK BREAK CASE 1 audioContext = CHOP_AUDIO_CONTEXT_GROWL BREAK CASE 2 audioContext = CHOP_AUDIO_CONTEXT_ATTACK BREAK CASE 3 audioContext = CHOP_AUDIO_CONTEXT_SNARL BREAK ENDSWITCH IF chopViewCamData.state = CHOP_VIEW_CAM_ON_CHOP OR chopViewCamData.state = CHOP_VIEW_CAM_TO_CHOP OR (currentMissionStage = STAGE_FOOT_CHASE AND GET_GAME_TIMER() < iStageStartTime + 6000) iNextTimeMin = SHORT_NEXT_TIME_MIN iNextTimeMax = SHORT_NEXT_TIME_MAX ELSE iNextTimeMin -= 100 iNextTimeMax -= 800 ENDIF BREAK CASE CHOP_AUDIO_STATE_FOUND_SOMETHING SWITCH GET_RANDOM_INT_IN_RANGE(0,3) CASE 0 audioContext = CHOP_AUDIO_CONTEXT_BARK BREAK CASE 1 audioContext = CHOP_AUDIO_CONTEXT_GROWL BREAK CASE 2 audioContext = CHOP_AUDIO_CONTEXT_SNARL BREAK ENDSWITCH iNextTimeMin -= 100 iNextTimeMax -= 800 BREAK CASE CHOP_AUDIO_STATE_WAITING IF lastChopAudioContext = CHOP_AUDIO_CONTEXT_WHINE_SHORT OR lastChopAudioContext = CHOP_AUDIO_CONTEXT_WHINE_LONG IF iRandom >= 80 audioContext = CHOP_AUDIO_CONTEXT_WHINE_STOP ELIF iRandom <= 20 audioContext = CHOP_AUDIO_CONTEXT_WHINE_LONG iNextTimeMin = SHORT_NEXT_TIME_MIN iNextTimeMax = SHORT_NEXT_TIME_MAX ELSE audioContext = CHOP_AUDIO_CONTEXT_WHINE_SHORT iNextTimeMin = SHORT_NEXT_TIME_MIN iNextTimeMax = SHORT_NEXT_TIME_MAX ENDIF ELSE SWITCH GET_RANDOM_INT_IN_RANGE(0,2) CASE 0 audioContext = CHOP_AUDIO_CONTEXT_WHINE_SHORT iNextTimeMin = SHORT_NEXT_TIME_MIN iNextTimeMax = SHORT_NEXT_TIME_MAX BREAK CASE 1 audioContext = CHOP_AUDIO_CONTEXT_WHINE_LONG iNextTimeMin = SHORT_NEXT_TIME_MIN iNextTimeMax = SHORT_NEXT_TIME_MAX BREAK ENDSWITCH ENDIF BREAK ENDSWITCH PLAY_CHOP_AUDIO_CONTEXT(audioContext) iNextChopSoundTime = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(iNextTimeMin, iNextTimeMax) ENDIF ENDPROC PROC DO_NO_STAMINA_HELP_TEXT IF NOT bShownNoStaminaHelp //PRINTFLOAT(GET_PLAYER_SPRINT_TIME_REMAINING(PLAYER_ID())) PRINTNL() IF NOT IS_HELP_MESSAGE_BEING_DISPLAYED() IF GET_PLAYER_SPRINT_TIME_REMAINING(PLAYER_ID()) <= 5.0 BOOL bCanDisplay IF currentMissionStage = STAGE_FOOT_CHASE bCanDisplay = TRUE ELSE IF bShownChopViewHelp bCanDisplay = TRUE ENDIF ENDIF IF bCanDisplay bShownNoStaminaHelp = DO_MISSION_HELP_TEXT("AM_H_NOSTAM", FALSE) IF bShownNoStaminaHelp SET_ONE_TIME_HELP_MESSAGE_DISPLAYED(FHM_NO_STAMINA) ENDIF ENDIF ENDIF ENDIF ENDIF ENDPROC CONST_INT CHOP_HELP_TIME 14000 // do chop cam help PROC DO_CHOP_CAM_HELP() // chop view help IF NOT bShownChopViewHelp IF chopViewCamData.state <> CHOP_VIEW_CAM_DISABLED bShownChopViewHelp = TRUE ELSE IF NOT IS_HELP_MESSAGE_BEING_DISPLAYED() IF GET_GAME_TIMER() >= iStageStartTime + 5000 IF DO_MISSION_HELP_TEXT("FC_CHOPHLP", FALSE, CHOP_HELP_TIME) SET_CHOP_SELECT_HINT(chopViewCamData, sSelectorPeds, TRUE) iShowChopHelpTime = GET_GAME_TIMER() bShownChopViewHelp = TRUE ENDIF ENDIF ENDIF ENDIF ELSE IF NOT bCancelledChopHint IF GET_GAME_TIMER() >= iShowChopHelpTime + CHOP_HELP_TIME SET_CHOP_SELECT_HINT(chopViewCamData, sSelectorPeds, FALSE) bCancelledChopHint = TRUE ENDIF ENDIF IF chopViewCamData.state >= CHOP_VIEW_CAM_TO_CHOP IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("FC_CHOPHLP") IF GET_GAME_TIMER() >= iClearHelpTime + 500 CLEAR_HELP(FALSE) iClearHelpTime = GET_GAME_TIMER() ENDIF ENDIF ENDIF IF NOT bShownQuickSwitchHelp IF chopViewCamData.state = CHOP_VIEW_CAM_ON_CHOP OR chopViewCamData.state = CHOP_VIEW_CAM_DISABLED IF NOT bOpeningBoxcarInProgress bShownQuickSwitchHelp = DO_MISSION_HELP_TEXT("FC_QSWHLP", FALSE) ENDIF ENDIF ELSE IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("FC_QSWHLP") IF chopViewCamData.state = CHOP_VIEW_CAM_TO_CHOP OR chopViewCamData.state = CHOP_VIEW_CAM_TO_PLAYER IF GET_GAME_TIMER() >= iClearHelpTime + 500 CLEAR_HELP(FALSE) iClearHelpTime = GET_GAME_TIMER() ENDIF ENDIF ENDIF ENDIF ENDIF ENDPROC // draw chop scent PROC DRAW_SCENT(BOOL bScentIsHiding) BOOL bDoScent bDoScent = FALSE IF bScentIsHiding IF NOT IS_PED_INJURED(chopPed) IF IS_WAYPOINT_PLAYBACK_GOING_ON_FOR_PED(chopPed) bDoScent = TRUE ENDIF ENDIF ELSE bDoScent = TRUE ENDIF IF bDoScent IF bScentIsHiding INT iProgress iProgress = GET_PED_WAYPOINT_PROGRESS(chopPed) IF iProgress > iScentWaypoint REMOVE_CHOP_SCENT(FALSE) INT iStartWaypoint iStartWaypoint = iProgress + 3 INT iEndWaypoint iEndWaypoint = iProgress + 7 INT iMaxWaypoint WAYPOINT_RECORDING_GET_NUM_POINTS("hood8", iMaxWaypoint) iMaxWaypoint -= 1 VECTOR vStart VECTOR vEnd FLOAT fHeading IF iStartWaypoint <= iMaxWaypoint AND iEndWaypoint <= iMaxWaypoint WAYPOINT_RECORDING_GET_COORD("hood8", iStartWaypoint, vStart) WAYPOINT_RECORDING_GET_COORD("hood8", iEndWaypoint, vEnd) fHeading = GET_HEADING_FROM_VECTOR_2D(vEnd.x-vStart.x, vEnd.y-vStart.y) + 90 scentPTFX = START_PARTICLE_FX_LOOPED_AT_COORD("scr_franklin0_chop_trail", vStart + <<0,0,0.3>>, <<0,0,fHeading>>, 7.0) chopViewCamData.vLastPTFXPos = vStart iScentWaypoint = iStartWaypoint // PRINTSTRING("start = ") PRINTINT(iStartWaypoint) PRINTVECTOR(vStart) PRINTNL() // PRINTSTRING("end = ") PRINTINT(iEndWaypoint)PRINTVECTOR(vEnd) PRINTNL() // PRINTSTRING("heading = ") PRINTFLOAT(fHeading) PRINTNL() ELSE vStart = <<533.86, -679.24, 25.27>> vEnd = <<527.99, -678.71, 24.75>> fHeading = GET_HEADING_FROM_VECTOR_2D(vEnd.x-vStart.x, vEnd.y-vStart.y) + 90 scentPTFX = START_PARTICLE_FX_LOOPED_AT_COORD("scr_franklin0_chop_trail", vStart + <<0,0,0.3>>, <<0,0,fHeading>>, 8.0) chopViewCamData.vLastPTFXPos = vStart iScentWaypoint = iMaxWaypoint ENDIF ENDIF ELSE // draw on bad guy IF NOT bDoneChaseScent REMOVE_CHOP_SCENT(TRUE) scentPTFX = START_PARTICLE_FX_LOOPED_ON_PED_BONE("scr_franklin0_chop_trail", runnerChaseProperties.ped, <<0,0,0>>, <<0,0,270>>, BONETAG_SPINE, 5.0) bDoneChaseScent = TRUE ENDIF ENDIF ELSE REMOVE_CHOP_SCENT(FALSE) ENDIF ENDPROC PROC DO_FRANKLIN_FOLLOW_CHOP_ROUTE() INT iWaypoint WAYPOINT_RECORDING_GET_CLOSEST_WAYPOINT("hood4", GET_ENTITY_COORDS(PLAYER_PED_ID()), iWaypoint) // check to see if the waypoint is behind the player //VECTOR vWaypointOffset VECTOR vWaypointCoord VECTOR vPlayerCoord = GET_ENTITY_COORDS(PLAYER_PED_ID()) WAYPOINT_RECORDING_GET_COORD("hood4", iWaypoint, vWaypointCoord) // add a few waypoints INT iNumPoints WAYPOINT_RECORDING_GET_NUM_POINTS("hood4", iNumPoints) //PRINTSTRING("iWaypoint orig = ") printint(iWaypoint) printnl() INT iAdjustedWaypoint iAdjustedWaypoint = iWaypoint + 5 //PRINTSTRING("iAdjustedWaypoint = ") printint(iAdjustedWaypoint) printnl() IF iAdjustedWaypoint >= iNumPoints -1 iAdjustedWaypoint = iNumPoints -1 ENDIF BOOL bDontAdjustWaypoint = FALSE // check to make sure we're not trying to get to an inaccessible place IF vWaypointCoord.z > 27.3 AND vPlayerCoord.z < 28.1 iWaypoint = 109 WAYPOINT_RECORDING_GET_COORD("hood4", iWaypoint, vWaypointCoord) bDontAdjustWaypoint = TRUE ELIF (iWaypoint >= 242 AND iWaypoint <= 248) iWaypoint = 245 bDontAdjustWaypoint = TRUE ELIF (iWaypoint >= 72 AND iWaypoint <= 79) iWaypoint = 76 bDontAdjustWaypoint = TRUE ELIF (iWaypoint >= 225 AND iWaypoint <= 231) iWaypoint = 229 bDontAdjustWaypoint = TRUE ENDIF IF NOT bDontAdjustWaypoint iWaypoint = iAdjustedWaypoint ENDIF //PRINTSTRING("iWaypoint = ") printint(iWaypoint) printnl() TASK_FOLLOW_WAYPOINT_RECORDING(PLAYER_PED_ID(), "hood4", iWaypoint, EWAYPOINT_DO_NOT_RESPOND_TO_COLLISION_EVENTS | EWAYPOINT_NAVMESH_TO_INITIAL_WAYPOINT | EWAYPOINT_NAVMESH_BACK_TO_WAYPOINT_IF_LEFT_ROUTE) ENDPROC PROC HANDLE_FRANKLIN_FOLLOW_CHOP_SEARCH(BOOL bRetask = TRUE) IF currentMissionStage = STAGE_FIND_BAD_GUY // follow player IF NOT IS_PED_INJURED(chopPed) IF NOT IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), chopPed, <<7,7,2>>)//<<2.5,2.5,2>>) //taskStatus = GET_SCRIPT_TASK_STATUS(PLAYER_PED_ID(), SCRIPT_TASK_FOLLOW_TO_OFFSET_OF_ENTITY) taskStatus = GET_SCRIPT_TASK_STATUS(PLAYER_PED_ID(), SCRIPT_TASK_GO_TO_ENTITY) IF taskStatus = FINISHED_TASK IF bRetask TASK_GO_TO_ENTITY(PLAYER_PED_ID(), chopPed, DEFAULT_TIME_NEVER_WARP, 6.5) ENDIF //TASK_FOLLOW_TO_OFFSET_OF_ENTITY(PLAYER_PED_ID(), chopPed, <<0,-5.6,0>>, PEDMOVE_RUN) //SET_PED_MIN_MOVE_BLEND_RATIO(PLAYER_PED_ID(), PEDMOVE_RUN) ELIF taskStatus = PERFORMING_TASK IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), chopPed, <<12,12,12>>, FALSE, FALSE) OR ((chopViewCamData.state = CHOP_VIEW_CAM_TO_CHOP OR chopViewCamData.state = CHOP_VIEW_CAM_TO_PLAYER) AND NOT bRunningWhenTriggeredChopCam) SET_PED_MAX_MOVE_BLEND_RATIO(PLAYER_PED_ID(), PEDMOVE_WALK) ELSE SET_PED_MAX_MOVE_BLEND_RATIO(PLAYER_PED_ID(), PEDMOVE_RUN) ENDIF ENDIF ELSE IF bRetask IF GET_SCRIPT_TASK_STATUS(chopPed, SCRIPT_TASK_TURN_PED_TO_FACE_ENTITY) = FINISHED_TASK TASK_TURN_PED_TO_FACE_ENTITY(PLAYER_PED_ID(), chopPed) ENDIF ENDIF ENDIF ENDIF ENDIF ENDPROC FUNC BOOL IS_FRANKLIN_AT_FENCE() IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<494.57, -516.88, 25.56>>, <<11,11,11>>, FALSE, FALSE) RETURN TRUE ENDIF RETURN FALSE ENDFUNC // handle chop view cam PROC HANDLE_CHOP_VIEW_CAM() UPDATE_SELECTOR_HUD(sSelectorPeds, chopViewCamData.state <> CHOP_VIEW_CAM_ON_CHOP) HANDLE_CHOP_CAM_AUDIO(chopViewCamData) HANDLE_CHOP_CAM_HIDOF(chopViewCamData) SWITCH chopViewCamData.state CASE CHOP_VIEW_CAM_DISABLED IF chopViewCamData.bClearPendingTask IF GET_SCRIPT_TASK_STATUS(PLAYER_PED_ID(), SCRIPT_TASK_FOLLOW_TO_OFFSET_OF_ENTITY) <> FINISHED_TASK OR GET_SCRIPT_TASK_STATUS(PLAYER_PED_ID(), SCRIPT_TASK_FOLLOW_WAYPOINT_ROUTE) <> FINISHED_TASK OR GET_SCRIPT_TASK_STATUS(PLAYER_PED_ID(), SCRIPT_TASK_TURN_PED_TO_FACE_ENTITY) <> FINISHED_TASK OR GET_SCRIPT_TASK_STATUS(PLAYER_PED_ID(), SCRIPT_TASK_GO_TO_ENTITY) <> FINISHED_TASK IF GET_SCRIPT_TASK_STATUS(PLAYER_PED_ID(), SCRIPT_TASK_FOLLOW_TO_OFFSET_OF_ENTITY) <> WAITING_TO_START_TASK AND GET_SCRIPT_TASK_STATUS(PLAYER_PED_ID(), SCRIPT_TASK_FOLLOW_WAYPOINT_ROUTE) <> WAITING_TO_START_TASK AND GET_SCRIPT_TASK_STATUS(PLAYER_PED_ID(), SCRIPT_TASK_TURN_PED_TO_FACE_ENTITY) <> WAITING_TO_START_TASK AND GET_SCRIPT_TASK_STATUS(PLAYER_PED_ID(), SCRIPT_TASK_GO_TO_ENTITY) <> WAITING_TO_START_TASK CLEAR_PED_TASKS(PLAYER_PED_ID()) chopViewCamData.bClearPendingTask = FALSE ENDIF ELSE chopViewCamData.bClearPendingTask = FALSE ENDIF ENDIF IF IS_CHOP_SELECTED(chopViewCamData, sSelectorPeds) IF currentMissionStage = STAGE_FOOT_CHASE OR bGotToTrain /* FLOAT fMoveBlend FLOAT fOffset IF currentMissionStage = STAGE_FOOT_CHASE fMoveBlend = PEDMOVE_SPRINT fOffset = -5 ELSE fMoveBlend = PEDMOVE_RUN fOffset = -2 ENDIF */ IF currentMissionStage = STAGE_FOOT_CHASE IF bSmashedFence OR NOT IS_FRANKLIN_AT_FENCE() DO_FRANKLIN_FOLLOW_CHOP_ROUTE() ENDIF ELSE //TASK_FOLLOW_TO_OFFSET_OF_ENTITY(PLAYER_PED_ID(), chopPed, <<0,fOffset,0>>, fMoveBlend) ENDIF ENDIF IF IS_PED_RUNNING(PLAYER_PED_ID()) OR IS_PED_SPRINTING(PLAYER_PED_ID()) bRunningWhenTriggeredChopCam = TRUE ELSE bRunningWhenTriggeredChopCam = FALSE ENDIF bEnabledCamOnMediumSwitch = FALSE SET_CHOP_VIEW_CAM_TO_CHOP(chopViewCamData, TRUE, TRUE, FALSE, FALSE, 2000, TRUE, TRUE, SWITCH_TYPE_SHORT) //SET_CHOP_VIEW_CAM_ON_CHOP(chopViewCamData, sSelectorPeds) SET_CHOP_SELECT_HINT(chopViewCamData, sSelectorPeds, FALSE) INFORM_MISSION_STATS_OF_INCREMENT(FRA0_SWITCHES) //CREATE_CHOP_SWITCH_CAM(CHOP_VIEW_CAM_TO_CHOP) IF currentMissionStage = STAGE_FOOT_CHASE IF NOT bDoneChopCamCue bDoneChopCamCue = TRIGGER_MUSIC_EVENT("FRA0_SWITCH_1") ENDIF ENDIF ENDIF BREAK CASE CHOP_VIEW_CAM_ON_CHOP SET_GAMEPLAY_CAM_RELATIVE_HEADING() SET_GAMEPLAY_CAM_RELATIVE_PITCH() IF sSelectorPeds.eNewSelectorPed = SELECTOR_PED_FRANKLIN INFORM_MISSION_STATS_SYSTEM_OF_TIME_WINDOW_CLOSED() INFORM_MISSION_STATS_OF_INCREMENT(FRA0_SWITCHES) bRunningWhenTriggeredChopCam = FALSE bDisabledCamOnMediumSwitch = FALSE SET_CHOP_VIEW_CAM_TO_PLAYER(chopViewCamData, sSelectorPeds, TRUE, TRUE, TRUE, TRUE, SWITCH_TYPE_SHORT) //CREATE_CHOP_SWITCH_CAM(CHOP_VIEW_CAM_TO_PLAYER) ELSE // handle speed IF currentMissionStage = STAGE_FOOT_CHASE IF IS_WAYPOINT_PLAYBACK_GOING_ON_FOR_PED(PLAYER_PED_ID()) WAYPOINT_PLAYBACK_OVERRIDE_SPEED(PLAYER_PED_ID(), PEDMOVE_SPRINT) VECTOR vOffset VECTOR vPlayerPos vPlayerPos = GET_ENTITY_COORDS(PLAYER_PED_ID()) vOffset = GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(chopPed, vPlayerPos) IF vOffset.y < -20 SET_PED_MOVE_RATE_OVERRIDE(PLAYER_PED_ID(), 1.15) ENDIF INT iProgress VECTOR vProgressCoord iProgress = GET_PED_WAYPOINT_PROGRESS(PLAYER_PED_ID()) WAYPOINT_RECORDING_GET_COORD("hood4", iProgress, vProgressCoord) IF vProgressCoord.z > vPlayerPos.z + 3 OR (iProgress < 100 AND vPlayerPos.y > -560.8) OR (iProgress < 106 AND vPlayerPos.y > -554.1) DO_FRANKLIN_FOLLOW_CHOP_ROUTE() ENDIF ELSE DO_FRANKLIN_FOLLOW_CHOP_ROUTE() ENDIF ENDIF HANDLE_FRANKLIN_FOLLOW_CHOP_SEARCH() ENDIF // stop player if close to fence IF NOT bSmashedFence IF GET_SCRIPT_TASK_STATUS(PLAYER_PED_ID(), SCRIPT_TASK_FOLLOW_WAYPOINT_ROUTE) <> FINISHED_TASK IF IS_FRANKLIN_AT_FENCE() CLEAR_PED_TASKS(PLAYER_PED_ID()) ENDIF ENDIF ENDIF BREAK CASE CHOP_VIEW_CAM_TO_PLAYER //IF NOT IS_CAM_INTERPOLATING(chopSwitchCam) HANDLE_FRANKLIN_FOLLOW_CHOP_SEARCH(false) FAKE_SELECTOR_IS_PLAYER(chopViewCamData, sselectorPeds, FALSE) IF NOT bDisabledCamOnMediumSwitch IF IS_PLAYER_SWITCH_IN_PROGRESS() IF GET_PLAYER_SWITCH_TYPE() = SWITCH_TYPE_MEDIUM IF GET_PLAYER_SWITCH_STATE() >= SWITCH_STATE_PAN COMMON_DISABLE_CHOP_VIEW_CAM(chopViewCamData, sSelectorPeds) RENDER_SCRIPT_CAMS(FALSE, FALSE) bDisabledCamOnMediumSwitch = TRUE ENDIF ENDIF ENDIF ENDIF IF NOT IS_PLAYER_SWITCH_IN_PROGRESS() SET_CHOP_VIEW_CAM_DISABLED(chopViewCamData, sSelectorPeds, TRUE, TRUE, TRUE, TRUE, FALSE, 1500) CLEAR_CONTROL_LIGHT_EFFECT(PLAYER_CONTROL) STOP_HOOD_AUDIO_SCENE(HOOD_AUDIO_SCENE_CHOP_CAM) INFORM_MISSION_STATS_SYSTEM_OF_TIME_WINDOW_CLOSED() ENDIF //ELSE // SET_CAM_COORD(splineCam[iNumberSplineCams-1], GET_GAMEPLAY_CAM_COORD()) // SET_CAM_ROT(splineCam[iNumberSplineCams-1], GET_GAMEPLAY_CAM_ROT()) // SET_CAM_FOV(splineCam[iNumberSplineCams-1], GET_GAMEPLAY_CAM_FOV()) //ENDIF BREAK CASE CHOP_VIEW_CAM_TO_CHOP //IF GET_SCRIPT_TASK_STATUS(PLAYER_PED_ID(), SCRIPT_TASK_FOLLOW_WAYPOINT_ROUTE) <> FINISHED_TASK //OR GET_SCRIPT_TASK_STATUS(PLAYER_PED_ID(), SCRIPT_TASK_FOLLOW_TO_OFFSET_OF_ENTITY) <> FINISHED_TASK //SET_PED_MIN_MOVE_BLEND_RATIO(PLAYER_PED_ID(), PEDMOVE_RUN) //ENDIF FAKE_SELECTOR_IS_PLAYER(chopViewCamData, sselectorPeds, TRUE) HANDLE_FRANKLIN_FOLLOW_CHOP_SEARCH() //IF NOT IS_CAM_INTERPOLATING(chopSwitchCam) IF NOT IS_PLAYER_SWITCH_IN_PROGRESS() INFORM_MISSION_STATS_SYSTEM_OF_TIME_WINDOW_OPEN(FRA0_DOGCAM) SET_CHOP_VIEW_CAM_ON_CHOP(chopViewCamData, sSelectorPeds) START_HOOD_AUDIO_SCENE(HOOD_AUDIO_SCENE_CHOP_CAM) INT r,g,b,a get_hud_colour(HUD_COLOUR_CONTROLLER_CHOP, r, g, b, a) SET_CONTROL_LIGHT_EFFECT_COLOR(PLAYER_CONTROL, r, g, b) ELSE IF NOT bEnabledCamOnMediumSwitch IF GET_PLAYER_SWITCH_TYPE() = SWITCH_TYPE_MEDIUM IF GET_PLAYER_SWITCH_STATE() >= SWITCH_STATE_PAN SET_CAM_ACTIVE(chopViewCamData.chopCam, TRUE) // prevent chop speaking IF NOT IS_PED_INJURED(chopViewCamData.chopPed) SET_ENTITY_VISIBLE(chopViewCamData.chopPed, FALSE) STOP_PED_SPEAKING(chopViewCamData.chopPed, TRUE) ENDIF RENDER_SCRIPT_CAMS(TRUE, FALSE) bEnabledCamOnMediumSwitch = TRUE ENDIF ENDIF ENDIF ENDIF //ELSE // SET_CAM_COORD(splineCam[iNumberSplineCams-1], GET_CAM_COORD(chopViewCamData.chopCam)) /// SET_CAM_ROT(splineCam[iNumberSplineCams-1], GET_CAM_ROT(chopViewCamData.chopCam)) // SET_CAM_FOV(splineCam[iNumberSplineCams-1], GET_CAM_FOV(chopViewCamData.chopCam)) //ENDIF BREAK ENDSWITCH IF chopViewCamData.state <> CHOP_VIEW_CAM_DISABLED IF IS_THIS_PRINT_BEING_DISPLAYED("FC_GOCHOP") OR IS_THIS_PRINT_BEING_DISPLAYED("FC_CLOSER") //OR IS_THIS_PRINT_BEING_DISPLAYED("FC_GOTRAIN") OR IS_THIS_PRINT_BEING_DISPLAYED("FC_GOBOX") REMOVE_MISSION_TEXT(FALSE, TRUE, FALSE) ENDIF /* IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("FC_RUNHLP1") IF GET_GAME_TIMER() >= iClearHelpTime + 500 CLEAR_HELP(FALSE) iClearHelpTime = GET_GAME_TIMER() ENDIF ENDIF */ ENDIF IF chopViewCamData.state <> CHOP_VIEW_CAM_ON_CHOP //IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("FC_FENHLP") IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("FC_SWFHLP1") OR IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("FC_SWFHLP2") IF GET_GAME_TIMER() >= iClearHelpTime + 1000 CLEAR_HELP(FALSE) iClearHelpTime = GET_GAME_TIMER() ENDIF ENDIF ENDIF ENDPROC // ensure he doesn't shoot off halfway through turning FUNC BOOL CAN_CHOP_TRANSITION_BACK_FROM_WAIT(BOOL bAllowBreakoutWhileTurned = FALSE) BOOL bReturn bReturn = FALSE IF IS_ENTITY_PLAYING_ANIM(chopPed, GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_SHARED), "FRA0_IG_12_CHOP_WAITING_B") FLOAT fPhase fPhase = GET_ENTITY_ANIM_CURRENT_TIME(chopPed, GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_SHARED), "FRA0_IG_12_CHOP_WAITING_B") IF fPhase <= CHOP_TURN_MIN_PHASE OR fPhase >= CHOP_TURN_MAX_PHASE bReturn = TRUE ENDIF IF bAllowBreakoutWhileTurned IF fPhase >= 0.408 AND fPhase <= 0.650 bReturn = TRUE ENDIF ENDIF ELIF IS_ENTITY_PLAYING_ANIM(chopPed, GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_SHARED), "FRA0_IG_12_CHOP_WAITING_A") TASK_PLAY_ANIM(chopChaseProperties.ped, GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_SHARED), "FRA0_IG_12_CHOP_FAST_TURN_B", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_HOLD_LAST_FRAME) // "FRA0_IG_12_CHOP_RUN_STOP_TURN" ELIF IS_ENTITY_PLAYING_ANIM(chopPed, GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_SHARED), "FRA0_IG_12_CHOP_FAST_TURN_B") IF GET_ENTITY_ANIM_CURRENT_TIME(chopPed, GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_SHARED), "FRA0_IG_12_CHOP_FAST_TURN_B") >= 0.98 bReturn = TRUE ENDIF ELSE bReturn = TRUE ENDIF RETURN bReturn ENDFUNC // set stage of chop behaviour setpiece PROC SET_CHOP_BEHAVIOUR_SETPIECE_STAGE(CHOP_BEHAVIOUR_SETPIECE_STAGE_ENUM newStage) IF NOT IS_PED_INJURED(chopPed) SWITCH newStage CASE CBS_SPOT_COLLIE TASK_PLAY_ANIM(chopPed, GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_FIND), "FRA_0_IG_15_CHOP_SPOTS_DOG", NORMAL_BLEND_IN, NORMAL_BLEND_OUT) bShownBoxcarPrompt = TRUE bDoneChopSniffSFX = FALSE BREAK CASE CBS_WAIT_FOR_FRANKLIN TASK_PLAY_ANIM(chopPed, GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_SHARED), "FRA0_IG_12_CHOP_WAITING_B", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING) BREAK CASE CBS_GO_TO_COLLIE IF NOT IS_PED_INJURED(colliePed) CLEAR_SEQUENCE_TASK(sequence) OPEN_SEQUENCE_TASK(sequence) vHumpEntry = <<502.91777, -648.68180, 23.75121>>// TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<506.25156, -650.00487, 23.75121>>, PEDMOVE_SPRINT, DEFAULT_TIME_BEFORE_WARP, 10.0, ENAV_DEFAULT, 69.6) TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<506.25156, -650.00487, 23.75121>>, PEDMOVE_RUN, DEFAULT_TIME_BEFORE_WARP, 1.1, ENAV_DEFAULT, 69.6) TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, vHumpEntry, PEDMOVE_WALK, DEFAULT_TIME_BEFORE_WARP, 0.08, ENAV_DEFAULT, 71.1) //TASK_PED_SLIDE_TO_COORD(NULL, GET_HOOD_VECTOR(HVEC_CHOP_HUMP_ENTRY), GET_ENTITY_HEADING(colliePed)) CLOSE_SEQUENCE_TASK(sequence) TASK_PERFORM_SEQUENCE(chopPed, sequence) //SET_PED_MIN_MOVE_BLEND_RATIO(chopPed, PEDMOVEBLENDRATIO_SPRINT) ENDIF BREAK CASE CBS_HUMP_AWAY //SET_CHOP_VIEW_CAM_THIRD_PERSON(chopViewCamData) SET_NEXT_RANDOM_SPEECH_TIME(8000) iStartHumpTime = GET_GAME_TIMER() BREAK CASE CBS_OBEY IF IS_THIS_PRINT_BEING_DISPLAYED("FC_CLOSER") REMOVE_MISSION_TEXT(FALSE, TRUE, FALSE) ENDIF INFORM_MISSION_STATS_SYSTEM_OF_TIME_WINDOW_CLOSED() BREAK CASE CBS_RETURN iChopBehaviourHelpTime = GET_GAME_TIMER() INFORM_MISSION_STATS_SYSTEM_OF_TIME_WINDOW_CLOSED() //SET_CHOP_VIEW_CAM_FIRST_PERSON(chopViewCamData) IF NOT IS_PED_INJURED(colliePed) IF chopBehaviourSetpieceStage >= CBS_HUMP_AWAY //TASK_WANDER_STANDARD(colliePed) TASK_SMART_FLEE_PED(colliePed, PLAYER_PED_ID(), 1000, -1) ENDIF ENDIF SET_PED_CAN_RAGDOLL(chopPed, TRUE) SET_PED_CAN_RAGDOLL_FROM_PLAYER_IMPACT(chopPed, TRUE) CLEAR_SEQUENCE_TASK(sequence) OPEN_SEQUENCE_TASK(sequence) TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<519.48, -657.47, 23.79>>, PEDMOVE_SPRINT, DEFAULT_TIME_BEFORE_WARP, 2.0) TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, GET_HOOD_VECTOR(HVEC_CHOP_BEHAVIOUR_SETPIECE_TERMINATE), PEDMOVE_SPRINT, DEFAULT_TIME_BEFORE_WARP, 1.0) CLOSE_SEQUENCE_TASK(sequence) TASK_PERFORM_SEQUENCE(chopPed, sequence) BREAK CASE CBS_DONE bDoneChopSniffSFX = FALSE BREAK ENDSWITCH iChopBehaviourStageTime = GET_GAME_TIMER() chopBehaviourSetpieceStage = newStage ENDIF ENDPROC // should we be able to call chop back? FUNC BOOL CAN_CALL_CHOP_BACK() IF NOT IS_PED_INJURED(chopPed) IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), chopPed, <<15,15,8>>) OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<514.064, -674.668, 23.392>>, <<521.808, -612.832, 28.734>>, 45.0) RETURN TRUE ENDIF ENDIF RETURN FALSE ENDFUNC // call chop back PROC HANDLE_CALL_CHOP_BACK() IF GET_GAME_TIMER() <= iDidCallbackAnimTime + 4100 DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SPRINT) ENDIF SWITCH callChopBackState CASE CALL_CHOP_BACK_STATE_NOT_STARTED IF CAN_CALL_CHOP_BACK() IF IS_CONTROL_JUST_PRESSED(PLAYER_CONTROL, INPUT_CONTEXT) AND NOT IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_SELECT_WEAPON) IF GET_GAME_TIMER() >= iLastCallSpeechTime + 5000 SWITCH chopBehaviour CASE CHOP_BEHAVIOUR_BAD bCallChopBackSuccess = FALSE BREAK CASE CHOP_BEHAVIOUR_MEDIUM IF chopBehaviourSetpieceStage >= CBS_HUMP_AWAY bCallChopBackSuccess = TRUE ELSE bCallChopBackSuccess = FALSE ENDIF BREAK CASE CHOP_BEHAVIOUR_GOOD bCallChopBackSuccess = TRUE BREAK ENDSWITCH WEAPON_TYPE weapon GET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), weapon) IF IS_PED_FACING_PED(PLAYER_PED_ID(), chopPed, 40) AND NOT IS_PED_RUNNING(PLAYER_PED_ID()) AND NOT IS_PED_SPRINTING(PLAYER_PED_ID()) AND NOT IS_PED_WALKING(PLAYER_PED_ID()) AND IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), chopPed, <<20,20,2>>) AND weapon = WEAPONTYPE_UNARMED VECTOR vOffset vOffset = GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(PLAYER_PED_ID(), GET_ENTITY_COORDS(chopPed)) STRING sAnim IF vOffset.x > 0 sAnim = "Call_Chop_R" ELSE sAnim = "Call_Chop_L" ENDIF TASK_PLAY_ANIM(PLAYER_PED_ID(), GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_FIND), sAnim, NORMAL_BLEND_IN, SLOW_BLEND_OUT, -1, AF_UPPERBODY|AF_SECONDARY) iDidCallbackAnimTime = GET_GAME_TIMER() ENDIF bDoneWhistleSound = FALSE callChopBackState = CALL_CHOP_BACK_STATE_QUEUED ENDIF ENDIF ENDIF BREAK CASE CALL_CHOP_BACK_STATE_QUEUED IF NOT bDoneWhistleSound BOOL bDoWhistle bDoWhistle = FALSE BOOL bPlayingAnim bPlayingAnim = FALSE IF IS_ENTITY_PLAYING_ANIM(PLAYER_PED_ID(), GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_FIND), "Call_Chop_R") OR IS_ENTITY_PLAYING_ANIM(PLAYER_PED_ID(), GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_FIND), "Call_Chop_L") bPlayingAnim = TRUE ENDIF IF bPlayingAnim IF GET_GAME_TIMER() >= iDidCallbackAnimTime + 600 bDoWhistle = TRUE ENDIF ELSE bDoWhistle = TRUE ENDIF IF bDoWhistle KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() PLAY_SOUND_FROM_ENTITY(iWhistleSoundID, "Franklin_Whistle_For_Chop", PLAYER_PED_ID(), "SPEECH_RELATED_SOUNDS") bDoneWhistleSound = TRUE ENDIF ENDIF IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() AND HAS_SOUND_FINISHED(iWhistleSoundID) AND bDoneWhistleSound IF chopHumpState >= CHOP_HUMP_STATE_LOOPING IF DO_MISSION_SPEECH("FC_HUMP") iNextRandomSpeechTime = GET_GAME_TIMER() + 5000 ENDIF ELSE DO_MISSION_SPEECH("FC_WHISTLE") ENDIF IF bCallChopBackSuccess REPLAY_RECORD_BACK_FOR_TIME(8.0, 3.0, REPLAY_IMPORTANCE_HIGHEST) callChopBackState = CALL_CHOP_BACK_STATE_SUCCESS ELSE callChopBackState = CALL_CHOP_BACK_STATE_NOT_STARTED ENDIF iLastCallSpeechTime = GET_GAME_TIMER() ENDIF BREAK CASE CALL_CHOP_BACK_STATE_SUCCESS IF GET_GAME_TIMER() >= iLastCallSpeechTime + 800 IF chopBehaviourSetpieceStage < CBS_HUMP_AWAY SET_CHOP_BEHAVIOUR_SETPIECE_STAGE(CBS_RETURN) ELSE SET_CHOP_BEHAVIOUR_SETPIECE_STAGE(CBS_OBEY) ENDIF bShouldCommentOnBehaviour = TRUE ENDIF BREAK ENDSWITCH ENDPROC PROC DO_GET_BACK_ON_SPEECH() IF NOT bDoneGetBackOnSpeech IF IS_ENTITY_AT_COORD(chopPed, GET_HOOD_VECTOR(HVEC_CHOP_BEHAVIOUR_SETPIECE_TERMINATE), <<28,28,LOCATE_SIZE_HEIGHT>>, FALSE, FALSE) IF DO_MISSION_SPEECH("FC_BACKON") bDoneGetBackOnSpeech = TRUE ENDIF ENDIF ENDIF ENDPROC // do the setpiece where chop shows off behaviour PROC HANDLE_CHOP_BEHAVIOUR_SETPIECE() //printstring("pos = ") printvector(get_entity_coords(chopped)) printnl() //printstring("rot = ") printfloat(get_entity_heading(chopped)) printnl() IF NOT IS_PED_INJURED(chopPed) // handle the anims IF NOT IS_PED_INJURED(colliePed) SWITCH chopHumpState CASE CHOP_HUMP_STATE_NOT_STARTED IF chopBehaviourSetpieceStage = CBS_HUMP_AWAY //vHumpPos = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(colliePed, <<0.0, -1.049, -0.45>>) //fHumpRot = GET_ENTITY_HEADING(colliePed) + 12.8 vHumpPos = GET_ENTITY_COORDS(colliePed) + <<0,0,-0.435374>> fHumpRot = GET_ENTITY_HEADING(colliePed) chopChaseProperties.vAnimPos = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(chopPed, <<0.129763, 2.11939,-0.435374>>) chopChaseProperties.vAnimRot = GET_ENTITY_ROTATION(chopPed) + <<0,0, 16.033447>> chopChaseProperties.iSyncScene = CREATE_SYNCHRONIZED_SCENE(chopChaseProperties.vAnimPos, chopChaseProperties.vAnimRot) iCollieSyncScene = CREATE_SYNCHRONIZED_SCENE(vHumpPos, <<0,0,fHumpRot>>) SET_PED_CAN_RAGDOLL(chopPed, FALSE) TASK_SYNCHRONIZED_SCENE(chopPed, chopChaseProperties.iSyncScene, GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_FIND), "Hump_enter_chop", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, SYNCED_SCENE_USE_PHYSICS | SYNCED_SCENE_DONT_INTERRUPT) TASK_SYNCHRONIZED_SCENE(colliePed, iCollieSyncScene, GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_FIND), "Hump_enter_ladydog", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, SYNCED_SCENE_USE_PHYSICS | SYNCED_SCENE_DONT_INTERRUPT) SET_SYNCHRONIZED_SCENE_LOOPED(chopChaseProperties.iSyncScene, FALSE) SET_SYNCHRONIZED_SCENE_LOOPED(iCollieSyncScene, FALSE) chopHumpState = CHOP_HUMP_STATE_ENTERING ENDIF BREAK CASE CHOP_HUMP_STATE_ENTERING //PRINTSTRING("chop pos = ") PRINTVECTOR(GET_ENTITY_COORDS(chopPed)) PRINTNL() //PRINTSTRING("collie pos = ") PRINTVECTOR(GET_ENTITY_COORDS(colliePed)) PRINTNL() //PRINTSTRING("chop rot = ") PRINTVECTOR(GET_ENTITY_ROTATION(colliePed)) PRINTNL() //PRINTSTRING("collie rot = ") PRINTVECTOR(GET_ENTITY_ROTATION(colliePed)) PRINTNL() IF NOT bDoneMountCue bDoneMountCue = TRIGGER_MUSIC_EVENT("FRA0_MOUNT") ENDIF IF GET_SYNCHRONIZED_SCENE_PHASE(chopChaseProperties.iSyncScene) >= 0.98 PLAY_CHOP_AUDIO_CONTEXT(CHOP_AUDIO_CONTEXT_PLAYFUL) chopChaseProperties.iSyncScene = CREATE_SYNCHRONIZED_SCENE(vHumpPos, <<0,0,fHumpRot>>) TASK_SYNCHRONIZED_SCENE(chopPed, chopChaseProperties.iSyncScene, GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_FIND), "Hump_loop_chop", SLOW_BLEND_IN, NORMAL_BLEND_OUT, SYNCED_SCENE_USE_PHYSICS | SYNCED_SCENE_DONT_INTERRUPT) TASK_SYNCHRONIZED_SCENE(colliePed, chopChaseProperties.iSyncScene, GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_FIND), "Hump_loop_ladydog", SLOW_BLEND_IN, NORMAL_BLEND_OUT, SYNCED_SCENE_USE_PHYSICS | SYNCED_SCENE_DONT_INTERRUPT) SET_SYNCHRONIZED_SCENE_LOOPED(chopChaseProperties.iSyncScene, TRUE) INFORM_MISSION_STATS_SYSTEM_OF_TIME_WINDOW_OPEN(FRA0_DOGGY_STYLE) chopHumpState = CHOP_HUMP_STATE_LOOPING ELSE IF GET_SYNCHRONIZED_SCENE_PHASE(chopChaseProperties.iSyncScene) >= 0.69 // slide chop SHIFT_VECTOR_TO_IDEAL_VECTOR(chopChaseProperties.vAnimPos, vHumpPos, 0.1)///5)///5) SHIFT_VECTOR_TO_IDEAL_VECTOR(chopChaseProperties.vAnimRot, <<0,0,fHumpRot>>, 5) SET_SYNCHRONIZED_SCENE_ORIGIN(chopChaseProperties.iSyncScene, chopChaseProperties.vAnimPos, chopChaseProperties.vAnimRot) ENDIF ENDIF BREAK CASE CHOP_HUMP_STATE_LOOPING DO_CHOP_AUDIO(CHOP_AUDIO_STATE_HUMPING) IF chopBehaviourSetpieceStage = CBS_OBEY PLAY_CHOP_AUDIO_CONTEXT(CHOP_AUDIO_CONTEXT_WHINE_STOP) chopChaseProperties.iSyncScene = CREATE_SYNCHRONIZED_SCENE(vHumpPos, <<0,0,fHumpRot>>) TASK_SYNCHRONIZED_SCENE(chopPed, chopChaseProperties.iSyncScene, GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_FIND), "Hump_exit_chop", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, SYNCED_SCENE_USE_PHYSICS | SYNCED_SCENE_DONT_INTERRUPT) TASK_SYNCHRONIZED_SCENE(colliePed, chopChaseProperties.iSyncScene, GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_FIND), "Hump_exit_ladydog", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, SYNCED_SCENE_USE_PHYSICS | SYNCED_SCENE_DONT_INTERRUPT) SET_SYNCHRONIZED_SCENE_LOOPED(chopChaseProperties.iSyncScene, FALSE) IF NOT bDoneDismountCue bDoneDismountCue = TRIGGER_MUSIC_EVENT("FRA0_DISMOUNT") ENDIF chopHumpState = CHOP_HUMP_STATE_EXITING ENDIF BREAK CASE CHOP_HUMP_STATE_EXITING IF GET_SYNCHRONIZED_SCENE_PHASE(chopChaseProperties.iSyncScene) >= 0.98 SET_PED_CAN_RAGDOLL(chopPed, TRUE) chopHumpState = CHOP_HUMP_STATE_DONE ENDIF BREAK ENDSWITCH ENDIF SWITCH chopBehaviourSetpieceStage CASE CBS_NOT_STARTED IF IS_ENTITY_AT_COORD(chopPed, GET_HOOD_VECTOR(HVEC_CHOP_BEHAVIOUR_SETPIECE_LAUNCH), <<1.5, 1.5, LOCATE_SIZE_HEIGHT>>) //IF chopBehaviour = CHOP_BEHAVIOUR_GOOD IF IS_PED_INJURED(colliePed) SET_CHOP_BEHAVIOUR_SETPIECE_STAGE(CBS_DONE) ELSE SET_CHOP_BEHAVIOUR_SETPIECE_STAGE(CBS_WAIT_FOR_FRANKLIN) ENDIF ENDIF BREAK CASE CBS_WAIT_FOR_FRANKLIN IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), chopPed, <<8,8,8>>) IF CAN_CHOP_TRANSITION_BACK_FROM_WAIT() SET_CHOP_BEHAVIOUR_SETPIECE_STAGE(CBS_SPOT_COLLIE) ENDIF ENDIF BREAK CASE CBS_SPOT_COLLIE IF IS_PED_INJURED(colliePed) SET_CHOP_BEHAVIOUR_SETPIECE_STAGE(CBS_RETURN) ELSE IF NOT IS_ENTITY_PLAYING_ANIM(chopPed, GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_FIND), "FRA_0_IG_15_CHOP_SPOTS_DOG") SET_CHOP_BEHAVIOUR_SETPIECE_STAGE(CBS_GO_TO_COLLIE) ELSE FLOAT fLookPhase fLookPhase = GET_ENTITY_ANIM_CURRENT_TIME(chopPed, GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_FIND), "FRA_0_IG_15_CHOP_SPOTS_DOG") IF NOT bDoneChopSniffSFX IF fLookPhase >= 0.3 PLAY_CHOP_AUDIO_CONTEXT(CHOP_AUDIO_CONTEXT_SNIFF) bDoneChopSniffSFX = TRUE ENDIF ENDIF IF fLookPhase >= 0.8 SET_CHOP_BEHAVIOUR_SETPIECE_STAGE(CBS_GO_TO_COLLIE) ENDIF ENDIF ENDIF BREAK CASE CBS_GO_TO_COLLIE IF NOT bDoneGoToCollieCue bDoneGoToCollieCue = TRIGGER_MUSIC_EVENT("FRA0_BOY") ENDIF IF IS_PED_INJURED(colliePed) SET_CHOP_BEHAVIOUR_SETPIECE_STAGE(CBS_RETURN) ELSE IF GET_GAME_TIMER() <= iChopBehaviourStageTime + 1500 //SET_PED_MIN_MOVE_BLEND_RATIO(chopPed, PEDMOVEBLENDRATIO_RUN) ENDIF IF IS_ENTITY_AT_COORD(chopPed, vHumpEntry, <<0.5, 0.5, LOCATE_SIZE_HEIGHT>>) SET_CHOP_BEHAVIOUR_SETPIECE_STAGE(CBS_HUMP_AWAY) ELSE IF IS_ENTITY_AT_COORD(chopPed, vHumpEntry, <<6, 6, LOCATE_SIZE_HEIGHT>>, FALSE, FALSE) SET_PED_RESET_FLAG(chopPed, PRF_UseKinematicPhysics, TRUE) SET_PED_CAN_RAGDOLL_FROM_PLAYER_IMPACT(chopPed, FALSE) ENDIF ENDIF ENDIF IF NOT bDoneWhereGoingSpeech DO_CHOP_AUDIO(CHOP_AUDIO_STATE_RUNNING_TO_HUMP) IF GET_GAME_TIMER() >= iChopBehaviourStageTime + 2000 AND NOT bCallChopBackSuccess bDoneWhereGoingSpeech = DO_MISSION_SPEECH("FC_WHEREGO") ENDIF ELSE IF NOT bDoneNoChopSpeech IF GET_GAME_TIMER() >= iChopBehaviourStageTime + 5000 IF NOT IS_PED_INJURED(colliePed) IF IS_ENTITY_ON_SCREEN(colliePed) IF NOT bCallChopBackSuccess bDoneNoChopSpeech = DO_MISSION_SPEECH("FC_SEEDOG") ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF IF bShownCallChopHelp IF CAN_ADVANCE_MISSION() HANDLE_CALL_CHOP_BACK() ENDIF ENDIF BREAK CASE CBS_HUMP_AWAY IF NOT bCallChopBackSuccess IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), chopPed, <<15,15,2>>) IF NOT bDoneItsADudeSpeech IF GET_GAME_TIMER() >= iNextRandomSpeechTime IF DO_MISSION_SPEECH("FKN0_MALE") iNextRandomSpeechTime = GET_GAME_TIMER() + 9000 bDoneItsADudeSpeech = TRUE ENDIF ENDIF ELSE DO_RANDOM_SPEECH("FKN0_WHUMP", -1, 7000, 11000) ENDIF ENDIF ENDIF IF IS_PED_INJURED(colliePed) SET_CHOP_BEHAVIOUR_SETPIECE_STAGE(CBS_RETURN) ELSE VECTOR vChopPos vChopPos = GET_ENTITY_COORDS(chopPed) IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(colliePed, PLAYER_PED_ID()) OR HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(chopPed, PLAYER_PED_ID()) OR IS_PED_SHOOTING_IN_AREA(PLAYER_PED_ID(), vChopPos - <<8,8,8>>, vChopPos + <<8,8,8>>, FALSE) OR IS_BULLET_IN_AREA(vChopPos, 3.0) OR IS_SNIPER_BULLET_IN_AREA(vChopPos - <<3,3,3>>, vChopPos + <<3,3,3>>) OR GET_GAME_TIMER() >= iStartHumpTime + 60000 IF chopBehaviour = CHOP_BEHAVIOUR_BAD bShouldCommentOnBehaviour = TRUE ENDIF SET_CHOP_BEHAVIOUR_SETPIECE_STAGE(CBS_OBEY) ELSE IF NOT bDoneThreatenChopSpeech IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), chopPed, <<18, 18, LOCATE_SIZE_HEIGHT>>) AND IS_PED_FACING_PED(PLAYER_PED_ID(), chopPed, 35) AND NOT IS_PED_STOPPED(PLAYER_PED_ID()) AND NOT IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), chopPed, <<11, 11, LOCATE_SIZE_HEIGHT>>) IF NOT bCallChopBackSuccess bDoneThreatenChopSpeech = DO_MISSION_SPEECH("FC_RUNOVER") ENDIF ENDIF ENDIF ENDIF ENDIF IF CAN_ADVANCE_MISSION() HANDLE_CALL_CHOP_BACK() IF chopBehaviour = CHOP_BEHAVIOUR_BAD IF NOT bDoneGoAwaySpeech IF GET_GAME_TIMER() >= iChopBehaviourStageTime + 14000 IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), chopPed, <<2,2,LOCATE_SIZE_HEIGHT>>) AND chopViewCamData.state = CHOP_VIEW_CAM_DISABLED IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) AND CAN_PLAYER_START_CUTSCENE() AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() bDoingChopPull = TRUE bRunningCutscene = TRUE ENDIF ELSE IF NOT bDoneGetClosePrompt IF chopViewCamData.state = CHOP_VIEW_CAM_DISABLED bDoneGetClosePrompt = DO_MISSION_GOD_TEXT("FC_CLOSER") ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF BREAK CASE CBS_OBEY IF chopHumpState = CHOP_HUMP_STATE_DONE OR IS_PED_INJURED(colliePed) SET_CHOP_BEHAVIOUR_SETPIECE_STAGE(CBS_RETURN) ENDIF BREAK CASE CBS_RETURN IF bDoneMountCue IF NOT bDoneDismountCue bDoneDismountCue = TRIGGER_MUSIC_EVENT("FRA0_DISMOUNT") ENDIF ENDIF DO_CHOP_AUDIO(CHOP_AUDIO_STATE_SEARCHING) IF NOT bDoneCommentOnBehaviourSpeech IF bShouldCommentOnBehaviour SWITCH chopBehaviour CASE CHOP_BEHAVIOUR_GOOD bDoneCommentOnBehaviourSpeech = DO_MISSION_SPEECH("FKN0_CGOOD") BREAK CASE CHOP_BEHAVIOUR_MEDIUM bDoneCommentOnBehaviourSpeech = DO_MISSION_SPEECH("FKN0_CMED") BREAK CASE CHOP_BEHAVIOUR_BAD bDoneCommentOnBehaviourSpeech = DO_MISSION_SPEECH("FKN0_CBAD") BREAK ENDSWITCH ELSE bDoneCommentOnBehaviourSpeech = TRUE ENDIF ELSE DO_GET_BACK_ON_SPEECH() ENDIF IF IS_ENTITY_AT_COORD(chopPed, GET_HOOD_VECTOR(HVEC_CHOP_BEHAVIOUR_SETPIECE_TERMINATE), <<4,4,LOCATE_SIZE_HEIGHT>>) SET_CHOP_BEHAVIOUR_SETPIECE_STAGE(CBS_DONE) SET_NEXT_RANDOM_SPEECH_TIME(3000) chopSniffState = CHOP_SNIFF_STATE_NOT_STARTED iNextChopSniffTime = GET_GAME_TIMER() + 1000 iNextChopSoundTime = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(1000, 3000) TASK_FOLLOW_WAYPOINT_RECORDING(chopPed, "hood8", 43, EWAYPOINT_NAVMESH_TO_INITIAL_WAYPOINT | EWAYPOINT_NAVMESH_BACK_TO_WAYPOINT_IF_LEFT_ROUTE) ENDIF BREAK CASE CBS_DONE DO_GET_BACK_ON_SPEECH() BREAK ENDSWITCH // help to download app IF NOT bShownChopBehaviourHelp IF chopBehaviourSetpieceStage >= CBS_RETURN IF NOT HAS_PLAYER_USED_CHOP_APP() AND NOT HAS_ONE_TIME_HELP_DISPLAYED(FHM_DOWNLOAD_CHOP_APP) IF iChopBehaviourHelpTime > 0 IF GET_GAME_TIMER() >= iChopBehaviourHelpTime + 1000 #IF NOT FEATURE_GEN9_STANDALONE // url:bugstar:7806385 App currently not supported in Gen9. bShownChopBehaviourHelp = DO_MISSION_HELP_TEXT("FC_APPHLP", FALSE) #ENDIF #IF FEATURE_GEN9_STANDALONE bShownChopBehaviourHelp = TRUE #ENDIF IF bShownChopBehaviourHelp SET_ONE_TIME_HELP_MESSAGE_DISPLAYED(FHM_DOWNLOAD_CHOP_APP) ENDIF ENDIF ENDIF ELSE bShownChopBehaviourHelp = TRUE ENDIF ENDIF ENDIF BOOL bDoCallBackHelp = FALSE // help to call back IF ((chopBehaviourSetpieceStage = CBS_GO_TO_COLLIE AND GET_GAME_TIMER() >= iChopBehaviourStageTime + 2700) OR chopBehaviourSetpieceStage = CBS_HUMP_AWAY) AND CAN_CALL_CHOP_BACK() IF chopViewCamData.state = CHOP_VIEW_CAM_DISABLED IF NOT bShownCallChopHelp IF NOT IS_HELP_MESSAGE_BEING_DISPLAYED() bShownCallChopHelp = TRUE iLastCallSpeechTime = 0 ENDIF ELSE IF NOT bCallChopBackSuccess bDoCallBackHelp = TRUE IF NOT IS_HELP_MESSAGE_BEING_DISPLAYED() PRINT_HELP_FOREVER("FC_CALLHLP") ENDIF ENDIF ENDIF ELIF chopViewCamData.state = CHOP_VIEW_CAM_ON_CHOP IF NOT bShownSwitchToCallHelp IF DO_MISSION_HELP_TEXT("FC_SWFHLP1", FALSE) SET_SELECTOR_PED_HINT(sSelectorPeds, SELECTOR_PED_FRANKLIN, TRUE) bShownSwitchToCallHelp = TRUE ENDIF ENDIF ENDIF ENDIF IF NOT bDoCallBackHelp IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("FC_CALLHLP") CLEAR_HELP() ENDIF ENDIF ENDIF ENDPROC // handle chop cam warps PROC HANDLE_CHOP_CAM_WARPS() INT i IF NOT IS_PED_INJURED(PLAYER_PED_ID()) AND NOT IS_PED_INJURED(chopPed) VECTOR vChopPos = GET_ENTITY_COORDS(chopPed) VECTOR vPlayerPos = GET_ENTITY_COORDS(PLAYER_PED_ID()) IF chopViewCamData.state = CHOP_VIEW_CAM_ON_CHOP REPEAT COUNT_OF(FRANKLIN_WARP_ENUM) i FRANKLIN_WARP_ENUM thisWarpEnum = INT_TO_ENUM(FRANKLIN_WARP_ENUM, i) IF NOT bFranklinWarp[thisWarpEnum] VECTOR vWarpPos FLOAT fWarpRot BOOL bCanDoWarp = FALSE SWITCH thisWarpEnum CASE FRANKLIN_WARP_TOP_FENCE // details vWarpPos = <<483.96, -583.25, 28.35>> fWarpRot = -7.2 // check IF chopStage <= CHOP_TO_FENCE IF vChopPos.x >= 481.2 AND vChopPos.y >= -579.3 AND vPlayerPos.z >= 27.5 IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), vWarpPos, <<13,13,13>>) bCanDoWarp = TRUE ENDIF ENDIF ENDIF BREAK CASE FRANKLIN_WARP_FLATBEDS // details vWarpPos = <<539.29, -501.58, 25.13>> fWarpRot = -96.4 // check IF chopStage = CHOP_TO_BOXCAR bCanDoWarp = TRUE ENDIF BREAK CASE FRANKLIN_WARP_BOXCAR // details vWarpPos = <<568.37, -506.11, 23.79>> fWarpRot = 168.9 // check IF chopStage >= CHOP_TO_TRAIN bCanDoWarp = TRUE ENDIF BREAK ENDSWITCH IF bCanDoWarp IF NOT IS_ENTITY_ON_SCREEN(PLAYER_PED_ID()) SET_ENTITY_COORDS(PLAYER_PED_ID(), vWarpPos) SET_ENTITY_HEADING(PLAYER_PED_ID(), fWarpRot) DO_FRANKLIN_FOLLOW_CHOP_ROUTE() bFranklinWarp[thisWarpEnum] = TRUE ENDIF ENDIF ENDIF ENDREPEAT ENDIF ENDIF ENDPROC // setup lamar for walk PROC SETUP_LAMAR_FOR_WALK() IF NOT IS_PED_INJURED(lamarPed) lamarBlip = CREATE_MISSION_BLIP_FOR_PED(lamarPed) SET_ENTITY_HEADING(lamarPed, LAMAR_WALK_INIT_ROT)//temp //TASK_LOOK_AT_ENTITY(lamarPed, PLAYER_PED_ID(), -1, SLF_WHILE_NOT_IN_FOV) DO_LAMAR_FOLLOW_PAVEMENT() FORCE_PED_MOTION_STATE(lamarPed,MS_ON_FOOT_WALK, FALSE, FAUS_CUTSCENE_EXIT) SET_PED_MIN_MOVE_BLEND_RATIO(lamarPed,PEDMOVE_WALK) ENDIF ENDPROC // setup player for walk PROC SETUP_PLAYER_FOR_WALK() IF NOT IS_PED_INJURED(PLAYER_PED_ID()) SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_UNARMED, TRUE) SET_PED_STEALTH_MOVEMENT(PLAYER_PED_ID(), FALSE) 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 //TASK_GO_STRAIGHT_TO_COORD(PLAYER_PED_ID(), <<-22.20569, -1451.75293, 29.70968>>, PEDMOVE_WALK) //TASK_LOOK_AT_ENTITY(PLAYER_PED_ID(), lamarPed, -1, SLF_WHILE_NOT_IN_FOV) ENDIF ENDPROC // chop follow task PROC GIVE_CHOP_FOLLOW_TASK() //TASK_GOTO_ENTITY_OFFSET_XY(chopPed, lamarPed, DEFAULT_TIME_BEFORE_WARP, 0.1, -0.8, 1.0, PEDMOVE_RUN, ESEEK_OFFSET_ORIENTATES_WITH_ENTITY) TASK_GOTO_ENTITY_OFFSET_XY(chopPed, lamarPed, -1, 0.2, -0.8, 3.0, 1.25, ESEEK_OFFSET_ORIENTATES_WITH_ENTITY) //TASK_FOLLOW_TO_OFFSET_OF_ENTITY(chopPed, lamarPed, <<-0.7,-0.5,0>>, PEDMOVE_RUN, -1, 0.3) ENDPROC // setup chop for walk PROC SETUP_CHOP_FOR_WALK() IF NOT IS_PED_INJURED(chopPed) SET_ENTITY_HEADING(chopPed, CHOP_WALK_INIT_ROT) FORCE_PED_MOTION_STATE(chopPed, MS_ON_FOOT_WALK, FALSE, FAUS_CUTSCENE_EXIT) SET_PED_MIN_MOVE_BLEND_RATIO(chopPed,1.0) GIVE_CHOP_FOLLOW_TASK() ENDIF ENDPROC // trains PROC HANDLE_TRAINS() INT i REPEAT NUMBER_TRAINS i SETPIECE_STAGE_ENUM startStage INT iStartTime INT iRunTime FLOAT fCruiseSpeed SWITCH i CASE 0 startStage = SETPIECE_LOCK_TRAIN_CUT_ACROSS iStartTime = 0 iRunTime = 1300 fCruiseSpeed = 4.0 BREAK CASE 1 startStage = SETPIECE_LOCK_TRAIN_JUMP iStartTime = 0 iRunTime = 20000//23500 fCruiseSpeed = 2.67 BREAK CASE 2 startStage = SETPIECE_FREE_BACK_OF_CARRIAGES iStartTime = 0 IF currentMissionStage = STAGE_FIND_BAD_GUY OR bRunningCutscene iRunTime = 7400//10400 fCruiseSpeed = 6.5 ELSE iRunTime = 30000//10400 fCruiseSpeed = 10.0 ENDIF BREAK ENDSWITCH IF IS_VEHICLE_DRIVEABLE(trainVehicle[i]) IF NOT bStartedTrain[i] IF setpieceStage = startStage IF GET_GAME_TIMER() >= iSetpieceStageStartTime + iStartTime bStartedTrain[i] = TRUE iTrainStartedTime[i] = GET_GAME_TIMER() fTrainCruiseSpeed[i] = fCruiseSpeed SET_TRAIN_CRUISE_SPEED(trainVehicle[i], fTrainCruiseSpeed[i]) //SET_TRAIN_SPEED(trainVehicle[i], fTrainCruiseSpeed[i]) ENDIF ENDIF ELSE IF GET_GAME_TIMER() >= iTrainStartedTime[i] + iRunTime fTrainCruiseSpeed[i] = fTrainCruiseSpeed[i] -@ 1.0 IF fTrainCruiseSpeed[i] <= 0 fTrainCruiseSpeed[i] = 0 ENDIF SET_TRAIN_CRUISE_SPEED(trainVehicle[i], fTrainCruiseSpeed[i]) SET_TRAIN_SPEED(trainVehicle[i], fTrainCruiseSpeed[i]) ENDIF ENDIF ENDIF ENDREPEAT ENDPROC // position player at init pos for mission PROC POSITION_PLAYER_AT_MISSION_INIT() IF NOT IS_PED_INJURED(PLAYER_PED_ID()) SET_ENTITY_COORDS(PLAYER_PED_ID(), GET_HOOD_VECTOR(HVEC_PLAYER_INIT)) SET_ENTITY_HEADING(PLAYER_PED_ID(), PLAYER_INIT_ROT) SET_GAMEPLAY_CAM_RELATIVE_HEADING() ENDIF ENDPROC // should we set the checkpoint for replay on this stage init? FUNC BOOL SHOULD_SET_CHECKPOINT_FOR_THIS_STAGE(MISSION_STAGE_ENUM setStage) SWITCH setStage CASE STAGE_GET_TO_BAD_GUY CASE STAGE_VAN_CHASE CASE STAGE_FOOT_CHASE CASE STAGE_FIND_BAD_GUY CASE STAGE_GET_TO_HOUSE RETURN TRUE BREAK ENDSWITCH RETURN FALSE ENDFUNC // clear the start area PROC CLEAR_START_AREA() // clear init areas CLEAR_INIT_POS(GET_HOOD_VECTOR(HVEC_PLAYER_INIT)) CLEAR_INIT_POS(GET_HOOD_VECTOR(HVEC_FRANKLIN_VAN_INIT)) //WAIT(0) 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 bRemoveBlips = TRUE, BOOL bHandleFadeIn = TRUE) bHandleFadeIn=bHandleFadeIn IF bJumpingToStage // clear area and load scene around start pos VECTOR vStartPos FLOAT fStartRot SWITCH setStage CASE STAGE_GET_TO_BAD_GUY IF NOT bForcePassOnShitskip vStartPos = GET_HOOD_VECTOR(HVEC_PLAYER_INIT) fStartRot = PLAYER_INIT_ROT ELSE vStartPos = GET_HOOD_VECTOR(HVEC_BAD_GUY_HANGOUT) fStartRot = -106.5 ENDIF BREAK CASE STAGE_VAN_CHASE vStartPos = GET_HOOD_VECTOR(HVEC_FRANKLIN_ALLEY_INIT) fStartRot = FRANKLIN_ALLEY_INIT_ROT BREAK CASE STAGE_FOOT_CHASE vStartPos = GET_HOOD_VECTOR(HVEC_FOOT_CHASE_INIT) fStartRot = FOOT_CHASE_INIT_ROT BREAK CASE STAGE_FIND_BAD_GUY IF NOT bForcePassOnShitskip vStartPos = GET_HOOD_VECTOR(HVEC_LOSE_RUNNER) fStartRot = LOSE_RUNNER_ROT ELSE vStartPos = <<517.1, -647.4, 24.2>> fStartRot = -86.0 ENDIF BREAK CASE STAGE_GET_TO_HOUSE IF NOT bForcePassOnShitskip vStartPos = GET_HOOD_VECTOR(HVEC_DRIVE_INIT) fStartRot = DRIVE_INIT_ROT ELSE vStartPos = GET_HOOD_VECTOR(HVEC_REC) fStartRot = 143.1 ENDIF BREAK ENDSWITCH // clear area for replay SET_PLAYER_OUT_OF_ANY_VEHICLE() IF bClearMap CLEAR_AREA(vStartPos, 10000, TRUE) // temp IF setStage = STAGE_FIND_BAD_GUY REMOVE_PARTICLE_FX_IN_RANGE(<<539.11841, -626.19080, 23.78954>>, 40) ENDIF ENDIF WAIT(0) SET_WEATHER_TYPE_NOW_PERSIST("extrasunny") // set to coords and wait for streaming IF IS_REPLAY_IN_PROGRESS() AND NOT bSuppressFutureReplaySetups START_REPLAY_SETUP(vStartPos, fStartRot) ELSE SET_ENTITY_COORDS(PLAYER_PED_ID(), vStartPos) SET_ENTITY_HEADING(PLAYER_PED_ID(), fStartRot) ENDIF ENDIF // get the models and force their load REQUEST_MODELS_FOR_STAGE(setStage, TRUE, FALSE) // get the recordings and force their load REQUEST_VEHICLE_RECORDINGS_FOR_STAGE(setStage, TRUE, FALSE) // get the anims and force their load REQUEST_ANIM_DICTS_FOR_STAGE(setStage, TRUE, FALSE) // get the waypoints and force their load REQUEST_WAYPOINT_RECORDINGS_FOR_STAGE(setStage, TRUE, FALSE) // get the weapons and force their load REQUEST_WEAPONS_FOR_STAGE(setStage, TRUE, FALSE) // get the ptfx and force their load REQUEST_PTFX_FOR_STAGE(setStage, TRUE, FALSE) // get the sfx and force their load REQUEST_SFX_FOR_STAGE(setStage, TRUE, FALSE) // get the misc assets and force their load REQUEST_MISC_ASSETS_FOR_STAGE(setStage, TRUE, FALSE) // get the text and force its load REQUEST_TEXT(TRUE) // reset mocap streaming //IF mocapStreamingStage >= MOCAP_STREAMING_STAGE_WAIT REMOVE_CUTSCENE() mocapStreamingStage = MOCAP_STREAMING_STAGE_REQUEST //ENDIF // reset vars RESET_VARIABLES_FOR_STAGE(setStage) // get rid of blips and text IF bRemoveBlips REMOVE_ALL_BLIPS() ENDIF REMOVE_MISSION_TEXT(bClearTextAndSpeech OR bJumpingToStage, bClearTextAndSpeech OR bJumpingToStage) // kill chase cam KILL_CHASE_HINT_CAM(localChaseHintCamStruct) 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()), GET_ENTITY_HEADING(PLAYER_PED_ID()), FALSE) WAIT(0) ENDWHILE WHILE NOT MAKE_SELECTOR_PED_SELECTION(sSelectorPeds, selectorSlot) WAIT(0) ENDWHILE WHILE NOT TAKE_CONTROL_OF_SELECTOR_PED(sSelectorPeds, TRUE) WAIT(0) ENDWHILE INT i REPEAT 3 i IF DOES_ENTITY_EXIST(sSelectorPeds.pedID[i]) DELETE_PED(sSelectorPeds.pedID[i]) ENDIF ENDREPEAT ENDIF ENDIF IF bJumpingToStage OR bInitialisingAfterIntro // remove all dialogue IF bJumpingToStage INT i FOR i=0 TO 9 REMOVE_PED_FOR_DIALOGUE(hoodConversation, i) ENDFOR ENDIF // setup with speech ADD_PED_FOR_DIALOGUE(hoodConversation, 2, PLAYER_PED_ID(), "FRANKLIN") sSelectorPeds.eCurrentSelectorPed = GET_SELECTOR_SLOT_FROM_PLAYER_PED_ENUM(GET_CHARACTER_FOR_MISSION_STAGE(setStage)) // create the player characters for the stage CREATE_PLAYER_CHARACTERS_WITH_TRANSPORT_IN_MISSION_STAGE(setStage) SETUP_PLAYER_CHARACTER_WITH_MISSION_VARIATIONS(PLAYER_PED_ID(), GET_CHARACTER_FOR_MISSION_STAGE(setStage), setStage) IF bJumpingToStage LOAD_ALL_OBJECTS_IF_SCREEN_FADED_OUT() WHILE NOT HAVE_ALL_STREAMING_REQUESTS_COMPLETED(PLAYER_PED_ID()) WAIT(0) ENDWHILE ENDIF // roll down van window IF IS_VEHICLE_DRIVEABLE(hoodVehicle[HV_FRANKLIN_VAN]) IF setStage >= STAGE_GET_TO_HOUSE REMOVE_VEHICLE_WINDOW(hoodVehicle[HV_FRANKLIN_VAN], SC_WINDOW_FRONT_LEFT) ENDIF ENDIF // create bad guy IF setStage > STAGE_GET_TO_BAD_GUY CREATE_BAD_GUY_FOR_STAGE(setStage) ENDIF ENDIF // setup player control/cameras IF bRenderScriptCamsFalse RENDER_SCRIPT_CAMS(FALSE, FALSE) ENDIF IF bJumpingToSTage DELETE_ALL_TRAINS() ENDIF // prevent annoying assert on van chase //IF setStage = STAGE_VAN_CHASE // SET_REQUESTED_MODEL_ASSERT(FALSE) //ELSE // SET_REQUESTED_MODEL_ASSERT(TRUE) //ENDIF // reset state fakery FAKE_SELECTOR_IS_PLAYER(chopViewCamData, sselectorPeds, FALSE) // do any other necessary setup for the stage SWITCH setStage CASE STAGE_GET_TO_BAD_GUY // temp? IF bJumpingToStage POSITION_PLAYER_AT_MISSION_INIT() IF Is_Replay_In_Progress() IF IS_REPLAY_START_VEHICLE_AVAILABLE() IF IS_REPLAY_VEHICLE_MODEL_UNDER_SIZE_LIMIT(GET_REPLAY_START_VEHICLE_MODEL(), <<0,0,0>>) VEHICLE_INDEX startVehicle startVehicle = CREATE_REPLAY_START_VEHICLE(GET_HOOD_VECTOR(HVEC_MOVE_LAST_PLAYER_VEHICLE), MOVE_LAST_PLAYER_VEHICLE_ROT) SET_MISSION_VEHICLE_GEN_VEHICLE(startVehicle, GET_HOOD_VECTOR(HVEC_MOVE_LAST_PLAYER_VEHICLE), MOVE_LAST_PLAYER_VEHICLE_ROT) ENDIF ENDIF ENDIF ENDIF bModelRequestTracker[HM_START_VEHICLE] = FALSE CREATE_LAMAR_FOR_STAGE(setStage) CREATE_CHOP_FOR_STAGE(setStage) SET_HOOD_ROADS_OFF(TRUE) ENABLE_CARGENS_FOR_MISSION(FALSE) IF NOT bForcePassOnShitSkip START_HOOD_AUDIO_SCENE(HOOD_AUDIO_SCENE_WALK_TO_VAN) ENDIF SET_GPS_DISABLED_ZONE(<<164, -257, -80>>, <<436, 62, 120>>) IF bJumpingToStage printstring("jumping to stage") printnl() IF NOT IS_PED_INJURED(lamarPed) SET_ENTITY_COORDS(lamarPed, GET_HOOD_VECTOR(HVEC_LAMAR_WALK_INIT)) ENDIF IF NOT IS_PED_INJURED(chopPed) SET_ENTITY_COORDS(chopPed, GET_HOOD_VECTOR(HVEC_CHOP_WALK_INIT)) ENDIF ENDIF IF NOT IS_PED_INJURED(chopPed) SET_ANIMAL_MOOD(chopPed, AUD_ANIMAL_MOOD_PLAYFUL) ENDIF iNextChopExcitementTime = GET_GAME_TIMER() + 100 iStopChopExcitementTime = GET_GAME_TIMER() + 1500 iBlockJumpTime = GET_GAME_TIMER() + 2000 SET_PLAYER_CONTROL(PLAYER_ID(), TRUE) BREAK CASE STAGE_VAN_CHASE IF bJumpingToStage bDoneAreYouOKChopSpeech = FALSE CREATE_LAMAR_FOR_STAGE(setStage) CREATE_CHOP_FOR_STAGE(setStage) CREATE_GIRL_FOR_STAGE(setStage) IF NOT IS_PED_INJURED(PLAYER_PED_ID()) AND IS_VEHICLE_DRIVEABLE(hoodVehicle[HV_FRANKLIN_VAN]) SET_VEHICLE_ENGINE_ON(hoodVehicle[HV_FRANKLIN_VAN], TRUE, TRUE) ENDIF ELSE IF NOT IS_PED_INJURED(chopPed) DETACH_ENTITY(chopPed) ENDIF SET_CHOP_INTO_VAN(chopPed, hoodVehicle[HV_FRANKLIN_VAN], chopLeanInVanState, fCachedVanSpeed, FALSE) SET_ENTITY_PROOFS(chopPed, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, TRUE) SET_PED_CAN_RAGDOLL(chopPed, FALSE) ENDIF REQUEST_PED_VISIBILITY_TRACKING(chopPed) SET_HOOD_ROADS_OFF(TRUE, TRUE) IF NOT bJumpingToStage CLEAR_AREA(<<143.22, -458.90, 41.05>>, 810, TRUE) ENDIF SET_FRANKLIN_MASK(TRUE) SET_LAMAR_MASK(TRUE) SET_PED_CONFIG_FLAG(PLAYER_PED_ID(), PCF_ForceDirectEntry, TRUE) IF NOT IS_PED_INJURED(girlPed) TASK_COWER(girlPed, -1) ENDIF SPECIAL_ABILITY_FILL_METER(PLAYER_ID(), TRUE) SET_GPS_DISABLED_ZONE(<<0,0,0>>, <<0,0,0>>) IF IS_VEHICLE_DRIVEABLE(hoodVehicle[HV_FRANKLIN_VAN]) iCachedVanHealth = GET_ENTITY_HEALTH(hoodVehicle[HV_FRANKLIN_VAN]) SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(hoodVehicle[HV_FRANKLIN_VAN], TRUE) //SET_VEHICLE_RADIO_ENABLED(hoodVehicle[HV_FRANKLIN_VAN], FALSE) ENDIF //IF NOT IS_PED_INJURED(lamarPed) // SET_PED_CAN_RAGDOLL(lamarPed, FALSE) //ENDIF fSwitchOffRoadDist = 50.0 switch_SetPieceCar_to_ai_on_collision = TRUE //bTrafficOnlySwitchToAIOnCollision = TRUE allow_veh_to_stop_on_PLAYER_impact = TRUE iSpeedZone = ADD_ROAD_NODE_SPEED_ZONE(<<293.12726, -83.67029, 69.13698>>, 5.1, 0) INITIALISE_UBER_PLAYBACK(GET_HOOD_UBER_RECORDING_PREFIX(), 001) SET_FORCE_UBER_PLAYBACK_TO_USE_DEFAULT_PED_MODEL(FALSE) SET_UBER_PLAYBACK_TO_CLEANUP_DEFAULT_PED_MODEL(TRUE) LOAD_CHASE_UBER_DATA() CREATE_ALL_WAITING_UBER_CARS() START_HOOD_AUDIO_SCENE(HOOD_AUDIO_SCENE_CAR_CHASE) SET_PED_POPULATION_BUDGET(2) IF NOT IS_PED_INJURED(chopPed) STOP_PED_SPEAKING(chopPed, TRUE) ENDIF IF IS_VEHICLE_DRIVEABLE(hoodVehicle[HV_BAD_GUY_BIKE]) ADD_ENTITY_TO_AUDIO_MIX_GROUP(hoodVehicle[HV_BAD_GUY_BIKE], "FRANKLIN_0_Bike_Group") ENDIF IF bJumpingToStage IF NOT IS_PED_INJURED(PLAYER_PED_ID()) SET_BIKE_TO_ESCAPE() ENDIF TRIGGER_MISSION_MUSIC_EVENT("FRA0_CHASE_RESTART") ENDIF BREAK CASE STAGE_FOOT_CHASE IF bJumpingToStage createCarsStage = CREATE_CARS_STAGE_DONE RESET_FOOT_CHASE_VALUES() CREATE_LAMAR_FOR_STAGE(setStage) CREATE_CHOP_FOR_STAGE(setStage) IF IS_VEHICLE_DRIVEABLE(hoodVehicle[HV_FRANKLIN_VAN]) SET_VEHICLE_ENGINE_ON(hoodVehicle[HV_FRANKLIN_VAN], TRUE, TRUE) ENDIF ENDIF //IF DOES_CAM_EXIST(chaseCam) // DESTROY_CAM(chaseCam) //ENDIF //IF DOES_ENTITY_EXIST(cameraVehicle) // DELETE_VEHICLE(cameraVehicle) //ENDIF REMOVE_ROAD_NODE_SPEED_ZONE(iSpeedZone) ENABLE_CARGENS_FOR_MISSION(FALSE) CLEAR_CARGENS_FOR_FOOT_CHASE() IF bJumpingToStage CLEAR_AREA(<<466, -579, 28>>, 10000, TRUE) ENDIF SET_HOOD_ROADS_OFF(TRUE, TRUE) // clear fence IF bJumpingToStage CLEAR_AREA_OF_OBJECTS(<<494, -516, 23>>, 10.0, CLEAROBJ_FLAG_FORCE) ENDIF chopChaseProperties.ped = chopPed IF IS_VEHICLE_DRIVEABLE(hoodVehicle[HV_FRANKLIN_VAN]) SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(hoodVehicle[HV_FRANKLIN_VAN], FALSE) ENDIF SET_NEXT_RANDOM_SPEECH_TIME(11000) // switch on assisted route //USE_WAYPOINT_RECORDING_AS_ASSISTED_MOVEMENT_ROUTE("hood5", TRUE, ASSISTED_PATH_WIDTH, ASSISTED_TENSION) IF NOT IS_PED_INJURED(runnerChaseProperties.ped) IF NOT bJumpingToStage ADD_ENTITY_TO_AUDIO_MIX_GROUP(runnerChaseProperties.ped, "FRANKLIN_0_D_Group") ENDIF REQUEST_PED_VISIBILITY_TRACKING(runnerChaseProperties.ped) IF NOT DOES_BLIP_EXIST(runnerBlip) runnerBlip = CREATE_MISSION_BLIP_FOR_PED(runnerChaseProperties.ped, TRUE) ENDIF SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(runnerChaseProperties.ped, TRUE) //SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(runnerChaseProperties.ped, TRUE) SET_RAGDOLL_BLOCKING_FLAGS(runnerChaseProperties.ped, chaseRagdollBlockingFlags) IF bJumpingToStage FORCE_PED_MOTION_STATE(runnerChaseProperties.ped,MS_ON_FOOT_SPRINT,TRUE,FAUS_CUTSCENE_EXIT) ENDIF SET_PED_MIN_MOVE_BLEND_RATIO(runnerChaseProperties.ped,PEDMOVE_SPRINT) ENDIF IF NOT IS_PED_INJURED(chopPed) SET_ENTITY_PROOFS(chopPed, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE) DETACH_ENTITY(chopPed) SET_RAGDOLL_BLOCKING_FLAGS(chopPed, chaseRagdollBlockingFlags) IF bJumpingToStage //FORCE_PED_MOTION_STATE(chopPed,MS_ON_FOOT_SPRINT,TRUE,FAUS_CUTSCENE_EXIT) ENDIF SET_PED_CAN_RAGDOLL(chopPed, TRUE) SET_PED_MIN_MOVE_BLEND_RATIO(chopPed,PEDMOVE_SPRINT) chopBlip = CREATE_MISSION_BLIP_FOR_PED(chopPed, FALSE, CHAR_CHOP) ENDIF IF NOT IS_PED_INJURED(lamarPed) AND IS_VEHICLE_DRIVEABLE(hoodVehicle[HV_FRANKLIN_VAN]) IF NOT bJumpingToStage IF NOT IS_PED_IN_VEHICLE(lamarPed, hoodVehicle[HV_FRANKLIN_VAN]) DETACH_ENTITY(lamarPed) SET_PED_INTO_VEHICLE(lamarPed, hoodVehicle[HV_FRANKLIN_VAN]) ENDIF ENDIF SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(hoodVehicle[HV_FRANKLIN_VAN], TRUE) TASK_LOOK_AT_ENTITY(lamarPed, PLAYER_PED_ID(), -1, SLF_WHILE_NOT_IN_FOV) //TASK_VEHICLE_TEMP_ACTION(lamarPed, hoodVehicle[HV_FRANKLIN_VAN], TEMPACT_REVERSE, 10000) ENDIF CREATE_CHOP_CAM(chopViewCamData) IF bJumpingToStage CREATE_CHASE_SETPIECES(TRUE, FALSE, TRUE, TRUE, TRUE) bApplyStartBoost = FALSE ELSE bApplyStartBoost = TRUE ENDIF CREATE_BOXCAR_DOORS() //iActivateChopCamTime = GET_GAME_TIMER() SET_BIKE_AS_SMOKING() IF bJumpingToStage TRIGGER_MISSION_MUSIC_EVENT("FRA0_FOOT_CHASE_RESTART") START_HOOD_AUDIO_SCENE(HOOD_AUDIO_SCENE_FOOT_CHASE_START) ELSE TRIGGER_MISSION_MUSIC_EVENT("FRA0_FRANK_CHASE") IF IS_VEHICLE_DRIVEABLE(hoodVehicle[HV_BAD_GUY_BIKE]) REMOVE_ENTITY_FROM_AUDIO_MIX_GROUP(hoodVehicle[HV_BAD_GUY_BIKE]) ENDIF ENDIF IF NOT bJumpingToStage bShownGodText = TRUE ENDIF BREAK CASE STAGE_FIND_BAD_GUY CREATE_COLLIE() SET_HOOD_ROADS_OFF(TRUE, TRUE) ENABLE_CARGENS_FOR_MISSION(FALSE) iBoxcarCamSyncScene = 123 IF bJumpingToStage CREATE_LAMAR_FOR_STAGE(setStage) CREATE_CHOP_FOR_STAGE(setStage) IF IS_VEHICLE_DRIVEABLE(hoodVehicle[HV_FRANKLIN_VAN]) SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(hoodVehicle[HV_FRANKLIN_VAN], TRUE) SET_VEHICLE_ENGINE_ON(hoodVehicle[HV_FRANKLIN_VAN], TRUE, TRUE) ENDIF bDoneReactToRunStatSpeech = FALSE iInitialStaminaValue = GET_SP_PLAYER_PED_STAT_VALUE(CHAR_FRANKLIN, PS_STAMINA) bShownChopViewHelp = FALSE bCancelledChopHint = FALSE bShownNoStaminaHelp = FALSE runHelpState = RUN_HELP_STATE_DONE iRunnerStageStartTime = GET_GAME_TIMER() iRunnerStageStartTime=iRunnerStageStartTime CREATE_YARD_TRAIN_FOR_STAGE(1, STAGE_FIND_BAD_GUY) CREATE_YARD_TRAIN_FOR_STAGE(2, STAGE_FIND_BAD_GUY) iTrainStartedTime[0] = GET_GAME_TIMER() iTrainStartedTime[1] = GET_GAME_TIMER() - 10000 iTrainStartedTime[2] = GET_GAME_TIMER() - 10000 HANDLE_TRAINS() WAIT(0) CREATE_BOXCAR_DOORS() CREATE_CHOP_CAM(chopViewCamData) ENDIF IF IS_VEHICLE_DRIVEABLE(hoodVehicle[HV_FRANKLIN_VAN]) SET_ENTITY_COORDS(hoodVehicle[HV_FRANKLIN_VAN], GET_HOOD_VECTOR(HVEC_VAN_HIDDEN)) SET_ENTITY_HEADING(hoodVehicle[HV_FRANKLIN_VAN], VAN_HIDDEN_ROT) FREEZE_ENTITY_POSITION(hoodVehicle[HV_FRANKLIN_VAN], TRUE) ENDIF INT i REPEAT NUMBER_YARD_PEDS i IF DOES_ENTITY_EXIST(yardPed[i].ped) DELETE_PED(yardPed[i].ped) ENDIF ENDREPEAT REPEAT COUNT_OF(driverPed) i IF DOES_ENTITY_EXIST(driverPed[i]) DELETE_PED(driverPed[i]) ENDIF ENDREPEAT REPEAT NUMBER_YARD_VEHICLES i IF DOES_ENTITY_EXIST(yardVehicle[i]) DELETE_VEHICLE(yardVehicle[i]) ENDIF ENDREPEAT IF NOT IS_PED_INJURED(chopPed) CLEAR_RAGDOLL_BLOCKING_FLAGS(chopPed, chaseRagdollBlockingFlags) chopBlip = CREATE_MISSION_BLIP_FOR_PED(chopPed, FALSE, CHAR_CHOP) TASK_CLEAR_LOOK_AT(chopPed) VECTOR vGotoPos WAYPOINT_RECORDING_GET_COORD("hood8", 6, vGotoPos) CLEAR_SEQUENCE_TASK(sequence) OPEN_SEQUENCE_TASK(sequence) IF NOT bJumpingToStage TASK_PAUSE(NULL, 3500) ENDIF TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, vGotoPos, PEDMOVE_SPRINT, DEFAULT_TIME_BEFORE_WARP, DEFAULT_NAVMESH_RADIUS, ENAV_DEFAULT, 175.5) CLOSE_SEQUENCE_TASK(sequence) TASK_PERFORM_SEQUENCE(chopPed, sequence) SET_PED_CAN_RAGDOLL(chopPed, TRUE) ENDIF IF NOT IS_PED_INJURED(runnerChaseProperties.ped) SET_RAGDOLL_BLOCKING_FLAGS(runnerChaseProperties.ped, chaseRagdollBlockingFlags) ENDIF IF NOT IS_PED_INJURED(lamarPed) TASK_LOOK_AT_ENTITY(lamarPed, PLAYER_PED_ID(), -1, SLF_WHILE_NOT_IN_FOV) ENDIF IF IS_VEHICLE_DRIVEABLE(hoodVehicle[HV_FRANKLIN_VAN]) REMOVE_VEHICLE_WINDOW(hoodVehicle[HV_FRANKLIN_VAN], SC_WINDOW_FRONT_LEFT) ENDIF IF NOT bForcePassOnShitSkip STOP_HOOD_AUDIO_SCENE(HOOD_AUDIO_SCENE_BREAK_THROUGH_FENCE) STOP_HOOD_AUDIO_SCENE(HOOD_AUDIO_SCENE_FOOT_CHASE_START) START_HOOD_AUDIO_SCENE(HOOD_AUDIO_SCENE_SEARCH_BOXCARS) IF bJumpingToStage TRIGGER_MISSION_MUSIC_EVENT("FRA0_HIDING_RESTART") ELSE TRIGGER_MISSION_MUSIC_EVENT("FRA0_SEARCH") ENDIF ENDIF //iActivateChopCamTime = GET_GAME_TIMER() BREAK CASE STAGE_GET_TO_HOUSE SET_HOOD_ROADS_OFF(FALSE) IF bJumpingToStage bDoneTrainingSpeech = TRUE CREATE_LAMAR_FOR_STAGE(setStage) CREATE_CHOP_FOR_STAGE(setStage) ENDIF ENABLE_CARGENS_FOR_MISSION(FALSE) IF IS_VEHICLE_DRIVEABLE(hoodVehicle[HV_FRANKLIN_VAN]) REMOVE_VEHICLE_WINDOW(hoodVehicle[HV_FRANKLIN_VAN], SC_WINDOW_FRONT_LEFT) SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(hoodVehicle[HV_FRANKLIN_VAN], FALSE) SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(hoodVehicle[HV_FRANKLIN_VAN], TRUE) SET_VEHICLE_ENGINE_ON(hoodVehicle[HV_FRANKLIN_VAN], TRUE, TRUE) ENDIF IF NOT IS_PED_INJURED(runnerChaseProperties.ped) CLEAR_RAGDOLL_BLOCKING_FLAGS(runnerChaseProperties.ped, chaseRagdollBlockingFlags) SET_PED_CAN_RAGDOLL(runnerChaseProperties.ped, TRUE) SET_DAMAGE_ON_BAD_GUY() //SET_PED_CAN_BE_TARGETTED(runnerChaseProperties.ped, TRUE) SET_ENTITY_PROOFS(runnerChaseProperties.ped, FALSE, FALSE, FALSE, FALSE, FALSE) SET_PED_CAN_PLAY_AMBIENT_BASE_ANIMS(runnerChaseProperties.ped, FALSE) SET_PED_CAN_PLAY_AMBIENT_ANIMS(runnerChaseProperties.ped, FALSE) IF bJumpingToStage SET_PED_INTO_VEHICLE(runnerChaseProperties.ped, hoodVehicle[HV_FRANKLIN_VAN], VS_BACK_RIGHT) ENDIF TASK_LOOK_AT_ENTITY(runnerChaseProperties.ped, hoodVehicle[HV_FRANKLIN_VAN], -1, SLF_WHILE_NOT_IN_FOV) SET_PED_RELATIONSHIP_GROUP_HASH(runnerChaseProperties.ped, RELGROUPHASH_PLAYER) ENDIF START_HOOD_AUDIO_SCENE(HOOD_AUDIO_SCENE_DRIVE_TO_LAMARS) IF bJumpingToStage IF bForcePassOnShitskip //IF IS_VEHICLE_DRIVEABLE(hoodVehicle[HV_FRANKLIN_VAN]) // SET_ENTITY_COORDS(hoodVehicle[HV_FRANKLIN_VAN], GET_HOOD_VECTOR(HVEC_REC)) // SET_ENTITY_HEADING(hoodVehicle[HV_FRANKLIN_VAN], 73.92) // SET_VEHICLE_ON_GROUND_PROPERLY(hoodVehicle[HV_FRANKLIN_VAN]) //LOAD_SCENE(GET_HOOD_VECTOR(HVEC_REC)) dropoffStage = DROPOFF_STAGE_END bDoneLetOut = TRUE lamarPhoneState = LAMAR_PHONE_STATE_DONE //ENDIF ENDIF ENDIF BREAK ENDSWITCH IF bJumpingToStage //IF ENUM_TO_INT(setStage) > 0 SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0) //ENDIF ENDIF // masks IF bJumpingToStage IF setStage >= STAGE_GET_TO_HOUSE SET_FRANKLIN_MASK(TRUE) SET_LAMAR_MASK(FALSE) ELIF setStage >= STAGE_FOOT_CHASE SET_FRANKLIN_MASK(TRUE) SET_LAMAR_MASK(TRUE) ELIF setStage < STAGE_VAN_CHASE SET_FRANKLIN_MASK(FALSE) SET_LAMAR_MASK(FALSE) ENDIF ENDIF // instance priority IF setStage = STAGE_VAN_CHASE SET_INSTANCE_PRIORITY_HINT(INSTANCE_HINT_DRIVING) ELSE SET_INSTANCE_PRIORITY_HINT(INSTANCE_HINT_NONE) ENDIF // suppress bus IF setStage >= STAGE_VAN_CHASE AND setStage <= STAGE_FIND_BAD_GUY SET_VEHICLE_MODEL_IS_SUPPRESSED(BUS, TRUE) ELSE SET_VEHICLE_MODEL_IS_SUPPRESSED(BUS, FALSE) ENDIF // block shops and shop robberies? IF setStage >= STAGE_VAN_CHASE AND setStage <= STAGE_FIND_BAD_GUY SET_ALL_SHOPS_TEMPORARILY_UNAVAILABLE(TRUE) g_bBlockShopRoberies = TRUE ELSE SET_ALL_SHOPS_TEMPORARILY_UNAVAILABLE(FALSE) g_bBlockShopRoberies = FALSE ENDIF g_bBlockShopRoberies = TRUE // foot ptfx range IF setStage = STAGE_FOOT_CHASE SET_PARTICLE_FX_FOOT_LODRANGE_SCALE(4.0) ELSE SET_PARTICLE_FX_FOOT_LODRANGE_SCALE(1.0) ENDIF // cheats IF setStage = STAGE_FOOT_CHASE DISABLE_CHEAT(CHEAT_TYPE_SUPER_JUMP, TRUE) DISABLE_CHEAT(CHEAT_TYPE_FAST_RUN, TRUE) ELSE DISABLE_CHEAT(CHEAT_TYPE_SUPER_JUMP, FALSE) DISABLE_CHEAT(CHEAT_TYPE_FAST_RUN, FALSE) ENDIF IF setStage <> STAGE_VAN_CHASE SET_PED_POPULATION_BUDGET(3) ENDIF // wanted level, emergency services IF setStage >= STAGE_VAN_CHASE AND setStage <= STAGE_FIND_BAD_GUY 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) SET_CREATE_RANDOM_COPS(FALSE) ELSE 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_CREATE_RANDOM_COPS(TRUE) ENDIF // set value for replay BOOL bFinalCheckpoint = FALSE IF ENUM_TO_INT(setStage) >= ENUM_TO_INT(STAGE_GET_TO_HOUSE) bFinalCheckpoint = TRUE // skipping from this point would end the mission ENDIF IF SHOULD_SET_CHECKPOINT_FOR_THIS_STAGE(setStage) Set_Replay_Mid_Mission_Stage_With_Name(ENUM_TO_INT(setStage), GET_DESCRIPTION_FOR_STAGE_AS_STRING(setStage), bFinalCheckpoint) IF ENUM_TO_INT(setStage) <> 0 AND NOT bJumpingToStage iReplayAttempt = 0 ENDIF ENDIF IF 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_HOUSE endReplayVehicle = hoodVehicle[HV_FRANKLIN_VAN] BREAK ENDSWITCH BOOL bReturnControl = TRUE VEHICLE_SEAT seat = VS_DRIVER END_REPLAY_SETUP(endReplayVehicle, seat, bReturnControl) bSuppressFutureReplaySetups = TRUE ENDIF ENDIF ENDIF // post replay setup specific skip stuff SWITCH setStage CASE STAGE_GET_TO_BAD_GUY IF NOT bForcePassOnShitSkip printstring("setup for walk") printnl() SETUP_LAMAR_FOR_WALK() SETUP_PLAYER_FOR_WALK() SETUP_CHOP_FOR_WALK() ENDIF BREAK CASE STAGE_VAN_CHASE SET_PED_STEALTH_MOVEMENT(PLAYER_PED_ID(), FALSE) IF GET_FOLLOW_PED_CAM_VIEW_MODE() <> CAM_VIEW_MODE_FIRST_PERSON FORCE_PED_MOTION_STATE(PLAYER_PED_ID(), MS_ON_FOOT_SPRINT, FALSE, FAUS_CUTSCENE_EXIT) SET_PED_MIN_MOVE_BLEND_RATIO(PLAYER_PED_ID(), PEDMOVE_SPRINT) ELSE FORCE_PED_MOTION_STATE(PLAYER_PED_ID(), MS_AIMING, FALSE, FAUS_CUTSCENE_EXIT) SIMULATE_PLAYER_INPUT_GAIT(PLAYER_ID(), PEDMOVE_SPRINT, 2000) ENDIF BREAK CASE STAGE_FOOT_CHASE IF GET_FOLLOW_PED_CAM_VIEW_MODE() <> CAM_VIEW_MODE_FIRST_PERSON FORCE_PED_MOTION_STATE(PLAYER_PED_ID(),MS_ON_FOOT_SPRINT,TRUE,FAUS_CUTSCENE_EXIT) ELSE FORCE_PED_MOTION_STATE(PLAYER_PED_ID(),MS_AIMING,TRUE,FAUS_CUTSCENE_EXIT) ENDIF IF NOT IS_PED_INJURED(chopPed) FORCE_PED_MOTION_STATE(chopPed,MS_ON_FOOT_SPRINT,TRUE,FAUS_CUTSCENE_EXIT) SET_PED_MIN_MOVE_BLEND_RATIO(chopPed,PEDMOVE_SPRINT) ENDIF BREAK ENDSWITCH ENDIF // after rest of setup common stuff SWITCH setStage CASE STAGE_FOOT_CHASE IF GET_FOLLOW_PED_CAM_VIEW_MODE() <> CAM_VIEW_MODE_FIRST_PERSON SET_PED_MIN_MOVE_BLEND_RATIO(PLAYER_PED_ID(), PEDMOVE_RUN) ELSE SIMULATE_PLAYER_INPUT_GAIT(PLAYER_ID(), PEDMOVE_RUN, 2000) ENDIF BREAK ENDSWITCH IF setStage <> STAGE_FOOT_CHASE iNextChopSoundTime = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(1500, 3000) ELSE iNextChopSoundTime = GET_GAME_TIMER() + 300 ENDIF iStageStartTime = GET_GAME_TIMER() currentMissionStage = setStage ENDPROC // handle streaming mocap PROC HANDLE_STREAMING_MOCAP(STRING sMocap, VECTOR vStreamPos, FLOAT fStreamInDistance, FLOAT fStreamOutDistance) SWITCH mocapStreamingStage CASE MOCAP_STREAMING_STAGE_REQUEST IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), vStreamPos, <>) REQUEST_CUTSCENE(sMocap) mocapStreamingStage = MOCAP_STREAMING_STAGE_WAIT ENDIF BREAK CASE MOCAP_STREAMING_STAGE_WAIT IF HAS_CUTSCENE_LOADED() mocapStreamingStage = MOCAP_STREAMING_STAGE_COMPLETE ENDIF BREAK CASE MOCAP_STREAMING_STAGE_COMPLETE IF NOT IS_ENTITY_AT_COORD(PLAYER_PED_ID(), vStreamPos, <>) REMOVE_CUTSCENE() mocapStreamingStage = MOCAP_STREAMING_STAGE_REQUEST ENDIF BREAK ENDSWITCH ENDPROC // should we start streaming for next mission stage? FUNC BOOL SHOULD_START_STREAMING_FOR_NEXT_MISSION_STAGE() SWITCH currentMissionStage CASE STAGE_GET_TO_BAD_GUY IF bRunningCutscene RETURN TRUE ENDIF //IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), GET_HOOD_VECTOR(HVEC_GIRL_INIT), <<150,150,150>>, FALSE, FALSE) // RETURN TRUE //ENDIF BREAK CASE STAGE_VAN_CHASE //IF bRunningCutscene // RETURN TRUE //ENDIF IF IS_VEHICLE_DRIVEABLE(hoodVehicle[HV_BAD_GUY_BIKE]) IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(hoodVehicle[HV_BAD_GUY_BIKE]) //IF GET_TIME_POSITION_IN_RECORDING(hoodVehicle[HV_BAD_GUY_BIKE]) >= STREAM_FOOT_CHASE_TIME // RETURN TRUE //ENDIF ELSE RETURN TRUE ENDIF ENDIF BREAK CASE STAGE_FOOT_CHASE IF setpieceStage >= SETPIECE_LOCK_TRAIN_JUMP RETURN TRUE ENDIF BREAK CASE STAGE_FIND_BAD_GUY IF bFoundBadGuy RETURN TRUE ENDIF BREAK BREAK CASE STAGE_GET_TO_HOUSE 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_WAYPOINT_RECORDINGS_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_WAYPOINT_REQUESTS_SUCCEEDED() AND HAVE_ALL_WEAPON_REQUESTS_SUCCEEDED() AND HAVE_ALL_PTFX_REQUESTS_SUCCEEDED() AND HAVE_ALL_SFX_REQUESTS_SUCCEEDED() AND HAVE_ALL_MISC_ASSET_REQUESTS_SUCCEEDED() AND HAS_ADDITIONAL_TEXT_LOADED(MISSION_TEXT_SLOT) streamingStage = MISSION_STREAMING_STAGE_COMPLETE ENDIF BREAK ENDSWITCH ENDPROC // debug skip mocap #IF IS_DEBUG_BUILD PROC DEBUG_SKIP_MOCAP() IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_J) STOP_CUTSCENE() WHILE NOT IS_SCREEN_FADED_OUT() WAIT(0) ENDWHILE ENDIF ENDPROC #ENDIF // get rid of everything PROC CLEAR_MISSION_FOR_SKIP() INT i DISTANT_COP_CAR_SIRENS(FALSE) SET_PLAYER_OUT_OF_ANY_VEHICLE() SET_CHOP_VIEW_CAM_DISABLED(chopViewCamData, sSelectorPeds) INFORM_MISSION_STATS_SYSTEM_OF_TIME_WINDOW_CLOSED() STOP_ALL_HOOD_AUDIO_SCENES() CLEAR_CONTROL_LIGHT_EFFECT(PLAYER_CONTROL) IF STREAMVOL_IS_VALID(missionStreamingVolume) STREAMVOL_DELETE(missionStreamingVolume) ENDIF REMOVE_ROAD_NODE_SPEED_ZONE(iSpeedZone) RESET_WANTED_LEVEL_DIFFICULTY(PLAYER_ID()) REMOVE_CHOP_SCENT(TRUE) TOGGLE_CAR_MOD_SHOPS_UNAVAILABLE(FALSE) //IF DOES_PARTICLE_FX_LOOPED_EXIST(bloodPTFX) // REMOVE_PARTICLE_FX(bloodPTFX) //ENDIF // delete entities REPEAT 3 i IF DOES_ENTITY_EXIST(sSelectorPeds.pedID[i]) DELETE_PED(sSelectorPeds.pedID[i]) ENDIF ENDREPEAT IF DOES_ENTITY_EXIST(runnerChaseProperties.ped) DELETE_PED(runnerChaseProperties.ped) ENDIF REPEAT COUNT_OF(driverPed) i IF DOES_ENTITY_EXIST(driverPed[i]) DELETE_PED(driverPed[i]) ENDIF ENDREPEAT IF DOES_ENTITY_EXIST(lamarPed) DELETE_PED(lamarPed) ENDIF IF DOES_ENTITY_EXIST(chopPed) DELETE_PED(chopPed) ENDIF //IF DOES_ENTITY_EXIST(tempHelperPed) // DELETE_PED(tempHelperPed) //ENDIF IF DOES_ENTITY_EXIST(girlPed) DELETE_PED(girlPed) ENDIF IF DOES_ENTITY_EXIST(colliePed) DELETE_PED(colliePed) ENDIF REPEAT COUNT_OF(HOOD_VEHICLE_ENUM) i IF DOES_ENTITY_EXIST(hoodVehicle[i]) DELETE_VEHICLE(hoodVehicle[i]) ENDIF ENDREPEAT //IF DOES_ENTITY_EXIST(cameraVehicle) // DELETE_VEHICLE(cameraVehicle) //ENDIF REPEAT NUMBER_YARD_VEHICLES i IF DOES_ENTITY_EXIST(yardVehicle[i]) DELETE_VEHICLE(yardVehicle[i]) ENDIF ENDREPEAT REPEAT NUMBER_TRAINS i IF DOES_ENTITY_EXIST(trainVehicle[i]) DELETE_MISSION_TRAIN(trainVehicle[i]) ENDIF ENDREPEAT REPEAT NUMBER_BLOCKING_VEHICLES i IF DOES_ENTITY_EXIST(blockingVehicle[i]) DELETE_VEHICLE(blockingVehicle[i]) ENDIF ENDREPEAT IF DOES_ENTITY_EXIST(uberTrailerVehicle) DELETE_VEHICLE(uberTrailerVehicle) ENDIF REPEAT NUMBER_YARD_PEDS i IF DOES_ENTITY_EXIST(yardPed[i].ped) DELETE_PED(yardPed[i].ped) ENDIF ENDREPEAT REPEAT NUMBER_BOXCARS i INT j REPEAT 2 j IF DOES_ENTITY_EXIST(boxcarCarriage[i].boxcarDoor[j].obj) DELETE_OBJECT(boxcarCarriage[i].boxcarDoor[j].obj) ENDIF IF DOES_ENTITY_EXIST(boxcarCarriage[i].boxcarDoor[j].handleObject) DELETE_OBJECT(boxcarCarriage[i].boxcarDoor[j].handleObject) ENDIF ENDREPEAT IF DOES_ENTITY_EXIST(boxcarCarriage[i].anchorObject) DELETE_OBJECT(boxcarCarriage[i].anchorObject) ENDIF ENDREPEAT IF DOES_ENTITY_EXIST(lamarPhoneObject) DELETE_OBJECT(lamarPhoneObject) ENDIF IF DOES_ENTITY_EXIST(franklinBandanaObject) DELETE_OBJECT(franklinBandanaObject) ENDIF IF DOES_CAM_EXIST(staticCam) DESTROY_CAM(staticCam) ENDIF IF DOES_CAM_EXIST(animCam) DESTROY_CAM(animCam) ENDIF IF DOES_CAM_EXIST(chopSwitchCam) DESTROY_CAM(chopSwitchCam) ENDIF IF DOES_CAM_EXIST(chopViewCamData.chopCam) DESTROY_CAM(chopViewCamData.chopCam) ENDIF //IF DOES_CAM_EXIST(chaseCam) // DESTROY_CAM(chaseCam) //ENDIF //IF DOES_CAM_EXIST(chopViewCamData.copiedGameCam) // DESTROY_CAM(chopViewCamData.copiedGameCam) //ENDIF CLEAR_AREA(GET_HOOD_VECTOR(HVEC_FRANKLIN_VAN_INIT), 10000, TRUE) ENDPROC // common stuff to clear mission for a skip PROC COMMON_MISSION_CLEAR() 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 TASK_CLEAR_LOOK_AT(PLAYER_PED_ID()) WAIT(1000) CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID()) KILL_CHASE_HINT_CAM(localChaseHintCamStruct) CLEANUP_UBER_PLAYBACK(TRUE) DISPLAY_RADAR(TRUE) DISPLAY_HUD(TRUE) SET_PLAYER_CONTROL(PLAYER_ID(), TRUE) #IF IS_DEBUG_BUILD bDebugDoneFootChaseSkip = FALSE #ENDIF SET_SCRIPTS_SAFE_FOR_CUTSCENE(FALSE) CLEAR_MISSION_FOR_SKIP() ENDPROC // handle shitskip FUNC BOOL HANDLE_MISSION_SHITSKIP() // new shitskip system IF IS_REPLAY_IN_PROGRESS() IF g_bShitskipAccepted = TRUE CPRINTLN(DEBUG_REPLAY, "Franklin 0: 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_GET_TO_BAD_GUY nextReplayStage = STAGE_GET_TO_BAD_GUY bForcePassOnShitskip = TRUE BREAK CASE STAGE_VAN_CHASE nextReplayStage = STAGE_FOOT_CHASE BREAK CASE STAGE_FOOT_CHASE nextReplayStage = STAGE_FIND_BAD_GUY BREAK CASE STAGE_FIND_BAD_GUY nextReplayStage = STAGE_FIND_BAD_GUY bForcePassOnShitskip = TRUE BREAK CASE STAGE_GET_TO_HOUSE nextReplayStage = STAGE_GET_TO_HOUSE bForcePassOnShitskip = TRUE BREAK ENDSWITCH // set the next mission stage nicely COMMON_MISSION_CLEAR() SET_MISSION_STAGE(nextReplayStage, TRUE, TRUE, TRUE, FALSE, TRUE, TRUE, FALSE) IF NOT bForcePassOnShitskip DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME) ENDIF RETURN TRUE ELSE CPRINTLN(DEBUG_REPLAY, "Franklin 0: 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_FRANKLIN_ZERO() SET_PLAYER_CONTROL(PLAYER_ID(), TRUE) IF NOT IS_PED_INJURED(PLAYER_PED_ID()) IF NOT Is_Replay_In_Progress() // no replay - kick mission off normally IF NOT bSkippedIntro PRINTSTRING("cutscene was not skipped") #IF IS_DEBUG_BUILD IF iDebugStage >= 0 SET_MISSION_STAGE(INT_TO_ENUM(MISSION_STAGE_ENUM, iDebugStage), TRUE, TRUE, TRUE, FALSE) ELSE #ENDIF SET_MISSION_STAGE(STAGE_GET_TO_BAD_GUY, FALSE, TRUE, TRUE, TRUE, TRUE, FALSE) #IF IS_DEBUG_BUILD ENDIF #ENDIF ELSE PRINTSTRING("cutscene was skipped") CLEAR_START_AREA() //WAIT(SKIP_FADE_WAIT_TIME) temp remove?? SET_MISSION_STAGE(STAGE_GET_TO_BAD_GUY, TRUE, TRUE, TRUE, FALSE, FALSE) ENDIF ELSE IF HANDLE_MISSION_SHITSKIP() CPRINTLN(DEBUG_REPLAY, "Franklin 0: shitskip done") ELSE INT iReplayStage iReplayStage = Get_Replay_Mid_Mission_Stage() IF iReplayStage = 0 POSITION_PLAYER_AT_MISSION_INIT() ENDIF SET_MISSION_STAGE(INT_TO_ENUM(MISSION_STAGE_ENUM, iReplayStage), TRUE) //WAIT(SKIP_FADE_WAIT_TIME) temp remove??? ENDIF ENDIF IF NOT bForcePassOnShitskip IF IS_SCREEN_FADED_OUT() OR IS_SCREEN_FADING_OUT() DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME) ENDIF ENDIF ENDIF missionInitStage = MISSION_INIT_DONE ENDPROC PROC RESOLVE_FOR_CUTSCENE() RESOLVE_VEHICLES_INSIDE_ANGLED_AREA_WITH_SIZE_LIMIT(<<-42.555, -1458.951, 28.994>>, <<-43.144, -1452.933, 35.456>>, 62, GET_HOOD_VECTOR(HVEC_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(<<-19.634, -1431.664, 28.812>>, <<-18.772, -1456.846, 35.471>>, 30, GET_HOOD_VECTOR(HVEC_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(<<-75.69051, -1460.39551, 31.11074>>, <<-80.50679, -1452.11475, 30.98960>>, 7.15, <<-64.4662, -1463.3616, 31.6336>>, 112.38, GET_DEFAULT_ALLOWABLE_VEHICLE_SIZE_VECTOR(), TRUE, FALSE, TRUE) ENDPROC PROC SET_CHOP_COLLAR() // get chop collar IF HAS_PLAYER_USED_CHOP_APP() iCurrentChopCollar = GET_CHOP_COLLAR_FROM_APP() ELSE iCurrentChopCollar = 4 ENDIF 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 // 1st download help PROC DO_FIRST_DOWNLOAD_HELP() IF NOT bShownFirstDownloadHelp AND NOT bFirstDownloadHelpOnCutscene IF NOT HAS_PLAYER_USED_CHOP_APP() IF GET_GAME_TIMER() >= iStageStartTime + 5000 #IF NOT FEATURE_GEN9_STANDALONE // url:bugstar:7806385 App currently not supported in Gen9. IF DO_MISSION_HELP_TEXT("FC_DOWNLHLP", FALSE) #ENDIF IF IS_CUTSCENE_PLAYING() bFirstDownloadHelpOnCutscene = TRUE ENDIF bShownFirstDownloadHelp = TRUE #IF NOT FEATURE_GEN9_STANDALONE ENDIF #ENDIF ENDIF ELSE bShownFirstDownloadHelp = TRUE ENDIF ENDIF ENDPROC // initialise mission FUNC BOOL INIT_MISSION() SWITCH missionInitStage CASE MISSION_INIT_PRE_INTRO SET_PED_NON_CREATION_AREA(<<-61.06803, -1462.89331, 11.02068>>, <<5.86775, -1444.14880, 49.55160>>) REMOVE_MISSION_TEXT() SUPPRESS_MISSION_MODELS(TRUE) SET_PLAYER_CONTROL(PLAYER_ID(), FALSE, SPC_LEAVE_CAMERA_CONTROL_ON) chopBehaviour = GET_CHOP_BEHAVIOUR_FROM_APP() SET_CHOP_COLLAR() IF IS_PLAYER_PED_AVAILABLE(CHAR_TREVOR) SET_PLAYER_PED_AVAILABLE(CHAR_TREVOR, FALSE) bSetTrevorUnavailable = TRUE ENDIF SET_WEATHER_TYPE_OVERTIME_PERSIST("extrasunny", 30.0) // clear franklin bike gen //DISABLE_VEHICLE_GEN_ON_MISSION(TRUE) // custom SWITCH icon SET_SELECTOR_PED_ICON(sSelectorPeds, SELECTOR_PED_MICHAEL, SELECTOR_ICON_CHOP) chopViewCamData.selectorSlot = SELECTOR_PED_MICHAEL chopViewCamData.chopMission = CHOP_MISSION_FRANKLIN0 g_bBlockShopRoberies = TRUE chopViewCamData.bNeverTrevor = TRUE entranceScenarioBlocking = ADD_SCENARIO_BLOCKING_AREA(<<480.4, -776.7, -100>>, <<569.3, -610.7, 76>>) recScenarioBlocking = ADD_SCENARIO_BLOCKING_AREA(<<-225.51924, -1513.04578, -100>>, <<-218.96721, -1507.19189, 100.46210>>) alleyScenarioBlocking = ADD_SCENARIO_BLOCKING_AREA(<<-91.34664, -1457.38464, 0>>, <<-73.12756, -1381.66003, 100.33570>>) outsideYardScenarioBlocking = ADD_SCENARIO_BLOCKING_AREA(<<449.96005, -698.94513, 0.66434>>, <<467.13477, -680.62457, 100.33570>>) offPathScenarioBlocking = ADD_SCENARIO_BLOCKING_AREA(<<454.75815, -817.23328, 0.70810>>, <<459.41602, -685.39819, 56.66263>>) // replay attempt IF NOT Is_Replay_In_Progress() iReplayAttempt = 0 ELSE iReplayAttempt = g_savedGlobals.sFlow.missionSavedData[SP_MISSION_FRANKLIN_0].missionFailsNoProgress + 1 ENDIF 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 PREVENT_WANTED_LEVEL_FOR_CUTSCENE() CONST_INT FRANKLIN0_STREAMING_SPECIAL_CUT 4 IF IS_BIT_SET(g_sTriggerSceneAssets.id, FRANKLIN0_STREAMING_SPECIAL_CUT) REQUEST_CUTSCENE_WITH_PLAYBACK_LIST(GET_FRANKLIN0_INTRO_CUTSCENE_NAME(), CS_SECTION_1|CS_SECTION_3|CS_SECTION_4) ELSE REQUEST_CUTSCENE_WITH_PLAYBACK_LIST(GET_FRANKLIN0_INTRO_CUTSCENE_NAME(), CS_SECTION_2|CS_SECTION_3|CS_SECTION_4) ENDIF missionInitStage = MISSION_INIT_WAIT_FOR_INTRO ELSE STOP_CUTSCENE() DO_MISSION_INIT_START_MISSION() ENDIF BREAK CASE MISSION_INIT_WAIT_FOR_INTRO SET_ALL_RANDOM_PEDS_FLEE_THIS_FRAME(PLAYER_ID()) IF DO_TIMELAPSE(SP_MISSION_FRANKLIN_0, sTimelapse, FALSE, FALSE) IF HAS_CUTSCENE_LOADED_WITH_FAILSAFE() // register entities and start cutscene REGISTER_ENTITY_FOR_CUTSCENE(PLAYER_PED_ID(), "Franklin", CU_ANIMATE_EXISTING_SCRIPT_ENTITY, GET_MODEL_FOR_HOOD_MODEL_ENUM(HM_FRANKLIN)) REGISTER_ENTITY_FOR_CUTSCENE(lamarPed, "Lamar", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, GET_MODEL_FOR_HOOD_MODEL_ENUM(HM_LAMAR)) printstring("registered lamar!") printnl() REGISTER_ENTITY_FOR_CUTSCENE(chopPed, "Chop", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, GET_MODEL_FOR_HOOD_MODEL_ENUM(HM_CHOP)) MISSION_FLOW_RELEASE_TRIGGER_SCENE_ASSETS(SP_MISSION_FRANKLIN_0) START_CUTSCENE() REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST) SET_CUTSCENE_FADE_VALUES(FALSE, FALSE, FALSE, FALSE) missionInitStage = MISSION_INIT_PLAY_INTRO ENDIF ELSE IF NOT bRepositionedPlayerForTOD IF DOES_CAM_EXIST(sTimelapse.splineCamera) IF STREAMVOL_IS_VALID(missionStreamingVolume) STREAMVOL_DELETE(missionStreamingVolume) ENDIF missionStreamingVolume = STREAMVOL_CREATE_FRUSTUM(<<-13.6, -1449.2, 31.1>>, CONVERT_ROTATION_TO_DIRECTION_VECTOR(<<-0.7, 0.8, 4.3>>), 30, FLAG_MAPDATA) bWasTimeLapseRunning = TRUE printstring("set Timelapse") printnl() RESOLVE_FOR_CUTSCENE() //CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID()) //SET_ENTITY_COORDS(PLAYER_PED_ID(), <<8.40950, -1453.26440, 29.51403>>) bRepositionedPlayerForTOD = TRUE ENDIF ENDIF ENDIF BREAK CASE MISSION_INIT_PLAY_INTRO SET_ALL_RANDOM_PEDS_FLEE_THIS_FRAME(PLAYER_ID()) DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_JUMP) IF NOT bClearedForCutscene IF IS_CUTSCENE_PLAYING() IF bWasTimeLapseRunning SET_TODS_CUTSCENE_RUNNING(sTimelapse, FALSE) ENDIF SET_MISSION_MOCAP_CUTSCENE() REQUEST_TEXT(FALSE) DELETE_ALL_TRAINS() IF IS_REPLAY_START_VEHICLE_UNDER_SIZE_LIMIT(<<0,0,0>>, TRUE) VEHICLE_INDEX thisVehicle thisVehicle = GET_MISSION_START_VEHICLE_INDEX() IF IS_VEHICLE_DRIVEABLE(thisVehicle) IF GET_ENTITY_MODEL(thisVehicle) = SPEEDO IF GET_VEHICLE_COLOUR_COMBINATION(thisVehicle) = 5 SET_ENTITY_AS_MISSION_ENTITY(thisVehicle) DELETE_VEHICLE(thisVehicle) ENDIF ENDIF ENDIF SET_MISSION_START_VEHICLE_AS_VEHICLE_GEN(GET_HOOD_VECTOR(HVEC_MOVE_LAST_PLAYER_VEHICLE), MOVE_LAST_PLAYER_VEHICLE_ROT, FALSE) //SET_MISSION_START_VEHICLE_AS_VEHICLE_GEN(<<0,0,0>>, 0) ENDIF RESOLVE_FOR_CUTSCENE() CLEAR_AREA_OF_PROJECTILES(<<-14.20779, -1448.72607, 30.01975>>, 25) STOP_FIRE_IN_RANGE(<<-14.20779, -1448.72607, 30.01975>>, 25) REMOVE_PARTICLE_FX_IN_RANGE(<<-14.20779, -1448.72607, 30.01975>>, 25) CLEAR_AREA_OF_OBJECTS(<<-14.20779, -1448.72607, 30.01975>>, 25, CLEAROBJ_FLAG_FORCE) //DELETE_VEHICLE_GEN_VEHICLES_IN_AREA(<< -25.4577, -1436.6381, 29.6542 >>, 100) //RESOLVE_VEHICLES_AT_MISSION_TRIGGER() SET_FRANKLIN_MASK(FALSE) SET_LAMAR_MASK(FALSE) IF STREAMVOL_IS_VALID(missionStreamingVolume) STREAMVOL_DELETE(missionStreamingVolume) ENDIF // clear the area //CLEAR_AREA(<<-14.41, -1442.56, 30.10>>, 20, TRUE) IF IS_SCREEN_FADED_OUT() DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME) ENDIF bClearedForCutscene = TRUE ENDIF ENDIF IF WAS_CUTSCENE_SKIPPED() bSkippedCutscene = TRUE ENDIF // download help IF GET_CUTSCENE_TIME() >= 55554 AND NOT bSkippedCutscene DO_FIRST_DOWNLOAD_HELP() ENDIF //IF GET_CUTSCENE_TIME() >= 69205 // DISABLE_CONTROL_ACTION(FRONTEND_CONTROL, INPUT_SKIP_CUTSCENE) //ENDIF // get cutscene-created peds IF NOT DOES_ENTITY_EXIST(lamarPed) //PRINTSTRING("lamar does not exist") printnl() IF DOES_ENTITY_EXIST(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Lamar")) PRINTSTRING("GRABBED LAMAR") printnl() lamarPed = GET_PED_INDEX_FROM_ENTITY_INDEX(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Lamar")) ENDIF ENDIF IF NOT DOES_ENTITY_EXIST(chopPed) IF DOES_ENTITY_EXIST(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Chop")) PRINTSTRING("GRABBED CHOP") printnl() chopPed = GET_PED_INDEX_FROM_ENTITY_INDEX(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Chop")) //SET_CUTSCENE_PED_COMPONENT_VARIATION("Chop", PED_COMP_TORSO, 0, 1) //SET_CUTSCENE_PED_COMPONENT_VARIATION("Chop", PED_COMP_LEG, 0, 0) ENDIF ENDIF //ENTITY_INDEX introEntity // preload assets IF GET_CUTSCENE_TIME() >= 40000 DO_STREAMING_FOR_NEXT_MISSION_STAGE(TRUE) ENDIF // pre-create mission entities not involved in cut IF NOT bDoneIntroCreateEntities IF streamingStage = MISSION_STREAMING_STAGE_COMPLETE IF NOT bDoneIntroClearStart CLEAR_START_AREA() bDoneIntroClearStart = TRUE ELSE CREATE_PLAYER_CHARACTERS_WITH_TRANSPORT_IN_MISSION_STAGE(STAGE_GET_TO_BAD_GUY) bDoneIntroCreateEntities = TRUE ENDIF ENDIF ENDIF IF NOT bSkippedCutscene IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Lamar") IF NOT IS_PED_INJURED(lamarPed) SET_ENTITY_COORDS(lamarPed, GET_HOOD_VECTOR(HVEC_LAMAR_WALK_INIT)) ENDIF SETUP_LAMAR_FOR_WALK() ENDIF IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Chop") IF NOT IS_PED_INJURED(chopPed) SET_ENTITY_COORDS(chopPed, GET_HOOD_VECTOR(HVEC_CHOP_WALK_INIT)) ENDIF SETUP_CHOP_FOR_WALK() ENDIF ENDIF IF CAN_SET_EXIT_STATE_FOR_CAMERA() SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0) ENDIF // set exit state IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Franklin") IF bSkippedCutscene POSITION_PLAYER_AT_MISSION_INIT() ENDIF SETUP_PLAYER_FOR_WALK() ELSE IF GET_FOLLOW_PED_CAM_VIEW_MODE() <> CAM_VIEW_MODE_FIRST_PERSON SET_PED_MIN_MOVE_BLEND_RATIO(PLAYER_PED_ID(), PEDMOVE_WALK) ELSE SIMULATE_PLAYER_INPUT_GAIT(PLAYER_ID(), PEDMOVE_WALK, 2000) ENDIF ENDIF IF NOT IS_CUTSCENE_PLAYING() IF DOES_CAM_EXIST(sTimelapse.splineCamera) DESTROY_CAM(sTimelapse.splineCamera) ENDIF REPLAY_STOP_EVENT() bSkippedIntro = bSkippedCutscene SET_MISSION_CUTSCENE(FALSE, TRUE, -1, FALSE, TRUE, FALSE) DO_MISSION_INIT_START_MISSION() DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_JUMP) ENDIF #IF IS_DEBUG_BUILD DEBUG_SKIP_MOCAP() #ENDIF BREAK CASE MISSION_INIT_DONE RETURN TRUE BREAK ENDSWITCH RETURN FALSE ENDFUNC // all player peds block non-temporary events PROC REAPPLY_PLAYER_PED_ATTRIBUTES() INT i REPEAT COUNT_OF(sSelectorPeds.pedID) i IF NOT IS_PED_INJURED(sSelectorPeds.pedID[i]) SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sSelectorPeds.pedID[i], TRUE) SET_PED_RELATIONSHIP_GROUP_HASH(sSelectorPeds.pedID[i], RELGROUPHASH_PLAYER) ENDIF ENDREPEAT 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, "FKN0_WALK") OR ARE_STRINGS_EQUAL(tBanter, "FKN0_WALK2") OR ARE_STRINGS_EQUAL(tBanter, "FKN0_B1AV1") OR ARE_STRINGS_EQUAL(tBanter, "FKN0_B1AV2") OR ARE_STRINGS_EQUAL(tBanter, "FKN0_B2AV1") OR ARE_STRINGS_EQUAL(tBanter, "FKN0_B2AV2") OR ARE_STRINGS_EQUAL(tBanter, "FKN0_B3AV1") OR ARE_STRINGS_EQUAL(tBanter, "FKN0_NOARM2") 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(hoodConversation, "FKN0AUD", tSavedBanterRoot, tResumeBanterLabel, CONV_PRIORITY_HIGH) RETURN TRUE ENDIF ENDIF ELSE RETURN TRUE ENDIF RETURN FALSE ENDFUNC // handle lamar reaction to damaging vehicle PROC HANDLE_LAMAR_REACTION_TO_DAMAGE() INT iCurrentVanHealth = GET_ENTITY_HEALTH(hoodVehicle[HV_FRANKLIN_VAN]) IF NOT bTriggeredLamarDamageReaction //PRINTSTRING("checking = ") PRINTINT(ICurrentVanHealth) PRINTNL() IF iCurrentVanHealth < iCachedVanHealth IF GET_GAME_TIMER() >= iNextCheckVanHealthTime iNextCheckVanHealthTime = GET_GAME_TIMER() + 800 bTriggeredLamarDamageReaction = TRUE ENDIF ENDIF iCachedVanHealth = iCurrentVanHealth ELSE IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), hoodVehicle[HV_FRANKLIN_VAN]) STRING sString IF NOT bDoneAreYouOKChopSpeech sString = "FKN0_CRASH" ELSE sString = "FC_WARNF" ENDIF IF DO_MISSION_SPEECH(sString) bDoneAreYouOKChopSpeech = TRUE bTriggeredLamarDamageReaction = FALSE iCachedVanHealth = iCurrentVanHealth iNextCheckVanHealthTime = GET_GAME_TIMER() + 12000 ELSE IF GET_GAME_TIMER() >= iNextCheckVanHealthTime iCachedVanHealth = iCurrentVanHealth bTriggeredLamarDamageReaction = FALSE ENDIF ENDIF ELSE iCachedVanHealth = iCurrentVanHealth bTriggeredLamarDamageReaction = FALSE ENDIF ENDIF ENDPROC // handle text for in car PROC HANDLE_IN_CAR_PROMPTS(BOOL bDisplayDestinationBlip = TRUE, BOOL bLamarInGroup = FALSE, BOOL bEnforceWantedLevel = FALSE, BOOL bAddToGroup = TRUE) BOOL bPlayerVanOK = TRUE BOOL bLamarVanOK = TRUE BOOL bLamarGroupOK = TRUE BOOL bWantedLevelOK = TRUE BOOL bAllOK = FALSE IF bLamarInGroup IF NOT IS_PED_INJURED(lamarPed) IF NOT IS_PED_GROUP_MEMBER(lamarPed, PLAYER_GROUP_ID()) AND NOT (currentMissionStage = STAGE_GET_TO_BAD_GUY AND chopIntoVanState < CHOP_INTO_VAN_STATE_DONE) IF NOT bForcedIntoVan bLamarGroupOK = FALSE ENDIF ENDIF ENDIF ENDIF IF IS_VEHICLE_DRIVEABLE(hoodVehicle[HV_FRANKLIN_VAN]) IF bLamarInGroup OR NOT bLamarWasInGroup IF NOT IS_PED_INJURED(lamarPed) IF NOT IS_PED_IN_VEHICLE(lamarPed, hoodVehicle[HV_FRANKLIN_VAN]) IF NOT bForcedIntoVan bLamarVanOK = FALSE ENDIF ENDIF ENDIF ENDIF IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), hoodVehicle[HV_FRANKLIN_VAN]) bPlayerVanOK = FALSE ENDIF ENDIF IF bEnforceWantedLevel IF GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) > 0 bWantedLevelOK = FALSE ENDIF ENDIF IF bLamarGroupOK // lamar is group member / not required to be in group IF bPlayerVanOK // player is in vehicle IF iGetInTextStage < 2 iGetInTextStage = 2 ENDIF IF bLamarVanOK bDoneReturnSpeech = FALSE IF bWantedLevelOk bRemovedBlipsForWanted = FALSE IF currentMissionStage <> STAGE_GET_TO_HOUSE OR dropoffStage <= DROPOFF_STAGE_POST_CALL // only want wanted speech once here bDoneLoseWantedSpeech = FALSE ENDIF bShownLoseWantedPrompt = FALSE // lamar is in the vehicle / not required to be in vehicle IF currentMissionStage = STAGE_GET_TO_BAD_GUY OR currentMissionStage = STAGE_GET_TO_HOUSE bAllOK = TRUE bCheckedKillBanter = FALSE //blip the destination IF NOT DOES_BLIP_EXIST(destinationBlip) IF bDisplayDestinationBlip REMOVE_MISSION_TEXT(FALSE, TRUE, FALSE) REMOVE_ALL_BLIPS() VECTOR vBlipPos SWITCH currentMissionStage CASE STAGE_GET_TO_BAD_GUY vBlipPos = GET_HOOD_VECTOR(HVEC_BAD_GUY_HANGOUT) BREAK CASE STAGE_GET_TO_HOUSE IF dropoffStage < DROPOFF_STAGE_STOP_VAN vBlipPos = GET_HOOD_VECTOR(HVEC_HOUSE) ELSE vBlipPos = GET_HOOD_VECTOR(HVEC_REC) ENDIF BREAK ENDSWITCH destinationBlip = CREATE_MISSION_BLIP_FOR_COORD(vBlipPos, TRUE) ENDIF ENDIF IF DOES_BLIP_EXIST(franklinVanBlip) REMOVE_BLIP(franklinVanBlip) ENDIF // display god text IF NOT bShownGodText IF bDoneGotoSpeech SWITCH currentMissionStage CASE STAGE_GET_TO_BAD_GUY bShownGodText = DO_MISSION_GOD_TEXT("FC_GOVINEW") BREAK CASE STAGE_GET_TO_HOUSE IF dropoffStage < DROPOFF_STAGE_STOP_VAN bShownGodText = DO_MISSION_GOD_TEXT("FC_GOHOUSE1") ELSE IF dropoffStage >= DROPOFF_STAGE_END bShownGodText = DO_MISSION_GOD_TEXT("FC_GOREC") ENDIF ENDIF BREAK ENDSWITCH ENDIF ENDIF ELSE // blip the bad guy car IF NOT DOES_BLIP_EXIST(badGuyCarBlip) AND NOT DOES_BLIP_EXIST(runnerBlip) IF IS_VEHICLE_DRIVEABLE(hoodVehicle[HV_BAD_GUY_BIKE]) AND NOT IS_PED_INJURED(runnerChaseProperties.ped) IF CAN_ADVANCE_MISSION() REMOVE_MISSION_TEXT(FALSE, TRUE, FALSE) REMOVE_ALL_BLIPS() IF IS_PED_IN_ANY_VEHICLE(runnerChaseProperties.ped) badGuyCarBlip = CREATE_MISSION_BLIP_FOR_VEHICLE(hoodVehicle[HV_BAD_GUY_BIKE], TRUE) ELSE runnerBlip = CREATE_MISSION_BLIP_FOR_PED(runnerChaseProperties.ped, TRUE) ENDIF IF NOT bShownGodText //DO_MISSION_GOD_TEXT("FC_CHASE") bShownGodText = TRUE ENDIF ENDIF ENDIF ENDIF ENDIF ELSE IF NOT bRemovedBlipsForWanted REMOVE_ALL_BLIPS() bRemovedBlipsForWanted = TRUE ELSE REMOVE_VAN_BLIP_AND_TEXT() ENDIF IF NOT bDoneLoseWantedSpeech IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), hoodVehicle[HV_FRANKLIN_VAN]) IF bCheckedKillBanter IF currentMissionStage = STAGE_GET_TO_BAD_GUY bDoneLoseWantedSpeech = DO_MISSION_SPEECH("FC_WANTBEF") ELIF currentMissionStage = STAGE_GET_TO_HOUSE AND dropoffStage = DROPOFF_STAGE_STOP_VAN IF iLoseWantedTime < 0 iLoseWantedTime = GET_GAME_TIMER() ELSE IF GET_GAME_TIMER() >= iLoseWantedTime + 1500 bDoneLoseWantedSpeech = DO_MISSION_SPEECH("FC_WANTED") ENDIF ENDIF ELIF currentMissionStage = STAGE_GET_TO_HOUSE AND dropoffStage <= DROPOFF_STAGE_POST_CALL bDoneLoseWantedSpeech = DO_MISSION_SPEECH("FC_WANTVAN") ELSE bDoneLoseWantedSpeech = TRUE ENDIF ENDIF ELSE bDoneLoseWantedSpeech = TRUE ENDIF ELSE IF NOT bShownLoseWantedPrompt bShownLoseWantedPrompt = DO_MISSION_GOD_TEXT("LOSE_WANTED") SET_NEXT_RANDOM_SPEECH_TIME(10000) ENDIF ENDIF ENDIF ELSE // lamar is not in the vehicle - blip him IF NOT DOES_BLIP_EXIST(lamarBlip) REMOVE_MISSION_TEXT(FALSE, TRUE, FALSE) REMOVE_ALL_BLIPS() lamarBlip = CREATE_MISSION_BLIP_FOR_PED(lamarPed) ENDIF IF NOT bDoneWaitForLamarPrompt bDoneWaitForLamarPrompt = DO_MISSION_GOD_TEXT("FC_WAIT") ENDIF ENDIF ELSE IF NOT DOES_BLIP_EXIST(franklinVanBlip) REMOVE_MISSION_TEXT(FALSE, TRUE, FALSE) REMOVE_ALL_BLIPS() IF iGetInTextStage = 0 OR iGetInTextStage = 2 bShouldDoGetInText = TRUE ENDIF franklinVanBlip = CREATE_MISSION_BLIP_FOR_VEHICLE(hoodVehicle[HV_FRANKLIN_VAN]) ENDIF IF bShouldDoGetInText IF bDoneReturnSpeech STRING sGetInString SWITCH iGetInTextStage CASE 0 sGetInString = "FC_GOVAN1" BREAK CASE 2 sGetInString = "FC_GOVAN2" BREAK ENDSWITCH IF DO_MISSION_GOD_TEXT(sGetInString) bShouldDoGetInText = FALSE REPLAY_RECORD_BACK_FOR_TIME(4.0, 4.0, REPLAY_IMPORTANCE_HIGH) iGetInTextStage++ ENDIF ENDIF ENDIF // special case return speech IF NOT bDoneReturnSpeech IF bCheckedKillBanter IF currentMissionStage = STAGE_VAN_CHASE AND NOT IS_PED_IN_VEHICLE(lamarPed, hoodVehicle[HV_FRANKLIN_VAN]) bDoneReturnSpeech = DO_MISSION_SPEECH("FC_VANNOW") ELSE IF currentMissionStage <> STAGE_GET_TO_BAD_GUY OR bDoneLamarIntoVan bDoneReturnSpeech = DO_MISSION_SPEECH("FC_FGOTOUT") ELSE bDoneReturnSpeech = TRUE ENDIF ENDIF ENDIF ENDIF ENDIF ELSE // lamar is not group member IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), lamarPed, <<12, 12, 6>>) // re-add to group IF bAddToGroup IF chopIntoVanState = CHOP_INTO_VAN_STATE_DONE OR currentMissionStage > STAGE_GET_TO_BAD_GUY SET_PED_AS_GROUP_MEMBER(lamarPed, PLAYER_GROUP_ID()) ENDIF ENDIF ELSE // do blip and god text IF NOT DOES_BLIP_EXIST(lamarBlip) REMOVE_MISSION_TEXT(FALSE, TRUE, FALSE) REMOVE_ALL_BLIPS() lamarBlip = CREATE_MISSION_BLIP_FOR_PED(lamarPed) ENDIF IF NOT bDoneGetLamarPrompt bDoneGetLamarPrompt = DO_MISSION_GOD_TEXT("FC_LEAVE") ENDIF ENDIF ENDIF IF bAllOK IF IS_PLAYER_BROWSING_ITEMS_IN_ANY_SHOP() bAllOK = FALSE ENDIF ENDIF IF NOT bAllOK IF NOT bSavedBanter IF STORE_BANTER() KILL_ANY_CONVERSATION() ENDIF bCheckedKillBanter = TRUE ENDIF ENDIF ENDPROC // is player threatening ped? FUNC BOOL IS_PLAYER_THREATENING_PED(PED_INDEX ped, BOOL bDoShootingInAreaCheck = TRUE) VECTOR vPos vPos = GET_ENTITY_COORDS(ped) IF IS_PLAYER_TARGETTING_ENTITY(PLAYER_ID(), ped) OR IS_PLAYER_FREE_AIMING_AT_ENTITY(PLAYER_ID(), ped) IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), vPos, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(ped, <<0,20,0>>), 8, FALSE, FALSE) RETURN TRUE ENDIF ENDIF IF bDoShootingInAreaCheck IF IS_PED_SHOOTING_IN_AREA(PLAYER_PED_ID(), vPos - <<35,35,35>>, vPos + <<35,35,35>>, FALSE, FALSE) RETURN TRUE ENDIF ENDIF IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(ped, PLAYER_PED_ID()) RETURN TRUE ENDIF RETURN FALSE ENDFUNC FUNC VECTOR GET_CHASE_ANIM_COORDS(CHASE_ANIM_ENUM getAnim) SWITCH getAnim CASE CHASE_ANIM_G_TOP_FENCE //RETURN <<477.92, -582.25, 27.51>> RETURN <<475.59, -586.06, 27.51>> BREAK CASE CHASE_ANIM_G_DOWN_CONTAINER RETURN <<487.07, -569.60, 28.46>> BREAK CASE CHASE_ANIM_G_OVER_CAR RETURN <<493.20, -545.27, 23.75>> BREAK CASE CHASE_ANIM_G_OVER_YARD_FENCE RETURN <<493.80, -523.79, 23.75>> BREAK CASE CHASE_ANIM_G_FLATBEDS RETURN <<531.66, -502.47, 23.80>> BREAK CASE CHASE_ANIM_G_BOXCAR RETURN <<555.470, -504.140, 23.800>> BREAK CASE CHASE_ANIM_G_ONTO_TRAIN RETURN <<552.98, -564.71, 23.83>> BREAK CASE CHASE_ANIM_F_THROUGH_YARD_FENCE RETURN <<493.38, -519.92, 24.25>> BREAK CASE CHASE_ANIM_C_TOP_FENCE RETURN <<478.300, -582.000, 27.850>> BREAK CASE CHASE_ANIM_C_OFF_ROOF RETURN <<486.530, -570.450, 28.700>> BREAK CASE CHASE_ANIM_C_OVER_CAR RETURN <<492.530, -544.550, 24.180>> BREAK CASE CHASE_ANIM_C_FLATBEDS RETURN <<532.000, -501.100, 24.250>> BREAK CASE CHASE_ANIM_C_BOXCAR RETURN <<556.720, -503.840, 24.250>> BREAK ENDSWITCH RETURN <<0,0,0>> ENDFUNC FUNC VECTOR GET_CHASE_IDEAL_ANIM_COORDS(CHASE_ANIM_ENUM getAnim) SWITCH getAnim CASE CHASE_ANIM_G_TOP_FENCE RETURN <<475.450, -585.300, 28.560>> BREAK CASE CHASE_ANIM_G_DOWN_CONTAINER RETURN <<486.800, -569.620, 29.130>> BREAK CASE CHASE_ANIM_G_OVER_CAR RETURN <<492.630, -544.440, 24.75>> BREAK CASE CHASE_ANIM_G_OVER_YARD_FENCE RETURN <<493.74, -524.130, 24.75>> BREAK CASE CHASE_ANIM_G_FLATBEDS RETURN <<530.870, -502.050, 24.830>> BREAK CASE CHASE_ANIM_G_BOXCAR RETURN <<555.470, -504.140, 24.800>> BREAK CASE CHASE_ANIM_G_ONTO_TRAIN RETURN <<549.06, -565.13, 24.75>> BREAK CASE CHASE_ANIM_F_THROUGH_YARD_FENCE RETURN <<493.38, -519.92, 25.25>> BREAK CASE CHASE_ANIM_C_TOP_FENCE RETURN <<478.300, -582.000, 27.950>> BREAK CASE CHASE_ANIM_C_OFF_ROOF RETURN <<486.530, -570.450, 28.700>> BREAK CASE CHASE_ANIM_C_OVER_CAR RETURN <<492.530, -544.550, 24.180>> BREAK CASE CHASE_ANIM_C_FLATBEDS RETURN <<532.000, -501.100, 24.250>> BREAK CASE CHASE_ANIM_C_BOXCAR RETURN <<556.690, -503.840, 24.190>> BREAK ENDSWITCH RETURN <<0,0,0>> ENDFUNC FUNC FLOAT GET_CHASE_ANIM_HEADING(CHASE_ANIM_ENUM getAnim) SWITCH getAnim CASE CHASE_ANIM_G_TOP_FENCE RETURN -96.59 BREAK CASE CHASE_ANIM_G_DOWN_CONTAINER RETURN 7.300 BREAK CASE CHASE_ANIM_G_OVER_CAR RETURN -8.93 BREAK CASE CHASE_ANIM_G_OVER_YARD_FENCE CASE CHASE_ANIM_F_THROUGH_YARD_FENCE RETURN -4.64 BREAK CASE CHASE_ANIM_G_FLATBEDS RETURN -96.770 BREAK CASE CHASE_ANIM_G_BOXCAR RETURN -99.36 BREAK CASE CHASE_ANIM_G_ONTO_TRAIN RETURN 79.23 BREAK CASE CHASE_ANIM_F_OFF_ROOF RETURN -6.37 BREAK CASE CHASE_ANIM_C_TOP_FENCE RETURN -110.000 BREAK CASE CHASE_ANIM_C_OFF_ROOF RETURN -30.000 BREAK CASE CHASE_ANIM_C_OVER_CAR RETURN -4.000 BREAK CASE CHASE_ANIM_C_FLATBEDS RETURN -97.330 BREAK CASE CHASE_ANIM_C_BOXCAR RETURN -96.500 BREAK ENDSWITCH RETURN 0.0 ENDFUNC FUNC FLOAT GET_CHASE_IDEAL_ANIM_HEADING(CHASE_ANIM_ENUM getAnim) SWITCH getAnim CASE CHASE_ANIM_G_TOP_FENCE RETURN -95.660 BREAK CASE CHASE_ANIM_G_DOWN_CONTAINER RETURN -8.0 BREAK CASE CHASE_ANIM_G_OVER_CAR RETURN -3.000 BREAK CASE CHASE_ANIM_G_OVER_YARD_FENCE RETURN -3.99 BREAK CASE CHASE_ANIM_G_FLATBEDS RETURN -96.59 BREAK CASE CHASE_ANIM_G_BOXCAR RETURN -97.530 BREAK CASE CHASE_ANIM_G_ONTO_TRAIN RETURN 79.23 BREAK CASE CHASE_ANIM_F_OFF_ROOF RETURN -6.37 BREAK CASE CHASE_ANIM_C_TOP_FENCE RETURN -110.000 BREAK CASE CHASE_ANIM_C_OFF_ROOF RETURN -30.000 BREAK CASE CHASE_ANIM_C_OVER_CAR RETURN -4.000 BREAK CASE CHASE_ANIM_C_FLATBEDS RETURN -97.330 BREAK CASE CHASE_ANIM_C_BOXCAR RETURN -96.500 BREAK ENDSWITCH RETURN 0.0 ENDFUNC FUNC BOOL IS_PED_AT_EMERGENCY_CHASE_ANIM_TRIGGER(PED_INDEX ped, CHASE_ANIM_ENUM thisAnim) IF NOT IS_PED_INJURED(ped) VECTOR vPedCoords = GET_ENTITY_COORDS(ped) SWITCH thisAnim CASE CHASE_ANIM_G_TOP_FENCE IF vPedCoords.x >= 475.59 RETURN TRUE ENDIF BREAK CASE CHASE_ANIM_G_DOWN_CONTAINER IF vPedCoords.y >= -569.60 RETURN TRUE ENDIF BREAK CASE CHASE_ANIM_G_OVER_CAR IF vPedCoords.y >= -545.27 RETURN TRUE ENDIF BREAK CASE CHASE_ANIM_G_OVER_YARD_FENCE IF vPedCoords.y >= -523.79 RETURN TRUE ENDIF BREAK CASE CHASE_ANIM_G_FLATBEDS IF vPedCoords.x >= 531.66 RETURN TRUE ENDIF BREAK CASE CHASE_ANIM_G_BOXCAR IF vPedCoords.x >= 555.470 RETURN TRUE ENDIF BREAK CASE CHASE_ANIM_G_ONTO_TRAIN IF vPedCoords.x <= 552.98 RETURN TRUE ENDIF BREAK CASE CHASE_ANIM_F_OFF_ROOF RETURN FALSE BREAK CASE CHASE_ANIM_C_TOP_FENCE IF vPedCoords.x >= 478.300 RETURN TRUE ENDIF BREAK CASE CHASE_ANIM_C_OFF_ROOF IF vPedCoords.y >= -570.450 RETURN TRUE ENDIF BREAK CASE CHASE_ANIM_C_OVER_CAR IF vPedCoords.y >= -544.550 RETURN TRUE ENDIF BREAK CASE CHASE_ANIM_C_FLATBEDS IF vPedCoords.x >= 532.000 RETURN TRUE ENDIF BREAK CASE CHASE_ANIM_C_BOXCAR IF vPedCoords.x >= 556.720 RETURN TRUE ENDIF BREAK ENDSWITCH ENDIF RETURN FALSE ENDFUNC FUNC VECTOR GET_CHASE_ANIM_DIMENSIONS(CHASE_ANIM_ENUM getAnim) SWITCH getAnim CASE CHASE_ANIM_C_TOP_FENCE BREAK ENDSWITCH RETURN <<0.5, 0.5, 2.5>> ENDFUNC FUNC STRING GET_CHASE_ANIM_NAME(CHASE_ANIM_ENUM getAnim) SWITCH getAnim CASE CHASE_ANIM_G_TOP_FENCE RETURN "ballasog_fenceclimb" BREAK CASE CHASE_ANIM_G_DOWN_CONTAINER RETURN "ballasog_containerrun" BREAK CASE CHASE_ANIM_G_OVER_CAR RETURN "ballasog_carbonnetslide" BREAK CASE CHASE_ANIM_G_OVER_YARD_FENCE RETURN "ballasog_fenceclimb_ig4" BREAK CASE CHASE_ANIM_F_THROUGH_YARD_FENCE RETURN "franklin_wallcrash" BREAK CASE CHASE_ANIM_G_FLATBEDS RETURN "ballasog_hoptrainbreak_ig5" BREAK CASE CHASE_ANIM_G_BOXCAR //RETURN "ballasog_rollthroughtraincar_ig6" RETURN "ballasog_rollthroughtraincar_ig6_in" BREAK CASE CHASE_ANIM_G_WAITING_ON_GROUND RETURN "ballasog_rollthroughtraincar_ig6_loop" BREAK CASE CHASE_ANIM_G_GET_UP_FROM_GROUND RETURN "ballasog_rollthroughtraincar_ig6_out" BREAK CASE CHASE_ANIM_G_ONTO_TRAIN RETURN "ballasog_jumpontrain_ig7" BREAK CASE CHASE_ANIM_C_TOP_FENCE RETURN "FRA_0_IG_8_P1_CHOP_JUMPS_UNDER_FENCE" BREAK CASE CHASE_ANIM_C_OFF_ROOF RETURN "FRA_0_CHOP_JUMPS_DOWN" BREAK CASE CHASE_ANIM_C_OVER_CAR RETURN "FRA_0_IG_9_CHOP_JUMP_OVER_CAR_HOOD" BREAK CASE CHASE_ANIM_C_FLATBEDS RETURN "FRA_0_IG_10_CHOP_JUMPS_OVER_FLATBED" BREAK CASE CHASE_ANIM_C_BOXCAR RETURN "FRA_0_IG_11_CHOP_JUMPS_THROUGH_BOXCAR" BREAK ENDSWITCH RETURN "invalid" ENDFUNC FUNC CHASE_ANIM_ENUM GET_NEXT_CHASE_ANIM_FOR_RUNNER() SWITCH runnerStage CASE RUNNER_START_FLEE RETURN CHASE_ANIM_G_TOP_FENCE BREAK CASE RUNNER_TO_CONTAINER RETURN CHASE_ANIM_G_DOWN_CONTAINER BREAK CASE RUNNER_TO_CAR RETURN CHASE_ANIM_G_OVER_CAR BREAK CASE RUNNER_TO_FENCE RETURN CHASE_ANIM_G_OVER_YARD_FENCE BREAK CASE RUNNER_TO_FLATBEDS RETURN CHASE_ANIM_G_FLATBEDS BREAK CASE RUNNER_TO_BOXCAR RETURN CHASE_ANIM_G_BOXCAR BREAK ENDSWITCH RETURN CHASE_ANIM_BAD ENDFUNC FUNC CHASE_ANIM_ENUM GET_NEXT_CHASE_ANIM_FOR_CHOP() SWITCH chopStage CASE CHOP_START_CHASE RETURN CHASE_ANIM_C_TOP_FENCE BREAK CASE CHOP_TO_ROOF_EDGE RETURN CHASE_ANIM_C_OFF_ROOF BREAK CASE CHOP_TO_CAR RETURN CHASE_ANIM_C_OVER_CAR BREAK CASE CHOP_TO_FENCE RETURN CHASE_ANIM_C_FLATBEDS BREAK CASE CHOP_TO_FLATBEDS RETURN CHASE_ANIM_C_FLATBEDS BREAK CASE CHOP_TO_BOXCAR RETURN CHASE_ANIM_C_BOXCAR BREAK ENDSWITCH RETURN CHASE_ANIM_BAD ENDFUNC // get a heading normalised between 0 and 360 FUNC FLOAT NORMALISE_HEADING(FLOAT fHeading) FLOAT fReturn = fHeading IF fReturn < 0 fReturn += 360 ELIF fReturn > 360 fReturn -= 360 ENDIF RETURN fReturn ENDFUNC FUNC BOOL IS_PED_AT_CORRECT_HEADING_FOR_CHASE_ANIM(PED_INDEX ped, CHASE_ANIM_ENUM checkAnim, FLOAT allowAngleFrom0 = 25.0) FLOAT fPedHeading = NORMALISE_HEADING(GET_ENTITY_HEADING(ped)) FLOAT fAnimHeading = NORMALISE_HEADING(GET_CHASE_ANIM_HEADING(checkAnim)) FLOAT fHeadingDiff = fPedHeading - fAnimHeading IF fHeadingDiff < 0 fHeadingDiff *= -1 ENDIF IF fHeadingDiff <= allowAngleFrom0 OR fHeadingDiff >= 360 - allowAngleFrom0 RETURN TRUE ENDIF RETURN FALSE ENDFUNC FUNC BOOL IS_PED_AT_CORRECT_HEADING(PED_INDEX ped, FLOAT fAngle, FLOAT allowAngleFrom0 = 25.0) FLOAT fPedHeading = NORMALISE_HEADING(GET_ENTITY_HEADING(ped)) FLOAT fHeadingDiff = fPedHeading - fAngle IF fHeadingDiff < 0 fHeadingDiff *= -1 ENDIF IF fHeadingDiff <= allowAngleFrom0 OR fHeadingDiff >= 360 - allowAngleFrom0 RETURN TRUE ENDIF RETURN FALSE ENDFUNC // yard vehicles PROC HANDLE_YARD_VEHICLES() INT i REPEAT NUMBER_YARD_VEHICLES i IF NOT bStartedYardVehicle[i] IF IS_VEHICLE_DRIVEABLE(yardVehicle[i]) SETPIECE_STAGE_ENUM startStage INT iStartTime FLOAT fStartDistance SWITCH INT_TO_ENUM(YARD_VEHICLE_ENUM, i) // CASE YV_CAR_CARPARK_COME_ROUND_CORNER // iStartTime = 12000 // startStage = SETPIECE_FREE_TO_ROOF // BREAK CASE YV_CAR_CARPARK_PULL_OUT_FOR_JUMP_OVER iStartTime = 800 startStage = SETPIECE_LOCK_CAR_SLIDE BREAK //CASE YV_CAR_STATION_PULL_OUT_TO_LEAVE // startStage = SETPIECE_LOCK_BUS_REVERSING // iStartTime = 0 //BREAK CASE YV_CAR_STATION_PULL_INTO_DEPOT startStage = SETPIECE_LOCK_BUS_REVERSING iStartTime = 200 // 1500 BREAK //CASE YV_CAR_ROAD_FROM_RIGHT CASE YV_BUS_ROAD_FROM_LEFT CASE YV_CAR_CARPARK_STATIC iStartTime = -1 fStartDistance = -1 BREAK CASE YV_BUS_REVERSE startStage = SETPIECE_LOCK_BUS_REVERSING iStartTime = 0 BREAK CASE YV_BUS_PULL_OUT startStage = SETPIECE_FREE_INTO_STATION iStartTime = -1 fStartDistance = 35.0 BREAK CASE YV_BUS_STATIC iStartTime = -1 fStartDistance = -1 BREAK ENDSWITCH BOOL bDoStartVehicle = FALSE IF iStartTime >= 0 IF setpieceStage = startStage IF GET_GAME_TIMER() >= iSetpieceStageStartTime + iStartTime bDoStartVehicle = TRUE ENDIF ENDIF ELIF fStartDistance >= 0 IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), yardVehicle[i], <>, FALSE, FALSE) bDoStartVehicle = TRUE ENDIF ELSE bStartedYardVehicle[i] = TRUE ENDIF PED_INDEX thisDriverPed = GET_PED_IN_VEHICLE_SEAT(yardVehicle[i], VS_DRIVER) IF bDoStartVehicle AND bStartedRunnerMovement // NG - prioritise reversing bus audio so hear it beeping IF INT_TO_ENUM(YARD_VEHICLE_ENUM, i) = YV_BUS_REVERSE SET_AUDIO_VEHICLE_PRIORITY(yardVehicle[i], AUDIO_VEHICLE_PRIORITY_HIGH ) printstring("bus audio on") printnl() bRevertedReverseBusAudio = FALSE ENDIF IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(yardVehicle[i]) UNPAUSE_PLAYBACK_RECORDED_VEHICLE(yardVehicle[i]) ELSE IF NOT IS_PED_INJURED(thisDriverPed) IF INT_TO_ENUM(YARD_VEHICLE_ENUM, i) = YV_BUS_PULL_OUT CLEAR_SEQUENCE_TASK(sequence) OPEN_SEQUENCE_TASK(sequence) TASK_VEHICLE_DRIVE_TO_COORD(NULL, yardVehicle[i], <<462.88696, -678.77960, 26.42194>>, 5.0, DRIVINGSTYLE_NORMAL, GET_ENTITY_MODEL(yardVehicle[i]), DRIVINGMODE_STOPFORCARS, 2.0, 100000) TASK_VEHICLE_DRIVE_TO_COORD(NULL, yardVehicle[i], <<472.43823, -680.04065, 25.72182>>, 5.0, DRIVINGSTYLE_NORMAL, GET_ENTITY_MODEL(yardVehicle[i]), DRIVINGMODE_STOPFORCARS, 2.0, 100000) TASK_VEHICLE_DRIVE_TO_COORD(NULL, yardVehicle[i], <<500.40128, -772.94299, 23.84175>>, 5.0, DRIVINGSTYLE_NORMAL, GET_ENTITY_MODEL(yardVehicle[i]), DRIVINGMODE_STOPFORCARS, -1, -1) CLOSE_SEQUENCE_TASK(sequence) TASK_PERFORM_SEQUENCE(thisDriverPed, sequence) ENDIF ENDIF ENDIF bStartedYardVehicle[i] = TRUE ENDIF IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(yardVehicle[i]) IF IS_PED_INJURED(thisDriverPed) STOP_PLAYBACK_RECORDED_VEHICLE(yardVehicle[i]) // NG SET_AUDIO_VEHICLE_PRIORITY(yardVehicle[i], AUDIO_VEHICLE_PRIORITY_NORMAL) printstring("bus audio off 2") printnl() ENDIF ENDIF ENDIF ELSE // NG IF NOT bRevertedReverseBusAudio IF INT_TO_ENUM(YARD_VEHICLE_ENUM, i) = YV_BUS_REVERSE IF IS_VEHICLE_DRIVEABLE(yardVehicle[i]) IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(yardVehicle[i]) printstring("bus audio off 1") printnl() SET_AUDIO_VEHICLE_PRIORITY(yardVehicle[i], AUDIO_VEHICLE_PRIORITY_NORMAL) bRevertedReverseBusAudio = TRUE ENDIF ENDIF ENDIF ENDIF ENDIF ENDREPEAT // driver that bad guys slid on swears IF NOT IS_PED_INJURED(driverPed[YV_CAR_CARPARK_PULL_OUT_FOR_JUMP_OVER]) AND NOT IS_PED_INJURED(chopPed) AND NOT IS_PED_INJURED(runnerChaseProperties.ped) AND IS_VEHICLE_DRIVEABLE(yardVehicle[YV_CAR_CARPARK_PULL_OUT_FOR_JUMP_OVER]) SWITCH driverOutState CASE DRIVER_OUT_INACTIVE VECTOR vRunnerPos vRunnerPos = GET_ENTITY_COORDS(runnerChaseProperties.ped) //IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(yardVehicle[YV_CAR_CARPARK_PULL_OUT_FOR_JUMP_OVER]) IF vRunnerPos.y > -538.4 TASK_LOOK_AT_ENTITY(driverPed[YV_CAR_CARPARK_PULL_OUT_FOR_JUMP_OVER], runnerChaseProperties.ped, -1, SLF_WHILE_NOT_IN_FOV) iDriverOutTime = GET_GAME_TIMER() driverOutState = DRIVER_OUT_WAIT ENDIF BREAK CASE DRIVER_OUT_WAIT IF GET_GAME_TIMER() >= iDriverOutTime + 10 TASK_LEAVE_VEHICLE(driverPed[YV_CAR_CARPARK_PULL_OUT_FOR_JUMP_OVER], yardVehicle[YV_CAR_CARPARK_PULL_OUT_FOR_JUMP_OVER], ECF_DONT_CLOSE_DOOR) driverOutState = DRIVER_OUT_LEAVE_VEHICLE ENDIF BREAK CASE DRIVER_OUT_LEAVE_VEHICLE IF GET_SCRIPT_TASK_STATUS(driverPed[YV_CAR_CARPARK_PULL_OUT_FOR_JUMP_OVER], SCRIPT_TASK_LEAVE_VEHICLE) = FINISHED_TASK iDriverOutTime = GET_GAME_TIMER() TASK_ACHIEVE_HEADING(driverPed[YV_CAR_CARPARK_PULL_OUT_FOR_JUMP_OVER], -3.26) driverOutState = DRIVER_OUT_GET_HEADING ENDIF BREAK CASE DRIVER_OUT_GET_HEADING IF IS_PED_AT_CORRECT_HEADING(driverPed[YV_CAR_CARPARK_PULL_OUT_FOR_JUMP_OVER], -3.26, 20) //TASK_PLAY_ANIM(driverPed[YV_CAR_CARPARK_PULL_OUT_FOR_JUMP_OVER], GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_MISSION), "react_left_small_intro_a", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_HOLD_LAST_FRAME) driverOutState = DRIVER_OUT_INTO_ANIM ENDIF BREAK CASE DRIVER_OUT_INTO_ANIM //IF IS_ENTITY_PLAYING_ANIM(driverPed[YV_CAR_CARPARK_PULL_OUT_FOR_JUMP_OVER], GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_MISSION), "react_left_small_intro_a") //IF GET_ENTITY_ANIM_CURRENT_TIME(driverPed[YV_CAR_CARPARK_PULL_OUT_FOR_JUMP_OVER], GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_MISSION), "react_left_small_intro_a") >= 0.98 TASK_PLAY_ANIM(driverPed[YV_CAR_CARPARK_PULL_OUT_FOR_JUMP_OVER], GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_FOOT_CHASE), "REACT_SMALL_VARIATIONS_H", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING) iDriverOutTime = GET_GAME_TIMER() driverOutState = DRIVER_OUT_PLAY_ANIM //ENDIF //ENDIF BREAK CASE DRIVER_OUT_PLAY_ANIM //IF GET_GAME_TIMER() >= iDriverOutTime + 30000 // TASK_PLAY_ANIM(driverPed[YV_CAR_CARPARK_PULL_OUT_FOR_JUMP_OVER], GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_GESTURE_EXT), "exit", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1) // driverOutState = DRIVER_OUT_DONE //ENDIF BREAK ENDSWITCH IF NOT bDoneDriverLookAtChop IF IS_ENTITY_AT_ENTITY(driverPed[YV_CAR_CARPARK_PULL_OUT_FOR_JUMP_OVER], chopPed, <<3,3,3>>, FALSE, FALSE) TASK_LOOK_AT_ENTITY(driverPed[YV_CAR_CARPARK_PULL_OUT_FOR_JUMP_OVER], chopPed, -1, SLF_WHILE_NOT_IN_FOV) bDoneDriverLookAtChop = TRUE ENDIF ENDIF IF NOT bDoneDriverSwear IF driverOutState >= DRIVER_OUT_LEAVE_VEHICLE IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), driverPed[YV_CAR_CARPARK_PULL_OUT_FOR_JUMP_OVER], <<8, 8, LOCATE_SIZE_HEIGHT>>) // bDoneDriverSwear = DO_MISSION_SPEECH("FC_DRIVER") IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() TASK_LOOK_AT_ENTITY(driverPed[YV_CAR_CARPARK_PULL_OUT_FOR_JUMP_OVER], PLAYER_PED_ID(), -1, SLF_WHILE_NOT_IN_FOV) PLAY_PED_AMBIENT_SPEECH(driverPed[YV_CAR_CARPARK_PULL_OUT_FOR_JUMP_OVER], "GENERIC_INSULT_HIGH", SPEECH_PARAMS_FORCE_SHOUTED) bDoneDriverSwear = TRUE ENDIF ENDIF ENDIF ENDIF IF IS_SYNCHRONIZED_SCENE_RUNNING(chopChaseProperties.iSyncScene) IF chopChaseProperties.chaseAnim = CHASE_ANIM_C_OVER_CAR SWITCH iChopBounceOnCarStage CASE 0 IF GET_SYNCHRONIZED_SCENE_PHASE(chopChaseProperties.iSyncScene) >= 0.45 APPLY_FORCE_TO_ENTITY(yardVehicle[YV_CAR_CARPARK_PULL_OUT_FOR_JUMP_OVER], APPLY_TYPE_IMPULSE, <<0,0,-0.1>>, <<0,3,0>>, 0, TRUE, TRUE, TRUE) iChopBounceOnCarStage++ ENDIF BREAK CASE 1 IF GET_SYNCHRONIZED_SCENE_PHASE(chopChaseProperties.iSyncScene) >= 0.595 APPLY_FORCE_TO_ENTITY(yardVehicle[YV_CAR_CARPARK_PULL_OUT_FOR_JUMP_OVER], APPLY_TYPE_IMPULSE, <<0,0,-0.1>>, <<0,3,0>>, 0, TRUE, TRUE, TRUE) iChopBounceOnCarStage++ ENDIF BREAK ENDSWITCH ENDIF ENDIF ENDIF // leave vehicle and flee on threaten REPEAT COUNT_OF(driverPed) i IF NOT IS_PED_INJURED(driverPed[i]) IF GET_SCRIPT_TASK_STATUS(driverPed[i], SCRIPT_TASK_SMART_FLEE_PED) = FINISHED_TASK AND GET_SCRIPT_TASK_STATUS(driverPed[i], SCRIPT_TASK_LEAVE_ANY_VEHICLE) = FINISHED_TASK AND GET_SCRIPT_TASK_STATUS(driverPed[i], SCRIPT_TASK_PERFORM_SEQUENCE) = FINISHED_TASK IF IS_PLAYER_THREATENING_PED(driverPed[i]) VEHICLE_INDEX thisVehicle IF IS_PED_IN_ANY_VEHICLE(driverPed[i]) thisVehicle = GET_VEHICLE_PED_IS_IN(driverPed[i]) IF NOT IS_ENTITY_DEAD(thisVehicle) // NG SET_AUDIO_VEHICLE_PRIORITY(thisVehicle, AUDIO_VEHICLE_PRIORITY_NORMAL) printstring("bus audio off 3") printnl() IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(thisVehicle) STOP_PLAYBACK_RECORDED_VEHICLE(thisVehicle) ENDIF SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(thisVehicle, FALSE) ENDIF ENDIF BOOL bCanDoSequence = TRUE IF DOES_ENTITY_EXIST(thisVehicle) IF IS_THIS_MODEL_A_TRAIN(GET_ENTITY_MODEL(thisVehicle)) bCanDoSequence = FALSE ENDIF ENDIF IF bCanDoSequence CLEAR_SEQUENCE_TASK(sequence) OPEN_SEQUENCE_TASK(sequence) IF NOT IS_ENTITY_DEAD(thisVehicle) TASK_LEAVE_ANY_VEHICLE(NULL, 0, ECF_DONT_CLOSE_DOOR) ENDIF TASK_SMART_FLEE_PED(NULL, PLAYER_PED_ID(), 1000, -1) CLOSE_SEQUENCE_TASK(sequence) TASK_PERFORM_SEQUENCE(driverPed[i], sequence) IF i=ENUM_TO_INT(YV_CAR_CARPARK_PULL_OUT_FOR_JUMP_OVER) bDoneDriverSwear = TRUE driverOutState = DRIVER_OUT_FLEE ENDIF ENDIF ENDIF ENDIF ENDIF ENDREPEAT ENDPROC FUNC STRING GET_WAYPOINT_RECORDING_FOR_RUNNER() SWITCH runnerStage CASE RUNNER_START_FLEE RETURN "hood1" BREAK CASE RUNNER_TO_CONTAINER CASE RUNNER_TO_CAR CASE RUNNER_TO_FENCE RETURN "hood2" BREAK CASE RUNNER_TO_FLATBEDS CASE RUNNER_TO_BOXCAR CASE RUNNER_TO_TRAIN RETURN "hood3" BREAK ENDSWITCH RETURN "invalid" ENDFUNC FUNC INT GET_START_WAYPOINT_FOR_RUNNER() SWITCH runnerStage CASE RUNNER_START_FLEE RETURN 9 BREAK CASE RUNNER_TO_CONTAINER RETURN 6 BREAK CASE RUNNER_TO_CAR RETURN 15 BREAK CASE RUNNER_TO_FENCE RETURN 22 BREAK CASE RUNNER_TO_FLATBEDS RETURN 10 BREAK CASE RUNNER_TO_BOXCAR RETURN 35 BREAK CASE RUNNER_TO_TRAIN RETURN 44 BREAK //CASE RUNNER_ESCAPE // RETURN 0 //BREAK ENDSWITCH RETURN 0 ENDFUNC FUNC VECTOR GET_TARGET_COORD_FOR_RUNNER() SWITCH runnerStage CASE RUNNER_TO_BOXCAR RETURN <<567.55, -505.19, 23.79>> BREAK ENDSWITCH RETURN <<0,0,0>> ENDFUNC PROC DO_CHASE_ANIM(CHASE_PROPERTIES &chaseProperties, CHASE_ANIM_ENUM doChaseAnim) IF NOT IS_PED_INJURED(chaseProperties.ped) chaseProperties.vAnimPos = GET_ENTITY_COORDS(chaseProperties.ped) chaseProperties.vAnimRot = GET_ENTITY_ROTATION(chaseProperties.ped) SET_VECTOR_CLOSEST_TO_IDEAL(chaseProperties.vAnimRot, <<0,0,GET_CHASE_IDEAL_ANIM_HEADING(doChaseAnim)>>) chaseProperties.iSyncscene = CREATE_SYNCHRONIZED_SCENE(chaseProperties.vAnimPos, chaseProperties.vAnimRot) //BOOL bHoldLastFrame BOOL bLooping /* IF doChaseAnim = CHASE_ANIM_G_BOXCAR bHoldLastFrame = TRUE ELSE bHoldLastFrame = FALSE ENDIF */ IF doChaseAnim = CHASE_ANIM_G_WAITING_ON_GROUND bLooping = TRUE ELSE bLooping = FALSE ENDIF //SET_SYNCHRONIZED_SCENE_HOLD_LAST_FRAME(chaseProperties.iSyncscene, bHoldLastFrame) SET_SYNCHRONIZED_SCENE_LOOPED(chaseProperties.iSyncscene, bLooping) SET_SYNCHRONIZED_SCENE_PHASE(chaseProperties.iSyncscene, 0.0) SYNCED_SCENE_PLAYBACK_FLAGS playbackFlags IF chaseProperties.ped = chopPed playbackFlags = SYNCED_SCENE_TAG_SYNC_OUT | SYNCED_SCENE_DONT_INTERRUPT | SYNCED_SCENE_USE_PHYSICS ELSE IF doChaseAnim = CHASE_ANIM_G_BOXCAR OR doChaseAnim = CHASE_ANIM_G_WAITING_ON_GROUND OR doChaseAnim = CHASE_ANIM_G_GET_UP_FROM_GROUND playbackFlags = SYNCED_SCENE_TAG_SYNC_OUT | SYNCED_SCENE_DONT_INTERRUPT | SYNCED_SCENE_USE_PHYSICS ELSE playbackFlags = SYNCED_SCENE_TAG_SYNC_OUT | SYNCED_SCENE_DONT_INTERRUPT ENDIF ENDIF TASK_SYNCHRONIZED_SCENE(chaseProperties.ped, chaseProperties.iSyncscene, GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_FOOT_CHASE), GET_CHASE_ANIM_NAME(doChaseAnim), NORMAL_BLEND_IN, NORMAL_BLEND_OUT, playbackFlags) IF doChaseAnim = CHASE_ANIM_G_ONTO_TRAIN OR doChaseAnim = CHASE_ANIM_C_TOP_FENCE OR doChaseAnim = CHASE_ANIM_G_FLATBEDS REPLAY_RECORD_BACK_FOR_TIME(3.0, 5.0) ENDIF // debug for horrible once every blue moon bug #IF IS_DEBUG_BUILD PRINTSTRING("creating synced scene ") IF chaseProperties.ped = chopPed PRINTSTRING("for CHOP") PRINTNL() PRINTSTRING("chop stage = ") PRINTINT(ENUM_TO_INT(chopStage)) PRINTNL() ELIF chaseProperties.ped = runnerChaseProperties.ped PRINTSTRING("for BALLA") PRINTNL() PRINTSTRING("balla stage = ") PRINTINT(ENUM_TO_INT(runnerStage)) PRINTNL() ELSE PRINTSTRING("for UNKNOWN") PRINTNL() ENDIF PRINTSTRING("synced scene id = ") PRINTINT(chaseProperties.iSyncscene) PRINTNL() PRINTSTRING("playing anim ") PRINTSTRING(GET_CHASE_ANIM_NAME(doChaseAnim)) PRINTNL() PRINTNL() #ENDIF ENDIF chaseProperties.chaseAnim = doChaseAnim chaseProperties.chaseState = CHASE_STATE_PERFORMING_ANIM ENDPROC FUNC INT GET_START_WAYPOINT_FOR_CHOP() SWITCH chopStage CASE CHOP_TO_ROOF_EDGE RETURN 64 BREAK CASE CHOP_TO_CAR RETURN 89 BREAK CASE CHOP_TO_FENCE RETURN 106 BREAK CASE CHOP_TO_FLATBEDS RETURN 109 BREAK CASE CHOP_TO_BOXCAR RETURN 158 BREAK CASE CHOP_TO_TRAIN RETURN 185 BREAK ENDSWITCH RETURN 0 ENDFUNC PROC HANDLE_TRANSITION_BACK_TO_CHASE_MOVING(CHASE_PROPERTIES &chaseProperties, BOOL bIsChop = FALSE, BOOL bForceSprint = TRUE, INT iForceWaypoint = -1, BOOL bIncrement = TRUE, BOOL bUseNavmesh = TRUE) IF NOT IS_PED_INJURED(chaseProperties.ped) IF NOT chaseProperties.bWaiting IF NOT IS_SYNCHRONIZED_SCENE_RUNNING(chaseProperties.iSyncScene) EWAYPOINT_FOLLOW_FLAGS followFlags IF bUseNavmesh followFlags = EWAYPOINT_DO_NOT_RESPOND_TO_COLLISION_EVENTS | EWAYPOINT_NAVMESH_TO_INITIAL_WAYPOINT ELSE followFlags = EWAYPOINT_DO_NOT_RESPOND_TO_COLLISION_EVENTS ENDIF TASK_CLEAR_LOOK_AT(chaseProperties.ped) IF NOT bIsChop IF bIncrement runnerStage = INT_TO_ENUM(RUNNER_STAGE_ENUM, ENUM_TO_INT(runnerStage) + 1) ENDIF TASK_FOLLOW_WAYPOINT_RECORDING(chaseProperties.ped, GET_WAYPOINT_RECORDING_FOR_RUNNER(), GET_START_WAYPOINT_FOR_RUNNER(), EWAYPOINT_DO_NOT_RESPOND_TO_COLLISION_EVENTS) iRunnerStageStartTime = GET_GAME_TIMER() ELSE IF bIncrement chopStage = INT_TO_ENUM(CHOP_STAGE_ENUM, ENUM_TO_INT(chopStage) + 1) chopWaitState = CHOP_WAIT_STATE_NOT_STARTED ENDIF INT iWaypoint IF iForceWaypoint < 0 iWaypoint = GET_START_WAYPOINT_FOR_CHOP() ELSE iWaypoint = iForceWaypoint ENDIF TASK_FOLLOW_WAYPOINT_RECORDING(chaseProperties.ped, "hood7", iWaypoint, followFlags | EWAYPOINT_USE_TIGHTER_TURN_SETTINGS) ENDIF IF bForceSprint SET_PED_MIN_MOVE_BLEND_RATIO(chaseProperties.ped, PEDMOVE_SPRINT) ENDIF chaseProperties.iSyncScene = -1 chaseProperties.iMovingTime = GET_GAME_TIMER() chaseProperties.chaseAnim = CHASE_ANIM_NONE chaseProperties.chaseState = CHASE_STATE_MOVING ELSE BOOL bMinBlend = TRUE IF chaseProperties.chaseAnim <> CHASE_ANIM_G_GET_UP_FROM_GROUND // reposition SHIFT_VECTOR_TO_IDEAL_VECTOR(chaseProperties.vAnimPos, GET_CHASE_IDEAL_ANIM_COORDS(chaseProperties.chaseAnim), SHIFT_POS_SPEED) //PRINTVECTOR(chaseProperties.vAnimPos) PRINTNL() // rotate SHIFT_VECTOR_TO_IDEAL_VECTOR(chaseProperties.vAnimRot, <<0,0,GET_CHASE_IDEAL_ANIM_HEADING(chaseProperties.chaseAnim)>>, SHIFT_ROT_SPEED) SET_SYNCHRONIZED_SCENE_ORIGIN(chaseProperties.iSyncScene, chaseProperties.vAnimPos, chaseProperties.vAnimRot) ELSE IF NOT bResetBallaGetUp IF NOT IS_ENTITY_ON_SCREEN(chaseProperties.ped) SET_SYNCHRONIZED_SCENE_PHASE(chaseProperties.iSyncScene, 0.98) bResetBallaGetUp = TRUE ENDIF ENDIF ENDIF // convert into looped wait FLOAT fPhase = GET_SYNCHRONIZED_SCENE_PHASE(chaseProperties.iSyncScene) IF fPhase >= 0.98 IF chaseProperties.chaseAnim = CHASE_ANIM_G_BOXCAR DO_CHASE_ANIM(chaseProperties, CHASE_ANIM_G_WAITING_ON_GROUND) CLEAR_ENTITY_LAST_DAMAGE_ENTITY(chaseProperties.ped) iRunnerWaitTime = GET_GAME_TIMER() chaseProperties.bWaiting = TRUE ELIF chaseProperties.chaseAnim = CHASE_ANIM_G_DOWN_CONTAINER IF NOT bCheckedContainerWait //IF NOT IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), chaseProperties.ped, <<12,12,12>>, FALSE, FALSE) IF NOT IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), chaseProperties.ped, <<20,20,20>>, FALSE, FALSE) iRunnerWaitTime = GET_GAME_TIMER() chaseProperties.bWaiting = TRUE ELSE chaseProperties.bWaiting = FALSE ENDIF CLEAR_PED_TASKS(chaseProperties.ped) CLEAR_ENTITY_LAST_DAMAGE_ENTITY(chaseProperties.ped) bCheckedContainerWait = TRUE ENDIF ELSE SET_SYNCHRONIZED_SCENE_HOLD_LAST_FRAME(chaseProperties.iSyncscene, FALSE) ENDIF ELIF fPhase >= 0.50 IF chaseProperties.chaseAnim = CHASE_ANIM_G_DOWN_CONTAINER OR chaseProperties.chaseAnim = CHASE_ANIM_C_TOP_FENCE bMinBlend = FALSE ENDIF ENDIF IF bMinBlend SET_PED_MIN_MOVE_BLEND_RATIO(chaseProperties.ped, PEDMOVE_SPRINT) ENDIF ENDIF ELSE IF NOT IS_PED_INJURED(chopPed) // special case to handle wait IF chaseProperties.chaseAnim = CHASE_ANIM_G_WAITING_ON_GROUND IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), chaseProperties.ped, <<16,16,16>>, FALSE, FALSE) OR (IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), chaseProperties.ped, <<20,20,20>>, FALSE, FALSE) AND GET_FOLLOW_PED_CAM_VIEW_MODE() = CAM_VIEW_MODE_FIRST_PERSON) OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<537.228, -540.125, 23.679>>, <<557.910, -542.702, 29.000>>, 63) OR IS_ENTITY_AT_ENTITY(chopPed, chaseProperties.ped, <<18,18,18>>, FALSE, FALSE) OR HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(chaseProperties.ped, PLAYER_PED_ID()) OR IS_ENTITY_ON_FIRE(chaseProperties.ped) OR GET_GAME_TIMER() >= iRunnerWaitTime + 12000 OR chopStage >= CHOP_TO_TRAIN DO_CHASE_ANIM(chaseProperties, CHASE_ANIM_G_GET_UP_FROM_GROUND) chaseProperties.bWaiting = FALSE ENDIF ELIF chaseProperties.chaseAnim = CHASE_ANIM_G_DOWN_CONTAINER IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), chaseProperties.ped, <<25,25,25>>, FALSE, FALSE) OR IS_ENTITY_AT_ENTITY(chopPed, chaseProperties.ped, <<11,11,11>>, FALSE, FALSE) OR IS_TRACKED_PED_VISIBLE(runnerChaseProperties.ped) OR HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(chaseProperties.ped, PLAYER_PED_ID()) OR IS_ENTITY_ON_FIRE(chaseProperties.ped) OR GET_GAME_TIMER() >= iRunnerWaitTime + 11000 chaseProperties.bWaiting = FALSE ENDIF ENDIF ENDIF ENDIF ENDIF ENDPROC FUNC BOOL SHOULD_INCREMENT_SETPIECE_STAGE() VECTOR vPedPos = GET_ENTITY_COORDS(runnerChaseProperties.ped) SWITCH setpieceStage CASE SETPIECE_FREE_INTO_STATION IF vPedPos.y >= -641.49 RETURN TRUE ENDIF BREAK CASE SETPIECE_LOCK_BUS_REVERSING IF vPedPos.y >= -635.98//-616.98 RETURN TRUE ENDIF BREAK CASE SETPIECE_FREE_TO_ROOF IF vPedPos.y >= -552.7//-574.02 IF NOT runnerChaseProperties.bWaiting RETURN TRUE ENDIF ENDIF BREAK CASE SETPIECE_LOCK_CAR_SLIDE IF vPedPos.y >= -532.48 RETURN TRUE ENDIF BREAK CASE SETPIECE_FREE_ACROSS_CONSTRUCTION IF vPedPos.x >= 512.69 RETURN TRUE ENDIF BREAK CASE SETPIECE_LOCK_TRAIN_CUT_ACROSS IF vPedPos.x >= 535.19 RETURN TRUE ENDIF BREAK CASE SETPIECE_FREE_THROUGH_CARRIAGES IF vPedPos.y <= -509.27 RETURN TRUE ENDIF BREAK CASE SETPIECE_FREE_BACK_OF_CARRIAGES IF vPedPos.y <= -547.42 RETURN TRUE ENDIF BREAK CASE SETPIECE_LOCK_TRAIN_JUMP RETURN FALSE BREAK ENDSWITCH RETURN FALSE ENDFUNC FUNC FLOAT CALCULATE_RUNNER_SPEED_FROM_DISTANCE(FLOAT fCatchupDistance, FLOAT fMinSpeed, FLOAT fMaxSpeed) FLOAT fDist = GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), runnerChaseProperties.ped) IF fDist < fCatchupDistance RETURN fMaxSpeed ELSE RETURN fMinSpeed ENDIF RETURN 3.0 ENDFUNC PROC HANDLE_RUNNER_SPEED() //PRINTSTRING("stage = ") PRINTINT(ENUM_TO_INT(setpieceStage)) PRINTNL() IF SHOULD_INCREMENT_SETPIECE_STAGE() setpieceStage = INT_TO_ENUM(SETPIECE_STAGE_ENUM, (ENUM_TO_INT(setpieceStage)+1)) iSetpieceStageStartTime = GET_GAME_TIMER() ENDIF taskStatus = GET_SCRIPT_TASK_STATUS(runnerChaseProperties.ped, SCRIPT_TASK_FOLLOW_WAYPOINT_ROUTE) IF taskStatus = PERFORMING_TASK // calculate the speed FLOAT fSpeed SWITCH setpieceStage // lock at max for setpieces CASE SETPIECE_LOCK_BUS_REVERSING CASE SETPIECE_LOCK_CAR_SLIDE CASE SETPIECE_LOCK_TRAIN_CUT_ACROSS CASE SETPIECE_LOCK_TRAIN_JUMP fSpeed = 3.0 BREAK CASE SETPIECE_FREE_INTO_STATION CASE SETPIECE_FREE_TO_ROOF CASE SETPIECE_FREE_ACROSS_CONSTRUCTION CASE SETPIECE_FREE_THROUGH_CARRIAGES fSpeed = CALCULATE_RUNNER_SPEED_FROM_DISTANCE(40.0, 2.0, 3.0) // 28 BREAK CASE SETPIECE_FREE_BACK_OF_CARRIAGES // VECTOR vOffset vOffset = GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(runnerChaseProperties.ped, GET_ENTITY_COORDS(PLAYER_PED_ID())) IF vOffset.y < -4 fSpeed = CALCULATE_RUNNER_SPEED_FROM_DISTANCE(35.0, 2.0, 3.0) // 35 ELSE fSpeed = 3 ENDIF BREAK ENDSWITCH IF currentMissionStage = STAGE_VAN_CHASE fSpeed = 2.0 ENDIF //PRINTSTRING("runner speed = ") PRINTFLOAT(fspeed) PRINTNL() IF currentMissionStage <> STAGE_VAN_CHASE IF IS_WAYPOINT_PLAYBACK_GOING_ON_FOR_PED(runnerChaseProperties.ped) IF fSpeed >= 2.5 SET_PED_MOVE_RATE_OVERRIDE(runnerChaseProperties.ped, 1.15) //SET_PED_MIN_MOVE_BLEND_RATIO(runnerChaseProperties.ped, 3.0) ELSE //SET_PED_MIN_MOVE_BLEND_RATIO(runnerChaseProperties.ped, 2.0) ENDIF WAYPOINT_PLAYBACK_OVERRIDE_SPEED(runnerChaseProperties.ped, fSpeed) ENDIF ELSE //printstring("here1") printnl() SET_PED_MAX_MOVE_BLEND_RATIO(runnerChaseProperties.ped, 2.0) WAYPOINT_PLAYBACK_OVERRIDE_SPEED(runnerChaseProperties.ped, 2.0) SET_PED_MOVE_RATE_OVERRIDE(runnerChaseProperties.ped, 0.98) ENDIF ENDIF ENDPROC // can car be jumped? FUNC BOOL CAN_CAR_BE_JUMPED_OVER() IF NOT IS_ENTITY_DEAD(yardVehicle[YV_CAR_CARPARK_PULL_OUT_FOR_JUMP_OVER]) IF IS_VEHICLE_DRIVEABLE(yardVehicle[YV_CAR_CARPARK_PULL_OUT_FOR_JUMP_OVER]) IF IS_ENTITY_IN_ANGLED_AREA(yardVehicle[YV_CAR_CARPARK_PULL_OUT_FOR_JUMP_OVER], <<495.362, -537.695, 20.751>>, <<485.086, -537.464, 26.751>>, 3) RETURN TRUE ENDIF ENDIF ENDIF RETURN FALSE ENDFUNC // should chop wait at roof? FUNC BOOL SHOULD_CHOP_WAIT_AT_ROOF(BOOL bCheckStart = FALSE) IF runnerStage >= RUNNER_TO_CAR OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<482.130, -575.220, 26.460>>, <<494.610, -576.590, 31.460>>, 24, FALSE, FALSE) OR (IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<488.47430, -576.73560, 28.29393>>, <<18.5, 18.5, 18.5>>, FALSE, FALSE) AND bCheckStart) OR chopViewCamData.state = CHOP_VIEW_CAM_ON_CHOP RETURN FALSE ENDIF RETURN TRUE ENDFUNC // should chop wait at flatbeds FUNC BOOL SHOULD_CHOP_WAIT_AT_FLATBEDS(BOOL bCheckStart = FALSE) VECTOR vPlayerPos vPlayerPos = GET_ENTITY_COORDS(PLAYER_PED_ID()) VECTOR vRunnerPos IF NOT IS_PED_INJURED(runnerChaseProperties.ped) vRunnerPos = GET_ENTITY_COORDS(runnerChaseProperties.ped) ENDIF IF (vPlayerPos.x >= 525 AND vRunnerPos.x >= 552) OR chopViewCamData.state = CHOP_VIEW_CAM_ON_CHOP OR (vPlayerPos.x >= -517 AND bCheckStart) RETURN FALSE ENDIF RETURN TRUE ENDFUNC // handle runner on chase PROC HANDLE_RUNNER_CHASE() IF NOT IS_PED_INJURED(runnerChaseProperties.ped) IF bStartedRunnerMovement SWITCH runnerChaseProperties.chaseState CASE CHASE_STATE_MOVING HANDLE_RUNNER_SPEED() //IF GET_GAME_TIMER() <= runnerChaseProperties.iMovingTime + 2000 //SET_PED_MIN_MOVE_BLEND_RATIO(runnerChaseProperties.ped, PEDMOVE_SPRINT) //ENDIF CHASE_ANIM_ENUM nextChaseAnim nextChaseAnim = GET_NEXT_CHASE_ANIM_FOR_RUNNER() IF IS_ENTITY_AT_COORD(runnerChaseProperties.ped, GET_CHASE_ANIM_COORDS(nextChaseAnim), GET_CHASE_ANIM_DIMENSIONS(nextChaseAnim), FALSE, TRUE, TM_ON_FOOT) OR (IS_PED_AT_EMERGENCY_CHASE_ANIM_TRIGGER(runnerChaseProperties.ped, nextChaseAnim) AND nextChaseAnim < CHASE_ANIM_BAD AND IS_ENTITY_AT_COORD(runnerChaseProperties.ped, GET_CHASE_ANIM_COORDS(nextChaseAnim), <<10,10,10>>, FALSE, FALSE, TM_ON_FOOT)) BOOL bCanDoRunnerAnim bCanDoRunnerAnim = TRUE IF nextChaseAnim = CHASE_ANIM_G_OVER_CAR IF NOT CAN_CAR_BE_JUMPED_OVER() bCanDoRunnerAnim = FALSE ELSE SET_ENTITY_NO_COLLISION_ENTITY(runnerChaseProperties.ped, yardVehicle[YV_CAR_CARPARK_PULL_OUT_FOR_JUMP_OVER], FALSE) ENDIF ENDIF IF bCanDoRunnerAnim DO_CHASE_ANIM(runnerChaseProperties, nextChaseAnim) ELSE runnerStage = INT_TO_ENUM(RUNNER_STAGE_ENUM, ENUM_TO_INT(runnerStage) + 1) ENDIF ENDIF BREAK CASE CHASE_STATE_PERFORMING_ANIM IF IS_SYNCHRONIZED_SCENE_RUNNING(runnerChaseProperties.iSyncScene) FLOAT fAnimSpeed fAnimSpeed = 1.04 IF NOT IS_TRACKED_PED_VISIBLE(runnerChaseProperties.ped) IF runnerChaseProperties.chaseAnim = CHASE_ANIM_G_DOWN_CONTAINER IF GET_SYNCHRONIZED_SCENE_PHASE(runnerChaseProperties.iSyncScene) >= 0.392 fAnimSpeed = 3.3 ENDIF ELSE IF runnerChaseProperties.chaseAnim < CHASE_ANIM_G_BOXCAR fAnimSpeed = 1.21 ENDIF ENDIF ELSE IF NOT IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), runnerChaseProperties.ped, <<50,50,50>>, FALSE, FALSE) fAnimSpeed = 1.0 ELIF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), runnerChaseProperties.ped, <<7,7,7>>, FALSE, FALSE) fAnimSpeed = 1.12 ENDIF ENDIF SET_SYNCHRONIZED_SCENE_RATE(runnerChaseProperties.iSyncScene, fAnimSpeed) ENDIF HANDLE_TRANSITION_BACK_TO_CHASE_MOVING(runnerChaseProperties) BREAK ENDSWITCH ELSE TASK_FOLLOW_WAYPOINT_RECORDING(runnerChaseProperties.ped, "hood1", GET_START_WAYPOINT_FOR_RUNNER(), EWAYPOINT_DO_NOT_RESPOND_TO_COLLISION_EVENTS | EWAYPOINT_NAVMESH_BACK_TO_WAYPOINT_IF_LEFT_ROUTE) iRunnerStageStartTime = GET_GAME_TIMER() iSetpieceStageStartTime = GET_GAME_TIMER() bStartedRunnerMovement = TRUE ENDIF ENDIF ENDPROC // handle chop during chase PROC HANDLE_CHOP_CHASE() IF NOT IS_PED_INJURED(chopChaseProperties.ped) IF bStartedChopMovement SWITCH chopChaseProperties.chaseState CASE CHASE_STATE_MOVING IF chopWaitState = CHOP_WAIT_STATE_NOT_STARTED OR chopWaitState = CHOP_WAIT_STATE_DONE // temp? IF IS_WAYPOINT_PLAYBACK_GOING_ON_FOR_PED(chopChaseProperties.ped) AND NOT IS_PED_INJURED(runnerChaseProperties.ped) FLOAT fOverrideSpeed FLOAT fMoveRateOverride FLOAT fVeryCloseDistance fVeryCloseDistance = 6 FLOAT fQuiteCloseDistance fQuiteCloseDistance = 14 BOOL bAllowOverride bAllowOverride = TRUE //FLOAT fMinMoveBlend IF chopStage = CHOP_TO_FLATBEDS fVeryCloseDistance = 20 fQuiteCloseDistance = 50 ENDIF VECTOR vOffset vOffset = GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(chopPed, GET_ENTITY_COORDS(runnerChaseProperties.ped)) // slow down if too close to runner IF IS_ENTITY_AT_ENTITY(chopChaseProperties.ped, runnerChaseProperties.ped, <>, FALSE, FALSE) OR vOffset.y < 0 fOverrideSpeed = 2.4//2.2 fMoveRateOverride = 1.0//0.5 bAllowOverride = FALSE //fMinMoveBlend = 2.1//2.1 ELIF IS_ENTITY_AT_ENTITY(chopChaseProperties.ped, runnerChaseProperties.ped, <>, FALSE, FALSE) fOverrideSpeed = 2.8//2.5 fMoveRateOverride = 1.02//0.8 //bAllowOverride = FALSE //fMinMoveBlend = 2.3//2.4 // speed up if too close to player ELIF IS_ENTITY_AT_ENTITY(chopChaseProperties.ped, PLAYER_PED_ID(), <<10, 10, 20>>, FALSE, FALSE) fOverrideSpeed = 3.0 // 3.0 fMoveRateOverride = 1.15//1.15 //fMinMoveBlend = 3.0//3.0 ELSE fOverrideSpeed = 3.0//2.6 fMoveRateOverride = 1.15 //fMinMoveBlend = 2.7//2.3 ENDIF // override IF bAllowOverride IF chopStage = CHOP_TO_ROOF_EDGE fOverrideSpeed = 2.8 fMoveRateOverride = 1.0//1.15 //fMinMoveBlend = 2.8 ENDIF IF chopStage = CHOP_TO_FLATBEDS fOverrideSpeed = 3.0//2.7 fMoveRateOverride = 1.15 //fMinMoveBlend = 2.8//2.6 ENDIF ENDIF IF chopBypassFenceState = CHOP_BYPASS_FENCE_PERFORMING_BYPASS VECTOR vPlayerPos vPlayerPos = GET_ENTITY_COORDS(PLAYER_PED_ID()) IF vPlayerPos.y >= -516.9 fOverrideSpeed = 3.0//2.6 fMoveRateOverride = 1.15 ENDIF ENDIF //IF chopStage = CHOP_TO_FENCE // fOverrideSpeed = 3.0//2.7 // fMoveRateOverride = 1.0 //ENDIF WAYPOINT_PLAYBACK_OVERRIDE_SPEED(chopChaseProperties.ped, fOverrideSpeed) SET_PED_MOVE_RATE_OVERRIDE(chopChaseProperties.ped, fMoveRateOverride) IF chopStage = CHOP_TO_FENCE VECTOR vPosToFence vPosToFence = GET_ENTITY_COORDS(chopPed) IF vPosToFence.y >= -524.0 SET_PED_MIN_MOVE_BLEND_RATIO(chopChaseProperties.ped, 2.0) ELSE SET_PED_MIN_MOVE_BLEND_RATIO(chopChaseProperties.ped, 3.0) ENDIF ENDIF IF bApplyStartBoost IF GET_GAME_TIMER() <= iStageStartTime + 2000 SET_PED_MIN_MOVE_BLEND_RATIO(chopChaseProperties.ped, 3.0) ENDIF ENDIF ENDIF CHASE_ANIM_ENUM nextChaseAnim nextChaseAnim = GET_NEXT_CHASE_ANIM_FOR_CHOP() IF IS_ENTITY_AT_COORD(chopChaseProperties.ped, GET_CHASE_ANIM_COORDS(nextChaseAnim), GET_CHASE_ANIM_DIMENSIONS(nextChaseAnim), FALSE, TRUE, TM_ON_FOOT) OR (IS_PED_AT_EMERGENCY_CHASE_ANIM_TRIGGER(chopChaseProperties.ped, nextChaseAnim) AND nextChaseAnim <= CHASE_ANIM_BAD) BOOL bCanDoChopAnim bCanDoChopAnim = TRUE IF nextChaseAnim = CHASE_ANIM_C_OVER_CAR IF NOT CAN_CAR_BE_JUMPED_OVER() bCanDoChopAnim = FALSE ELSE SET_ENTITY_NO_COLLISION_ENTITY(chopPed, yardVehicle[YV_CAR_CARPARK_PULL_OUT_FOR_JUMP_OVER], FALSE) ENDIF ENDIF IF bCanDoChopAnim DO_CHASE_ANIM(chopChaseProperties, nextChaseAnim) ELSE chopStage = INT_TO_ENUM(CHOP_STAGE_ENUM, ENUM_TO_INT(chopStage) + 1) ENDIF ENDIF ENDIF BREAK CASE CHASE_STATE_PERFORMING_ANIM IF IS_SYNCHRONIZED_SCENE_RUNNING(chopChaseProperties.iSyncScene) IF chopChaseProperties.chaseAnim = CHASE_ANIM_C_TOP_FENCE OR chopChaseProperties.chaseAnim = CHASE_ANIM_C_OFF_ROOF IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), chopPed, <<25,25,25>>, FALSE, FALSE) SET_SYNCHRONIZED_SCENE_RATE(chopChaseProperties.iSyncScene, 1.25) ELSE SET_SYNCHRONIZED_SCENE_RATE(chopChaseProperties.iSyncScene, 1.0) ENDIF ENDIF ENDIF BOOL bUseNavmesh bUseNavmesh = TRUE IF chopStage = CHOP_START_CHASE OR chopStage = CHOP_TO_FLATBEDS OR chopStage = CHOP_TO_BOXCAR OR chopStage = CHOP_TO_fence bUseNavmesh = FALSE ENDIF HANDLE_TRANSITION_BACK_TO_CHASE_MOVING(chopChaseProperties, TRUE, DEFAULT, DEFAULT, DEFAULT, bUseNavmesh) BREAK ENDSWITCH // handle chop wait SWITCH chopWaitState CASE CHOP_WAIT_STATE_NOT_STARTED IF chopChaseProperties.chaseState = CHASE_STATE_MOVING BOOL bWait bWait = FALSE BOOL bFrantic bFrantic = FALSE BOOL bSlowToStop SWITCH chopStage CASE CHOP_TO_FLATBEDS IF SHOULD_CHOP_WAIT_AT_FLATBEDS(TRUE) IF IS_ENTITY_AT_COORD(chopChaseProperties.ped, <<539.66, -501.66, 25.13>>, <<13,13,13>>, FALSE, FALSE) IF chopViewCamData.state = CHOP_VIEW_CAM_DISABLED OR chopViewCamData.state = CHOP_VIEW_CAM_TO_PLAYER bWait = TRUE bSlowToStop = TRUE ENDIF ENDIF ENDIF BREAK CASE CHOP_TO_FENCE IF IS_ENTITY_AT_COORD(chopChaseProperties.ped, <<494.48, -516.88, 23.75>>, <<4,4,4>>) bWait = TRUE bSlowToStop = FALSE bFrantic = TRUE ENDIF BREAK CASE CHOP_TO_ROOF_EDGE IF SHOULD_CHOP_WAIT_AT_ROOF(TRUE) IF chopViewCamData.state = CHOP_VIEW_CAM_DISABLED OR chopViewCamData.state = CHOP_VIEW_CAM_TO_PLAYER bWait = TRUE bSlowToStop = TRUE ENDIF ENDIF BREAK ENDSWITCH IF bWait IF bSlowToStop TASK_PLAY_ANIM(chopChaseProperties.ped, GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_SHARED), "FRA0_IG_12_CHOP_FAST_TURN_A", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_HOLD_LAST_FRAME) // "FRA0_IG_12_CHOP_RUN_STOP_TURN" chopWaitState = CHOP_WAIT_STATE_SLOW_TO_STOP ELSE IF NOT bFrantic TASK_PLAY_ANIM(chopChaseProperties.ped, GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_SHARED), "FRA0_IG_12_CHOP_WAITING_B", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING) ELSE TASK_PLAY_ANIM(chopChaseProperties.ped, GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_SHARED), "CHOP_BARK_AT_CARRIAGE", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING) ENDIF chopWaitState = CHOP_WAIT_STATE_WAITING ENDIF ENDIF ENDIF BREAK CASE CHOP_WAIT_STATE_SLOW_TO_STOP IF IS_ENTITY_PLAYING_ANIM(chopChaseProperties.ped, GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_SHARED), "FRA0_IG_12_CHOP_FAST_TURN_A") IF GET_ENTITY_ANIM_CURRENT_TIME(chopChaseProperties.ped, GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_SHARED), "FRA0_IG_12_CHOP_FAST_TURN_A") >= 0.98 //TASK_LOOK_AT_ENTITY(chopChaseProperties.ped, PLAYER_PED_ID(), -1, SLF_WHILE_NOT_IN_FOV) TASK_PLAY_ANIM(chopChaseProperties.ped, GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_SHARED), "FRA0_IG_12_CHOP_WAITING_A", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING) chopWaitState = CHOP_WAIT_STATE_WAITING ENDIF ENDIF BREAK CASE CHOP_WAIT_STATE_WAITING IF chopStage = CHOP_TO_FENCE SET_PED_RESET_FLAG(chopPed, PRF_UseKinematicPhysics, TRUE) IF bSmashedFence HANDLE_TRANSITION_BACK_TO_CHASE_MOVING(chopChaseProperties, TRUE, FALSE, -1, TRUE, FALSE) ELSE /* IF NOT bPlayingChopWaitTurnAnim IF GET_GAME_TIMER() >= iChopWaitTime + 1000 TASK_PLAY_ANIM(chopChaseProperties.ped, GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_MISSION), "FRA0_IG_12_CHOP_WAITING_B", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_HOLD_LAST_FRAME | AF_NOT_INTERRUPTABLE) bPlayingChopWaitTurnAnim = TRUE ENDIF ELSE IF IS_ENTITY_PLAYING_ANIM(chopChaseProperties.ped, GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_MISSION), "FRA0_IG_12_CHOP_WAITING_B") IF GET_ENTITY_ANIM_CURRENT_TIME(chopChaseProperties.ped, GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_MISSION), "FRA0_IG_12_CHOP_WAITING_B") >= 0.98 TASK_PLAY_ANIM(chopChaseProperties.ped, GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_MISSION), "FRA0_IG_12_CHOP_WAITING_A", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING | AF_NOT_INTERRUPTABLE) iChopWaitTime = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(2000, 5000) bPlayingChopWaitTurnAnim = FALSE ENDIF ENDIF ENDIF */ ENDIF ELIF chopStage = CHOP_TO_FLATBEDS IF NOT SHOULD_CHOP_WAIT_AT_FLATBEDS() IF CAN_CHOP_TRANSITION_BACK_FROM_WAIT() chopWaitState = CHOP_WAIT_STATE_DONE HANDLE_TRANSITION_BACK_TO_CHASE_MOVING(chopChaseProperties, TRUE, FALSE, 146, FALSE, FALSE) ENDIF ENDIF ELIF chopStage = CHOP_TO_ROOF_EDGE IF NOT SHOULD_CHOP_WAIT_AT_ROOF() IF CAN_CHOP_TRANSITION_BACK_FROM_WAIT() chopWaitState = CHOP_WAIT_STATE_DONE HANDLE_TRANSITION_BACK_TO_CHASE_MOVING(chopChaseProperties, TRUE, FALSE, -1, FALSE) ENDIF ENDIF ENDIF BREAK ENDSWITCH ELSE VECTOR vChopPos = GET_ENTITY_COORDS(chopPed) INT iInitWaypoint IF vChopPos.y < -682.7 iInitWaypoint = 7 ELSE iInitWaypoint = 11 ENDIF //IF GET_SCRIPT_TASK_STATUS(chopChaseProperties.ped, SCRIPT_TASK_FOLLOW_WAYPOINT_ROUTE) = FINISHED_TASK TASK_FOLLOW_WAYPOINT_RECORDING(chopChaseProperties.ped, "hood7", iInitWaypoint, EWAYPOINT_DO_NOT_RESPOND_TO_COLLISION_EVENTS | EWAYPOINT_NAVMESH_BACK_TO_WAYPOINT_IF_LEFT_ROUTE) //ENDIF bStartedChopMovement = TRUE ENDIF ENDIF ENDPROC // block ragdoll on chop and runner PROC BLOCK_FOOT_CHASE_RAGDOLL() //IF NOT IS_PED_INJURED(chopPed) // SET_PED_RESET_FLAG(chopPed, PRF_BlockWeaponReactionsUnlessDead, TRUE) //ENDIF IF NOT IS_PED_INJURED(runnerChaseProperties.ped) IF NOT IS_PED_RAGDOLL(runnerChaseProperties.ped) SET_PED_RESET_FLAG(runnerChaseProperties.ped, PRF_BlockWeaponReactionsUnlessDead, TRUE) SET_PED_RESET_FLAG(runnerChaseProperties.ped, PRF_DisableSecondaryAnimationTasks, TRUE) ENDIF ENDIF ENDPROC // get dict for shocked FUNC STRING GET_DICT_FOR_SHOCKED_ANIM(YARD_PED_ENUM thisYardPed) SWITCH thisYardPed CASE YP_STATION_WALK_TO_GATE RETURN GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_FOOT_CHASE) BREAK CASE YP_STATION_CONV_KNOCK_OVER RETURN GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_FOOT_CHASE) BREAK CASE YP_STATION_CONV_LOOK RETURN GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_FOOT_CHASE) BREAK CASE YP_STATION_BACK_TURNED_KNOCK_OVER RETURN GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_FOOT_CHASE) BREAK // construction site //CASE YP_CONSTRUCT_CONV_LOOK1 // RETURN GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_GESTURE_IDLE1) //BREAK //CASE YP_CONSTRUCT_CONV_LOOK2 // RETURN GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_GESTURE_IDLE2) //BREAK CASE YP_CONSTRUCT_WALK_SOUTH RETURN GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_FOOT_CHASE) BREAK CASE YP_CONSTRUCT_WALK_NORTH RETURN GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_FOOT_CHASE) BREAK ENDSWITCH RETURN "badstring" ENDFUNC // get anim for shocked FUNC STRING GET_ANIM_FOR_SHOCKED_ANIM(YARD_PED_ENUM thisYardPed) SWITCH thisYardPed CASE YP_STATION_WALK_TO_GATE RETURN "EXIT_TO_GENERIC" BREAK CASE YP_STATION_CONV_KNOCK_OVER RETURN "EXIT_TO_GENERIC" BREAK CASE YP_STATION_CONV_LOOK RETURN "EXIT_TO_GENERIC" BREAK CASE YP_STATION_BACK_TURNED_KNOCK_OVER RETURN "EXIT_TO_GENERIC" BREAK // construction site //CASE YP_CONSTRUCT_CONV_LOOK1 // RETURN "idle_b" //BREAK //CASE YP_CONSTRUCT_CONV_LOOK2 // RETURN "idle_e" //BREAK CASE YP_CONSTRUCT_WALK_SOUTH RETURN "EXIT_TO_GENERIC" BREAK CASE YP_CONSTRUCT_WALK_NORTH RETURN "EXIT_TO_GENERIC" BREAK ENDSWITCH RETURN "badstring" ENDFUNC // get time for shocked FUNC INT GET_TIME_FOR_SHOCKED_ANIM(YARD_PED_ENUM thisYardPed) thisYardPed=thisYardPed //SWITCH thisYardPed //CASE YP_CONSTRUCT_CONV_LOOK1 // RETURN 8000 //BREAK //CASE YP_CONSTRUCT_CONV_LOOK2 // RETURN 8500 //BREAK //ENDSWITCH RETURN 6000 ENDFUNC // get end state for yard ped FUNC YARD_PED_STATE_ENUM GET_END_YARD_PED_STATE(YARD_PED_ENUM thisYardPed) SWITCH thisYardPed CASE YP_STATION_CONV_KNOCK_OVER RETURN YARD_PED_STATE_WANDER BREAK CASE YP_STATION_CONV_LOOK RETURN YARD_PED_STATE_WANDER BREAK CASE YP_STATION_BACK_TURNED_KNOCK_OVER RETURN YARD_PED_STATE_WALKING BREAK // construction site //CASE YP_CONSTRUCT_CONV_LOOK1 // RETURN YARD_PED_STATE_WANDER //BREAK //CASE YP_CONSTRUCT_CONV_LOOK2 // RETURN YARD_PED_STATE_WANDER //BREAK ENDSWITCH RETURN YARD_PED_STATE_TURN_TO_FACE ENDFUNC // set yard ped state PROC SET_YARD_PED_STATE(YARD_PED_ENUM thisYardPed, YARD_PED_STATE_ENUM newState, VECTOR vPos, PED_INDEX otherPed = NULL, FLOAT fFloat = -1.0) IF NOT IS_PED_INJURED(yardPed[thisYardPed].ped) SWITCH newState CASE YARD_PED_STATE_WALKING //IF NOT IS_PED_INJURED(otherPed) TASK_GO_STRAIGHT_TO_COORD(yardPed[thisYardPed].ped, vPos, PEDMOVE_WALK, DEFAULT_TIME_NEVER_WARP) //ENDIF BREAK CASE YARD_PED_STATE_TALKING IF NOT IS_PED_INJURED(otherPed) TASK_LOOK_AT_ENTITY(yardPed[thisYardPed].ped, otherPed, -1, SLF_WHILE_NOT_IN_FOV) TASK_CHAT_TO_PED(yardPed[thisYardPed].ped, otherPed, CF_AUTO_CHAT, <<0,0,0>>, -1, -1) ENDIF BREAK CASE YARD_PED_STATE_RAGDOLL //SET_PED_TO_RAGDOLL(yardPed[thisYardPed].ped, 2500, 2500, TASK_RELAX) SET_PED_TO_RAGDOLL_WITH_FALL(yardPed[thisYardPed].ped, 3000, 3000, TYPE_DOWN_STAIRS, NORMALISE_VECTOR(vPos), 0, << 0.0, 0.0, 0.0 >>, << 0.0, 0.0, 0.0 >>) IF thisYardPed = YP_STATION_CONV_KNOCK_OVER TASK_TURN_PED_TO_FACE_ENTITY(yardPed[thisYardPed].ped, runnerChaseProperties.ped, 30000) ENDIF BREAK CASE YARD_PED_STATE_ENTER_SHOCKED CLEAR_SEQUENCE_TASK(sequence) OPEN_SEQUENCE_TASK(sequence) IF NOT IS_PED_INJURED(otherPed) TASK_TURN_PED_TO_FACE_ENTITY(NULL, otherPed, 1000) ELIF fFloat >= 0.0 TASK_ACHIEVE_HEADING(NULL, fFloat) ENDIF TASK_PLAY_ANIM(NULL, GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_FOOT_CHASE), "REACTION_FORWARD_BIG_INTRO_A", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1) CLOSE_SEQUENCE_TASK(sequence) TASK_PERFORM_SEQUENCE(yardPed[thisYardPed].ped, sequence) BREAK CASE YARD_PED_STATE_LOOPING_SHOCKED TASK_PLAY_ANIM(yardPed[thisYardPed].ped, GET_DICT_FOR_SHOCKED_ANIM(thisYardPed), GET_ANIM_FOR_SHOCKED_ANIM(thisYardPed), NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING) BREAK CASE YARD_PED_STATE_EXIT_SHOCKED TASK_PLAY_ANIM(yardPed[thisYardPed].ped, GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_FOOT_CHASE), "BIG_EXIT_TO_GENERIC", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_HOLD_LAST_FRAME) BREAK CASE YARD_PED_STATE_TURN_TO_FACE TASK_LOOK_AT_ENTITY(yardPed[thisYardPed].ped, PLAYER_PED_ID(), -1, SLF_WHILE_NOT_IN_FOV) BREAK CASE YARD_PED_STATE_WANDER TASK_LOOK_AT_ENTITY(yardPed[thisYardPed].ped, PLAYER_PED_ID(), -1, SLF_WHILE_NOT_IN_FOV) TASK_WANDER_STANDARD(yardPed[thisYardPed].ped) BREAK CASE YARD_PED_STATE_FLEE TASK_LOOK_AT_ENTITY(yardPed[thisYardPed].ped, PLAYER_PED_ID(), -1, SLF_WHILE_NOT_IN_FOV) TASK_SMART_FLEE_PED(yardPed[thisYardPed].ped, PLAYER_PED_ID(), 1000, -1) BREAK ENDSWITCH ENDIF yardPed[thisYardPed].iStateTime = GET_GAME_TIMER() yardPed[thisYardPed].state = newState ENDPROC // peds on foot PROC HANDLE_YARD_PEDS() INT i VECTOR vPlayerPos = GET_ENTITY_COORDS(PLAYER_PED_ID()) IF NOT IS_PED_INJURED(runnerChaseProperties.ped) REPEAT NUMBER_YARD_PEDS i IF NOT IS_PED_INJURED(yardPed[i].ped) YARD_PED_ENUM thisYardPed = INT_TO_ENUM(YARD_PED_ENUM, i) // individual behaviour by ped SWITCH yardPed[thisYardPed].state CASE YARD_PED_STATE_IDLE SWITCH thisYardPed CASE YP_STATION_WALK_TO_GATE IF GET_GAME_TIMER() >= iSetpieceStageStartTime + 1500 AND setpieceStage >= SETPIECE_FREE_INTO_STATION SET_YARD_PED_STATE(thisYardPed, YARD_PED_STATE_WALKING, <<456.90, -636.52, 27.51>>, runnerChaseProperties.ped) ENDIF BREAK CASE YP_STATION_CONV_KNOCK_OVER SET_YARD_PED_STATE(thisYardPed, YARD_PED_STATE_TALKING, <<0,0,0>>, yardPed[YP_STATION_CONV_LOOK].ped) BREAK CASE YP_STATION_CONV_LOOK SET_YARD_PED_STATE(thisYardPed, YARD_PED_STATE_TALKING, <<0,0,0>>, yardPed[YP_STATION_CONV_KNOCK_OVER].ped) BREAK CASE YP_STATION_BACK_TURNED_KNOCK_OVER BREAK // construction site //CASE YP_CONSTRUCT_CONV_LOOK1 // SET_YARD_PED_STATE(thisYardPed, YARD_PED_STATE_TALKING, <<0,0,0>>, yardPed[YP_CONSTRUCT_CONV_LOOK2].ped) //BREAK //CASE YP_CONSTRUCT_CONV_LOOK2 // SET_YARD_PED_STATE(thisYardPed, YARD_PED_STATE_TALKING, <<0,0,0>>, yardPed[YP_CONSTRUCT_CONV_LOOK1].ped) //BREAK CASE YP_CONSTRUCT_WALK_SOUTH IF GET_GAME_TIMER() >= iSetpieceStageStartTime + 2000 AND setpieceStage >= SETPIECE_FREE_ACROSS_CONSTRUCTION SET_YARD_PED_STATE(thisYardPed, YARD_PED_STATE_WALKING, <<515.99988, -567.98999, 23.79971>>, runnerChaseProperties.ped) ENDIF BREAK CASE YP_CONSTRUCT_WALK_NORTH IF GET_GAME_TIMER() >= iSetpieceStageStartTime + 6000 AND setpieceStage >= SETPIECE_FREE_ACROSS_CONSTRUCTION SET_YARD_PED_STATE(thisYardPed, YARD_PED_STATE_WALKING, <<525.27997, -458.12784, 23.81619>>, runnerChaseProperties.ped) ENDIF BREAK ENDSWITCH BREAK CASE YARD_PED_STATE_TALKING IF GET_SCRIPT_TASK_STATUS(yardPed[thisYardPed].ped, SCRIPT_TASK_CHAT_TO_PED) = FINISHED_TASK SET_YARD_PED_STATE(thisYardPed, YARD_PED_STATE_IDLE, <<0,0,0>>) ENDIF BREAK CASE YARD_PED_STATE_WALKING FLOAT fPlayerDist FLOAT fChopDist FLOAT fRunnerDist IF GET_GAME_TIMER() >= yardPed[thisYardPed].iRecheckLookTime IF NOT IS_PED_INJURED(PLAYER_PED_ID()) AND NOT IS_PED_INJURED(chopPed) AND NOT IS_PED_INJURED(runnerChaseProperties.ped) fPlayerDist = GET_DISTANCE_BETWEEN_ENTITIES(yardPed[thisYardPed].ped, PLAYER_PED_ID(), FALSE) fChopDist = GET_DISTANCE_BETWEEN_ENTITIES(yardPed[thisYardPed].ped, chopPed, FALSE) fRunnerDist = GET_DISTANCE_BETWEEN_ENTITIES(yardPed[thisYardPed].ped, runnerChaseProperties.ped, FALSE) PED_INDEX lookAtPed IF fPlayerDist < fChopDist IF fPlayerDist < fRunnerDist lookAtPed = PLAYER_PED_ID() ELSE IF fRunnerDist < fChopDist lookAtPed = runnerChaseProperties.ped ELSE lookAtPed = chopPed ENDIF ENDIF ELSE IF fChopDist < fRunnerDist lookAtPed = chopPed ELSE lookAtPed = runnerChaseProperties.ped ENDIF ENDIF TASK_LOOK_AT_ENTITY(yardPed[thisYardPed].ped, lookAtPed, -1, SLF_WHILE_NOT_IN_FOV) yardPed[thisYardPed].iRecheckLookTime = GET_GAME_TIMER() + 1000 ENDIF ENDIF BREAK CASE YARD_PED_STATE_ENTER_SHOCKED IF IS_ENTITY_PLAYING_ANIM(yardPed[thisYardPed].ped, GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_FOOT_CHASE), "REACTION_FORWARD_BIG_INTRO_A") IF GET_ENTITY_ANIM_CURRENT_TIME(yardPed[thisYardPed].ped, GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_FOOT_CHASE), "REACTION_FORWARD_BIG_INTRO_A") >= 0.98 IF thisYardPed = YP_STATION_BACK_TURNED_KNOCK_OVER //SET_YARD_PED_STATE(thisYardPed, YARD_PED_STATE_LOOPING_SHOCKED, <<0,0,0>>) //SET_YARD_PED_STATE(thisYardPed, YARD_PED_STATE_EXIT_SHOCKED, <<0,0,0>>) SET_YARD_PED_STATE(thisYardPed, GET_END_YARD_PED_STATE(thisYardPed), <<0,0,0>>) ENDIF ENDIF ELSE IF (GET_GAME_TIMER() >= yardPed[thisYardPed].iStateTime + 3000 AND thisYardPed = YP_STATION_BACK_TURNED_KNOCK_OVER) OR GET_GAME_TIMER() >= yardPed[thisYardPed].iStateTime + 10000 OR vPlayerPos.y > -625 SET_YARD_PED_STATE(thisYardPed, GET_END_YARD_PED_STATE(thisYardPed), <<0,0,0>>) ELSE IF GET_GAME_TIMER() >= yardPed[thisYardPed].iStateTime + 1000 IF thisYardPed = YP_STATION_CONV_LOOK IF GET_SCRIPT_TASK_STATUS(yardPed[thisYardPed].ped, SCRIPT_TASK_TURN_PED_TO_FACE_ENTITY) = FINISHED_TASK AND GET_SCRIPT_TASK_STATUS(yardPed[thisYardPed].ped, SCRIPT_TASK_PERFORM_SEQUENCE) = FINISHED_TASK TASK_TURN_PED_TO_FACE_ENTITY(yardPed[thisYardPed].ped, runnerChaseProperties.ped, 30000) ENDIF ENDIF ENDIF ENDIF ENDIF BREAK CASE YARD_PED_STATE_LOOPING_SHOCKED IF GET_GAME_TIMER() >= yardPed[thisYardPed].iStateTime + GET_TIME_FOR_SHOCKED_ANIM(thisYardPed) SET_YARD_PED_STATE(thisYardPed, YARD_PED_STATE_EXIT_SHOCKED, <<0,0,0>>) ENDIF BREAK CASE YARD_PED_STATE_EXIT_SHOCKED IF IS_ENTITY_PLAYING_ANIM(yardPed[thisYardPed].ped, GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_FOOT_CHASE), "BIG_EXIT_TO_GENERIC") IF GET_ENTITY_ANIM_CURRENT_TIME(yardPed[thisYardPed].ped, GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_FOOT_CHASE), "BIG_EXIT_TO_GENERIC") >= 0.98 SET_YARD_PED_STATE(thisYardPed, GET_END_YARD_PED_STATE(thisYardPed), <<0,0,0>>) ENDIF ELSE IF GET_GAME_TIMER() >= yardPed[thisYardPed].iStateTime + 1000 SET_YARD_PED_STATE(thisYardPed, GET_END_YARD_PED_STATE(thisYardPed), <<0,0,0>>) ENDIF ENDIF BREAK CASE YARD_PED_STATE_RAGDOLL IF NOT IS_PED_RAGDOLL(yardPed[thisYardPed].ped) IF (thisYardPed = YP_STATION_BACK_TURNED_KNOCK_OVER AND GET_GAME_TIMER() >= yardPed[thisYardPed].iStateTime + 1000) OR GET_GAME_TIMER() >= yardPed[thisYardPed].iStateTime + 8000 OR vPlayerPos.y > -626 VECTOR vEndPos vEndPos=<<0,0,0>> vEndPos=vEndPos SWITCH thisYardPed CASE YP_STATION_BACK_TURNED_KNOCK_OVER vEndPos = <<432.37698, -589.83594, 27.49981>> BREAK ENDSWITCH SET_YARD_PED_STATE(thisYardPed, GET_END_YARD_PED_STATE(thisYardPed), vEndPos) ENDIF ENDIF BREAK CASE YARD_PED_STATE_WANDER IF GET_SCRIPT_TASK_STATUS(yardPed[thisYardPed].ped, SCRIPT_TASK_WANDER_STANDARD) = FINISHED_TASK SET_YARD_PED_STATE(thisYardPed, YARD_PED_STATE_WANDER, <<0,0,0>>) ENDIF BREAK CASE YARD_PED_STATE_FLEE IF GET_SCRIPT_TASK_STATUS(yardPed[thisYardPed].ped, SCRIPT_TASK_SMART_FLEE_PED) = FINISHED_TASK SET_YARD_PED_STATE(thisYardPed, YARD_PED_STATE_FLEE, <<0,0,0>>) ENDIF BREAK ENDSWITCH // specific changes IF yardPed[thisYardPed].state <> YARD_PED_STATE_FLEE SWITCH thisYardPed CASE YP_STATION_CONV_KNOCK_OVER IF IS_ENTITY_AT_ENTITY(yardPed[thisYardPed].ped, runnerChaseProperties.ped, <<1.5, 1.5, 0>>, FALSE, FALSE) AND NOT IS_PED_RAGDOLL(yardPed[thisYardPed].ped) SET_YARD_PED_STATE(thisYardPed, YARD_PED_STATE_RAGDOLL, <<2,0,0>>) ENDIF BREAK CASE YP_STATION_CONV_LOOK IF yardPed[YP_STATION_CONV_KNOCK_OVER].state = YARD_PED_STATE_RAGDOLL AND (yardPed[thisYardPed].state = YARD_PED_STATE_TALKING OR yardPed[thisYardPed].state = YARD_PED_STATE_IDLE) SET_YARD_PED_STATE(thisYardPed, YARD_PED_STATE_ENTER_SHOCKED, <<0,0,0>>) ENDIF BREAK CASE YP_STATION_BACK_TURNED_KNOCK_OVER IF IS_ENTITY_AT_ENTITY(yardPed[thisYardPed].ped, runnerChaseProperties.ped, <<1.5, 1.5, 0>>, FALSE, FALSE) AND NOT IS_PED_RAGDOLL(yardPed[thisYardPed].ped) SET_YARD_PED_STATE(thisYardPed, YARD_PED_STATE_RAGDOLL, <<-2,0,0>>) ENDIF BREAK //CASE YP_CONSTRUCT_CONV_LOOK1 // IF IS_ENTITY_AT_ENTITY(yardPed[thisYardPed].ped, runnerChaseProperties.ped, <<1.5, 1.5, 0>>, FALSE, FALSE) // AND (yardPed[thisYardPed].state = YARD_PED_STATE_TALKING OR yardPed[thisYardPed].state = YARD_PED_STATE_IDLE) // SET_YARD_PED_STATE(thisYardPed, YARD_PED_STATE_ENTER_SHOCKED, <<0,0,0>>, NULL, 279) // ENDIF //BREAK //CASE YP_CONSTRUCT_CONV_LOOK2 // IF IS_ENTITY_AT_ENTITY(yardPed[thisYardPed].ped, runnerChaseProperties.ped, <<1.5, 1.5, 0>>, FALSE, FALSE) // AND (yardPed[thisYardPed].state = YARD_PED_STATE_TALKING OR yardPed[thisYardPed].state = YARD_PED_STATE_IDLE) // SET_YARD_PED_STATE(thisYardPed, YARD_PED_STATE_ENTER_SHOCKED, <<0,0,0>>, NULL, 281) // ENDIF //BREAK ENDSWITCH // handle the peds reacting to chop IF NOT yardPed[thisYardPed].bReactedToChop IF NOT IS_PED_INJURED(chopPed) FLOAT fChopReactDistance SWITCH thisYardPed CASE YP_STATION_WALK_TO_GATE fChopReactDistance = 20.0 BREAK CASE YP_STATION_CONV_KNOCK_OVER fChopReactDistance = -1 BREAK CASE YP_STATION_CONV_LOOK fChopReactDistance = 3.0 BREAK CASE YP_STATION_BACK_TURNED_KNOCK_OVER fChopReactDistance = 6.0 BREAK CASE YP_CONSTRUCT_WALK_SOUTH fChopReactDistance = 6.0 BREAK CASE YP_CONSTRUCT_WALK_NORTH fChopReactDistance = 16.0 BREAK ENDSWITCH IF fChopReactDistance >= 0 //IF IS_ENTITY_AT_ENTITY(yardPed[thisYardPed].ped, chopPed, <>, FALSE, FALSE) IF IS_ENTITY_AT_ENTITY(yardPed[thisYardPed].ped, PLAYER_PED_ID(), <<6,6,6>>, FALSE, FALSE) IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() PLAY_PED_AMBIENT_SPEECH(yardPed[thisYardPed].ped, "GENERIC_SHOCKED_MED", SPEECH_PARAMS_FORCE_SHOUTED) yardPed[thisYardPed].bReactedToChop = TRUE ENDIF ENDIF ENDIF ENDIF ENDIF // run if player threatens them IF IS_PLAYER_THREATENING_PED(yardPed[thisYardPed].ped) SET_YARD_PED_STATE(thisYardPed, YARD_PED_STATE_FLEE, <<0,0,0>>) ENDIF ENDIF ENDIF ENDREPEAT ENDIF ENDPROC // attach the balla PROC ATTACH_BALLA_TO_VAN(BOOL bSetCoords = FALSE) IF NOT IS_PED_INJURED(runnerChaseProperties.ped) AND IS_VEHICLE_DRIVEABLE(hoodVehicle[HV_FRANKLIN_VAN]) IF bSetCoords SET_ENTITY_COORDS(runnerChaseProperties.ped, <<0,0,0>>, TRUE, TRUE) ENDIF INT iBone = GET_ENTITY_BONE_INDEX_BY_NAME(hoodVehicle[HV_FRANKLIN_VAN], "seat_pside_r") ATTACH_ENTITY_TO_ENTITY(runnerChaseProperties.ped, hoodVehicle[HV_FRANKLIN_VAN], iBone, vRunnerAttachToVanPos, vRunnerAttachToVanRot, FALSE, FALSE, TRUE, TRUE) ENDIF ENDPROC // bad guy flee PROC MAINTAIN_BAD_GUY_FLEE() // ensure bad guy runs away IF NOT IS_PED_INJURED(runnerChaseProperties.ped) AND NOT IS_PED_INJURED(PLAYER_PED_ID()) IF NOT IS_PED_IN_ANY_VEHICLE(runnerChaseProperties.ped) AND NOT IS_ENTITY_ATTACHED_TO_ANY_VEHICLE(runnerChaseProperties.ped) AND NOT IS_SYNCHRONIZED_SCENE_RUNNING(runnerChaseProperties.iSyncScene) //IF NOT IS_ENTITY_PLAYING_ANIM(runnerChaseProperties.ped, GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_DRIVE_HOME), "Incar_GetOutofBack_Ballas") IF NOT bRunningCutscene /* IF NOT bBadGuyRun VECTOR vBadGuyPos = GET_ENTITY_COORDS(runnerChaseProperties.ped) IF IS_PLAYER_THREATENING_PED(runnerChaseProperties.ped, FALSE) OR IS_SNIPER_BULLET_IN_AREA(vBadGuyPos - <<5,5,5>>, vBadGuyPos + <<5,5,5>>) OR IS_BULLET_IN_AREA(vBadGuyPos, 5.0) bBadGuyRun = TRUE ELSE IF GET_SCRIPT_TASK_STATUS(runnerChaseProperties.ped, SCRIPT_TASK_WANDER_STANDARD) = FINISHED_TASK AND GET_SCRIPT_TASK_STATUS(runnerChaseProperties.ped, SCRIPT_TASK_FOLLOW_NAV_MESH_TO_COORD) = FINISHED_TASK TASK_WANDER_STANDARD(runnerChaseProperties.ped) ENDIF ENDIF ELSE */ IF GET_SCRIPT_TASK_STATUS(runnerChaseProperties.ped, SCRIPT_TASK_SMART_FLEE_PED) = FINISHED_TASK TASK_SMART_FLEE_PED(runnerChaseProperties.ped, PLAYER_PED_ID(), 1000, -1) ENDIF //ENDIF ENDIF //ENDIF ELSE /* IF IS_ENTITY_PLAYING_ANIM(runnerChaseProperties.ped, GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_DRIVE_HOME), "Incar_GetOutofBack_Ballas") FLOAT fPhase = GET_ENTITY_ANIM_CURRENT_TIME(runnerChaseProperties.ped, GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_DRIVE_HOME), "Incar_GetOutofBack_Ballas") IF fPhase >= 0 IF fPhase >= 0.222 IF NOT bSetVanDoorsFree IF IS_VEHICLE_DRIVEABLE(hoodVehicle[HV_FRANKLIN_VAN]) STOP_ENTITY_ANIM(hoodVehicle[HV_FRANKLIN_VAN], "Incar_GetOutofBack_Speedo", GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_DRIVE_HOME), INSTANT_BLEND_OUT) ENDIF bSetVanDoorsFree = TRUE ENDIF IF IS_ENTITY_ATTACHED(runnerChaseProperties.ped) DETACH_ENTITY(runnerChaseProperties.ped, FALSE, FALSE) ENDIF ELSE vRunnerAttachToVanRot = GET_ANIM_INITIAL_OFFSET_ROTATION(GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_DRIVE_HOME), "Incar_GetOutofBack_Ballas", <<0,0,0>>, <<0,0,0>>, fPhase) vRunnerAttachToVanPos = GET_ANIM_INITIAL_OFFSET_POSITION(GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_DRIVE_HOME), "Incar_GetOutofBack_Ballas", <<0,0,0>>, <<0,0,0>>, fPhase) ATTACH_BALLA_TO_VAN() ENDIF ENDIF ENDIF */ ENDIF ENDIF ENDPROC // chop PROC HANDLE_CHOP() /* IF IS_VEHICLE_DRIVEABLE(dogVehicle) IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(dogVehicle) IF iChopStage < 5 INT iRec FLOAT fSkipTime FLOAT fPlaybackSpeed INT iStartTime RUNNER_STAGE_ENUM startStage SWITCH iChopStage CASE 0 iRec = 013 startStage = RUNNER_START_FLEE BREAK CASE 1 iRec = 014 startStage = RUNNER_TO_CAR fSkipTime = 1800 BREAK CASE 2 iRec = 015 fSkipTime = 1500 startStage = RUNNER_TO_FLATBEDS BREAK CASE 3 iRec = 016 startStage = RUNNER_TO_BOXCAR BREAK CASE 4 iRec = 017 startStage = RUNNER_TO_TRAIN BREAK ENDSWITCH IF runnerStage >= startStage IF GET_GAME_TIMER() >= iRunnerStageStartTime + iStartTime IF iChopStage <> 2 // temp vehicle recording fudge to wait at fence OR bDoneThroughFenceCut START_PLAYBACK_RECORDED_VEHICLE(dogVehicle, iRec, GET_HOOD_RECORDING_PREFIX()) SKIP_TIME_IN_PLAYBACK_RECORDED_VEHICLE(dogVehicle, fSkipTime) fChopSpeed = 0.85 SET_PLAYBACK_SPEED(dogVehicle, fChopSpeed) iChopStage++ ENDIF ENDIF ENDIF ELSE IF iChopStage = 5 SET_ENTITY_COORDS(dogVehicle, <<517.47, -617.94, 23.75>>) SET_ENTITY_HEADING(dogVehicle, 172.65) SET_VEHICLE_ON_GROUND_PROPERLY(dogVehicle) iChopStage++ ENDIF ENDIF ELSE // calculate speed FLOAT fDistance = GET_DISTANCE_BETWEEN_ENTITIES(dogVehicle, runnerChaseProperties.ped) IF fDistance >= 6.0 fChopSpeed = fChopSpeed +@ 1.5 IF fChopSpeed >= 0.85 fChopSpeed = 0.85 ENDIF ELSE fChopSpeed = fChopSpeed -@ 1.5 IF fChopSpeed <= 0.3 fChopSpeed = 0.3 ENDIF ENDIF SET_PLAYBACK_SPEED(dogVehicle, fChopSpeed) ENDIF ENDIF */ ENDPROC // setpieces for foot chase PROC HANDLE_CHASE_SETPIECES() HANDLE_YARD_VEHICLES() HANDLE_TRAINS() HANDLE_YARD_PEDS() HANDLE_CHOP() ENDPROC PROC REMOVE_SETPIECE_VEHICLE_DRIVER(VEHICLE_INDEX veh) IF IS_VEHICLE_DRIVEABLE(veh) PED_INDEX ped = GET_PED_IN_VEHICLE_SEAT(veh) IF DOES_ENTITY_EXIST(ped) SET_PED_AS_NO_LONGER_NEEDED(ped) ENDIF ENDIF ENDPROC // get rid of initial traffic PROC REMOVE_TRAFFIC_OUTSIDE_STATION() INT i REPEAT NUMBER_YARD_VEHICLES i IF i=2 IF DOES_ENTITY_EXIST(yardVehicle[i]) REMOVE_SETPIECE_VEHICLE_DRIVER(yardVehicle[i]) SET_VEHICLE_AS_NO_LONGER_NEEDED(yardVehicle[i]) ENDIF ENDIF ENDREPEAT bRemovedTraffic = TRUE ENDPROC // get rid of everything in bus station PROC REMOVE_BUS_STATION() INT i REPEAT NUMBER_YARD_VEHICLES i IF i=2 OR i=3 OR i=7 OR i=8 OR i=9 IF DOES_ENTITY_EXIST(yardVehicle[i]) REMOVE_SETPIECE_VEHICLE_DRIVER(yardVehicle[i]) SET_VEHICLE_AS_NO_LONGER_NEEDED(yardVehicle[i]) ENDIF ENDIF ENDREPEAT REPEAT NUMBER_YARD_PEDS i IF i<4 IF DOES_ENTITY_EXIST(yardPed[i].ped) SET_PED_AS_NO_LONGER_NEEDED(yardPed[i].ped) ENDIF ENDIF ENDREPEAT bRemovedBusStation = TRUE ENDPROC PROC REMOVE_CHASE_SETPIECES() INT i REPEAT COUNT_OF(driverPed) i IF DOES_ENTITY_EXIST(driverPed[i]) SET_PED_AS_NO_LONGER_NEEDED(driverPed[i]) ENDIF ENDREPEAT REPEAT NUMBER_YARD_VEHICLES i IF DOES_ENTITY_EXIST(yardVehicle[i]) SET_VEHICLE_AS_NO_LONGER_NEEDED(yardVehicle[i]) ENDIF ENDREPEAT REPEAT NUMBER_TRAINS i IF DOES_ENTITY_EXIST(trainVehicle[i]) SET_MISSION_TRAIN_AS_NO_LONGER_NEEDED(trainVehicle[i], ENUM_TO_INT(RTF_KEEP_OLD_SPEED)) ENDIF ENDREPEAT REPEAT NUMBER_YARD_PEDS i IF DOES_ENTITY_EXIST(yardPed[i].ped) SET_PED_AS_NO_LONGER_NEEDED(yardPed[i].ped) ENDIF ENDREPEAT IF DOES_ENTITY_EXIST(colliePed) SET_PED_AS_NO_LONGER_NEEDED(colliePed) ENDIF REPEAT NUMBER_BOXCARS i INT j REPEAT 2 j IF DOES_ENTITY_EXIST(boxcarCarriage[i].boxcarDoor[j].obj) DELETE_OBJECT(boxcarCarriage[i].boxcarDoor[j].obj) ENDIF IF DOES_ENTITY_EXIST(boxcarCarriage[i].boxcarDoor[j].handleObject) DELETE_OBJECT(boxcarCarriage[i].boxcarDoor[j].handleObject) ENDIF ENDREPEAT IF DOES_ENTITY_EXIST(boxcarCarriage[i].anchorObject) DELETE_OBJECT(boxcarCarriage[i].anchorObject) ENDIF ENDREPEAT bRemovedChaseSetpieces = TRUE ENDPROC PROC DO_LAMAR_WALK_TO_VAN() IF NOT bDoneLamarWalkToVan IF NOT IS_PED_GROUP_MEMBER(lamarPed, PLAYER_GROUP_ID()) BOOL bDoWalk = FALSE IF GET_SCRIPT_TASK_STATUS(lamarPed, SCRIPT_TASK_SYNCHRONIZED_SCENE) = FINISHED_TASK bDoWalk = TRUE ELSE // IF GET_SYNCHRONIZED_SCENE_PHASE(iLamarSyncScene) >= 0.73 // bDoWalk = TRUE // ENDIF ENDIF IF bDoWalk TASK_CLEAR_LOOK_AT(lamarPed) SET_ENTITY_NO_COLLISION_ENTITY(lamarPed, hoodVehicle[HV_FRANKLIN_VAN], TRUE) TASK_ENTER_VEHICLE(lamarPed, hoodVehicle[HV_FRANKLIN_VAN], DEFAULT_TIME_BEFORE_WARP, VS_FRONT_RIGHT, PEDMOVE_WALK) iEnterVanTaskTime = GET_GAME_TIMER() bDoneLamarWalkToVan = TRUE ENDIF ENDIF ENDIF ENDPROC // close all van doors PROC SHUT_ALL_VAN_DOORS() IF IS_VEHICLE_DRIVEABLE(hoodVehicle[HV_FRANKLIN_VAN]) SET_VEHICLE_DOOR_SHUT(hoodVehicle[HV_FRANKLIN_VAN], SC_DOOR_FRONT_RIGHT) SET_VEHICLE_DOOR_SHUT(hoodVehicle[HV_FRANKLIN_VAN], SC_DOOR_FRONT_LEFT) SET_VEHICLE_DOOR_SHUT(hoodVehicle[HV_FRANKLIN_VAN], SC_DOOR_REAR_LEFT) SET_VEHICLE_DOOR_SHUT(hoodVehicle[HV_FRANKLIN_VAN], SC_DOOR_REAR_RIGHT) ENDIF ENDPROC #IF IS_DEBUG_BUILD PROC DO_DEBUG_VAN_CAM_POSITION() IF DOES_CAM_EXIST(staticCam) IF IS_VEHICLE_DRIVEABLE(hoodVehicle[HV_FRANKLIN_VAN]) ATTACH_CAM_TO_ENTITY(staticCam, hoodVehicle[HV_FRANKLIN_VAN], vDebugVanCamOffset) POINT_CAM_AT_ENTITY(staticCam, hoodVehicle[HV_FRANKLIN_VAN], vDebugVanCamPoint) SET_CAM_FOV(staticCam, fDebugVanCamFOV) ENDIF ENDIF ENDPROC #ENDIF // common stuff for cutscene skip PROC HANDLE_SKIP_CUTSCENE() IF IS_CUTSCENE_SKIP_BUTTON_JUST_PRESSED() AND GET_GAME_TIMER() >= iAllowSkipCutsceneTime + 1000 DO_SCREEN_FADE_OUT(DEFAULT_FADE_TIME) WHILE NOT IS_SCREEN_FADED_OUT() WAIT(0) ENDWHILE HANG_UP_AND_PUT_AWAY_PHONE() KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() bSkippedCutscene = TRUE cutsceneStage = H_CUT_STAGE_CLEANUP ENDIF ENDPROC /* // into van cutscene PROC DO_INTO_VAN_CUTSCENE() SWITCH cutsceneStage CASE H_CUT_STAGE_INIT //SET_MISSION_CUTSCENE(TRUE) iHoodCutsceneTime = GET_GAME_TIMER() IF NOT IS_PED_INJURED(PLAYER_PED_ID()) TASK_CLEAR_LOOK_AT(PLAYER_PED_ID()) REGISTER_ENTITY_FOR_CUTSCENE(PLAYER_PED_ID(), "Franklin", CU_ANIMATE_EXISTING_SCRIPT_ENTITY) ENDIF IF NOT IS_PED_INJURED(lamarPed) TASK_CLEAR_LOOK_AT(lamarPed) IF IS_VEHICLE_DRIVEABLE(hoodVehicle[HV_FRANKLIN_VAN]) SET_ENTITY_NO_COLLISION_ENTITY(lamarPed, hoodVehicle[HV_FRANKLIN_VAN], TRUE) ENDIF REGISTER_ENTITY_FOR_CUTSCENE(lamarPed, "Lamar", CU_ANIMATE_EXISTING_SCRIPT_ENTITY) ENDIF IF NOT IS_PED_INJURED(chopPed) DETACH_ENTITY(chopPed) IF IS_VEHICLE_DRIVEABLE(hoodVehicle[HV_FRANKLIN_VAN]) SET_ENTITY_NO_COLLISION_ENTITY(chopPed, hoodVehicle[HV_FRANKLIN_VAN], TRUE) ENDIF REGISTER_ENTITY_FOR_CUTSCENE(chopPed, "Chop", CU_ANIMATE_EXISTING_SCRIPT_ENTITY) ENDIF IF IS_VEHICLE_DRIVEABLE(hoodVehicle[HV_FRANKLIN_VAN]) FREEZE_ENTITY_POSITION(hoodVehicle[HV_FRANKLIN_VAN], FALSE) REGISTER_ENTITY_FOR_CUTSCENE(hoodVehicle[HV_FRANKLIN_VAN], "Kidnapping_van", CU_ANIMATE_EXISTING_SCRIPT_ENTITY) ENDIF START_CUTSCENE() SET_CUTSCENE_FADE_VALUES(FALSE, FALSE, FALSE, FALSE) cutsceneStage = H_CUT_STAGE_RUNNING BREAK CASE H_CUT_STAGE_RUNNING // clear the area IF NOT bClearedForCutscene IF IS_CUTSCENE_PLAYING() SET_MISSION_MOCAP_CUTSCENE() CLEAR_AREA(<<-76.63, -1456.25, 31.05>>, 6.0, TRUE) bClearedForCutscene = TRUE ENDIF ENDIF // exit state for van IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Kidnapping_van") IF IS_VEHICLE_DRIVEABLE(hoodVehicle[HV_FRANKLIN_VAN]) SHUT_ALL_VAN_DOORS() SET_VEHICLE_ON_GROUND_PROPERLY(hoodVehicle[HV_FRANKLIN_VAN]) SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(hoodVehicle[HV_FRANKLIN_VAN], TRUE) ENDIF ENDIF // exit state for lamar IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Lamar") IF NOT IS_PED_INJURED(lamarPed) IF NOT IS_PED_IN_VEHICLE(lamarPed, hoodVehicle[HV_FRANKLIN_VAN]) SET_PED_INTO_VEHICLE(lamarPed, hoodVehicle[HV_FRANKLIN_VAN], VS_FRONT_RIGHT) FORCE_PED_AI_AND_ANIMATION_UPDATE(lamarPed) ENDIF ENDIF ENDIF // exit state for chop IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Chop") SET_CHOP_INTO_VAN(chopPed, hoodVehicle[HV_FRANKLIN_VAN], chopLeanInVanState, fCachedVanSpeed) ENDIF // exit state for franklin IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Franklin") IF NOT IS_PED_INJURED(PLAYER_PED_ID()) IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), hoodVehicle[HV_FRANKLIN_VAN]) SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), hoodVehicle[HV_FRANKLIN_VAN], VS_DRIVER) FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID()) ENDIF ENDIF ENDIF // exit state for camera IF CAN_SET_EXIT_STATE_FOR_CAMERA() SET_ALL_RANDOM_PEDS_FLEE(PLAYER_ID(), FALSE) bDoneBanter = FALSE bSavedBanter = FALSE bShownGodText = FALSE bDoneLamarIntoVan = TRUE iNextChopSoundTime = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(2000, 3000) iGetInTextStage = 2 SET_WANTED_LEVEL_MULTIPLIER(1.0) SET_MISSION_CUTSCENE(FALSE) ENDIF #IF IS_DEBUG_BUILD DEBUG_SKIP_MOCAP() #ENDIF BREAK CASE H_CUT_STAGE_CLEANUP BREAK ENDSWITCH ENDPROC */ PROC SET_FRANKLIN_SPRINT_TO_VAN(BOOL bReposition) IF bReposition SET_ENTITY_COORDS(PLAYER_PED_ID(), GET_HOOD_VECTOR(HVEC_FRANKLIN_ALLEY_INIT)) SET_ENTITY_HEADING(PLAYER_PED_ID(), FRANKLIN_ALLEY_INIT_ROT) ENDIF //TASK_GO_STRAIGHT_TO_COORD(PLAYER_PED_ID(), <<368.58, 344.62, 102.09>>, PEDMOVE_SPRINT) IF GET_FOLLOW_PED_CAM_VIEW_MODE() <> CAM_VIEW_MODE_FIRST_PERSON FORCE_PED_MOTION_STATE(PLAYER_PED_ID(), MS_ON_FOOT_SPRINT, bReposition, FAUS_CUTSCENE_EXIT) SET_PED_MIN_MOVE_BLEND_RATIO(PLAYER_PED_ID(), PEDMOVE_SPRINT) ELSE FORCE_PED_MOTION_STATE(PLAYER_PED_ID(), MS_AIMING, bReposition, FAUS_CUTSCENE_EXIT) SIMULATE_PLAYER_INPUT_GAIT(PLAYER_ID(), PEDMOVE_SPRINT, 2000) ENDIF ENDPROC FUNC BOOL IS_PLAYER_AT_VAN() RETURN IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<-81.93492, -1453.06018, 30.99545>>, <<-73.88771, -1467.59851, 34.96272>>, 10.5) ENDFUNC // bad guy escapes cutscene PROC DO_BAD_GUY_ESCAPE_CUTSCENE() SET_ALL_RANDOM_PEDS_FLEE_THIS_FRAME(PLAYER_ID()) SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0) SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0) SET_PARKED_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0) SWITCH cutsceneStage CASE H_CUT_STAGE_INIT //SET_MISSION_CUTSCENE(TRUE) iHoodCutsceneTime = GET_GAME_TIMER() // clear the area IF NOT IS_PED_INJURED(PLAYER_PED_ID()) SET_PED_STEALTH_MOVEMENT(PLAYER_PED_ID(), FALSE) REGISTER_ENTITY_FOR_CUTSCENE(PLAYER_PED_ID(), "Franklin", CU_ANIMATE_EXISTING_SCRIPT_ENTITY) ENDIF IF NOT IS_PED_INJURED(lamarPed) REGISTER_ENTITY_FOR_CUTSCENE(lamarPed, "Lamar", CU_ANIMATE_EXISTING_SCRIPT_ENTITY) SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(lamarPed, TRUE) ENDIF IF NOT IS_PED_INJURED(runnerChaseProperties.ped) TASK_CLEAR_LOOK_AT(runnerChaseProperties.ped) REGISTER_ENTITY_FOR_CUTSCENE(runnerChaseProperties.ped, "Ballas_OG", CU_ANIMATE_EXISTING_SCRIPT_ENTITY) ENDIF IF NOT IS_PED_INJURED(girlPed) REGISTER_ENTITY_FOR_CUTSCENE(girlPed, "Hoodrat_girl", CU_ANIMATE_EXISTING_SCRIPT_ENTITY) ENDIF IF IS_VEHICLE_DRIVEABLE(hoodVehicle[HV_BAD_GUY_BIKE]) IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(hoodVehicle[HV_BAD_GUY_BIKE]) STOP_PLAYBACK_RECORDED_VEHICLE(hoodVehicle[HV_BAD_GUY_BIKE]) ENDIF REGISTER_ENTITY_FOR_CUTSCENE(hoodVehicle[HV_BAD_GUY_BIKE], "BallasOG_Bike", CU_ANIMATE_EXISTING_SCRIPT_ENTITY) ENDIF START_CUTSCENE() REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST) SET_CUTSCENE_FADE_VALUES(FALSE, FALSE, FALSE, FALSE) cutsceneStage = H_CUT_STAGE_RUNNING BREAK CASE H_CUT_STAGE_RUNNING // clear the area IF NOT bClearedForCutscene IF IS_CUTSCENE_PLAYING() SET_MISSION_MOCAP_CUTSCENE() PED_COMP_NAME_ENUM eHeadProp eHeadProp = GET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_PROPS, ENUM_TO_INT(ANCHOR_HEAD)) IF IS_ITEM_A_MASK(GET_ENTITY_MODEL(PLAYER_PED_ID()), COMP_TYPE_PROPS, eHeadProp) SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(),COMP_TYPE_PROPS, PROPS_HEAD_NONE, FALSE) ENDIF IF IS_VEHICLE_DRIVEABLE(hoodVehicle[HV_FRANKLIN_VAN]) DETACH_VEHICLE_FROM_ANY_TOW_TRUCK(hoodVehicle[HV_FRANKLIN_VAN]) ENDIF CLEAR_AREA(<<369.24, 344.64, 102.08>>, 27.0, TRUE) CLEAR_AREA(<<363.57892, 322.47748, 102.70776>>, 16.0, TRUE) CLEAR_AREA_OF_VEHICLES(<<340.95465, 247.10138, 102.75685>>, 92.0, FALSE) CLEAR_AREA_OF_PEDS(<<364.94711, 313.03796, 102.63920>>, 114.0, TRUE) CLEAR_AREA_OF_PROJECTILES(<<370.34372, 343.42828, 102.09016>>, 52) STOP_FIRE_IN_RANGE(<<370.34372, 343.42828, 102.09016>>, 52) REMOVE_PARTICLE_FX_IN_RANGE(<<370.34372, 343.42828, 102.09016>>, 52) STOP_HOOD_AUDIO_SCENE(HOOD_AUDIO_SCENE_DRIVE_TO_VINEWOOD) INT i REPEAT NUMBER_BLOCKING_VEHICLES i IF DOES_ENTITY_EXIST(blockingVehicle[i]) DELETE_VEHICLE(blockingVehicle[i]) ENDIF ENDREPEAT CLEAR_MODEL_REQUEST(ENUM_TO_INT(HM_BLOCKING_TRUCK)) CLEAR_MODEL_REQUEST(ENUM_TO_INT(HM_BLOCKING_CAR)) IF IS_VEHICLE_DRIVEABLE(hoodVehicle[HV_FRANKLIN_VAN]) //CLOSE_ALL_VAN_DOORS() DETACH_VEHICLE_FROM_ANY_TOW_TRUCK(hoodVehicle[HV_FRANKLIN_VAN]) SET_VEH_RADIO_STATION(hoodVehicle[HV_FRANKLIN_VAN], "OFF") SHUT_ALL_VAN_DOORS() FREEZE_ENTITY_POSITION(hoodVehicle[HV_FRANKLIN_VAN], FALSE) SET_ENTITY_COORDS(hoodVehicle[HV_FRANKLIN_VAN], GET_HOOD_VECTOR(HVEC_VAN_CHASE_INIT)) SET_ENTITY_HEADING(hoodVehicle[HV_FRANKLIN_VAN], VAN_CHASE_INIT_ROT) SET_VEHICLE_ON_GROUND_PROPERLY(hoodVehicle[HV_FRANKLIN_VAN]) SET_VEHICLE_ENGINE_ON(hoodVehicle[HV_FRANKLIN_VAN], TRUE, TRUE) STOP_VEHICLE_FIRE(hoodVehicle[HV_FRANKLIN_VAN]) ENDIF 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 GET_CUTSCENE_TIME() >= 45231 DISABLE_CONTROL_ACTION(FRONTEND_CONTROL, INPUT_SKIP_CUTSCENE) ENDIF IF NOT bDoneLamarPullGunCue IF GET_CUTSCENE_TIME() >= 37400 bDoneLamarPullGunCue = TRIGGER_MISSION_MUSIC_EVENT("FRA0_MISSION_START") ENDIF ENDIF IF NOT bDoneBikeSpeedOffCue IF GET_CUTSCENE_TIME() >= 42200 bDoneBikeSpeedOffCue = TRIGGER_MISSION_MUSIC_EVENT("FRA0_SPEED_OFF") ENDIF ENDIF IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Lamar", IG_LAMARDAVIS) SET_LAMAR_SPRINT_TO_VAN(FALSE) ENDIF IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("BallasOG_Bike") SET_BIKE_TO_ESCAPE() ENDIF IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Ballas_OG") SET_BALLA_ON_BIKE() ENDIF IF WAS_CUTSCENE_SKIPPED() WHILE NOT IS_SCREEN_FADED_OUT() WAIT(0) ENDWHILE WHILE NOT HAS_CUTSCENE_FINISHED() WAIT(0) ENDWHILE SET_BALLA_ON_BIKE() SET_ENTITY_COORDS(PLAYER_PED_ID(), <<371.09839, 359.33514, 101.60266>>) SET_ENTITY_HEADING(PLAYER_PED_ID(), 170) LOAD_SCENE(<<371.09839, 359.33514, 101.60266>>) WAIT(0) REPLAY_STOP_EVENT() SET_LAMAR_SPRINT_TO_VAN(TRUE) SET_BIKE_TO_ESCAPE() SET_GAMEPLAY_CAM_RELATIVE_HEADING() SET_GAMEPLAY_CAM_RELATIVE_PITCH() IF NOT bDoneLamarPullGunCue bDoneLamarPullGunCue = TRIGGER_MISSION_MUSIC_EVENT("FRA0_CHASE_RESTART") ENDIF SET_MISSION_STAGE(STAGE_VAN_CHASE) SET_FRANKLIN_SPRINT_TO_VAN(TRUE) SET_MISSION_CUTSCENE(FALSE) ELSE IF HAS_CUTSCENE_FINISHED() REPLAY_STOP_EVENT() SET_MISSION_CUTSCENE(FALSE, TRUE, -1, FALSE) SET_MISSION_STAGE(STAGE_VAN_CHASE) ENDIF IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Franklin") SET_FRANKLIN_SPRINT_TO_VAN(FALSE) ENDIF IF GET_FOLLOW_PED_CAM_VIEW_MODE() <> CAM_VIEW_MODE_FIRST_PERSON SET_PED_MIN_MOVE_BLEND_RATIO(PLAYER_PED_ID(), PEDMOVE_SPRINT) ELSE SIMULATE_PLAYER_INPUT_GAIT(PLAYER_ID(), PEDMOVE_SPRINT, 2000) ENDIF ENDIF #IF IS_DEBUG_BUILD DEBUG_SKIP_MOCAP() #ENDIF BREAK CASE H_CUT_STAGE_CLEANUP BREAK ENDSWITCH ENDPROC CONST_FLOAT LAMAR_PAUSE_DIST 3.6//7.0 CONST_FLOAT LAMAR_UNPAUSE_DIST 3.2//4.1//3.2 // get to the bad guy's hangout PROC DO_STAGE_GET_TO_BAD_GUY() // help to download app IF NOT bForcePassOnShitskip DO_FIRST_DOWNLOAD_HELP() ENDIF IF NOT bRunningCutscene DISABLE_CONTROL_ACTION(FRONTEND_CONTROL, INPUT_SKIP_CUTSCENE) // create stuff post intro SWITCH createPostIntroStage CASE CREATE_POST_INTRO_STAGE_NOT_STARTED ADD_MODEL_REQUEST(ENUM_TO_INT(HM_FRANKLIN_VAN)) createPostIntroStage = CREATE_POST_INTRO_STAGE_WAITING BREAK CASE CREATE_POST_INTRO_STAGE_WAITING IF HAVE_ALL_MODEL_REQUESTS_SUCCEEDED() HOOD_CREATE_VEHICLE(HV_FRANKLIN_VAN, GET_HOOD_VECTOR(HVEC_FRANKLIN_VAN_INIT), FRANKLIN_VAN_INIT_ROT) SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(hoodVehicle[HV_FRANKLIN_VAN], FALSE) createPostIntroStage = CREATE_POST_INTRO_STAGE_DONE iCreateVanTime = GET_GAME_TIMER() ENDIF BREAK CASE CREATE_POST_INTRO_STAGE_DONE IF NOT bFrozenVan IF NOT bDoneLamarIntoVan IF GET_GAME_TIMER() >= iCreateVanTime + 2000 FREEZE_ENTITY_POSITION(hoodVehicle[HV_FRANKLIN_VAN], TRUE) bFrozenVan = TRUE ENDIF ENDIF ENDIF BREAK ENDSWITCH IF bForcePassOnShitskip IF NOT bWarpedVanToAlley IF IS_VEHICLE_DRIVEABLE(hoodVehicle[HV_FRANKLIN_VAN]) IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), hoodVehicle[HV_FRANKLIN_VAN]) SET_ENTITY_COORDS(hoodVehicle[HV_FRANKLIN_VAN], GET_HOOD_VECTOR(HVEC_BAD_GUY_HANGOUT)) SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(hoodVehicle[HV_FRANKLIN_VAN], TRUE) SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), hoodVehicle[HV_FRANKLIN_VAN]) SET_PED_INTO_VEHICLE(lamarPed, hoodVehicle[HV_FRANKLIN_VAN], VS_FRONT_RIGHT) SET_CHOP_INTO_VAN(chopPed, hoodVehicle[HV_FRANKLIN_VAN], chopLeanInVanState, fCachedVanSpeed, FALSE, TRUE, TRUE) SET_ENTITY_PROOFS(chopPed, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, TRUE) SET_PED_CAN_RAGDOLL(chopPed, FALSE) TASK_CLEAR_LOOK_AT(lamarPed) SET_ENTITY_NO_COLLISION_ENTITY(lamarPed, hoodVehicle[HV_FRANKLIN_VAN], TRUE) bDoneFranklinIntoVanSpeech = TRUE FREEZE_ENTITY_POSITION(hoodVehicle[HV_FRANKLIN_VAN], FALSE) // LOAD_SCENE(GET_HOOD_VECTOR(HVEC_BAD_GUY_HANGOUT)) WAIT(0) chopIntoVanState = CHOP_INTO_VAN_STATE_DONE bDoneLamarIntoVan = TRUE bCutsceneWaitStarted = TRUE bWarpedVanToAlley = TRUE ENDIF ENDIF ENDIF ENDIF SWITCH createBadGuyStage CASE CREATE_BAD_GUY_STAGE_NOT_STARTED IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), GET_HOOD_VECTOR(HVEC_GIRL_INIT), <<700,700,700>>, FALSE, FALSE) ADD_MODEL_REQUEST(ENUM_TO_INT(HM_BAD_GUY)) iCreateBadGuyTime = GET_GAME_TIMER() + 2000 createBadGuyStage = CREATE_BAD_GUY_STAGE_WAITING1 ENDIF BREAK CASE CREATE_BAD_GUY_STAGE_WAITING1 IF GET_GAME_TIMER() >= iCreateBadGuyTime AND IS_ENTITY_AT_COORD(PLAYER_PED_ID(), GET_HOOD_VECTOR(HVEC_GIRL_INIT), <<600,600,600>>, FALSE, FALSE) ADD_MODEL_REQUEST(ENUM_TO_INT(HM_GIRL)) iCreateBadGuyTime = GET_GAME_TIMER() + 2000 createBadGuyStage = CREATE_BAD_GUY_STAGE_WAITING2 ENDIF BREAK CASE CREATE_BAD_GUY_STAGE_WAITING2 IF GET_GAME_TIMER() >= iCreateBadGuyTime AND IS_ENTITY_AT_COORD(PLAYER_PED_ID(), GET_HOOD_VECTOR(HVEC_GIRL_INIT), <<500,500,500>>, FALSE, FALSE) ADD_MODEL_REQUEST(ENUM_TO_INT(HM_BIKE)) createBadGuyStage = CREATE_BAD_GUY_STAGE_WAITING3 ENDIF BREAK CASE CREATE_BAD_GUY_STAGE_WAITING3 IF HAVE_ALL_MODEL_REQUESTS_SUCCEEDED() // bad guy and girl CREATE_BAD_GUY_FOR_STAGE(STAGE_GET_TO_BAD_GUY) createBadGuyStage = CREATE_BAD_GUY_STAGE_CREATE_GIRL ENDIF BREAK CASE CREATE_BAD_GUY_STAGE_CREATE_GIRL CREATE_GIRL_FOR_STAGE(STAGE_GET_TO_BAD_GUY) createBadGuyStage = CREATE_BAD_GUY_STAGE_DONE BREAK CASE CREATE_BAD_GUY_STAGE_DONE // handle girl IF missionFailState = MISSION_FAIL_STATE_NOT_FAILED IF NOT IS_PED_INJURED(girlPed) AND NOT IS_PED_INJURED(runnerChaseProperties.ped) IF GET_SCRIPT_TASK_STATUS(girlPed, SCRIPT_TASK_CHAT_TO_PED) = FINISHED_TASK TASK_CHAT_TO_PED(girlPed, runnerChaseProperties.ped, CF_IS_INITIATOR, <<0,0,0>>, 0, 0) ENDIF ENDIF ENDIF BREAK ENDSWITCH IF NOT bForcePassOnShitskip SWITCH createBlockingVehiclesStage CASE CREATE_BLOCKING_VEHICLES_STAGE_NOT_STARTED IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<335.21927, 338.35443, 104.20057>>, <<900,900,900>>, FALSE, FALSE) ADD_MODEL_REQUEST(ENUM_TO_INT(HM_BLOCKING_TRUCK)) iCreateBlockingVehiclesTime = GET_GAME_TIMER() + 2000 createBlockingVehiclesStage = CREATE_BLOCKING_VEHICLES_STAGE_WAITING1 ENDIF BREAK CASE CREATE_BLOCKING_VEHICLES_STAGE_WAITING1 IF GET_GAME_TIMER() >= iCreateBlockingVehiclesTime AND IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<335.21927, 338.35443, 104.20057>>, <<800,800,800>>, FALSE, FALSE) ADD_MODEL_REQUEST(ENUM_TO_INT(HM_BLOCKING_CAR)) createBlockingVehiclesStage = CREATE_BLOCKING_VEHICLES_STAGE_WAITING2 ENDIF BREAK CASE CREATE_BLOCKING_VEHICLES_STAGE_WAITING2 IF HAVE_ALL_MODEL_REQUESTS_SUCCEEDED() CREATE_BLOCKING_VEHICLES() createBlockingVehiclesStage = CREATE_BLOCKING_VEHICLES_STAGE_DONE ENDIF BREAK CASE CREATE_BLOCKING_VEHICLES_STAGE_DONE BREAK ENDSWITCH ENDIF // can't move van til chop in IF IS_VEHICLE_DRIVEABLE(hoodVehicle[HV_FRANKLIN_VAN]) IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), hoodVehicle[HV_FRANKLIN_VAN]) IF chopIntoVanState < CHOP_INTO_VAN_STATE_DONE DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_ACCELERATE) DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_BRAKE) DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_HANDBRAKE) DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_DUCK) DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_MOVE_LR) DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_MOVE_UD) ENDIF ENDIF ENDIF IF NOT bForcePassOnShitskip // chop bark at start IF NOT IS_PED_INJURED(chopPed) IF NOT bStoppedChopExcitement IF GET_GAME_TIMER() >= iNextChopExcitementTime STOP_PED_SPEAKING(chopPed, FALSE) PLAY_ANIMAL_VOCALIZATION(chopPed, AUD_ANIMAL_DOG_ROTTWEILER, "BARK") STOP_PED_SPEAKING(chopPed, TRUE) iNextChopExcitementTime = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(300, 800) ENDIF IF GET_GAME_TIMER() >= iStopChopExcitementTime STOP_PED_SPEAKING(chopPed, FALSE) bStoppedChopExcitement = TRUE ENDIF ENDIF ENDIF ENDIF IF NOT bForcePassOnShitSkip // check to see if spooked bad guy BOOL bBadGuySpooked = FALSE IF NOT IS_PED_INJURED(runnerChaseProperties.ped) IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(runnerChaseProperties.ped, PLAYER_PED_ID()) OR GET_DISTANCE_BETWEEN_ENTITIES(runnerChaseProperties.ped, PLAYER_PED_ID(), FALSE) < 5.0 bBadGuySpooked = TRUE ENDIF ENDIF IF DOES_ENTITY_EXIST(girlPed) IF NOT IS_PED_INJURED(girlPed) IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(girlPed, PLAYER_PED_ID()) bBadGuySpooked = TRUE ENDIF ELSE bBadGuySpooked = TRUE ENDIF ENDIF IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<385.480, 354.650, 101.400>>, <<386.540, 360.310, 104.710>>, 23.5) //13.4 OR IS_PED_SHOOTING_IN_AREA(PLAYER_PED_ID(), <<361.21, 334.32, 95.0>>, <<435.91, 351.51, 113.0>>, FALSE) OR IS_SNIPER_BULLET_IN_AREA(GET_HOOD_VECTOR(HVEC_GIRL_INIT) - <<5,5,5>>, GET_HOOD_VECTOR(HVEC_GIRL_INIT) + <<5,5,5>>) OR IS_BULLET_IN_AREA(GET_HOOD_VECTOR(HVEC_GIRL_INIT), 5.0) OR GET_NUMBER_OF_FIRES_IN_RANGE(GET_HOOD_VECTOR(HVEC_GIRL_INIT), 18.8) > 0 bBadGuySpooked = TRUE ENDIF IF bBadGuySpooked IF NOT bDoneBadGuySpookedReact IF NOT IS_PED_INJURED(runnerChaseProperties.ped) GIVE_WEAPON_TO_PED(runnerChaseProperties.ped, GET_HOOD_WEAPON_TYPE(H_WEAPON_PISTOL), INFINITE_AMMO) CLEAR_SEQUENCE_TASK(sequence) OPEN_SEQUENCE_TASK(sequence) TASK_LEAVE_ANY_VEHICLE(NULL) TASK_COMBAT_PED(NULL, PLAYER_PED_ID()) CLOSE_SEQUENCE_TASK(sequence) TASK_PERFORM_SEQUENCE(runnerChaseProperties.ped, sequence) //SET_PED_CAN_BE_TARGETTED(runnerChaseProperties.ped, TRUE) ENDIF IF NOT IS_PED_INJURED(girlPed) TASK_COWER(girlPed, -1) ENDIF bDoneBadGuySpookedReact = TRUE ENDIF MISSION_FAILED(FAIL_SPOOKED_BAD_GUY) ENDIF ENDIF IF bDoneLamarIntoVan IF createBadGuyStage = CREATE_BAD_GUY_STAGE_DONE HANDLE_STREAMING_MOCAP("fra_0_mcs_1", GET_HOOD_VECTOR(HVEC_BAD_GUY_HANGOUT), DEFAULT_CUTSCENE_LOAD_DIST-5, DEFAULT_CUTSCENE_UNLOAD_DIST-10) ENDIF IF GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) > 0 //IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), hoodVehicle[HV_FRANKLIN_VAN]) // IF NOT IS_PED_HEADTRACKING_ENTITY(lamarPed, PLAYER_PED_ID()) // TASK_LOOK_AT_ENTITY(lamarPed, PLAYER_PED_ID(), -1, SLF_WHILE_NOT_IN_FOV) // ENDIF //ENDIF IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), lamarPed, <<20,20,4>>) IF NOT bDoneLoseWantedSpeech bDoneLoseWantedSpeech = DO_MISSION_SPEECH("FC_WANTBEF") ENDIF ENDIF ENDIF IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY() IF NOT IS_PED_INJURED(lamarPed) SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Lamar", lamarPed) ENDIF IF NOT IS_PED_INJURED(runnerChaseProperties.ped) SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Ballas_OG", runnerChaseProperties.ped) SET_CUTSCENE_PED_PROP_VARIATION("Ballas_OG", ANCHOR_HEAD, 0, 0) ENDIF IF NOT IS_PED_INJURED(girlPed) SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Hoodrat_girl", girlPed) ENDIF ENDIF HANDLE_CHOP_LEAN_IN_VAN(chopPed, hoodVehicle[HV_FRANKLIN_VAN], chopLeanInVanState, fCachedVanSpeed, iNextChopAnimTime, iNextBarkTime) // get to the alley IF IS_VEHICLE_DRIVEABLE(hoodVehicle[HV_FRANKLIN_VAN]) AND NOT IS_PED_INJURED(lamarPed) IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), hoodVehicle[HV_FRANKLIN_VAN]) AND IS_PED_IN_VEHICLE(lamarPed, hoodVehicle[HV_FRANKLIN_VAN]) IF NOT bForcePassOnShitskip IF chopBehaviour = CHOP_BEHAVIOUR_BAD DO_CHOP_AUDIO(CHOP_AUDIO_STATE_IN_VAN_AGITATED) ELSE DO_CHOP_AUDIO(CHOP_AUDIO_STATE_IN_VAN_PLACID) ENDIF ENDIF INT iWantedLevel = GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) IF iWantedLevel = 0 IF NOT bForcePassOnShitSkip // do goto speech IF NOT bDoneGotoSpeech bDoneGotoSpeech = DO_MISSION_SPEECH("FKN0_GOVINE") ELSE // banter IF bShownGodText IF NOT bDoneHelloChopSpeech IF iReplayAttempt % 2 = 0 bDoneHelloChopSpeech = DO_MISSION_SPEECH("FKN0_CHOP") ELSE bDoneHelloChopSpeech = TRUE ENDIF ELSE IF NOT bDoneBanter STRING sBanter IF iReplayAttempt % 2 = 0 IF GET_MISSION_COMPLETE_STATE(SP_MISSION_ARMENIAN_3) sBanter = "FKN0_WALK" ELSE sBanter = "FKN0_NOARM2" ENDIF ELSE IF GET_MISSION_COMPLETE_STATE(SP_MISSION_ARMENIAN_3) sBanter = "FKN0_B1AV1" ELSE sBanter = "FKN0_B1AV2" ENDIF ENDIF bDoneBanter = DO_MISSION_SPEECH(sBanter, FALSE) ELSE IF bSavedBanter IF NOT bTriggeredLamarDamageReaction AND NOT bCutsceneWaitStarted IF RESTORE_BANTER() bSavedBanter = FALSE ENDIF ENDIF ELSE // we creeping... speech IF NOT bDoneCreepSpeech IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<368.27, 355.67, 101.96>>, <<15, 15, LOCATE_SIZE_HEIGHT>>) IF NOT bKilledSpeechForArrive KILL_ANY_CONVERSATION() bKilledSpeechForArrive = TRUE ELSE bDoneCreepSpeech = DO_MISSION_SPEECH("FKN0_CREEP") ENDIF ENDIF ENDIF IF NOT bDoneChopBehaviourSpeech OR NOT bDoneUphillSpeech IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() iTriggerPostBanterSpeechTime = -1 ELSE IF iTriggerPostBanterSpeechTime < 0 iTriggerPostBanterSpeechTime = GET_GAME_TIMER() ELSE IF GET_GAME_TIMER() >= iTriggerPostBanterSpeechTime + 3000 AND NOT bCutsceneWaitStarted BOOL bTriggeredSomeSpeech bTriggeredSomeSpeech = FALSE IF NOT bDoneUphillSpeech IF chopBehaviourSpeechState = CHOP_BEHAVIOUR_SPEECH_NOT_STARTED OR chopBehaviourSpeechState = CHOP_BEHAVIOUR_SPEECH_DONE VECTOR vVanRot FLOAT fVanSpeed vVanRot = GET_ENTITY_ROTATION(hoodVehicle[HV_FRANKLIN_VAN]) fVanSpeed = GET_ENTITY_SPEED(hoodVehicle[HV_FRANKLIN_VAN]) IF vVanRot.x >= 9 IF fVanSpeed <= 21.0 AND fVanSpeed >= 4.0 IF IS_VEHICLE_ON_ALL_WHEELS(hoodVehicle[HV_FRANKLIN_VAN]) IF DO_MISSION_SPEECH("FC_UPHILL") bDoneUphillSpeech = TRUE bTriggeredSomeSpeech = TRUE ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF IF NOT bTriggeredSomeSpeech SWITCH chopBehaviourSpeechState CASE CHOP_BEHAVIOUR_SPEECH_NOT_STARTED SWITCH chopBehaviour CASE CHOP_BEHAVIOUR_GOOD chopBehaviourSpeechState = CHOP_BEHAVIOUR_SPEECH_SAY_GOOD BREAK CASE CHOP_BEHAVIOUR_BAD chopBehaviourSpeechState = CHOP_BEHAVIOUR_SPEECH_BARK iStopChopExcitementTime = GET_GAME_TIMER() + 6000 BREAK CASE CHOP_BEHAVIOUR_MEDIUM chopBehaviourSpeechState = CHOP_BEHAVIOUR_SPEECH_DONE BREAK ENDSWITCH BREAK CASE CHOP_BEHAVIOUR_SPEECH_SAY_GOOD IF DO_MISSION_SPEECH("FC_CBEHAVE") chopBehaviourSpeechState = CHOP_BEHAVIOUR_SPEECH_DONE ENDIF BREAK CASE CHOP_BEHAVIOUR_SPEECH_BARK IF GET_GAME_TIMER() >= iNextChopExcitementTime STOP_PED_SPEAKING(chopPed, FALSE) IF GET_RANDOM_INT_IN_RANGE(0,2) = 0 PLAY_ANIMAL_VOCALIZATION(chopPed, AUD_ANIMAL_DOG_ROTTWEILER, "BARK") ELSE PLAY_ANIMAL_VOCALIZATION(chopPed, AUD_ANIMAL_DOG_ROTTWEILER, "BARK_SEQ") ENDIF STOP_PED_SPEAKING(chopPed, TRUE) iNextChopExcitementTime = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(200, 1000) ENDIF IF GET_GAME_TIMER() >= iStopChopExcitementTime STOP_PED_SPEAKING(chopPed, FALSE) chopBehaviourSpeechState = CHOP_BEHAVIOUR_SPEECH_SAY_BAD ENDIF BREAK CASE CHOP_BEHAVIOUR_SPEECH_SAY_BAD IF DO_MISSION_SPEECH("FC_CMBEHAVE") chopBehaviourSpeechState = CHOP_BEHAVIOUR_SPEECH_DONE ENDIF BREAK ENDSWITCH ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF IF NOT bForcePassOnShitSkip IF NOT bDoneArriveSpeech IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), GET_HOOD_VECTOR(HVEC_BAD_GUY_HANGOUT), <<50, 50, 4>>) IF NOT bKilledSpeechForArrive KILL_ANY_CONVERSATION() bKilledSpeechForArrive = TRUE ELSE IF iReplayAttempt % 2 = 0 bDoneArriveSpeech = DO_MISSION_SPEECH("FC_INALLEY") IF bDoneArriveSpeech REPLAY_RECORD_BACK_FOR_TIME(3.0, 3.0, REPLAY_IMPORTANCE_HIGH) ENDIF ELSE bDoneArriveSpeech = DO_MISSION_SPEECH("FKN0_ALLEY") IF bDoneArriveSpeech REPLAY_RECORD_BACK_FOR_TIME(3.0, 3.0, REPLAY_IMPORTANCE_HIGH) ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF // handle getting to objective IF NOT bCutsceneWaitStarted IF iWantedLevel = 0 IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), GET_HOOD_VECTOR(HVEC_BAD_GUY_HANGOUT), <<5, 5, LOCATE_SIZE_HEIGHT>>, TRUE) IF IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), hoodVehicle[HV_FRANKLIN_VAN]) IF CAN_PLAYER_START_CUTSCENE() PRINTSTRING("HIT BLIP - KILLING CONVERSATION") PRINTNL() //KILL_ANY_CONVERSATION() //SET_PLAYER_CONTROL(PLAYER_ID(), FALSE, SPC_LEAVE_CAMERA_CONTROL_ON) //Activate multihead blinders early SET_MULTIHEAD_SAFE(TRUE,FALSE) REMOVE_ALL_BLIPS() PREVENT_WANTED_LEVEL_FOR_CUTSCENE() iCutsceneTriggerTime = GET_GAME_TIMER() bCutsceneWaitStarted = TRUE ENDIF ENDIF ENDIF ENDIF ELSE PRINTSTRING("waiting on ready for cutscene") PRINTNL() PREVENT_WANTED_LEVEL_FOR_CUTSCENE() IF BRING_VEHICLE_TO_HALT_AND_DISABLE_VEH_CONTROLS(hoodVehicle[HV_FRANKLIN_VAN], 6) PRINTSTRING("vehicle has been brought to halt") PRINTNL() IF GET_GAME_TIMER() >= iCutsceneTriggerTime + DEFAULT_CAR_STOPPING_TO_CUTSCENE IF NOT bKilledSpeechAtCutscene IF GET_GAME_TIMER() >= iCutsceneTriggerTime + 3000 bKilledSpeechForArrive = TRUE bDoneArriveSpeech = TRUE bDoneChopBehaviourSpeech = TRUE bDoneUphillSpeech = TRUE bDoneCreepSpeech = TRUE KILL_ANY_CONVERSATION() bKilledSpeechAtCutscene = TRUE ENDIF ENDIF PRINTSTRING("timer has passed wait time") PRINTNL() IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() PRINTSTRING("there is no conversation ongoing or queued") PRINTNL() IF CAN_ADVANCE_MISSION() IF mocapStreamingStage > MOCAP_STREAMING_STAGE_REQUEST IF HAS_CUTSCENE_LOADED_WITH_FAILSAFE() PRINTSTRING("mission has not failed - RUN THE CUTSCENE") PRINTNL() bRunningCutscene = TRUE ENDIF ENDIF ENDIF ELSE PRINTSTRING("a conversation is ongoing or queued") PRINTNL() IF g_ConversationStatus <> CONV_STATE_FREE PRINTSTRING("conversation status is NOT free") PRINTNL() ELSE PRINTSTRING("conversation status is free") PRINTNL() ENDIF IF IS_SCRIPTED_CONVERSATION_ONGOING() //caters for last line being finished by audio after a kill even if conv_state if free. PRINTSTRING("a scripted conversation is ongoing") PRINTNL() ELSE PRINTSTRING("a scripted conversation is NOT ongoing") PRINTNL() ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF IF NOT bCutsceneWaitStarted HANDLE_IN_CAR_PROMPTS(TRUE, FALSE, TRUE) HANDLE_LAMAR_REACTION_TO_DAMAGE() ENDIF ENDIF ELSE DO_CHOP_AUDIO(CHOP_AUDIO_STATE_WALK_TO_VAN) SET_ALL_RANDOM_PEDS_FLEE_THIS_FRAME(PLAYER_ID()) IF iFailWantedTime < 0 IF GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) > 0 iFailWantedTime = GET_GAME_TIMER() ENDIF ELSE IF GET_GAME_TIMER() >= iFailWantedTime + 2000 MISSION_FAILED(FAIL_POLICE_ATTENTION) ENDIF ENDIF // unfreeze vehicle if exploded IF NOT IS_VEHICLE_DRIVEABLE(hoodVehicle[HV_FRANKLIN_VAN]) IF DOES_ENTITY_EXIST(hoodVehicle[HV_FRANKLIN_VAN]) IF IS_ENTITY_DEAD(hoodVehicle[HV_FRANKLIN_VAN]) OR NOT IS_ENTITY_DEAD(hoodVehicle[HV_FRANKLIN_VAN]) FREEZE_ENTITY_POSITION(hoodVehicle[HV_FRANKLIN_VAN], FALSE) ENDIF ENDIF ENDIF IF NOT IS_PED_INJURED(lamarPed) // force walk IF GET_GAME_TIMER() <= iStageStartTime + 1500 SET_PED_MIN_MOVE_BLEND_RATIO(lamarPed,PEDMOVE_WALK) ENDIF IF GET_GAME_TIMER() <= iStageStartTime + 2000 IF GET_FOLLOW_PED_CAM_VIEW_MODE() <> CAM_VIEW_MODE_FIRST_PERSON SET_PED_MIN_MOVE_BLEND_RATIO(PLAYER_PED_ID(), PEDMOVE_WALK) ENDIF ELSE IF NOT bClearedPlayerRun CLEAR_PED_TASKS(PLAYER_PED_ID()) bClearedPlayerRun = TRUE ENDIF ENDIF IF GET_GAME_TIMER() < iBlockJumpTime DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_JUMP) ENDIF VECTOR vPlayerPos = GET_ENTITY_COORDS(PLAYER_PED_ID()) VECTOR vLamarPos = GET_ENTITY_COORDS(lamarPed) IF NOT bLamarWalkPaused IF chopIntoVanState = CHOP_INTO_VAN_STATE_NOT_STARTED FLOAT fDistAhead = vLamarPos.x - vPlayerPos.x IF fDistAhead > 0.0 fLamarWalkSpeed = fLamarWalkSpeed +@ 0.060 ELIF fDistAhead < -1.2 fLamarWalkSpeed = fLamarWalkSpeed -@ 0.060 ELSE // try and get to 1.0 IF fLamarWalkSpeed > 1.0 fLamarWalkSpeed = fLamarWalkSpeed -@ 0.060 IF fLamarWalkSpeed < 1.0 fLamarWalkSpeed = 1.0 ENDIF ELIF fLamarWalkSpeed < 1.0 fLamarWalkSpeed = fLamarWalkSpeed +@ 0.060 IF fLamarWalkSpeed > 1.0 fLamarWalkSpeed = 1.0 ENDIF ENDIF ENDIF IF fLamarWalkSpeed > MAX_LAMAR_SPEED fLamarWalkSpeed = MAX_LAMAR_SPEED ELIF fLamarWalkSpeed < MIN_LAMAR_SPEED fLamarWalkSpeed = MIN_LAMAR_SPEED ENDIF ELSE IF fLamarWalkSpeed > 1.0 fLamarWalkSpeed = fLamarWalkSpeed -@ 0.1 IF fLamarWalkSpeed < 1.0 fLamarWalkSpeed = 1.0 ENDIF ELIF fLamarWalkSpeed < 1.0 fLamarWalkSpeed = fLamarWalkSpeed +@ 0.1 IF fLamarWalkSpeed > 1.0 fLamarWalkSpeed = 1.0 ENDIF ENDIF ENDIF SET_PED_MOVE_RATE_OVERRIDE(lamarPed, fLamarWalkSpeed) //printstring("lamar speed = ") printfloat(fLamarWalkSpeed) printnl() IF GET_ENTITY_SPEED(lamarPed) < 0.1 fLamarJammedTime = fLamarJammedTime +@ 1.0 ELSE fLamarJammedTime = fLamarJammedTime -@ 1.0 IF fLamarJammedTime < 0 fLamarJammedTime = 0 ENDIF ENDIF ELSE fLamarJammedTime = fLamarJammedTime -@ 2.0 IF fLamarJammedTime < 0 fLamarJammedTime = 0 ENDIF ENDIF //PRINTSTRING("jammed = ") PRINTFLOAT(fLamarJammedTime) PRINTNL() // fix for ng - disable walk when van not yet created IF createPostIntroStage < CREATE_POST_INTRO_STAGE_DONE 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 GET_PED_STEALTH_MOVEMENT(PLAYER_PED_ID()) DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_DUCK) ENDIF IF NOT bTurnedOffPhoneForWalk DISABLE_CELLPHONE(TRUE) bTurnedOffPhoneForWalk = TRUE ENDIF ENDIF IF IS_VEHICLE_DRIVEABLE(hoodVehicle[HV_FRANKLIN_VAN]) IF NOT bDoneLamarIntoVan IF NOT bShownGodText bShownGodText = TRUE ENDIF IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), lamarPed, <>) AND NOT bDoneFranklinIntoVanSpeech 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 GET_PED_STEALTH_MOVEMENT(PLAYER_PED_ID()) DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_DUCK) ENDIF IF NOT bTurnedOffPhoneForWalk DISABLE_CELLPHONE(TRUE) bTurnedOffPhoneForWalk = TRUE ENDIF ELSE IF bTurnedOffPhoneForWalk DISABLE_CELLPHONE(FALSE) bTurnedOffPhoneForWalk = FALSE ENDIF ENDIF //BOOL bCanDoPlayerAnims = TRUE //IF GET_ENTITY_SPEED(PLAYER_PED_ID()) < 1.20 //OR IS_PED_RUNNING(PLAYER_PED_ID()) //OR IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) //bCanDoPlayerAnims = FALSE //CLEAR_PED_SECONDARY_TASK(PLAYER_PED_ID()) //ENDIF IF GET_ENTITY_SPEED(lamarPed) < 1.20 AND GET_SCRIPT_TASK_STATUS(lamarPed, SCRIPT_TASK_FOLLOW_WAYPOINT_ROUTE) = FINISHED_TASK CLEAR_PED_SECONDARY_TASK(lamarPed) ENDIF //VECTOR vLamarPos = GET_ENTITY_COORDS(lamarPed) //VECTOR vDiff = vLamarPos - GET_ENTITY_COORDS(PLAYER_PED_ID()) IF chopIntoVanState = CHOP_INTO_VAN_STATE_NOT_STARTED IF NOT IS_PED_HEADTRACKING_ENTITY(lamarPed, PLAYER_PED_ID()) TASK_LOOK_AT_ENTITY(lamarPed, PLAYER_PED_ID(), -1, SLF_WHILE_NOT_IN_FOV) ENDIF IF NOT bLamarWalkPaused IF NOT bKilledSpeechForVan IF IS_ENTITY_AT_ENTITY(lamarPed, hoodVehicle[HV_FRANKLIN_VAN], <<11, 11, 4>>) KILL_ANY_CONVERSATION() bKilledSpeechForVan = TRUE ENDIF ENDIF IF (NOT IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), lamarPed, <>) OR IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())) AND GET_GAME_TIMER() >= iStageStartTime + 3000 IF vPlayerPos.x > vLamarPos.x OR bLamarWaitingAtVan IF NOT IS_PLAYER_AT_VAN() 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(lamarPed, sequence) CLEAR_PED_SECONDARY_TASK(lamarPed) CLEAR_PED_SECONDARY_TASK(PLAYER_PED_ID()) TASK_CLEAR_LOOK_AT(PLAYER_PED_ID()) bKilledOnFootConversation = FALSE bDoneHurrySpeech = FALSE bLamarWalkPaused = TRUE ENDIF ELSE // kill speech if ahead IF bDoneBanter IF NOT bKilledOnFootConversation IF NOT STORE_BANTER() IF NOT bHadFirstLineOfBanter bDoneBanter = FALSE ENDIF ENDIF KILL_ANY_CONVERSATION() bKilledOnFootConversation = TRUE ENDIF ENDIF bFranklinWentAhead = TRUE ENDIF ELSE bFranklinWentAhead = FALSE IF NOT IS_PED_HEADTRACKING_ENTITY(PLAYER_PED_ID(), lamarPed) TASK_LOOK_AT_ENTITY(PLAYER_PED_ID(), lamarPed, -1, SLF_WHILE_NOT_IN_FOV) ENDIF // banter IF bShownGodText IF CAN_ADVANCE_MISSION() AND NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) IF NOT bDoneBanter IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), lamarPed, <>) AND bStoppedChopExcitement IF IS_THIS_PRINT_BEING_DISPLAYED("FC_FOLLAM") REMOVE_MISSION_TEXT(FALSE, TRUE, FALSE) ENDIF bDoneBanter = DO_MISSION_SPEECH("FKN0_WALK2") ENDIF ELSE IF bSavedBanter IF NOT bTriggeredLamarDamageReaction AND NOT bKilledSpeechForVan IF RESTORE_BANTER() bSavedBanter = FALSE ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF IF NOT bHadFirstLineOfBanter IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() AND bDoneBanter TEXT_LABEL_23 tCurrentLabel = GET_CURRENTLY_PLAYING_STANDARD_CONVERSATION_LABEL() IF ARE_STRINGS_EQUAL(tCurrentLabel, "FKN0_WALK2_1") bHadFirstLineOfBanter = TRUE ENDIF ENDIF ENDIF // conversation anims /* IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() AND bDoneBanter //INT iCurrentConversationLine = GET_CURRENT_SCRIPTED_CONVERSATION_LINE() //PRINTSTRING("line = ") PRINTINT(iCurrentConversationLine) PRINTNL() TEXT_LABEL_23 tCurrentLabel = GET_CURRENTLY_PLAYING_STANDARD_CONVERSATION_LABEL() INT iLineMatch = -1 IF ARE_STRINGS_EQUAL(tCurrentLabel, "FKN0_WALK2_1") iLineMatch = 0 ELIF ARE_STRINGS_EQUAL(tCurrentLabel, "FKN0_WALK2_3") iLineMatch = 1 ELIF ARE_STRINGS_EQUAL(tCurrentLabel, "FKN0_WALK2_5") iLineMatch = 2 ELIF ARE_STRINGS_EQUAL(tCurrentLabel, "FKN0_WALK2_7") iLineMatch = 3 ELIF ARE_STRINGS_EQUAL(tCurrentLabel, "FKN0_WALK2_9") iLineMatch = 4 ELIF ARE_STRINGS_EQUAL(tCurrentLabel, "FKN0_WALK2_11") iLineMatch = 5 ELIF ARE_STRINGS_EQUAL(tCurrentLabel, "FKN0_WALK2_13") iLineMatch = 6 ELIF ARE_STRINGS_EQUAL(tCurrentLabel, "FKN0_WALK2_15") iLineMatch = 7 ENDIF //PRINTSTRING("label = ") PRINTSTRING(tCurrentLabel) PRINTNL() IF iLineMatch >= 0 AND bCanDoPlayerAnims IF NOT bDoneConversationAnim[iLineMatch] STRING sFranklinLine STRING sLamarLine BOOL bDoFranklinAnim = TRUE BOOL bDoLamarAnim = TRUE SWITCH iLineMatch CASE 0 //sFranklinLine = "franklin_line1_ig0" bDoFranklinAnim = FALSE sLamarLine = "lemar_line1_ig0" BREAK CASE 1 sFranklinLine = "franklin_line1_ig0" //sLamarLine = "lemar_line1_ig0" bDoLamarAnim = FALSE BREAK CASE 2 //sFranklinLine = "franklin_line2_ig0" bDoFranklinAnim = FALSE sLamarLine = "lemar_line2_ig0" BREAK CASE 3 sFranklinLine = "franklin_line3_ig0" bDoLamarAnim = FALSE BREAK CASE 4 //sFranklinLine = "franklin_line4_ig0" bDoFranklinAnim = FALSE sLamarLine = "lemar_line4_ig0" BREAK CASE 5 sFranklinLine = "franklin_line5_ig0" //sLamarLine = "lemar_line5_ig0" bDoLamarAnim = FALSE BREAK CASE 6 //sFranklinLine = "franklin_line6_ig0" bDoFranklinAnim = FALSE sLamarLine = "lemar_line6_ig0" BREAK CASE 7 sFranklinLine = "franklin_line7_ig0" bDoLamarAnim = FALSE BREAK ENDSWITCH IF bDoFranklinAnim WEAPON_TYPE currentWeapon GET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), currentWeapon) IF currentWeapon = WEAPONTYPE_UNARMED AND NOT GET_PED_STEALTH_MOVEMENT(PLAYER_PED_ID()) //TASK_PLAY_ANIM(PLAYER_PED_ID(), GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_MISSION), sFranklinLine, SLOW_BLEND_IN, SLOW_BLEND_OUT, -1, AF_UPPERBODY | AF_SECONDARY | AF_TAG_SYNC_IN | AF_TAG_SYNC_OUT | AF_TAG_SYNC_CONTINUOUS ) ANIM_DATA none ANIM_DATA animDataBlend animDataBlend.type = APT_SINGLE_ANIM animDataBlend.anim0 = sFranklinLine animDataBlend.dictionary0 = GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_TO_VAN) animDataBlend.phase0 = 0.0 animDataBlend.rate0 = 1.0 animDataBlend.filter = GET_HASH_KEY("BONEMASK_HEAD_NECK_AND_ARMS") animDataBlend.flags = AF_UPPERBODY | AF_SECONDARY | AF_TAG_SYNC_IN | AF_TAG_SYNC_OUT | AF_TAG_SYNC_CONTINUOUS TASK_SCRIPTED_ANIMATION(PLAYER_PED_ID(), animDataBlend, none, none, SLOW_BLEND_DURATION, SLOW_BLEND_DURATION) ENDIF ENDIF IF bDoLamarAnim //TASK_PLAY_ANIM(lamarPed, GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_MISSION), sLamarLine, SLOW_BLEND_IN, SLOW_BLEND_OUT, -1, AF_UPPERBODY | AF_SECONDARY | AF_TAG_SYNC_IN | AF_TAG_SYNC_OUT | AF_TAG_SYNC_CONTINUOUS ) ANIM_DATA none ANIM_DATA animDataBlend animDataBlend.type = APT_SINGLE_ANIM animDataBlend.anim0 = sLamarLine animDataBlend.dictionary0 = GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_TO_VAN) animDataBlend.phase0 = 0.0 animDataBlend.rate0 = 1.0 animDataBlend.filter = GET_HASH_KEY("BONEMASK_HEAD_NECK_AND_ARMS") animDataBlend.flags = AF_UPPERBODY | AF_SECONDARY | AF_TAG_SYNC_IN | AF_TAG_SYNC_OUT | AF_TAG_SYNC_CONTINUOUS TASK_SCRIPTED_ANIMATION(lamarPed, animDataBlend, none, none, SLOW_BLEND_IN, SLOW_BLEND_OUT) ENDIF bDoneConversationAnim[iLineMatch] = TRUE ENDIF ENDIF ENDIF */ ENDIF ELSE IF bDoneBanter IF NOT bKilledOnFootConversation STORE_BANTER() KILL_ANY_CONVERSATION() bKilledOnFootConversation = TRUE ENDIF ENDIF IF NOT bDoneHurrySpeech IF CAN_ADVANCE_MISSION() IF (bKilledOnFootConversation OR NOT bDoneBanter) AND NOT bFranklinWentAhead AND NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) IF GET_GAME_TIMER() >= iNextLamarHurrySpeechTime IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), lamarPed, <<15,15,15>>, FALSE, FALSE) STRING sHurryString IF GET_ENTITY_SPEED(PLAYER_PED_ID()) >= 1.2 AND NOT IS_PED_FACING_PED(PLAYER_PED_ID(), lamarPed, 45) sHurryString = "FKN0_LFOL2" ELSE sHurryString = "FKN0_LFOL1" ENDIF IF DO_MISSION_SPEECH(sHurryString) bDoneHurrySpeech = TRUE iNextLamarHurrySpeechTime = GET_GAME_TIMER() + 10000 ENDIF ELSE bDoneHurrySpeech = TRUE ENDIF ENDIF ENDIF ENDIF ELSE IF NOT bShownHurryPrompt bShownHurryPrompt = DO_MISSION_GOD_TEXT("FC_FOLLAM") ENDIF ENDIF IF (IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), lamarPed, <>) OR vPlayerPos.x < vLamarPos.x) AND (NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) OR vPlayerPos.x < vLamarPos.x) //TASK_LOOK_AT_ENTITY(lamarPed, PLAYER_PED_ID(), -1, SLF_WHILE_NOT_IN_FOV) //TASK_LOOK_AT_ENTITY(PLAYER_PED_ID(), lamarPed, -1, SLF_WHILE_NOT_IN_FOV) IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), lamarPed, <>) OR IS_PLAYER_AT_VAN() OR NOT bLamarWaitingAtVan DO_LAMAR_FOLLOW_PAVEMENT() bKilledOnFootConversation = FALSE bLamarWalkPaused = FALSE ENDIF ENDIF ENDIF IF NOT IS_PED_INJURED(chopPed) IF GET_GAME_TIMER() <= iStageStartTime + 2000 SET_PED_MIN_MOVE_BLEND_RATIO(chopPed, PEDMOVE_WALK) ENDIF IF GET_ENTITY_SPEED(lamarPed) >= 0.3 fLamarSpeedCount = 0 ELSE fLamarSpeedCount = fLamarSpeedCount +@ 1.0 ENDIF IF (fLamarSpeedCount < 0.6 AND NOT bLamarWalkPaused) OR bWarpedLamarToVan //IF GET_GAME_TIMER() >= iStageStartTime + 1000 IF GET_SCRIPT_TASK_STATUS(chopPed, SCRIPT_TASK_GOTO_ENTITY_OFFSET) = FINISHED_TASK AND CAN_CHOP_TRANSITION_BACK_FROM_WAIT(TRUE) //AND GET_SCRIPT_TASK_STATUS(chopPed, SCRIPT_TASK_PLAY_ANIM) = FINISHED_TASK AND GET_GAME_TIMER() >= iLastChopMoveCommandTime + 2000 //AND GET_ENTITY_SPEED(chopPed) <= 0.05 //IF GET_SCRIPT_TASK_STATUS(chopPed, SCRIPT_TASK_FOLLOW_TO_OFFSET_OF_ENTITY) = FINISHED_TASK GIVE_CHOP_FOLLOW_TASK() iLastChopMoveCommandTime = GET_GAME_TIMER() //TASK_GOTO_ENTITY_OFFSET(chopPed, lamarPed, DEFAULT_TIME_NEVER_WARP, 1.0, 130, PEDMOVE_RUN) //TASK_FOLLOW_TO_OFFSET_OF_ENTITY(chopPed, lamarPed, <<-2, -10, 0>>, PEDMOVE_RUN, -1, 0.1) ENDIF //ENDIF ELSE IF GET_SCRIPT_TASK_STATUS(chopPed, SCRIPT_TASK_GOTO_ENTITY_OFFSET) <> FINISHED_TASK AND GET_GAME_TIMER() >= iLastChopMoveCommandTime + 2000 CLEAR_SEQUENCE_TASK(sequence) OPEN_SEQUENCE_TASK(sequence) //TASK_PAUSE(NULL, 500) IF NOT IS_ENTITY_AT_ENTITY(chopPed, lamarPed, <<6,6,6>>, false, false) TASK_GO_TO_ENTITY(NULL, lamarPed, DEFAULT_TIME_NEVER_WARP, 1.8, PEDMOVE_RUN) ELIF NOT IS_ENTITY_AT_ENTITY(chopPed, lamarPed, <<3,3,3>>, false, false) TASK_GO_TO_ENTITY(NULL, lamarPed, DEFAULT_TIME_NEVER_WARP, 1.6, PEDMOVE_WALK) ENDIF TASK_PAUSE(NULL, 1000) TASK_PLAY_ANIM(NULL, GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_SHARED), "FRA0_IG_12_CHOP_WAITING_B", SLOW_BLEND_IN, REALLY_SLOW_BLEND_OUT, -1, AF_LOOPING) CLOSE_SEQUENCE_TASK(sequence) TASK_PERFORM_SEQUENCE(chopPed, sequence) iLastChopMoveCommandTime = GET_GAME_TIMER() ENDIF ENDIF ENDIF ELSE IF NOT bDoneFranklinIntoVanSpeech IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), lamarPed, <<15,15,15>>, FALSE, FALSE) bDoneFranklinIntoVanSpeech = DO_MISSION_SPEECH("FKN0_DRIVE") ELSE bDoneFranklinIntoVanSpeech = TRUE ENDIF ELSE HANDLE_IN_CAR_PROMPTS(FALSE, bLamarWasInGroup, FALSE, bLamarWasInGroup) ENDIF ENDIF SWITCH chopIntoVanState CASE CHOP_INTO_VAN_STATE_NOT_STARTED IF IS_VEHICLE_DRIVEABLE(hoodVehicle[HV_FRANKLIN_VAN]) AND NOT IS_PED_INJURED(lamarPed) AND NOT IS_PED_INJURED(chopPed) SET_PED_GESTURE_GROUP(PLAYER_PED_ID(), "ANIM_GROUP_GESTURE_MISS_FRA0") SET_PED_GESTURE_GROUP(lamarPed, "ANIM_GROUP_GESTURE_MISS_FRA0") IF NOT bWarpedLamarToVan IF fLamarJammedTime >= 10.0 CLEAR_PED_TASKS(lamarPed) SET_ENTITY_COORDS(lamarPed, <<-77.03740, -1461.03149, 31.12035>>) SET_ENTITY_HEADING(lamarPed, 46.7) bWarpedLamarToVan = TRUE ENDIF ENDIF IF IS_ENTITY_AT_ENTITY(lamarPed, hoodVehicle[HV_FRANKLIN_VAN], <<7,7,LOCATE_SIZE_HEIGHT>>) AND NOT bLamarWalkPaused IF NOT IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), lamarPed, <>) AND NOT IS_PLAYER_AT_VAN() bLamarWaitingAtVan = TRUE ELSE //CLEAR_PED_SECONDARY_TASK(lamarPed) TASK_LOOK_AT_ENTITY(lamarPed, chopPed, -1, SLF_WHILE_NOT_IN_FOV) TASK_CLEAR_LOOK_AT(PLAYER_PED_ID()) KILL_ANY_CONVERSATION() SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(hoodVehicle[HV_FRANKLIN_VAN], TRUE) IF DOES_BLIP_EXIST(lamarBlip) REMOVE_BLIP(lamarBlip) ENDIF bSavedBanter = FALSE // chop goto van //CLEAR_SEQUENCE_TASK(sequence) //OPEN_SEQUENCE_TASK(sequence) // TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<-78.02858, -1452.29309, 31.03300>>, PEDMOVE_RUN, DEFAULT_TIME_BEFORE_WARP, DEFAULT_NAVMESH_RADIUS, ENAV_DEFAULT, 144.5) // TASK_GO_STRAIGHT_TO_COORD(NULL, <<-79.04949, -1453.70010, 31.01084>>, PEDMOVE_WALK, DEFAULT_TIME_BEFORE_WARP, 151.5) //CLOSE_SEQUENCE_TASK(sequence) //TASK_PERFORM_SEQUENCE(chopPed, sequence) EWAYPOINT_FOLLOW_FLAGS flags IF IS_ENTITY_AT_COORD(chopPed, <<-72.67596, -1459.41016, 31.11492>>, <<7,7,7>>, FALSE, FALSE) flags = EWAYPOINT_TURN_TO_FACE_WAYPOINT_HEADING_AT_END | EWAYPOINT_START_TASK_EXACTSTOP | EWAYPOINT_NAVMESH_BACK_TO_WAYPOINT_IF_LEFT_ROUTE ELSE flags = EWAYPOINT_TURN_TO_FACE_WAYPOINT_HEADING_AT_END | EWAYPOINT_START_TASK_EXACTSTOP | EWAYPOINT_NAVMESH_TO_INITIAL_WAYPOINT | EWAYPOINT_NAVMESH_BACK_TO_WAYPOINT_IF_LEFT_ROUTE ENDIF TASK_FOLLOW_WAYPOINT_RECORDING(chopPed, "hood12", 2, flags) iForceChopIntoVanTime = GET_GAME_TIMER() + 30000 chopIntoVanState = CHOP_INTO_VAN_STATE_GET_IN_POSITION ENDIF ELSE IF IS_ENTITY_AT_ENTITY(chopPed, lamarPed, <<1.1,1.1,1.1>>, FALSE, FALSE) SET_PED_MOVE_RATE_OVERRIDE(chopPed, 1.01) ELIF IS_ENTITY_AT_ENTITY(chopPed, lamarPed, <<1.8,1.8,1.8>>, FALSE, FALSE) SET_PED_MOVE_RATE_OVERRIDE(chopPed, 1.06) ELIF NOT IS_ENTITY_AT_ENTITY(chopPed, lamarPed, <<7,7,7>>, FALSE, FALSE) IF GET_ENTITY_SPEED(chopPed) >= 1.0 IF GET_GAME_TIMER() >= iStageStartTime + 2000 SET_PED_MIN_MOVE_BLEND_RATIO(chopPed, 1.5) SET_PED_MOVE_RATE_OVERRIDE(chopPed, 1.06) ENDIF ENDIF //SET_PED_MOVE_RATE_OVERRIDE(chopPed, 1.15) ELSE SET_PED_MOVE_RATE_OVERRIDE(chopPed, 1.10) ENDIF ENDIF ENDIF BREAK CASE CHOP_INTO_VAN_STATE_GET_IN_POSITION IF IS_VEHICLE_DRIVEABLE(hoodVehicle[HV_FRANKLIN_VAN]) AND NOT IS_PED_INJURED(lamarPed) AND NOT IS_PED_INJURED(chopPed) SET_PED_MOVE_RATE_OVERRIDE(lamarPed, 1.00)//0.90) SET_PED_MOVE_RATE_OVERRIDE(chopPed, 1.15) IF IS_WAYPOINT_PLAYBACK_GOING_ON_FOR_PED(chopPed) WAYPOINT_PLAYBACK_OVERRIDE_SPEED(chopPed, PEDMOVE_WALK) SET_PED_WAYPOINT_ROUTE_OFFSET(chopPed, <<0,0.2,0>>) ENDIF IF IS_ENTITY_AT_COORD(lamarPed, <<-79.15181, -1454.35547, 31.02351>>, <<2.5,2.5,2.5>>, FALSE, FALSE) SET_PED_RESET_FLAG(lamarPed, PRF_UseKinematicPhysics, TRUE) SET_PED_CAN_RAGDOLL_FROM_PLAYER_IMPACT(lamarPed, FALSE) ENDIF IF IS_ENTITY_AT_COORD(chopPed, <<-79.15181, -1454.35547, 31.02351>>, <<2.5,2.5,2.5>>, FALSE, FALSE) SET_PED_RESET_FLAG(chopPed, PRF_UseKinematicPhysics, TRUE) SET_PED_CAN_RAGDOLL_FROM_PLAYER_IMPACT(chopPed, FALSE) ENDIF BOOL bDoForce bDoForce = FALSE IF GET_GAME_TIMER() >= iForceChopIntoVanTime bDoForce = TRUE ELSE IF GET_SCRIPT_TASK_STATUS(lamarPed, SCRIPT_TASK_FOLLOW_WAYPOINT_ROUTE) = FINISHED_TASK AND GET_SCRIPT_TASK_STATUS(chopPed, SCRIPT_TASK_FOLLOW_WAYPOINT_ROUTE) = FINISHED_TASK IF NOT IS_ENTITY_AT_COORD(lamarPed, <<-79.51687, -1453.27686, 31.12119>>, <<1.0,1.0,1>>, FALSE, FALSE) OR NOT IS_ENTITY_AT_COORD(lamarPed, <<-79.08290, -1453.59009, 31.53415>>, <<1.0,1.0,1>>, FALSE, FALSE) bDoForce = TRUE ENDIF ENDIF ENDIF IF bDoForce SET_CHOP_INTO_VAN(chopPed, hoodVehicle[HV_FRANKLIN_VAN], chopLeanInVanState, fCachedVanSpeed, FALSE, TRUE, TRUE) SET_ENTITY_PROOFS(chopPed, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, TRUE) SET_PED_CAN_RAGDOLL(chopPed, FALSE) CLEAR_PED_TASKS_IMMEDIATELY(lamarPed) TASK_CLEAR_LOOK_AT(lamarPed) SET_PED_INTO_VEHICLE(lamarPed, hoodVehicle[HV_FRANKLIN_VAN], VS_FRONT_RIGHT) bLamarWasInGroup = TRUE bShutVanDoors = TRUE bDoneChopGetInSpeech = TRUE bForcedIntoVan = TRUE chopIntoVanState = CHOP_INTO_VAN_STATE_DONE ELSE IF GET_SCRIPT_TASK_STATUS(lamarPed, SCRIPT_TASK_FOLLOW_WAYPOINT_ROUTE) = FINISHED_TASK AND GET_SCRIPT_TASK_STATUS(chopPed, SCRIPT_TASK_FOLLOW_WAYPOINT_ROUTE) = FINISHED_TASK vLamarSyncScenePos = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(lamarPed, <<-1.990, 3.210, -0.242>>) vLamarSyncSceneRot = <<0,0,GET_ENTITY_HEADING(lamarPed) + 36.655>> vChopSyncScenePos = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(chopPed, <<-2.596, 1.970, 0.332>>) vChopSyncSceneRot = <<0,0,GET_ENTITY_HEADING(chopPed) + 60.546>> SET_VECTOR_CLOSEST_TO_IDEAL(vLamarSyncSceneRot, GET_ENTITY_ROTATION(hoodVehicle[HV_FRANKLIN_VAN])) SET_VECTOR_CLOSEST_TO_IDEAL(vChopSyncSceneRot, GET_ENTITY_ROTATION(hoodVehicle[HV_FRANKLIN_VAN])) TASK_CLEAR_LOOK_AT(lamarPed) iLamarSyncScene = CREATE_SYNCHRONIZED_SCENE(vLamarSyncScenePos, vLamarSyncSceneRot) //ATTACH_SYNCHRONIZED_SCENE_TO_ENTITY(iLamarSyncScene, hoodVehicle[HV_FRANKLIN_VAN], 0) SET_SYNCHRONIZED_SCENE_HOLD_LAST_FRAME (iLamarSyncScene, FALSE) TASK_SYNCHRONIZED_SCENE(lamarPed, iLamarSyncScene, GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_TO_VAN), "put_chop_in_van_lam", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, SYNCED_SCENE_USE_PHYSICS | SYNCED_SCENE_DONT_INTERRUPT, RBF_PLAYER_IMPACT | RBF_MELEE | RBF_VEHICLE_IMPACT) chopChaseProperties.iSyncScene = CREATE_SYNCHRONIZED_SCENE(vChopSyncScenePos, vChopSyncSceneRot) //ATTACH_SYNCHRONIZED_SCENE_TO_ENTITY(chopChaseProperties.iSyncScene, hoodVehicle[HV_FRANKLIN_VAN], 0) TASK_SYNCHRONIZED_SCENE(chopPed, chopChaseProperties.iSyncScene, GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_TO_VAN), "put_chop_in_van_chop", NORMAL_BLEND_IN, REALLY_SLOW_BLEND_OUT, SYNCED_SCENE_USE_PHYSICS | SYNCED_SCENE_DONT_INTERRUPT, RBF_PLAYER_IMPACT | RBF_MELEE | RBF_VEHICLE_IMPACT) SET_SYNCHRONIZED_SCENE_HOLD_LAST_FRAME (chopChaseProperties.iSyncScene, FALSE) SET_ENTITY_NO_COLLISION_ENTITY(chopPed, hoodVehicle[HV_FRANKLIN_VAN], FALSE) SET_ENTITY_NO_COLLISION_ENTITY(lamarPed, hoodVehicle[HV_FRANKLIN_VAN], FALSE) PLAY_ENTITY_ANIM(hoodVehicle[HV_FRANKLIN_VAN], "put_chop_in_van_van", GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_TO_VAN), NORMAL_BLEND_IN, FALSE, FALSE, FALSE, 0, ENUM_TO_INT(AF_USE_KINEMATIC_PHYSICS)) chopIntoVanState = CHOP_INTO_VAN_STATE_PLAYING ENDIF ENDIF ENDIF BREAK CASE CHOP_INTO_VAN_STATE_PLAYING IF IS_ENTITY_PLAYING_ANIM(hoodVehicle[HV_FRANKLIN_VAN], GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_TO_VAN), "put_chop_in_van_van") IF IS_SYNCHRONIZED_SCENE_RUNNING(chopChaseProperties.iSyncScene) SET_ENTITY_ANIM_CURRENT_TIME(hoodVehicle[HV_FRANKLIN_VAN], GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_TO_VAN), "put_chop_in_van_van", GET_SYNCHRONIZED_SCENE_PHASE(chopChaseProperties.iSyncScene)) ENDIF FLOAT fVanPhase fVanPhase = GET_ENTITY_ANIM_CURRENT_TIME(hoodVehicle[HV_FRANKLIN_VAN], GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_TO_VAN), "put_chop_in_van_van") SWITCH iOpenVanDoorSoundStage CASE 0 IF fVanPhase >= 0.113 PLAY_VEHICLE_DOOR_OPEN_SOUND(hoodVehicle[HV_FRANKLIN_VAN], 3) PRINTSTRING("OPEN sound 1") printnl() iOpenVanDoorSoundStage++ ENDIF BREAK CASE 1 IF fVanPhase >= 0.68 //PLAY_VEHICLE_DOOR_CLOSE_SOUND(hoodVehicle[HV_FRANKLIN_VAN], 3) PRINTSTRING("CLOSE sound 1") printnl() iOpenVanDoorSoundStage++ ENDIF BREAK ENDSWITCH ENDIF IF IS_SYNCHRONIZED_SCENE_RUNNING(chopChaseProperties.iSyncScene) VECTOR vVanPos vVanPos = GET_ENTITY_COORDS(hoodVehicle[HV_FRANKLIN_VAN]) VECTOR vVanRot vVanRot = GET_ENTITY_ROTATION(hoodVehicle[HV_FRANKLIN_VAN]) CONST_FLOAT VAN_SHIFT_POS_SPEED 1.0 CONST_FLOAT VAN_SHIFT_ROT_SPEED 20.0 IF IS_SYNCHRONIZED_SCENE_RUNNING(iLamarSyncScene) SHIFT_VECTOR_TO_IDEAL_VECTOR(vLamarSyncScenePos, vVanPos, VAN_SHIFT_POS_SPEED/3) SHIFT_VECTOR_TO_IDEAL_VECTOR(vLamarSyncSceneRot, vVanRot, VAN_SHIFT_ROT_SPEED/3) SET_SYNCHRONIZED_SCENE_ORIGIN(iLamarSyncScene, vLamarSyncScenePos, vLamarSyncSceneRot) ENDIF SHIFT_VECTOR_TO_IDEAL_VECTOR(vChopSyncScenePos, vVanPos, VAN_SHIFT_POS_SPEED/4) SHIFT_VECTOR_TO_IDEAL_VECTOR(vChopSyncSceneRot, vVanRot, VAN_SHIFT_ROT_SPEED/4) SET_SYNCHRONIZED_SCENE_ORIGIN(chopChaseProperties.iSyncScene, vChopSyncScenePos, vChopSyncSceneRot) DO_LAMAR_WALK_TO_VAN() //IF GET_SYNCHRONIZED_SCENE_PHASE(chopChaseProperties.iSyncScene) >= 0.98 //DETACH_SYNCHRONIZED_SCENE(chopChaseProperties.iSyncScene) // SET_CHOP_INTO_VAN(chopPed, hoodVehicle[HV_FRANKLIN_VAN], chopLeanInVanState, fCachedVanSpeed, FALSE, FALSE, TRUE) //TASK_FOLLOW_NAV_MESH_TO_COORD(lamarPed, <<-79.09520, -1457.45752, 31.05803>>, PEDMOVE_WALK, DEFAULT_TIME_BEFORE_WARP, DEFAULT_NAVMESH_RADIUS, ENAV_DEFAULT, -139.7) //TASK_LOOK_AT_ENTITY(lamarPed, PLAYER_PED_ID(), -1, SLF_WHILE_NOT_IN_FOV) //SET_PED_AS_GROUP_MEMBER(lamarPed, PLAYER_GROUP_ID()) // chopIntoVanState = CHOP_INTO_VAN_STATE_DONE //ENDIF ELSE SET_CHOP_INTO_VAN(chopPed, hoodVehicle[HV_FRANKLIN_VAN], chopLeanInVanState, fCachedVanSpeed, FALSE, FALSE, TRUE) SET_ENTITY_PROOFS(chopPed, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, TRUE) SET_PED_CAN_RAGDOLL(chopPed, FALSE) chopIntoVanState = CHOP_INTO_VAN_STATE_DONE ENDIF BREAK CASE CHOP_INTO_VAN_STATE_DONE IF NOT bForcedIntoVan DO_LAMAR_WALK_TO_VAN() SET_PED_CAN_RAGDOLL_FROM_PLAYER_IMPACT(lamarPed, TRUE) ENDIF BREAK ENDSWITCH IF IS_CHAR_USING_VEHICLE(PLAYER_PED_ID(), hoodVehicle[HV_FRANKLIN_VAN]) OR chopIntoVanState > CHOP_INTO_VAN_STATE_GET_IN_POSITION FREEZE_ENTITY_POSITION(hoodVehicle[HV_FRANKLIN_VAN], FALSE) ENDIF IF NOT bLamarWasInGroup IF chopIntoVanState = CHOP_INTO_VAN_STATE_DONE IF NOT IS_PED_GROUP_MEMBER(lamarPed, PLAYER_GROUP_ID()) IF NOT IS_ENTITY_AT_ENTITY(lamarPed, hoodVehicle[HV_FRANKLIN_VAN], <<7.5,7.5,7.5>>, FALSE, FALSE) OR (bDoneLamarWalkToVan AND GET_SCRIPT_TASK_STATUS(lamarPed, SCRIPT_TASK_ENTER_VEHICLE) = FINISHED_TASK AND GET_GAME_TIMER() >= iEnterVanTaskTime + 1000) CLEAR_PED_TASKS(lamarPed) TASK_LOOK_AT_ENTITY(lamarPed, PLAYER_PED_ID(), -1, SLF_WHILE_NOT_IN_FOV) SET_PED_AS_GROUP_MEMBER(lamarPed, PLAYER_GROUP_ID()) bLamarWasInGroup = TRUE ENDIF ELSE bLamarWasInGroup = TRUE ENDIF ENDIF ENDIF IF chopIntoVanState > CHOP_INTO_VAN_STATE_NOT_STARTED IF NOT bDoneChopGetInSpeech IF NOT bCutsceneWaitStarted IF iGetInTextStage > 0 IF chopIntoVanState >= CHOP_INTO_VAN_STATE_PLAYING AND chopIntoVanState < CHOP_INTO_VAN_STATE_DONE IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), lamarPed, <<15,15,15>>, FALSE, FALSE) BOOL bAllowGoodDog bAllowGoodDog = TRUE IF IS_ENTITY_PLAYING_ANIM(hoodVehicle[HV_FRANKLIN_VAN], GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_TO_VAN), "put_chop_in_van_van") IF GET_ENTITY_ANIM_CURRENT_TIME(hoodVehicle[HV_FRANKLIN_VAN], GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_TO_VAN), "put_chop_in_van_van") >= 0.34 bAllowGoodDog = FALSE ENDIF ENDIF IF bAllowGoodDog bDoneChopGetInSpeech = DO_MISSION_SPEECH("FKN0_GDDOG", TRUE, 0, FALSE, NOT IS_MESSAGE_BEING_DISPLAYED()) ELSE bDoneChopGetInSpeech = TRUE ENDIF ELSE bDoneChopGetInSpeech = TRUE ENDIF ENDIF ENDIF ENDIF ENDIF IF chopIntoVanState >= CHOP_INTO_VAN_STATE_PLAYING IF NOT bShutVanDoors BOOL bDoShut bDoShut = FALSE IF IS_ENTITY_PLAYING_ANIM(hoodVehicle[HV_FRANKLIN_VAN], GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_TO_VAN), "put_chop_in_van_van") IF GET_ENTITY_ANIM_CURRENT_TIME(hoodVehicle[HV_FRANKLIN_VAN], GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_TO_VAN), "put_chop_in_van_van") >= 0.885 bDoShut = TRUE ENDIF ELSE // bDoShut = TRUE ENDIF IF bDoShut STOP_ENTITY_ANIM(hoodVehicle[HV_FRANKLIN_VAN], "put_chop_in_van_van", GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_TO_VAN), INSTANT_BLEND_OUT) SET_VEHICLE_DOOR_SHUT(hoodVehicle[HV_FRANKLIN_VAN], SC_DOOR_REAR_LEFT) SET_VEHICLE_DOOR_SHUT(hoodVehicle[HV_FRANKLIN_VAN], SC_DOOR_REAR_RIGHT) printstring("done shut doors3!") printnl() bShutVanDoors = TRUE ENDIF ENDIF ENDIF IF IS_PED_SITTING_IN_VEHICLE(lamarPed, hoodVehicle[HV_FRANKLIN_VAN]) IF IS_PED_GROUP_MEMBER(lamarPed, PLAYER_GROUP_ID()) REMOVE_PED_FROM_GROUP(lamarPed) SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(lamarPed, FALSE) SET_PED_COMBAT_ATTRIBUTES(lamarPed, CA_LEAVE_VEHICLES, FALSE) ENDIF ENDIF IF IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), hoodVehicle[HV_FRANKLIN_VAN]) AND IS_PED_IN_VEHICLE(lamarPed, hoodVehicle[HV_FRANKLIN_VAN]) IF chopIntoVanState = CHOP_INTO_VAN_STATE_DONE AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() IF CAN_ADVANCE_MISSION() IF NOT IS_PED_INJURED(chopPed) SET_PED_CAN_RAGDOLL_FROM_PLAYER_IMPACT(chopPed, TRUE) ENDIF IF NOT IS_PED_INJURED(lamarPed) SET_PED_CAN_RAGDOLL_FROM_PLAYER_IMPACT(lamarPed, TRUE) ENDIF STOP_HOOD_AUDIO_SCENE(HOOD_AUDIO_SCENE_WALK_TO_VAN) START_HOOD_AUDIO_SCENE(HOOD_AUDIO_SCENE_DRIVE_TO_VINEWOOD) SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(lamarPed, FALSE) SET_PED_COMBAT_ATTRIBUTES(lamarPed, CA_LEAVE_VEHICLES, FALSE) CLEAR_MISC_ASSET_REQUEST(H_MISC_ASSET_GESTURES) bDoneBanter = FALSE bSavedBanter = FALSE bShownGodText = FALSE bDoneLamarIntoVan = TRUE iNextChopSoundTime = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(2000, 3000) iGetInTextStage = 2 SET_WANTED_LEVEL_MULTIPLIER(1.0) SET_MAX_WANTED_LEVEL(5) ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF ELSE //IF NOT bDoneLamarIntoVan // DO_INTO_VAN_CUTSCENE() //ELSE DO_BAD_GUY_ESCAPE_CUTSCENE() //ENDIF ENDIF ENDPROC // trigger crash cut PROC HANDLE_CRASH_TRIGGER() IF IS_VEHICLE_DRIVEABLE(hoodVehicle[HV_FRANKLIN_VAN]) AND NOT IS_PED_INJURED(PLAYER_PED_ID()) AND NOT IS_PED_INJURED(chopPed) AND NOT IS_PED_INJURED(lamarPed) AND NOT IS_PED_INJURED(runnerChaseProperties.ped) SWITCH crashTriggerState CASE CRASH_TRIGGER_WAITING IF createYardStage = CREATE_YARD_STAGE_DONE IF IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), hoodVehicle[HV_FRANKLIN_VAN]) IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<454.84790, -688.87665, 26.97397>>, <<17,17,17>>, FALSE, FALSE) OR IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<458.08105, -660.48938, 26.48790>>, <<35,35,35>>, FALSE, FALSE) IF DOES_ENTITY_EXIST(uberTrailerVehicle) SET_VEHICLE_AS_NO_LONGER_NEEDED(uberTrailerVehicle) ENDIF CLEAR_MODEL_REQUEST(ENUM_TO_INT(HM_TRAILER)) SetpieceCarID[CRASH_BUS_ID] = NULL IF STREAMVOL_IS_VALID(missionStreamingVolume) STREAMVOL_DELETE(missionStreamingVolume) ENDIF //missionStreamingVolume = STREAMVOL_CREATE_FRUSTUM(<<456.8, -686.9, 28.5>>, CONVERT_ROTATION_TO_DIRECTION_VECTOR(<<-11.9,-1.6,-152.7>>), 15, FLAG_MAPDATA) missionStreamingVolume = STREAMVOL_CREATE_FRUSTUM(<<456.5, -686.2, 28.9>>, CONVERT_ROTATION_TO_DIRECTION_VECTOR(<<-2.5,0.0,-178.1>>), 100, FLAG_MAPDATA) iSlowDownTime = GET_GAME_TIMER() crashTriggerState = CRASH_TRIGGER_SLOW_DOWN ENDIF ELSE IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), runnerChaseProperties.ped, <<7,7,7>>) IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() IF DOES_ENTITY_EXIST(uberTrailerVehicle) SET_VEHICLE_AS_NO_LONGER_NEEDED(uberTrailerVehicle) ENDIF CLEAR_MODEL_REQUEST(ENUM_TO_INT(HM_TRAILER)) SetpieceCarID[CRASH_BUS_ID] = NULL bRunningCutscene = TRUE ENDIF ENDIF ENDIF ENDIF ENDIF BREAK CASE CRASH_TRIGGER_SLOW_DOWN REQUEST_ADDITIONAL_COLLISION_AT_COORD(<<457.7, -690.7, 27.7>>) IF NOT bKilledSpeechAtCutscene IF GET_GAME_TIMER() >= iSlowDownTime + 3000 KILL_ANY_CONVERSATION() bDoneCrashReactionSpeech = TRUE bKilledSpeechAtCutscene = TRUE ENDIF ENDIF IF BRING_VEHICLE_TO_HALT_AND_DISABLE_VEH_CONTROLS(hoodVehicle[HV_FRANKLIN_VAN], 14.0) AND bKnockedOffBike AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() bRunningCutscene = TRUE ENDIF BREAK CASE CRASH_TRIGGER_GET_CHOP_OUT BOOL bLaunchFootChase bLaunchFootChase = FALSE FLOAT fPhase IF NOT bDoneGetOutCue bDoneGetOutCue = TRIGGER_MISSION_MUSIC_EVENT("FRA0_CHASE_MID") ENDIF IF NOT bDoneGetChopSpeech bDoneGetChopSpeech = DO_MISSION_SPEECH("FKN0_GOGET") ENDIF //IF IS_ENTITY_PLAYING_ANIM(PLAYER_PED_ID(), GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_DRIVE_HOME), "van_get_out_franklin") IF IS_SYNCHRONIZED_SCENE_RUNNING(iSyncScene) fPhase = GET_SYNCHRONIZED_SCENE_PHASE(iSyncScene) IF fPhase >= 0 IF bDoneGetChopSpeech IF NOT bDoneReleaseChopSpeech IF fPhase >= 0.60 bDoneReleaseChopSpeech = DO_MISSION_SPEECH("FKN0_GOGET2") ENDIF ENDIF ENDIF IF NOT bClearedChopTask IF fPhase >= 0.845 CLEAR_PED_TASKS_IMMEDIATELY(chopPed) SET_ENTITY_COORDS(chopPed, <<457.75085, -686.55273, 26.77712>>) SET_ENTITY_HEADING(chopPed, -24.2) FORCE_PED_MOTION_STATE(chopPed, MS_ON_FOOT_SPRINT, TRUE, FAUS_CUTSCENE_EXIT) TASK_FOLLOW_WAYPOINT_RECORDING(chopPed, "hood7", 7, EWAYPOINT_DO_NOT_RESPOND_TO_COLLISION_EVENTS | EWAYPOINT_NAVMESH_BACK_TO_WAYPOINT_IF_LEFT_ROUTE) bClearedChopTask = TRUE ENDIF ENDIF ENDIF ELSE bLaunchFootChase = TRUE ENDIF SET_PED_MIN_MOVE_BLEND_RATIO(PLAYER_PED_ID(),PEDMOVE_SPRINT) SET_PED_MIN_MOVE_BLEND_RATIO(chopPed,PEDMOVE_SPRINT) IF IS_ENTITY_PLAYING_ANIM(hoodVehicle[HV_FRANKLIN_VAN], GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_DRIVE_HOME), "van_get_out_van") FLOAT fVanPhase fVanPhase = GET_ENTITY_ANIM_CURRENT_TIME(hoodVehicle[HV_FRANKLIN_VAN], GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_DRIVE_HOME), "van_get_out_van") SWITCH iOpenVanDoorSoundStage CASE 0 IF fVanPhase >= 0.16 PLAY_VEHICLE_DOOR_OPEN_SOUND(hoodVehicle[HV_FRANKLIN_VAN], 0) PRINTSTRING("OPEN sound 1") printnl() iOpenVanDoorSoundStage++ ENDIF BREAK CASE 1 IF fVanPhase >= 0.569 PLAY_VEHICLE_DOOR_OPEN_SOUND(hoodVehicle[HV_FRANKLIN_VAN], 3) PRINTSTRING("OPEN sound 2") printnl() iOpenVanDoorSoundStage++ ENDIF BREAK CASE 2 IF fVanPhase >= 0.581 //PLAY_VEHICLE_DOOR_CLOSE_SOUND(hoodVehicle[HV_FRANKLIN_VAN], 0) PRINTSTRING("CLOSE sound 1") printnl() iOpenVanDoorSoundStage++ ENDIF BREAK ENDSWITCH ENDIF IF bLaunchFootChase //AND NOT bRunningCutscene //ENDIF ENDIF BREAK ENDSWITCH ENDIF ENDPROC // knock runner off bike PROC KNOCK_RUNNER_OFF_BIKE() IF NOT bKnockedOffBike //SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(runnerChaseProperties.ped, FALSE) SET_PED_CAN_BE_KNOCKED_OFF_VEHICLE(runnerChaseProperties.ped, KNOCKOFFVEHICLE_DEFAULT) IF CAN_KNOCK_PED_OFF_VEHICLE(runnerChaseProperties.ped) KNOCK_PED_OFF_VEHICLE(runnerChaseProperties.ped) bPedOffBikeAI = FALSE ELSE bPedOffBikeAI = TRUE ENDIF IF IS_VEHICLE_DRIVEABLE(hoodVehicle[HV_BAD_GUY_BIKE]) SET_ENTITY_PROOFS(hoodVehicle[HV_BAD_GUY_BIKE], FALSE, FALSE, FALSE, FALSE, FALSE) SET_DISABLE_VEHICLE_PETROL_TANK_FIRES(hoodVehicle[HV_BAD_GUY_BIKE], FALSE) SET_VEHICLE_CAN_LEAK_OIL(hoodVehicle[HV_BAD_GUY_BIKE], TRUE) SET_VEHICLE_CAN_LEAK_PETROL(hoodVehicle[HV_BAD_GUY_BIKE], TRUE) ENDIF REPLAY_RECORD_BACK_FOR_TIME(3.0) iKnockOffBikeTime = GET_GAME_TIMER() bKnockedOffBike = TRUE ENDIF ENDPROC // request common models PROC REQUEST_COMMON_MODELS_TO_VAN_AND_FOOT_CHASE() IF streamingStage >= MISSION_STREAMING_STAGE_WAIT OR createYardStage >= CREATE_YARD_STAGE_WAITING ADD_MODEL_REQUEST(ENUM_TO_INT(HM_BUS)) ADD_MODEL_REQUEST(ENUM_TO_INT(HM_TRAFFIC_CAR1)) ENDIF ENDPROC // do crash cutscene PROC DO_CRASH_CUTSCENE() HANDLE_CRASH_TRIGGER() SET_ALL_RANDOM_PEDS_FLEE_THIS_FRAME(PLAYER_ID()) SWITCH cutsceneStage CASE H_CUT_STAGE_INIT REQUEST_ADDITIONAL_COLLISION_AT_COORD(<<457.7, -690.7, 27.7>>) SET_MISSION_CUTSCENE(TRUE, TRUE, -1, TRUE, FALSE) crashTriggerState = CRASH_TRIGGER_GET_CHOP_OUT //CREATE_CAM_ATTACHED_TO_VAN(VAN_CAMERA_FRONT) KILL_CHASE_HINT_CAM(localChaseHintCamStruct) CREATE_MISSION_ANIM_CAM() iSyncScene = CREATE_SYNCHRONIZED_SCENE(<<0,0,0>>, <<0,0,0>>) IF IS_VEHICLE_DRIVEABLE(hoodVehicle[HV_FRANKLIN_VAN]) ATTACH_SYNCHRONIZED_SCENE_TO_ENTITY(iSyncScene, hoodVehicle[HV_FRANKLIN_VAN], GET_ENTITY_BONE_INDEX_BY_NAME(hoodVehicle[HV_FRANKLIN_VAN], "seat_dside_f")) PLAY_SYNCHRONIZED_CAM_ANIM(animCam, iSyncScene, "VAN_GET_OUT_CAM", GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_DRIVE_HOME)) ENDIF SET_SYNCHRONIZED_SCENE_HOLD_LAST_FRAME(iSyncScene, FALSE) IF NOT IS_ENTITY_DEAD(hoodVehicle[HV_BAD_GUY_BIKE]) IF IS_ENTITY_IN_AREA(hoodVehicle[HV_BAD_GUY_BIKE], <<457.70029, -684.90436, 26.79034>>, <<463.63626, -670.48119, 26.35947>>, FALSE, FALSE) VECTOR vSetCoords vSetCoords = GET_ENTITY_COORDS(hoodVehicle[HV_BAD_GUY_BIKE]) + <<1.2,0,0>> vSetCoords.z = 26.5919 SET_ENTITY_COORDS_NO_OFFSET(hoodVehicle[HV_BAD_GUY_BIKE], vSetCoords) SET_ENTITY_ROTATION(hoodVehicle[HV_BAD_GUY_BIKE], << 0.0150743, 85.4796, 10.1482 >>) SET_ENTITY_VELOCITY(hoodVehicle[HV_BAD_GUY_BIKE], <<0,0,0>>) ENDIF ENDIF IF IS_VEHICLE_DRIVEABLE(hoodVehicle[HV_FRANKLIN_VAN]) AND NOT IS_PED_INJURED(PLAYER_PED_ID()) AND NOT IS_PED_INJURED(chopPed) AND NOT IS_PED_INJURED(lamarPed) AND NOT IS_PED_INJURED(runnerChaseProperties.ped) CLEANUP_UBER_PLAYBACK(TRUE) CLEAR_AREA_OF_VEHICLES(<<458.02, -691.40, 27.46>>, 400, TRUE) CLEAR_AREA(<<457.75021, -692.06537, 26.66529>>, 8.0, TRUE) CLEAR_AREA_OF_PROJECTILES(<<456.80389, -689.57758, 26.84026>>, 26) STOP_FIRE_IN_RANGE(<<456.80389, -689.57758, 26.84026>>, 26) REMOVE_PARTICLE_FX_IN_RANGE(<<456.80389, -689.57758, 26.84026>>, 26) STOP_VEHICLE_FIRE(hoodVehicle[HV_FRANKLIN_VAN]) SET_HOOD_ROADS_OFF(TRUE, TRUE) ENABLE_CARGENS_FOR_MISSION(FALSE) SET_ENTITY_COORDS(hoodVehicle[HV_FRANKLIN_VAN], <<458.02, -691.40, 26.70>>) SET_ENTITY_HEADING(hoodVehicle[HV_FRANKLIN_VAN], -13.4) SET_VEHICLE_ON_GROUND_PROPERLY(hoodVehicle[HV_FRANKLIN_VAN]) iSyncScene = CREATE_SYNCHRONIZED_SCENE(<<0,0,0>>, <<0,0,0>>) ATTACH_SYNCHRONIZED_SCENE_TO_ENTITY(iSyncScene, hoodVehicle[HV_FRANKLIN_VAN], 0) SET_ENTITY_COORDS(PLAYER_PED_ID(), GET_ENTITY_COORDS(PLAYER_PED_ID())) //ATTACH_ENTITY_TO_ENTITY(PLAYER_PED_ID(), hoodVehicle[HV_FRANKLIN_VAN], 0, GET_ANIM_INITIAL_OFFSET_POSITION(GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_DRIVE_HOME), "van_get_out_franklin", <<0,0,0>>, <<0,0,0>>, 0), GET_ANIM_INITIAL_OFFSET_ROTATION(GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_DRIVE_HOME), "van_get_out_franklin", <<0,0,0>>, <<0,0,0>>, 0), FALSE, FALSE, FALSE, TRUE) //TASK_PLAY_ANIM(PLAYER_PED_ID(), GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_DRIVE_HOME), "van_get_out_franklin", INSTANT_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_TAG_SYNC_OUT) TASK_SYNCHRONIZED_SCENE(PLAYER_PED_ID(), iSyncScene, GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_DRIVE_HOME), "VAN_GET_OUT_FRANKLIN", INSTANT_BLEND_IN, NORMAL_BLEND_OUT, SYNCED_SCENE_TAG_SYNC_OUT) FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID()) SET_ENTITY_COORDS(lamarPed, GET_ENTITY_COORDS(lamarPed)) //ATTACH_ENTITY_TO_ENTITY(lamarPed, hoodVehicle[HV_FRANKLIN_VAN], 0, GET_ANIM_INITIAL_OFFSET_POSITION(GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_DRIVE_HOME), "van_get_out_lamar", <<0,0,0>>, <<0,0,0>>, 0), GET_ANIM_INITIAL_OFFSET_ROTATION(GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_DRIVE_HOME), "van_get_out_lamar", <<0,0,0>>, <<0,0,0>>, 0), FALSE, FALSE, FALSE, TRUE) //TASK_PLAY_ANIM(lamarPed, GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_DRIVE_HOME), "van_get_out_lamar", INSTANT_BLEND_IN, NORMAL_BLEND_OUT, -1) TASK_SYNCHRONIZED_SCENE(lamarPed, iSyncScene, GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_DRIVE_HOME), "van_get_out_lamar", INSTANT_BLEND_IN, NORMAL_BLEND_OUT, SYNCED_SCENE_TAG_SYNC_OUT) FORCE_PED_AI_AND_ANIMATION_UPDATE(lamarPed) DETACH_ENTITY(chopPed) ///ATTACH_ENTITY_TO_ENTITY(chopPed, hoodVehicle[HV_FRANKLIN_VAN], 0, GET_ANIM_INITIAL_OFFSET_POSITION(GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_DRIVE_HOME), "van_get_out_chop", <<0,0,0>>, <<0,0,0>>, 0), GET_ANIM_INITIAL_OFFSET_ROTATION(GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_DRIVE_HOME), "van_get_out_chop", <<0,0,0>>, <<0,0,0>>, 0), FALSE, FALSE, FALSE, TRUE) //TASK_PLAY_ANIM(chopPed, GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_DRIVE_HOME), "van_get_out_chop", INSTANT_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_TAG_SYNC_OUT) TASK_SYNCHRONIZED_SCENE(chopPed, iSyncScene, GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_DRIVE_HOME), "van_get_out_chop", INSTANT_BLEND_IN, NORMAL_BLEND_OUT, SYNCED_SCENE_TAG_SYNC_OUT) FORCE_PED_AI_AND_ANIMATION_UPDATE(chopPed) CLEAR_PED_TASKS_IMMEDIATELY(runnerChaseProperties.ped) SET_ENTITY_COORDS(runnerChaseProperties.ped, <<465.88248, -677.43469, 26.25079>>) SET_ENTITY_HEADING(runnerChaseProperties.ped, 23.7) SET_VEHICLE_DOOR_LATCHED(hoodVehicle[HV_FRANKLIN_VAN], SC_DOOR_FRONT_LEFT, TRUE, TRUE, FALSE) PLAY_ENTITY_ANIM(hoodVehicle[HV_FRANKLIN_VAN], "van_get_out_van", GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_DRIVE_HOME), INSTANT_BLEND_IN, FALSE, FALSE) FORCE_ENTITY_AI_AND_ANIMATION_UPDATE(hoodVehicle[HV_FRANKLIN_VAN]) SET_SYNCHRONIZED_SCENE_HOLD_LAST_FRAME(iSyncScene, FALSE) STOP_HOOD_AUDIO_SCENE(HOOD_AUDIO_SCENE_FOCUS_CAM) STOP_HOOD_AUDIO_SCENE(HOOD_AUDIO_SCENE_CAR_CHASE) START_HOOD_AUDIO_SCENE(HOOD_AUDIO_SCENE_FOOT_CHASE_START) IF STREAMVOL_IS_VALID(missionStreamingVolume) STREAMVOL_DELETE(missionStreamingVolume) ENDIF REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST) iHoodCutsceneTime = GET_GAME_TIMER() cutsceneStage = H_CUT_STAGE_RUNNING ENDIF BREAK CASE H_CUT_STAGE_RUNNING IF NOT bAllowRunnerMovement IF GET_GAME_TIMER() >= iHoodCutsceneTime + 3800 bAllowRunnerMovement = TRUE ENDIF ENDIF IF NOT IS_SYNCHRONIZED_SCENE_RUNNING(iSyncScene) REPLAY_STOP_EVENT() COMMON_MISSION_CUTSCENE_BLENDOUT(10, CAM_SPLINE_SLOW_IN_SMOOTH) SET_MISSION_STAGE(STAGE_FOOT_CHASE, FALSE, FALSE, FALSE) bRunningCutscene = FALSE ENDIF BREAK CASE H_CUT_STAGE_CLEANUP REPLAY_STOP_EVENT() //SET_MISSION_CUTSCENE(FALSE, TRUE, -1, TRUE, FALSE) BREAK ENDSWITCH ENDPROC // car chase to the bus station PROC DO_STAGE_VAN_CHASE() IF NOT bRunningCutscene DISABLE_CONTROL_ACTION(FRONTEND_CONTROL, INPUT_SKIP_CUTSCENE) REQUEST_COMMON_MODELS_TO_VAN_AND_FOOT_CHASE() IF NOT bDoneFocusOnBikeAudioScene IF IS_GAMEPLAY_HINT_ACTIVE() bDoneFocusOnBikeAudioScene = START_HOOD_AUDIO_SCENE(HOOD_AUDIO_SCENE_FOCUS_CAM) ENDIF ELSE IF NOT IS_GAMEPLAY_HINT_ACTIVE() STOP_HOOD_AUDIO_SCENE(HOOD_AUDIO_SCENE_FOCUS_CAM) bDoneFocusOnBikeAudioScene = FALSE ENDIF ENDIF // ped density in alley //IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<457.31238, -769.91650, 26.35762>>, <<150, 150, 150>>, FALSE, FALSE) //SET_SCENARIO_PED_DENSITY_MULTIPLIER_THIS_FRAME(1.0, 0.5) // SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.8) // ENDIF // get rid of girl IF NOT bRemovedGirl IF NOT IS_ENTITY_AT_COORD(PLAYER_PED_ID(), GET_HOOD_VECTOR(HVEC_GIRL_INIT), <<80, 80, 80>>, FALSE, FALSE) IF DOES_ENTITY_EXIST(girlPed) SET_PED_AS_NO_LONGER_NEEDED(girlPed) ENDIF CLEAR_MODEL_REQUEST(ENUM_TO_INT(HM_GIRL)) bRemovedGirl = TRUE ENDIF ENDIF // chop bark as you approach IF NOT bStoppedChopExcitement IF NOT IS_PED_INJURED(chopPed) AND NOT IS_PED_INJURED(lamarPed) IF IS_ENTITY_AT_ENTITY(lamarPed, chopPed, <<14,14,14>>, FALSE, FALSE) IF NOT IS_TRACKED_PED_VISIBLE(chopPed) printstring("not visible") printnl() IF GET_GAME_TIMER() >= iNextChopExcitementTime STOP_PED_SPEAKING(chopPed, FALSE) IF GET_RANDOM_INT_IN_RANGE(0,2) = 0 PLAY_ANIMAL_VOCALIZATION(chopPed, AUD_ANIMAL_DOG_ROTTWEILER, "BARK") ELSE PLAY_ANIMAL_VOCALIZATION(chopPed, AUD_ANIMAL_DOG_ROTTWEILER, "BARK_SEQ") ENDIF STOP_PED_SPEAKING(chopPed, TRUE) iNextChopExcitementTime = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(200, 1000) ENDIF ELSE printstring("is visible") printnl() STOP_PED_SPEAKING(chopPed, FALSE) ENDIF ENDIF ENDIF ENDIF // create the setpieces SWITCH createYardStage CASE CREATE_YARD_STAGE_NOT_STARTED //IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<460.50562, -660.79364, 26.42570>>, <<200,200,200>>, FALSE, FALSE) IF IS_ENTITY_IN_AREA(PLAYER_PED_ID(), <<394.53989, -869.11523, 20.28647>>, <<652.68286, -666.74109, 54.06824>>) OR IS_ENTITY_IN_AREA(PLAYER_PED_ID(), <<277.28827, -831.68213, 20.24340>>, <<390.69489, -646.09259, 54.50041>>) //ADD_MODEL_REQUEST(ENUM_TO_INT(HM_TRAFFIC_CAR1)) //ADD_MODEL_REQUEST(ENUM_TO_INT(HM_TRAFFIC_CAR2)) ADD_MODEL_REQUEST(ENUM_TO_INT(HM_BUS)) ADD_MODEL_REQUEST(ENUM_TO_INT(HM_WORKER)) // ADD_MODEL_REQUEST(ENUM_TO_INT(HM_ENGINE)) // ADD_MODEL_REQUEST(ENUM_TO_INT(HM_TANKER_CARRIAGE)) // ADD_MODEL_REQUEST(ENUM_TO_INT(HM_CONTAINER_CARRIAGE)) // ADD_RECORDING_REQUEST(002) // ADD_RECORDING_REQUEST(007) // ADD_RECORDING_REQUEST(006) ADD_RECORDING_REQUEST(011) ADD_RECORDING_REQUEST(001) //ADD_RECORDING_REQUEST(005) ADD_RECORDING_REQUEST(012) createYardStage = CREATE_YARD_STAGE_WAITING ENDIF BREAK CASE CREATE_YARD_STAGE_WAITING //IF HAS_MODEL_LOADED(GET_MODEL_FOR_HOOD_MODEL_ENUM(HM_TRAFFIC_CAR1)) //AND HAS_MODEL_LOADED(GET_MODEL_FOR_HOOD_MODEL_ENUM(HM_TRAFFIC_CAR2)) IF HAS_MODEL_LOADED(GET_MODEL_FOR_HOOD_MODEL_ENUM(HM_BUS)) AND HAS_MODEL_LOADED(GET_MODEL_FOR_HOOD_MODEL_ENUM(HM_WORKER)) //AND HAS_MODEL_LOADED(GET_MODEL_FOR_HOOD_MODEL_ENUM(HM_ENGINE)) //AND HAS_MODEL_LOADED(GET_MODEL_FOR_HOOD_MODEL_ENUM(HM_TANKER_CARRIAGE)) //AND HAS_MODEL_LOADED(GET_MODEL_FOR_HOOD_MODEL_ENUM(HM_CONTAINER_CARRIAGE)) //AND HAS_VEHICLE_RECORDING_BEEN_LOADED(002, GET_HOOD_RECORDING_PREFIX()) //AND HAS_VEHICLE_RECORDING_BEEN_LOADED(007, GET_HOOD_RECORDING_PREFIX()) //AND HAS_VEHICLE_RECORDING_BEEN_LOADED(006, GET_HOOD_RECORDING_PREFIX()) AND HAS_VEHICLE_RECORDING_BEEN_LOADED(011, GET_HOOD_RECORDING_PREFIX()) AND HAS_VEHICLE_RECORDING_BEEN_LOADED(001, GET_HOOD_RECORDING_PREFIX()) //AND HAS_VEHICLE_RECORDING_BEEN_LOADED(005, GET_HOOD_RECORDING_PREFIX()) AND HAS_VEHICLE_RECORDING_BEEN_LOADED(012, GET_HOOD_RECORDING_PREFIX()) CREATE_CHASE_SETPIECES(FALSE, FALSE, FALSE, TRUE, TRUE) createYardStage = CREATE_YARD_STAGE_DONE ENDIF BREAK ENDSWITCH IF NOT bClearedPlayerRun IF GET_GAME_TIMER() >= iStageStartTime + 1000 bClearedPlayerRun = TRUE ELSE IF GET_FOLLOW_PED_CAM_VIEW_MODE() <> CAM_VIEW_MODE_FIRST_PERSON SET_PED_MIN_MOVE_BLEND_RATIO(PLAYER_PED_ID(), PEDMOVE_RUN) ENDIF IF NOT IS_PED_INJURED(chopPed) SET_PED_MIN_MOVE_BLEND_RATIO(chopPed,PEDMOVE_SPRINT) ENDIF ENDIF ENDIF // chop IF crashTriggerState < CRASH_TRIGGER_GET_CHOP_OUT HANDLE_CHOP_LEAN_IN_VAN(chopPed, hoodVehicle[HV_FRANKLIN_VAN], chopLeanInVanState, fCachedVanSpeed, iNextChopAnimTime, iNextBarkTime, TRUE) ENDIF IF NOT bKnockedOffBike IF NOT IS_PED_INJURED(runnerChaseProperties.ped) IF NOT IS_PED_IN_ANY_VEHICLE(runnerChaseProperties.ped) APPLY_DAMAGE_TO_PED(runnerChaseProperties.ped, 1000, TRUE) ELSE IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(runnerChaseProperties.ped, PLAYER_PED_ID()) IF CAN_KNOCK_PED_OFF_VEHICLE(runnerChaseProperties.ped) KNOCK_PED_OFF_VEHICLE(runnerChaseProperties.ped) ELSE SET_PED_CAN_BE_KNOCKED_OFF_VEHICLE(runnerChaseProperties.ped, KNOCKOFFVEHICLE_DEFAULT) ENDIF ENDIF ENDIF ENDIF ENDIF IF IS_VEHICLE_DRIVEABLE(hoodVehicle[HV_BAD_GUY_BIKE]) AND IS_VEHICLE_DRIVEABLE(hoodVehicle[HV_FRANKLIN_VAN]) AND NOT IS_PED_INJURED(runnerChaseProperties.ped) AND NOT IS_PED_INJURED(lamarPed) CONTROL_VEHICLE_CHASE_HINT_CAM_IN_VEHICLE(localChaseHintCamStruct, hoodVehicle[HV_BAD_GUY_BIKE]) //temp, remove // lamar run to van IF NOT bTempLamarvan IF IS_ENTITY_AT_COORD(lamarPed, GET_HOOD_VECTOR(HVEC_LAMAR_SPRINT_TO_VAN), <<2.0,2.0,3>>) TASK_ENTER_VEHICLE(lamarPed, hoodVehicle[HV_FRANKLIN_VAN], DEFAULT_TIME_BEFORE_WARP, VS_FRONT_RIGHT) SET_PED_MIN_MOVE_BLEND_RATIO(lamarPed, PEDMOVE_RUN) bTempLamarvan = TRUE ELSE SET_PED_MOVE_RATE_OVERRIDE(lamarPed, 1.15) ENDIF ENDIF IF NOT bResetDirectEntryFlag IF IS_PED_IN_VEHICLE(lamarPed, hoodVehicle[HV_FRANKLIN_VAN]) REMOVE_PED_FROM_GROUP(lamarPed) SET_PED_CONFIG_FLAG(PLAYER_PED_ID(), PCF_ForceDirectEntry, FALSE) bResetDirectEntryFlag = TRUE ENDIF ENDIF // handle the chase IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(hoodVehicle[HV_BAD_GUY_BIKE]) FLOAT fPlaybackTime = GET_TIME_POSITION_IN_RECORDING(hoodVehicle[HV_BAD_GUY_BIKE]) VECTOR vPlayerPos = GET_ENTITY_COORDS(PLAYER_PED_ID()) HANDLE_CHASE_SPEED(fPlaybackTime) IF crashTriggerState = CRASH_TRIGGER_WAITING UPDATE_UBER_PLAYBACK(hoodVehicle[HV_BAD_GUY_BIKE], fCarChaseSpeed) ENDIF //PRINTSTRING("speed = ") PRINTFLOAT(fCarChaseSpeed) PRINTNL() PRINTNL() //PRINTSTRING("time = ") PRINTFLOAT(fPlaybackTime) PRINTNL() IF fPlaybackTime >= 66300 SET_VEHICLE_BRAKE_LIGHTS(hoodVehicle[HV_BAD_GUY_BIKE], FALSE) ENDIF // load worker IF fPlaybackTime >= 55000 AND createYardStage = CREATE_YARD_STAGE_DONE IF NOT bSetWorkerDefault SET_UBER_PLAYBACK_DEFAULT_PED_MODEL(GET_MODEL_FOR_HOOD_MODEL_ENUM(HM_WORKER)) SET_FORCE_UBER_PLAYBACK_TO_USE_DEFAULT_PED_MODEL(TRUE) SET_UBER_PLAYBACK_TO_CLEANUP_DEFAULT_PED_MODEL(FALSE) bSetWorkerDefault = TRUE ENDIF ENDIF IF NOT bSetIssiNoCollision IF IS_VEHICLE_DRIVEABLE(trafficCarID[33]) SET_ENTITY_NO_COLLISION_ENTITY(trafficCarID[33], hoodVehicle[HV_BAD_GUY_BIKE], FALSE) bSetIssiNoCollision = TRUE PRINTSTRING("set issi no collision") PRINTNL() ENDIF ENDIF // knock off IF NOT bDoneBusSmash BOOL bDoBusSmash = FALSE IF IS_VEHICLE_DRIVEABLE(SetpieceCarID[CRASH_BUS_ID]) IF IS_ENTITY_TOUCHING_ENTITY(hoodVehicle[HV_BAD_GUY_BIKE], SetpieceCarID[CRASH_BUS_ID]) bDoBusSmash = TRUE ENDIF ENDIF IF fPlaybackTime >= 73092//600 bDoBusSmash = TRUE ENDIF IF bDoBusSmash IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(hoodVehicle[HV_BAD_GUY_BIKE]) STOP_PLAYBACK_RECORDED_VEHICLE(hoodVehicle[HV_BAD_GUY_BIKE]) ENDIF //APPLY_FORCE_TO_ENTITY(hoodVehicle[HV_BAD_GUY_BIKE], APPLY_TYPE_IMPULSE, <<20,-5,0>>, <<0,0,2>>, 0, FALSE, TRUE, TRUE) //iBusSmashTime = GET_GAME_TIMER() bDoneBusSmash = TRUE ENDIF ELSE IF IS_VEHICLE_DRIVEABLE(SetpieceCarID[CRASH_BUS_ID]) IF NOT bPausedCrashBus IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(SetpieceCarID[CRASH_BUS_ID]) IF SetpieceCarProgress[CRASH_BUS_ID] = 4 //SetpieceCarProgress[CRASH_BUS_ID] = 75 bPausedCrashBus = TRUE ENDIF ENDIF ELSE IF IS_VEHICLE_DRIVEABLE(SetpieceCarID[CRASH_BUS_ID]) BRING_VEHICLE_TO_HALT(SetpieceCarID[CRASH_BUS_ID], 2, 1) ENDIF ENDIF ENDIF ENDIF // pass the crash bus over to the foot chase IF NOT DOES_ENTITY_EXIST(yardVehicle[YV_BUS_ROAD_FROM_LEFT]) IF DOES_ENTITY_EXIST(SetpieceCarID[CRASH_BUS_ID]) yardVehicle[YV_BUS_ROAD_FROM_LEFT] = SetpieceCarID[CRASH_BUS_ID] IF IS_VEHICLE_DRIVEABLE(yardVehicle[YV_BUS_ROAD_FROM_LEFT]) SET_VEHICLE_DOORS_LOCKED(yardVehicle[YV_BUS_ROAD_FROM_LEFT], VEHICLELOCK_LOCKOUT_PLAYER_ONLY) ENDIF ENDIF ENDIF IF NOT DOES_ENTITY_EXIST(driverPed[YV_BUS_ROAD_FROM_LEFT]) IF IS_VEHICLE_DRIVEABLE(yardVehicle[YV_BUS_ROAD_FROM_LEFT]) PED_INDEX busDriverPed = GET_PED_IN_VEHICLE_SEAT(yardVehicle[YV_BUS_ROAD_FROM_LEFT]) IF NOT IS_PED_INJURED(busDriverPed) SET_ENTITY_AS_MISSION_ENTITY(busDriverPed, TRUE, TRUE) driverPed[YV_BUS_ROAD_FROM_LEFT] = busDriverPed ENDIF ENDIF ENDIF // handle the blocking bus CONST_INT BLOCKING_TRAFFIC_ID 12 printint(SetpieceCarProgress[BLOCKING_TRAFFIC_ID]) printnl() IF IS_VEHICLE_DRIVEABLE(SetpieceCarID[BLOCKING_TRAFFIC_ID]) printstring("here1") printnl() IF NOT bPausedBlockingTraffic printstring("here2") printnl() IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(SetpieceCarID[BLOCKING_TRAFFIC_ID]) printstring("here3") printnl() IF SetpieceCarProgress[BLOCKING_TRAFFIC_ID] = 4 printstring("here4") printnl() bPausedBlockingTraffic = TRUE ENDIF ELSE IF SetpieceCarProgress[BLOCKING_TRAFFIC_ID] >= 3 bPausedBlockingTraffic = TRUE ENDIF ENDIF ELSE printstring("here5") printnl() BRING_VEHICLE_TO_HALT(SetpieceCarID[BLOCKING_TRAFFIC_ID], 2, 1) ENDIF ENDIF // handle the static bus CONST_INT STATIC_TRAFFIC_ID 13 IF IS_VEHICLE_DRIVEABLE(SetpieceCarID[STATIC_TRAFFIC_ID]) IF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(SetpieceCarID[STATIC_TRAFFIC_ID]) BRING_VEHICLE_TO_HALT(SetpieceCarID[STATIC_TRAFFIC_ID], 2, 1) ENDIF ENDIF // handle the uber trailer CONST_INT TRAILER_CAB_TRAFFIC_ID 42 CONST_INT TRAILER_RECORDING 43 SWITCH uberTrailerState CASE UBER_TRAILER_NOT_CREATED // start streaming IF fPlaybackTime >= 50000 ADD_MODEL_REQUEST(ENUM_TO_INT(HM_TRAILER)) //REQUEST_VEHICLE_RECORDING(TRAILER_RECORDING, GET_HOOD_UBER_RECORDING_PREFIX()) uberTrailerState = UBER_TRAILER_STREAMING ENDIF BREAK CASE UBER_TRAILER_STREAMING IF bModelRequestTracker[HM_TRAILER] IF HAS_MODEL_LOADED(GET_MODEL_FOR_HOOD_MODEL_ENUM(HM_TRAILER)) //AND HAS_VEHICLE_RECORDING_BEEN_LOADED(TRAILER_RECORDING, GET_HOOD_UBER_RECORDING_PREFIX()) AND IS_VEHICLE_DRIVEABLE(TrafficCarID[TRAILER_CAB_TRAFFIC_ID]) //IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(TrafficCarID[TRAILER_CAB_TRAFFIC_ID]) uberTrailerVehicle = CREATE_VEHICLE(GET_MODEL_FOR_HOOD_MODEL_ENUM(HM_TRAILER), <<396.0168,-854.3585,31.0555>>, 93.05) ATTACH_VEHICLE_TO_TRAILER(TrafficCarID[TRAILER_CAB_TRAFFIC_ID], uberTrailerVehicle) //START_PLAYBACK_RECORDED_VEHICLE(uberTrailerVehicle, TRAILER_RECORDING, GET_HOOD_UBER_RECORDING_PREFIX()) //SKIP_TIME_IN_PLAYBACK_RECORDED_VEHICLE(uberTrailerVehicle, GET_TIME_POSITION_IN_RECORDING(TrafficCarID[TRAILER_CAB_TRAFFIC_ID])) //SET_PLAYBACK_SPEED(uberTrailerVehicle, fCarChaseSpeed) //SET_POSITION_OFFSET_FOR_RECORDED_VEHICLE_PLAYBACK(uberTrailerVehicle, <<0.5,-0.1,-0.25>>) uberTrailerState = UBER_TRAILER_CREATED //ENDIF ENDIF ENDIF BREAK CASE UBER_TRAILER_CREATED IF DOES_ENTITY_EXIST(uberTrailerVehicle) IF IS_VEHICLE_DRIVEABLE(uberTrailerVehicle) IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(uberTrailerVehicle) IF IS_VEHICLE_DRIVEABLE(TrafficCarID[TRAILER_CAB_TRAFFIC_ID]) IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(TrafficCarID[TRAILER_CAB_TRAFFIC_ID]) SET_PLAYBACK_SPEED(uberTrailerVehicle, fCarChaseSpeed) ELSE STOP_PLAYBACK_RECORDED_VEHICLE(uberTrailerVehicle) ENDIF ELSE STOP_PLAYBACK_RECORDED_VEHICLE(uberTrailerVehicle) ENDIF ENDIF ENDIF IF NOT DOES_ENTITY_EXIST(TrafficCarID[TRAILER_CAB_TRAFFIC_ID]) SET_VEHICLE_AS_NO_LONGER_NEEDED(uberTrailerVehicle) CLEAR_MODEL_REQUEST(ENUM_TO_INT(HM_TRAILER)) uberTrailerState = UBER_TRAILER_REMOVED ENDIF ENDIF BREAK ENDSWITCH // handle speed up in alley IF NOT bSpeedUpBikeInAlley IF fPlaybackTime >= 65000 IF vPlayerPos.x >= 420.49 bSpeedUpBikeInAlley = TRUE ENDIF ENDIF ENDIF // check distance CONST_FLOAT VAN_CHASE_FAIL_DISTANCE 300.0 FLOAT fDistanceToBadGuy = GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), hoodVehicle[HV_BAD_GUY_BIKE]) UPDATE_CHASE_BLIP(badGuyCarBlip, hoodVehicle[HV_BAD_GUY_BIKE], VAN_CHASE_FAIL_DISTANCE) IF fDistanceToBadGuy >= VAN_CHASE_FAIL_DISTANCE IF DOES_BLIP_EXIST(badGuyCarBlip) REMOVE_BLIP(badGuyCarBlip) ENDIF IF DOES_BLIP_EXIST(runnerBlip) REMOVE_BLIP(runnerBlip) ENDIF MISSION_FAILED(FAIL_LOST_BAD_GUY) ENDIF // do speech IF bShownGodText IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), hoodVehicle[HV_FRANKLIN_VAN]) AND IS_PED_IN_VEHICLE(lamarPed, hoodVehicle[HV_FRANKLIN_VAN]) IF NOT bDoneInVanCue bDoneInVanCue = TRIGGER_MISSION_MUSIC_EVENT("FRA0_CHASE_START") ENDIF IF NOT bStoppedChopExcitement IF NOT IS_PED_INJURED(chopPed) STOP_PED_SPEAKING(chopPed, FALSE) SET_ANIMAL_MOOD(chopPed, AUD_ANIMAL_MOOD_ANGRY) ENDIF bStoppedChopExcitement = TRUE ENDIF DO_CHOP_AUDIO(CHOP_AUDIO_STATE_IN_VAN_AGITATED) IF NOT bDoneLaughAtFranklinSpeech IF iLaughAtFranklinTime >= 0 IF GET_GAME_TIMER() >= iLaughAtFranklinTime + 2000 bDoneLaughAtFranklinSpeech = TRUE ELSE bDoneLaughAtFranklinSpeech = DO_MISSION_SPEECH("FKN0_SPEC") ENDIF ELSE IF bDoneUseAbilitySpeech AND bDoneThisWillGetBumpySpeech IF NOT IS_SPECIAL_ABILITY_ACTIVE(PLAYER_ID()) IF bUsedAbility iLaughAtFranklinTime = GET_GAME_TIMER() ENDIF ENDIF ENDIF ENDIF ENDIF // say speech if manage to get close to bad guy IF NOT bKnockedOffBike IF fPlaybackTime < 66000 IF GET_GAME_TIMER() >= iNextBallaVanChaseSpeechTime IF fDistanceToBadGuy <= 40.0 IF DO_MISSION_SPEECH("FKN0_OG1") iNextBallaVanChaseSpeechTime = GET_GAME_TIMER() + 20000 ENDIF ENDIF ENDIF ENDIF ENDIF IF fDistanceToBadGuy >= 150.0 AND bDoneThisWillGetBumpySpeech // getting away speech IF iNextRandomSpeechTime < 0 iNextRandomSpeechTime = GET_GAME_TIMER() ENDIF IF NOT bKnockedOffBike DO_RANDOM_SPEECH("FKN0_LOSING") ENDIF ELSE //PRINTSTRING("distance = ") PRINTFLOAT(fDistanceToBadGuy) PRINTNL() //PRINTSTRING("playback time = ") PRINTFLOAT(fPlaybackTime) PRINTNL() IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() fNoSpeechTime = fNoSpeechTime +@ 1.0 ELSE fNoSpeechTime = 0.0 ENDIF IF NOT bDoneWontCatchComplainSpeech bDoneWontCatchComplainSpeech = DO_MISSION_SPEECH("FKN0_NOCAT1") IF bDoneWontCatchComplainSpeech REPLAY_RECORD_BACK_FOR_TIME(3.0, 8.5, REPLAY_IMPORTANCE_HIGH) ENDIF ELSE IF NOT bDoneWontCatchReplySpeech IF DO_MISSION_SPEECH("FKN0_NOCAT2") bDoneWontCatchReplySpeech = TRUE ENDIF ELSE IF NOT bDoneThisWillGetBumpySpeech bDoneThisWillGetBumpySpeech = DO_MISSION_SPEECH("FKN0_HOLDON") ENDIF ENDIF ENDIF // don't shoot! speech IF iDontShootSpeechStage < 2 IF GET_GAME_TIMER() >= iNextDontShootSpeechTime IF IS_PED_SHOOTING(PLAYER_PED_ID()) AND IS_ENTITY_ON_SCREEN(runnerChaseProperties.ped) AND bDoneWontCatchReplySpeech STRING sSpeech IF iDontShootSpeechStage = 0 sSpeech = "FKN0_FSHOOT1" ELSE sSpeech = "FKN0_FSHOOT2" ENDIF IF DO_MISSION_SPEECH(sSpeech) iDontShootSpeechStage++ iNextDontShootSpeechTime = GET_GAME_TIMER() + 8000 ENDIF ENDIF ENDIF ENDIF // heading down hill speech IF NOT bDoneDownHillSpeech IF fPlaybackTime >= 40000 bDoneDownHillSpeech = TRUE ELSE IF IS_ENTITY_IN_ANGLED_AREA(hoodVehicle[HV_FRANKLIN_VAN], <<277.51, -66.64, 48.00>>, <<293.19, -72.39, 102.00>>, 340) AND GET_ENTITY_SPEED(hoodVehicle[HV_FRANKLIN_VAN]) >= 23.0 AND IS_PED_CLOSE_TO_IDEAL_HEADING(PLAYER_PED_ID(), 156.70, 30) AND bDoneUseAbilitySpeech AND fNoSpeechTime >= 1.2 bDoneDownHillSpeech = DO_MISSION_SPEECH("FKN0_VCHAS6") ENDIF ENDIF ENDIF // special ability speech IF NOT IS_SPECIAL_ABILITY_ACTIVE(PLAYER_ID()) IF NOT bDoneUseAbilitySpeech IF fPlaybackTime >= 12000 AND iVanChaseSpeechStage > 0 AND fNoSpeechTime >= 1.0 IF NOT IS_ENTITY_AT_COORD(hoodVehicle[HV_FRANKLIN_VAN], <<364.11, 323.00, 102.70>>, <<60,60,60>>, FALSE, FALSE) IF DO_MISSION_SPEECH("FKN0_FSPEC") bDoneUseAbilitySpeech = TRUE REPLAY_RECORD_BACK_FOR_TIME(0.0, 10.0, REPLAY_IMPORTANCE_HIGH) iUseAbilitySpeechTime = GET_GAME_TIMER() ENDIF ENDIF ENDIF ENDIF ENDIF IF NOT bDoneGoingLeftSpeech IF fPlaybackTime >= 43000 bDoneGoingLeftSpeech = TRUE ELSE IF fPlaybackTime >= 42000 IF fDistanceToBadGuy <= 70 AND IS_ENTITY_ON_SCREEN(runnerChaseProperties.ped) IF iReplayAttempt % 2 = 0 bDoneGoingLeftSpeech = DO_MISSION_SPEECH("FKN0_VCHAS7") ELSE bDoneGoingLeftSpeech = DO_MISSION_SPEECH("FKN0_VCHAS8") ENDIF ENDIF ENDIF ENDIF ENDIF IF NOT bBlipAlley IF fPlaybackTime >= 65800 IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), GET_HOOD_VECTOR(HVEC_BLIP_ALLEY), <<70,70,70>>, FALSE, FALSE) bBlipAlley = TRUE ENDIF ENDIF ENDIF IF NOT bDoneGoingDownAlleySpeech IF fPlaybackTime >= 67400 bDoneGoingDownAlleySpeech = TRUE ELSE IF bBlipAlley IF IS_ENTITY_ON_SCREEN(runnerChaseProperties.ped) bDoneGoingDownAlleySpeech = DO_MISSION_SPEECH("FC_VANALL") ENDIF ENDIF ENDIF ENDIF iNextRandomSpeechTime = -1 // banter FLOAT fSpeechTime SWITCH iVanChaseSpeechStage CASE 0 fSpeechTime = 13000 BREAK CASE 1 fSpeechTime = 32000 BREAK CASE 2 fSpeechTime = 48000 BREAK CASE 3 fSpeechTime = 52000 BREAK DEFAULT fSpeechTime = 99999999 BREAK ENDSWITCH IF fPlaybackTime >= fSpeechTime AND fNoSpeechTime >= 1.3 AND NOT bDoneGoingDownAlleySpeech AND bDoneWontCatchReplySpeech AND NOT bKilledSpeechForCrashReaction STRING sSpeech SWITCH iVanChaseSpeechStage CASE 0 SWITCH GET_RANDOM_INT_IN_RANGE(0,2) CASE 0 sSpeech = "FKN0_VCHAS4"//"FKN0_VCHAS1" BREAK CASE 1 sSpeech = "FKN0_VCHAS5"//"FKN0_VCHAS2" BREAK ENDSWITCH BREAK CASE 1 SWITCH GET_RANDOM_INT_IN_RANGE(0,8) CASE 0 sSpeech = "FC_CCHAT9" BREAK CASE 1 sSpeech = "FKN0_VCHAS3" BREAK CASE 2 sSpeech = "FKN0_VCHAS1" BREAK CASE 3 sSpeech = "FKN0_VCHAS2" BREAK CASE 4 sSpeech = "FC_CCHAT7" BREAK CASE 5 sSpeech = "FC_CHAT10" BREAK CASE 6 sSpeech = "FC_CCHAT8" BREAK CASE 7 sSpeech = "FC_CCHAT6" BREAK ENDSWITCH BREAK CASE 2 sSpeech = "FKN0_AGAIN" //sSpeech = "FKN0_VCHAS8" BREAK CASE 3 IF iReplayAttempt % 2 = 0 sSpeech = "FKN0_PHONE1" ELSE sSpeech = "FKN0_PHONE2" ENDIF /* SWITCH GET_RANDOM_INT_IN_RANGE(0,3) CASE 0 sSpeech = "FC_CCHAT7" BREAK CASE 1 sSpeech = "FC_CHAT10" BREAK CASE 2 sSpeech = "FC_CCHAT8" BREAK ENDSWITCH */ BREAK BREAK ENDSWITCH IF DO_MISSION_SPEECH(sSpeech) iVanChaseSpeechStage++ ENDIF ENDIF ENDIF // special ability help IF IS_SPECIAL_ABILITY_ACTIVE(PLAYER_ID()) bUsedAbility = TRUE bDoneUseAbilitySpeech = TRUE bShownSpecialAbilityHelp = TRUE IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("FC_SPCHLP") IF GET_GAME_TIMER() >= iClearHelpTime + 500 CLEAR_HELP(FALSE) iClearHelpTime = GET_GAME_TIMER() ENDIF ENDIF IF IS_PC_VERSION() IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("FC_SPCHLP_KM") IF GET_GAME_TIMER() >= iClearHelpTime + 500 CLEAR_HELP(FALSE) iClearHelpTime = GET_GAME_TIMER() ENDIF ENDIF ENDIF ELSE IF bDoneUseAbilitySpeech IF NOT bShownSpecialAbilityHelp IF GET_GAME_TIMER() >= iUseAbilitySpeechTime + 600 IF IS_USING_KEYBOARD_AND_MOUSE(PLAYER_CONTROL) bShownSpecialAbilityHelp = DO_MISSION_HELP_TEXT("FC_SPCHLP_KM", TRUE, 14000) ELSE bShownSpecialAbilityHelp = DO_MISSION_HELP_TEXT("FC_SPCHLP", TRUE, 14000) ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF bUsingActionCam = bUsingActionCam /* // handle action cam UPDATE_CAM_PLAYBACK(chaseCam, cameraVehicle, fCarChaseSpeed) IF IS_CONTROL_PRESSED IF NOT bUsingActionCam RENDER_SCRIPT_CAMS(TRUE, FALSE) bUsingActionCam = TRUE ENDIF ELSE IF bUsingActionCam RENDER_SCRIPT_CAMS(FALSE, FALSE) bUsingActionCam = FALSE ENDIF ENDIF */ HANDLE_CRASH_TRIGGER() ELSE IF NOT IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), runnerChaseProperties.ped, <<200,200,200>>, FALSE, FALSE) MISSION_FAILED(FAIL_LOST_BAD_GUY) ENDIF IF bKnockedOffBike IF streamingStage = MISSION_STREAMING_STAGE_COMPLETE // handle runner blip IF NOT IS_PED_IN_ANY_VEHICLE(runnerChaseProperties.ped) IF DOES_BLIP_EXIST(badGuyCarBlip) REMOVE_BLIP(badGuyCarBlip) ENDIF ENDIF // knock the bike over IF IS_VEHICLE_DRIVEABLE(hoodVehicle[HV_BAD_GUY_BIKE]) IF GET_ENTITY_SPEED(hoodVehicle[HV_BAD_GUY_BIKE]) >= 1 //SET_VEHICLE_FORWARD_SPEED(hoodVehicle[HV_BAD_GUY_BIKE], GET_ENTITY_SPEED(hoodVehicle[HV_BAD_GUY_BIKE]) -@ 10.0) //IF IS_PED_IN_VEHICLE(runnerChaseProperties.ped, hoodVehicle[HV_BAD_GUY_BIKE]) // BRING_VEHICLE_TO_HALT(hoodVehicle[HV_BAD_GUY_BIKE], 3, 1) //ENDIF ELSE IF bPedOffBikeAI VECTOR vBikeRot = GET_ENTITY_ROTATION(hoodVehicle[HV_BAD_GUY_BIKE]) //printstring("BIKE ROT = ") PRINTVECTOR(vBikeRot) PRINTNL() IF (vBikeRot.y < 0 AND vBikeRot.y > -50) OR (vBikeRot.y > 0 AND vBikeRot.y < 50) IF NOT IS_PED_IN_VEHICLE(runnerChaseProperties.ped, hoodVehicle[HV_BAD_GUY_BIKE]) // APPLY_FORCE_TO_ENTITY(hoodVehicle[HV_BAD_GUY_BIKE], APPLY_TYPE_TORQUE, <<0,100,0>>, <<0,0,0>>, 0, TRUE, TRUE, TRUE) //APPLY_FORCE_TO_ENTITY(hoodVehicle[HV_BAD_GUY_BIKE], APPLY_TYPE_FORCE, <<0,0,20>>, <<0,0,0>>, 0, TRUE, TRUE, TRUE) ENDIF ENDIF ENDIF ENDIF ENDIF IF NOT bKilledSpeechForCrashReaction IF crashTriggerState <= CRASH_TRIGGER_SLOW_DOWN IF IS_ENTITY_ON_SCREEN(runnerChaseProperties.ped) AND IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), runnerChaseProperties.ped, <<60,60,4>>) KILL_ANY_CONVERSATION() bKilledSpeechForCrashReaction = TRUE ENDIF ENDIF ELSE IF NOT bDoneCrashReactionSpeech bDoneCrashReactionSpeech = DO_MISSION_SPEECH("FKN0_CRSHED") IF bDoneCrashReactionSpeech REPLAY_RECORD_BACK_FOR_TIME(4.0, 6.0, REPLAY_IMPORTANCE_HIGHEST) ENDIF ELSE IF IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), hoodVehicle[HV_FRANKLIN_VAN]) DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_EXIT) ENDIF ENDIF ENDIF IF crashTriggerState > CRASH_TRIGGER_SLOW_DOWN ELSE IF NOT bForcedRunnerDismount IF IS_PED_SITTING_IN_ANY_VEHICLE(runnerChaseProperties.ped) AND NOT CAN_KNOCK_PED_OFF_VEHICLE(runnerChaseProperties.ped) TASK_LEAVE_ANY_VEHICLE(runnerChaseProperties.ped, 0, ECF_DONT_WAIT_FOR_VEHICLE_TO_STOP | ECF_JUMP_OUT) ENDIF bForcedRunnerDismount = TRUE ELSE IF NOT bResetScriptRagdoll IF CAN_PED_RAGDOLL(runnerChaseProperties.ped) bResetScriptRagdoll = SET_PED_TO_RAGDOLL(runnerChaseProperties.ped, 5000, 5000, TASK_RELAX, TRUE, TRUE, FALSE) ENDIF ENDIF ENDIF IF IS_PED_RUNNING_RAGDOLL_TASK(runnerChaseProperties.ped) RESET_PED_RAGDOLL_TIMER(runnerChaseProperties.ped) ENDIF ENDIF ENDIF IF NOT bSetBikeAsSmoking IF GET_GAME_TIMER() >= iKnockOffBikeTime + 3000 SET_BIKE_AS_SMOKING() ENDIF ENDIF ELSE //IF GET_GAME_TIMER() >= iBusSmashTime + 200 KNOCK_RUNNER_OFF_BIKE() //ENDIF ENDIF HANDLE_CRASH_TRIGGER() ENDIF IF crashTriggerState = CRASH_TRIGGER_WAITING // should get Lamar into van? IF NOT bLamarShouldBeInGroup IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), hoodVehicle[HV_FRANKLIN_VAN]) AND NOT IS_PED_IN_VEHICLE(lamarPed, hoodVehicle[HV_FRANKLIN_VAN]) bLamarShouldBeInGroup = TRUE ENDIF ENDIF HANDLE_IN_CAR_PROMPTS(TRUE, bLamarShouldBeInGroup AND NOT bResetDirectEntryFlag, FALSE) HANDLE_LAMAR_REACTION_TO_DAMAGE() ENDIF ENDIF IF NOT bKnockedOffBike IF NOT IS_VEHICLE_DRIVEABLE(hoodVehicle[HV_BAD_GUY_BIKE]) IF NOT IS_PED_INJURED(runnerChaseProperties.ped) SET_PED_CAN_BE_KNOCKED_OFF_VEHICLE(runnerChaseProperties.ped, KNOCKOFFVEHICLE_DEFAULT) APPLY_DAMAGE_TO_PED(runnerChaseProperties.ped, 1000, TRUE) ENDIF ENDIF ENDIF IF IS_PED_INJURED(runnerChaseProperties.ped) IF DOES_BLIP_EXIST(badGuyCarBlip) REMOVE_BLIP(badGuyCarBlip) ENDIF ENDIF REQUEST_COMMON_MODELS_TO_VAN_AND_FOOT_CHASE() ELSE DO_CRASH_CUTSCENE() IF bAllowRunnerMovement IF NOT IS_PED_RAGDOLL(runnerChaseProperties.ped) HANDLE_RUNNER_CHASE() HANDLE_CHASE_SETPIECES() BLOCK_FOOT_CHASE_RAGDOLL() ENDIF ENDIF ENDIF ENDPROC // through fence cutscene PROC DO_THROUGH_FENCE_CUTSCENE() SWITCH cutsceneStage CASE H_CUT_STAGE_INIT SET_MISSION_CUTSCENE(TRUE, TRUE, -1, TRUE, FALSE,DEFAULT,DEFAULT,FALSE) CREATE_CAM_FOR_HOOD_SHOT(H_SHOT_THROUGH_FENCE, TRUE, 1800)//1100)//1500) // 1500 //iSyncscene = CREATE_SYNCHRONIZED_SCENE(<<493.480, -525.110, 24.750>>, <<0,0,-7.1>>) //TASK_SYNCHRONIZED_SCENE(PLAYER_PED_ID(), iSyncScene, "MISSFRA0_CHOP", "franklin_wallcrash", INSTANT_BLEND_IN, NORMAL_BLEND_OUT, SYNCED_SCENE_TAG_SYNC_OUT | SYNCED_SCENE_USE_PHYSICS | SYNCED_SCENE_EXPAND_PED_CAPSULE_FROM_SKELETON) //SET_SYNCHRONIZED_SCENE_PHASE(iSyncScene, 0.52) //SET_SYNCHRONIZED_SCENE_HOLD_LAST_FRAME(iSyncScene, FALSE) CLEAR_AREA_OF_PROJECTILES(<<494.35767, -516.89404, 23.81950>>, 8) STOP_FIRE_IN_RANGE(<<494.35767, -516.89404, 23.81950>>, 8) REMOVE_PARTICLE_FX_IN_RANGE(<<494.35767, -516.89404, 23.81950>>, 8) SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_UNARMED, TRUE) SET_PED_STEALTH_MOVEMENT(PLAYER_PED_ID(), FALSE) CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID()) SET_ENTITY_COORDS(PLAYER_PED_ID(), <<493.480, -525.110, 23.75148>>) SET_ENTITY_HEADING(PLAYER_PED_ID(), -7.1) TASK_PLAY_ANIM(PLAYER_PED_ID(), GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_FOOT_CHASE), "franklin_wallcrash", INSTANT_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_USE_MOVER_EXTRACTION | AF_USE_KINEMATIC_PHYSICS | AF_TAG_SYNC_OUT, 0.52) START_HOOD_AUDIO_SCENE(HOOD_AUDIO_SCENE_BREAK_THROUGH_FENCE) FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID()) IF NOT IS_PED_INJURED(chopPed) SET_ENTITY_COORDS(chopPed, <<492.90, -521.53, 23.75>>) CLEAR_PED_TASKS_IMMEDIATELY(chopPed) ENDIF SHAKE_CAM(staticCam, "HAND_SHAKE", 1.0) REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST) bDoneFlash = FALSE iHoodCutsceneTime = GET_GAME_TIMER() cutsceneStage = H_CUT_STAGE_RUNNING BREAK CASE H_CUT_STAGE_RUNNING SET_PED_RESET_FLAG(PLAYER_PED_ID(), PRF_ForceRunningSpeedForFragSmashing, TRUE) //SET_PED_RESET_FLAG(PLAYER_PED_ID(), PRF_ExpandPedCapsuleFromSkeleton, TRUE) SET_PED_MIN_MOVE_BLEND_RATIO(PLAYER_PED_ID(), PEDMOVE_RUN) //SET_GAMEPLAY_CAM_RELATIVE_HEADING(0) //SET_GAMEPLAY_CAM_RELATIVE_PITCH(0) IF NOT bInterpedToGameCam IF GET_GAME_TIMER() >= iHoodCutsceneTime //+ 200 //RENDER_SCRIPT_CAMS(FALSE, TRUE, 2500) bInterpedToGameCam = TRUE ENDIF ENDIF IF GET_GAME_TIMER() >= iHoodCutsceneTime + 400 IF bPreparedSmashFenceCue IF NOT bDoneBypassFenceCue IF NOT bDoneSmashFenceCue bDoneSmashFenceCue = TRIGGER_MISSION_MUSIC_EVENT("FRA0_FENCE") ENDIF ENDIF ENDIF IF NOT bDoneBreakFenceAudioScene SHAKE_CAM(staticCam, "SMALL_EXPLOSION_SHAKE", 0.3) SET_CONTROL_SHAKE(PLAYER_CONTROL, 500, 128) //SHAKE_GAMEPLAY_CAM("SMALL_EXPLOSION_SHAKE", CAM_SHAKE_AMPLITUDE) PLAY_SOUND_FROM_COORD(-1, "Crash_Through_Fence", <<494.4, -516.9, 24.9>>, "FRANKLIN_0_SOUNDS") bDoneBreakFenceAudioScene = TRUE ENDIF ENDIF IF GET_GAME_TIMER() >= iHoodCutsceneTime + 1000 IF NOT IS_PED_INJURED(chopPed) SET_ENTITY_COORDS(chopPed, <<494.01862, -518.84265, 23.75159>>) SET_ENTITY_HEADING(chopPed, -15.75) CLEAR_PED_TASKS_IMMEDIATELY(chopPed) FORCE_PED_MOTION_STATE(chopPed, MS_ON_FOOT_RUN, TRUE, FAUS_CUTSCENE_EXIT) SET_PED_MIN_MOVE_BLEND_RATIO(chopPed, PEDMOVE_RUN) chopStage = CHOP_TO_FENCE chopWaitState = CHOP_WAIT_STATE_WAITING ENDIF cutsceneStage = H_CUT_STAGE_CLEANUP ENDIF BREAK CASE H_CUT_STAGE_CLEANUP IF NOT IS_PED_INJURED(PLAYER_PED_ID()) IF GET_FOLLOW_PED_CAM_VIEW_MODE() <> CAM_VIEW_MODE_FIRST_PERSON SET_PED_MIN_MOVE_BLEND_RATIO(PLAYER_PED_ID(), PEDMOVE_RUN) ELSE SIMULATE_PLAYER_INPUT_GAIT(PLAYER_ID(), PEDMOVE_RUN, 2000) ENDIF //CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID()) //SET_ENTITY_COORDS(PLAYER_PED_ID(), <<494.64, -514.27, 23.75>>) //SET_ENTITY_HEADING(PLAYER_PED_ID(), -55.44) ENDIF IF NOT IS_PED_INJURED(chopPed) SET_PED_MIN_MOVE_BLEND_RATIO(chopPed, PEDMOVE_RUN) ENDIF REPLAY_STOP_EVENT() //SET_GAMEPLAY_CAM_RELATIVE_HEADING(0) //SET_GAMEPLAY_CAM_RELATIVE_PITCH(0) // back to gameplay SET_MISSION_CUTSCENE(FALSE, TRUE, -1, FALSE, FALSE, TRUE, FALSE, FALSE) STOP_RENDERING_SCRIPT_CAMS_USING_CATCH_UP(FALSE, 0, CAM_SPLINE_SLOW_OUT_SMOOTH) bDoRunAfterFence = TRUE iThroughFenceTime = GET_GAME_TIMER() bSmashedFence = TRUE bDoneThroughFenceCut = TRUE BREAK ENDSWITCH ENDPROC // on train cutscene PROC DO_ON_TRAIN_CUTSCENE() SET_ALL_RANDOM_PEDS_FLEE_THIS_FRAME(PLAYER_ID()) SWITCH cutsceneStage CASE H_CUT_STAGE_INIT OVERRIDE_LODSCALE_THIS_FRAME(1.0) //SET_CHOP_VIEW_CAM_STATE(CHOP_VIEW_CAM_DISABLED) SET_MISSION_CUTSCENE(TRUE, TRUE, -1, TRUE, FALSE) //CREATE_CAM_FOR_HOOD_SHOT(H_SHOT_ONTO_TRAIN, TRUE, 4000) START_HOOD_AUDIO_SCENE(HOOD_AUDIO_SCENE_D_ESCAPES) SET_PED_STEALTH_MOVEMENT(PLAYER_PED_ID(), FALSE) SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_UNARMED, TRUE) iSyncScene = CREATE_SYNCHRONIZED_SCENE(<<559.729, -569.216, 23.967>>,<<0,0,-6.50>>) CREATE_MISSION_ANIM_CAM() PLAY_SYNCHRONIZED_CAM_ANIM(animCam, iSyncScene, "BallasOG_JumpOnTrain_IG7_CAMERA", GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_FOOT_CHASE)) CLEAR_AREA(<<551.07, -573.04, 23.80>>, 18.0, TRUE) CLEAR_AREA_OF_PROJECTILES(<<551.07, -573.04, 23.80>>, 18) STOP_FIRE_IN_RANGE(<<551.07, -573.04, 23.80>>, 18) REMOVE_PARTICLE_FX_IN_RANGE(<<551.07, -573.04, 23.80>>, 18) IF NOT IS_PED_INJURED(PLAYER_PED_ID()) CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID()) SET_ENTITY_COORDS(PLAYER_PED_ID(), <<562.88, -545.27, 23.79>>) ENDIF IF NOT IS_PED_INJURED(chopPed) SET_ENTITY_COORDS(chopPed, <<561.94, -543.40, 23.77>>) CLEAR_PED_TASKS_IMMEDIATELY(chopPed) ENDIF IF DOES_ENTITY_EXIST(trainVehicle[2]) DELETE_MISSION_TRAIN(trainVehicle[2]) ENDIF CREATE_YARD_TRAIN_FOR_STAGE(2, STAGE_FOOT_CHASE, TRUE) bStartedTrain[2] = TRUE iTrainStartedTime[2] = GET_GAME_TIMER() // setup train IF IS_VEHICLE_DRIVEABLE(trainVehicle[1]) AND NOT IS_PED_INJURED(runnerChaseProperties.ped) CONST_FLOAT TRAIN_SPEED 2.67 CLEAR_PED_TASKS_IMMEDIATELY(runnerChaseProperties.ped) //ATTACH_ENTITY_TO_ENTITY(runnerChaseProperties.ped, GET_TRAIN_CARRIAGE(trainVehicle[1], 2), 0, <<0,0,0>>, <<0,0,0>>) //TASK_PLAY_ANIM(runnerChaseProperties.ped, GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_MISSION), "BallasOG_JumpOnTrain_IG7", INSTANT_BLEND_IN, INSTANT_BLEND_OUT, -1, AF_HOLD_LAST_FRAME) runnerChaseProperties.iSyncScene = CREATE_SYNCHRONIZED_SCENE(<<0,0.8,0>>,<<0,0,180>>) ATTACH_SYNCHRONIZED_SCENE_TO_ENTITY(runnerChaseProperties.iSyncScene, GET_TRAIN_CARRIAGE(trainVehicle[1], 2), 0) TASK_SYNCHRONIZED_SCENE(runnerChaseProperties.ped, runnerChaseProperties.iSyncScene, GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_FOOT_CHASE), "BallasOG_JumpOnTrain_IG7", INSTANT_BLEND_IN, INSTANT_BLEND_OUT) FORCE_PED_AI_AND_ANIMATION_UPDATE(runnerChaseProperties.ped) ENDIF // get rid of yard peds INT i REPEAT NUMBER_YARD_PEDS i IF DOES_ENTITY_EXIST(yardPed[i].ped) DELETE_PED(yardPed[i].ped) ENDIF ENDREPEAT bDoneFlash = FALSE REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST) iHoodCutsceneTime = GET_GAME_TIMER() cutsceneStage = H_CUT_STAGE_RUNNING BREAK CASE H_CUT_STAGE_RUNNING OVERRIDE_LODSCALE_THIS_FRAME(1.0) SWITCH ontoTrainShot CASE ONTO_TRAIN_JUMP IF NOT bRepositionedFranklinForTrain IF NOT IS_PED_INJURED(PLAYER_PED_ID()) IF GET_GAME_TIMER() >= iHoodCutsceneTime + 3800 CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID()) SET_ENTITY_COORDS(PLAYER_PED_ID(), <<561.64, -559.80, 23.79>>) SET_ENTITY_HEADING(PLAYER_PED_ID(), 137.43) TASK_GO_STRAIGHT_TO_COORD(PLAYER_PED_ID(), GET_HOOD_VECTOR(HVEC_LOSE_RUNNER), PEDMOVE_RUN) bRepositionedFranklinForTrain = TRUE ENDIF ENDIF ENDIF IF GET_GAME_TIMER() >= iHoodCutsceneTime + 4000 //CREATE_CAM_FOR_HOOD_SHOT(H_SHOT_LOST, TRUE, 4000) iHoodCutsceneTime = GET_GAME_TIMER() ontoTrainShot = ONTO_TRAIN_LOSE ENDIF BREAK CASE ONTO_TRAIN_LOSE IF NOT bDoneLoseReactSpeech bDoneLoseReactSpeech = DO_MISSION_SPEECH("FKN0_LOST", TRUE, 1) ENDIF IF NOT bRepositionedBallaHiding IF GET_GAME_TIMER() >= iHoodCutsceneTime + 1000 IF NOT IS_PED_INJURED(runnerChaseProperties.ped) //STOP_SYNCHRONIZED_ENTITY_ANIM(runnerChaseProperties.ped, 1, FA) CLEAR_PED_TASKS_IMMEDIATELY(runnerChaseProperties.ped) DETACH_ENTITY(runnerChaseProperties.ped) SET_ENTITY_COORDS(runnerChaseProperties.ped, GET_HOOD_VECTOR(HVEC_RUNNER_HIDE)) SET_ENTITY_HEADING(runnerChaseProperties.ped, RUNNER_HIDE_ROT) FREEZE_ENTITY_POSITION(runnerChaseProperties.ped, TRUE) //TASK_COWER(runnerChaseProperties.ped) ENDIF bRepositionedBallaHiding = TRUE ENDIF ENDIF IF NOT bDoneFlash IF GET_FOLLOW_PED_CAM_VIEW_MODE() = CAM_VIEW_MODE_FIRST_PERSON IF GET_GAME_TIMER() >= iHoodCutsceneTime + 1700 ANIMPOSTFX_PLAY("CamPushInNeutral", 0, FALSE) PLAY_SOUND_FRONTEND(-1, "1st_Person_Transition", "PLAYER_SWITCH_CUSTOM_SOUNDSET") bDoneFlash = TRUE ENDIF ENDIF ENDIF IF GET_GAME_TIMER() >= iHoodCutsceneTime + 2000 cutsceneStage = H_CUT_STAGE_CLEANUP ENDIF BREAK ENDSWITCH BREAK CASE H_CUT_STAGE_CLEANUP /* IF NOT IS_PED_INJURED(runnerChaseProperties.ped) DETACH_ENTITY(runnerChaseProperties.ped) SET_ENTITY_COORDS(runnerChaseProperties.ped, GET_HOOD_VECTOR(HVEC_RUNNER_HIDE)) SET_ENTITY_HEADING(runnerChaseProperties.ped, RUNNER_HIDE_ROT) FREEZE_ENTITY_POSITION(runnerChaseProperties.ped, TRUE) TASK_COWER(runnerChaseProperties.ped) ENDIF */ REPLAY_STOP_EVENT() IF NOT IS_PED_INJURED(chopPed) DETACH_ENTITY(chopPed) IF NOT IS_ENTITY_AT_ENTITY(chopPed, PLAYER_PED_ID(), <<3,3,3>>) SET_ENTITY_COORDS(chopPed, GET_HOOD_VECTOR(HVEC_CHOP_FIND_INIT)) SET_ENTITY_HEADING(chopPed, CHOP_FIND_INIT_ROT) ENDIF ENDIF //IF DOES_ENTITY_EXIST(tempHelperPed) // DELETE_PED(tempHelperPed) //ENDIF STOP_HOOD_AUDIO_SCENE(HOOD_AUDIO_SCENE_D_ESCAPES) // back to gameplay SET_MISSION_CUTSCENE(FALSE) SET_MISSION_STAGE(STAGE_FIND_BAD_GUY, FALSE, TRUE, FALSE) BREAK ENDSWITCH ENDPROC // foot chase round train yards PROC DO_STAGE_FOOT_CHASE() IF NOT bDoneThroughFenceCut DISABLE_PLAYER_PED_STAT_UPDATES_THIS_FRAME() ENDIF VECTOR vPlayerPos = GET_ENTITY_COORDS(PLAYER_PED_ID()) IF NOT bDoneLamarEncourageSpeech bDoneLamarEncourageSpeech = DO_MISSION_SPEECH("FKN0_GOGET3") ELSE IF NOT bShownGodText bShownGodText = DO_MISSION_GOD_TEXT("FC_CHASE") ENDIF ENDIF IF NOT bPreparedSmashFenceCue bPreparedSmashFenceCue = PREPARE_MUSIC_EVENT("FRA0_FENCE") ENDIF HANDLE_GRAB_SCENARIO_PEDS() SWITCH createCarsStage CASE CREATE_CARS_STAGE_NOT_STARTED ADD_MODEL_REQUEST(ENUM_TO_INT(HM_TRAFFIC_CAR1)) ADD_MODEL_REQUEST(ENUM_TO_INT(HM_TRAFFIC_CAR2)) createCarsStage = CREATE_CARS_STAGE_WAITING BREAK CASE CREATE_CARS_STAGE_WAITING IF HAS_MODEL_LOADED(GET_MODEL_FOR_HOOD_MODEL_ENUM(HM_TRAFFIC_CAR1)) AND HAS_MODEL_LOADED(GET_MODEL_FOR_HOOD_MODEL_ENUM(HM_TRAFFIC_CAR2)) CREATE_CHASE_SETPIECES(FALSE, FALSE, TRUE, FALSE, FALSE) createCarsStage = CREATE_CARS_STAGE_DONE ENDIF BREAK ENDSWITCH IF NOT bRemovedBuses IF vPlayerPos.y >= -550.1 AND vPlayerPos.x >= 481.8 AND vPlayerPos.z <= 25.3 INT i REPEAT NUMBER_YARD_VEHICLES i YARD_VEHICLE_ENUM thisYardVehicle = INT_TO_ENUM(YARD_VEHICLE_ENUM, i) IF thisYardVehicle = YV_BUS_ROAD_FROM_LEFT OR thisYardVehicle = YV_BUS_REVERSE OR thisYardVehicle = YV_BUS_PULL_OUT OR thisYardVehicle = YV_BUS_STATIC OR thisYardVehicle = YV_CAR_STATION_PULL_INTO_DEPOT IF DOES_ENTITY_EXIST(yardVehicle[i]) IF NOT IS_ENTITY_DEAD(yardVehicle[i]) PED_INDEX thisDriverPed = GET_PED_IN_VEHICLE_SEAT(yardVehicle[i]) IF DOES_ENTITY_EXIST(thisDriverPed) SET_PED_AS_NO_LONGER_NEEDED(thisDriverPed) ENDIF ENDIF SET_VEHICLE_AS_NO_LONGER_NEEDED(yardVehicle[i]) ENDIF ENDIF ENDREPEAT REPEAT NUMBER_YARD_PEDS i YARD_PED_ENUM thisYardPed = INT_TO_ENUM(YARD_PED_ENUM, i) IF thisYardPed = YP_STATION_WALK_TO_GATE OR thisYardPed = YP_STATION_CONV_KNOCK_OVER OR thisYardPed = YP_STATION_CONV_LOOK OR thisYardPed = YP_STATION_BACK_TURNED_KNOCK_OVER IF DOES_ENTITY_EXIST(yardPed[i].ped) SET_PED_AS_NO_LONGER_NEEDED(yardPed[i].ped) ENDIF ENDIF ENDREPEAT CLEAR_MODEL_REQUEST(ENUM_TO_INT(HM_BUS)) bRemovedBuses = TRUE ENDIF ENDIF IF NOT bRemovedCarpark IF bDoneThroughFenceCut IF vPlayerPos.y >= -517.4 AND vPlayerPos.x >= 519.3 CLEAR_MODEL_REQUEST(ENUM_TO_INT(HM_TRAFFIC_CAR1)) CLEAR_MODEL_REQUEST(ENUM_TO_INT(HM_TRAFFIC_CAR2)) INT i REPEAT NUMBER_YARD_VEHICLES i YARD_VEHICLE_ENUM thisYardVehicle = INT_TO_ENUM(YARD_VEHICLE_ENUM, i) IF thisYardVehicle = YV_CAR_CARPARK_PULL_OUT_FOR_JUMP_OVER OR thisYardVehicle = YV_CAR_CARPARK_STATIC IF DOES_ENTITY_EXIST(yardVehicle[i]) IF NOT IS_ENTITY_DEAD(yardVehicle[i]) PED_INDEX thisDriverPed = GET_PED_IN_VEHICLE_SEAT(yardVehicle[i]) IF DOES_ENTITY_EXIST(thisDriverPed) SET_PED_AS_NO_LONGER_NEEDED(thisDriverPed) ENDIF ENDIF SET_VEHICLE_AS_NO_LONGER_NEEDED(yardVehicle[i]) ENDIF ENDIF ENDREPEAT bRemovedCarpark = TRUE ENDIF ENDIF ENDIF HANDLE_RUNNER_CHASE() IF NOT bRunningCutscene HANDLE_CHOP_CHASE() ENDIF HANDLE_CHASE_SETPIECES() BLOCK_FOOT_CHASE_RAGDOLL() HANDLE_REACT_TO_RUN_STAT() DO_NO_STAMINA_HELP_TEXT() //ENABLE_CARGENS_FOR_MISSION(FALSE) //SET_PARKED_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0) // temp? OR NOT???? IF chopWaitState <> CHOP_WAIT_STATE_WAITING DO_CHOP_AUDIO(CHOP_AUDIO_STATE_CHASING) ELSE IF chopStage = CHOP_TO_FENCE DO_CHOP_AUDIO(CHOP_AUDIO_STATE_FOUND_SOMETHING) ELSE DO_CHOP_AUDIO(CHOP_AUDIO_STATE_WAITING) ENDIF ENDIF // remove bike IF NOT bRemovedBike IF DOES_ENTITY_EXIST(hoodVehicle[HV_BAD_GUY_BIKE]) BOOL bDoRemove = FALSE IF NOT IS_ENTITY_DEAD(hoodVehicle[HV_BAD_GUY_BIKE]) IF NOT IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), hoodVehicle[HV_BAD_GUY_BIKE], <<70,70,70>>, FALSE, FALSE) bDoRemove = TRUE ENDIF ELSE bDoRemove = TRUE ENDIF IF bDoRemove SET_VEHICLE_AS_NO_LONGER_NEEDED(hoodVehicle[HV_BAD_GUY_BIKE]) CLEAR_MODEL_REQUEST(ENUM_TO_INT(HM_BIKE)) bRemovedBike = TRUE ENDIF ENDIF ENDIF // create the setpieces SWITCH createTrainsStage CASE CREATE_TRAINS_STAGE_NOT_STARTED ADD_MODEL_REQUEST(ENUM_TO_INT(HM_ENGINE)) ADD_MODEL_REQUEST(ENUM_TO_INT(HM_TANKER_CARRIAGE)) ADD_MODEL_REQUEST(ENUM_TO_INT(HM_CONTAINER_CARRIAGE)) createTrainsStage = CREATE_TRAINS_STAGE_WAITING BREAK CASE CREATE_TRAINS_STAGE_WAITING IF HAS_MODEL_LOADED(GET_MODEL_FOR_HOOD_MODEL_ENUM(HM_ENGINE)) AND HAS_MODEL_LOADED(GET_MODEL_FOR_HOOD_MODEL_ENUM(HM_TANKER_CARRIAGE)) AND HAS_MODEL_LOADED(GET_MODEL_FOR_HOOD_MODEL_ENUM(HM_CONTAINER_CARRIAGE)) CREATE_YARD_TRAINS() createTrainsStage = CREATE_TRAINS_STAGE_DONE ENDIF BREAK ENDSWITCH IF NOT bRunningCutscene /* IF GET_GAME_TIMER() >= iActivateChopCamTime + 8000 HANDLE_CHOP_VIEW_CAM() IF chopViewCamData.state = CHOP_VIEW_CAM_ON_CHOP DRAW_SCENT(FALSE) ELSE REMOVE_CHOP_SCENT(TRUE) ENDIF DO_CHOP_CAM_HELP() ENDIF */ // handle chop cam warps // HANDLE_CHOP_CAM_WARPS() BOOL bAllowDogSpeech = FALSE BOOL bAllowBallaSpeech = FALSE BOOL bDoDogSpeech = FALSE BOOL bDoBallaSpeech = FALSE IF NOT IS_PED_INJURED(chopPed) AND NOT IS_PED_INJURED(runnerChaseProperties.ped) IF (chopViewCamData.state = CHOP_VIEW_CAM_DISABLED OR IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), chopPed, <<22,22,22>>, FALSE, FALSE)) IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), chopPed, <<30,30,30>>, FALSE, FALSE) AND GET_ENTITY_SPEED(PLAYER_PED_ID()) >= 3.5 AND (GET_ENTITY_SPEED(chopPed) >= 3.5 OR chopChaseProperties.chaseState = CHASE_STATE_PERFORMING_ANIM) AND chopWaitState = CHOP_WAIT_STATE_NOT_STARTED bAllowDogSpeech = TRUE ENDIF IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), runnerChaseProperties.ped, <<40,40,40>>, FALSE, FALSE) AND GET_ENTITY_SPEED(PLAYER_PED_ID()) >= 3.5 AND (GET_ENTITY_SPEED(runnerChaseProperties.ped) >= 3.5 OR runnerChaseProperties.chaseState = CHASE_STATE_PERFORMING_ANIM) bAllowBallaSpeech = TRUE ENDIF ENDIF ENDIF IF NOT IS_PED_INJURED(driverPed[YV_CAR_CARPARK_PULL_OUT_FOR_JUMP_OVER]) IF IS_AMBIENT_SPEECH_PLAYING(driverPed[YV_CAR_CARPARK_PULL_OUT_FOR_JUMP_OVER]) bAllowDogSpeech = FALSE bAllowBallaSpeech = FALSE ENDIF ENDIF IF NOT bDoneJumpHelp //IF NOT HAS_ONE_TIME_HELP_DISPLAYED(FHM_CLIMB_HELP) IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<480.145, -590.657, 30.419>>, <<467.195, -589.278, 27.000>>, 30.00) bDoneJumpHelp = DO_MISSION_HELP_TEXT("FC_JUMHLP", FALSE) //IF bDoneJumpHelp // SET_ONE_TIME_HELP_MESSAGE_DISPLAYED(FHM_CLIMB_HELP) //ENDIF ENDIF //ELSE // bDoneJumpHelp = TRUE //ENDIF ELSE IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("FC_JUMHLP") IF IS_PED_CLIMBING(PLAYER_PED_ID()) IF GET_GAME_TIMER() >= iClearHelpTime + 500 CLEAR_HELP(FALSE) iClearHelpTime = GET_GAME_TIMER() ENDIF ENDIF ENDIF ENDIF // hood slide help IF NOT bShownHoodSlideHelp IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<494.46729, -538.49683, 23.75095>>, <<493.09793, -552.72064, 26.25095>>, 7.9) AND (runnerChaseProperties.chaseAnim >= CHASE_ANIM_G_OVER_CAR OR runnerStage >= RUNNER_TO_FENCE) bShownHoodSlideHelp = DO_MISSION_HELP_TEXT("FC_SLDHLP", FALSE) ENDIF ENDIF IF vPlayerPos.y >= -538.0740 OR IS_ENTITY_PLAYING_ANIM(PLAYER_PED_ID(), "move_climb", "bonnet_slide_r_in") OR IS_ENTITY_PLAYING_ANIM(PLAYER_PED_ID(), "move_climb", "bonnet_slide_l_in") bShownHoodSlideHelp = TRUE IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("FC_SLDHLP") IF GET_GAME_TIMER() >= iClearHelpTime + 500 REPLAY_RECORD_BACK_FOR_TIME(3.0, 4.0, REPLAY_IMPORTANCE_HIGH) CLEAR_HELP(FALSE) iClearHelpTime = GET_GAME_TIMER() ENDIF ENDIF ENDIF IF bAllowDogSpeech IF bAllowBallaSpeech SWITCH GET_RANDOM_INT_IN_RANGE(0,3) CASE 1 CASE 2 bDoBallaSpeech = TRUE BREAK CASE 0 bDoDogSpeech = TRUE BREAK ENDSWITCH ELSE bDoDogSpeech = TRUE ENDIF ELSE IF bAllowBallaSpeech bDoBallaSpeech = TRUE ELSE IF GET_GAME_TIMER() >= iNextRandomSpeechTime SET_NEXT_RANDOM_SPEECH_TIME(500, 2000) ENDIF ENDIF ENDIF IF NOT bFranklinShoutBeforeTrain IF runnerStage <> RUNNER_TO_TRAIN IF bDoBallaSpeech IF GET_RANDOM_INT_IN_RANGE(0,2) = 0 DO_RANDOM_SPEECH("FKN0_FCHASE", -1, 7000, 10000) ELSE DO_RANDOM_SPEECH("FKN0_OG2", -1, 7000, 10000) ENDIF ELIF bDoDogSpeech DO_RANDOM_SPEECH("FKN0_DOGCHS", -1, 7000, 10000) ENDIF ELSE IF NOT IS_PED_INJURED(chopPed) IF IS_ENTITY_IN_ANGLED_AREA(chopPed, <<560.952,-532.453,28.700>>, <<574.626,-533.877,13.742>>, 50) AND IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<560.952,-532.453,28.700>>, <<574.626,-533.877,13.742>>, 50) IF IS_ENTITY_ON_SCREEN(chopPed) bFranklinShoutBeforeTrain = DO_MISSION_SPEECH("FKN0_GETHIM") ENDIF ENDIF ENDIF ENDIF ENDIF IF NOT bClearedPlayerRun IF GET_GAME_TIMER() >= iStageStartTime + 1000 bClearedPlayerRun = TRUE ELSE IF GET_FOLLOW_PED_CAM_VIEW_MODE() <> CAM_VIEW_MODE_FIRST_PERSON SET_PED_MIN_MOVE_BLEND_RATIO(PLAYER_PED_ID(), PEDMOVE_SPRINT) ENDIF ENDIF ENDIF IF bDoneThroughFenceCut IF bDoRunAfterFence IF GET_GAME_TIMER() <= iThroughFenceTime + 400//140 IF GET_FOLLOW_PED_CAM_VIEW_MODE() <> CAM_VIEW_MODE_FIRST_PERSON SET_PED_MIN_MOVE_BLEND_RATIO(PLAYER_PED_ID(), PEDMOVE_RUN) ENDIF ENDIF ENDIF ENDIF // remove traffic IF NOT bRemovedTraffic IF NOT IS_ENTITY_AT_COORD(PLAYER_PED_ID(), GET_HOOD_VECTOR(HVEC_VAN_IN_ALLEY), <<80,80,80>>, FALSE, FALSE) REMOVE_TRAFFIC_OUTSIDE_STATION() ENDIF ENDIF // remove bus station IF NOT bRemovedBusStation IF vPlayerPos.x > 485.92 AND vPlayerPos.y > -519 AND vPlayerPos.z < 29.32 REMOVE_BUS_STATION() ENDIF ENDIF // slow down franklin IF NOT IS_PED_INJURED(runnerChaseProperties.ped) IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), runnerChaseProperties.ped, <<18,18,18>>, FALSE, FALSE) SET_PED_MOVE_RATE_OVERRIDE(PLAYER_PED_ID(), 0.94) ELSE SET_PED_MOVE_RATE_OVERRIDE(PLAYER_PED_ID(), 0.97) ENDIF ELSE SET_PED_MOVE_RATE_OVERRIDE(PLAYER_PED_ID(), 0.97) ENDIF /* IF NOT bForcedJumpOffRoof IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<490.150, -564.190, 30.500>>, <<489.840, -566.660, 28.010>>, 11.600, FALSE, TRUE, TM_ON_FOOT) IF IS_PED_AT_CORRECT_HEADING_FOR_CHASE_ANIM(PLAYER_PED_ID(), CHASE_ANIM_F_OFF_ROOF, 20) AND GET_ENTITY_SPEED(PLAYER_PED_ID()) >= 3.2 AND chopViewCamData.state = CHOP_VIEW_CAM_DISABLED TASK_JUMP(PLAYER_PED_ID(), TRUE) bForcedJumpOffRoof = TRUE ENDIF ENDIF ENDIF */ // cut smashing through fence IF NOT bDoneThroughFenceCut // disable ragdoll jump when really near IF IS_ENTITY_IN_AREA(PLAYER_PED_ID(), <<488.71494, -527.19843, 23.75116>>, <<499.25632, -517.15485, 25.89596>>) IF IS_PED_JUMPING(PLAYER_PED_ID()) DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK_LIGHT) DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK_HEAVY) DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK_ALTERNATE) DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_BLOCK) DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_ATTACK) DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_ATTACK2) ENDIF ENDIF IF chopViewCamData.state = CHOP_VIEW_CAM_DISABLED //PRINTFLOAT(GET_ENTITY_SPEED(PLAYER_PED_ID())) PRINTNL() IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<494.300, -516.890, 23.050>>, <<494.070, -519.450, 25.850>>, 7.800, FALSE, TRUE, TM_ON_FOOT) // 4.8 IF IS_PED_AT_CORRECT_HEADING_FOR_CHASE_ANIM(PLAYER_PED_ID(), CHASE_ANIM_F_THROUGH_YARD_FENCE, 50) //IF GET_ENTITY_SPEED(PLAYER_PED_ID()) >= 3.0 IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) AND NOT IS_PED_RAGDOLL(PLAYER_PED_ID()) IF CAN_PLAYER_START_CUTSCENE() iCurrentFootChaseCutscene = 1 IF CAN_ADVANCE_MISSION() bRunningCutscene = TRUE ENDIF ENDIF ENDIF ENDIF ELIF vPlayerPos.y >= -516.9 OR runnerStage >= RUNNER_TO_TRAIN OR IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<521.171, -552.487, 23.781>>, <<526.091, -519.091, 29.735>>, 40.0) bBypassedFence = TRUE bDoneThroughFenceCut = TRUE ELSE OBJECT_INDEX fenceObject = GET_CLOSEST_OBJECT_OF_TYPE(<<494.3488, -516.8829, 23.8982>>, 2, PROP_FNCCONSTRUC_01D, FALSE) IF DOES_ENTITY_EXIST(fenceObject) IF HAS_OBJECT_BEEN_BROKEN(fenceObject) bBypassedFence = TRUE bDoneThroughFenceCut = TRUE ENDIF ENDIF ENDIF ELSE /* IF NOT bShownChopFenceHelp IF IS_ENTITY_AT_COORD(chopPed, <<493.12, -519.17, 23.75>>, <<2.0, 3.0, LOCATE_SIZE_HEIGHT>>, FALSE, FALSE) IF GET_ENTITY_SPEED(chopPed) <= 1.0 DO_MISSION_HELP_TEXT("FC_FENHLP") bShownChopFenceHelp = TRUE ENDIF ENDIF ENDIF */ ENDIF ELSE IF NOT bDoneBypassFenceCue IF NOT bDoneSmashFenceCue bDoneBypassFenceCue = TRIGGER_MISSION_MUSIC_EVENT("FRA0_BYPASS_FENCE") ENDIF ENDIF IF NOT bDoneBreakFenceAudioScene STOP_HOOD_AUDIO_SCENE(HOOD_AUDIO_SCENE_FOOT_CHASE_START) START_HOOD_AUDIO_SCENE(HOOD_AUDIO_SCENE_BREAK_THROUGH_FENCE) bDoneBreakFenceAudioScene = TRUE ENDIF ENDIF IF bBypassedFence SWITCH chopBypassFenceState CASE CHOP_BYPASS_FENCE_NOT_STARTED IF chopChaseProperties.chaseState = CHASE_STATE_MOVING INT iClosestWaypointToChop WAYPOINT_RECORDING_GET_CLOSEST_WAYPOINT("hood11", GET_ENTITY_COORDS(chopPed), iClosestWaypointToChop) TASK_FOLLOW_WAYPOINT_RECORDING(chopPed, "hood11", iClosestWaypointToChop, EWAYPOINT_NAVMESH_BACK_TO_WAYPOINT_IF_LEFT_ROUTE) chopChaseProperties.bWaiting = FALSE chopWaitState = CHOP_WAIT_STATE_DONE chopChaseProperties.chaseState = CHASE_STATE_MOVING chopChaseProperties.iSyncScene = -1 chopChaseProperties.iMovingTime = GET_GAME_TIMER() chopStage = CHOP_TO_FLATBEDS chopBypassFenceState = CHOP_BYPASS_FENCE_PERFORMING_BYPASS ENDIF BREAK CASE CHOP_BYPASS_FENCE_PERFORMING_BYPASS IF chopChaseProperties.chaseState <> CHASE_STATE_MOVING chopBypassFenceState = CHOP_BYPASS_FENCE_DONE ENDIF BREAK ENDSWITCH ENDIF IF bFailForLost IF GET_GAME_TIMER() >= iFailForLostTime + 3000 MISSION_FAILED(FAIL_LOST_BAD_GUY) ENDIF ENDIF // do jump on train cut IF NOT bDoneOnTrainCut IF NOT IS_PED_INJURED(runnerChaseProperties.ped) IF runnerStage = RUNNER_TO_TRAIN IF IS_ENTITY_AT_COORD(runnerChaseProperties.ped, GET_CHASE_ANIM_COORDS(CHASE_ANIM_G_ONTO_TRAIN), <<1.0, 1.0, 3.0>>) IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<542.683, -531.091, 23.268>>, <<588.103, -536.543, 30.591>>, 80) OR IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), runnerChaseProperties.ped, <<18,18,18>>, FALSE, FALSE) OR (IS_ENTITY_ON_SCREEN(runnerChaseProperties.ped) AND NOT IS_ENTITY_OCCLUDED(runnerChaseProperties.ped)) OR chopViewCamData.state <> CHOP_VIEW_CAM_DISABLED iCurrentFootChaseCutscene = 2 IF CAN_ADVANCE_MISSION() bRunningCutscene = TRUE ENDIF ELSE IF DOES_BLIP_EXIST(runnerBlip) REMOVE_BLIP(runnerBlip) ENDIF IF DOES_ENTITY_EXIST(runnerChaseProperties.ped) DELETE_PED(runnerChaseProperties.ped) ENDIF bFailForLost = TRUE iFailForLostTime = GET_GAME_TIMER() ENDIF ENDIF ENDIF ENDIF ENDIF ELSE SWITCH iCurrentFootChaseCutscene CASE 0 // DO_OFF_ROOF_CUTSCENE() BREAK CASE 1 DO_THROUGH_FENCE_CUTSCENE() BREAK CASE 2 DO_ON_TRAIN_CUTSCENE() BREAK ENDSWITCH ENDIF ENDPROC // pull chop off dog cutscene PROC DO_CHOP_PULL_CUTSCENE() SWITCH cutsceneStage CASE H_CUT_STAGE_INIT SET_MISSION_CUTSCENE(TRUE) //CREATE_CAM_FOR_HOOD_SHOT(H_SHOT_FIND, TRUE, 3000) CLEAR_AREA(<<502.85, -648.35, 23.75>>, 4.0, TRUE) IF NOT IS_PED_INJURED(chopPed) AND NOT IS_PED_INJURED(colliePed) AND NOT IS_PED_INJURED(PLAYER_PED_ID()) chopChaseProperties.iSyncScene = CREATE_SYNCHRONIZED_SCENE(GET_ENTITY_COORDS(colliePed), GET_ENTITY_ROTATION(colliePed)) CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID()) CLEAR_PED_SECONDARY_TASK(PLAYER_PED_ID()) TASK_CLEAR_LOOK_AT(PLAYER_PED_ID()) SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_UNARMED, TRUE) SET_PED_STEALTH_MOVEMENT(PLAYER_PED_ID(), FALSE) TASK_SYNCHRONIZED_SCENE(PLAYER_PED_ID(), chopChaseProperties.iSyncScene, GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_FIND), "Hump_Exit_Scene_FRANKLIN", INSTANT_BLEND_IN, SLOW_BLEND_OUT) TASK_SYNCHRONIZED_SCENE(chopPed, chopChaseProperties.iSyncScene, GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_FIND), "Hump_Exit_Scene_CHOP", INSTANT_BLEND_IN, SLOW_BLEND_OUT) TASK_SYNCHRONIZED_SCENE(colliePed, chopChaseProperties.iSyncScene, GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_FIND), "Hump_Exit_Scene_LADYDOG", INSTANT_BLEND_IN, SLOW_BLEND_OUT) SET_SYNCHRONIZED_SCENE_HOLD_LAST_FRAME(chopChaseProperties.iSyncScene, FALSE) FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID()) FORCE_PED_AI_AND_ANIMATION_UPDATE(chopPed) FORCE_PED_AI_AND_ANIMATION_UPDATE(colliePed) CREATE_MISSION_ANIM_CAM() PLAY_SYNCHRONIZED_CAM_ANIM(animCam, chopChaseProperties.iSyncScene, "Hump_Exit_Scene_CAM", GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_FIND)) ENDIF iHoodCutsceneTime = GET_GAME_TIMER() cutsceneStage = H_CUT_STAGE_RUNNING BREAK CASE H_CUT_STAGE_RUNNING IF NOT bDoneGoAwaySpeech IF NOT bDoneItsADudeSpeech IF DO_MISSION_SPEECH("FKN0_MALE", TRUE) bDoneItsADudeSpeech = TRUE bDoneGoAwaySpeech = TRUE ENDIF ELSE bDoneGoAwaySpeech = DO_MISSION_SPEECH("FC_GOAWAY", TRUE) ENDIF ENDIF IF IS_SYNCHRONIZED_SCENE_RUNNING(chopChaseProperties.iSyncScene) //IF GET_SYNCHRONIZED_SCENE_PHASE(chopChaseProperties.iSyncScene) >= 0.73 // cutsceneStage = H_CUT_STAGE_CLEANUP //ENDIF ELSE cutsceneStage = H_CUT_STAGE_CLEANUP ENDIF BREAK CASE H_CUT_STAGE_CLEANUP // back to gameplay //CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID()) //FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID()) //IF NOT IS_PED_INJURED(chopPed) // CLEAR_PED_TASKS_IMMEDIATELY(chopPed) // FORCE_PED_AI_AND_ANIMATION_UPDATE(chopPed) //ENDIF //IF NOT IS_PED_INJURED(colliePed) //// CLEAR_PED_TASKS_IMMEDIATELY(colliePed) // FORCE_PED_AI_AND_ANIMATION_UPDATE(colliePed) //ENDIF SET_CHOP_BEHAVIOUR_SETPIECE_STAGE(CBS_RETURN) //SET_MISSION_CUTSCENE(FALSE, FALSE) COMMON_MISSION_CUTSCENE_BLENDOUT() bShouldCommentOnBehaviour = TRUE bDoingChopPull = FALSE bRunningCutscene = FALSE BREAK ENDSWITCH ENDPROC /* // cleanup found cutscene PROC CLEANUP_FOUND_CUTSCENE() IF bSkippedCutscene ENDIF CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID()) SET_ENTITY_COORDS(PLAYER_PED_ID(), <<526.76, -679.98, 24.81>>) SET_ENTITY_HEADING(PLAYER_PED_ID(), 82.97) IF NOT IS_PED_INJURED(runnerChaseProperties.ped) CLEAR_PED_TASKS_IMMEDIATELY(runnerChaseProperties.ped) SET_ENTITY_COORDS(runnerChaseProperties.ped, <<523.41, -679.45, 23.79>>) SET_ENTITY_HEADING(runnerChaseProperties.ped, 99.91) TASK_FOLLOW_WAYPOINT_RECORDING(runnerChaseProperties.ped, "hood5", 5, EWAYPOINT_DO_NOT_RESPOND_TO_COLLISION_EVENTS) ENDIF IF NOT IS_PED_INJURED(chopPed) CLEAR_PED_TASKS_IMMEDIATELY(chopPed) SET_ENTITY_COORDS(chopPed, <<525.47, -679.09, 24.81>>) SET_ENTITY_HEADING(chopPed, 93.91) CLEAR_SEQUENCE_TASK(sequence) OPEN_SEQUENCE_TASK(sequence) TASK_PAUSE(NULL, 400) TASK_FOLLOW_WAYPOINT_RECORDING(NULL, "hood5", 6) CLOSE_SEQUENCE_TASK(sequence) TASK_PERFORM_SEQUENCE(chopPed, sequence) ENDIF IF NOT DOES_BLIP_EXIST(chopBlip) chopBlip = CREATE_MISSION_BLIP_FOR_PED(chopPed) ENDIF // back to gameplay mocapStreamingStage = MOCAP_STREAMING_STAGE_REQUEST iRunnerStageStartTime = GET_GAME_TIMER() SET_MISSION_CUTSCENE(FALSE) bShownGodText = FALSE bDoneGotoSpeech = FALSE bFoundBadGuy = TRUE ENDPROC // find bad guy hiding cutscene PROC DO_FOUND_CUTSCENE() SWITCH cutsceneStage CASE H_CUT_STAGE_INIT //SET_MISSION_CUTSCENE(TRUE) iHoodCutsceneTime = GET_GAME_TIMER() IF NOT IS_PED_INJURED(PLAYER_PED_ID()) SET_PED_STEALTH_MOVEMENT(PLAYER_PED_ID(), FALSE) TASK_CLEAR_LOOK_AT(PLAYER_PED_ID()) REGISTER_ENTITY_FOR_CUTSCENE(PLAYER_PED_ID(), "Franklin", CU_ANIMATE_EXISTING_SCRIPT_ENTITY) ENDIF IF NOT IS_PED_INJURED(runnerChaseProperties.ped) FREEZE_ENTITY_POSITION(runnerChaseProperties.ped, FALSE) REGISTER_ENTITY_FOR_CUTSCENE(runnerChaseProperties.ped, "Ballas_OG", CU_ANIMATE_EXISTING_SCRIPT_ENTITY) ENDIF IF NOT IS_PED_INJURED(chopPed) REGISTER_ENTITY_FOR_CUTSCENE(chopPed, "Chop", CU_ANIMATE_EXISTING_SCRIPT_ENTITY) ENDIF INT i,j REPEAT NUMBER_BOXCARS i REPEAT 2 j IF DOES_ENTITY_EXIST(boxcarCarriage[i].boxcarDoor[j].obj) DELETE_OBJECT(boxcarCarriage[i].boxcarDoor[j].obj) ENDIF ENDREPEAT ENDREPEAT START_CUTSCENE() SET_CUTSCENE_FADE_VALUES(FALSE, FALSE, FALSE, FALSE) cutsceneStage = H_CUT_STAGE_RUNNING BREAK CASE H_CUT_STAGE_RUNNING // clear the area IF NOT bClearedForCutscene IF IS_CUTSCENE_PLAYING() SET_MISSION_MOCAP_CUTSCENE() // clear the area CLEAR_AREA(<<526.77, -679.35, 24.89>>, 12, TRUE) // get rid of collie ped IF DOES_ENTITY_EXIST(colliePed) DELETE_PED(colliePed) ENDIF bClearedForCutscene = TRUE ENDIF ENDIF IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Franklin") IF WAS_CUTSCENE_SKIPPED() bSkippedCutscene = TRUE ENDIF CLEANUP_FOUND_CUTSCENE() ENDIF #IF IS_DEBUG_BUILD DEBUG_SKIP_MOCAP() #ENDIF BREAK CASE H_CUT_STAGE_CLEANUP BREAK ENDSWITCH ENDPROC */ // kidnap cutscene PROC DO_KIDNAP_CUTSCENE() SET_ALL_RANDOM_PEDS_FLEE_THIS_FRAME(PLAYER_ID()) IF IS_VEHICLE_DRIVEABLE(hoodVehicle[HV_FRANKLIN_VAN]) SET_VEHICLE_BRAKE_LIGHTS(hoodVehicle[HV_FRANKLIN_VAN], FALSE) ENDIF SWITCH cutsceneStage CASE H_CUT_STAGE_INIT //SET_MISSION_CUTSCENE(TRUE) iHoodCutsceneTime = GET_GAME_TIMER() SET_AUDIO_FLAG("DisableAbortConversationForRagdoll", FALSE) IF NOT IS_PED_INJURED(PLAYER_PED_ID()) REGISTER_ENTITY_FOR_CUTSCENE(PLAYER_PED_ID(), "Franklin", CU_ANIMATE_EXISTING_SCRIPT_ENTITY) ENDIF IF NOT IS_PED_INJURED(lamarPed) TASK_CLEAR_LOOK_AT(lamarPed) REGISTER_ENTITY_FOR_CUTSCENE(lamarPed, "Lamar", CU_ANIMATE_EXISTING_SCRIPT_ENTITY) ENDIF IF NOT IS_PED_INJURED(chopPed) DETACH_ENTITY(chopPed) REGISTER_ENTITY_FOR_CUTSCENE(chopPed, "Chop", CU_ANIMATE_EXISTING_SCRIPT_ENTITY) ENDIF IF NOT IS_PED_INJURED(runnerChaseProperties.ped) REGISTER_ENTITY_FOR_CUTSCENE(runnerChaseProperties.ped, "Ballas_OG", CU_ANIMATE_EXISTING_SCRIPT_ENTITY) ENDIF IF IS_VEHICLE_DRIVEABLE(hoodVehicle[HV_FRANKLIN_VAN]) FREEZE_ENTITY_POSITION(hoodVehicle[HV_FRANKLIN_VAN], FALSE) REGISTER_ENTITY_FOR_CUTSCENE(hoodVehicle[HV_FRANKLIN_VAN], "Kidnapping_Van", CU_ANIMATE_EXISTING_SCRIPT_ENTITY, DUMMY_MODEL_FOR_SCRIPT, CEO_IS_CASCADE_SHADOW_FOCUS_ENTITY_DURING_EXIT) ENDIF KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() START_CUTSCENE(CUTSCENE_SUPPRESS_FP_TRANSITION_FLASH) //SET_VEHICLE_MODEL_PLAYER_WILL_EXIT_SCENE(SPEEDO) bDoneFlash = FALSE REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST) SET_CUTSCENE_FADE_VALUES(FALSE, FALSE, FALSE, FALSE) cutsceneStage = H_CUT_STAGE_RUNNING BREAK CASE H_CUT_STAGE_RUNNING IF NOT bClearedForCutscene IF IS_CUTSCENE_PLAYING() SET_MISSION_MOCAP_CUTSCENE() // clear the area CLEAR_AREA(<<511.55, -652.05, 23.75>>, 20.0, TRUE, TRUE) CLEAR_AREA_OF_PROJECTILES(<<511.96359, -658.37054, 23.75104>>, 25) STOP_FIRE_IN_RANGE(<<511.96359, -658.37054, 23.75104>>, 25) REMOVE_PARTICLE_FX_IN_RANGE(<<511.96359, -658.37054, 23.75104>>, 25) SET_SELECTOR_PED_HINT(sSelectorPeds, SELECTOR_PED_FRANKLIN, FALSE) IF IS_VEHICLE_DRIVEABLE(hoodVehicle[HV_FRANKLIN_VAN]) //SET_VEHICLE_RADIO_ENABLED(hoodVehicle[HV_FRANKLIN_VAN], TRUE) REMOVE_VEHICLE_WINDOW(hoodVehicle[HV_FRANKLIN_VAN], SC_WINDOW_FRONT_LEFT) SET_VEHICLE_DOOR_CONTROL(hoodVehicle[HV_FRANKLIN_VAN], SC_DOOR_FRONT_LEFT, DT_DOOR_INTACT, 0.0) SET_VEHICLE_DOOR_CONTROL(hoodVehicle[HV_FRANKLIN_VAN], SC_DOOR_REAR_RIGHT, DT_DOOR_INTACT, 0.0) SET_VEHICLE_DOOR_CONTROL(hoodVehicle[HV_FRANKLIN_VAN], SC_DOOR_REAR_LEFT, DT_DOOR_INTACT, 0.0) ENDIF STOP_VEHICLE_FIRE(hoodVehicle[HV_FRANKLIN_VAN]) //SET_DAMAGE_ON_BAD_GUY(TRUE) STOP_HOOD_AUDIO_SCENE(HOOD_AUDIO_SCENE_SEARCH_BOXCARS) 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 NOT bDoneCutsceneBlood IF DOES_ENTITY_EXIST(GET_ENTITY_INDEX_OF_CUTSCENE_ENTITY("Ballas_OG")) PED_INDEX cutscenePed cutscenePed = GET_PED_INDEX_FROM_ENTITY_INDEX(GET_ENTITY_INDEX_OF_CUTSCENE_ENTITY("Ballas_OG", csb_ballasog)) IF NOT IS_PED_INJURED(cutscenePed) APPLY_PED_BLOOD_SPECIFIC(cutscenePed, ENUM_TO_INT(PDZ_LEFT_ARM), 0.536, 0.601, 93.240, 0.695, -1, 0, "stab") APPLY_PED_BLOOD_SPECIFIC(cutscenePed, ENUM_TO_INT(PDZ_LEFT_ARM), 0.536, 0.561, 95.040, 0.695, -1, 0, "stab") APPLY_PED_BLOOD_SPECIFIC(cutscenePed, ENUM_TO_INT(PDZ_LEFT_ARM), 0.476, 0.531, 95.140, 0.695, -1, 0, "stab") bDoneCutsceneBlood = TRUE ENDIF ENDIF ENDIF IF NOT bDoneBaddyCue IF bPreparedBaddyCue bDoneBaddyCue = TRIGGER_MISSION_MUSIC_EVENT("FRA0_BADDY") ENDIF ENDIF IF GET_CUTSCENE_TIME() >= 37400 // CLOSE_ALL_VAN_DOORS() ENDIF //IF CAN_SET_EXIT_STATE_FOR_CAMERA() //SET_MISSION_CUTSCENE(FALSE) //SET_MISSION_STAGE(STAGE_GET_TO_HOUSE) //ENDIF IF NOT bDoneFlash IF GET_FOLLOW_VEHICLE_CAM_VIEW_MODE() = CAM_VIEW_MODE_FIRST_PERSON IF GET_CUTSCENE_TIME() >= GET_CUTSCENE_TOTAL_DURATION() - 300 ANIMPOSTFX_PLAY("CamPushInNeutral", 0, FALSE) PLAY_SOUND_FRONTEND(-1, "1st_Person_Transition", "PLAYER_SWITCH_CUSTOM_SOUNDSET") bDoneFlash = TRUE ENDIF ENDIF ENDIF IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Franklin") REPLAY_STOP_EVENT() IF IS_VEHICLE_DRIVEABLE(hoodVehicle[HV_FRANKLIN_VAN]) SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), hoodVehicle[HV_FRANKLIN_VAN], VS_DRIVER) FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID()) ENDIF ENDIF IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Ballas_OG") IF IS_VEHICLE_DRIVEABLE(hoodVehicle[HV_FRANKLIN_VAN]) AND NOT IS_PED_INJURED(runnerChaseProperties.ped) SET_PED_CAN_PLAY_AMBIENT_BASE_ANIMS(runnerChaseProperties.ped, FALSE) SET_PED_CAN_PLAY_AMBIENT_ANIMS(runnerChaseProperties.ped, FALSE) SET_PED_INTO_VEHICLE(runnerChaseProperties.ped, hoodVehicle[HV_FRANKLIN_VAN], VS_BACK_RIGHT) FORCE_PED_AI_AND_ANIMATION_UPDATE(runnerChaseProperties.ped) ENDIF ENDIF IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Chop") IF IS_VEHICLE_DRIVEABLE(hoodVehicle[HV_FRANKLIN_VAN]) AND NOT IS_PED_INJURED(chopPed) SET_CHOP_INTO_VAN(chopPed, hoodVehicle[HV_FRANKLIN_VAN], chopLeanInVanState, fCachedVanSpeed, TRUE) SET_ENTITY_PROOFS(chopPed, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, TRUE) SET_PED_CAN_RAGDOLL(chopPed, FALSE) ENDIF ENDIF IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Lamar") IF IS_VEHICLE_DRIVEABLE(hoodVehicle[HV_FRANKLIN_VAN]) AND NOT IS_PED_INJURED(lamarPed) SET_LAMAR_MASK(FALSE) SET_PED_INTO_VEHICLE(lamarPed, hoodVehicle[HV_FRANKLIN_VAN], VS_FRONT_RIGHT) TASK_PLAY_ANIM(lamarPed, GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_DRIVE_HOME), "InCar_PhoneIdle_Lem", INSTANT_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING) FORCE_PED_AI_AND_ANIMATION_UPDATE(lamarPed) ENDIF ENDIF //IF IS_VEHICLE_DRIVEABLE(hoodVehicle[HV_FRANKLIN_VAN]) // SET_VEHICLE_USE_CUTSCENE_WHEEL_COMPRESSION(hoodVehicle[HV_FRANKLIN_VAN]) //ENDIF IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Kidnapping_Van") IF IS_VEHICLE_DRIVEABLE(hoodVehicle[HV_FRANKLIN_VAN]) SHUT_ALL_VAN_DOORS() // //SET_VEHICLE_ON_GROUND_PROPERLY(hoodVehicle[HV_FRANKLIN_VAN]) SET_MISSION_CUTSCENE(FALSE, TRUE, -1, WAS_CUTSCENE_SKIPPED()) SET_MISSION_STAGE(STAGE_GET_TO_HOUSE) ENDIF ELSE IF IS_VEHICLE_DRIVEABLE(hoodVehicle[HV_FRANKLIN_VAN]) SET_VEHICLE_USE_CUTSCENE_WHEEL_COMPRESSION(hoodVehicle[HV_FRANKLIN_VAN]) ENDIF ENDIF IF WAS_CUTSCENE_SKIPPED() CAN_SET_EXIT_STATE_FOR_CAMERA() ENDIF #IF IS_DEBUG_BUILD DEBUG_SKIP_MOCAP() #ENDIF BREAK CASE H_CUT_STAGE_CLEANUP BREAK ENDSWITCH HIDE_HUD_AND_RADAR_THIS_FRAME() ENDPROC PROC INCREMENT_CHOP_THROUGH_BOXCAR_SPEED() IF IS_SYNCHRONIZED_SCENE_RUNNING(chopChaseProperties.iSyncScene) fChopThroughBoxcarSpeed = fChopThroughBoxcarSpeed +@ 0.83 IF fChopThroughBoxcarSpeed >= 0.93 fChopThroughBoxcarSpeed = 0.93 ENDIF SET_SYNCHRONIZED_SCENE_RATE(chopChaseProperties.iSyncScene, fChopThroughBoxcarSpeed) ENDIF ENDPROC // find the bad guy in the trainyard PROC DO_STAGE_FIND_BAD_GUY() HANDLE_TRAINS() bOpeningBoxcarInProgress = FALSE IF chopViewCamData.state <> CHOP_VIEW_CAM_ON_CHOP SET_SELECTOR_PED_HINT(sSelectorPeds, SELECTOR_PED_FRANKLIN, FALSE) ENDIF IF NOT IS_PED_INJURED(chopPed) IF GET_GAME_TIMER() <= iStageStartTime + 3000 SET_PED_MIN_MOVE_BLEND_RATIO(chopPed, PEDMOVE_RUN) ENDIF ENDIF IF NOT bRunningCutscene IF NOT bPreparedBaddyCue IF NOT bForcePassOnShitSkip bPreparedBaddyCue = PREPARE_MUSIC_EVENT("FRA0_BADDY") ENDIF ENDIF IF bForcePassOnShitSkip IF NOT bWarpedToChaseEnd //IF NOT IS_PED_INJURED(PLAYER_PED_ID()) // SET_ENTITY_COORDS(PLAYER_PED_ID(), <<517.17352, -626.64124, 23.75108>>) //ENDIF IF NOT IS_PED_INJURED(chopPed) SET_ENTITY_COORDS(chopPed, <<517.26697, -648.65112, 23.75121>>) ENDIF IF NOT IS_PED_INJURED(runnerChaseProperties.ped) SET_ENTITY_COORDS(runnerChaseProperties.ped, <<516.20947, -646.30573, 23.75121>>) ENDIF //LOAD_SCENE(<<517.17352, -626.64124, 23.75108>>) //WAIT(0) bFoundBadGuy = TRUE bDoneRunnerFallOver = TRUE bWarpedToChaseEnd = TRUE ENDIF ENDIF IF NOT bForcePassOnShitSkip // kill the dog if damaged IF NOT IS_PED_INJURED(colliePed) IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(colliePed, PLAYER_PED_ID()) APPLY_DAMAGE_TO_PED(colliePed, 1000, TRUE) ENDIF ENDIF //HANDLE_CHOP_VIEW_CAM(chopViewCamData, sSelectorPeds, bGotToTrain) IF chopViewCamData.state = CHOP_VIEW_CAM_ON_CHOP DRAW_SCENT(NOT bFoundBadGuy) ELSE REMOVE_CHOP_SCENT(TRUE) ENDIF HANDLE_REACT_TO_RUN_STAT() HANDLE_BOXCAR_DOORS() DO_CHOP_CAM_HELP() DO_NO_STAMINA_HELP_TEXT() // music for 2nd boxcars IF NOT bDoneBlipSecondBoxcarsCue IF bBlippedSecondBoxcars bDoneBlipSecondBoxcarsCue = TRIGGER_MUSIC_EVENT("FRA0_OPEN_CAR") ENDIF ENDIF //IF NOT bOpeningBoxcarInProgress HANDLE_CHOP_VIEW_CAM() //ENDIF IF bOpeningBoxcarInProgress DISABLE_SELECTOR_THIS_FRAME() ENDIF // abandon fail chop IF NOT bForcePassOnShitskip IF NOT IS_PED_INJURED(chopPed) IF GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), chopPed, FALSE) > ABANDON_BUDDY_FAIL_RANGE MISSION_FAILED(FAIL_ABANDONED_CHOP) ENDIF ENDIF ENDIF // handle bad guy SWITCH ballaDiscoveredState CASE BALLA_DISCOVERED_STATE_NOT_STARTED IF IS_SYNCHRONIZED_SCENE_RUNNING(iBoxcarCamSyncScene) AND bDoneBoxcarCutsceneCam IF openTargetContainerState >= OPEN_TARGET_CONTAINER_STATE_OPENING IF DOES_ENTITY_EXIST(colliePed) DELETE_PED(colliePed) ENDIF CLEAR_PED_TASKS_IMMEDIATELY(runnerChaseProperties.ped) TASK_PLAY_ANIM(runnerChaseProperties.ped, GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_FIND), "open_train_car_og", INSTANT_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_HOLD_LAST_FRAME, 0.2) FORCE_PED_AI_AND_ANIMATION_UPDATE(runnerChaseProperties.ped) ballaDiscoveredState = BALLA_DISCOVERED_STATE_DOOR_OPENING ENDIF ENDIF BREAK CASE BALLA_DISCOVERED_STATE_DOOR_OPENING IF NOT bDoneFoundCue bDoneFoundCue = TRIGGER_MUSIC_EVENT("FRA0_FOUND") ENDIF IF IS_ENTITY_PLAYING_ANIM(runnerChaseProperties.ped, GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_FIND), "open_train_car_og") IF GET_ENTITY_ANIM_CURRENT_TIME(runnerChaseProperties.ped, GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_FIND), "open_train_car_og") >= 0.98 TASK_PLAY_ANIM(runnerChaseProperties.ped, GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_FIND), "find_ballasog_og", NORMAL_BLEND_OUT, NORMAL_BLEND_OUT, -1, AF_TAG_SYNC_OUT) ballaDiscoveredState = BALLA_DISCOVERED_STATE_LEAVE_BOXCAR ENDIF ENDIF BREAK CASE BALLA_DISCOVERED_STATE_LEAVE_BOXCAR SET_PED_MIN_MOVE_BLEND_RATIO(runnerChaseProperties.ped, PEDMOVE_RUN) IF NOT IS_ENTITY_PLAYING_ANIM(runnerChaseProperties.ped, GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_FIND), "find_ballasog_og") TASK_FOLLOW_WAYPOINT_RECORDING(runnerChaseProperties.ped, "hood5", 5, EWAYPOINT_DO_NOT_RESPOND_TO_COLLISION_EVENTS) iRunnerStageStartTime = GET_GAME_TIMER() ballaDiscoveredState = BALLA_DISCOVERED_STATE_ESCAPING ENDIF BREAK ENDSWITCH ENDIF IF NOT bFoundBadGuy HANDLE_BOXCAR_SEARCHING() // looking for bad guy following chop IF NOT bDoneGotoSpeech IF DO_MISSION_SPEECH("FKN0_FIND")//2") bDoneGotoSpeech = TRUE iNextFindSpeechTime = GET_GAME_TIMER() + 6000 ENDIF ELSE IF NOT bShownGodText IF bGotToTrain bShownGodText = TRUE ELSE IF chopViewCamData.state = CHOP_VIEW_CAM_DISABLED bShownGodText = DO_MISSION_GOD_TEXT("FC_GOCHOP") ENDIF ENDIF ENDIF IF NOT bDoneSecondFindSpeech IF GET_GAME_TIMER() >= iNextFindSpeechTime bDoneSecondFindSpeech = DO_MISSION_SPEECH("FKN0_FIND2") ENDIF ENDIF HANDLE_CHOP_BEHAVIOUR_SETPIECE() // look ats FLOAT fLookDistance IF chopBehaviourSetpieceStage = CBS_NOT_STARTED OR chopBehaviourSetpieceStage = CBS_DONE fLookDistance = 20.0 ELSE fLookDistance = 40.0 ENDIF IF NOT IS_PED_INJURED(chopPed) IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), chopPed, <>) AND NOT bOpeningBoxcarInProgress IF NOT IS_PED_HEADTRACKING_ENTITY(PLAYER_PED_ID(), chopPed) TASK_LOOK_AT_ENTITY(PLAYER_PED_ID(), chopPed, -1, SLF_WHILE_NOT_IN_FOV, SLF_LOOKAT_VERY_HIGH) ENDIF ELSE IF IS_PED_HEADTRACKING_ENTITY(PLAYER_PED_ID(), chopPed) TASK_CLEAR_LOOK_AT(PLAYER_PED_ID()) ENDIF ENDIF ENDIF IF bGotToTrain IF chopBehaviourSetpieceStage = CBS_NOT_STARTED OR chopBehaviourSetpieceStage = CBS_DONE IF NOT IS_PED_INJURED(chopPed) BOOL bAtChop = IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), chopPed, <>) BOOL bChopFinishedRoute = IS_ENTITY_AT_COORD(chopPed, <<530.02509, -678.95294, 23.70727>>, <<2.5,2.5,2.5>>) //iChopWaypointProgress >= 47 AND NOT IS_WAYPOINT_PLAYBACK_GOING_ON_FOR_PED(chopPed) //IF bAtChop //OR IS_ENTITY_AT_COORD(chopPed, <<543.35, -618.24, 23.75>>, <<3,3,3>>) // random speech IF bAtChop AND NOT bOpeningBoxcarInProgress IF bShownGodText DO_RANDOM_SPEECH("FKN0_FOLLOW", -1, 6000, 9000) ENDIF ENDIF SWITCH chopSniffState CASE CHOP_SNIFF_STATE_NOT_STARTED IF NOT bChopFinishedRoute DO_CHOP_AUDIO(CHOP_AUDIO_STATE_SEARCHING) IF IS_WAYPOINT_PLAYBACK_GOING_ON_FOR_PED(chopPed) WAYPOINT_PLAYBACK_OVERRIDE_SPEED(chopPed, PEDMOVE_WALK) ENDIF IF NOT IS_ENTITY_AT_COORD(chopPed, <<528.33459, -679.31793, 23.79582>>, <<3,3,3>>, FALSE, FALSE) IF GET_GAME_TIMER() >= iNextChopSniffTime chopSniffState = CHOP_SNIFF_STATE_SLOW_DOWN ENDIF ENDIF ELSE CLEAR_SEQUENCE_TASK(sequence) OPEN_SEQUENCE_TASK(sequence) TASK_GO_STRAIGHT_TO_COORD(NULL, <<529.89215, -679.12616, 23.71802>>, PEDMOVE_WALK, DEFAULT_TIME_BEFORE_WARP, 83.2) TASK_PLAY_ANIM(NULL, GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_SHARED), "CHOP_BARK_AT_CARRIAGE", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING) CLOSE_SEQUENCE_TASK(sequence) TASK_PERFORM_SEQUENCE(chopPed, sequence) SET_PED_CAN_RAGDOLL_FROM_PLAYER_IMPACT(chopPed, FALSE) bShownSwitchToOpenHelp = FALSE chopSniffState = CHOP_SNIFF_STATE_WAIT_AT_BOXCAR ENDIF BREAK CASE CHOP_SNIFF_STATE_SLOW_DOWN IF IS_WAYPOINT_PLAYBACK_GOING_ON_FOR_PED(chopPed) WAYPOINT_PLAYBACK_OVERRIDE_SPEED(chopPed, 0.0) ENDIF IF GET_ENTITY_SPEED(chopPed) <= 0.2 chopSniffState = CHOP_SNIFF_STATE_STOPPED iChopSniffStateTime = GET_GAME_TIMER() ENDIF BREAK CASE CHOP_SNIFF_STATE_STOPPED IF IS_WAYPOINT_PLAYBACK_GOING_ON_FOR_PED(chopPed) WAYPOINT_PLAYBACK_OVERRIDE_SPEED(chopPed, 0.0) ENDIF IF GET_GAME_TIMER() >= iChopSniffStateTime + 100 TASK_PLAY_ANIM(chopPed, GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_FIND), "FRA0_IG_14_CHOP_SNIFF_FWDS", 2, 2) iChopSniffStateTime = GET_GAME_TIMER() chopSniffState = CHOP_SNIFF_STATE_PLAYING_ANIM ENDIF BREAK CASE CHOP_SNIFF_STATE_PLAYING_ANIM SET_PED_MIN_MOVE_BLEND_RATIO(chopPed, PEDMOVE_WALK) IF NOT IS_ENTITY_PLAYING_ANIM(chopPed, GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_FIND), "FRA0_IG_14_CHOP_SNIFF_FWDS") chopSniffState = CHOP_SNIFF_STATE_NOT_STARTED bDoneChopSniffSFX = FALSE iChopSniffStateTime = GET_GAME_TIMER() iNextChopSniffTime = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(7000, 11000) ELSE IF NOT bDoneChopSniffSFX IF GET_GAME_TIMER() >= iChopSniffStateTime + 600 PLAY_CHOP_AUDIO_CONTEXT(CHOP_AUDIO_CONTEXT_SNIFF) bDoneChopSniffSFX = TRUE ENDIF ENDIF ENDIF BREAK CASE CHOP_SNIFF_STATE_WAIT_AT_BOXCAR SET_PED_RESET_FLAG(chopPed, PRF_UseKinematicPhysics, TRUE) DO_CHOP_AUDIO(CHOP_AUDIO_STATE_FOUND_SOMETHING) BREAK ENDSWITCH //PRINTINT(ENUM_TO_INT(chopSniffState)) PRINTNL() IF chopSniffState = CHOP_SNIFF_STATE_NOT_STARTED IF NOT IS_WAYPOINT_PLAYBACK_GOING_ON_FOR_PED(chopPed) VECTOR vChopPos = GET_ENTITY_COORDS(chopPed) IF vChopPos.y <-607.75 INT iClosestWaypoint WAYPOINT_RECORDING_GET_CLOSEST_WAYPOINT("hood8", GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(chopPed, <<0,1.5,0>>), iClosestWaypoint) TASK_FOLLOW_WAYPOINT_RECORDING(chopPed, "hood8", iClosestWaypoint, EWAYPOINT_NAVMESH_BACK_TO_WAYPOINT_IF_LEFT_ROUTE) iNextChopSniffTime = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(4000, 7000) ENDIF ELSE INT iProgress = GET_PED_WAYPOINT_PROGRESS(chopPed) IF iProgress > iChopWaypointProgress iChopWaypointProgress = iProgress ENDIF ENDIF ENDIF //ELSE //IF IS_WAYPOINT_PLAYBACK_GOING_ON_FOR_PED(chopPed) //AND chopSniffState = CHOP_SNIFF_STATE_NOT_STARTED // CLEAR_PED_TASKS(chopPed) //ENDIF //ENDIF ENDIF ENDIF ELSE IF NOT IS_PED_INJURED(chopPed) VECTOR vChopPos2 = GET_ENTITY_COORDS(chopPed) IF vChopPos2.y <-614.75 SET_PED_MAX_MOVE_BLEND_RATIO(chopPed, PEDMOVE_WALK) ELIF vChopPos2.y <-608.75 SET_PED_MAX_MOVE_BLEND_RATIO(chopPed, PEDMOVE_RUN) ENDIF IF NOT bDoneChopGoToTrain //IF GET_SCRIPT_TASK_STATUS(chopPed, SCRIPT_TASK_PERFORM_SEQUENCE) = FINISHED_TASK IF IS_ENTITY_AT_COORD(chopPed, <<542.47552, -618.73151, 23.74781>>, <<2,2,2>>) IF NOT IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), chopPed, <<30,30,30>>, FALSE, FALSE) TASK_PLAY_ANIM(chopPed, GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_SHARED), "FRA0_IG_12_CHOP_WAITING_B", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING) ENDIF iNextChopSniffTime = GET_GAME_TIMER() + 1000 bDoneChopGoToTrain = TRUE ENDIF ELSE IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), chopPed, <<30,30,30>>, FALSE, FALSE) IF CAN_CHOP_TRANSITION_BACK_FROM_WAIT() bGotToTrain = TRUE ENDIF ENDIF ENDIF ENDIF ENDIF // handle opening target container SWITCH openTargetContainerState CASE OPEN_TARGET_CONTAINER_STATE_NOT_STARTED IF boxcarCarriage[2].boxcarDoor[1].state = BOXCAR_DOOR_OPENING AND ((IS_SYNCHRONIZED_SCENE_RUNNING(iBoxcarCamSyncScene) AND bDoneBoxcarCutsceneCam) OR GET_GAME_TIMER() >= iOpenBoxcarTime + 5000) IF DOES_ENTITY_EXIST(colliePed) //SET_PED_AS_NO_LONGER_NEEDED(colliePed) DELETE_PED(colliePed) ENDIF IF NOT IS_PED_INJURED(chopPed) CLEAR_PED_TASKS_IMMEDIATELY(chopPed) //SET_ENTITY_COORDS(chopPed, <<529.917, -680.218, 23.75>>) //SET_ENTITY_HEADING(chopPed, 107.7) REQUEST_PED_VISIBILITY_TRACKING(chopPed) chopChaseProperties.iSyncscene = CREATE_SYNCHRONIZED_SCENE(GET_BOXCAR_POS(2), <<0,0,83.079>>) SET_SYNCHRONIZED_SCENE_LOOPED(chopChaseProperties.iSyncscene, FALSE) //SET_SYNCHRONIZED_SCENE_PHASE(chopChaseProperties.iSyncscene, 0.355) TASK_SYNCHRONIZED_SCENE(chopPed, chopChaseProperties.iSyncscene, GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_FIND), "find_ballasog_chop", INSTANT_BLEND_IN, NORMAL_BLEND_OUT, SYNCED_SCENE_TAG_SYNC_OUT | SYNCED_SCENE_DONT_INTERRUPT) SET_SYNCHRONIZED_SCENE_RATE(chopChaseProperties.iSyncscene, fChopThroughBoxcarSpeed) chopSniffState = CHOP_SNIFF_STATE_WAIT_AT_BOXCAR ENDIF TASK_CLEAR_LOOK_AT(PLAYER_PED_ID()) FREEZE_ENTITY_POSITION(runnerChaseProperties.ped, FALSE) KILL_ANY_CONVERSATION() REMOVE_ALL_BLIPS() IF NOT DOES_BLIP_EXIST(chopBlip) chopBlip = CREATE_MISSION_BLIP_FOR_PED(chopPed, FALSE, CHAR_CHOP) ENDIF IF NOT DOES_BLIP_EXIST(runnerBlip) runnerBlip = CREATE_MISSION_BLIP_FOR_PED(runnerChaseProperties.ped, TRUE) ENDIF boxcarCarriage[2].boxcarDoor[0].fOffset = 3.0 ATTACH_DOOR_TO_BOXCAR(2,0) iOpenTargetBoxcarTime = GET_GAME_TIMER() SET_CHOP_VIEW_CAM_CUSTOM_ATTACH(chopViewCamData, -0.75, 0) openTargetContainerState = OPEN_TARGET_CONTAINER_STATE_OPENING ENDIF BREAK CASE OPEN_TARGET_CONTAINER_STATE_OPENING DISABLE_CELLPHONE_THIS_FRAME_ONLY() IF GET_GAME_TIMER() >= iOpenTargetBoxcarTime + 3400 IF NOT bDoneFoundBadGuySpeech bDoneFoundBadGuySpeech = DO_MISSION_SPEECH("FKN0_FOUND1") ENDIF ENDIF IF NOT IS_SYNCHRONIZED_SCENE_RUNNING(iSyncScene)// IS_ENTITY_PLAYING_ANIM(PLAYER_PED_ID(), GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_MISSION), "open_train_car_fra")//GET_GAME_TIMER() >= iOpenTargetBoxcarTime + 7000 IF NOT IS_PED_INJURED(PLAYER_PED_ID()) TASK_PLAY_ANIM(PLAYER_PED_ID(), GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_FIND), "find_ballasOG_Fra", NORMAL_BLEND_IN, -1.0) ENDIF INCREMENT_CHOP_THROUGH_BOXCAR_SPEED() //IF NOT IS_PED_INJURED(chopPed) //REQUEST_PED_VISIBILITY_TRACKING(chopPed) //chopChaseProperties.iSyncscene = CREATE_SYNCHRONIZED_SCENE(GET_BOXCAR_POS(2), <<0,0,83.079>>) //SET_SYNCHRONIZED_SCENE_LOOPED(chopChaseProperties.iSyncscene, FALSE) //SET_SYNCHRONIZED_SCENE_PHASE(chopChaseProperties.iSyncscene, 0.355) //TASK_SYNCHRONIZED_SCENE(chopPed, chopChaseProperties.iSyncscene, GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_FIND), "find_ballasog_chop", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, SYNCED_SCENE_TAG_SYNC_OUT | SYNCED_SCENE_DONT_INTERRUPT) //SET_SYNCHRONIZED_SCENE_RATE(chopChaseProperties.iSyncscene, 0.9) //ENDIF IF NOT IS_PED_INJURED(runnerChaseProperties.ped) REQUEST_PED_VISIBILITY_TRACKING(runnerChaseProperties.ped) ENDIF iRunnerStageStartTime = GET_GAME_TIMER() bShownGodText = FALSE bDoneGotoSpeech = FALSE bFoundBadGuy = TRUE openTargetContainerState = OPEN_TARGET_CONTAINER_STATE_ESCAPING ENDIF BREAK ENDSWITCH ENDIF ELSE IF NOT bForcePassOnShitSkip SET_PED_MOVE_RATE_OVERRIDE(PLAYER_PED_ID(), 0.97) IF NOT bDoneChopChaseFoundBalla INCREMENT_CHOP_THROUGH_BOXCAR_SPEED() ENDIF IF IS_ENTITY_PLAYING_ANIM(PLAYER_PED_ID(), GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_FIND), "find_ballasOG_Fra") DISABLE_CELLPHONE_THIS_FRAME_ONLY() ENDIF BLOCK_FOOT_CHASE_RAGDOLL() DO_CHOP_AUDIO(CHOP_AUDIO_STATE_CHASING) ENDIF IF NOT IS_PED_INJURED(runnerChaseProperties.ped) IF IS_ENTITY_ON_FIRE(runnerChaseProperties.ped) MISSION_FAILED(FAIL_KILLED_BAD_GUY) ENDIF ENDIF HANDLE_STREAMING_MOCAP("FRA_0_MCS_4_P2_T3", GET_HOOD_VECTOR(HVEC_FIND_GANGSTER), DEFAULT_CUTSCENE_LOAD_DIST, DEFAULT_CUTSCENE_UNLOAD_DIST) IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY() IF NOT IS_PED_INJURED(lamarPed) PRINTSTRING("setting component from lamar") printnl() SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Lamar", lamarPed) SET_CUTSCENE_PED_COMPONENT_VARIATION("Lamar", PED_COMP_SPECIAL, 0, 0) ENDIF IF NOT IS_PED_INJURED(chopPed) SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Chop", chopPed) ENDIF IF NOT IS_PED_INJURED(runnerChaseProperties.ped) SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Ballas_OG", runnerChaseProperties.ped) SET_CUTSCENE_PED_PROP_VARIATION("Ballas_OG", ANCHOR_HEAD, 0, 0) ENDIF ENDIF IF NOT IS_PED_INJURED(runnerChaseProperties.ped) AND NOT IS_PED_INJURED(chopPed) BOOL bBothOffScreen = FALSE VECTOR vRunnerPos = GET_ENTITY_COORDS(runnerChaseProperties.ped) SET_PED_RESET_FLAG(chopPed, PRF_UseKinematicPhysics, TRUE) SET_PED_RESET_FLAG(runnerChaseProperties.ped, PRF_UseKinematicPhysics, TRUE) IF NOT bForcePassOnShitskip IF NOT bDoneRunnerFallOver // calculate override speed for runner IF IS_WAYPOINT_PLAYBACK_GOING_ON_FOR_PED(runnerChaseProperties.ped) WAYPOINT_PLAYBACK_OVERRIDE_SPEED(runnerChaseProperties.ped, 3.0) IF bBothOffScreen SET_PED_MOVE_RATE_OVERRIDE(runnerChaseProperties.ped, 0.5) ELSE SET_PED_MOVE_RATE_OVERRIDE(runnerChaseProperties.ped, 0.99) ENDIF ENDIF IF IS_WAYPOINT_PLAYBACK_GOING_ON_FOR_PED(chopPed) FLOAT fChopTargetOverride WAYPOINT_PLAYBACK_OVERRIDE_SPEED(chopPed, 3.0) IF vRunnerPos.y <= -670 IF NOT IS_ENTITY_AT_ENTITY(chopPed, runnerChaseProperties.ped, <<3,3,3>>, FALSE, FALSE) fChopTargetOverride = 1.15 ELSE fChopTargetOverride = 1.05 ENDIF ELSE IF IS_ENTITY_AT_ENTITY(chopPed, runnerChaseProperties.ped, <<2,2,2>>, FALSE, FALSE) fChopTargetOverride = 1.13 ELSE fChopTargetOverride = 1.15 ENDIF ENDIF IF fChopTargetOverride > fChopOverride fChopOverride = fChopOverride +@ 0.1 IF fChopOverride > fChopTargetOverride fChopOverride = fChopTargetOverride ENDIF ELIF fChopTargetOverride < fChopOverride fChopOverride = fChopOverride -@ 0.1 IF fChopOverride < fChopTargetOverride fChopOverride = fChopTargetOverride ENDIF ENDIF IF bBothOffScreen SET_PED_MOVE_RATE_OVERRIDE(chopPed,fChopOverride/2) ELSE SET_PED_MOVE_RATE_OVERRIDE(chopPed,fChopOverride) ENDIF ELSE IF NOT bDoneChopChaseFoundBalla //SET_PED_MIN_MOVE_BLEND_RATIO(chopPed,PEDMOVE_SPRINT) IF IS_SYNCHRONIZED_SCENE_RUNNING(chopChaseProperties.iSyncScene) IF GET_SYNCHRONIZED_SCENE_PHASE(chopChaseProperties.iSyncScene) >= 0.98 SET_RAGDOLL_BLOCKING_FLAGS(chopPed, chaseRagdollBlockingFlags) //SET_ENTITY_NO_COLLISION_ENTITY(chopPed, PLAYER_PED_ID(), FALSE) TASK_FOLLOW_WAYPOINT_RECORDING(chopPed, "hood5", 5, EWAYPOINT_DO_NOT_RESPOND_TO_COLLISION_EVENTS) bDoneChopChaseFoundBalla = TRUE ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF // speech and follow prompt IF NOT bForcePassOnShitSkip IF NOT bDoneDRunSpeech bDoneDRunSpeech = DO_MISSION_SPEECH("FKN0_DFYOU") ELSE IF NOT bDoneGotoSpeech IF chopHumpState < CHOP_HUMP_STATE_ENTERING bDoneGotoSpeech = DO_MISSION_SPEECH("FKN0_DOWN") ELSE bDoneGotoSpeech = DO_MISSION_SPEECH("FKN0_DOWN2") ENDIF iGetHisAssSpeechTime = GET_GAME_TIMER() + 2800 ELSE IF NOT bShownGodText IF chopViewCamData.state = CHOP_VIEW_CAM_DISABLED //bShownGodText = DO_MISSION_GOD_TEXT("FC_CHASE") bShownGodText = TRUE ENDIF ELSE //DO_RANDOM_SPEECH("FC_CGROWL", -1, 6000, 7000) ENDIF IF NOT bDoneGetHisAssSpeech IF GET_GAME_TIMER() >= iGetHisAssSpeechTime bDoneGetHisAssSpeech = DO_MISSION_SPEECH("FKN0_FOUND2") ENDIF ENDIF ENDIF ENDIF ENDIF //IF GET_GAME_TIMER() >= iNextMaulTime // START_PARTICLE_FX_NON_LOOPED_ON_PED_BONE("scr_franklin0_mauling_blood", runnerChaseProperties.ped, <<0,0,0>>, <<0,0,0>>, BONETAG_R_CALF) // iNextMaulTime = GET_GAME_TIMER() + GET_RANDOM_INT_IN_RANGE(1500, 2500) //ENDIF IF NOT IS_PED_INJURED(runnerChaseProperties.ped) AND NOT IS_PED_INJURED(chopPed) VECTOR vRunnerPos = GET_ENTITY_COORDS(runnerChaseProperties.ped) IF NOT bDoneRunnerFallOver IF NOT bDoneChopTakeDown IF vRunnerPos.y >= -647.20 OR (vRunnerPos.y >= -660 AND IS_ENTITY_AT_ENTITY(chopPed, runnerChaseProperties.ped, <<1.6,1.6,3>>, FALSE, FALSE)) // TASK_PLAY_ANIM(chopPed, GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_FIND), "FRA_0_IG_CHOP_TAKE_DOWN_BALLA_CHOP", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_NOT_INTERRUPTABLE) chopChaseProperties.vAnimPos = GET_ENTITY_COORDS(chopPed) chopChaseProperties.vAnimRot = GET_ENTITY_ROTATION(chopPed) chopChaseProperties.vAnimRot.z = NORMALISE_HEADING(chopChaseProperties.vAnimRot.z) chopChaseProperties.iSyncscene = CREATE_SYNCHRONIZED_SCENE(chopChaseProperties.vAnimPos, chopChaseProperties.vAnimRot) TASK_SYNCHRONIZED_SCENE(chopPed, chopChaseProperties.iSyncscene, GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_FIND), "FRA_0_IG_CHOP_TAKE_DOWN_BALLA_CHOP", SLOW_BLEND_IN, NORMAL_BLEND_OUT, SYNCED_SCENE_DONT_INTERRUPT | SYNCED_SCENE_USE_PHYSICS) SET_SYNCHRONIZED_SCENE_PHASE(chopChaseProperties.iSyncscene, 0.03) runnerChaseProperties.vAnimPos = GET_ENTITY_COORDS(runnerChaseProperties.ped) runnerChaseProperties.vAnimRot = GET_ENTITY_ROTATION(runnerChaseProperties.ped) runnerChaseProperties.vAnimRot.z = NORMALISE_HEADING(runnerChaseProperties.vAnimRot.z) vTargetTakedownPos = GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS(runnerChaseProperties.vAnimPos, runnerChaseProperties.vAnimRot.z, <<0, -1.5, -0.6>>) vTargetTakedownRot = runnerChaseProperties.vAnimRot runnerChaseProperties.iSyncscene = CREATE_SYNCHRONIZED_SCENE(runnerChaseProperties.vAnimPos, runnerChaseProperties.vAnimRot) TASK_SYNCHRONIZED_SCENE(runnerChaseProperties.ped, runnerChaseProperties.iSyncscene, GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_FIND), "FRA_0_IG_CHOP_TAKE_DOWN_BALLA_VICTIM", SLOW_BLEND_IN, NORMAL_BLEND_OUT, SYNCED_SCENE_DONT_INTERRUPT | SYNCED_SCENE_USE_PHYSICS) SET_SYNCHRONIZED_SCENE_PHASE(runnerChaseProperties.iSyncscene, 0.03) REPLAY_RECORD_BACK_FOR_TIME(2.0) SET_AUDIO_FLAG("DisableAbortConversationForRagdoll", TRUE) bDoneChopTakeDown = TRUE ENDIF ELSE SHIFT_VECTOR_TO_IDEAL_VECTOR(chopChaseProperties.vAnimPos, vTargetTakedownPos, SHIFT_POS_SPEED * 2) SHIFT_VECTOR_TO_IDEAL_VECTOR(chopChaseProperties.vAnimRot, vTargetTakedownRot, SHIFT_ROT_SPEED * 2) SET_SYNCHRONIZED_SCENE_ORIGIN(chopChaseProperties.iSyncScene, chopChaseProperties.vAnimPos, chopChaseProperties.vAnimRot) IF IS_SYNCHRONIZED_SCENE_RUNNING(runnerChaseProperties.iSyncScene) IF GET_SYNCHRONIZED_SCENE_PHASE(runnerChaseProperties.iSyncScene) >= 0.237 SET_DAMAGE_ON_BAD_GUY() ENDIF IF NOT bAllowKidnapCutscene IF GET_SYNCHRONIZED_SCENE_PHASE(runnerChaseProperties.iSyncScene) >= 0.147 bAllowKidnapCutscene = TRUE ENDIF ENDIF IF GET_SYNCHRONIZED_SCENE_PHASE(runnerChaseProperties.iSyncScene) >= 0.98 bDoneRunnerFallOver = TRUE ENDIF ELSE SET_DAMAGE_ON_BAD_GUY() bDoneRunnerFallOver = TRUE ENDIF IF NOT bDoneDFallSpeech IF DO_MISSION_SPEECH("FKN0_DFALL") bDoneDFallSpeech = TRUE iNextRandomSpeechTime = GET_GAME_TIMER() + 3000 ENDIF ENDIF ENDIF ELSE IF NOT bForcePassOnShitSkip IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), runnerChaseProperties.ped, <<30, 30, 8>>) DO_RANDOM_SPEECH("FKN0_DHELP", -1, 5000, 10000) ENDIF //IF GET_SCRIPT_TASK_STATUS(chopPed, SCRIPT_TASK_PLAY_ANIM) = FINISHED_TASK IF NOT IS_ENTITY_AT_ENTITY(chopPed, runnerChaseProperties.ped, <<2,2,2>>) IF GET_GAME_TIMER() >= iLastChopGotoTime + 2000//GET_SCRIPT_TASK_STATUS(chopPed, SCRIPT_TASK_PERFORM_SEQUENCE) = FINISHED_TASK CLEAR_SEQUENCE_TASK(sequence) OPEN_SEQUENCE_TASK(sequence) TASK_GO_STRAIGHT_TO_COORD(NULL, GET_ENTITY_COORDS(runnerChaseProperties.ped) + <<1.5,0.0,0>>, PEDMOVE_RUN, DEFAULT_TIME_BEFORE_WARP) // TASK_TURN_PED_TO_FACE_ENTITY(NULL, runnerChaseProperties.ped) // TASK_PLAY_ANIM(NULL, GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_MISSION), "CHOP_BARK_AT_BALLAS", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING | AF_NOT_INTERRUPTABLE) CLOSE_SEQUENCE_TASK(sequence) TASK_PERFORM_SEQUENCE(chopPed, sequence) iLastChopGotoTime = GET_GAME_TIMER() ENDIF ELSE IF GET_SCRIPT_TASK_STATUS(chopPed, SCRIPT_TASK_PERFORM_SEQUENCE) = FINISHED_TASK CLEAR_SEQUENCE_TASK(sequence) OPEN_SEQUENCE_TASK(sequence) TASK_TURN_PED_TO_FACE_ENTITY(NULL, runnerChaseProperties.ped) TASK_PLAY_ANIM(NULL, GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_FIND), "CHOP_BARK_AT_BALLAS", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING) CLOSE_SEQUENCE_TASK(sequence) TASK_PERFORM_SEQUENCE(chopPed, sequence) ENDIF ENDIF IF NOT bDoneRunnerRelax IF GET_GAME_TIMER() >= iRunnerFallOverTime + 2500 IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), runnerChaseProperties.ped, <<35,35,35>>, FALSE, FALSE) SET_PED_TO_RAGDOLL(runnerChaseProperties.ped,2000,3000,TASK_NM_SCRIPT,TRUE,TRUE,FALSE) CREATE_NM_MESSAGE(NM_START_START, NM_RELAX_MSG) GIVE_PED_NM_MESSAGE(runnerChaseProperties.ped) bDoneRunnerRelax = TRUE ENDIF ENDIF ELSE IF IS_PED_RUNNING_RAGDOLL_TASK(runnerChaseProperties.ped) RESET_PED_RAGDOLL_TIMER(runnerChaseProperties.ped) ELSE IF CAN_PED_RAGDOLL(runnerChaseProperties.ped) SET_PED_TO_RAGDOLL(runnerChaseProperties.ped,2000,3000,TASK_NM_SCRIPT,TRUE,TRUE,FALSE) ENDIF ENDIF ENDIF ENDIF ENDIF IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), chopPed, <<7.0, 7.0, LOCATE_SIZE_HEIGHT>>) OR bForcePassOnShitskip IF bDoneRunnerFallOver OR bAllowKidnapCutscene OR bForcePassOnShitskip IF CAN_ADVANCE_MISSION() OR bForcePassOnShitskip IF HAS_CUTSCENE_LOADED_WITH_FAILSAFE() bRunningCutscene = TRUE ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF ELSE IF NOT bDoingChopPull IF NOT bFoundBadGuy //DO_FOUND_CUTSCENE() ELSE DO_KIDNAP_CUTSCENE() ENDIF ELSE DO_CHOP_PULL_CUTSCENE() ENDIF ENDIF ENDPROC // let bad guy out cutscene PROC DO_LET_OUT_CUTSCENE() SET_ALL_RANDOM_PEDS_FLEE_THIS_FRAME(PLAYER_ID()) SWITCH cutsceneStage CASE H_CUT_STAGE_INIT IF NOT bStartedLetOutCutscene REMOVE_MISSION_TEXT(FALSE, TRUE, FALSE) SET_PLAYER_CONTROL(PLAYER_ID(), FALSE, SPC_LEAVE_CAMERA_CONTROL_ON) iStartedLetOutCutsceneTime = GET_GAME_TIMER() bStartedLetOutCutscene = TRUE ELSE IF NOT bDoneGetOutSpeech BOOL bPlayAsPreloaded bPlayAsPreloaded = FALSE IF NOT bKilledPreloadSpeech IF GET_IS_PRELOADED_CONVERSATION_READY() bPlayAsPreloaded = TRUE ENDIF ENDIF IF bPlayAsPreloaded BEGIN_PRELOADED_CONVERSATION() PRINTSTRING("played speech as preloaded") PRINTNL() iStartedLetOutCutsceneTime = GET_GAME_TIMER() bDoneGetOutSpeech = TRUE ELSE IF DO_MISSION_SPEECH("FKN0_OPEN") PRINTSTRING("played speech as normal") PRINTNL() iStartedLetOutCutsceneTime = GET_GAME_TIMER() bDoneGetOutSpeech = TRUE ENDIF ENDIF ELSE IF IS_SCRIPTED_CONVERSATION_LOADED() PRINTSTRING("loaded convo") PRINTNL() ELSE PRINTSTRING("not yet loaded convo") PRINTNL() ENDIF IF (GET_GAME_TIMER() >= iStartedLetOutCutsceneTime + 1800 AND IS_SCRIPTED_CONVERSATION_LOADED()) OR GET_GAME_TIMER() >= iStartedLetOutCutsceneTime + 5000 // early-out SET_MISSION_CUTSCENE(TRUE, TRUE, -1, TRUE, FALSE) //CREATE_CAM_ATTACHED_TO_VAN(VAN_CAMERA_FRONT) CREATE_MISSION_ANIM_CAM() iSyncScene = CREATE_SYNCHRONIZED_SCENE(<<0,0,0>>, <<0,0,0>>) IF IS_VEHICLE_DRIVEABLE(hoodVehicle[HV_FRANKLIN_VAN]) ATTACH_SYNCHRONIZED_SCENE_TO_ENTITY(iSyncScene, hoodVehicle[HV_FRANKLIN_VAN], GET_ENTITY_BONE_INDEX_BY_NAME(hoodVehicle[HV_FRANKLIN_VAN], "seat_dside_f")) PLAY_SYNCHRONIZED_CAM_ANIM(animCam, iSyncScene, "incar_phonesnatch_cam", GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_DRIVE_HOME)) ENDIF SET_SYNCHRONIZED_SCENE_HOLD_LAST_FRAME(iSyncScene, FALSE) SET_PED_CAN_PLAY_GESTURE_ANIMS(PLAYER_PED_ID(), FALSE) VECTOR vVanRear vVanRear = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(hoodVehicle[HV_FRANKLIN_VAN], <<0,-3.1,-0.75>>) CLEAR_AREA(vVanRear, 2.5, TRUE) CLEAR_AREA_OF_PROJECTILES(vVanRear, 20) STOP_FIRE_IN_RANGE(vVanRear, 8) REMOVE_PARTICLE_FX_IN_RANGE(vVanRear, 8) IF NOT IS_PED_INJURED(lamarPed) TASK_LOOK_AT_ENTITY(PLAYER_PED_ID(), lamarPed, -1, SLF_WHILE_NOT_IN_FOV | SLF_SLOW_TURN_RATE) ENDIF IF IS_VEHICLE_DRIVEABLE(hoodVehicle[HV_FRANKLIN_VAN]) AND NOT IS_PED_INJURED(runnerChaseProperties.ped) SET_VEHICLE_INTERIORLIGHT(hoodVehicle[HV_FRANKLIN_VAN],TRUE) SET_VEHICLE_ON_GROUND_PROPERLY(hoodVehicle[HV_FRANKLIN_VAN]) // clear position behind van CLEAR_AREA(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(hoodVehicle[HV_FRANKLIN_VAN], <<0,0,-8>>), 7.0, TRUE) iSpeedZone = ADD_ROAD_NODE_SPEED_ZONE(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(hoodVehicle[HV_FRANKLIN_VAN], <<0,0,-10>>), 10.0, 0.0) STOP_VEHICLE_FIRE(hoodVehicle[HV_FRANKLIN_VAN]) ENDIF bDoneFlash = FALSE iHoodCutsceneTime = GET_GAME_TIMER() cutsceneStage = H_CUT_STAGE_RUNNING ENDIF ENDIF ENDIF BREAK CASE H_CUT_STAGE_RUNNING #IF IS_DEBUG_BUILD //DO_DEBUG_VAN_CAM_POSITION() #ENDIF DO_CHOP_AUDIO(CHOP_AUDIO_STATE_IN_VAN_GUARDING) IF NOT IS_PED_INJURED(runnerChaseProperties.ped) AND IS_VEHICLE_DRIVEABLE(hoodVehicle[HV_FRANKLIN_VAN]) SWITCH letOutShot CASE LET_OUT_PHONE BOOL bNextShot bNextShot = FALSE IF NOT IS_SYNCHRONIZED_SCENE_RUNNING(iSyncScene) bNextShot = TRUE ELSE IF GET_SYNCHRONIZED_SCENE_PHASE(iSyncScene) >= 0.98 bNextShot = TRUE ENDIF ENDIF IF bNextShot //bloodPTFX = START_PARTICLE_FX_LOOPED_ON_PED_BONE("scr_franklin0_leg_blood", runnerChaseProperties.ped, <<0,0,0>>, <<0,0,0>>, BONETAG_L_FOREARM) TASK_CLEAR_LOOK_AT(runnerChaseProperties.ped) //vRunnerAttachToVanPos = GET_ANIM_INITIAL_OFFSET_POSITION(GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_DRIVE_HOME), "Incar_GetOutofBack_Ballas", <<0,0,0>>, <<0,0,0>>, 0) //vRunnerAttachToVanRot = GET_ANIM_INITIAL_OFFSET_ROTATION(GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_DRIVE_HOME), "Incar_GetOutofBack_Ballas", <<0,0,0>>, <<0,0,0>>, 0) //ATTACH_BALLA_TO_VAN(TRUE) SET_ENTITY_COORDS(runnerChaseProperties.ped, GET_ENTITY_COORDS(runnerChaseProperties.ped)) //TASK_PLAY_ANIM(runnerChaseProperties.ped, GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_DRIVE_HOME), "InCar_GetOutofBack_Ballas", INSTANT_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_EXTRACT_INITIAL_OFFSET | AF_FORCE_START) runnerChaseProperties.iSyncScene = CREATE_SYNCHRONIZED_SCENE(<<0,0,0>>,<<0,0,0>>) ATTACH_SYNCHRONIZED_SCENE_TO_ENTITY(runnerChaseProperties.iSyncScene, hoodVehicle[HV_FRANKLIN_VAN], 0) TASK_SYNCHRONIZED_SCENE(runnerChaseProperties.ped, runnerChaseProperties.iSyncScene, GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_DRIVE_HOME), "InCar_GetOutofBack_Ballas", INSTANT_BLEND_IN, NORMAL_BLEND_OUT) SET_SYNCHRONIZED_SCENE_HOLD_LAST_FRAME(runnerChaseProperties.iSyncScene, FALSE) FORCE_PED_AI_AND_ANIMATION_UPDATE(runnerChaseProperties.ped) TASK_VEHICLE_PLAY_ANIM(hoodVehicle[HV_FRANKLIN_VAN], GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_DRIVE_HOME), "InCar_GetOutofBack_Speedo") //PLAY_ENTITY_ANIM(hoodVehicle[HV_FRANKLIN_VAN], "InCar_GetOutofBack_Speedo", GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_DRIVE_HOME), INSTANT_BLEND_IN, FALSE, FALSE) FORCE_ENTITY_AI_AND_ANIMATION_UPDATE(hoodVehicle[HV_FRANKLIN_VAN]) iSyncScene = CREATE_SYNCHRONIZED_SCENE(<<0,0,0>>, <<0,0,0>>) ATTACH_SYNCHRONIZED_SCENE_TO_ENTITY(iSyncScene, hoodVehicle[HV_FRANKLIN_VAN], 0) PLAY_SYNCHRONIZED_CAM_ANIM(animCam, iSyncScene, "Incar_GetOutofBack_CAM", GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_DRIVE_HOME)) SET_SYNCHRONIZED_SCENE_HOLD_LAST_FRAME(iSyncScene, FALSE) //CREATE_CAM_ATTACHED_TO_VAN(VAN_CAMERA_REAR) iLetOutShotTime = GET_GAME_TIMER() letOutShot = LET_OUT_DOOR ENDIF BREAK CASE LET_OUT_DOOR MAINTAIN_BAD_GUY_FLEE() BREAK ENDSWITCH ENDIF // IF NOT bKilledConversationOnLetOut // IF GET_GAME_TIMER() >= iHoodCutsceneTime + 5000 // KILL_ANY_CONVERSATION() // bKilledConversationOnLetOut = TRUE // ENDIF //ENDIF //IF GET_GAME_TIMER() >= iHoodCutsceneTime + 6500 //AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() IF letOutShot = LET_OUT_DOOR BOOL bNextShot bNextShot = FALSE IF NOT IS_SYNCHRONIZED_SCENE_RUNNING(iSyncScene) IF GET_GAME_TIMER() >= iLetOutShotTime + 100 bNextShot = TRUE ENDIF ELSE printstring("here1") printnl() FLOAT fPhase fPhase = GET_SYNCHRONIZED_SCENE_PHASE(iSyncScene) IF NOT bDoneFlash IF GET_FOLLOW_VEHICLE_CAM_VIEW_MODE() = CAM_VIEW_MODE_FIRST_PERSON IF fPhase >= 0.276 PRINTSTRING("start time = ") PRINTINT(GET_GAME_TIMER() - iLetOutShotTime) PRINTNL() ANIMPOSTFX_PLAY("CamPushInNeutral", 0, FALSE) PLAY_SOUND_FRONTEND(-1, "1st_Person_Transition", "PLAYER_SWITCH_CUSTOM_SOUNDSET") bDoneFlash = TRUE ENDIF ENDIF ENDIF IF IS_VEHICLE_DRIVEABLE(hoodVehicle[HV_FRANKLIN_VAN]) printstring("here2") printnl() IF NOT bShutLDoor IF fPhase >= 0.25 //SET_VEHICLE_DOOR_SHUT(hoodVehicle[HV_FRANKLIN_VAN], SC_DOOR_REAR_LEFT, FALSE) bShutLDoor = TRUE ENDIF ENDIF IF NOT bShutRDoor printstring("here3") printnl() IF fPhase >= 0.21 //IF IS_ENTITY_PLAYING_ANIM(hoodVehicle[HV_FRANKLIN_VAN], GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_DRIVE_HOME), "Incar_GetOutofBack_Speedo") printstring("here4") printnl() //STOP_ENTITY_ANIM(hoodVehicle[HV_FRANKLIN_VAN], "Incar_GetOutofBack_Speedo", GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_DRIVE_HOME), INSTANT_BLEND_OUT) //ENDIF //SET_VEHICLE_DOOR_SHUT(hoodVehicle[HV_FRANKLIN_VAN], SC_DOOR_REAR_RIGHT, FALSE) bShutRDoor = TRUE ENDIF ENDIF ENDIF IF fPhase >= 0.30 bNextShot = TRUE ENDIF ENDIF IF bNextShot cutsceneStage = H_CUT_STAGE_CLEANUP ENDIF ENDIF HANDLE_SKIP_CUTSCENE() BREAK CASE H_CUT_STAGE_CLEANUP PRINTSTRING("end time = ") PRINTINT(GET_GAME_TIMER() - iLetOutShotTime) PRINTNL() STOP_HOOD_AUDIO_SCENE(HOOD_AUDIO_SCENE_DRIVE_TO_LAMARS) START_HOOD_AUDIO_SCENE(HOOD_AUDIO_SCENE_TAKE_LAMAR_BACK) TOGGLE_CAR_MOD_SHOPS_UNAVAILABLE(FALSE) REMOVE_ROAD_NODE_SPEED_ZONE(iSpeedZone) SET_PED_CAN_PLAY_GESTURE_ANIMS(PLAYER_PED_ID(), TRUE) IF NOT IS_PED_INJURED(lamarPed) CLEAR_PED_TASKS(lamarPed) SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(lamarPed, FALSE) SET_PED_COMBAT_ATTRIBUTES(lamarPed, CA_LEAVE_VEHICLES, FALSE) ENDIF IF NOT IS_PED_INJURED(PLAYER_PED_ID()) CLEAR_PED_TASKS(PLAYER_PED_ID()) ENDIF IF IS_VEHICLE_DRIVEABLE(hoodVehicle[HV_FRANKLIN_VAN]) SET_VEHICLE_INTERIORLIGHT(hoodVehicle[HV_FRANKLIN_VAN],FALSE) IF NOT IS_PED_INJURED(runnerChaseProperties.ped) IF IS_ENTITY_ATTACHED(runnerChaseProperties.ped) AND NOT IS_PED_IN_ANY_VEHICLE(runnerChaseProperties.ped) DETACH_ENTITY(runnerChaseProperties.ped) ENDIF IF bSkippedCutscene CLEAR_PED_TASKS_IMMEDIATELY(runnerChaseProperties.ped) SET_ENTITY_COORDS(runnerChaseProperties.ped, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(hoodVehicle[HV_FRANKLIN_VAN], <<0,-3.1,-0.75>>)) SET_ENTITY_HEADING(runnerChaseProperties.ped, GET_ENTITY_HEADING(hoodVehicle[HV_FRANKLIN_VAN]) - 180) IF IS_ENTITY_PLAYING_ANIM(hoodVehicle[HV_FRANKLIN_VAN], GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_DRIVE_HOME), "InCar_GetOutofBack_Speedo") STOP_ENTITY_ANIM(hoodVehicle[HV_FRANKLIN_VAN], "InCar_GetOutofBack_Speedo", GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_DRIVE_HOME), INSTANT_BLEND_OUT) SET_VEHICLE_DOOR_SHUT(hoodVehicle[HV_FRANKLIN_VAN], SC_DOOR_REAR_LEFT) SET_VEHICLE_DOOR_SHUT(hoodVehicle[HV_FRANKLIN_VAN], SC_DOOR_REAR_RIGHT) ENDIF ENDIF FORCE_PED_MOTION_STATE(runnerChaseProperties.ped, MS_ON_FOOT_RUN, TRUE, FAUS_CUTSCENE_EXIT) SET_PED_MIN_MOVE_BLEND_RATIO(runnerChaseProperties.ped, PEDMOVE_RUN) TASK_FOLLOW_NAV_MESH_TO_COORD(runnerChaseProperties.ped, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(hoodVehicle[HV_FRANKLIN_VAN], <<0,-12.0,0.4>>), PEDMOVE_RUN) //SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(runnerChaseProperties.ped, FALSE) SET_PED_RELATIONSHIP_GROUP_HASH(runnerChaseProperties.ped, RELGROUPHASH_AMBIENT_GANG_BALLAS) iRestoreBadGuyDamageTime = GET_GAME_TIMER() + 6000 //FORCE_PED_AI_AND_ANIMATION_UPDATE(runnerChaseProperties.ped) ENDIF ENDIF IF DOES_ENTITY_EXIST(lamarPhoneObject) //DELETE_OBJECT(lamarPhoneObject) ENDIF lamarPhoneState = LAMAR_PHONE_STATE_DONE REMOVE_ALL_BLIPS() IF NOT IS_PED_INJURED(runnerChaseProperties.ped) ENDIF bShownGodText = FALSE bDoneGotoSpeech = FALSE iGetInTextStage = 2 bShouldDoGetInText = TRUE SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 0) SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID()) // back to gameplay //SET_MISSION_CUTSCENE(FALSE) IF bSkippedCutscene SET_MISSION_CUTSCENE(FALSE) ELSE COMMON_MISSION_CUTSCENE_BLENDOUT(0, CAM_SPLINE_SLOW_IN_OUT_SMOOTH, TRUE) ENDIF bDoneLetOut = TRUE bRunningCutscene = FALSE BREAK ENDSWITCH ENDPROC // dropoff cutscene PROC DO_DROPOFF_CUTSCENE() SET_ALL_RANDOM_PEDS_FLEE_THIS_FRAME(PLAYER_ID()) SWITCH cutsceneStage CASE H_CUT_STAGE_INIT //SET_MISSION_CUTSCENE(TRUE) iHoodCutsceneTime = GET_GAME_TIMER() // clear the area IF NOT IS_PED_INJURED(PLAYER_PED_ID()) REGISTER_ENTITY_FOR_CUTSCENE(PLAYER_PED_ID(), "Franklin", CU_ANIMATE_EXISTING_SCRIPT_ENTITY) ENDIF IF NOT IS_PED_INJURED(lamarPed) TASK_CLEAR_LOOK_AT(lamarPed) REGISTER_ENTITY_FOR_CUTSCENE(lamarPed, "Lamar", CU_ANIMATE_EXISTING_SCRIPT_ENTITY) ENDIF IF NOT IS_PED_INJURED(chopPed) DETACH_ENTITY(chopPed) REGISTER_ENTITY_FOR_CUTSCENE(chopPed, "Chop", CU_ANIMATE_EXISTING_SCRIPT_ENTITY) ENDIF IF IS_VEHICLE_DRIVEABLE(hoodVehicle[HV_FRANKLIN_VAN]) REGISTER_ENTITY_FOR_CUTSCENE(hoodVehicle[HV_FRANKLIN_VAN], "Kidnapping_van", CU_ANIMATE_EXISTING_SCRIPT_ENTITY) ENDIF START_CUTSCENE() REPLAY_START_EVENT(REPLAY_IMPORTANCE_HIGHEST) SET_CUTSCENE_FADE_VALUES(FALSE, FALSE, FALSE, FALSE) cutsceneStage = H_CUT_STAGE_RUNNING BREAK CASE H_CUT_STAGE_RUNNING IF NOT bClearedForCutscene IF IS_CUTSCENE_PLAYING() SET_MISSION_MOCAP_CUTSCENE() // clear the area CLEAR_AREA(<<-214.27998, -1488.48682, 30.23007>>, 8.7, TRUE) CLEAR_AREA_OF_PROJECTILES(<<-217.50893, -1498.44348, 30.23968>>, 15) STOP_FIRE_IN_RANGE(<<-217.50893, -1498.44348, 30.23968>>, 15) REMOVE_PARTICLE_FX_IN_RANGE(<<-217.50893, -1498.44348, 30.23968>>, 15) IF DOES_ENTITY_EXIST(runnerChaseProperties.ped) DELETE_PED(runnerChaseProperties.ped) ENDIF IF IS_VEHICLE_DRIVEABLE(hoodVehicle[HV_FRANKLIN_VAN]) SET_VEHICLE_DOOR_CONTROL(hoodVehicle[HV_FRANKLIN_VAN], SC_DOOR_FRONT_RIGHT, DT_DOOR_INTACT, 0.0) SET_VEHICLE_DOOR_CONTROL(hoodVehicle[HV_FRANKLIN_VAN], SC_DOOR_REAR_RIGHT, DT_DOOR_INTACT, 0.0) SET_VEHICLE_DOOR_CONTROL(hoodVehicle[HV_FRANKLIN_VAN], SC_DOOR_REAR_LEFT, DT_DOOR_INTACT, 0.0) ENDIF STOP_VEHICLE_FIRE(hoodVehicle[HV_FRANKLIN_VAN]) SET_FRANKLIN_MASK(FALSE) SET_LAMAR_MASK(FALSE) STOP_HOOD_AUDIO_SCENE(HOOD_AUDIO_SCENE_TAKE_LAMAR_BACK) IF DOES_ENTITY_EXIST(runnerChaseProperties.ped) DELETE_PED(runnerChaseProperties.ped) ENDIF IF IS_SCREEN_FADED_OUT() DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME) ENDIF bClearedForCutscene = TRUE ENDIF ENDIF IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Lamar") //IF DOES_ENTITY_EXIST(lamarPed) // DELETE_PED(lamarPed) //ENDIF IF NOT IS_PED_INJURED(lamarPed) //IF NOT WAS_CUTSCENE_SKIPPED() SET_ENTITY_COORDS(lamarPed, <<-220.96648, -1506.37732, 30.44023>>) SET_ENTITY_HEADING(lamarPed, 152.7) TASK_FOLLOW_WAYPOINT_RECORDING(lamarPed, "hood9", 5) //ELSE // SET_ENTITY_COORDS(lamarPed, <<-220.49052, -1505.15405, 30.63244>>) // SET_ENTITY_HEADING(lamarPed, 159.8) // TASK_FOLLOW_WAYPOINT_RECORDING(lamarPed, "hood9", 5) //ENDIF FORCE_PED_MOTION_STATE(lamarPed, MS_ON_FOOT_WALK, TRUE, FAUS_CUTSCENE_EXIT) ENDIF ENDIF IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Chop") //IF DOES_ENTITY_EXIST(chopPed) // DELETE_PED(chopPed) //ENDIF IF NOT IS_PED_INJURED(chopPed) SET_ENTITY_PROOFS(chopPed, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, TRUE) //IF NOT WAS_CUTSCENE_SKIPPED() SET_ENTITY_COORDS(chopPed, <<-219.74655, -1505.89856, 30.45473>>) SET_ENTITY_HEADING(chopPed, 144.0) TASK_FOLLOW_WAYPOINT_RECORDING(chopPed, "hood10", 5) //ELSE // SET_ENTITY_COORDS(chopPed, <<-219.74655, -1505.89856, 30.45473>>) // SET_ENTITY_HEADING(chopPed, 160.4) // TASK_FOLLOW_WAYPOINT_RECORDING(chopPed, "hood10", 5) //ENDIF FORCE_PED_MOTION_STATE(chopPed, MS_ON_FOOT_RUN, TRUE, FAUS_CUTSCENE_EXIT) ENDIF ENDIF IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Franklin") IF IS_VEHICLE_DRIVEABLE(hoodVehicle[HV_FRANKLIN_VAN]) AND NOT IS_PED_INJURED(PLAYER_PED_ID()) SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), hoodVehicle[HV_FRANKLIN_VAN]) FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID()) ENDIF ENDIF IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Kidnapping_van") IF IS_VEHICLE_DRIVEABLE(hoodVehicle[HV_FRANKLIN_VAN]) SET_VEHICLE_ON_GROUND_PROPERLY(hoodVehicle[HV_FRANKLIN_VAN]) SHUT_ALL_VAN_DOORS() //SET_VEHICLE_ON_GROUND_PROPERLY(hoodVehicle[HV_FRANKLIN_VAN]) ENDIF iLamarOutOfVanTime = GET_GAME_TIMER() bLamarOutOfVan = TRUE ELSE IF NOT bLamarOutOfVan IF IS_VEHICLE_DRIVEABLE(hoodVehicle[HV_FRANKLIN_VAN]) // SET_VEHICLE_USE_CUTSCENE_WHEEL_COMPRESSION(hoodVehicle[HV_FRANKLIN_VAN]) ENDIF ENDIF ENDIF IF CAN_SET_EXIT_STATE_FOR_CAMERA() REPLAY_STOP_EVENT() SET_MISSION_CUTSCENE(FALSE) SET_PLAYER_CONTROL(PLAYER_ID(), FALSE, SPC_LEAVE_CAMERA_CONTROL_ON) ENDIF //IF WAS_CUTSCENE_SKIPPED() // IF CAN_SET_EXIT_STATE_FOR_CAMERA() // ENDIF //ENDIF //IF CAN_SET_EXIT_STATE_FOR_CAMERA() //STOP_RENDERING_SCRIPT_CAMS_USING_CATCH_UP(FALSE) //MISSION_PASSED() //ENDIF #IF IS_DEBUG_BUILD DEBUG_SKIP_MOCAP() #ENDIF BREAK CASE H_CUT_STAGE_CLEANUP BREAK ENDSWITCH ENDPROC // get bad guy back to the house PROC DO_STAGE_GET_TO_HOUSE() // prevent bad guy from playing ambient anims IF NOT IS_PED_INJURED(runnerChaseProperties.ped) SET_PED_CAN_PLAY_AMBIENT_BASE_ANIMS(runnerChaseProperties.ped, FALSE) SET_PED_CAN_PLAY_AMBIENT_ANIMS(runnerChaseProperties.ped, FALSE) ENDIF IF NOT bBlockedCustoms IF GET_GAME_TIMER() >= iStageStartTime + 5000 TOGGLE_CAR_MOD_SHOPS_UNAVAILABLE(TRUE) bBlockedCustoms = TRUE ENDIF ENDIF IF NOT bRunningCutscene IF NOT bLamarOutOfVan IF IS_VEHICLE_DRIVEABLE(hoodVehicle[HV_FRANKLIN_VAN]) // handle chop audio IF bInLoseWantedState DO_CHOP_AUDIO(CHOP_AUDIO_STATE_IN_VAN_AGITATED) ELIF dropoffStage = DROPOFF_STAGE_END IF NOT IS_PED_INJURED(runnerChaseProperties.ped) AND IS_ENTITY_ATTACHED_TO_ANY_VEHICLE(runnerChaseProperties.ped) DO_CHOP_AUDIO(CHOP_AUDIO_STATE_IN_VAN_GUARDING) ELSE DO_CHOP_AUDIO(CHOP_AUDIO_STATE_IN_VAN_PLACID) ENDIF ELSE DO_CHOP_AUDIO(CHOP_AUDIO_STATE_IN_VAN_GUARDING) ENDIF // restore bad guy damage after letting him out IF NOT bRestoredBadGuyDamage IF bDoneLetOut IF GET_GAME_TIMER() >= iRestoreBadGuyDamageTime IF NOT IS_PED_INJURED(runnerChaseProperties.ped) SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(runnerChaseProperties.ped, TRUE) bRestoredBadGuyDamage = TRUE ENDIF ENDIF ENDIF ENDIF // wanted reactions INT iWantedLevel = GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) IF iWantedLevel > 0 IF NOT bCutsceneWaitStarted IF bDoneLoseWantedSpeech IF dropoffStage <= DROPOFF_STAGE_STOP_VAN DO_RANDOM_SPEECH("FC_LOSECOP", -1, 16000, 28000) ENDIF ENDIF ENDIF ENDIF SWITCH dropoffStage CASE DROPOFF_STAGE_NOT_STARTED IF iWantedLevel = 0 IF IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), hoodVehicle[HV_FRANKLIN_VAN]) IF NOT bDoneTrainingSpeech STRING sSpeech SWITCH chopBehaviour CASE CHOP_BEHAVIOUR_BAD sSpeech = "FKN0_VAN3" BREAK CASE CHOP_BEHAVIOUR_MEDIUM sSpeech = "FKN0_VAN2" BREAK CASE CHOP_BEHAVIOUR_GOOD sSpeech = "FKN0_VAN1" BREAK ENDSWITCH IF DO_MISSION_SPEECH(sSpeech) bDoneTrainingSpeech = TRUE ENDIF ELSE IF DO_MISSION_SPEECH("FKN0_GOLAM") bDoneGotoSpeech = TRUE dropoffStage = DROPOFF_STAGE_BRIEF ENDIF ENDIF ENDIF ENDIF HANDLE_IN_CAR_PROMPTS(TRUE, FALSE, TRUE) BREAK CASE DROPOFF_STAGE_BRIEF IF iWantedLevel = 0 IF bShownGodText IF IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), hoodVehicle[HV_FRANKLIN_VAN]) STRING sBanterSpeech IF iReplayAttempt % 2 = 0 sBanterSpeech = "FKN0_B2AV1" ELSE sBanterSpeech = "FKN0_B2AV2" ENDIF IF DO_MISSION_SPEECH(sBanterSpeech) dropoffStage = DROPOFF_STAGE_BANTER ENDIF ENDIF ENDIF ENDIF HANDLE_IN_CAR_PROMPTS(TRUE, FALSE, TRUE) BREAK CASE DROPOFF_STAGE_BANTER IF iWantedLevel = 0 IF IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), hoodVehicle[HV_FRANKLIN_VAN]) IF bSavedBanter IF RESTORE_BANTER() bSavedBanter = FALSE ENDIF ELSE STRING sMakeCallSpeech IF iReplayAttempt % 2 = 0 sMakeCallSpeech = "FKN0_MKCALL" ELSE sMakeCallSpeech = "FKN0_MKCALL2" ENDIF IF DO_MISSION_SPEECH(sMakeCallSpeech) dropoffStage = DROPOFF_STAGE_PRE_CALL ENDIF ENDIF ENDIF ENDIF HANDLE_IN_CAR_PROMPTS(TRUE, FALSE, TRUE) BREAK CASE DROPOFF_STAGE_PRE_CALL IF iWantedLevel = 0 IF IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), hoodVehicle[HV_FRANKLIN_VAN]) AND lamarPhoneState >= LAMAR_PHONE_STATE_ON_PHONE STRING sCallSpeech IF iReplayAttempt % 2 = 0 sCallSpeech = "FKN0_LACALL" ELSE sCallSpeech = "FKN0_LACALL2" ENDIF IF DO_MISSION_SPEECH(sCallSpeech) REPLAY_RECORD_BACK_FOR_TIME(1.5, 11.0, REPLAY_IMPORTANCE_HIGH) dropoffStage = DROPOFF_STAGE_CALL ENDIF ENDIF ENDIF HANDLE_IN_CAR_PROMPTS(TRUE, FALSE, TRUE) BREAK CASE DROPOFF_STAGE_CALL IF iWantedLevel = 0 IF IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), hoodVehicle[HV_FRANKLIN_VAN]) STRING sAfterCallSpeech IF iReplayAttempt % 2 = 0 sAfterCallSpeech = "FKN0_AFCALL" ELSE sAfterCallSpeech = "FKN0_AFCALL2" ENDIF IF DO_MISSION_SPEECH(sAfterCallSpeech) //REMOVE_ALL_BLIPS() dropoffStage = DROPOFF_STAGE_POST_CALL ENDIF ENDIF ENDIF HANDLE_IN_CAR_PROMPTS(NOT (dropoffStage = DROPOFF_STAGE_POST_CALL), FALSE, TRUE) BREAK CASE DROPOFF_STAGE_POST_CALL IF iWantedLevel = 0 IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() IF IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), hoodVehicle[HV_FRANKLIN_VAN]) REMOVE_ALL_BLIPS() iLetOutPromptTime = GET_GAME_TIMER() iNextRandomSpeechTime = GET_GAME_TIMER() + 15000 PRELOAD_CONVERSATION(hoodConversation, "FKN0AUD", "FKN0_OPEN", CONV_PRIORITY_MEDIUM) dropoffStage = DROPOFF_STAGE_STOP_VAN ENDIF ENDIF ENDIF HANDLE_IN_CAR_PROMPTS(FALSE, FALSE, TRUE) BREAK CASE DROPOFF_STAGE_STOP_VAN BOOL bDisplayHelp bDisplayHelp = FALSE IF NOT bKilledPreloadSpeech IF GET_GAME_TIMER() >= iNextRandomSpeechTime OR NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) KILL_ANY_CONVERSATION() bKilledPreloadSpeech = TRUE ENDIF ENDIF IF IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), hoodVehicle[HV_FRANKLIN_VAN]) DO_RANDOM_SPEECH("FKN0_STOP", -1, 15000, 25000, TRUE) ENDIF IF iWantedLevel = 0 iLoseWantedTime = -1 IF bDoingDistantSiren DISTANT_COP_CAR_SIRENS(FALSE) bDoingDistantSiren = FALSE ENDIF IF GET_GAME_TIMER() >= iLetOutPromptTime + 22000 SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 2) SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID()) SET_WANTED_LEVEL_DIFFICULTY(PLAYER_ID(), 0) ELSE // figure out whether in a suitable spot to get out FLOAT fLastGroundHeight FLOAT fThisGroundHeight GET_GROUND_Z_FOR_3D_COORD(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(hoodVehicle[HV_FRANKLIN_VAN], <<0,-2, 0>>), fLastGroundHeight) IF GET_ENTITY_SPEED(hoodVehicle[HV_FRANKLIN_VAN]) <= 0.5 AND IS_ENTITY_UPRIGHT(hoodVehicle[HV_FRANKLIN_VAN]) iDoLetOutPromptTime = GET_GAME_TIMER() //PRINTSTRING("THIS HEIGHT 0 = ") PRINTFLOAT(fLastGroundHeight) PRINTNL() BOOL bOKToGetOut bOKToGetOut = TRUE VECTOR vBallaPos vBallaPos = GET_ENTITY_COORDS(runnerChaseProperties.ped) INT i FOR i=1 TO 5 IF bOKToGetOut VECTOR vThisCoord vThisCoord = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(hoodVehicle[HV_FRANKLIN_VAN], <<0,-2 - (i*0.6), 0>>) GET_GROUND_Z_FOR_3D_COORD(vThisCoord, fThisGroundHeight) //PRINTSTRING("THIS HEIGHT ") PRINTINT(i) PRINTSTRING(" = ") PRINTFLOAT(fThisGroundHeight) PRINTNL() FLOAT fDiff fDiff = fThisGroundHeight - fLastGroundHeight IF fDiff < 0 fDiff *= -1 ENDIF IF fDiff > 0.5 bOKToGetOut = FALSE ENDIF fLastGroundHeight = fThisGroundHeight IF fLastGroundHeight < vBallaPos.z - 2.0 bOKToGetOut = FALSE ENDIF ENDIF ENDFOR SWITCH shapeTestState CASE SHAPE_TEST_STATE_NOT_STARTED //PRINTSTRING("start shape test") printnl() VECTOR vTestOffset VECTOR vVanCoords vVanCoords = GET_ENTITY_COORDS(hoodVehicle[HV_FRANKLIN_VAN]) vTestOffset = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(hoodVehicle[HV_FRANKLIN_VAN], <<0,-5,0>>) vTestOffset.z = vTestOffset.z bBackBlocked = TRUE vanShapeTest = START_SHAPE_TEST_CAPSULE(vVanCoords, vTestOffset, 0.5, SCRIPT_INCLUDE_MOVER, hoodVehicle[HV_FRANKLIN_VAN]) shapeTestState = SHAPE_TEST_STATE_WAITING BREAK CASE SHAPE_TEST_STATE_WAITING //PRINTSTRING("waiting on shape test") printnl() SHAPETEST_STATUS shapeTestResult INT iHitSomething VECTOR vPos VECTOR vNormal ENTITY_INDEX hitEntity shapeTestResult = GET_SHAPE_TEST_RESULT(vanShapeTest, iHitSomething, vPos, vNormal, hitEntity) IF shapeTestResult = SHAPETEST_STATUS_RESULTS_READY //PRINTSTRING("shape test results ready") printnl() IF iHitSomething = 0 //PRINTSTRING("didn't hit!") printnl() bBackBlocked = FALSE shapeTestState = SHAPE_TEST_STATE_NOT_STARTED ELSE bBackBlocked = TRUE //PRINTSTRING("hit something!") printnl() shapeTestState = SHAPE_TEST_STATE_NOT_STARTED ENDIF ELIF shapeTestResult = SHAPETEST_STATUS_NONEXISTENT //PRINTSTRING("reset shape test") printnl() bBackBlocked = TRUE shapeTestState = SHAPE_TEST_STATE_NOT_STARTED ENDIF BREAK ENDSWITCH IF bBackBlocked OR NOT bOKToGetOut OR IS_ENTITY_IN_WATER(hoodVehicle[HV_FRANKLIN_VAN]) fDisplayBadPositionTime = fDisplayBadPositionTime +@ 1.0 IF fDisplayBadPositionTime >= 1.0 bDisplayHelp = TRUE ENDIF ELSE fDisplayBadPositionTime = 0.0 ENDIF IF IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), hoodVehicle[HV_FRANKLIN_VAN]) AND lamarPhoneState >= LAMAR_PHONE_STATE_POST_CALL AND CAN_ADVANCE_MISSION() AND IS_ENTITY_UPRIGHT(hoodVehicle[HV_FRANKLIN_VAN], 10) AND bOKToGetOut AND NOT bBackBlocked AND NOT IS_ENTITY_IN_WATER(hoodVehicle[HV_FRANKLIN_VAN]) IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() OR NOT bKilledPreloadSpeech IF GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) = 0 SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 0) SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID()) ENDIF dropoffStage = DROPOFF_STAGE_END CLEAR_HELP() bRunningCutscene = TRUE ENDIF ENDIF ELSE bBackBlocked = TRUE fDisplayBadPositionTime = 0.0 IF NOT bShownLetOutPrompt RESET_WANTED_LEVEL_DIFFICULTY(PLAYER_ID()) iLetOutPromptTime = GET_GAME_TIMER() iNextRandomSpeechTime = GET_GAME_TIMER() + 11000 bShownLetOutPrompt = TRUE ELSE IF IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), hoodVehicle[HV_FRANKLIN_VAN]) IF GET_GAME_TIMER() >= iDoLetOutPromptTime + 300 DO_MISSION_GOD_TEXT("FC_LETOUT", TRUE, NOT bKilledPreloadSpeech, 100) ENDIF ENDIF ENDIF ENDIF ENDIF ELSE IF NOT bDoingDistantSiren DISTANT_COP_CAR_SIRENS(TRUE) bDoingDistantSiren = TRUE ENDIF IF NOT bDonePoliceReport PLAY_POLICE_REPORT("SCRIPTED_SCANNER_REPORT_FRANLIN_0_KIDNAP", 0.0) bDonePoliceReport = TRUE ENDIF bBackBlocked = TRUE bShownLetOutPrompt = FALSE iLetOutPromptTime = GET_GAME_TIMER() ENDIF IF bDisplayHelp IF NOT IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("FC_POSHLP") PRINT_HELP_FOREVER("FC_POSHLP") ENDIF ELSE IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("FC_POSHLP") CLEAR_HELP(TRUE) ENDIF ENDIF IF NOT bRunningCutscene HANDLE_IN_CAR_PROMPTS(FALSE, FALSE, TRUE) ENDIF BREAK CASE DROPOFF_STAGE_END IF NOT bStoppedVanAnim DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_EXIT) IF IS_ENTITY_PLAYING_ANIM(hoodVehicle[HV_FRANKLIN_VAN], GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_DRIVE_HOME), "InCar_GetOutofBack_Speedo") //PRINTFLOAT(GET_ENTITY_ANIM_CURRENT_TIME(hoodVehicle[HV_FRANKLIN_VAN], GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_DRIVE_HOME), "InCar_GetOutofBack_Speedo")) PRINTNL() IF GET_ENTITY_ANIM_CURRENT_TIME(hoodVehicle[HV_FRANKLIN_VAN], GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_DRIVE_HOME), "InCar_GetOutofBack_Speedo") >= 0.33 STOP_ENTITY_ANIM(hoodVehicle[HV_FRANKLIN_VAN], "InCar_GetOutofBack_Speedo", GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_DRIVE_HOME), INSTANT_BLEND_OUT) SET_VEHICLE_DOOR_SHUT(hoodVehicle[HV_FRANKLIN_VAN], SC_DOOR_REAR_LEFT) SET_VEHICLE_DOOR_SHUT(hoodVehicle[HV_FRANKLIN_VAN], SC_DOOR_REAR_RIGHT) REPLAY_RECORD_BACK_FOR_TIME(8.0, 8.0, REPLAY_IMPORTANCE_HIGHEST) bStoppedVanAnim = TRUE ENDIF ELSE bStoppedVanAnim = TRUE ENDIF ENDIF IF NOT bCleanedUpPhone IF DOES_ENTITY_EXIST(lamarPhoneObject) IF NOT IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), lamarPhoneObject, <<100,100,100>>, FALSE, FALSE) SET_OBJECT_AS_NO_LONGER_NEEDED(lamarPhoneObject) CLEAR_MODEL_REQUEST(ENUM_TO_INT(HM_LAMAR_PHONE)) bCleanedUpPhone = TRUE ENDIF ENDIF ENDIF IF NOT bCleanedUpBalla IF DOES_ENTITY_EXIST(runnerChaseProperties.ped) IF NOT IS_PED_INJURED(runnerChaseProperties.ped) IF NOT IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), runnerChaseProperties.ped, <<150,150,150>>, FALSE, FALSE) IF NOT IS_ENTITY_ON_SCREEN(runnerChaseProperties.ped) SET_PED_AS_NO_LONGER_NEEDED(runnerChaseProperties.ped) CLEAR_MODEL_REQUEST(ENUM_TO_INT(HM_BAD_GUY)) bCleanedUpBalla = TRUE ENDIF ENDIF ENDIF ENDIF ENDIF IF franklinMaskRemoveState <> FRANKLIN_MASK_REMOVE_STATE_DONE FLOAT fMaskPhase IF franklinMaskRemoveState > FRANKLIN_MASK_REMOVE_STATE_NOT_STARTED IF IS_ENTITY_PLAYING_ANIM(PLAYER_PED_ID(), GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_DRIVE_HOME), "Take_off_Bandana") fMaskPhase = GET_ENTITY_ANIM_CURRENT_TIME(PLAYER_PED_ID(), GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_DRIVE_HOME), "Take_off_Bandana") ELSE IF GET_GAME_TIMER() >= iFranklinMaskRemoveTime + 500 SET_FRANKLIN_MASK(FALSE) IF DOES_ENTITY_EXIST(franklinBandanaObject) DELETE_OBJECT(franklinBandanaObject) ENDIF franklinMaskRemoveState = FRANKLIN_MASK_REMOVE_STATE_DONE ENDIF ENDIF ENDIF SWITCH franklinMaskRemoveState CASE FRANKLIN_MASK_REMOVE_STATE_NOT_STARTED BOOL bCanRemoveMask bCanRemoveMask = FALSE IF IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), hoodVehicle[HV_FRANKLIN_VAN]) IF NOT IS_PED_INJURED(runnerChaseProperties.ped) IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), GET_HOOD_VECTOR(HVEC_REC), <<120,120,120>>, FALSE, FALSE) OR NOT IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), runnerChaseProperties.ped, <<75,75,75>>, FALSE, FALSE) bCanRemoveMask = TRUE ENDIF ELSE bCanRemoveMask = TRUE ENDIF IF bCanRemoveMask IF GET_FOLLOW_VEHICLE_CAM_VIEW_MODE() <> CAM_VIEW_MODE_FIRST_PERSON TASK_PLAY_ANIM(PLAYER_PED_ID(), GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_DRIVE_HOME), "Take_off_Bandana", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_UPPERBODY | AF_SECONDARY) FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID()) franklinBandanaObject = CREATE_OBJECT(GET_MODEL_FOR_HOOD_MODEL_ENUM(HM_FRANKLIN_MASK), <<0,1,2>>) SET_ENTITY_VISIBLE(franklinBandanaObject, FALSE) ATTACH_ENTITY_TO_ENTITY(franklinBandanaObject, PLAYER_PED_ID(), GET_PED_BONE_INDEX(PLAYER_PED_ID(), BONETAG_PH_L_HAND), <<0.0, 0.0, 0.0>>, <<0.0, 0.0, 0.0>>) PLAY_ENTITY_ANIM(franklinBandanaObject, "take_off_bandana_bandana", GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_DRIVE_HOME), NORMAL_BLEND_IN, FALSE, FALSE) iFranklinMaskRemoveTime = GET_GAME_TIMER() franklinMaskRemoveState = FRANKLIN_MASK_REMOVE_STATE_PLAYING_ANIM ELSE SET_FRANKLIN_MASK(FALSE) franklinMaskRemoveState = FRANKLIN_MASK_REMOVE_STATE_DONE ENDIF ENDIF ENDIF BREAK CASE FRANKLIN_MASK_REMOVE_STATE_PLAYING_ANIM CONST_FLOAT CREATE_BANDANA_PHASE 0.2 //PRINTSTRING("franklinPhase = ") PRINTFLOAT(GET_ENTITY_ANIM_CURRENT_TIME(PLAYER_PED_ID(), GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_MISSION), "Take_off_Bandana")) PRINTNL() //PRINTSTRING("bandanaPhase = ") PRINTFLOAT(GET_ENTITY_ANIM_CURRENT_TIME(franklinBandanaObject, GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_MISSION), "Take_off_Bandana_bandana")) PRINTNL() IF fMaskPhase >= CREATE_BANDANA_PHASE SET_FRANKLIN_MASK(FALSE) IF DOES_ENTITY_EXIST(franklinBandanaObject) SET_ENTITY_VISIBLE(franklinBandanaObject, TRUE) ENDIF //printstring("set entity visible!") printnl() franklinMaskRemoveState = FRANKLIN_MASK_REMOVE_STATE_PUTTING_AWAY ENDIF BREAK CASE FRANKLIN_MASK_REMOVE_STATE_PUTTING_AWAY IF fMaskPhase >= 0.95 IF DOES_ENTITY_EXIST(franklinBandanaObject) DELETE_OBJECT(franklinBandanaObject) ENDIF franklinMaskRemoveState = FRANKLIN_MASK_REMOVE_STATE_DONE ENDIF BREAK ENDSWITCH ELSE HANDLE_STREAMING_MOCAP("fra_0_mcs_5_p1", GET_HOOD_VECTOR(HVEC_REC), DEFAULT_CUTSCENE_LOAD_DIST, DEFAULT_CUTSCENE_UNLOAD_DIST) IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY() IF NOT IS_PED_INJURED(lamarPed) SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Lamar", lamarPed) ENDIF IF NOT IS_PED_INJURED(chopPed) SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Chop", chopPed) ENDIF ENDIF ENDIF IF NOT bForcePassOnShitskip IF iWantedLevel = 0 AND NOT bCutsceneWaitStarted IF IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), hoodVehicle[HV_FRANKLIN_VAN]) IF NOT bDoneBanter IF NOT bDoneThreatenResponseSpeech IF NOT IS_PED_INJURED(runnerChaseProperties.ped) IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), runnerChaseProperties.ped, <<30,30,4>>) bDoneThreatenResponseSpeech = DO_MISSION_SPEECH("FKN0_DSHOUT") ELSE bDoneThreatenResponseSpeech = TRUE ENDIF ELSE bDoneThreatenResponseSpeech = TRUE ENDIF ELSE IF NOT bDoneFranklinShoutSpeech IF NOT IS_PED_INJURED(runnerChaseProperties.ped) IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), runnerChaseProperties.ped, <<30,30,4>>) bDoneFranklinShoutSpeech = DO_MISSION_SPEECH("FKN0_FSHOUT") ELSE bDoneFranklinShoutSpeech = TRUE ENDIF ELSE bDoneFranklinShoutSpeech = TRUE ENDIF ELSE IF NOT bDoneLamarShoutSpeech IF NOT IS_PED_INJURED(runnerChaseProperties.ped) IF IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), runnerChaseProperties.ped, <<30,30,4>>) bDoneLamarShoutSpeech = DO_MISSION_SPEECH("FKN0_LAMFU") ELSE bDoneLamarShoutSpeech = TRUE ENDIF ELSE bDoneLamarShoutSpeech = TRUE ENDIF ELSE IF NOT bDoneGotoSpeech bDoneGotoSpeech = DO_MISSION_SPEECH("FKN0_GOREC") ELSE IF bShownGodText IF NOT bCutsceneWaitStarted bDoneBanter = DO_MISSION_SPEECH("FKN0_B3AV1") ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF ELSE IF NOT bKilledTalkAboutMichaelSpeech IF bSavedBanter IF RESTORE_BANTER() bSavedBanter = FALSE ENDIF ENDIF IF NOT GET_MISSION_COMPLETE_STATE(SP_MISSION_ARMENIAN_3) IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() TEXT_LABEL_23 tCurrentLabel tCurrentLabel = GET_CURRENTLY_PLAYING_STANDARD_CONVERSATION_LABEL() PRINTSTRING(tCurrentLabel) PRINTNL() IF ARE_STRINGS_EQUAL(tCurrentLabel, "FKN0_B3AV1_12") KILL_ANY_CONVERSATION() bKilledTalkAboutMichaelSpeech = TRUE ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF IF NOT bCutsceneWaitStarted IF IS_PED_SITTING_IN_VEHICLE(PLAYER_PED_ID(), hoodVehicle[HV_FRANKLIN_VAN]) IF CAN_ADVANCE_MISSION() IF iWantedLevel = 0 IF bStoppedVanAnim IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), GET_HOOD_VECTOR(HVEC_REC), g_vAnyMeansLocate, TRUE) IF CAN_PLAYER_START_CUTSCENE() //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 ENDIF ELSE PREVENT_WANTED_LEVEL_FOR_CUTSCENE() IF BRING_VEHICLE_TO_HALT_AND_DISABLE_VEH_CONTROLS(hoodVehicle[HV_FRANKLIN_VAN], 10.0) IF GET_GAME_TIMER() >= iCutsceneTriggerTime + DEFAULT_CAR_STOPPING_TO_CUTSCENE IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() IF CAN_ADVANCE_MISSION() IF mocapStreamingStage > MOCAP_STREAMING_STAGE_REQUEST IF HAS_CUTSCENE_LOADED_WITH_FAILSAFE() bRunningCutscene = TRUE ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF ENDIF MAINTAIN_BAD_GUY_FLEE() IF NOT bCutsceneWaitStarted HANDLE_IN_CAR_PROMPTS(TRUE, FALSE, TRUE) ENDIF BREAK ENDSWITCH // chop returns to sitting pos IF NOT bChopTurnToIdle IF NOT IS_PED_INJURED(runnerChaseProperties.ped) IF NOT IS_ENTITY_ATTACHED(runnerChaseProperties.ped) VECTOR vInitRot = GET_ANIM_INITIAL_OFFSET_ROTATION(GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_CHOP_VAN), "CHOP_GROWL_TO_SIT", <<0,0,0>>, <<0,0,0>>, 0) + <<0,0,CHOP_GROWL_ROT>> //PRINTSTRING("Initheader = ") PRINTVECTOR(vInitRot) PRINTNL() ATTACH_CHOP_TO_VAN(chopPed, hoodVehicle[HV_FRANKLIN_VAN], vInitRot.z) SET_ENTITY_PROOFS(chopPed, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, TRUE) TASK_PLAY_ANIM(chopPed, GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_CHOP_VAN), "CHOP_GROWL_TO_SIT", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_HOLD_LAST_FRAME | AF_EXTRACT_INITIAL_OFFSET) FORCE_PED_AI_AND_ANIMATION_UPDATE(chopPed) bChopTurnToIdle = TRUE ENDIF ENDIF ELSE IF NOT bChopResetInIdle IF NOT IS_PED_INJURED(chopPed) IF IS_ENTITY_PLAYING_ANIM(chopPed, GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_CHOP_VAN), "CHOP_GROWL_TO_SIT") FLOAT fPhase = GET_ENTITY_ANIM_CURRENT_TIME(chopPed, GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_CHOP_VAN), "CHOP_GROWL_TO_SIT") IF fPhase >= 0.98 TASK_PLAY_ANIM(chopPed, GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_CHOP_VAN), "CHOP_SIT_LOOP", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING | AF_EXTRACT_INITIAL_OFFSET) bChopResetInIdle = TRUE ELSE IF fPhase >= 0 VECTOR vExtractedRot = GET_ANIM_INITIAL_OFFSET_ROTATION(GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_CHOP_VAN), "CHOP_GROWL_TO_SIT", <<0,0,0>>, <<0,0,0>>, fPhase) + <<0,0,CHOP_GROWL_ROT>> //PRINTSTRING("heading = ") PRINTVECTOR(vExtractedRot) PRINTNL() ATTACH_CHOP_TO_VAN(chopPed, hoodVehicle[HV_FRANKLIN_VAN], vExtractedRot.z) SET_ENTITY_PROOFS(chopPed, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, TRUE) ENDIF ENDIF ENDIF ENDIF ELSE HANDLE_CHOP_LEAN_IN_VAN(chopPed, hoodVehicle[HV_FRANKLIN_VAN], chopLeanInVanState, fCachedVanSpeed, iNextChopAnimTime, iNextBarkTime) ENDIF ENDIF // remove trainyard IF NOT bRemovedChaseSetpieces IF NOT IS_ENTITY_AT_COORD(PLAYER_PED_ID(), GET_HOOD_VECTOR(HVEC_TRAINYARD), <<150,150,150>>, FALSE, FALSE) REMOVE_CHASE_SETPIECES() ENDIF ENDIF ENDIF ELSE // lamar walk round corner and leave IF NOT IS_PED_INJURED(chopPed) SET_PED_MOVE_RATE_OVERRIDE(chopPed, 1.00) IF IS_WAYPOINT_PLAYBACK_GOING_ON_FOR_PED(chopPed) WAYPOINT_PLAYBACK_OVERRIDE_SPEED(chopPed, PEDMOVE_RUN) ENDIF ENDIF IF NOT IS_PED_INJURED(lamarPed) SET_PED_MOVE_RATE_OVERRIDE(lamarPed, 1.15) ENDIF IF GET_GAME_TIMER() >= iLamarOutOfVanTime + 3200 IF DOES_ENTITY_EXIST(lamarPed) DELETE_PED(lamarPed) ENDIF IF DOES_ENTITY_EXIST(chopPed) DELETE_PED(chopPed) ENDIF MISSION_PASSED() ENDIF ENDIF ELSE IF NOT bDoneLetOut DO_LET_OUT_CUTSCENE() ELSE DO_DROPOFF_CUTSCENE() ENDIF ENDIF // handle lamar phone state IF NOT IS_PED_INJURED(lamarPed) AND NOT IS_PED_INJURED(PLAYER_PED_ID()) SWITCH lamarPhoneState CASE LAMAR_PHONE_STATE_NOT_STARTED lamarPhoneObject = CREATE_OBJECT(GET_MODEL_FOR_HOOD_MODEL_ENUM(HM_LAMAR_PHONE), <<0,1,2>>) ATTACH_ENTITY_TO_ENTITY(lamarPhoneObject, lamarPed, GET_PED_BONE_INDEX(lamarPed, BONETAG_PH_L_HAND), <<0.0, 0.0, 0.0>>, <<0.0, 0.0, 0.0>>) IF NOT IS_ENTITY_PLAYING_ANIM(lamarPed, GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_DRIVE_HOME), "InCar_PhoneIdle_Lem") TASK_PLAY_ANIM(lamarPed, GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_DRIVE_HOME), "InCar_PhoneIdle_Lem", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING) ENDIF lamarPhoneState = LAMAR_PHONE_STATE_PRE_CALL BREAK CASE LAMAR_PHONE_STATE_PRE_CALL DRAW_FAKE_CELLPHONE_SCREEN(fakeCellphoneData, FALSE, FAKE_CELLPHONE_SCREEN_GENERIC_MENU) IF dropoffStage >= DROPOFF_STAGE_PRE_CALL TASK_PLAY_ANIM(lamarPed, GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_DRIVE_HOME), "Incar_Phonetalk_enter_Lem", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_HOLD_LAST_FRAME) lamarPhoneState = LAMAR_PHONE_STATE_PHONE_UP ENDIF BREAK CASE LAMAR_PHONE_STATE_PHONE_UP DRAW_FAKE_CELLPHONE_SCREEN(fakeCellphoneData, FALSE, FAKE_CELLPHONE_SCREEN_GENERIC_CALL) IF IS_ENTITY_PLAYING_ANIM(lamarPed, GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_DRIVE_HOME), "Incar_Phonetalk_enter_Lem") IF GET_ENTITY_ANIM_CURRENT_TIME(lamarPed, GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_DRIVE_HOME), "Incar_Phonetalk_enter_Lem") >= 0.98 TASK_PLAY_ANIM(lamarPed, GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_DRIVE_HOME), "Incar_Phonetalk_loop_Lem", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING) lamarPhoneState = LAMAR_PHONE_STATE_ON_PHONE ENDIF ENDIF BREAK CASE LAMAR_PHONE_STATE_ON_PHONE DRAW_FAKE_CELLPHONE_SCREEN(fakeCellphoneData, FALSE, FAKE_CELLPHONE_SCREEN_GENERIC_CALL) IF dropoffStage >= DROPOFF_STAGE_POST_CALL TASK_PLAY_ANIM(lamarPed, GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_DRIVE_HOME), "Incar_Phonetalk_exit_Lem", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_HOLD_LAST_FRAME) lamarPhoneState = LAMAR_PHONE_STATE_PHONE_DOWN ENDIF BREAK CASE LAMAR_PHONE_STATE_PHONE_DOWN DRAW_FAKE_CELLPHONE_SCREEN(fakeCellphoneData, FALSE, FAKE_CELLPHONE_SCREEN_GENERIC_MENU) IF IS_ENTITY_PLAYING_ANIM(lamarPed, GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_DRIVE_HOME), "Incar_Phonetalk_exit_Lem") IF GET_ENTITY_ANIM_CURRENT_TIME(lamarPed, GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_DRIVE_HOME), "Incar_Phonetalk_exit_Lem") >= 0.98 TASK_PLAY_ANIM(lamarPed, GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_DRIVE_HOME), "InCar_PhoneIdle_Lem", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING) lamarPhoneState = LAMAR_PHONE_STATE_POST_CALL ENDIF ENDIF BREAK CASE LAMAR_PHONE_STATE_POST_CALL DRAW_FAKE_CELLPHONE_SCREEN(fakeCellphoneData, FALSE, FAKE_CELLPHONE_SCREEN_GENERIC_MENU) IF dropoffStage = DROPOFF_STAGE_END IF bStartedLetOutCutscene AND cutsceneStage = H_CUT_STAGE_RUNNING TASK_CLEAR_LOOK_AT(PLAYER_PED_ID()) TASK_PLAY_ANIM(lamarPed, GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_DRIVE_HOME), "InCar_PhoneSnatch_Lem", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1) TASK_PLAY_ANIM(PLAYER_PED_ID(), GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_DRIVE_HOME), "InCar_PhoneSnatch_Fra", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_SECONDARY) lamarPhoneState = LAMAR_PHONE_STATE_SNATCH ENDIF ENDIF BREAK CASE LAMAR_PHONE_STATE_SNATCH DRAW_FAKE_CELLPHONE_SCREEN(fakeCellphoneData, FALSE, FAKE_CELLPHONE_SCREEN_GENERIC_MENU) IF NOT IS_ENTITY_PLAYING_ANIM(PLAYER_PED_ID(), GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_DRIVE_HOME), "InCar_PhoneSnatch_Fra") lamarPhoneState = LAMAR_PHONE_STATE_DONE ELSE IF NOT bPhoneForceApplied IF GET_ENTITY_ANIM_CURRENT_TIME(PLAYER_PED_ID(), GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_DRIVE_HOME), "InCar_PhoneSnatch_Fra") >= 0.47 IF DOES_ENTITY_EXIST(lamarPhoneObject) DETACH_ENTITY(lamarPhoneObject) APPLY_FORCE_TO_ENTITY_CENTER_OF_MASS(lamarPhoneObject, APPLY_TYPE_IMPULSE, <<3,0.5,0>>, 0, TRUE, TRUE) bPhoneForceApplied = TRUE ENDIF ENDIF ENDIF ENDIF BREAK CASE LAMAR_PHONE_STATE_DONE DRAW_FAKE_CELLPHONE_SCREEN(fakeCellphoneData, FALSE, FAKE_CELLPHONE_SCREEN_GENERIC_MENU) BREAK ENDSWITCH ENDIF ENDPROC // debug only #IF IS_DEBUG_BUILD // create widgets PROC CREATE_HOOD_WIDGETS() hoodWidgets = START_WIDGET_GROUP("Foot Chase") 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_VECTOR_SLIDER("Van cam Offset", vDebugVanCamOffset, -20, 20, 0.1) ADD_WIDGET_VECTOR_SLIDER("Van cam Point", vDebugVanCamPoint, -20, 20, 0.1) ADD_WIDGET_FLOAT_SLIDER("Van cam FOV", fDebugVanCamFOV, 0.0, 360.0, 0.5) ADD_WIDGET_VECTOR_SLIDER("Boxcar cam Offset", vDebugBoxcarCamOffset, -20, 20, 0.1) ADD_WIDGET_VECTOR_SLIDER("Boxcar cam Point", vDebugBoxcarCamPoint, -20, 20, 0.1) ADD_WIDGET_FLOAT_SLIDER("Boxcar cam FOV", fDebugBoxcarCamFOV, 0.0, 360.0, 0.5) ADD_WIDGET_BOOL("Do Dump", bRBDebugCamDoDump) STOP_WIDGET_GROUP() set_uber_parent_widget_group(hoodWidgets) IF bDebugDoUber CREATE_TRAFFIC_WIDGET() INIT_UBER_RECORDING(GET_HOOD_UBER_RECORDING_PREFIX()) ENDIF ENDPROC // setup the debug menu PROC SETUP_HOOD_DEBUG_MENU() stageMenu[0].sTxtLabel = "Cutscene FRA_0_INT" stageMenu[0].bSelectable = FALSE stageMenu[1].sTxtLabel = GET_DESCRIPTION_FOR_STAGE_AS_STRING(STAGE_GET_TO_BAD_GUY) stageMenu[2].sTxtLabel = "Cutscene FRA_0_MCS_0" stageMenu[2].bSelectable = FALSE stageMenu[3].sTxtLabel = "Cutscene FRA_0_MCS_1" stageMenu[3].bSelectable = FALSE stageMenu[4].sTxtLabel = GET_DESCRIPTION_FOR_STAGE_AS_STRING(STAGE_VAN_CHASE) stageMenu[5].sTxtLabel = "Cutscene FRA_0_MCS_2" stageMenu[5].bSelectable = FALSE stageMenu[6].sTxtLabel = GET_DESCRIPTION_FOR_STAGE_AS_STRING(STAGE_FOOT_CHASE) stageMenu[7].sTxtLabel = GET_DESCRIPTION_FOR_STAGE_AS_STRING(STAGE_FIND_BAD_GUY) stageMenu[8].sTxtLabel = "Cutscene FRA_0_MCS_4" stageMenu[8].bSelectable = FALSE stageMenu[9].sTxtLabel = GET_DESCRIPTION_FOR_STAGE_AS_STRING(STAGE_GET_TO_HOUSE) stageMenu[10].sTxtLabel = "Cutscene FRA_0_EXT" stageMenu[10].bSelectable = FALSE ENDPROC // debug skips PROC DO_DEBUG_SKIPS() // mission pass S IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_S) SET_FRANKLIN_MASK(FALSE) bThoroughCleanup = TRUE MISSION_PASSED() ENDIF // mission fail F IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_F) MISSION_FAILED(FAIL_LOST_BAD_GUY) ENDIF // skip stage J IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_J) IF NOT bRunningCutscene IF NOT IS_PED_INJURED(PLAYER_PED_ID()) SET_PLAYER_CONTROL(PLAYER_ID(), TRUE) SWITCH currentMissionStage CASE STAGE_GET_TO_BAD_GUY IF NOT bDoneLamarIntoVan IF chopIntoVanState = CHOP_INTO_VAN_STATE_NOT_STARTED IF NOT IS_PED_INJURED(PLAYER_PED_ID()) SET_ENTITY_COORDS(PLAYER_PED_ID(), <<-76.99, -1459.45, 31.09>>) CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID()) ENDIF IF NOT IS_PED_INJURED(lamarPed) SET_ENTITY_COORDS(lamarPed, <<-76.06, -1458.92, 31.09>>) CLEAR_PED_TASKS_IMMEDIATELY(lamarPed) ENDIF IF NOT IS_PED_INJURED(chopPed) SET_ENTITY_COORDS(chopPed, <<-73.93819, -1458.51807, 31.10075>>) CLEAR_PED_TASKS_IMMEDIATELY(chopPed) ENDIF bLamarWalkPaused = TRUE KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() bDoneBanter = TRUE ELSE IF IS_VEHICLE_DRIVEABLE(hoodVehicle[HV_FRANKLIN_VAN]) IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), hoodVehicle[HV_FRANKLIN_VAN]) SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(hoodVehicle[HV_FRANKLIN_VAN], TRUE) SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), hoodVehicle[HV_FRANKLIN_VAN]) SET_PED_INTO_VEHICLE(lamarPed, hoodVehicle[HV_FRANKLIN_VAN], VS_FRONT_RIGHT) SET_CHOP_INTO_VAN(chopPed, hoodVehicle[HV_FRANKLIN_VAN], chopLeanInVanState, fCachedVanSpeed, FALSE, TRUE, TRUE) SET_ENTITY_PROOFS(chopPed, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, TRUE) SET_PED_CAN_RAGDOLL(chopPed, FALSE) TASK_CLEAR_LOOK_AT(lamarPed) SET_ENTITY_NO_COLLISION_ENTITY(lamarPed, hoodVehicle[HV_FRANKLIN_VAN], TRUE) bDoneFranklinIntoVanSpeech = TRUE chopIntoVanState = CHOP_INTO_VAN_STATE_DONE ENDIF ENDIF ENDIF ELSE IF IS_VEHICLE_DRIVEABLE(hoodVehicle[HV_FRANKLIN_VAN]) IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), hoodVehicle[HV_FRANKLIN_VAN]) SET_VEHICLE_IS_CONSIDERED_BY_PLAYER(hoodVehicle[HV_FRANKLIN_VAN], TRUE) SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), hoodVehicle[HV_FRANKLIN_VAN]) IF NOT IS_PED_INJURED(lamarPed) IF NOT IS_PED_IN_VEHICLE(lamarPed, hoodVehicle[HV_FRANKLIN_VAN]) SET_PED_INTO_VEHICLE(lamarPed, hoodVehicle[HV_FRANKLIN_VAN], VS_FRONT_RIGHT) ENDIF ENDIF SET_CHOP_INTO_VAN(chopPed, hoodVehicle[HV_FRANKLIN_VAN], chopLeanInVanState, fCachedVanSpeed) SET_ENTITY_PROOFS(chopPed, FALSE, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, TRUE) SET_PED_CAN_RAGDOLL(chopPed, FALSE) bDoneLamarIntoVan = TRUE ELSE KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() SET_ENTITY_COORDS(hoodVehicle[HV_FRANKLIN_VAN], GET_HOOD_VECTOR(HVEC_VAN_CHASE_INIT)) SET_ENTITY_HEADING(hoodVehicle[HV_FRANKLIN_VAN], VAN_CHASE_INIT_ROT) SET_VEHICLE_ON_GROUND_PROPERLY(hoodVehicle[HV_FRANKLIN_VAN]) APPLY_FORCE_TO_ENTITY(hoodVehicle[HV_FRANKLIN_VAN], APPLY_TYPE_IMPULSE, <<0,0,-0.1>>, <<0,0,0>>, 0, TRUE, TRUE, TRUE) ENDIF ENDIF ENDIF BREAK CASE STAGE_VAN_CHASE /* IF IS_VEHICLE_DRIVEABLE(hoodVehicle[HV_FRANKLIN_VAN]) SET_ENTITY_COORDS(hoodVehicle[HV_FRANKLIN_VAN], GET_HOOD_VECTOR(HVEC_VAN_IN_ALLEY)) SET_ENTITY_HEADING(hoodVehicle[HV_FRANKLIN_VAN], CAR_IN_ALLEY_ROT) SET_VEHICLE_ON_GROUND_PROPERLY(hoodVehicle[HV_FRANKLIN_VAN]) IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), hoodVehicle[HV_FRANKLIN_VAN]) SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), hoodVehicle[HV_FRANKLIN_VAN], VS_DRIVER) ENDIF IF NOT IS_PED_INJURED(lamarPed) IF NOT IS_PED_IN_VEHICLE(lamarPed, hoodVehicle[HV_FRANKLIN_VAN]) SET_PED_INTO_VEHICLE(lamarPed, hoodVehicle[HV_FRANKLIN_VAN], VS_FRONT_RIGHT) ENDIF ENDIF ENDIF IF IS_VEHICLE_DRIVEABLE(hoodVehicle[HV_BAD_GUY_BIKE]) IF IS_PLAYBACK_GOING_ON_FOR_VEHICLE(hoodVehicle[HV_BAD_GUY_BIKE]) SKIP_TO_END_AND_STOP_PLAYBACK_RECORDED_VEHICLE(hoodVehicle[HV_BAD_GUY_BIKE]) ENDIF ENDIF */ DO_SCREEN_FADE_OUT(500) WHILE NOT IS_SCREEN_FADED_OUT() WAIT(0) ENDWHILE COMMON_MISSION_CLEAR() SET_MISSION_STAGE(STAGE_FOOT_CHASE, TRUE) DO_SCREEN_FADE_IN(500) //bRunningCutscene = TRUE BREAK CASE STAGE_FOOT_CHASE DO_SCREEN_FADE_OUT(500) WHILE NOT IS_SCREEN_FADED_OUT() WAIT(0) ENDWHILE COMMON_MISSION_CLEAR() SET_MISSION_STAGE(STAGE_FIND_BAD_GUY, TRUE) DO_SCREEN_FADE_IN(500) BREAK CASE STAGE_FIND_BAD_GUY IF NOT bFoundBadGuy IF chopBehaviourSetpieceStage = CBS_NOT_STARTED IF NOT IS_PED_INJURED(chopPed) SET_ENTITY_COORDS(chopPed, GET_HOOD_VECTOR(HVEC_CHOP_BEHAVIOUR_SETPIECE_LAUNCH)) SET_ENTITY_HEADING(chopPed, 147) CLEAR_PED_TASKS_IMMEDIATELY(chopPed) SET_ENTITY_COORDS(PLAYER_PED_ID(), <<537.10, -668.21, 23.76>>) SET_ENTITY_HEADING(PLAYER_PED_ID(), 77.13) ENDIF KILL_ANY_CONVERSATION() bShownGodText = TRUE //bShownDebugBehaviourHelp = TRUE bShownChopViewHelp = TRUE bGotToTrain = TRUE ELSE IF NOT bOpeningBoxcarInProgress IF NOT IS_PED_INJURED(chopPed) DETACH_ENTITY(chopPed) SET_ENTITY_COORDS(chopPed, <<528.49, -680.80, 23.80>>) CLEAR_PED_TASKS_IMMEDIATELY(chopPed) SET_ENTITY_COORDS(PLAYER_PED_ID(), <<529.02, -677.67, 23.80>>) iChopWaypointProgress = 999 SET_CHOP_BEHAVIOUR_SETPIECE_STAGE(CBS_DONE) bDebugForceOpenBoxcar = TRUE ENDIF ENDIF ENDIF ELSE IF NOT IS_PED_INJURED(runnerChaseProperties.ped) CLEAR_PED_TASKS_IMMEDIATELY(runnerChaseProperties.ped) SET_ENTITY_COORDS(runnerChaseProperties.ped, <<512.96, -623.70, 23.75>>) SET_ENTITY_COORDS(PLAYER_PED_ID(), GET_ENTITY_COORDS(runnerChaseProperties.ped)) IF NOT IS_PED_INJURED(chopPed) SET_ENTITY_COORDS(chopPed, GET_ENTITY_COORDS(runnerChaseProperties.ped)) ENDIF ENDIF ENDIF BREAK CASE STAGE_GET_TO_HOUSE IF NOT bLamarOutOfVan IF IS_VEHICLE_DRIVEABLE(hoodVehicle[HV_FRANKLIN_VAN]) IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), hoodVehicle[HV_FRANKLIN_VAN]) SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), hoodVehicle[HV_FRANKLIN_VAN]) ELSE IF dropoffStage <= DROPOFF_STAGE_STOP_VAN dropoffStage = DROPOFF_STAGE_STOP_VAN iLetOutPromptTime = GET_GAME_TIMER() KILL_ANY_CONVERSATION() ELSE KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() SET_ENTITY_COORDS(hoodVehicle[HV_FRANKLIN_VAN], GET_HOOD_VECTOR(HVEC_REC)) SET_ENTITY_HEADING(hoodVehicle[HV_FRANKLIN_VAN], 73.92) SET_VEHICLE_ON_GROUND_PROPERLY(hoodVehicle[HV_FRANKLIN_VAN]) //APPLY_FORCE_TO_ENTITY(hoodVehicle[HV_FRANKLIN_VAN], APPLY_TYPE_IMPULSE, <<0,0,-0.1>>, <<0,0,0>>, 0, TRUE, TRUE, TRUE) dropoffStage = DROPOFF_STAGE_END ENDIF 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()) TRIGGER_MUSIC_EVENT("FRA0_MISSION_FAIL") DO_SCREEN_FADE_OUT(500) WHILE NOT IS_SCREEN_FADED_OUT() WAIT(0) ENDWHILE COMMON_MISSION_CLEAR() SWITCH currentMissionStage CASE STAGE_GET_TO_BAD_GUY POSITION_PLAYER_AT_MISSION_INIT() WAIT(1000) SET_MISSION_STAGE(STAGE_GET_TO_BAD_GUY, TRUE) BREAK CASE STAGE_VAN_CHASE bModelRequestTracker[ENUM_TO_INT(HM_TRAFFIC_CAR1)] = FALSE bModelRequestTracker[ENUM_TO_INT(HM_BUS)] = FALSE POSITION_PLAYER_AT_MISSION_INIT() WAIT(1000) SET_MISSION_STAGE(STAGE_GET_TO_BAD_GUY, TRUE) BREAK CASE STAGE_FOOT_CHASE bModelRequestTracker[ENUM_TO_INT(HM_TRAFFIC_CAR1)] = FALSE bModelRequestTracker[ENUM_TO_INT(HM_BUS)] = FALSE SET_MISSION_STAGE(STAGE_VAN_CHASE, TRUE) BREAK CASE STAGE_FIND_BAD_GUY SET_MISSION_STAGE(STAGE_FOOT_CHASE, TRUE) BREAK CASE STAGE_GET_TO_HOUSE SET_MISSION_STAGE(STAGE_FIND_BAD_GUY, TRUE) BREAK ENDSWITCH DO_SCREEN_FADE_IN(500) ENDIF ENDIF // stage menu IF NOT IS_PED_INJURED(PLAYER_PED_ID()) IF LAUNCH_MISSION_STAGE_MENU(stageMenu, iMenuMissionStage) TRIGGER_MUSIC_EVENT("FRA0_MISSION_FAIL") COMMON_MISSION_CLEAR() DO_SCREEN_FADE_OUT(500) WHILE NOT IS_SCREEN_FADED_OUT() WAIT(0) ENDWHILE // convert debug stage to mission stage MISSION_STAGE_ENUM setStage SWITCH iMenuMissionStage CASE 1 setStage = STAGE_GET_TO_BAD_GUY BREAK CASE 4 setStage = STAGE_VAN_CHASE BREAK CASE 6 setStage = STAGE_FOOT_CHASE BREAK CASE 7 setStage = STAGE_FIND_BAD_GUY BREAK CASE 9 setStage = STAGE_GET_TO_HOUSE BREAK ENDSWITCH IF currentMissionStage = STAGE_VAN_CHASE OR currentMissionStage = STAGE_FOOT_CHASE bModelRequestTracker[ENUM_TO_INT(HM_TRAFFIC_CAR1)] = FALSE bModelRequestTracker[ENUM_TO_INT(HM_BUS)] = FALSE ENDIF IF setStage = STAGE_GET_TO_BAD_GUY POSITION_PLAYER_AT_MISSION_INIT() WAIT(1000) ENDIF SET_MISSION_STAGE(setStage, TRUE) DO_SCREEN_FADE_IN(500) ENDIF ENDIF IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_NUMPAD3) SET_PED_CAN_BE_KNOCKED_OFF_VEHICLE(runnerChaseProperties.ped, KNOCKOFFVEHICLE_DEFAULT) //SET_ENTITY_PROOFS(runnerChaseProperties.ped, FALSE, FALSE, FALSE, FALSE, FALSE) //SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(runnerChaseProperties.ped, FALSE) KNOCK_PED_OFF_VEHICLE(runnerChaseProperties.ped) ENDIF //IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_NUMPAD4) // SET_PED_TO_RAGDOLL(runnerChaseProperties.ped, 1000, 1000, TASK_RELAX, TRUE, TRUE, TRUE) // printstring("ragdoll") printnl() //ENDIF IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_NUMPAD5) PRINTSTRING("BB") PRINTNL() OBJECT_INDEX thisCar = GET_CLOSEST_OBJECT_OF_TYPE(GET_ENTITY_COORDS(PLAYER_PED_ID()), 20.0, prop_rail_boxcar5) IF DOES_ENTITY_EXIST(thisCar) PRINTSTRING("exists") PRINTNL() PLAY_ENTITY_ANIM(thisCar, "open_train_car_boxcar", GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_FIND), NORMAL_BLEND_IN, FALSE, TRUE) ENDIF ENDIF // stage specific stuff IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_NUMPAD4) IF currentMissionStage = STAGE_FOOT_CHASE SET_ENTITY_COORDS(PLAYER_PED_ID(), <<493.82770, -524.23358, 23.75095>>) SET_ENTITY_HEADING(PLAYER_PED_ID(), -3.8) ENDIF ENDIF IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_NUMPAD2) IF currentMissionStage = STAGE_FOOT_CHASE IF NOT bDebugDoneFootChaseSkip /* // after fence bust IF NOT IS_PED_INJURED(PLAYER_PED_ID()) SET_ENTITY_COORDS(PLAYER_PED_ID(), <<489.29, -514.77, 23.76>>) SET_ENTITY_HEADING(PLAYER_PED_ID(), -66.16) SET_GAMEPLAY_CAM_RELATIVE_HEADING() ENDIF IF NOT IS_PED_INJURED(runnerChaseProperties.ped) SET_ENTITY_COORDS(runnerChaseProperties.ped, <<493.81, -514.50, 23.76>>) SET_ENTITY_HEADING(runnerChaseProperties.ped, -15.69) runnerStage = RUNNER_TO_FENCE HANDLE_TRANSITION_BACK_TO_CHASE_MOVING(runnerChaseProperties, TRUE) ENDIF bDoneOffRoofCut = TRUE bDoneThroughFenceCut = TRUE */ // after boxcar IF NOT IS_PED_INJURED(PLAYER_PED_ID()) SET_ENTITY_COORDS(PLAYER_PED_ID(), <<567.74, -498.82, 23.76>>) SET_ENTITY_HEADING(PLAYER_PED_ID(), 162.28) SET_GAMEPLAY_CAM_RELATIVE_HEADING() ENDIF IF NOT IS_PED_INJURED(runnerChaseProperties.ped) SET_ENTITY_COORDS(runnerChaseProperties.ped, <<566.12, -505.28, 23.76>>) SET_ENTITY_HEADING(runnerChaseProperties.ped, 176.73) runnerStage = RUNNER_TO_BOXCAR HANDLE_TRANSITION_BACK_TO_CHASE_MOVING(runnerChaseProperties) ENDIF //bDoneOffRoofCut = TRUE bDoneThroughFenceCut = TRUE //bRunningCutscene = TRUE iCurrentFootChaseCutscene = 2 /* // last cut IF DOES_ENTITY_EXIST(containerObject) DETACH_ENTITY(containerObject) SET_ENTITY_COORDS(containerObject, << 516.291, -625.819, 23.775 >>) SET_ENTITY_ROTATION(containerObject, << 0.148364, 0.0395208, 173.176 >>) FREEZE_ENTITY_POSITION(containerObject, TRUE) ENDIF IF NOT IS_PED_INJURED(PLAYER_PED_ID()) SET_ENTITY_COORDS(PLAYER_PED_ID(), <<517.10, -615.99, 23.76>>) SET_ENTITY_HEADING(PLAYER_PED_ID(), 172.39) SET_GAMEPLAY_CAM_RELATIVE_HEADING() ENDIF craneSetpieceState = CRANE_SETPIECE_DONE runnerStage = RUNNER_DONE bDoneOffRoofCut = TRUE bDoneThroughFenceCut = TRUE bDoneOnTrainCut = TRUE */ bDebugDoneFootChaseSkip = TRUE ENDIF ELIF currentMissionStage = STAGE_GET_TO_HOUSE dropoffStage = DROPOFF_STAGE_STOP_VAN iLetOutPromptTime = GET_GAME_TIMER() KILL_ANY_CONVERSATION() 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) fRBDebugCamFOV = GET_CAM_FOV(tempCam) TEXT_LABEL_63 tPos TEXT_LABEL_63 tRot INT iBefore, iAfter // fill position tPos = "<<" FORMAT_FLOAT_FOR_RB_CAM_DUMP(vRBDebugCamPos.x, iBefore, iAfter) tPos += iBefore tPos += "." tPos += iAfter tPos += ", " FORMAT_FLOAT_FOR_RB_CAM_DUMP(vRBDebugCamPos.y, iBefore, iAfter) tPos += iBefore tPos += "." tPos += iAfter tPos += ", " FORMAT_FLOAT_FOR_RB_CAM_DUMP(vRBDebugCamPos.z, iBefore, iAfter) tPos += iBefore tPos += "." tPos += iAfter tPos += ">>" // fill rotation tRot = "<<" FORMAT_FLOAT_FOR_RB_CAM_DUMP(vRBDebugCamRot.x, iBefore, iAfter) tRot += iBefore tRot += "." tRot += iAfter tRot += ", " FORMAT_FLOAT_FOR_RB_CAM_DUMP(vRBDebugCamRot.y, iBefore, iAfter) tRot += iBefore tRot += "." tRot += iAfter tRot += ", " FORMAT_FLOAT_FOR_RB_CAM_DUMP(vRBDebugCamRot.z, iBefore, iAfter) tRot += iBefore tRot += "." tRot += iAfter tRot += ">>" // set widgets SET_CONTENTS_OF_TEXT_WIDGET(RBCamPosWidget, tPos) SET_CONTENTS_OF_TEXT_WIDGET(RBCamRotWidget, tRot) bRBDebugCamDoDump = FALSE ENDIF ENDPROC #ENDIF //INT iSoundTest // main script SCRIPT SET_MISSION_FLAG(TRUE) IF HAS_FORCE_CLEANUP_OCCURRED() Mission_Flow_Mission_Force_Cleanup() MISSION_CLEANUP() ENDIF #IF IS_DEBUG_BUILD CREATE_HOOD_WIDGETS() SETUP_HOOD_DEBUG_MENU() IF bDrawVehicleRecordingDebug SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE(TRUE) ENDIF #ENDIF #IF IS_DEBUG_BUILD // TRACE_NATIVE_COMMAND("SET_ALL_VEHICLE_GENERATORS_ACTIVE_IN_AREA") TRACE_NATIVE_COMMAND("SET_WANTED_LEVEL_MULTIPLIER") #ENDIF bSkippedCutscene = bSkippedCutscene WHILE TRUE REPLAY_CHECK_FOR_EVENT_THIS_FRAME("M_Chop") #IF IS_DEBUG_BUILD IF NOT bDebugDoUber #ENDIF IF INIT_MISSION() // PRINTSTRING("line = ") PRINTINT(GET_CURRENT_SCRIPTED_CONVERSATION_LINE()) PRINTNL() // printstring("runner = ") printint(runnerChaseProperties.iSyncScene) PRINTNL() // printstring("chop = ") PRINTVECTOR(GET_ENTITY_COORDS(chopPed)) PRINTNL() //printvector(get_entity_coords(hoodVehicle[hv_bad_guy_bike])) printnl() //printvector(get_entity_rotation(hoodVehicle[hv_bad_guy_bike])) printnl() //IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_NUMPAD1) // bRunningCutscene = TRUE //ENDIF /* IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_NUMPAD2) TASK_PLAY_ANIM(chopPed, GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_MISSION), "FRA_0_IG_1_CHOP_GROWL", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING) ENDIF IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_NUMPAD3) TASK_PLAY_ANIM(chopPed, GET_HOOD_ANIM_DICT_AS_STRING(H_ANIM_DICT_MISSION), "FRA_0_IG_1_CHOP_GROWL_TO_SIT", NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING) ENDIF */ IF NOT IS_PED_INJURED(PLAYER_PED_ID()) // do streaming for next stage DO_STREAMING_FOR_NEXT_MISSION_STAGE(FALSE) //SET_PED_CAN_PLAY_GESTURE_ANIMS(PLAYER_PED_ID(), FALSE) // do fail checks HANDLE_MISSION_FAIL_STATE() // head tracking HANDLE_BUDDY_HEAD_TRACK_WHILE_ENTERING_VEHICLE() // handle mix group IF NOT IS_PED_INJURED(chopPed) IF chopViewCamData.state <> CHOP_VIEW_CAM_ON_CHOP IF NOT bAddedChopToMixGroup ADD_ENTITY_TO_AUDIO_MIX_GROUP(chopPed, "FRANKLIN_0_CHOP_Group") bAddedChopToMixGroup = TRUE ENDIF ELSE IF bAddedChopToMixGroup REMOVE_ENTITY_FROM_AUDIO_MIX_GROUP(chopPed) bAddedChopToMixGroup = FALSE ENDIF ENDIF ENDIF // run appropriate stage SWITCH currentMissionStage CASE STAGE_GET_TO_BAD_GUY DO_STAGE_GET_TO_BAD_GUY() BREAK CASE STAGE_VAN_CHASE DO_STAGE_VAN_CHASE() BREAK CASE STAGE_FOOT_CHASE DO_STAGE_FOOT_CHASE() BREAK CASE STAGE_FIND_BAD_GUY DO_STAGE_FIND_BAD_GUY() BREAK CASE STAGE_GET_TO_HOUSE DO_STAGE_GET_TO_HOUSE() BREAK ENDSWITCH ENDIF #IF IS_DEBUG_BUILD INT i TEXT_LABEL tLabel IF bDrawVehicleRecordingDebug REPEAT COUNT_OF(TrafficCarID) i IF IS_VEHICLE_DRIVEABLE(TrafficCarID[i]) tLabel = "CAR " tLabel += i DRAW_DEBUG_TEXT(tLabel, GET_ENTITY_COORDS(TrafficCarID[i]) + <<0,0,1.5>>) ENDIF ENDREPEAT ENDIF IF CAN_ADVANCE_MISSION() DO_DEBUG_SKIPS() ENDIF DO_RB_DEBUG_CAM_DUMP() #ENDIF ELSE IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY() PRINTSTRING("requested lamar assets from mission script!") PRINTNL() SET_CUTSCENE_PED_COMPONENT_VARIATION("Lamar", PED_COMP_HEAD, 0, 0) SET_CUTSCENE_PED_COMPONENT_VARIATION("Lamar", PED_COMP_BERD, 1, 0) SET_CUTSCENE_PED_COMPONENT_VARIATION("Lamar", PED_COMP_HAIR, 2, 0) SET_CUTSCENE_PED_COMPONENT_VARIATION("Lamar", PED_COMP_TORSO, 2, 1) SET_CUTSCENE_PED_COMPONENT_VARIATION("Lamar", PED_COMP_LEG, 4, 0) SET_CUTSCENE_PED_COMPONENT_VARIATION("Lamar", PED_COMP_HAND, 0, 0) SET_CUTSCENE_PED_COMPONENT_VARIATION("Lamar", PED_COMP_SPECIAL, 0, 0) SET_CUTSCENE_PED_COMPONENT_VARIATION("Lamar", PED_COMP_SPECIAL2, 0, 0) SET_CUTSCENE_PED_COMPONENT_VARIATION("Lamar", PED_COMP_FEET, 1, 0) SET_CHOP_COLLAR() SET_CUTSCENE_PED_COMPONENT_VARIATION("Chop", PED_COMP_TORSO, 0, iCurrentChopCollar) ENDIF ENDIF #IF IS_DEBUG_BUILD ELSE UPDATE_UBER_RECORDING() ENDIF #ENDIF WAIT(0) ENDWHILE ENDSCRIPT