// Do nothing in release mode #IF IS_FINAL_BUILD SCRIPT ENDSCRIPT #ENDIF //***************************BLENDOUT EXAMPLE SCRIPT********************************* //***********Written by Geoffrey Fermin (with massive help from Thomas French)******** //This example script will attempt to showcase various cutscene to ingame blend examples //covering a variety of situations. It is a barebones script with a menu and the bare minimum //scripting on entities to have them in the correct state for thier respective blends. //to run script, please launch bank_release or beta //hit 4 on debug keyboard, navigate to "cutscene samples" //and pick your poisen. // Only include in debug mode #IF IS_DEBUG_BUILD USING "test_tools.sch" USING "Commands_cutscene.sch" USING "Commands_task.sch" USING "Commands_ped.sch" USING "commands_object.sch" USING "Selector_public.sch" USING "weapons_public.sch" USING "building_control_public.sch" USING "commands_weapon.sch" STRING XMLMenu = "Testbed/CutsceneSamples" BOOL gAllowDebugging = TRUE SELECTOR_PED_STRUCT pedSelector //ped indexes for peds used in the cutscenes. PED_INDEX PedRetriever PED_INDEX PedLamar PED_INDEX PedBallasOG PED_INDEX PedHoodRat VEHICLE_INDEX VehBallasBike VEHICLE_INDEX VehTrevor1 = NULL VEHICLE_INDEX VehSubmarine = NULL VEHICLE_INDEX VehNigelP VEHICLE_INDEX VehAliN VEHICLE_INDEX Veh3personBlend OBJECT_INDEX WpnTrevorRifle OBJECT_INDEX LesterCane ENTITY_INDEX ObjMikesBag PED_INDEX PedNigel PED_INDEX PedThornhill PED_INDEX PedLester PED_INDEX PedTrevor //this is used to help with USE_CUTSCENE_WHEEL_COMPRESSION command, you use it to return true when the car has hit its exit state, //then set the use cutscene wheel compression command. this avoids pops. BOOL hasSetCarExit WEAPON_TYPE currentWeaponType PROC Terminate_test_script () if IS_KEYBOARD_KEY_JUST_PRESSED (KEY_S) CLEAR_PRINTS () CLEAR_HELP () //Cleanup_Scenario_Entities () //Temp_cleanup_scenario_cams () SET_PLAYER_COLISION(scplayer, true) IF NOT IS_PED_INJURED (scplayer) SET_PED_COORDS_KEEP_VEHICLE(scplayer, GET_PLAYER_START_POS () ) ENDIF TERMINATE_THIS_THREAD () ENDIF ENDPROC ENUM CutSceneState CutSceneStart, CutSceneStreaming, CutScenePlaying, CutSceneLoading, CutScenePlayingAgain, CutscenePost ENDENUM CutSceneState CutSceneFlow = CutSceneStart PROC INITALISE_TEST_STATE() CutSceneFlow = CutSceneStart ENDPROC ENUM Example ExitIntoIdle = 1, ExitIntoWalk = 2, ExitIntoRun = 3, ExitIntoVehicle = 4, ExitIntoCover = 5, ExitCustomState = 6, ExitStaticProp = 7, ExitPedVehicle = 8, ExitVehiclePassengers = 9, ExitPedCustomAnim = 10, ExitBlendCam = 11, ExitVehTestBed = 12 ENDENUM PROC SETUP_TEST_DATA () SWITCH int_to_enum (Example, gcurrentselection) CASE ExitIntoIdle CASE ExitIntoWalk CASE ExitIntoRun CASE ExitIntoVehicle CASE ExitIntoCover CASE ExitCustomState CASE ExitStaticProp CASE ExitPedVehicle CASE ExitVehiclePassengers CASE ExitPedCustomAnim CASE ExitBlendCam CASE ExitVehTestBed BREAK ENDSWITCH ENDPROC //*************THINGS TO CONFIRM BEFORE BEGINNING WORK ON A BLEND************ // Ensure the animation assets have proper blend tags when needed, and if need be the feet are also tagged. // Ensure all entities involved in the blend have correct handles. these need to be set by the animator. //*************************EXAMPLE 1********************** // FAMILY_5_MCS_5_P5 – Player blend to idle //Since by default the active player always blends into an idle, and the camera is a catch up cam, this example //requires nothing except ensuring the active player is set to Player_Zero. Blends with Idles with a catch-up cam is one //of the easiest blends to script. The animator must ensure the mover is not intersecting the ground or a pop will occur. PROC ProcExitIntoIdle() printstring ("FAMILY_5_MCS_5_P5 Idle Blend example") printnl() SWITCH CutSceneFlow CASE CutSceneStart SET_PLAYER_PED_AVAILABLE(CHAR_MICHAEL, TRUE) SET_SELECTOR_PED_BLOCKED(pedSelector, SELECTOR_PED_MICHAEL, FALSE) WHILE NOT SET_CURRENT_SELECTOR_PED(SELECTOR_PED_MICHAEL) WAIT(0) ENDWHILE REQUEST_CUTSCENE ("FAMILY_5_MCS_5_P5") Cutsceneflow = CutsceneStreaming BREAK CASE CutsceneStreaming printstring ("Cutscene Streaming") printnl() IF HAS_CUTSCENE_LOADED () START_CUTSCENE () Cutsceneflow = CutscenePlaying Endif BREAK CASE CutscenePlaying printstring ("Cutscene Playing") printnl() IF CutSceneFlow = CutscenePost ENDIF BREAK Endswitch ENDPROC //*************************EXAMPLE 2********************** // ES_1_RCM_P1 – Player Walking blend, with a ped entity "blending" off camera //This example has Player_one blending into a walk, and a dog ped blending over 1 frame off camera. //In addition to demonstrating blending into a walk with the player, //it is also a good example on how an entity can be handed off camera and safely warped for a blend. provided they are off screen. //If the players walk is a bit wobbly, and or pops, ask the assigned animator for the cutscene //to check the feet are tagged properly, and the mover is not in the ground. PROC ProcExitIntoWalk() SWITCH CutSceneFlow CASE CutSceneStart // force active player to be franklin SET_PLAYER_PED_AVAILABLE(CHAR_FRANKLIN, TRUE) SET_SELECTOR_PED_BLOCKED(pedSelector, SELECTOR_PED_FRANKLIN, FALSE) WHILE NOT SET_CURRENT_SELECTOR_PED(SELECTOR_PED_FRANKLIN) WAIT(0) ENDWHILE REQUEST_CUTSCENE ("ES_1_RCM_P1") Cutsceneflow = CutsceneStreaming BREAK CASE CutsceneStreaming printstring ("Cutscene Streaming") printnl() //Set ped components and register entities IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID()) SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Franklin", PLAYER_PED_ID()) ENDIF IF HAS_CUTSCENE_LOADED () REGISTER_ENTITY_FOR_CUTSCENE(PLAYER_PED_ID(), "Franklin", CU_ANIMATE_EXISTING_SCRIPT_ENTITY, PLAYER_ONE) REGISTER_ENTITY_FOR_CUTSCENE(PedRetriever, "Hudson", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, A_C_RETRIEVER) START_CUTSCENE () Cutsceneflow = CutscenePlaying ENDIF BREAK CASE CutscenePlaying //check every frame for peds loaded in memory, then register them once they are. IF NOT DOES_ENTITY_EXIST(PedRetriever) IF DOES_ENTITY_EXIST(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Hudson")) PedRetriever = GET_PED_INDEX_FROM_ENTITY_INDEX(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Hudson")) ENDIF ENDIF //Setting task on Franklin to WALK for 3 seconds IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Franklin") IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID()) SIMULATE_PLAYER_INPUT_GAIT(PLAYER_ID(),(1),(3000), PEDMOVE_WALK) FORCE_PED_MOTION_STATE(PLAYER_PED_ID(), MS_ON_FOOT_WALK, TRUE, FAUS_CUTSCENE_EXIT) ENDIF ENDIF //Warping A_C_Retriever to face correct direction, and walk. IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Hudson") IF NOT IS_PED_INJURED(PedRetriever) SET_ENTITY_COORDS(PedRetriever, << -192.7, 1298.6, 303.8 >>) SET_ENTITY_HEADING(PedRetriever, 220.1325) IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID()) TASK_SMART_FLEE_PED(PedRetriever, PLAYER_PED_ID(), 1000, -1) ENDIF ENDIF ENDIF IF CAN_SET_EXIT_STATE_FOR_CAMERA() SET_GAMEPLAY_CAM_RELATIVE_HEADING(0) ENDIF IF NOT IS_CUTSCENE_PLAYING() CutSceneFlow = CutscenePost ENDIF BREAK Endswitch ENDPROC //*************************EXAMPLE 3********************** // FRA_0_MCS_1 – Player Running blend, 2 peds and a vehicle blend off camera over 1 frame, ped blends into a run in tandem with player. //This example has the player blending into a run, along with a ped that is ahead of the player. //This a good example of the diffrence in setting a state on the player, and a state on a ped. In addition to peds blending off camera. //NOTE: when blending a player so close to a ped at the same time, it is important that the animator makes sure //there is ample room between entities while blending into a run, or else they may bump into each other //and literally knock each other to the ground.the cutscene has also been set up to equip the players last used //weapon when launching the cutscene, if using unarmed, you are equipped with the strongest weapon in the inventory. PROC ProcExitIntoRun() SWITCH CutSceneFlow CASE CutSceneStart //Force player to be set as franklin, and preload ig_lamardavis. We have to pre-load this model, because the cutscene has a //model swap with the cutscene version of lamar, CS_LamarDavis. REQUEST_MODEL(IG_LAMARDAVIS) WHILE NOT HAS_MODEL_LOADED(IG_LAMARDAVIS) WAIT(0) ENDWHILE PedLamar = CREATE_PED(PEDTYPE_MISSION, IG_LAMARDAVIS, <<0,1,2>>) SET_PLAYER_PED_AVAILABLE(CHAR_FRANKLIN, TRUE) SET_SELECTOR_PED_BLOCKED(pedSelector, SELECTOR_PED_FRANKLIN, FALSE) WHILE NOT SET_CURRENT_SELECTOR_PED(SELECTOR_PED_FRANKLIN) WAIT(0) ENDWHILE REQUEST_CUTSCENE ("FRA_0_MCS_1") Cutsceneflow = CutsceneStreaming BREAK CASE CutsceneStreaming IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID()) SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Franklin", PLAYER_PED_ID()) ENDIF IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID()) GET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), currentWeaponType) REQUEST_WEAPON_ASSET(currentWeaponType) ENDIF //Register entities IF HAS_CUTSCENE_LOADED () REGISTER_ENTITY_FOR_CUTSCENE(PLAYER_PED_ID(), "Franklin", CU_ANIMATE_EXISTING_SCRIPT_ENTITY, PLAYER_ONE) IF NOT IS_PED_INJURED(PedLamar) REGISTER_ENTITY_FOR_CUTSCENE(PedLamar, "Lamar", CU_ANIMATE_EXISTING_SCRIPT_ENTITY, IG_LAMARDAVIS) ENDIF REGISTER_ENTITY_FOR_CUTSCENE(PedBallasOG, "Ballas_OG", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, IG_BALLASOG) REGISTER_ENTITY_FOR_CUTSCENE(PedHoodRat, "HoodRat_girl", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, A_F_Y_Genhot_01) REGISTER_ENTITY_FOR_CUTSCENE(VehBallasBike, "BallasOG_Bike", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, BATI) START_CUTSCENE () Cutsceneflow = CutscenePlaying ENDIF BREAK CASE CutscenePlaying //Wait for models to be loaded into memory IF NOT DOES_ENTITY_EXIST(PedBallasOG) IF DOES_ENTITY_EXIST(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Ballas_OG")) PedBallasOG = GET_PED_INDEX_FROM_ENTITY_INDEX(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Ballas_OG")) ENDIF ENDIF IF NOT DOES_ENTITY_EXIST(PedHoodRat) IF DOES_ENTITY_EXIST(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("HoodRat_Girl")) PedHoodRat = GET_PED_INDEX_FROM_ENTITY_INDEX(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("HoodRat_Girl")) ENDIF ENDIF IF NOT DOES_ENTITY_EXIST(VehBallasBike) IF DOES_ENTITY_EXIST(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("BallasOG_Bike")) VehBallasBike = GET_VEHICLE_INDEX_FROM_ENTITY_INDEX(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("BallasOG_Bike")) ENDIF ENDIF //Setting Functions to Player_One to simulate player input on exit sprinting for 4 seconds. IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Franklin") IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID()) IF currentWeaponType = WEAPONTYPE_UNARMED SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), GET_BEST_PED_WEAPON(PLAYER_PED_ID()), TRUE) FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID(), TRUE) ELSE SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), currentWeaponType, TRUE) FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID(), TRUE) ENDIF ENDIF IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID()) SIMULATE_PLAYER_INPUT_GAIT(PLAYER_ID(),(3.0),(4000), PEDMOVE_SPRINT) FORCE_PED_MOTION_STATE(PLAYER_PED_ID(), MS_ON_FOOT_SPRINT, TRUE, FAUS_CUTSCENE_EXIT) ENDIF ENDIF //Lamar also set to run to a certain point and sprint there. IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Lamar", IG_LAMARDAVIS) IF NOT IS_PED_INJURED(PedLamar) TASK_FOLLOW_NAV_MESH_TO_COORD(PedLamar, <<364.8270, 330.3931, 102.5908>>, PEDMOVE_SPRINT, DEFAULT_TIME_BEFORE_WARP, DEFAULT_NAVMESH_RADIUS, ENAV_DEFAULT) IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID()) TASK_SMART_FLEE_PED(PedLamar, PLAYER_PED_ID(), 1000, -1) ENDIF FORCE_PED_MOTION_STATE(PedLamar, MS_ON_FOOT_SPRINT, TRUE, FAUS_CUTSCENE_EXIT) ENDIF ENDIF //A_F_Y_Genhot_01 is off camera on exit, so keep her in the world and set to smart run from the player IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("HoodRat_Girl") IF NOT IS_PED_INJURED(PedHoodRat) SET_ENTITY_COORDS(PedHoodRat, <<387.3800, 359.1678, 101.4447>>) SET_ENTITY_HEADING(PedHoodRat, 98.7730) IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID()) TASK_SMART_FLEE_PED(PedHoodRat, PLAYER_PED_ID(), 1000, -1) ENDIF ENDIF ENDIF //IG_BallasOG is off camera so will attach ballasOG to bati as driver, and give Bati to AI control and drive away from player. IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Ballas_OG") IF NOT IS_PED_INJURED(PedBallasOG) IF IS_VEHICLE_DRIVEABLE(VehBallasBike) SET_PED_INTO_VEHICLE(PedBallasOG, VehBallasBike, VS_DRIVER) ENDIF IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID()) TASK_SMART_FLEE_PED(PedBallasOG, PLAYER_PED_ID(), 1000, -1) ENDIF ENDIF ENDIF IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("BallasOG_Bike") IF NOT IS_VEHICLE_DRIVEABLE(VehBallasBike) SET_ENTITY_COORDS(VehBallasBike, <<366.9993, 335.2962, 102.3977>>) SET_ENTITY_HEADING(VehBallasBike, 161.8660) SET_VEHICLE_ON_GROUND_PROPERLY(VehBallasBike) ENDIF ENDIF //Camera set to be behind the player on blendout, to avoid swinging around wildly. IF CAN_SET_EXIT_STATE_FOR_CAMERA() SET_GAMEPLAY_CAM_RELATIVE_HEADING(0) SET_GAMEPLAY_CAM_RELATIVE_PITCH(0) ENDIF IF NOT IS_CUTSCENE_PLAYING() CutSceneFlow = CutscenePost ENDIF BREAK Endswitch ENDPROC //*************************EXAMPLE 4********************** // FIN_C2_MCS_5 – Player blending into a vehicle, with the vehicle at rest. //This example has the player blending into a vehicle that is at rest. //There has to be an event set on the player to attach to the vehicle. //in addition for this to work the animator must ensure the player hits his exit state before the vehicle, and the movers is aligned //1:1 with the respective seatnode of the vehicle, as well as ensure the vehicles positioning matches exactly 1:1 with the //vehciles position taken from a vehicle recording of the vehicle at rest. if not physics will cause a pop. //it is important not to avoid using set on ground properly as this always causes a pop, when blending a vehicle out in an idle positon always use //use_cutscene_wheel_compression on the exit state of the vehicle. PROC ProcExitIntoVehicle() SWITCH CutSceneFlow CASE CutSceneStart //Forcing player to be trevor SET_PLAYER_PED_AVAILABLE(CHAR_TREVOR, TRUE) SET_SELECTOR_PED_BLOCKED(pedSelector, SELECTOR_PED_TREVOR, FALSE) WHILE NOT SET_CURRENT_SELECTOR_PED(SELECTOR_PED_TREVOR) WAIT(0) ENDWHILE REQUEST_CUTSCENE ("FIN_C2_MCS_5") Cutsceneflow = CutsceneStreaming BREAK CASE CutsceneStreaming //Registering entities IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID()) SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Trevor", PLAYER_PED_ID()) printstring ("check if player is dead") printnl() ENDIF IF HAS_CUTSCENE_LOADED () printstring ("cutscene is loaded") printnl() REGISTER_ENTITY_FOR_CUTSCENE(PLAYER_PED_ID(), "Trevor", CU_ANIMATE_EXISTING_SCRIPT_ENTITY, PLAYER_TWO) printstring ("Register Trevor") printnl() REGISTER_ENTITY_FOR_CUTSCENE(VehTrevor1, "tornado", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, TORNADO) printstring ("Register car") printnl() START_CUTSCENE() Cutsceneflow = CutscenePlaying ENDIF BREAK CASE CutscenePlaying //Checking if entities are in memory, once they are setting up thier exit states. IF NOT DOES_ENTITY_EXIST(VehTrevor1) IF DOES_ENTITY_EXIST(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("tornado")) VehTrevor1 = GET_VEHICLE_INDEX_FROM_ENTITY_INDEX(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("tornado")) ENDIF ENDIF IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("tornado", TORNADO) ENDIF IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Trevor") //now that both trevor and the car are regisitered, in memory, they are ready to receive states //for the vehicle blend to work, you have to attach a ped before setting up the vehicle exit state. IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID()) IF IS_VEHICLE_DRIVEABLE(VehTrevor1) SET_PED_INTO_VEHICLE(PLAYER_PED_ID(), VehTrevor1) IF IS_VEHICLE_DRIVEABLE(VehTrevor1) SET_VEHICLE_DOOR_SHUT(VehTrevor1, SC_DOOR_FRONT_RIGHT) SET_VEHICLE_DOOR_SHUT(VehTrevor1, SC_DOOR_FRONT_LEFT) SET_VEHICLE_DOOR_SHUT(VehTrevor1, SC_DOOR_REAR_LEFT) SET_VEHICLE_DOOR_SHUT(VehTrevor1, SC_DOOR_REAR_RIGHT) SET_VEHICLE_DOOR_SHUT(VehTrevor1, SC_DOOR_BOOT) //for a blend, not only should you use SET_VEHICLE_USE_CUTSCENE_WHEEL_COMPRESSION in place of //SET_VEHICLE_ON_GROUND_PROPERLY, but it also needs to be the last state set, otherwise it disturbs the //physics and causes a pop. (IE setting cutscene wheel compression, then attaching a ped after will cause a pop) SET_VEHICLE_USE_CUTSCENE_WHEEL_COMPRESSION(VehTrevor1) ENDIF ENDIF ENDIF ENDIF IF CAN_SET_EXIT_STATE_FOR_CAMERA() SET_GAMEPLAY_CAM_RELATIVE_HEADING(0) SET_GAMEPLAY_CAM_RELATIVE_PITCH(0) ENDIF IF NOT IS_CUTSCENE_PLAYING() CutSceneFlow = CutscenePost ENDIF BREAK Endswitch ENDPROC //*************************EXAMPLE 5********************** // CHI_1_MCS_1 – Player blending into Cover with a 2 handed weapon //In this example, the player blends into cover with a carbine rifle. You must force the exit state of the player to be in cover state //additionally you must also ensure the movers attach to cover point matches the cutscene mover position. if this is not possible, ask //the animator to position the mover where this will be possible. //you must also have the weapon attach itself to the player properly. for this to work however, the animator must ensure //that the ph_bone of the player is aligned 1:1 with the gungrip bone of the weapon. //**NOTE** THIS BLEND OUT TYPE WILL NOT WORK IF THE CAMERA IS A CATCH UP CAMERA. //if it is, then ask the animator to change the camera to a blendout cam instead. PROC ProcExitIntoCover() SWITCH CutSceneFlow CASE CutSceneStart SET_PLAYER_PED_AVAILABLE(CHAR_TREVOR, TRUE) SET_SELECTOR_PED_BLOCKED(pedSelector, SELECTOR_PED_TREVOR, FALSE) WHILE NOT SET_CURRENT_SELECTOR_PED(SELECTOR_PED_TREVOR) WAIT(0) ENDWHILE REQUEST_CUTSCENE ("CHI_1_MCS_1") Cutsceneflow = CutsceneStreaming BREAK CASE CutsceneStreaming //register player entity IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID()) SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Trevor", PLAYER_PED_ID()) ENDIF //Here we give the weapon to trevor, if not assert will happen as the script will try to //give trevor a weapon he does not have in his inventory. for the blend to work the entity must have the //weapon they are blending with before the exit state is hit. IF NOT IS_PED_INJURED(PLAYER_PED_ID()) GIVE_WEAPON_TO_PED(PLAYER_PED_ID(), WEAPONTYPE_CARBINERIFLE, 500) ENDIF IF HAS_CUTSCENE_LOADED () REGISTER_ENTITY_FOR_CUTSCENE(PLAYER_PED_ID(), "Trevor", CU_ANIMATE_EXISTING_SCRIPT_ENTITY, PLAYER_TWO) WpnTrevorRifle = CREATE_WEAPON_OBJECT_FROM_PED_WEAPON_WITH_COMPONENTS(PLAYER_PED_ID(), WEAPONTYPE_CARBINERIFLE, TRUE) REGISTER_ENTITY_FOR_CUTSCENE(WpnTrevorRifle, "Trevors_weapon", CU_ANIMATE_EXISTING_SCRIPT_ENTITY) START_CUTSCENE() Cutsceneflow = CutscenePlaying Endif BREAK CASE CutscenePlaying IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Trevor") IF NOT IS_PED_INJURED(PLAYER_PED_ID()) //Here we give a task to the player ped to go into cover near the coords that the player hits his exit state at. TASK_PUT_PED_DIRECTLY_INTO_COVER(PLAYER_PED_ID(), <<1389.7571, 3599.7686, 37.9419>>, -1, FALSE, 0.5, TRUE, FALSE) FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID(), FALSE) ENDIF ENDIF // Here we give trevor his weapon, that was created, and given to at the start of the proc. IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Trevors_weapon") IF NOT IS_PED_INJURED(PLAYER_PED_ID()) GIVE_WEAPON_OBJECT_TO_PED(WpnTrevorRifle, PLAYER_PED_ID()) ENDIF ENDIF //setting camera heading and pitch to look at the ground outside the window IF CAN_SET_EXIT_STATE_FOR_CAMERA() SET_GAMEPLAY_CAM_RELATIVE_HEADING(112.5) SET_GAMEPLAY_CAM_RELATIVE_PITCH(-13.2) ENDIF IF NOT IS_CUTSCENE_PLAYING() CutSceneFlow = CutscenePost ENDIF BREAK Endswitch ENDPROC //*************************EXAMPLE 6********************** // LSDH_2B_MCS_1 – Player blending into a custom animation state (drunk) //In this example, the player blends into a custom animation state of being moderately drunk. //Which has to be forced on via script. However, For this to work the animator has to //match the exact pose of the first frame of the custom animation state. PROC ProcExitCustomState() SWITCH CutSceneFlow CASE CutSceneStart SET_PLAYER_PED_AVAILABLE(CHAR_TREVOR, TRUE) SET_SELECTOR_PED_BLOCKED(pedSelector, SELECTOR_PED_TREVOR, FALSE) WHILE NOT SET_CURRENT_SELECTOR_PED(SELECTOR_PED_TREVOR) WAIT(0) ENDWHILE REQUEST_CUTSCENE ("LSDH_2B_MCS_1") Cutsceneflow = CutsceneStreaming BREAK CASE CutsceneStreaming IF NOT IS_PED_INJURED(PLAYER_PED_ID()) SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Trevor", PLAYER_PED_ID()) ENDIF IF HAS_CUTSCENE_LOADED () REGISTER_ENTITY_FOR_CUTSCENE(PLAYER_PED_ID(), "Trevor", CU_ANIMATE_EXISTING_SCRIPT_ENTITY, PLAYER_TWO) REGISTER_ENTITY_FOR_CUTSCENE(VehSubmarine, "Submarine", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, SUBMERSIBLE) START_CUTSCENE() Cutsceneflow = CutscenePlaying Endif BREAK CASE CutscenePlaying //here we set the ped clipset to the custom drunk moveclip, and then set the player to be drunk for 3 seconds after. IF IS_CUTSCENE_PLAYING() REQUEST_ANIM_SET("move_m@drunk@verydrunk") IF HAS_ANIM_SET_LOADED("move_m@drunk@verydrunk") IF NOT IS_PED_INJURED(PLAYER_PED_ID()) SET_PED_MOVEMENT_CLIPSET(PLAYER_PED_ID(), Get_Drunk_Level_Moveclip(DL_verydrunk), 0.0) ENDIF ENDIF ENDIF IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Trevor") IF NOT IS_PED_INJURED(PLAYER_PED_ID()) MAKE_PED_DRUNK(PLAYER_PED_ID(), 30000) ENDIF ENDIF IF NOT DOES_ENTITY_EXIST(VehSubmarine) IF DOES_ENTITY_EXIST(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Submarine")) VehSubmarine = GET_VEHICLE_INDEX_FROM_ENTITY_INDEX(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Submarine")) ENDIF ENDIF IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Submarine") IF NOT IS_VEHICLE_DRIVEABLE(Vehsubmarine) SET_VEHICLE_ON_GROUND_PROPERLY(Vehsubmarine) ENDIF ENDIF IF CAN_SET_EXIT_STATE_FOR_CAMERA() SET_GAMEPLAY_CAM_RELATIVE_HEADING(0) SET_GAMEPLAY_CAM_RELATIVE_PITCH(0) ENDIF IF NOT IS_CUTSCENE_PLAYING() CutSceneFlow = CutscenePost ENDIF BREAK Endswitch ENDPROC //*************************EXAMPLE 7********************** // LES_1A_MCS_4 – Player blending into walk, in addition to having a static prop remain in world in the same position the cutscene left it in. //In this example, the player blends into a walk, and his backpack that he has removed remains on the desk behind him and in the world //even after the cutscene ends. demonstrating leaving props in the world after a cutscene is over. //Most of the time this pops as cutscenes have more animation channels open that ingame objects normally do, so its best to //hand them off camera, or during a camera cut. in this example it is done off camera. PROC ProcExitStaticProp() SWITCH CutSceneFlow CASE CutSceneStart SET_PLAYER_PED_AVAILABLE(CHAR_MICHAEL, TRUE) SET_SELECTOR_PED_BLOCKED(pedSelector, SELECTOR_PED_MICHAEL, FALSE) WHILE NOT SET_CURRENT_SELECTOR_PED(SELECTOR_PED_MICHAEL) WAIT(0) ENDWHILE REQUEST_CUTSCENE ("LES_1A_MCS_4") Cutsceneflow = CutsceneStreaming BREAK CASE CutsceneStreaming SET_BUILDING_STATE(BUILDINGNAME_IPL_INVADER_OFFICE_INTERIOR, BUILDINGSTATE_DESTROYED ) IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID()) SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Michael", PLAYER_PED_ID()) ENDIF IF HAS_CUTSCENE_LOADED () REGISTER_ENTITY_FOR_CUTSCENE(ObjMikesBag, "Michaels_Bag",CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, P_MICHAEL_BACKPACK_S) START_CUTSCENE() Cutsceneflow = CutscenePlaying Endif BREAK CASE CutscenePlaying IF NOT DOES_ENTITY_EXIST(ObjMikesBag) IF DOES_ENTITY_EXIST(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Michaels_Bag")) ObjMikesBag = GET_OBJECT_INDEX_FROM_ENTITY_INDEX(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Michaels_Bag")) ENDIF ENDIF IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Michael") If not IS_PED_INJURED(PLAYER_PED_ID()) SIMULATE_PLAYER_INPUT_GAIT(PLAYER_ID(),(1),(3000), PEDMOVE_WALK) FORCE_PED_MOTION_STATE(PLAYER_PED_ID(), MS_ON_FOOT_WALK, TRUE, FAUS_CUTSCENE_EXIT) ENDIF ENDIF //here we warp the prop to stay in its position and stay in the world. IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Michaels_Bag") SET_ENTITY_COORDS(ObjMikesBag, <<-1053.15, -230.89, 43.92>>, FALSE) ENDIF IF CAN_SET_EXIT_STATE_FOR_CAMERA() SET_GAMEPLAY_CAM_RELATIVE_HEADING(0) SET_GAMEPLAY_CAM_RELATIVE_PITCH(0) ENDIF IF NOT IS_CUTSCENE_PLAYING() SET_BUILDING_STATE(BUILDINGNAME_IPL_INVADER_OFFICE_INTERIOR, BUILDINGSTATE_CLEANUP, TRUE ) SET_STATE_OF_CLOSEST_DOOR_OF_TYPE(v_ilev_door_orangesolid, <<-1055.9583, -236.4251, 44.1710>>, false, 0) CutSceneFlow = CutscenePost ENDIF BREAK Endswitch ENDPROC //*************************EXAMPLE 8********************** // NMT_2_MCS_2 – Player blending into idle, while 2 other peds blend into a vehicle that is in motion. //In this example, the player blends into an idle, while watching 2 peds blending on camera in a vehicle that is driving away. //For this to work the animator must ensure mover's of the peds have to be aligned 1:1 with the seat nodes of the vehicle, in addition to that //the vehicle needs to be playing an unaltered recording at the moment the blend occurs on the vehicle to match with the speed, //velocity, and suspension of the vehicle when it is handed to the game, otherwise a pop will occur. PROC ProcExitPedVehicle() SWITCH CutSceneFlow CASE CutSceneStart SET_PED_POPULATION_BUDGET(0) SET_VEHICLE_POPULATION_BUDGET(0) REQUEST_MODEL(IG_NIGEL) WHILE NOT HAS_MODEL_LOADED(IG_NIGEL) WAIT(0) ENDWHILE PedNigel = CREATE_PED(PEDTYPE_MISSION, IG_NIGEL, <<0,1,2>>) REQUEST_MODEL(IG_MRS_THORNHILL) WHILE NOT HAS_MODEL_LOADED(IG_MRS_THORNHILL) WAIT(0) ENDWHILE PedThornhill = CREATE_PED(PEDTYPE_MISSION, IG_MRS_THORNHILL, <<0,1,2>>) SET_PLAYER_PED_AVAILABLE(CHAR_TREVOR, TRUE) SET_SELECTOR_PED_BLOCKED(pedSelector, SELECTOR_PED_TREVOR, FALSE) WHILE NOT SET_CURRENT_SELECTOR_PED(SELECTOR_PED_TREVOR) WAIT(0) ENDWHILE REQUEST_CUTSCENE ("NMT_2_MCS_2") Cutsceneflow = CutsceneStreaming BREAK CASE CutsceneStreaming IF NOT IS_PED_INJURED(PLAYER_PED_ID()) SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Trevor", PLAYER_PED_ID()) ENDIF IF HAS_CUTSCENE_LOADED () IF NOT IS_PED_INJURED(PedNigel) REGISTER_ENTITY_FOR_CUTSCENE(PedNigel, "NIGEL", CU_ANIMATE_EXISTING_SCRIPT_ENTITY, IG_NIGEL) ENDIF IF NOT IS_PED_INJURED(PedThornhill) REGISTER_ENTITY_FOR_CUTSCENE(PedThornhill, "MRS_Thornhill", CU_ANIMATE_EXISTING_SCRIPT_ENTITY, IG_MRS_THORNHILL) ENDIF REGISTER_ENTITY_FOR_CUTSCENE(VehNigelP, "Showroom_Car", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, PREMIER) REGISTER_ENTITY_FOR_CUTSCENE(VehAliN, "EXL_2_abandoned_car", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, DUBSTA) START_CUTSCENE() Cutsceneflow = CutscenePlaying Endif BREAK CASE CutscenePlaying //setting ped and vehicle budget to 0 just to avoid peds and vehicles getting in the way, and clearing area. IF IS_CUTSCENE_PLAYING() CLEAR_AREA(<<389.9,-615.1,28.8>>, 3000, TRUE) SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0) SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0) ENDIF IF NOT DOES_ENTITY_EXIST(PedNigel) IF DOES_ENTITY_EXIST(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("NIGEL")) PedNigel = GET_PED_INDEX_FROM_ENTITY_INDEX(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("NIGEL")) ENDIF ENDIF IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("NIGEL") IF NOT IS_PED_INJURED(PedNigel) IF IS_VEHICLE_DRIVEABLE(VehNigelP) SET_PED_INTO_VEHICLE(PedNigel, VehNigelP, VS_DRIVER) IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID()) TASK_SMART_FLEE_PED(PedNigel, PLAYER_PED_ID(), 1000, -1) FORCE_PED_AI_AND_ANIMATION_UPDATE(PedNigel) ENDIF ENDIF ENDIF ENDIF IF NOT DOES_ENTITY_EXIST(PedThornhill) IF DOES_ENTITY_EXIST(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("MRS_Thornhill")) PedThornhill = GET_PED_INDEX_FROM_ENTITY_INDEX(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("MRS_Thornhill")) ENDIF ENDIF IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("MRS_Thornhill") IF NOT IS_PED_INJURED(PedThornhill) IF IS_VEHICLE_DRIVEABLE(VehNigelP) SET_PED_INTO_VEHICLE(PedThornhill, VehNigelP, VS_FRONT_RIGHT) ENDIF ENDIF ENDIF IF NOT DOES_ENTITY_EXIST(VehNigelP) IF DOES_ENTITY_EXIST(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Showroom_Car")) VehNigelP = GET_VEHICLE_INDEX_FROM_ENTITY_INDEX(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Showroom_Car")) ENDIF ENDIF IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Showroom_Car") IF IS_VEHICLE_DRIVEABLE(VehNigelP) SET_VEHICLE_DOOR_SHUT(VehNigelP, SC_DOOR_FRONT_RIGHT) SET_VEHICLE_DOOR_SHUT(VehNigelP, SC_DOOR_FRONT_LEFT) SET_VEHICLE_DOOR_SHUT(VehNigelP, SC_DOOR_REAR_LEFT) SET_VEHICLE_DOOR_SHUT(VehNigelP, SC_DOOR_REAR_RIGHT) SET_VEHICLE_DOOR_SHUT(VehNigelP, SC_DOOR_BOOT) SET_VEHICLE_USE_CUTSCENE_WHEEL_COMPRESSION(VehNigelP) SET_ENTITY_VELOCITY(VehNigelP, <<10,10,0>>) ENDIF ENDIF IF NOT DOES_ENTITY_EXIST(VehAliN) IF DOES_ENTITY_EXIST(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("EXL_2_abandoned_car")) VehAliN = GET_VEHICLE_INDEX_FROM_ENTITY_INDEX(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("EXL_2_abandoned_car")) ENDIF ENDIF IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("EXL_2_abandoned_car") IF IS_VEHICLE_DRIVEABLE(VehAliN) SET_VEHICLE_DOOR_SHUT(VehAliN, SC_DOOR_FRONT_RIGHT) SET_VEHICLE_DOOR_SHUT(VehAliN, SC_DOOR_FRONT_LEFT) SET_VEHICLE_DOOR_SHUT(VehAliN, SC_DOOR_REAR_LEFT) SET_VEHICLE_DOOR_SHUT(VehAliN, SC_DOOR_REAR_RIGHT) SET_VEHICLE_DOOR_SHUT(VehAliN, SC_DOOR_BOOT) SET_VEHICLE_ON_GROUND_PROPERLY(VehAliN) ENDIF ENDIF IF NOT IS_CUTSCENE_PLAYING() CutSceneFlow = CutscenePost ENDIF //setting ped and vehicle budget back to defaults. if not, cars and peds will never load. SET_PED_POPULATION_BUDGET(3) SET_VEHICLE_POPULATION_BUDGET(3) BREAK Endswitch ENDPROC //*************************EXAMPLE 9********************** // RBHS_MCS_1 – Player blending into vehicle, while 2 other peds blend into a vehicle as well, vehicle is idle resting //player blends into vehicle while it is in its idle resting state, as well as 2 other peds blending into the same vehicle. //animator must ensure all movers are aligned 1:1 with the respective seatnodes of the vehicles, as well as ensure the vehicles positioning //matches exactly 1:1 with the vehciles position taken from a vehicle recording of the vehicle at rest. if not physics will cause a pop. //it is important not to use set on ground properly as this always causes a pop, when blending a vehicle out in an idle positon always use //"use_cutscene_wheel_compression PROC ProcExitVehiclePassengers() SWITCH CutSceneFlow CASE CutSceneStart SET_PED_POPULATION_BUDGET(0) SET_VEHICLE_POPULATION_BUDGET(0) REQUEST_MODEL(IG_LESTERCREST) WHILE NOT HAS_MODEL_LOADED(IG_LESTERCREST) WAIT(0) ENDWHILE PedLester = CREATE_PED(PEDTYPE_MISSION, IG_LESTERCREST, <<0,1,2>>) SET_PLAYER_PED_AVAILABLE(CHAR_MICHAEL, TRUE) SET_SELECTOR_PED_BLOCKED(pedSelector, SELECTOR_PED_MICHAEL, FALSE) WHILE NOT SET_CURRENT_SELECTOR_PED(SELECTOR_PED_MICHAEL) WAIT(0) ENDWHILE REQUEST_CUTSCENE ("RBHS_MCS_1") Cutsceneflow = CutsceneStreaming BREAK CASE CutsceneStreaming IF NOT IS_PED_INJURED(PLAYER_PED_ID()) SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Michael", PLAYER_PED_ID()) ENDIF IF HAS_CUTSCENE_LOADED() IF NOT IS_PED_INJURED(PedLester) REGISTER_ENTITY_FOR_CUTSCENE(PedLester, "Lester", CU_ANIMATE_EXISTING_SCRIPT_ENTITY, IG_LESTERCREST) ENDIF REGISTER_ENTITY_FOR_CUTSCENE(PedTrevor, "Trevor", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, PLAYER_TWO) REGISTER_ENTITY_FOR_CUTSCENE(Veh3personBlend, "michaels_car", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, PREMIER) START_CUTSCENE() Cutsceneflow = CutscenePlaying Endif BREAK CASE CutscenePlaying IF IS_CUTSCENE_PLAYING() CLEAR_AREA(<<-339.9,6183.1,31.2>>, 3000, TRUE) SET_PED_DENSITY_MULTIPLIER_THIS_FRAME(0.0) SET_VEHICLE_DENSITY_MULTIPLIER_THIS_FRAME(0.0) ENDIF IF NOT DOES_ENTITY_EXIST(PedLester) IF DOES_ENTITY_EXIST(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Lester")) PedLester = GET_PED_INDEX_FROM_ENTITY_INDEX(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Lester")) ENDIF ENDIF If CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Lester") If not IS_PED_INJURED(PedLester) IF IS_VEHICLE_DRIVEABLE(Veh3personBlend) SET_PED_INTO_VEHICLE(PedLester,Veh3personBlend, VS_BACK_RIGHT) ENDIF ENDIF ENDIF IF NOT DOES_ENTITY_EXIST(PedTrevor) IF DOES_ENTITY_EXIST(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Trevor")) PedTrevor = GET_PED_INDEX_FROM_ENTITY_INDEX(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Trevor")) ENDIF ENDIF If CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Trevor") If not IS_PED_INJURED(PedTrevor) IF IS_VEHICLE_DRIVEABLE(Veh3personBlend) SET_PED_INTO_VEHICLE(PedTrevor,Veh3personBlend, VS_FRONT_RIGHT) ENDIF ENDIF ENDIF If CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Michael") If not IS_PED_INJURED(PLAYER_PED_ID()) IF IS_VEHICLE_DRIVEABLE(Veh3personBlend) SET_PED_INTO_VEHICLE(PLAYER_PED_ID(),Veh3personBlend, VS_DRIVER) ENDIF ENDIF ENDIF IF NOT DOES_ENTITY_EXIST(Veh3personBlend) IF DOES_ENTITY_EXIST(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("michaels_car")) Veh3personBlend = GET_VEHICLE_INDEX_FROM_ENTITY_INDEX(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("michaels_car")) ENDIF ENDIF //Sett up a bool to return true after the exit state is hit so the SET_VEHICLE_USE_CUTSCENE_WHEEL_COMPRESSION no longer //is needed, avoiding a pop. IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("michaels_car") IF IS_VEHICLE_DRIVEABLE(Veh3personBlend) hasSetCarExit = TRUE SET_VEHICLE_DOORS_SHUT(Veh3personBlend) ENDIF ENDIF IF IS_VEHICLE_DRIVEABLE(Veh3personBlend) IF NOT hasSetCarExit SET_VEHICLE_USE_CUTSCENE_WHEEL_COMPRESSION(Veh3personBlend, TRUE, TRUE, TRUE) ENDIF ENDIF IF NOT IS_CUTSCENE_PLAYING() CutSceneFlow = CutscenePost ENDIF SET_PED_POPULATION_BUDGET(3) SET_VEHICLE_POPULATION_BUDGET(3) BREAK Endswitch ENDPROC //*************************EXAMPLE 10********************** // ARMENIAN_1_INT – Player blending into walk, while ped blends into custom ingame animation //Probably one of the harder blend outs, Player blends into a walk, while ped blends into a custom ingame animation. //for this to work you have to not only force the ped entity into the custom ingame animation, //but the animators (cutscene and ingame) must ensure the last frame of the cutscene and first frame of the ingame animation //both match exactly, both skeleton and mover, for the blend to work correctly. PROC ProcExitPedCustomAnim() SWITCH CutSceneFlow CASE CutSceneStart REQUEST_MODEL(IG_LAMARDAVIS) WHILE NOT HAS_MODEL_LOADED(IG_LAMARDAVIS) WAIT(0) ENDWHILE PedLamar = CREATE_PED(PEDTYPE_MISSION, IG_LAMARDAVIS, <<0,1,2>>) SET_PLAYER_PED_AVAILABLE(CHAR_FRANKLIN, TRUE) SET_SELECTOR_PED_BLOCKED(pedSelector, SELECTOR_PED_FRANKLIN, FALSE) WHILE NOT SET_CURRENT_SELECTOR_PED(SELECTOR_PED_FRANKLIN) WAIT(0) ENDWHILE REQUEST_CUTSCENE ("ARMENIAN_1_INT") Cutsceneflow = CutsceneStreaming BREAK CASE CutsceneStreaming IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID()) SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED("Franklin", PLAYER_PED_ID()) ENDIF IF HAS_CUTSCENE_LOADED () IF NOT IS_PED_INJURED(PedLamar) REGISTER_ENTITY_FOR_CUTSCENE(PedLamar, "Lamar", CU_ANIMATE_EXISTING_SCRIPT_ENTITY, IG_LAMARDAVIS) ENDIF START_CUTSCENE() Cutsceneflow = CutscenePlaying Endif BREAK CASE CutscenePlaying IF IS_CUTSCENE_PLAYING() REQUEST_ANIM_DICT("missarmenian1leadinout") IF HAS_ANIM_DICT_LOADED("missarmenian1leadinout") IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Lamar") IF NOT IS_PED_INJURED(PedLamar) And NOT IS_ENTITY_PLAYING_ANIM(PedLamar, "missarmenian1leadinout", "arm1_int_leadout_gatewalk_lam") TASK_PLAY_ANIM_ADVANCED(PedLamar, "missarmenian1leadinout", "arm1_int_leadout_gatewalk_lam", <<-1900.330, -595.638, 12.233>>, <<0.000, 0.000, 48.0>>, INSTANT_BLEND_IN, WALK_BLEND_OUT, -1, AF_USE_KINEMATIC_PHYSICS | AF_HOLD_LAST_FRAME | AF_EXTRACT_INITIAL_OFFSET | AF_USE_MOVER_EXTRACTION, 0.526) FORCE_PED_AI_AND_ANIMATION_UPDATE(PedLamar) ENDIF ENDIF ENDIF ENDIF IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Franklin") IF NOT IS_PED_INJURED(PLAYER_PED_ID()) SIMULATE_PLAYER_INPUT_GAIT(PLAYER_ID(),(1),(3000), PEDMOVE_WALK) FORCE_PED_MOTION_STATE(PLAYER_PED_ID(), MS_ON_FOOT_WALK, TRUE, FAUS_CUTSCENE_EXIT) ENDIF ENDIF IF CAN_SET_EXIT_STATE_FOR_CAMERA() IF not IS_PED_INJURED(PLAYER_PED_ID()) SET_GAMEPLAY_CAM_RELATIVE_HEADING(-41.0 - GET_ENTITY_HEADING(PLAYER_PED_ID())) SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0) ENDIF ENDIF IF NOT IS_CUTSCENE_PLAYING() CutSceneFlow = CutscenePost ENDIF BREAK Endswitch ENDPROC //*************************EXAMPLE 11********************** // ASS_INT_2_ALT1 – Player blending into idle, while ped blends into custom animation state, camera is a blendout and needs heading set. //Player blends into an idle, while lester blends during a camera cut into a custom animation. he pops, but this //is hidden since it happens over a camera cut. //For this to work the animator must ensure that the ped lesterhits his exit state on the camera cut. //the camera is also not a catchup but a blendout, and you must set the heading manually or the camera will try to blend //to a random spot, and will likely look broken. PROC ProcExitBlendCam() SWITCH CutSceneFlow CASE CutSceneStart REQUEST_MODEL(IG_LESTERCREST) WHILE NOT HAS_MODEL_LOADED(IG_LESTERCREST) WAIT(0) ENDWHILE PedLester = CREATE_PED(PEDTYPE_MISSION, IG_LESTERCREST, <<0,1,2>>) SET_PLAYER_PED_AVAILABLE(CHAR_FRANKLIN, TRUE) SET_SELECTOR_PED_BLOCKED(pedSelector, SELECTOR_PED_FRANKLIN, FALSE) WHILE NOT SET_CURRENT_SELECTOR_PED(SELECTOR_PED_FRANKLIN) WAIT(0) ENDWHILE REQUEST_CUTSCENE ("ASS_INT_2_ALT1") Cutsceneflow = CutsceneStreaming BREAK CASE CutsceneStreaming printstring ("Cutscene Streaming") printnl() IF HAS_CUTSCENE_LOADED () IF NOT IS_PED_INJURED(PedLester) REGISTER_ENTITY_FOR_CUTSCENE(PedLester, "Lester", CU_ANIMATE_EXISTING_SCRIPT_ENTITY, IG_LESTERCREST) ENDIF REGISTER_ENTITY_FOR_CUTSCENE(LesterCane, "WalkingStick_Lester", CU_CREATE_AND_ANIMATE_NEW_SCRIPT_ENTITY, PROP_CS_WALKING_STICK) START_CUTSCENE() Cutsceneflow = CutscenePlaying Endif BREAK CASE CutscenePlaying IF NOT DOES_ENTITY_EXIST(PedLester) IF DOES_ENTITY_EXIST(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Lester")) PedLester = GET_PED_INDEX_FROM_ENTITY_INDEX(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("Lester")) ENDIF ENDIF IF IS_CUTSCENE_PLAYING() REQUEST_ANIM_DICT("oddjobs@assassinate@hotel@leadin") IF HAS_ANIM_DICT_LOADED("oddjobs@assassinate@hotel@leadin") IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Lester") //, IG_LESTERCREST) IF DOES_ENTITY_EXIST(pedLester) AND NOT IS_PED_INJURED(pedLester) SET_ENTITY_COORDS(pedLester, << -1509.458, -948.195, 7.750 >>) SET_ENTITY_HEADING(pedLester, -11.000) TASK_PLAY_ANIM(pedLester, "oddjobs@assassinate@hotel@leadin", "lester_leadin", INSTANT_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING | AF_NOT_INTERRUPTABLE | AF_EXTRACT_INITIAL_OFFSET | AF_USE_KINEMATIC_PHYSICS | AF_USE_MOVER_EXTRACTION, 0, FALSE, AIK_DISABLE_LEG_IK) FORCE_PED_AI_AND_ANIMATION_UPDATE(pedLester) PRINTLN("TASKING LESTER TO PLAY IDLE ANIMATION") ELSE PRINTLN("LESTER DOES NOT EXIST") ENDIF ENDIF ENDIF ENDIF IF NOT DOES_ENTITY_EXIST(LesterCane) IF DOES_ENTITY_EXIST(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("WalkingStick_Lester")) LesterCane = GET_OBJECT_INDEX_FROM_ENTITY_INDEX(GET_ENTITY_INDEX_OF_REGISTERED_ENTITY("WalkingStick_Lester")) ENDIF ENDIF IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("WalkingStick_Lester") IF DOES_ENTITY_EXIST(LesterCane) IF DOES_ENTITY_EXIST(pedLester) AND NOT IS_PED_INJURED(pedLester) ATTACH_ENTITY_TO_ENTITY(LesterCane, pedLester, GET_PED_BONE_INDEX(pedLester, BONETAG_PH_R_HAND), << 0,0,0 >>, << 0,0,0 >>) ENDIF ENDIF ENDIF IF CAN_SET_EXIT_STATE_FOR_CAMERA() SET_GAMEPLAY_CAM_RELATIVE_HEADING(0) SET_GAMEPLAY_CAM_RELATIVE_PITCH(0) ENDIF IF NOT IS_CUTSCENE_PLAYING() CutSceneFlow = CutscenePost ENDIF BREAK Endswitch ENDPROC PROC ProcExitVehTestBed() //This is a test blend set up to be run in the testbed for physics code to investigate popping issues with wheels and vehicles coming out of //cutscenes. SWITCH CutSceneFlow CASE CutSceneStart REQUEST_CUTSCENE ("TestBed_Veh_Blend") Cutsceneflow = CutsceneStreaming BREAK CASE CutsceneStreaming IF HAS_CUTSCENE_LOADED () START_CUTSCENE() Cutsceneflow = CutscenePlaying ENDIF BREAK CASE CutscenePlaying IF NOT IS_CUTSCENE_PLAYING() CutSceneFlow = CutscenePost ENDIF BREAK Endswitch ENDPROC PROC RUN_TEST () SWITCH int_to_enum (Example, gcurrentselection) // the ENUM corresponds to the values from the XML file CASE ExitIntoIdle ProcExitIntoIdle() BREAK CASE ExitIntoWalk ProcExitIntoWalk() BREAK CASE ExitIntoRun ProcExitIntoRun() BREAK CASE ExitIntoVehicle ProcExitIntoVehicle() BREAK CASE ExitIntoCover ProcExitIntoCover() BREAK CASE ExitCustomState ProcExitCustomState() BREAK CASE ExitStaticProp ProcExitStaticProp() BREAK CASE ExitPedVehicle ProcExitPedVehicle() BREAK CASE ExitVehiclePassengers ProcExitVehiclePassengers() BREAK CASE ExitPedCustomAnim ProcExitPedCustomAnim() BREAK CASE ExitBlendCam ProcExitBlendCam() BREAK CASE ExitVehTestBed ProcExitVehTestBed() BREAK ENDSWITCH ENDPROC //Purpose: Runs the main scenarios PROC Run_Test_Scenario () //int index = 0 SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE(true) SWITCH TestScenarioAStatus //setps up all the data for the sceanrio, this is only called once or if selected in widget CASE InitialiseScenarioData // PlayerStartPos = GET_PLAYER_START_POS() //sets the players start coords at the default // Bscenario_running = FALSE // INITIALISE_PED_DATA (Testpeds) // INITIALISE_VEHICLE_DATA (TestVehicles) // INITIALISE_CAM_DATA(TestCams ) // INITIALISE_OBJECT_DATA(TestObjects) // SETUP_TEST_DATA () //HELP_TEXT_STATE = HTF_SCENARIO_SELECTED_NOT_STARTED TestScenarioAStatus = CreateScenarioEntities // Temp_Update_Player_With_Scenario(TestCams, scplayer, FALSE, PlayerStartPos) //sets the BREAK // Creates all the scenario data CASE CreateScenarioEntities Bscenario_running = FALSE TestScenarioAStatus = SetScenarioEntities BREAK // CASE SetScenarioEntities Start_And_Reset_Test () IF gBeginCombatScenario TestScenarioAStatus = RunScenario CutSceneFlow = CutSceneStart gBeginCombatScenario = FALSE gRun_debuggig = FALSE Bscenario_running = TRUE INITALISE_TEST_STATE() HELP_TEXT_STATE = HTF_STARTED_RUNNING_NO_CAMS ENDIF BREAK //Runs the actual selected scenario CASE RunScenario //Temp_Run_Scenario_Tracking_Cam (TestPeds, MAX_NUMBER_OF_PEDS, TestCams[TrackingCamera].cam) //Temp_Update_Player_With_Scenario(TestCams, scplayer, true, PlayerStartPos) Start_And_Reset_Test () Check_For_Scenario_Reset () RUN_TEST () //run the main tests BREAK CASE CleanupScenario HELP_TEXT_STATE = HTF_SCENARIO_SELECTED_NOT_STARTED CutSceneFlow = CutSceneStart IF gResetToDefault Temp_cleanup_scenario_cams () //here we are changing scenarios so we need to reset cams TestScenarioAStatus = InitialiseScenarioData gResetToDefault = FALSE ENDIF IF gResetCombatScenario gcurrentselection = gSelection TestScenarioAStatus = CreateScenarioEntities gResetCombatScenario = FALSE ENDIF BREAK ENDSWITCH ENDPROC SCRIPT SET_DEBUG_ACTIVE (TRUE) //gvMapOffset = GET_PLAYER_START_POS () SETUP_MISSION_XML_MENU (XMLMenu, KEY_Q ) //defined at the top of the file //SETUP_AREA_FOR_MISSION (<<0.0, 0.0, 0.0>>) //Gets a reference to the player Get_The_Player () //set player collios SET_PLAYER_COLISION(scplayer, true) //Sets the test widget from the test tools //CREATE_TEST_WIDGET () //request the test anim bank //REQUEST_TEST_ANIM_DICT ("misstest_anim") WHILE TRUE // PRINTSTRING("Word to your mother") // PRINTNL() // controls the help text hides if xml menu is active TEXT_CONTROLLER () //Runs the selected option from the XML menu Run_Selection_From_XML_input () //Checks that a valid selection has been input and runs the scenario IF (gcurrentselection <> InvalidSelection) Draw_Debug_Info ( ) //Sets the test scenario into debug mode IF (gAllowDebugging) Set_To_Debug () ENDIF // if (gRun_debuggig) // Temp_Debug_Scenario (TestPeds, TestVehicles, Route, TestCams[FixedCamera].cam, S_M_Y_COP_01) // Allows the entities in the scneario to be adjusted // Print_Scenario_Data (TestPeds, TestVehicles, Route, TestCams) // ENDIF Run_Test_Scenario () //SWITCH_BETWEEN_FIXED_AND_TRACKING (TestCams[FixedCamera].cam) PRINT_ACTIVE_TEST (Bscenario_running, gRun_debuggig) ENDIF Terminate_test_script () WAIT (0) ENDWHILE ENDSCRIPT #ENDIF // IS_DEBUG_BUILD