////////////////////////////////////////////////////////////////////// /* shrink_kill.sch */ /* Author: DJ Jones */ /* Updates related to killing (or letting go) Dr. Friedlander. */ ////////////////////////////////////////////////////////////////////// CONST_INT iSHRINK_ESC_DRF_VARIATIONS 7 CONST_INT iSHRINK_ESC_PLR_VARIATIONS 8 // Determine good placement for vehicle based on its length & width. FUNC VECTOR SHRINK_GET_PLAYER_VEHICLE_POSITION(VEHICLE_INDEX vehPlayer) VECTOR vFront, vSide, vUp, vPos, vMin, vMax IF IS_ENTITY_DEAD(vehPlayer) RETURN <<0,0,0>> ENDIF GET_ENTITY_MATRIX(vehPlayer, vFront, vSide, vUp, vPos) GET_MODEL_DIMENSIONS(GET_ENTITY_MODEL(vehPlayer), vMin, vMax) RETURN <<-1900.2925, -555.7014, 10.7548>> - vMax.x * <<-0.6293, -0.7771, 0.0>> - vMax.y * <<0.7771, -0.6293, 0.0>> ENDFUNC // Get Dr. Friedlander and Michael ready for some killing (unless the player is a pussy). PROC SHRINK_SETUP_KILL_SCENARIO() IF NOT IS_VEHICLE_DRIVEABLE(shrinkVehicle) DELETE_VEHICLE(shrinkVehicle) shrinkVehicle = CREATE_VEHICLE(shrinkVehModelName, vShrinkVehPos, fShrinkVehHeading) SET_VEHICLE_COLOUR_COMBINATION(shrinkVehicle, 6) ENDIF //VECTOR vShrinkPos IF DOES_ENTITY_EXIST(shrinkCSPed) //vShrinkPos = GET_ENTITY_COORDS(shrinkCSPed, FALSE) DELETE_PED(shrinkCSPed) //shrinkCSPed = CREATE_PED(PEDTYPE_MISSION, shrinkIGModelName, vShrinkPos, 0) ENDIF IF (NOT IS_ENTITY_DEAD(PLAYER_PED_ID())) AND (NOT IS_ENTITY_DEAD(shrinkVehicle)) AND IS_VEHICLE_DRIVEABLE(shrinkVehicle) SET_ENTITY_COORDS(PLAYER_PED_ID(),<<-1907.8273, -560.0641, 10.8064>>) SET_ENTITY_HEADING(PLAYER_PED_ID(), 260.1950) SET_ENTITY_COORDS(shrinkVehicle, vShrinkVehPos) SET_ENTITY_HEADING(shrinkVehicle, fShrinkVehHeading) IF DOES_ENTITY_EXIST(playerVehicle) IF NOT IS_ENTITY_DEAD(playerVehicle) //RESOLVE_VEHICLES_INSIDE_ANGLED_AREA SET_VEHICLE_FIXED(playerVehicle) SET_ENTITY_INVINCIBLE(playerVehicle, TRUE) SET_VEHICLE_CAN_BREAK(playerVehicle, FALSE) SET_ENTITY_COORDS(playerVehicle, SHRINK_GET_PLAYER_VEHICLE_POSITION(playerVehicle)) SET_ENTITY_HEADING(playerVehicle, 231.0000) ENDIF ENDIF // IF IS_ENTITY_ATTACHED(shrinkIGPed) // DETACH_ENTITY(shrinkIGPed) // ENDIF // SET_ENTITY_COLLISION(shrinkIGPed, TRUE) // FREEZE_ENTITY_POSITION(shrinkIGPed, FALSE) CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID()) TASK_STAND_STILL(PLAYER_PED_ID(), -1) IF NOT bClothingRestore OR NOT DOES_ENTITY_EXIST(shrinkIGPed) OR IS_ENTITY_DEAD(shrinkIGPed) shrinkIGPed = CREATE_PED(PEDTYPE_MISSION, shrinkIGModelName, <<-1899.7000, -562.2000, 10.7945>>, 217.9453) SET_PED_COMPONENT_VARIATION(shrinkIGPed, PED_COMP_TORSO, iUpperVariation, iUpperTexture) SET_PED_COMPONENT_VARIATION(shrinkIGPed, PED_COMP_LEG, 0, iLowerTexture) SET_PED_MONEY(shrinkIGPed, iSHRINK_FEE_ABANDONMENT + GET_RANDOM_INT_IN_RANGE(5, 301)) SET_ENTITY_LOAD_COLLISION_FLAG(shrinkIGPed, TRUE) SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(shrinkIGPed, TRUE) ADD_PED_FOR_DIALOGUE(convPeds, 1, shrinkIGPed, "FRIEDLANDER") bClothingRestore = TRUE ELSE SET_ENTITY_COORDS(shrinkIGPed,<<-1899.7000, -562.2000, 10.7945>>) SET_ENTITY_HEADING(shrinkIGPed, 217.9453) CLEAR_PED_TASKS_IMMEDIATELY(shrinkIGPed) TASK_STAND_STILL(shrinkIGPed, -1) ENDIF IF IS_SCREEN_FADED_OUT() IF NOT bSceneRequested NEW_LOAD_SCENE_START(<<-1905.4998, -557.8768, 12.4125>>, NORMALISE_VECTOR(<<-1904.7095, -560.2881, 12.4748>> - <<-1905.4998, -557.8768, 12.4125>>), 100) bSceneRequested = TRUE WAIT(0) ENDIF WHILE (NOT IS_NEW_LOAD_SCENE_LOADED()) OR ((NOT IS_PED_INJURED(shrinkIGPed)) AND NOT HAVE_ALL_STREAMING_REQUESTS_COMPLETED(shrinkIGPed)) WAIT(0) ENDWHILE IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID()) CLEAR_PED_TASKS(PLAYER_PED_ID()) ENDIF DO_SCREEN_FADE_IN(500) ENDIF FLOAT fMoveRatio = PEDMOVEBLENDRATIO_RUN // IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID()) // OPEN_SEQUENCE_TASK(seqShrinkCar) // TASK_STAND_STILL(NULL, 2000) // SIMULATE_PLAYER_INPUT_GAIT(NULL, <<-1904.4763, -560.7510, 10.7980>>, 0.5 * (PEDMOVE_WALK + PEDMOVE_RUN), DEFAULT_TIME_NEVER_WARP) // CLOSE_SEQUENCE_TASK(seqShrinkCar) // TASK_PERFORM_SEQUENCE(PLAYER_PED_ID(), seqShrinkCar) // CLEAR_SEQUENCE_TASK(seqShrinkCar) // ENDIF IF (NOT IS_PED_INJURED(shrinkIGPed)) AND NOT IS_ENTITY_DEAD(shrinkVehicle) OPEN_SEQUENCE_TASK(seqShrinkCar) //TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, <<-1902.2, -559.8, 11.8>>, fMoveRatio, DEFAULT_TIME_NEVER_WARP, 2.0) TASK_ENTER_VEHICLE(NULL, shrinkVehicle, DEFAULT_TIME_NEVER_WARP, VS_DRIVER, fMoveRatio) //TASK_VEHICLE_FOLLOW_WAYPOINT_RECORDING(NULL, shrinkVehicle, "Shrink_escape", DRIVINGMODE_PLOUGHTHROUGH, 0, EWAYPOINT_VEHICLES_USE_AI_SLOWDOWN) TASK_VEHICLE_DRIVE_TO_COORD(NULL, shrinkVehicle, <<-1783.7303, -629.1945, 9.8900>>, 20.0, DRIVINGSTYLE_NORMAL, GET_ENTITY_MODEL(shrinkVehicle), DRIVINGMODE_AVOIDCARS_RECKLESS | DF_SteerAroundPeds, 10.0, 12.0) TASK_VEHICLE_DRIVE_WANDER(NULL, shrinkVehicle, 19.0, DRIVINGMODE_AVOIDCARS_RECKLESS | DF_SteerAroundPeds) CLOSE_SEQUENCE_TASK(seqShrinkCar) TASK_PERFORM_SEQUENCE(shrinkIGPed, seqShrinkCar) FORCE_PED_MOTION_STATE(shrinkIGPed, MS_ON_FOOT_RUN, TRUE, FAUS_CUTSCENE_EXIT, TRUE) //ELSE // Fallback plan? ENDIF shrinkBlip = ADD_BLIP_FOR_ENTITY(shrinkIGPed) SET_BLIP_COLOUR(shrinkBlip, BLIP_COLOUR_RED) RESTART_TIMER_NOW(timerBlipFlicker) //FORCE_PED_AI_AND_ANIMATION_UPDATE(PLAYER_PED_ID()) //FORCE_PED_AI_AND_ANIMATION_UPDATE(shrinkIGPed) SET_GAMEPLAY_CAM_RELATIVE_HEADING(0) SET_GAMEPLAY_CAM_RELATIVE_PITCH(0) shrinkHelperCam = CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SCRIPTED, <<-1904.6146, -558.8920, 12.8339>>, <<-9.0794, -0.0000, -127.4455>>, 50.0, TRUE) RENDER_SCRIPT_CAMS(TRUE, FALSE) DISPLAY_RADAR(FALSE) DISPLAY_HUD(FALSE) ENDIF // This is a car created next door to the office, so the player has something to drive if nothing else is available. CLEAR_AREA(<<-1886.8839, -571.1942, 11.3828>>, 2.5, TRUE, TRUE) CREATE_VEHICLE(nextDoorCarModel, <<-1886.8839, -571.1942, 11.3828>>, -40.83) ENDPROC PROC SHRINK_UPDATE_FLIGHT_DIALOGUE() TEXT_LABEL_15 sLabel INT iLineToPlay, iIndex // Everyone alive? IF (NOT DOES_ENTITY_EXIST(shrinkIGPed)) OR IS_ENTITY_DEAD(shrinkIGPed) OR IS_ENTITY_DEAD(PLAYER_PED_ID()) EXIT ENDIF IF NOT IS_TIMER_STARTED(tmrDrfKillDialogue) START_TIMER_NOW(tmrDrfKillDialogue) ENDIF IF NOT IS_TIMER_STARTED(tmrPlrKillDialogue) START_TIMER_NOW(tmrPlrKillDialogue) ENDIF FLOAT fDist2 = VDIST2(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(shrinkIGPed)) // Dr. Friedlander's first dialogue. IF iEscUsedDrfCount < iSHRINK_ESC_DRF_VARIATIONS IF iEscUsedDrfCount <= 0 IF GET_TIMER_IN_SECONDS(tmrDrfKillDialogue) > 0.2 iLineToPlay = GET_RANDOM_INT_IN_RANGE(0, iSHRINK_ESC_DRF_VARIATIONS) SET_BIT(iEscDlgShrinkBits, iLineToPlay) sLabel = "DRF_RUNOFF_" sLabel += iLineToPlay + 1 //CERRORLN(DEBUG_MISSION, "Playing first line: ", sLabel) //CERRORLN(DEBUG_MISSION, "Playing conversation DRF_RUNOFF") //CREATE_CONVERSATION(convPeds, "DrfAud", "DRF_RUNOFF", CONV_PRIORITY_VERY_HIGH) PLAY_SINGLE_LINE_FROM_CONVERSATION(convPeds, "DrfAud", "DRF_RUNOFF", sLabel, CONV_PRIORITY_HIGH) iEscUsedDrfCount = 1 RESTART_TIMER_NOW(tmrDrfKillDialogue) ENDIF // Dr. Friedlander's repeating dialogue. ELIF GET_TIMER_IN_SECONDS(tmrDrfKillDialogue) > 12.0 IF fDist2 <= 144.0 AND NOT IS_SCRIPTED_SPEECH_PLAYING(PLAYER_PED_ID()) iLineToPlay = GET_RANDOM_INT_IN_RANGE(0, iSHRINK_ESC_DRF_VARIATIONS - iEscUsedDrfCount) WHILE iIndex >= 0 AND iIndex < iSHRINK_ESC_DRF_VARIATIONS IF NOT IS_BIT_SET(iEscDlgShrinkBits, iIndex) IF iLineToPlay = 0 SET_BIT(iEscDlgShrinkBits, iIndex) iLineToPlay = iIndex iIndex = -2 ELSE iLineToPlay -= 1 ENDIF ENDIF iIndex += 1 ENDWHILE sLabel = "DRF_RUNOFF_" sLabel += iLineToPlay + 1 //CERRORLN(DEBUG_MISSION, "Playing line: ", sLabel) //CREATE_CONVERSATION(convPeds, "DrfAud", "DRF_RUNOFF", CONV_PRIORITY_VERY_HIGH) PLAY_SINGLE_LINE_FROM_CONVERSATION(convPeds, "DrfAud", "DRF_RUNOFF", sLabel, CONV_PRIORITY_HIGH) iEscUsedDrfCount += 1 RESTART_TIMER_NOW(tmrDrfKillDialogue) ELSE RESTART_TIMER_AT(tmrDrfKillDialogue, 6.0) ENDIF ENDIF ENDIF // Michael's first dialogue. IF iEscUsedPlrCount < iSHRINK_ESC_PLR_VARIATIONS IF iEscUsedPlrCount <= 0 IF GET_TIMER_IN_SECONDS(tmrPlrKillDialogue) > 1.0 AND NOT IS_SCRIPTED_SPEECH_PLAYING(shrinkIGPed) iLineToPlay = GET_RANDOM_INT_IN_RANGE(0, iSHRINK_ESC_PLR_VARIATIONS) SET_BIT(iEscDlgPlayerBits, iLineToPlay) sLabel = "DRF_CHASE_" sLabel += iLineToPlay + 1 //CERRORLN(DEBUG_MISSION, "Playing first line: ", sLabel) //CERRORLN(DEBUG_MISSION, "Playing conversation DRF_CHASE") //CREATE_CONVERSATION(convPeds, "DrfAud", "DRF_CHASE", CONV_PRIORITY_VERY_HIGH) PLAY_SINGLE_LINE_FROM_CONVERSATION(convPeds, "DrfAud", "DRF_CHASE", sLabel, CONV_PRIORITY_HIGH) iEscUsedPlrCount = 1 RESTART_TIMER_NOW(tmrPlrKillDialogue) ENDIF // Michael's repeating dialogue. ELIF GET_TIMER_IN_SECONDS(tmrPlrKillDialogue) > 10.3 IF fDist2 <= 2500.0 AND NOT IS_SCRIPTED_SPEECH_PLAYING(shrinkIGPed) iLineToPlay = GET_RANDOM_INT_IN_RANGE(0, iSHRINK_ESC_PLR_VARIATIONS - iEscUsedPlrCount) iIndex = 0 WHILE(iIndex >= 0) IF NOT IS_BIT_SET(iEscDlgPlayerBits, iIndex) IF iLineToPlay = 0 SET_BIT(iEscDlgPlayerBits, iIndex) iLineToPlay = iIndex iIndex = -2 ELSE iLineToPlay -= 1 ENDIF ENDIF iIndex += 1 ENDWHILE sLabel = "DRF_CHASE_" sLabel += iLineToPlay + 1 //CERRORLN(DEBUG_MISSION, "Playing line: ", sLabel) //CREATE_CONVERSATION(convPeds, "DrfAud", "DRF_CHASE", CONV_PRIORITY_VERY_HIGH) PLAY_SINGLE_LINE_FROM_CONVERSATION(convPeds, "DrfAud", "DRF_CHASE", sLabel, CONV_PRIORITY_HIGH) iEscUsedPlrCount += 1 RESTART_TIMER_NOW(tmrPlrKillDialogue) ELSE RESTART_TIMER_AT(tmrPlrKillDialogue, 5.0) ENDIF ENDIF ENDIF IF (NOT bEscDlgCleared) AND iEscUsedDrfCount >= 1 AND iEscUsedPlrCount >= 1 AND NOT IS_MESSAGE_BEING_DISPLAYED() bEscDlgCleared = TRUE ENDIF ENDPROC