//Compile out Title Update changes to header functions. //Must be before includes. //CONST_INT USE_TU_CHANGES 0 // Removed by Kenneth R. USING "rage_builtins.sch" USING "globals.sch" USING "cutscene_public.sch" USING "commands_cutscene.sch" USING "commands_entity.sch" USING "commands_script.sch" USING "script_player.sch" USING "randomChar_public.sch" USING "script_blips.sch" using "net_include.sch" USING "chase_hint_cam.sch" CHASE_HINT_CAM_STRUCT localChaseHintCamStruct USING "dialogue_public.sch" USING "RC_Helper_Functions.sch" USING "commands_hud.sch" USING "rgeneral_include.sch" USING "CompletionPercentage_public.sch" USING "initial_scenes_Minute.sch" USING "taxi_functions.sch" USING "RC_Threat_public.sch" USING "RC_Area_public.sch" #IF IS_DEBUG_BUILD USING "select_mission_stage.sch" #ENDIF USING "initial_scenes_Minute.sch" USING "commands_recording.sch" // ***************************************************************************************** // ***************************************************************************************** // ***************************************************************************************** // // MISSION NAME : Minute3.sc // AUTHOR : Joe Binks // DESCRIPTION : // // ***************************************************************************************** // ***************************************************************************************** // ***************************************************************************************** // Launcher vars g_structRCScriptArgs sRCLauncherDataLocal SCENARIO_BLOCKING_INDEX mScenarioBlocker // =========================================================================================================== // Enums, structs and consts // =========================================================================================================== ENUM MISSION_STATUS MS_INIT, MS_PRE_INTRO, MS_INTRO_PLAYING, MS_DRIVE_TO_FARM, MS_JOSEF_ATTACKS, MS_SEARCH_FARM, MS_CAR_CHASE, MS_FLEE_ON_FOOT, MS_PASS_DELAY, MS_FAIL_DELAY ENDENUM STRUCT MISSION_DUDE PED_INDEX piDude BLIP_INDEX biBlip ENDSTRUCT ENUM MISSION_FAIL_REASON MFR_NONE, MFR_KILLED_MANUEL, MFR_KILLED_A_MEXICAN, MFR_INJURED_MANUEL, MFR_INJURED_A_MEXICAN, MFR_JOE_ESCAPED, MFR_EXECUTION ENDENUM ENUM SUB_STATE SS_SETUP, SS_UPDATE, SS_UPDATE_TWO, SS_UPDATE_THREE, SS_CLEANUP ENDENUM ENUM NEAREST_ENEMY NE_NEITHER, NE_JOE, NE_JOSEF ENDENUM // ped conversation IDs CONST_INT TREVOR_ID 2 CONST_INT MANUEL_ID 3 CONST_INT JOE_ID 4 CONST_INT JOSEF_ID 5 CONST_INT MEX_ID 6 CONST_INT MANUEL 0 CONST_INT MANUEL_CAR 1 CONST_INT PLAYER_CAR 0 CONST_INT CP_AFTER_MOCAP 0 CONST_INT CP_KILL_JOSEF 1 CONST_INT CP_KILL_JOE 2 CONST_INT CP_MISSION_PASSED 3 // =========================================================================================================== // Mission variables // =========================================================================================================== MISSION_STATUS missionStage = MS_INIT MISSION_FAIL_REASON MissionFailReason = MFR_NONE SUB_STATE MissionSubState = SS_SETUP STRING ANIM_DICT_GLANCES = "rcmminute3glances" STRING ANIM_DICT_PANIC = "rcmminute3panic" #IF IS_DEBUG_BUILD MissionStageMenuTextStruct sSkipMenu[3] #ENDIF VECTOR vFarmPosition = <<423.575714,6478.868652,32.815613>> VECTOR vSpawnPedsSize = <<250.0, 250.0, 250.0>> FLOAT fJoeDrives = 35.0 FLOAT fJoeDrivesLarge = 45.0 CONST_INT JOE_FLEES_TIME 30000 OBJECT_INDEX oiBarnDoorLeft OBJECT_INDEX oiBarnDoorRight MODEL_NAMES mnBarnDoorLeft = PROP_BARN_DOOR_L MODEL_NAMES mnBarnDoorRight = PROP_BARN_DOOR_R CONST_FLOAT DOOR_LEFT_HEADING_END 66.46 CONST_FLOAT DOOR_LEFT_HEADING_ALT -131.39 CONST_FLOAT DOOR_RIGHT_HEADING_END 360.0 CONST_FLOAT DOOR_RIGHT_HEADING_ALT -128.34 BOOL bBarnDoorLeftSetup = FALSE BOOL bBarnDoorRightSetup = FALSE OBJECT_INDEX oiPistol // Trevor's pistol, used in the intro BOOL bNotAimedAtManuel = TRUE INT iManuelStoppedTimer = -1 CONST_INT MAX_MANUEL_STOPPED_TIME 10000 INT iManuelFollowTimer = -1 INT iManuelBumpTimer = -1 CONST_INT MANUEL_CONV_TIME 1000 MISSION_DUDE mdJosef VECTOR vAltJosefPos = <<426.96, 6513.80, 27.72>> FLOAT fAltJosefHeading = -108.29 MISSION_DUDE mdJoe VECTOR vAltJoePos = <<429.98, 6470.58, 28.78>> FLOAT fAltJoeHeading = -126.05 REL_GROUP_HASH enemyGroup CONST_INT NUM_MEXICANS 5 PED_INDEX piMexican[NUM_MEXICANS] VECTOR vMexicanPos[NUM_MEXICANS] FLOAT fMexicanHeading[NUM_MEXICANS] VECTOR vLeaveDest[NUM_MEXICANS] /*STRING sMexicanLine[NUM_MEXICANS] STRING sMexicanName[NUM_MEXICANS]*/ BOOL bFleeTalkReady[NUM_MEXICANS] CONST_INT NUM_MEXICANS_2 3 PED_INDEX piMexican2[NUM_MEXICANS_2] VECTOR vMexicanPos2[NUM_MEXICANS_2] FLOAT fMexicanHeading2[NUM_MEXICANS_2] //VECTOR vLeaveDest2[NUM_MEXICANS_2] MODEL_NAMES mnMexicanMale = S_M_M_Migrant_01 MODEL_NAMES mnMexicanFemale = S_F_Y_Migrant_01 enumCharacterList eclJoe = CHAR_JOE enumCharacterList eclJosef = CHAR_JOSEF // farm vehicle variables VEHICLE_INDEX viTractor VECTOR vTractorPos = <<416.4,6499.5,28.0>> FLOAT fTractorHeading = 170.4 MODEL_NAMES mnTractor = TRACTOR2 BOOL bTractorSetup = FALSE VEHICLE_INDEX viFarmCar MODEL_NAMES mnFarmCar = BLAZER VECTOR vAltFarmCarPos = << 422.3570, 6486.7886, 27.7595 >> FLOAT fAltFarmCarHeading = 83.28 BOOL bFarmCarSetup = FALSE VECTOR vManuelAfterCutscene = <<-300.7390, 6212.6108, 30.3998>>//<<-301.64, 6212.02, 31.41>> FLOAT fManuelAfterCutscne = 249.7937//-50.57 VEHICLE_INDEX viVan //MODEL_NAMES mnVan = tractor2 VECTOR vAltVanPos = <<430.01, 6467.49, 28.41>> FLOAT fAltVanHeading = 50.92 VECTOR vRecordingStartAlt = << 427.6566, 6469.3843, 28.4275 >> FLOAT fRecQuaternionXAlt = 0.0014 FLOAT fRecQuaternionYAlt = 0.0015 FLOAT fRecQuaternionZAlt = 0.3467 FLOAT fRecQuaternionWAlt = 0.9380 BOOL bVanSetup = FALSE STRING sWaypointRecMain = "min3_JandJ01" STRING sWaypointRecAlt = "min3_JandJ02" STRING sJoesWaypointRec INT iNumPointsInJoesRec = 0 CONST_FLOAT iEscapeDist 250.0 CONST_FLOAT iWarnDist 125.0 VECTOR vCheckForPlayersCar1 = <<409.957886,6488.018066,25.749815>> VECTOR vCheckForPlayersCar2 = <<151.116852,6485.835449,31.627085>> FLOAT fCheckForPlayersCar = 50.0 // variables for dealing with the player bursting the car tyres BOOL bTyresBurst = FALSE INT iTyresBurstTimer = 0 CONST_INT iTyresTime 1000 // clearing the farm area variables VECTOR vFarmMin = <<144.369324,6368.498047,25.529602>> VECTOR vFarmMax = <<489.021454,6573.714844,35.059156>> // the area inside the barn VECTOR vBarnAreaPos1 = <<443.043427,6456.974121,26.783266>> VECTOR vBarnAreaPos2 = <<422.019592,6474.671875,30.813354>> FLOAT fBarnAreaWidth = 17.0 // The area to boost Joe's casule size so he doesn't clip through the doors VECTOR vBarnForJoePos1 = <<444.225250,6456.484863,26.768524>> VECTOR vBarnForJoePos2 = <<420.526215,6475.383789,29.812666>> FLOAT fBarnForJoeWidth = 10.0 // The area outside the barn doors /*VECTOR vBarnBlockingPos1 = <<423.676910,6481.187988,26.809072>> VECTOR vBarnBlockingPos2 = <<415.893799,6471.259277,29.810034>> FLOAT fBarnBlockingWidth = 8.0*/ structPedsForConversation pedConvStruct BOOL bStartAiDriving = TRUE BOOL bAllowOneDeadMessage = TRUE BOOL bJackedJoeAndJosef = FALSE CONST_INT ONE_GUY_DEAD_TIMEOUT 100 CONST_INT J_AND_J_PAUSE 1500 CONST_INT JOSEF_PAUSES 1500//750 CONST_INT DRIVE_LINE_TIME 20000 CONST_INT NUM_DRIVE_LINES 4 INT iCurrentDriveLine = 0 STRING sDriveLines[NUM_DRIVE_LINES] CONST_INT JOE_BARN_LINE_TIME 10000 CONST_INT NUM_JOE_BARN_LINES 6 INT iCurrentJoeBarnLine = 0 STRING sJoeBarnLines[NUM_JOE_BARN_LINES] CONST_INT CHASE_LINE_TIME 20000 CONST_FLOAT CHASE_LINE_DIST 75.0 CONST_INT NUM_CHASE_LINES 5 INT iCurrentChaseLine = 0 STRING sChaseLines[NUM_CHASE_LINES] CONST_INT NUM_JOE_CONVS 3 INT iCurrentJoeConv = 0 STRING sJoeConvs[NUM_JOE_CONVS] CONST_INT NUM_JOSEF_CONVS 3 INT iCurrentJosefConv = 0 //STRING sJosefConvs[NUM_JOSEF_CONVS] INT iMexicansFleeTimer = 0 BOOL bSetJoesCheckpoint = TRUE INT iJoesCheckpointTimer = 0 CONST_INT JOES_CHECKPOINT_TIME 5000 // broken down car scene variables VEHICLE_INDEX viBrokenCar MODEL_NAMES mnBrokenCar = TORNADO3 VECTOR vBrokenCar = << 57.00, 6463.62, 31.11 >> FLOAT fBrokenCar = 134.03 PED_INDEX piBrokenCarDriver MODEL_NAMES mnBrokenCarDriver = A_M_O_SALTON_01 VECTOR vBrokenCarDriver = << 55.269218,6461.805176,31.394144 >> FLOAT fBrokenCarDriver = 310.2723 STRING sBreakdownAnim = "BREAKDOWN_IDLE_B" VEHICLE_INDEX viTowTruck PED_INDEX piTowTruckDriver MODEL_NAMES mnTowTruck = TOWTRUCK VECTOR vTowTruck = << 52.61, 6458.64, 31.37 >> FLOAT fTowTruck = 135.10 MODEL_NAMES mnTowTruckDriver = S_M_M_AUTOSHOP_02 BOOL bTowTruckSceneSetup = FALSE // timers INT iJoeFleesTimer INT iJosefAttacksTimer INT iConversationTimer INT iJoeBarnLineTimer = 0 CONST_INT MEX_DIALOGUE_TIME 7500 INT iMexDialogueTimer = -1 BOOL bMexDialogueTriggered = FALSE // variables to check for mission passed stats BOOL bJosefStunned = FALSE BOOL bJoeStunned = FALSE BOOL bKilledOnFarm = FALSE TEST_POLY tpFarmArea // variables used in triggering the Arrive At Farm audio events BOOL bAudioReady = TRUE INT iAudioEventTimer = 0 CONST_INT AUDIO_EVENT_WAIT_TIME 5000 // variables for dealing with the number of times the player has rammed the tractor INT iJoeRammedCount = 0 BOOL bJoeRammedLastFrame = FALSE FLOAT fPlayerVsJoeClosingSpeedLastFrame = 0 INT iRamTimer = 0 INT iConvFailedTimer = -1 VECTOR vCarRespotOne = <<-297.7666, 6214.2837, 30.3288>> FLOAT fCarRespotOne = 237.7338 /*VECTOR vCarRespotTwo = <<-309.4576, 6212.4595, 30.3097>> FLOAT fCarRespotTwo = 313.923*/ VECTOR vIntroAreaOne = <<-299.502167,6211.961914,29.450109>> VECTOR vIntroAreaTwo = <<-305.560822,6211.881348,32.478580>> FLOAT fIntroAreaWidth = 4.0 BOOL bKnickedManuelsCar = FALSE SCENARIO_BLOCKING_INDEX sbiFarmArea //------------------------------------------------------------------------------------------------------------------------------------------------------------------ // see if two floats are within a certain range of each other FUNC BOOL AreFloatsClose(FLOAT firstNumber, FLOAT secondNumber, FLOAT range = 0.5) FLOAT difference = firstNumber - secondNumber IF difference < 0.0 difference = difference * -1 ENDIF IF (difference < range) RETURN TRUE ELSE RETURN FALSE ENDIF ENDFUNC /// PURPOSE: /// Kills scripted conversations if the player enters a shop PROC KillConversationsInShops() IF IS_SCRIPTED_CONVERSATION_ONGOING() IF GET_INTERIOR_FROM_ENTITY(PLAYER_PED_ID()) <> NULL KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() ENDIF ENDIF ENDPROC // =========================================================================================================== // Termination // =========================================================================================================== // ----------------------------------------------------------------------------------------------------------- // Script Cleanup // ----------------------------------------------------------------------------------------------------------- /// PURPOSE: /// Safely removes all blips created during the mission PROC CLEAR_ALL_BLIPS() SAFE_REMOVE_BLIP(mdJosef.biBlip) SAFE_REMOVE_BLIP(mdJoe.biBlip) //SAFE_REMOVE_BLIP(biFarm) ENDPROC /// PURPOSE: /// Checks that the player is being given the correct reason for failing PROC CheckFailReason() IF DOES_ENTITY_EXIST(sRCLauncherDataLocal.pedID[MANUEL]) IF IS_PED_INJURED(sRCLauncherDataLocal.pedID[MANUEL]) MissionFailReason = MFR_KILLED_MANUEL EXIT ENDIF ENDIF INT i = 0 REPEAT NUM_MEXICANS i IF DOES_ENTITY_EXIST(piMexican[i]) IF IS_PED_INJURED(piMexican[i]) IF bMexDialogueTriggered MissionFailReason = MFR_EXECUTION ELSE MissionFailReason = MFR_KILLED_A_MEXICAN ENDIF EXIT ENDIF ENDIF ENDREPEAT ENDPROC /// PURPOSE: /// Safely deletes all entities created by the mission PROC DeleteEverything() INT i REMOVE_RELATIONSHIP_GROUP(enemyGroup) SAFE_DELETE_PED(mdJosef.piDude) SAFE_DELETE_PED(mdJoe.piDude) SAFE_DELETE_PED(sRCLauncherDataLocal.pedID[MANUEL]) i = 0 REPEAT NUM_MEXICANS i SAFE_DELETE_PED(piMexican[i]) ENDREPEAT SAFE_DELETE_VEHICLE(viTractor) SAFE_DELETE_VEHICLE(viFarmCar) SAFE_DELETE_VEHICLE(viVan) SAFE_DELETE_OBJECT(oiBarnDoorLeft) SAFE_DELETE_OBJECT(oiBarnDoorRight) ENDPROC /// PURPOSE: /// Removes all blips and releases all entities used by the mission PROC MissionCleanup() INT i CLEAR_ALL_BLIPS() //SET_PED_WALLA_DENSITY(0.5, 0.0) REMOVE_RELATIONSHIP_GROUP(enemyGroup) IF IS_PED_UNINJURED(mdJosef.piDude) SET_ENTITY_LOAD_COLLISION_FLAG(mdJosef.piDude, FALSE) ENDIF IF IS_PED_UNINJURED(mdJoe.piDude) SET_ENTITY_LOAD_COLLISION_FLAG(mdJoe.piDude, FALSE) ENDIF SAFE_RELEASE_PED(mdJosef.piDude) SAFE_RELEASE_PED(mdJoe.piDude) i = 0 REPEAT NUM_MEXICANS i IF DOES_ENTITY_EXIST(piMexican[i]) IF NOT IS_PED_INJURED(piMexican[i]) IF NOT (IsPedPerformingTask(piMexican[i], SCRIPT_TASK_FOLLOW_NAV_MESH_TO_COORD) OR IS_PED_FLEEING(piMexican[i])) TASK_FOLLOW_NAV_MESH_TO_COORD(piMexican[i], vLeaveDest[i], PEDMOVEBLENDRATIO_RUN) ENDIF SET_PED_KEEP_TASK(piMexican[i], TRUE) SET_PED_AS_NO_LONGER_NEEDED(piMexican[i]) ENDIF ENDIF ENDREPEAT i = 0 REPEAT NUM_MEXICANS_2 i IF DOES_ENTITY_EXIST(piMexican2[i]) IF NOT IS_PED_INJURED(piMexican2[i]) SET_PED_KEEP_TASK(piMexican2[i], TRUE) SET_PED_AS_NO_LONGER_NEEDED(piMexican2[i]) ENDIF ENDIF ENDREPEAT SAFE_RELEASE_PED(piBrokenCarDriver) IF IS_PED_UNINJURED(piTowTruckDriver) SET_ENTITY_LOAD_COLLISION_FLAG(piTowTruckDriver, FALSE) ENDIF SAFE_RELEASE_PED(piTowTruckDriver) SAFE_RELEASE_VEHICLE(viTractor) SAFE_RELEASE_VEHICLE(viFarmCar) SAFE_RELEASE_VEHICLE(viVan) SAFE_RELEASE_VEHICLE(viBrokenCar) SAFE_RELEASE_VEHICLE(viTowTruck) IF DOES_ENTITY_EXIST(oiBarnDoorLeft) FREEZE_ENTITY_POSITION(oiBarnDoorLeft, FALSE) ENDIF IF DOES_ENTITY_EXIST(oiBarnDoorRight) FREEZE_ENTITY_POSITION(oiBarnDoorRight, FALSE) ENDIF SAFE_RELEASE_OBJECT(oiBarnDoorLeft) SAFE_RELEASE_OBJECT(oiBarnDoorRight) CLEAR_PED_NON_CREATION_AREA() REMOVE_SCENARIO_BLOCKING_AREA(sbiFarmArea) SET_PED_PATHS_BACK_TO_ORIGINAL(vFarmMin, vFarmMax) SET_ALL_VEHICLE_GENERATORS_ACTIVE() IF IS_AUDIO_SCENE_ACTIVE("MINUTE_03_SCENE") STOP_AUDIO_SCENE("MINUTE_03_SCENE") ENDIF SET_CREATE_RANDOM_COPS(TRUE) SET_GPS_DISABLED_ZONE(<<0,0,0>>, <<0,0,0>>) KILL_CHASE_HINT_CAM(localChaseHintCamStruct) KILL_ANY_CONVERSATION() ENDPROC /// PURPOSE: /// Cleans up the mission PROC Script_Cleanup() // Ensure launcher is terminated RC_CLEANUP_LAUNCHER() // If the mission was triggered then additional mission cleanup will be required. IF (Random_Character_Cleanup_If_Triggered()) CPRINTLN(DEBUG_MISSION, "...Random Character Script was triggered so additional cleanup required") MissionCleanup() ENDIF CLEAR_PRINTS() KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() SET_WANTED_LEVEL_MULTIPLIER(1.0) // Delete the Character if it has been created RC_CleanupSceneEntities(sRCLauncherDataLocal, FALSE) // Remove scenario blocking area REMOVE_SCENARIO_BLOCKING_AREA(mScenarioBlocker) TERMINATE_THIS_THREAD() ENDPROC // ----------------------------------------------------------------------------------------------------------- // Script Pass // ----------------------------------------------------------------------------------------------------------- /// PURPOSE: /// Passes the mission and cleans everything up PROC Script_Passed() IF bJosefStunned AND bJoeStunned INFORM_STAT_SYSTEM_OF_BOOL_STAT_HAPPENED(MIN3_STUNNED_AND_KILLED) ENDIF IF bKilledOnFarm CPRINTLN(DEBUG_MISSION, "Setting no migration stat now") INFORM_STAT_SYSTEM_OF_BOOL_STAT_HAPPENED(MIN3_KILL_BEFORE_ESCAPE) ENDIF Random_Character_Passed(CP_RAND_C_MIN3) Script_Cleanup() ENDPROC // =========================================================================================================== // DEBUG AND CREATION FUNCTIONS // =========================================================================================================== /// PURPOSE: /// Removes all peds for debug skipping PROC RemovePeds() IF DOES_ENTITY_EXIST(sRCLauncherDataLocal.pedID[MANUEL]) REMOVE_PED_FOR_DIALOGUE(pedConvStruct, MANUEL_ID) SAFE_DELETE_PED(sRCLauncherDataLocal.pedID[MANUEL]) ENDIF CLEAR_ALL_BLIPS() REMOVE_RELATIONSHIP_GROUP(enemyGroup) IF DOES_ENTITY_EXIST(mdJosef.piDude) IF NOT IS_PED_INJURED(mdJosef.piDude) SET_ENTITY_LOAD_COLLISION_FLAG(mdJosef.piDude, FALSE) ENDIF REMOVE_PED_FOR_DIALOGUE(pedConvStruct, JOSEF_ID) SAFE_DELETE_PED(mdJosef.piDude) ENDIF IF DOES_ENTITY_EXIST(mdJoe.piDude) IF NOT IS_PED_INJURED(mdJoe.piDude) SET_ENTITY_LOAD_COLLISION_FLAG(mdJoe.piDude, FALSE) ENDIF REMOVE_PED_FOR_DIALOGUE(pedConvStruct, JOE_ID) SAFE_DELETE_PED(mdJoe.piDude) ENDIF INT i = 0 REPEAT NUM_MEXICANS i SAFE_DELETE_PED(piMexican[i]) ENDREPEAT SAFE_DELETE_PED(piBrokenCarDriver) IF IS_PED_UNINJURED(piTowTruckDriver) SET_ENTITY_LOAD_COLLISION_FLAG(piTowTruckDriver, FALSE) ENDIF SAFE_DELETE_PED(piTowTruckDriver) SAFE_DELETE_VEHICLE(sRCLauncherDataLocal.vehID[PLAYER_CAR]) SAFE_DELETE_VEHICLE(viTractor) SAFE_DELETE_VEHICLE(viFarmCar) SAFE_DELETE_VEHICLE(viVan) SAFE_DELETE_VEHICLE(viBrokenCar) SAFE_DELETE_VEHICLE(viTowTruck) SAFE_DELETE_OBJECT(oiBarnDoorLeft) SAFE_DELETE_OBJECT(oiBarnDoorRight) ENDPROC /// PURPOSE: /// Resets the values of variables to what they should be at the mission start PROC ResetVariables() iConversationTimer = GET_GAME_TIMER() + DRIVE_LINE_TIME iCurrentDriveLine = 0 iCurrentJoeBarnLine = 0 iCurrentChaseLine = 0 iCurrentJoeConv = 0 iCurrentJosefConv = 0 bAllowOneDeadMessage = TRUE bTyresBurst = FALSE bJackedJoeAndJosef = FALSE bStartAiDriving = TRUE iTyresBurstTimer = 0 bFleeTalkReady[0] = TRUE bFleeTalkReady[1] = TRUE//FALSE bFleeTalkReady[2] = TRUE bFleeTalkReady[3] = TRUE//FALSE bFleeTalkReady[4] = TRUE bJosefStunned = FALSE bJoeStunned = FALSE bKilledOnFarm = FALSE bVanSetup = FALSE bFarmCarSetup = FALSE bTractorSetup = FALSE bBarnDoorLeftSetup = FALSE bBarnDoorRightSetup = FALSE bTowTruckSceneSetup = FALSE iMexDialogueTimer = -1 bMexDialogueTriggered = FALSE bNotAimedAtManuel = TRUE bAudioReady = TRUE iManuelStoppedTimer = -1 iManuelFollowTimer = -1 iManuelBumpTimer = -1 ENDPROC /// PURPOSE: /// Fills the arrays containing the Mexicans' start points, headings and destinations PROC PopulateMexicanPositionArray() vMexicanPos[0] = <<433.290741,6508.463867,28.314806>> fMexicanHeading[0] = 81.59 vLeaveDest[0] = << 444.1198, 6489.0840, 28.5351 >> vMexicanPos[1] = <<434.631592,6511.008300,28.394669>> fMexicanHeading[1] = 67.03 vLeaveDest[1] = << 445.7498, 6483.2534, 28.6280 >> vMexicanPos[2] = <<435.393097,6507.186035,28.420036>> fMexicanHeading[2] = 50.1 vLeaveDest[2] = << 445.4445, 6521.4688, 27.8593 >> vMexicanPos[3] = <<436.226715,6509.413086,28.451788>> fMexicanHeading[3] = 55.00 vLeaveDest[3] = << 442.8672, 6527.3452, 27.4831 >> vMexicanPos[4] = <<436.508789,6511.723145,28.522154>> fMexicanHeading[4] = 48.2 vLeaveDest[4] = << 440.3789, 6533.7314, 27.1066 >> vMexicanPos2[0] = <<435.5727, 6465.7324, 27.7508>> fMexicanHeading2[0] = 47.74 //vLeaveDest2[0] = << 441.0882, 6479.7251, 27.9188 >> vMexicanPos2[1] = <<436.2014, 6464.4033, 27.7476>> fMexicanHeading2[1] = 50.1 //vLeaveDest2[1] = << 423.7309, 6512.6343, 26.6510 >> vMexicanPos2[2] = <<436.5488, 6461.7852, 27.7461>> fMexicanHeading2[2] = 48.2 //vLeaveDest2[2] = << 400.0897, 6495.6104, 26.9440 >> ENDPROC PROC LoadBrokenCarModels() REQUEST_LOAD_MODEL(mnBrokenCar) REQUEST_LOAD_MODEL(mnBrokenCarDriver) ENDPROC /// PURPOSE: /// Loads all ped models for the game PROC LoadModels() REQUEST_LOAD_MODEL(mnMexicanFemale) REQUEST_LOAD_MODEL(mnMexicanMale) REQUEST_LOAD_MODEL(GET_NPC_PED_MODEL(eclJosef)) REQUEST_LOAD_MODEL(GET_NPC_PED_MODEL(eclJoe)) REQUEST_LOAD_MODEL(mnTractor) REQUEST_LOAD_MODEL(mnFarmCar) //REQUEST_LOAD_MODEL(mnVan) SET_VEHICLE_MODEL_IS_SUPPRESSED(mnTractor, TRUE) SET_VEHICLE_MODEL_IS_SUPPRESSED(mnFarmCar, TRUE) //SET_VEHICLE_MODEL_IS_SUPPRESSED(mnVan, TRUE) REQUEST_LOAD_MODEL(mnBarnDoorLeft) REQUEST_LOAD_MODEL(mnBarnDoorRight) ADD_RELATIONSHIP_GROUP("ENEMIES", enemyGroup) // add this here so it's only created once ENDPROC /// PURPOSE: /// Loads and plays the intro PROC PlayIntro() RC_REQUEST_CUTSCENE("mmb_3_rcm") IF RC_IS_CUTSCENE_OK_TO_START() PopulateMexicanPositionArray() //LoadModels() IF IS_PED_UNINJURED(sRCLauncherDataLocal.pedID[MANUEL]) REGISTER_ENTITY_FOR_CUTSCENE(sRCLauncherDataLocal.pedID[MANUEL], "Manuel", CU_ANIMATE_EXISTING_SCRIPT_ENTITY) ADD_PED_FOR_DIALOGUE(pedConvStruct, MANUEL_ID, sRCLauncherDataLocal.pedID[MANUEL], "MANUEL", TRUE) TASK_CLEAR_LOOK_AT(sRCLauncherDataLocal.pedID[MANUEL]) ENDIF IF IS_PED_UNINJURED(PLAYER_PED_ID()) REGISTER_ENTITY_FOR_CUTSCENE(PLAYER_PED_ID(), "Trevor", CU_ANIMATE_EXISTING_SCRIPT_ENTITY) ADD_PED_FOR_DIALOGUE(pedConvStruct, TREVOR_ID, PLAYER_PED_ID(), "TREVOR", TRUE) IF HAS_PED_GOT_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_PISTOL) oiPistol = CREATE_WEAPON_OBJECT_FROM_PED_WEAPON_WITH_COMPONENTS(PLAYER_PED_ID(), WEAPONTYPE_PISTOL) ELIF HAS_PED_GOT_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_APPISTOL) oiPistol = CREATE_WEAPON_OBJECT_FROM_PED_WEAPON_WITH_COMPONENTS(PLAYER_PED_ID(), WEAPONTYPE_APPISTOL) ELIF HAS_PED_GOT_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_COMBATPISTOL) oiPistol = CREATE_WEAPON_OBJECT_FROM_PED_WEAPON_WITH_COMPONENTS(PLAYER_PED_ID(), WEAPONTYPE_COMBATPISTOL) ELSE GIVE_WEAPON_TO_PED(PLAYER_PED_ID(), WEAPONTYPE_PISTOL, 12, FALSE) oiPistol = CREATE_WEAPON_OBJECT_FROM_PED_WEAPON_WITH_COMPONENTS(PLAYER_PED_ID(), WEAPONTYPE_PISTOL) ENDIF IF DOES_ENTITY_EXIST(oiPistol) REGISTER_ENTITY_FOR_CUTSCENE(oiPistol, "Trevors_weapon", CU_ANIMATE_EXISTING_SCRIPT_ENTITY) ENDIF ENDIF IF DOES_ENTITY_EXIST(sRCLauncherDataLocal.ObjID[MANUEL]) REGISTER_ENTITY_FOR_CUTSCENE(sRCLauncherDataLocal.ObjID[MANUEL], "MMB_Chair", CU_ANIMATE_EXISTING_SCRIPT_ENTITY) ENDIF SAFE_FADE_SCREEN_IN_FROM_BLACK(500, FALSE) // Cleanup launcher which will remove lead-in blip RC_CLEANUP_LAUNCHER() REPLAY_START_EVENT(REPLAY_IMPORTANCE_LOW) // Start mocap scene START_CUTSCENE() WAIT(0) /*IF DOES_ENTITY_EXIST(sRCLauncherDataLocal.ObjID[MANUEL]) SET_ENTITY_VISIBLE(sRCLauncherDataLocal.ObjID[MANUEL], FALSE) ENDIF*/ SAFE_DELETE_OBJECT(sRCLauncherDataLocal.ObjID[1]) RESOLVE_VEHICLES_INSIDE_ANGLED_AREA_WITH_SIZE_LIMIT(vIntroAreaOne, vIntroAreaTwo, fIntroAreaWidth, vCarRespotOne, fCarRespotOne, GET_DEFAULT_ALLOWABLE_VEHICLE_SIZE_VECTOR()) RC_START_CUTSCENE_MODE(<<-303.82,6211.29,31.05>>) /*VEHICLE_INDEX viPlayer = GET_PLAYERS_LAST_VEHICLE() IF IS_VEHICLE_OK(viPlayer) AND IS_PED_UNINJURED(sRCLauncherDataLocal.pedID[MANUEL]) IF IS_ENTITY_IN_RANGE_ENTITY(viPlayer, sRCLauncherDataLocal.pedID[MANUEL], 2)//5) FLOAT fDistOne = GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(PLAYER_PED_ID(), vCarRespotOne) FLOAT fDistTwo = GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(PLAYER_PED_ID(), vCarRespotTwo) IF fDistOne < fDistTwo SET_ENTITY_COORDS_GROUNDED(viPlayer, vCarRespotOne) SET_ENTITY_HEADING(viPlayer, fCarRespotOne) ELSE SET_ENTITY_COORDS_GROUNDED(viPlayer, vCarRespotTwo) SET_ENTITY_HEADING(viPlayer, fCarRespotTwo) ENDIF ENDIF ENDIF*/ CPRINTLN(DEBUG_MISSION, "Start INTRO_PLAYING") missionStage = MS_INTRO_PLAYING ENDIF ENDPROC /// PURPOSE: /// Clears everything up and restarts the mission PROC RESTART_MISSION() RC_START_Z_SKIP() SET_ENTITY_COORDS(PLAYER_PED_ID(), << -286.8000, 6198.2002, 30.4470 >>) SET_ENTITY_HEADING(PLAYER_PED_ID(), 39.4) RemovePeds() WHILE NOT CREATE_NPC_PED_ON_FOOT(sRCLauncherDataLocal.pedID[MANUEL], CHAR_MANUEL, <<-293.0, 6207.0, 31.0>> , 216.0) WAIT(0) ENDWHILE SET_PED_PROP_INDEX(sRCLauncherDataLocal.pedID[0], ANCHOR_HEAD, 0) MODEL_NAMES carModel = SABREGT REQUEST_MODEL(carModel) WHILE NOT HAS_MODEL_LOADED(carModel) WAIT(0) ENDWHILE // Release/delete vehicle if it already exists... SAFE_DELETE_VEHICLE(sRCLauncherDataLocal.vehID[PLAYER_CAR]) // Create vehicle sRCLauncherDataLocal.vehID[PLAYER_CAR] = CREATE_VEHICLE(carModel, <<-281.93,6198.32,30.77>>, -135.32) SET_VEHICLE_COLOUR_COMBINATION(sRCLauncherDataLocal.vehID[PLAYER_CAR], 1) SET_VEHICLE_MODEL_IS_SUPPRESSED(carModel, TRUE) MODEL_NAMES truckModel = BISON REQUEST_MODEL(truckModel) WHILE NOT HAS_MODEL_LOADED(truckModel) WAIT(0) ENDWHILE // Release/delete vehicle if it already exists... SAFE_DELETE_VEHICLE(sRCLauncherDataLocal.vehID[MANUEL_CAR]) // Create vehicle sRCLauncherDataLocal.vehID[MANUEL_CAR] = CREATE_VEHICLE(truckModel, <<-291.72, 6208.33, 30.87>>, -134.501633) SET_VEHICLE_COLOUR_COMBINATION(sRCLauncherDataLocal.vehID[MANUEL_CAR], 0) SET_VEHICLE_MODEL_IS_SUPPRESSED(truckModel, TRUE) WAIT(500) ResetVariables() REQUEST_CUTSCENE("mmb_3_rcm") WHILE NOT HAS_CUTSCENE_LOADED_WITH_FAILSAFE() WAIT(0) ENDWHILE PlayIntro() ENDPROC /// PURPOSE: /// Loads the tow truck and driver models, these aren't needed until the car chase starts. Deletes the existing broken car and driver so they can be recreated PROC LoadTowTruckModels() REQUEST_LOAD_MODEL(mnTowTruck) REQUEST_LOAD_MODEL(mnTowTruckDriver) REQUEST_LOAD_MODEL(mnBrokenCar) REQUEST_LOAD_MODEL(mnBrokenCarDriver) SAFE_DELETE_PED(piBrokenCarDriver) SAFE_DELETE_VEHICLE(viBrokenCar) ENDPROC /// PURPOSE: /// creates the broken down car PROC SpawnBrokenCar() IF DOES_ENTITY_EXIST(viBrokenCar) IF IS_VEHICLE_OK(viBrokenCar) SET_VEHICLE_MODEL_IS_SUPPRESSED(mnBrokenCar, TRUE) SET_MODEL_AS_NO_LONGER_NEEDED(mnBrokenCar) SET_VEHICLE_DOOR_OPEN(viBrokenCar, SC_DOOR_BONNET) SET_VEHICLE_COLOUR_COMBINATION(viBrokenCar, 1) SET_VEHICLE_ENGINE_HEALTH(viBrokenCar, -1.0) SET_DISABLE_VEHICLE_PETROL_TANK_FIRES(viBrokenCar, TRUE) ENDIF ELSE IF HAS_MODEL_LOADED(mnBrokenCar) viBrokenCar = CREATE_VEHICLE(mnBrokenCar, vBrokenCar, fBrokenCar) ENDIF ENDIF IF DOES_ENTITY_EXIST(piBrokenCarDriver) IF IS_PED_UNINJURED(piBrokenCarDriver) AND NOT IsPedPerformingTask(piBrokenCarDriver, SCRIPT_TASK_PLAY_ANIM) SET_MODEL_AS_NO_LONGER_NEEDED(mnBrokenCarDriver) SET_PED_CAN_BE_TARGETTED(piBrokenCarDriver, FALSE) TASK_PLAY_ANIM(piBrokenCarDriver, ANIM_DICT_GLANCES, sBreakdownAnim, NORMAL_BLEND_IN, NORMAL_BLEND_OUT, -1, AF_LOOPING | AF_NOT_INTERRUPTABLE) ENDIF ELSE IF HAS_MODEL_LOADED(mnBrokenCarDriver) AND HAS_ANIM_DICT_LOADED(ANIM_DICT_GLANCES) piBrokenCarDriver = CREATE_PED(PEDTYPE_CIVMALE, mnBrokenCarDriver, vBrokenCarDriver, fBrokenCarDriver) ENDIF ENDIF ENDPROC /// PURPOSE: /// Spawns the tow truck and attaches it to the broken down car, makes them drive off when the player is close enough PROC SpawnTowTruck() IF IS_VEHICLE_OK(viTowTruck) IF NOT DOES_ENTITY_EXIST(piBrokenCarDriver) IF HAS_MODEL_LOADED(mnBrokenCarDriver) piBrokenCarDriver = CREATE_PED_INSIDE_VEHICLE(viTowTruck, PEDTYPE_CIVMALE, mnBrokenCarDriver, VS_FRONT_RIGHT) SET_PED_CAN_BE_TARGETTED(piBrokenCarDriver, FALSE) ENDIF ENDIF IF DOES_ENTITY_EXIST(piTowTruckDriver) IF IS_VEHICLE_OK(viBrokenCar) IF bTowTruckSceneSetup // if player is close to the truck, start driving IF (GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), viTowTruck) < 100.0) IF IS_PED_UNINJURED(piTowTruckDriver) AND NOT IsPedPerformingTask(piTowTruckDriver, SCRIPT_TASK_PERFORM_SEQUENCE) FREEZE_ENTITY_POSITION(viTowTruck, FALSE) FREEZE_ENTITY_POSITION(viBrokenCar, FALSE) SET_PED_CAN_BE_TARGETTED(piTowTruckDriver, FALSE) ATTACH_VEHICLE_TO_TOW_TRUCK(viTowTruck, viBrokenCar, -1, <<0,1.5,0>>) SET_VEHICLE_TOW_TRUCK_ARM_POSITION(viTowTruck, 0.5) SEQUENCE_INDEX siDrive OPEN_SEQUENCE_TASK(siDrive) TASK_VEHICLE_DRIVE_TO_COORD(NULL, viTowTruck, << 41.5323, 6429.8125, 30.3523 >>, 10, DRIVINGSTYLE_NORMAL, mnTowTruck, DRIVINGMODE_AVOIDCARS_OBEYLIGHTS | DF_ForceStraightLine, 4.0, 10.0) TASK_VEHICLE_DRIVE_WANDER(null, viTowTruck, 10.0, DRIVINGMODE_AVOIDCARS_OBEYLIGHTS) CLOSE_SEQUENCE_TASK(siDrive) TASK_PERFORM_SEQUENCE(piTowTruckDriver, siDrive) CLEAR_SEQUENCE_TASK(siDrive) ENDIF ENDIF ELSE // Everything is created, finish the scene // Set the tow truck's values SET_VEHICLE_MODEL_IS_SUPPRESSED(mnTowTruck, TRUE) SET_ENTITY_LOAD_COLLISION_FLAG(viTowTruck, TRUE) SET_MODEL_AS_NO_LONGER_NEEDED(mnTowTruck) SET_VEHICLE_TOW_TRUCK_ARM_POSITION(viTowTruck, 0.0) FREEZE_ENTITY_POSITION(viTowTruck, TRUE) // Set the broken car's values SET_VEHICLE_MODEL_IS_SUPPRESSED(mnBrokenCar, TRUE) SET_MODEL_AS_NO_LONGER_NEEDED(mnBrokenCar) SET_VEHICLE_COLOUR_COMBINATION(viBrokenCar, 1) SET_VEHICLE_DOORS_LOCKED(viBrokenCar, VEHICLELOCK_LOCKOUT_PLAYER_ONLY) SET_VEHICLE_AUTOMATICALLY_ATTACHES(viBrokenCar, TRUE) FREEZE_ENTITY_POSITION(viBrokenCar, TRUE) // remove the ped models SET_MODEL_AS_NO_LONGER_NEEDED(mnTowTruckDriver) SET_MODEL_AS_NO_LONGER_NEEDED(mnBrokenCarDriver) bTowTruckSceneSetup = TRUE ENDIF ELSE IF HAS_MODEL_LOADED(mnBrokenCar) viBrokenCar = CREATE_VEHICLE(mnBrokenCar, vBrokenCar, fBrokenCar) ENDIF ENDIF ELSE IF HAS_MODEL_LOADED(mnTowTruckDriver) piTowTruckDriver = CREATE_PED_INSIDE_VEHICLE(viTowTruck, PEDTYPE_CIVMALE, mnTowTruckDriver) ENDIF ENDIF ELSE LoadTowTruckModels() IF HAS_MODEL_LOADED(mnTowTruck) viTowTruck = CREATE_VEHICLE(mnTowTruck, vTowTruck, fTowTruck) ENDIF ENDIF ENDPROC /// PURPOSE: /// Creates all the peds, vehicles and objects for the farm scene and gives them tasks PROC Setup_Farm() // create the mexicans INT i = 0 REPEAT NUM_MEXICANS i IF IS_PED_UNINJURED(piMexican[i]) IF NOT IsPedPerformingTask(piMexican[i], SCRIPT_TASK_HANDS_UP) AND NOT IsPedPerformingTask(piMexican[i], SCRIPT_TASK_COWER) SET_ENTITY_COORDS_NO_OFFSET(piMexican[i], vMexicanPos[i]) SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(piMexican[i], TRUE) SET_PED_PATH_CAN_USE_LADDERS(piMexican[i], FALSE) // prevent the player auto aiming at the mexicans SET_PED_CAN_BE_TARGETTED(piMexican[i], FALSE) SET_PED_FLEE_ATTRIBUTES(piMexican[i], FA_CAN_SCREAM, TRUE) SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(piMexican[i], TRUE) // make some Mexicans cower, some have their hands up IF i % 2 = 0 TASK_HANDS_UP(piMexican[i], -1) ELSE TASK_COWER(piMexican[i]) ENDIF ENDIF ELSE IF HAS_MODEL_LOADED(mnMexicanFemale) AND HAS_MODEL_LOADED(mnMexicanMale) IF i < 2 // Mexicans 0 and 1 are female piMexican[i] = CREATE_PED(PEDTYPE_CIVFEMALE, mnMexicanFemale, vMexicanPos[i], fMexicanHeading[i]) ELSE // Mexicans 2, 3 and 4 are male piMexican[i] = CREATE_PED(PEDTYPE_CIVMALE, mnMexicanMale, vMexicanPos[i], fMexicanHeading[i]) ENDIF ENDIF ENDIF ENDREPEAT // create Josef, give him a shotgun and make him aim at the Mexicans IF HAS_ANIM_DICT_LOADED(ANIM_DICT_GLANCES) AND HAS_ANIM_DICT_LOADED(ANIM_DICT_PANIC) SEQUENCE_INDEX siGunAnims IF DOES_ENTITY_EXIST(mdJosef.piDude) IF NOT IS_PED_INJURED(mdJosef.piDude) IF NOT IsPedPerformingTask(mdJosef.piDude, SCRIPT_TASK_PERFORM_SEQUENCE) SET_ENTITY_LOAD_COLLISION_FLAG(mdJosef.piDude, TRUE) GIVE_WEAPON_TO_PED(mdJosef.piDude, WEAPONTYPE_SAWNOFFSHOTGUN, -1, TRUE) SET_PED_ACCURACY(mdJosef.piDude, 25) OPEN_SEQUENCE_TASK(siGunAnims) TASK_PLAY_ANIM(NULL, ANIM_DICT_GLANCES, "0") TASK_PLAY_ANIM(NULL, ANIM_DICT_GLANCES, "180") TASK_PLAY_ANIM(NULL, ANIM_DICT_PANIC, "-90") TASK_PLAY_ANIM(NULL, ANIM_DICT_GLANCES, "90") TASK_PLAY_ANIM(NULL, ANIM_DICT_PANIC, "90") TASK_PLAY_ANIM(NULL, ANIM_DICT_GLANCES, "-90") TASK_PLAY_ANIM(NULL, ANIM_DICT_PANIC, "180") TASK_PLAY_ANIM(NULL, ANIM_DICT_GLANCES, "-180") TASK_PLAY_ANIM(NULL, ANIM_DICT_PANIC, "0") TASK_PLAY_ANIM(NULL, ANIM_DICT_PANIC, "-180") SET_SEQUENCE_TO_REPEAT(siGunAnims, REPEAT_FOREVER) CLOSE_SEQUENCE_TASK(siGunAnims) TASK_PERFORM_SEQUENCE(mdJosef.piDude, siGunAnims) CLEAR_SEQUENCE_TASK(siGunAnims) ADD_PED_FOR_DIALOGUE(pedConvStruct, JOSEF_ID, mdJosef.piDude, "JOSEF", TRUE) SET_ENTITY_COORDS_NO_OFFSET(mdJosef.piDude, vAltJosefPos) SET_PED_SPHERE_DEFENSIVE_AREA(mdJosef.piDude, vAltJosefPos, 25.0) SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(mdJosef.piDude, TRUE) SET_PED_CONFIG_FLAG(mdJosef.piDude, PCF_GetOutBurningVehicle, FALSE) //stop ped auto leaving undriveable vehicle SET_PED_CONFIG_FLAG(mdJosef.piDude, PCF_GetOutUndriveableVehicle, FALSE) //stop ped auto leaving undriveable vehicle SET_PED_CONFIG_FLAG(mdJosef.piDude, PCF_PedsJackingMeDontGetIn, TRUE) // player won't get in the van if they jack Josef SET_PED_PROP_INDEX(mdJosef.piDude, ANCHOR_HEAD, 0) SET_PED_PROP_INDEX(mdJosef.piDude, ANCHOR_EYES, 0) REQUEST_WAYPOINT_RECORDING(sWaypointRecMain) REQUEST_WAYPOINT_RECORDING(sWaypointRecAlt) ENDIF ENDIF ELSE IF HAS_MODEL_LOADED(GET_NPC_PED_MODEL(eclJosef)) mdJosef.piDude = CREATE_PED(PEDTYPE_MISSION, GET_NPC_PED_MODEL(eclJosef), vAltJosefPos, fAltJosefHeading) ENDIF ENDIF ENDIF // create vehicles /*IF IS_VEHICLE_OK(viTractor) IF NOT bTractorSetup SET_VEHICLE_ON_GROUND_PROPERLY(viTractor) SET_VEHICLE_MODEL_IS_SUPPRESSED(mnTractor, TRUE) SET_MODEL_AS_NO_LONGER_NEEDED(mnTractor) bTractorSetup = TRUE ENDIF ELSE*/ IF NOT IS_VEHICLE_OK(viTractor) IF HAS_MODEL_LOADED(mnTractor) viTractor = CREATE_VEHICLE(mnTractor, vTractorPos, fTractorHeading) ENDIF ENDIF IF IS_VEHICLE_OK(viFarmCar) IF NOT bFarmCarSetup SET_VEHICLE_ON_GROUND_PROPERLY(viFarmCar) SET_VEHICLE_MODEL_IS_SUPPRESSED(mnFarmCar, TRUE) SET_MODEL_AS_NO_LONGER_NEEDED(mnFarmCar) bFarmCarSetup = TRUE ENDIF ELSE IF HAS_MODEL_LOADED(mnFarmCar) viFarmCar = CREATE_VEHICLE(mnFarmCar, vAltFarmCarPos, fAltFarmCarHeading) ENDIF ENDIF // create the barn doors IF DOES_ENTITY_EXIST(oiBarnDoorLeft) IF NOT bBarnDoorRightSetup SET_ENTITY_HEADING(oiBarnDoorLeft, DOOR_LEFT_HEADING_ALT) FREEZE_ENTITY_POSITION(oiBarnDoorLeft, TRUE) SET_STATE_OF_CLOSEST_DOOR_OF_TYPE(mnBarnDoorLeft, <<424.32, 6477.74, 30.79>>, TRUE, 0.0) SET_MODEL_AS_NO_LONGER_NEEDED(mnBarnDoorLeft) bBarnDoorRightSetup = TRUE ENDIF ELSE IF HAS_MODEL_LOADED(mnBarnDoorLeft) oiBarnDoorLeft = CREATE_OBJECT_NO_OFFSET(mnBarnDoorLeft, <<424.32, 6477.74, 30.79>>) ENDIF ENDIF IF DOES_ENTITY_EXIST(oiBarnDoorRight) IF NOT bBarnDoorLeftSetup SET_ENTITY_HEADING(oiBarnDoorRight, DOOR_RIGHT_HEADING_ALT) FREEZE_ENTITY_POSITION(oiBarnDoorRight, TRUE) SET_STATE_OF_CLOSEST_DOOR_OF_TYPE(mnBarnDoorRight, << 419.30, 6471.71, 30.74>>, TRUE, 0.0) SET_MODEL_AS_NO_LONGER_NEEDED(mnBarnDoorRight) bBarnDoorLeftSetup = TRUE ENDIF ELSE IF HAS_MODEL_LOADED(mnBarnDoorRight) oiBarnDoorRight = CREATE_OBJECT_NO_OFFSET(mnBarnDoorRight, << 419.30, 6471.71, 30.74>>) ENDIF ENDIF ENDPROC /// PURPOSE: /// Sets up Joe fleeing from the barn in the van PROC Setup_Farm_Two() IF IS_VEHICLE_OK(viVan) AND IS_VEHICLE_OK(viTractor) IF NOT bVanSetup AND NOT bTractorSetup /*SET_VEHICLE_MODEL_IS_SUPPRESSED(mnVan, TRUE) SET_MODEL_AS_NO_LONGER_NEEDED(mnVan)*/ SET_VEHICLE_MODEL_IS_SUPPRESSED(mnTractor, TRUE) SET_MODEL_AS_NO_LONGER_NEEDED(mnTractor) SET_VEHICLE_ON_GROUND_PROPERLY(viTractor) SET_ENTITY_COORDS(viVan, vRecordingStartAlt) SET_ENTITY_QUATERNION(viVan, fRecQuaternionXAlt, fRecQuaternionYAlt, fRecQuaternionZAlt, fRecQuaternionWAlt) SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(viVan, TRUE) SET_VEHICLE_ENGINE_ON(viVan, TRUE, TRUE) SET_VEHICLE_DOOR_OPEN(viVan, SC_DOOR_FRONT_RIGHT) bTractorSetup = TRUE bVanSetup = TRUE ENDIF ENDIF IF NOT IS_VEHICLE_OK(viVan) /*IF HAS_MODEL_LOADED(mnVan) viVan = CREATE_VEHICLE(mnVan, vAltVanPos, fAltVanHeading) ENDIF*/ IF HAS_MODEL_LOADED(mnTractor) viVan = CREATE_VEHICLE(mnTractor, vAltVanPos, fAltVanHeading) ENDIF ENDIF IF IS_PED_UNINJURED(mdJoe.piDude) IF NOT IsPedPerformingTask(mdJoe.piDude, SCRIPT_TASK_AIM_GUN_AT_COORD) GIVE_WEAPON_TO_PED(mdJoe.piDude, WEAPONTYPE_SAWNOFFSHOTGUN, -1, TRUE) TASK_AIM_GUN_AT_COORD(mdJoe.piDude, vMexicanPos2[0], -1) SET_ENTITY_LOAD_COLLISION_FLAG(mdJoe.piDude, TRUE) //ADD_PED_FOR_DIALOGUE(pedConvStruct, JOE_ID, mdJoe.piDude, "JOE", TRUE) SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(mdJoe.piDude, TRUE) SET_PED_CONFIG_FLAG(mdJoe.piDude, PCF_GetOutBurningVehicle, FALSE) //stop ped auto leaving undriveable vehicle SET_PED_CONFIG_FLAG(mdJoe.piDude, PCF_GetOutUndriveableVehicle, FALSE) //stop ped auto leaving undriveable vehicle SET_PED_CONFIG_FLAG(mdJoe.piDude, PCF_PedsJackingMeDontGetIn, TRUE) // player won't get in the van if they jack Joe SET_PED_SUFFERS_CRITICAL_HITS(mdJoe.piDude, FALSE) SET_PED_PROP_INDEX(mdJoe.piDude, ANCHOR_EYES, 0) ENDIF ELSE IF HAS_MODEL_LOADED(GET_NPC_PED_MODEL(eclJoe)) mdJoe.piDude = CREATE_PED(PEDTYPE_MISSION, GET_NPC_PED_MODEL(eclJoe), vAltJoePos, fAltJoeHeading) ENDIF ENDIF INT i = 0 INT numReady = 0 REPEAT NUM_MEXICANS_2 i IF IS_PED_UNINJURED(piMexican2[i]) numReady++ IF NOT IsPedPerformingTask(piMexican2[i], SCRIPT_TASK_HANDS_UP) AND NOT IsPedPerformingTask(piMexican2[i], SCRIPT_TASK_COWER) SET_ENTITY_COORDS_NO_OFFSET(piMexican2[i], vMexicanPos2[i]) SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(piMexican2[i], TRUE) SET_PED_PATH_CAN_USE_LADDERS(piMexican2[i], FALSE) // prevent the player auto aiming at the mexicans SET_PED_CAN_BE_TARGETTED(piMexican2[i], FALSE) SET_PED_FLEE_ATTRIBUTES(piMexican2[i], FA_CAN_SCREAM, TRUE) SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(piMexican2[i], TRUE) // make some Mexicans cower, some have their hands up IF i % 2 = 0 TASK_HANDS_UP(piMexican2[i], -1) ELSE TASK_COWER(piMexican2[i]) ENDIF ENDIF ELSE IF HAS_MODEL_LOADED(mnMexicanFemale) AND HAS_MODEL_LOADED(mnMexicanMale) IF i < 2 // Mexicans 0 and 1 are female piMexican2[i] = CREATE_PED(PEDTYPE_CIVFEMALE, mnMexicanFemale, vMexicanPos2[i], fMexicanHeading2[i]) ELSE // Mexicans 2, 3 and 4 are male piMexican2[i] = CREATE_PED(PEDTYPE_CIVMALE, mnMexicanMale, vMexicanPos2[i], fMexicanHeading2[i]) ENDIF ENDIF ENDIF ENDREPEAT IF numReady = NUM_MEXICANS_2 SET_MODEL_AS_NO_LONGER_NEEDED(mnMexicanFemale) SET_MODEL_AS_NO_LONGER_NEEDED(mnMexicanMale) ENDIF IF IS_VEHICLE_OK(viFarmCar) IF NOT bFarmCarSetup SET_VEHICLE_ON_GROUND_PROPERLY(viFarmCar) SET_VEHICLE_MODEL_IS_SUPPRESSED(mnFarmCar, TRUE) SET_MODEL_AS_NO_LONGER_NEEDED(mnFarmCar) REQUEST_WAYPOINT_RECORDING(sWaypointRecMain) REQUEST_WAYPOINT_RECORDING(sWaypointRecAlt) bFarmCarSetup = TRUE ENDIF ELSE IF HAS_MODEL_LOADED(mnFarmCar) viFarmCar = CREATE_VEHICLE(mnFarmCar, vAltFarmCarPos, fAltFarmCarHeading) ENDIF ENDIF // create the barn doors, just in case they hadn't spawned in during the first setup function IF DOES_ENTITY_EXIST(oiBarnDoorLeft) IF NOT bBarnDoorLeftSetup SET_ENTITY_HEADING(oiBarnDoorLeft, DOOR_LEFT_HEADING_ALT) FREEZE_ENTITY_POSITION(oiBarnDoorLeft, TRUE) SET_STATE_OF_CLOSEST_DOOR_OF_TYPE(mnBarnDoorLeft, <<424.32, 6477.74, 30.79>>, TRUE, 0.0) SET_MODEL_AS_NO_LONGER_NEEDED(mnBarnDoorLeft) bBarnDoorLeftSetup = TRUE ENDIF ELSE IF HAS_MODEL_LOADED(mnBarnDoorLeft) oiBarnDoorLeft = CREATE_OBJECT_NO_OFFSET(mnBarnDoorLeft, <<424.32, 6477.74, 30.79>>) ENDIF ENDIF IF DOES_ENTITY_EXIST(oiBarnDoorRight) IF NOT bBarnDoorRightSetup SET_ENTITY_HEADING(oiBarnDoorRight, DOOR_RIGHT_HEADING_ALT) FREEZE_ENTITY_POSITION(oiBarnDoorRight, TRUE) SET_STATE_OF_CLOSEST_DOOR_OF_TYPE(mnBarnDoorRight, << 419.30, 6471.71, 30.74>>, TRUE, 0.0) SET_MODEL_AS_NO_LONGER_NEEDED(mnBarnDoorRight) bBarnDoorRightSetup = TRUE ENDIF ELSE IF HAS_MODEL_LOADED(mnBarnDoorRight) oiBarnDoorRight = CREATE_OBJECT_NO_OFFSET(mnBarnDoorRight, << 419.30, 6471.71, 30.74>>) ENDIF ENDIF ENDPROC /// PURPOSE: /// Gives the player more ammo when they start from a checkpoint PROC GivePlayerAmmoForCheckpoint() AMMO_TYPE eAmmoType IF HAS_PED_GOT_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_PISTOL) eAmmoType = GET_PED_AMMO_TYPE_FROM_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_PISTOL) IF GET_PED_AMMO_BY_TYPE(PLAYER_PED_ID(), eAmmoType) < 12 GIVE_WEAPON_TO_PED(PLAYER_PED_ID(), WEAPONTYPE_PISTOL, 12, TRUE) ENDIF ELIF HAS_PED_GOT_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_APPISTOL) eAmmoType = GET_PED_AMMO_TYPE_FROM_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_APPISTOL) IF GET_PED_AMMO_BY_TYPE(PLAYER_PED_ID(), eAmmoType) < 12 GIVE_WEAPON_TO_PED(PLAYER_PED_ID(), WEAPONTYPE_PISTOL, 12, TRUE) ENDIF ELIF HAS_PED_GOT_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_COMBATPISTOL) eAmmoType = GET_PED_AMMO_TYPE_FROM_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_COMBATPISTOL) IF GET_PED_AMMO_BY_TYPE(PLAYER_PED_ID(), eAmmoType) < 12 GIVE_WEAPON_TO_PED(PLAYER_PED_ID(), WEAPONTYPE_PISTOL, 12, TRUE) ENDIF ELSE GIVE_WEAPON_TO_PED(PLAYER_PED_ID(), WEAPONTYPE_PISTOL, 12, TRUE) ENDIF ENDPROC /// PURPOSE: /// restarts the mission after the Intro PROC AfterMocapCheckpoint() RC_START_Z_SKIP() KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() PopulateMexicanPositionArray() //LoadModels() IF IS_PED_UNINJURED(sRCLauncherDataLocal.pedID[MANUEL]) ADD_PED_FOR_DIALOGUE(pedConvStruct, MANUEL_ID, sRCLauncherDataLocal.pedID[MANUEL], "MANUEL", TRUE) SET_ENTITY_COORDS_GROUNDED(sRCLauncherDataLocal.pedID[MANUEL], vManuelAfterCutscene) SET_ENTITY_HEADING(sRCLauncherDataLocal.pedID[MANUEL], fManuelAfterCutscne) ENDIF GivePlayerAmmoForCheckpoint() ADD_PED_FOR_DIALOGUE(pedConvStruct, TREVOR_ID, PLAYER_PED_ID(), "TREVOR", TRUE) IF NOT IS_REPLAY_BEING_SET_UP() SET_ENTITY_COORDS_GROUNDED(PLAYER_PED_ID(), << -303.3698, 6212.3550, 30.4696 >>) SET_ENTITY_HEADING(PLAYER_PED_ID(), 229.2303) ENDIF SET_ALL_VEHICLE_GENERATORS_ACTIVE_IN_AREA(<<-297.987488,6193.311523,28.874229>>, <<-274.159363,6209.037598,32.357018>>, FALSE) DELETE_VEHICLE_GEN_VEHICLES_IN_AREA(GET_ENTITY_COORDS(PLAYER_PED_ID()), 100) CLEAR_AREA_OF_VEHICLES(GET_ENTITY_COORDS(PLAYER_PED_ID()), 100) CPRINTLN(DEBUG_MISSION, "Start INTRO_PLAYING") missionStage = MS_INTRO_PLAYING IF NOT IS_REPLAY_BEING_SET_UP() WAIT_FOR_WORLD_TO_LOAD(GET_ENTITY_COORDS(PLAYER_PED_ID())) ENDIF IF IS_PED_UNINJURED(sRCLauncherDataLocal.pedID[MANUEL]) /*SET_ENTITY_COLLISION(sRCLauncherDataLocal.pedID[MANUEL], TRUE) FREEZE_ENTITY_POSITION(sRCLauncherDataLocal.pedID[MANUEL], FALSE)*/ SEQUENCE_INDEX siManuel OPEN_SEQUENCE_TASK(siManuel) //TASK_TURN_PED_TO_FACE_ENTITY(NULL, PLAYER_PED_ID(), 4000) IF IS_VEHICLE_OK(sRCLauncherDataLocal.vehID[MANUEL_CAR]) AND IS_VEHICLE_SEAT_FREE(sRCLauncherDataLocal.vehID[MANUEL_CAR]) TASK_ENTER_VEHICLE(NULL, sRCLauncherDataLocal.vehID[MANUEL_CAR], DEFAULT_TIME_BEFORE_WARP, VS_DRIVER, PEDMOVE_WALK) TASK_VEHICLE_DRIVE_WANDER(NULL, sRCLauncherDataLocal.vehID[MANUEL_CAR], 20, DRIVINGMODE_AVOIDCARS) ELSE TASK_WANDER_STANDARD(NULL) ENDIF CLOSE_SEQUENCE_TASK(siManuel) TASK_PERFORM_SEQUENCE(sRCLauncherDataLocal.pedID[MANUEL], siManuel) CLEAR_SEQUENCE_TASK(siManuel) ENDIF IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.objID[MANUEL]) SET_ENTITY_COLLISION(sRCLauncherDataLocal.objID[MANUEL], TRUE) FREEZE_ENTITY_POSITION(sRCLauncherDataLocal.objID[MANUEL], FALSE) ENDIF IF IS_REPLAY_BEING_SET_UP() VEHICLE_INDEX viTemp CREATE_VEHICLE_FOR_REPLAY(viTemp, << -283.27, 6216.75, 31.84 >>, 43.56, FALSE, FALSE, TRUE, TRUE, TRUE, SABREGT) END_REPLAY_SETUP() ENDIF RC_END_Z_SKIP() ENDPROC /// PURPOSE: /// Teleports the player to a position and gives them a vehicle if they don't have one /// PARAMS: /// vNewPos - The position to teleport the player to /// fNewHeading - The heading to give the player PROC SetPlayerPosWithVehicle(VECTOR vNewPos, FLOAT fNewHeading) IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) SET_PED_COORDS_KEEP_VEHICLE(PLAYER_PED_ID(), vNewPos) SET_ENTITY_HEADING(PLAYER_PED_ID(), fNewHeading) ELSE VEHICLE_INDEX viPlayer = GET_PLAYERS_LAST_VEHICLE() IF IS_VEHICLE_OK(viPlayer) SET_ENTITY_AS_MISSION_ENTITY(viPlayer, TRUE, TRUE) ENDIF SAFE_DELETE_VEHICLE(viPlayer) VEHICLE_INDEX viTemp CREATE_VEHICLE_FOR_REPLAY(viTemp, vNewPos, fNewHeading, TRUE, FALSE, TRUE, TRUE, TRUE, SABREGT) SAFE_RELEASE_VEHICLE(viTemp) ENDIF SET_GAMEPLAY_CAM_RELATIVE_HEADING() SET_GAMEPLAY_CAM_RELATIVE_PITCH() ENDPROC /// PURPOSE: /// Restarts the mission PROC DebugSkipRestart() RESTART_MISSION() RC_END_Z_SKIP(TRUE) ENDPROC /// PURPOSE: /// Checks if the models have loaded /// RETURNS: /// TRUE if the models have loaded FUNC BOOL HaveModelsLoaded() IF HAS_MODEL_LOADED(mnMexicanFemale) AND HAS_MODEL_LOADED(mnMexicanMale) AND HAS_MODEL_LOADED(GET_NPC_PED_MODEL(eclJosef)) AND HAS_MODEL_LOADED(GET_NPC_PED_MODEL(eclJoe)) AND HAS_MODEL_LOADED(mnTractor) AND HAS_MODEL_LOADED(mnFarmCar) //AND HAS_MODEL_LOADED(mnVan) AND HAS_MODEL_LOADED(mnBarnDoorLeft) AND HAS_MODEL_LOADED(mnBarnDoorRight) AND HAS_MODEL_LOADED(mnBrokenCar) AND HAS_MODEL_LOADED(mnBrokenCarDriver) RETURN TRUE ENDIF RETURN FALSE ENDFUNC /// PURPOSE: /// Checks if the first half of the farm scene has been set up /// RETURNS: /// TRUE if the first half of the farm scene has been set up FUNC BOOL IsFarmSetup() IF IS_PED_UNINJURED(mdJosef.piDude) AND IS_VEHICLE_OK(viTractor) AND IS_VEHICLE_OK(viFarmCar) AND IS_PED_UNINJURED(piMexican[0]) AND IS_PED_UNINJURED(piMexican[1]) AND IS_PED_UNINJURED(piMexican[2]) AND IS_PED_UNINJURED(piMexican[3])AND IS_PED_UNINJURED(piMexican[4]) AND DOES_ENTITY_EXIST(oiBarnDoorLeft) AND DOES_ENTITY_EXIST(oiBarnDoorRight) RETURN TRUE ENDIF RETURN FALSE ENDFUNC /// PURPOSE: /// Checks if the second half of the farm scene has been set up /// RETURNS: /// TRUE if the second half of the farm scene has been set up FUNC BOOL IsFarmTwoSetup() IF IS_PED_UNINJURED(mdJoe.piDude) AND IS_VEHICLE_OK(viVan) AND IS_PED_UNINJURED(piMexican2[0]) AND IS_PED_UNINJURED(piMexican2[1])AND IS_PED_UNINJURED(piMexican2[2]) RETURN TRUE ENDIF RETURN FALSE ENDFUNC /// PURPOSE: /// Creates the initial blips for Joe and Josef (uses coords because the peds don't exist yet) PROC CreateInitialBlips() SAFE_REMOVE_BLIP(mdJoe.biBlip) mdJoe.biBlip = CREATE_COORD_BLIP(vAltJoePos, BLIPPRIORITY_MED, FALSE) SET_BLIP_COLOUR(mdJoe.biBlip, BLIP_COLOUR_RED) SET_BLIP_SCALE(mdJoe.biBlip, BLIP_SIZE_PED) SET_BLIP_NAME_FROM_TEXT_FILE(mdJoe.biBlip, "BLIP_ENEMY") SAFE_REMOVE_BLIP(mdJosef.biBlip) mdJosef.biBlip = CREATE_COORD_BLIP(vAltJosefPos, BLIPPRIORITY_MED, FALSE) SET_BLIP_COLOUR(mdJosef.biBlip, BLIP_COLOUR_RED) SET_BLIP_SCALE(mdJosef.biBlip, BLIP_SIZE_PED) SET_BLIP_NAME_FROM_TEXT_FILE(mdJosef.biBlip, "BLIP_ENEMY") SET_BLIP_ROUTE(mdJosef.biBlip, TRUE) SET_TAXI_DROPOFF_LOCATION_FOR_BLIP(mdJoe.biBlip, <<405.69, 6557.56, 27.04>>, 266.03) SET_TAXI_DROPOFF_LOCATION_FOR_BLIP(mdJosef.biBlip, <<405.69, 6557.56, 27.04>>, 266.03) ENDPROC /// PURPOSE: /// Creates the actual ped blips for Joe and Josef PROC CreateProperBlips() IF IS_PED_UNINJURED(mdJoe.piDude) SAFE_REMOVE_BLIP(mdJoe.biBlip) mdJoe.biBlip = CREATE_PED_BLIP(mdJoe.piDude) SET_TAXI_DROPOFF_LOCATION_FOR_BLIP(mdJoe.biBlip, <<405.69, 6557.56, 27.04>>, 266.03) ENDIF IF IS_PED_UNINJURED(mdJosef.piDude) SAFE_REMOVE_BLIP(mdJosef.biBlip) mdJosef.biBlip = CREATE_PED_BLIP(mdJosef.piDude) SET_TAXI_DROPOFF_LOCATION_FOR_BLIP(mdJosef.biBlip, <<405.69, 6557.56, 27.04>>, 266.03) ENDIF ENDPROC /// PURPOSE: /// stops non-mission things being spawned at the farm PROC ClearTheFarm() SET_PED_NON_CREATION_AREA(vFarmMin, vFarmMax) sbiFarmArea = ADD_SCENARIO_BLOCKING_AREA(vFarmMin, vFarmMax) SET_PED_PATHS_IN_AREA(vFarmMin, vFarmMax, FALSE) SET_ALL_VEHICLE_GENERATORS_ACTIVE_IN_AREA(vFarmMin, vFarmMax, FALSE) CLEAR_AREA_OF_PEDS(vFarmPosition, 500) CLEAR_AREA_OF_VEHICLES(vFarmPosition, 500, FALSE, FALSE, TRUE, TRUE) ENDPROC /// PURPOSE: /// Restarts the mission just before the Kill Josef stage PROC DebugSkipKillJosef() RC_START_Z_SKIP() KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() RemovePeds() //VEHICLE_INDEX viTemp // teleport player to near the farm and get them a vehicle IF NOT IS_REPLAY_BEING_SET_UP() SetPlayerPosWithVehicle(<< 389.4927, 6554.7339, 26.6191 >>, 270.5771) //ELSE // CREATE_VEHICLE_FOR_REPLAY(viTemp, << 389.4927, 6554.7339, 26.6191 >>, 270.5771, FALSE, FALSE, FALSE, TRUE, TRUE, SABREGT) ENDIF PopulateMexicanPositionArray() ResetVariables() LoadModels() LoadBrokenCarModels() WHILE NOT HaveModelsLoaded() WAIT(0) ENDWHILE Setup_Farm() WHILE NOT IsFarmSetup() Setup_Farm() WAIT(0) ENDWHILE Setup_Farm() Setup_Farm_Two() WHILE NOT IsFarmTwoSetup() Setup_Farm_Two() WAIT(0) ENDWHILE Setup_Farm_Two() GivePlayerAmmoForCheckpoint() MissionSubState = SS_UPDATE_THREE missionStage = MS_DRIVE_TO_FARM SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CP_KILL_JOSEF, "Kill Josef") IF NOT IS_REPLAY_BEING_SET_UP() WAIT_FOR_WORLD_TO_LOAD(GET_ENTITY_COORDS(PLAYER_PED_ID())) ENDIF PRINT_NOW("MIN3_06", DEFAULT_GOD_TEXT_TIME, 1) // Kill ~r~Joe ~s~and ~r~Josef. CreateInitialBlips() ClearTheFarm() IF IS_REPLAY_BEING_SET_UP() //VEHICLE_INDEX viTemp = GET_PLAYERS_LAST_VEHICLE() VEHICLE_INDEX viTemp CREATE_VEHICLE_FOR_REPLAY(viTemp, << 389.4927, 6554.7339, 26.6191 >>, 270.5771, FALSE, FALSE, TRUE, TRUE, TRUE, SABREGT) END_REPLAY_SETUP(viTemp) ENDIF RC_END_Z_SKIP(TRUE) ENDPROC /// PURPOSE: /// Restarts the mission just before the car chase stage PROC DebugSkipChaseJoe() RC_START_Z_SKIP() KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() RemovePeds() //VEHICLE_INDEX viTemp // teleport player to near the barn IF NOT IS_REPLAY_BEING_SET_UP() SetPlayerPosWithVehicle(<< 423.6803, 6519.7100, 26.6747 >>, 170.9605) //ELSE // CREATE_VEHICLE_FOR_REPLAY(viTemp, << 423.6803, 6519.7100, 26.6747 >>, 170.9605, FALSE, FALSE, FALSE, TRUE, TRUE, SABREGT) ENDIF PopulateMexicanPositionArray() ResetVariables() LoadModels() LoadBrokenCarModels() WHILE NOT HaveModelsLoaded() WAIT(0) ENDWHILE Setup_Farm_Two() WHILE NOT IsFarmTwoSetup() Setup_Farm_Two() WAIT(0) ENDWHILE Setup_Farm_Two() CreateProperBlips() GivePlayerAmmoForCheckpoint() MissionSubState = SS_SETUP missionStage = MS_SEARCH_FARM ClearTheFarm() SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CP_KILL_JOE, "Kill Joe", TRUE) IF IS_REPLAY_BEING_SET_UP() //VEHICLE_INDEX viTemp = GET_PLAYERS_LAST_VEHICLE() VEHICLE_INDEX viTemp CREATE_VEHICLE_FOR_REPLAY(viTemp, << 423.6803, 6519.7100, 26.6747 >>, 170.9605, FALSE, FALSE, TRUE, TRUE, TRUE, SABREGT) END_REPLAY_SETUP(viTemp) ELSE WAIT_FOR_WORLD_TO_LOAD(GET_ENTITY_COORDS(PLAYER_PED_ID())) ENDIF TRIGGER_MUSIC_EVENT("MM3_RESTART1") RC_END_Z_SKIP(TRUE) ENDPROC /// PURPOSE: /// Checks for debug pass or fail and for the Z skip menu #IF IS_DEBUG_BUILD PROC DEBUG_Check_Debug_Keys() // Check for Pass IF missionStage <> MS_FAIL_DELAY IF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_S)) WAIT_FOR_CUTSCENE_TO_STOP() TRIGGER_MUSIC_EVENT("MM3_STOP") Script_Passed() ENDIF // Check for Fail IF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_F)) WAIT_FOR_CUTSCENE_TO_STOP() MissionFailReason = MFR_NONE MissionSubState = SS_SETUP missionStage = MS_FAIL_DELAY ENDIF INT debugJumpStage = -1 IF LAUNCH_MISSION_STAGE_MENU(sSkipMenu, debugJumpStage) IF debugJumpStage = 0 // restart mission DebugSkipRestart() ELIF debugJumpStage = 1 // Skip to the Kill Josef stage DebugSkipKillJosef() ELIF debugJumpStage = 2 // Skip to the car chase stage DebugSkipChaseJoe() ENDIF ENDIF ENDIF ENDPROC #ENDIF // =========================================================================================================== // HELPER FUNCTIONS // =========================================================================================================== /// PURPOSE: /// Fails the mission with an appropriate reason if a ped has been damaged /// PARAMS: /// testPed - The ped we want to test for failing the mission PROC PedDamageFailControl(PED_INDEX testPed) IF DOES_ENTITY_EXIST(testPed) IF testPed = sRCLauncherDataLocal.pedID[MANUEL] IF IS_PED_INJURED(testPed) MissionFailReason = MFR_KILLED_MANUEL ELSE IF (IS_PED_PERFORMING_STEALTH_KILL(PLAYER_PED_ID()) AND IS_PED_BEING_STEALTH_KILLED(testPed)) OR WAS_PED_KILLED_BY_TAKEDOWN(testPed) MissionFailReason = MFR_KILLED_MANUEL ELSE MissionFailReason = MFR_INJURED_MANUEL ENDIF ENDIF ELSE IF IS_PED_INJURED(testPed) IF bMexDialogueTriggered MissionFailReason = MFR_EXECUTION ELSE MissionFailReason = MFR_KILLED_A_MEXICAN ENDIF ELSE IF (IS_PED_PERFORMING_STEALTH_KILL(PLAYER_PED_ID()) AND IS_PED_BEING_STEALTH_KILLED(testPed)) OR WAS_PED_KILLED_BY_TAKEDOWN(testPed) MissionFailReason = MFR_KILLED_A_MEXICAN ELSE MissionFailReason = MFR_INJURED_A_MEXICAN ENDIF ENDIF ENDIF INT i = 0 REPEAT NUM_MEXICANS i IF IS_PED_UNINJURED(piMexican[i]) IF NOT IS_PED_FLEEING(piMexican[i]) TASK_SMART_FLEE_PED(piMexican[i], PLAYER_PED_ID(), 500, -1) ENDIF ENDIF ENDREPEAT IF IS_PED_UNINJURED(mdJosef.piDude) AND IS_PED_UNINJURED(PLAYER_PED_ID()) TASK_COMBAT_PED(mdJosef.piDude, PLAYER_PED_ID()) ENDIF CLEAR_ALL_BLIPS() KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() MissionSubState = SS_SETUP missionStage = MS_FAIL_DELAY ENDIF ENDPROC /// PURPOSE: /// Checks if a ped has been damaged or killed, calls the fail message function if so /// PARAMS: /// testPed - The ped we want to test PROC Check_Essential_Ped(PED_INDEX testPed) IF NOT (missionStage = MS_FAIL_DELAY) IF DOES_ENTITY_EXIST(testPed) IF IS_PED_INJURED(testPed) PedDamageFailControl(testPed) ENDIF ENDIF ENDIF ENDPROC /// PURPOSE: /// Checks if the player has attacked a mission critical ped, calls the fail message function if so /// PARAMS: /// testPed - The ped we want to test PROC CheckPlayerHurtsPed(PED_INDEX testPed) IF NOT (missionStage = MS_FAIL_DELAY) IF IS_PED_UNINJURED(testPed) IF HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(testPed, PLAYER_PED_ID()) TASK_SMART_FLEE_PED(testPed, PLAYER_PED_ID(), 500, -1) PedDamageFailControl(testPed) ENDIF ENDIF ENDIF ENDPROC /// PURPOSE: /// Checks if the player is messing with Manuel's car, fails the mission if so /// Also makes Manuel switch to wandering on foot if appropriate PROC CheckManuelsCar() IF NOT (missionStage = MS_FAIL_DELAY) IF IS_PED_UNINJURED(sRCLauncherDataLocal.pedID[MANUEL]) IF NOT IS_VEHICLE_OK(sRCLauncherDataLocal.vehID[MANUEL_CAR]) OR IS_PLAYER_SHOOTING_NEAR_PED(sRCLauncherDataLocal.pedID[MANUEL], FALSE) OR HAS_ENTITY_BEEN_DAMAGED_BY_WEAPON(sRCLauncherDataLocal.vehID[MANUEL_CAR], WEAPONTYPE_INVALID, GENERALWEAPON_TYPE_ANYWEAPON) OR (IS_PED_BEING_JACKED(sRCLauncherDataLocal.pedID[MANUEL]) AND IS_PED_JACKING(PLAYER_PED_ID())) TASK_SMART_FLEE_PED(sRCLauncherDataLocal.pedID[MANUEL], PLAYER_PED_ID(), 500, -1) PedDamageFailControl(sRCLauncherDataLocal.pedID[MANUEL]) ELSE IF bKnickedManuelsCar = FALSE IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), sRCLauncherDataLocal.vehID[MANUEL_CAR], TRUE) BOOL bConversation = FALSE IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() bConversation = TRUE // If he's already talking, don't bother with his car steal line ELIF IS_THIS_PRINT_BEING_DISPLAYED("MIN3_06") bConversation = CREATE_CONVERSATION(pedConvStruct, "MIN3AUD", "MIN3_STEAL", CONV_PRIORITY_HIGH, DO_NOT_DISPLAY_SUBTITLES) ELSE bConversation = CREATE_CONVERSATION(pedConvStruct, "MIN3AUD", "MIN3_STEAL", CONV_PRIORITY_HIGH) ENDIF IF bConversation SEQUENCE_INDEX siWatchPlayer OPEN_SEQUENCE_TASK(siWatchPlayer) TASK_TURN_PED_TO_FACE_ENTITY(NULL, PLAYER_PED_ID(), 3000) TASK_WANDER_STANDARD(NULL) CLOSE_SEQUENCE_TASK(siWatchPlayer) TASK_PERFORM_SEQUENCE(sRCLauncherDataLocal.pedID[MANUEL], siWatchPlayer) CLEAR_SEQUENCE_TASK(siWatchPlayer) bKnickedManuelsCar = TRUE ENDIF ELIF /*(GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), sRCLauncherDataLocal.vehID[MANUEL_CAR]) < 2 AND NOT IS_PED_IN_ANY_VEHICLE(sRCLauncherDataLocal.pedID[MANUEL])) OR*/ IS_THERE_A_CAR_BLOCKING_THIS_CAR(sRCLauncherDataLocal.vehID[MANUEL_CAR]) TASK_WANDER_STANDARD(sRCLauncherDataLocal.pedID[MANUEL]) bKnickedManuelsCar = TRUE ENDIF ENDIF ENDIF ENDIF ENDIF ENDPROC /// PURPOSE: /// Triggers the driving to farm dialogue PROC TriggerDriveDialogue() IF iCurrentDriveLine < NUM_DRIVE_LINES AND GET_INTERIOR_FROM_ENTITY(PLAYER_PED_ID()) = NULL IF GET_GAME_TIMER() > iConversationTimer IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() IF PLAY_SINGLE_LINE_FROM_CONVERSATION(pedConvStruct, "MIN3AUD", "MIN3_DRIVE", sDriveLines[iCurrentDriveLine], CONV_PRIORITY_HIGH) iCurrentDriveLine++ iConversationTimer = GET_GAME_TIMER() + DRIVE_LINE_TIME ENDIF ENDIF ENDIF ENDIF ENDPROC /// PURPOSE: /// Triggers lines of Joe shouting at the Mexicans in the barn when the player gets close PROC TriggerJoeInBarnDialogue() IF iCurrentJoeBarnLine < NUM_JOE_BARN_LINES IF IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<408.370331,6485.696777,25.787706>>, <<452.994080,6449.248047,33.708237>>, 50.000000) IF IS_PED_UNINJURED(mdJoe.piDude) AND GET_GAME_TIMER() > iJoeBarnLineTimer PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(mdJoe.piDude, sJoeBarnLines[iCurrentJoeBarnLine], "JOE") iCurrentJoeBarnLine++ iJoeBarnLineTimer = GET_GAME_TIMER() + JOE_BARN_LINE_TIME ENDIF ENDIF ENDIF ENDPROC /// PURPOSE: /// Checks if the player is close to either Joe or Josef /// RETURNS: /// TRUE if the player is close to one of them, FALSE otherwise FUNC BOOL CloseToBadGuy() FLOAT tempDist = 0.0 FLOAT dist = 9999.9 IF IS_PED_UNINJURED(mdJoe.piDude) dist = GET_DISTANCE_BETWEEN_PEDS(PLAYER_PED_ID(), mdJoe.piDude) ENDIF IF IS_PED_UNINJURED(mdJosef.piDude) tempDist = GET_DISTANCE_BETWEEN_PEDS(PLAYER_PED_ID(), mdJosef.piDude) ENDIF IF tempDist < dist dist = tempDist ENDIF IF dist < CHASE_LINE_DIST RETURN TRUE ELSE RETURN FALSE ENDIF ENDFUNC /// PURPOSE: /// Works out who is closest and has available conversations, Joe, Josef or neither /// RETURNS: /// An enum value referring to Joe, Josef or neither FUNC NEAREST_ENEMY NearestBadGuy() FLOAT tempDist = 0.0 FLOAT dist = 10.0 NEAREST_ENEMY tempGuy = NE_NEITHER IF IS_PED_UNINJURED(mdJoe.piDude) AND iCurrentJoeConv < NUM_JOE_CONVS tempDist = GET_DISTANCE_BETWEEN_PEDS(PLAYER_PED_ID(), mdJoe.piDude) IF tempDist < dist dist = tempDist tempGuy = NE_JOE ENDIF ENDIF IF IS_PED_UNINJURED(mdJosef.piDude) AND iCurrentJosefConv < NUM_JOSEF_CONVS tempDist = GET_DISTANCE_BETWEEN_PEDS(PLAYER_PED_ID(), mdJosef.piDude) IF tempDist < dist tempGuy = NE_JOSEF ENDIF ENDIF RETURN tempGuy ENDFUNC /// PURPOSE: /// Triggers the chase dialogue PROC TriggerChaseDialogue() IF GET_GAME_TIMER() > iConversationTimer AND CloseToBadGuy() AND GET_INTERIOR_FROM_ENTITY(PLAYER_PED_ID()) = NULL IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() AND (NOT IS_MESSAGE_BEING_DISPLAYED() OR GET_PROFILE_SETTING(PROFILE_DISPLAY_SUBTITLES) = 0) NEAREST_ENEMY badGuy = NearestBadGuy() SWITCH badGuy CASE NE_JOE IF iCurrentJoeConv < NUM_JOE_CONVS IF CREATE_CONVERSATION(pedConvStruct, "MIN3AUD", sJoeConvs[iCurrentJoeConv], CONV_PRIORITY_HIGH) iCurrentJoeConv++ iConversationTimer = GET_GAME_TIMER() + CHASE_LINE_TIME ENDIF ENDIF BREAK /*CASE NE_JOSEF IF iCurrentJosefConv < NUM_JOSEF_CONVS IF CREATE_CONVERSATION(pedConvStruct, "MIN3AUD", sJosefConvs[iCurrentJosefConv], CONV_PRIORITY_HIGH) iCurrentJosefConv++ iConversationTimer = GET_GAME_TIMER() + CHASE_LINE_TIME ENDIF ENDIF BREAK*/ CASE NE_NEITHER IF iCurrentChaseLine < NUM_CHASE_LINES IF PLAY_SINGLE_LINE_FROM_CONVERSATION(pedConvStruct, "MIN3AUD", "MIN3_CHASE", sChaseLines[iCurrentChaseLine], CONV_PRIORITY_HIGH) iCurrentChaseLine++ iConversationTimer = GET_GAME_TIMER() + CHASE_LINE_TIME ENDIF ENDIF BREAK ENDSWITCH ENDIF ENDIF ENDPROC /// PURPOSE: /// Passes the mission if Joe has been killed /// RETURNS: /// TRUE if Joe is dead FUNC BOOL IsJoeDead() // if Joe is dead, yay, we pass IF DOES_ENTITY_EXIST(mdJoe.piDude) IF IS_PED_INJURED(mdJoe.piDude) MissionSubState = SS_SETUP missionStage = MS_PASS_DELAY IF IS_POINT_IN_POLY_2D(tpFarmArea, GET_ENTITY_COORDS(mdJoe.piDude, FALSE)) CPRINTLN(DEBUG_MISSION, "Should be setting no migration stat") bKilledOnFarm = TRUE ENDIF RETURN TRUE ENDIF ENDIF RETURN FALSE ENDFUNC /// PURPOSE: /// Removes Joe's blip if he's killed before the car chase PROC ClearJoesBlip() IF DOES_ENTITY_EXIST(mdJoe.piDude) IF IS_PED_INJURED(mdJoe.piDude) SAFE_REMOVE_BLIP(mdJoe.biBlip) IF IS_POINT_IN_POLY_2D(tpFarmArea, GET_ENTITY_COORDS(mdJoe.piDude, FALSE)) CPRINTLN(DEBUG_MISSION, "Should be setting no migration stat") bKilledOnFarm = TRUE ENDIF ENDIF ENDIF ENDPROC /// PURPOSE: /// Checks if the player has parked a vehicle outside the barn doors /// RETURNS: /// TRUE if the player is blocking the barn doors FUNC BOOL PlayerBlockingBarn() VEHICLE_INDEX viPlayer = GET_PLAYERS_LAST_VEHICLE() IF IS_VEHICLE_OK(viPlayer) //IF IS_ENTITY_IN_ANGLED_AREA( viPlayer, vBarnBlockingPos1, vBarnBlockingPos2, fBarnBlockingWidth) IF IS_ENTITY_IN_RANGE_COORDS_2D(viPlayer, <<422.568817,6474.530762,27.811201>>, 7.0) RETURN TRUE ENDIF ENDIF RETURN FALSE ENDFUNC /// PURPOSE: /// Checks for the player using a stun gun on Joe and Josef. Used for mission stat tracking PROC CheckForStunGunUse() IF NOT bJosefStunned IF IS_PED_UNINJURED(mdJosef.piDude) IF HAS_PED_BEEN_DAMAGED_BY_WEAPON(mdJosef.piDude, WEAPONTYPE_STUNGUN) bJosefStunned = TRUE ENDIF ENDIF ENDIF IF IS_PED_UNINJURED(mdJoe.piDude) IF HAS_PED_BEEN_DAMAGED_BY_WEAPON(mdJoe.piDude, WEAPONTYPE_STUNGUN) IF NOT bJoeStunned bJoeStunned = TRUE ENDIF CLEAR_ENTITY_LAST_WEAPON_DAMAGE(mdJoe.piDude) ENDIF ENDIF ENDPROC /// PURPOSE: /// Makes the Mexicans flee at slightly different times PROC MexicansFlee() INT i = 0 INT timeDifference = GET_GAME_TIMER() - iMexicansFleeTimer INT timeToGo = GET_RANDOM_INT_IN_RANGE(100, 300) SEQUENCE_INDEX siFlee REPEAT NUM_MEXICANS i IF IS_PED_UNINJURED(piMexican[i]) IF NOT IS_PED_FLEEING(piMexican[i]) AND NOT IsPedPerformingTask(piMexican[i], SCRIPT_TASK_PERFORM_SEQUENCE) AND timeDifference > (i * timeToGo) //IF bFleeTalkReady[i] AND timeDifference > (i * timeToGo) OPEN_SEQUENCE_TASK(siFlee) TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, vLeaveDest[i], PEDMOVEBLENDRATIO_SPRINT) TASK_SMART_FLEE_PED(NULL, PLAYER_PED_ID(), 500, -1) CLOSE_SEQUENCE_TASK(siFlee) IF IS_PED_USING_ANY_SCENARIO(piMexican[i]) SET_PED_PANIC_EXIT_SCENARIO(piMexican[i], GET_ENTITY_COORDS(piMexican[i])) ENDIF TASK_PERFORM_SEQUENCE(piMexican[i], siFlee) CLEAR_SEQUENCE_TASK(siFlee) ENDIF IF bFleeTalkReady[i] AND timeDifference > (i * 1500) //PLAY_PED_AMBIENT_SPEECH_WITH_VOICE(piMexican[i], sMexicanLine[i], sMexicanName[i]) MAKE_PED_SCREAM(piMexican[i]) /*IF i = 0 SET_PED_WALLA_DENSITY(1.0, 1.0) FORCE_PED_PANIC_WALLA() ENDIF*/ bFleeTalkReady[i] = FALSE ENDIF // TEMP - turn off ambient dialogue if the player is a fair distance from the Mexicans, should be dealt with properly eventually /*IF IS_AMBIENT_SPEECH_PLAYING(piMexican[i]) AND GET_DISTANCE_BETWEEN_PEDS(PLAYER_PED_ID(), piMexican[i]) > 50.0 STOP_CURRENT_PLAYING_AMBIENT_SPEECH(piMexican[i]) ENDIF*/ ENDIF ENDREPEAT ENDPROC /// PURPOSE: /// Makes the second group of Mexicans flee at slightly different times PROC MexicansFleeTwo() INT i = 0 INT timeDifference = GET_GAME_TIMER() - iMexicansFleeTimer //SEQUENCE_INDEX siFlee REPEAT NUM_MEXICANS_2 i IF NOT PlayerBlockingBarn() IF IS_PED_UNINJURED(piMexican2[i]) IF NOT IS_PED_FLEEING(piMexican2[i]) /*AND NOT IsPedPerformingTask(piMexican2[i], SCRIPT_TASK_PERFORM_SEQUENCE)*/ AND timeDifference > ((i*1000)+5000) /*OPEN_SEQUENCE_TASK(siFlee) TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, vLeaveDest2[i], PEDMOVEBLENDRATIO_SPRINT) TASK_SMART_FLEE_PED(NULL, PLAYER_PED_ID(), 500, -1) CLOSE_SEQUENCE_TASK(siFlee)*/ IF IS_PED_USING_ANY_SCENARIO(piMexican2[i]) SET_PED_PANIC_EXIT_SCENARIO(piMexican2[i], GET_ENTITY_COORDS(piMexican2[i])) ENDIF /*TASK_PERFORM_SEQUENCE(piMexican2[i], siFlee) CLEAR_SEQUENCE_TASK(siFlee)*/ IF NOT PlayerBlockingBarn() TASK_SMART_FLEE_PED(piMexican2[i], PLAYER_PED_ID(), 500, -1) ENDIF ENDIF ENDIF ENDIF ENDREPEAT ENDPROC /// PURPOSE: /// Check to see if Joe has escaped /// RETURNS: /// TRUE if Joe has escaped FUNC BOOL BadGuysEscaped() FLOAT chaseDist = 0.0 // First, checks for if Joe's alive IF IS_PED_UNINJURED(mdJoe.piDude) // Get the distance between Joe and the player if he's not visible IF NOT IS_ENTITY_ON_SCREEN(mdJoe.piDude) OR NOT HAS_ENTITY_CLEAR_LOS_TO_ENTITY(PLAYER_PED_ID(), mdJoe.piDude) chaseDist = GET_DISTANCE_BETWEEN_PEDS(PLAYER_PED_ID(), mdJoe.piDude) MissionFailReason = MFR_JOE_ESCAPED ENDIF ENDIF // if Joe is too far away and not visisble, fail the mission IF (chaseDist > iEscapeDist) CLEAR_ALL_BLIPS() KILL_ANY_CONVERSATION() MissionSubState = SS_SETUP missionStage = MS_FAIL_DELAY RETURN TRUE ENDIF RETURN FALSE ENDFUNC /// PURPOSE: /// Counts how many tyres on the enemy vehicle have been burst /// RETURNS: /// Returns TRUE if three or more tyres have been burst and enough time for Joe and Josef to notice has passed FUNC BOOL EnemyTyresBurst() IF bTyresBurst IF GET_GAME_TIMER() > iTyresBurstTimer RETURN TRUE ENDIF ELIF IS_VEHICLE_OK(viVan) AND NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(viVan) INT numTyres = 0 IF IS_VEHICLE_TYRE_BURST(viVan, SC_WHEEL_CAR_FRONT_LEFT) numTyres++ ENDIF IF IS_VEHICLE_TYRE_BURST(viVan, SC_WHEEL_CAR_FRONT_RIGHT) numTyres++ ENDIF IF IS_VEHICLE_TYRE_BURST(viVan, SC_WHEEL_CAR_REAR_LEFT) numTyres++ ENDIF IF IS_VEHICLE_TYRE_BURST(viVan, SC_WHEEL_CAR_REAR_RIGHT) numTyres++ ENDIF IF numTyres > 0 bTyresBurst = TRUE iTyresBurstTimer = GET_GAME_TIMER() + iTyresTime ENDIF ENDIF RETURN FALSE ENDFUNC /// PURPOSE: /// Checks if Joe's tractor has been blocked by the player's car while he's in the barn /// RETURNS: /// TRUE if he's blocked in the barn, FALSE otherwise FUNC BOOL JoeBlockedByPlayer() IF IS_VEHICLE_OK(viVan) VECTOR vAheadOfTractor = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(viVan, <<0,6,0>>)//<<0, 3, 0>>) IF IS_ANY_VEHICLE_NEAR_POINT(vAheadOfTractor, 5.0/*2.9*/) AND IS_ENTITY_IN_ANGLED_AREA(viVan, vBarnAreaPos1, vBarnAreaPos2, fBarnAreaWidth) RETURN TRUE ENDIF ENDIF RETURN FALSE ENDFUNC /// PURPOSE: /// Checks if the tractor is stuck /// RETURNS: /// TRUE if the tractor is stuck, FALSE otherwise FUNC BOOL TractorIsStuck() IF IS_VEHICLE_OK(viTractor) IF IS_VEHICLE_STUCK_TIMER_UP(viTractor, VEH_STUCK_HUNG_UP, 1000) OR IS_VEHICLE_STUCK_TIMER_UP(viTractor, VEH_STUCK_JAMMED, 1000) OR IS_VEHICLE_STUCK_TIMER_UP(viTractor, VEH_STUCK_ON_ROOF, 1000) OR IS_VEHICLE_STUCK_TIMER_UP(viTractor, VEH_STUCK_ON_SIDE, 1000) RETURN TRUE ENDIF ENDIF RETURN FALSE ENDFUNC /// PURPOSE: /// Checks the enemy car and makes Joe bail out and flee if it's too damaged. PROC IsCarOk() IF DOES_ENTITY_EXIST(viVan) IF NOT IS_VEHICLE_OK(viVan) OR IS_ENTITY_ON_FIRE(viVan) OR (GET_ENTITY_HEALTH(viVan) < 700) OR (GET_VEHICLE_ENGINE_HEALTH(viVan) < 50) OR (GET_VEHICLE_PETROL_TANK_HEALTH(viVan) < 50) OR EnemyTyresBurst() OR TractorIsStuck() OR HAS_PLAYER_RAMMED_ENEMY_ENOUGH(viVan, bJoeRammedLastFrame, iRamTimer, iJoeRammedCount, fPlayerVsJoeClosingSpeedLastFrame, 11, 5.0) //OR JoeBlockedByPlayer() OR IS_ENTITY_IN_WATER(viVan) // Bail out if the car is too damaged IF IS_PED_UNINJURED(mdJoe.piDude) IF DOES_BLIP_EXIST(mdJoe.biBlip) SET_BLIP_SCALE(mdJoe.biBlip, BLIP_SIZE_PED) ELSE mdJoe.biBlip = CREATE_PED_BLIP(mdJoe.piDude) ENDIF /*SEQUENCE_INDEX siFlee OPEN_SEQUENCE_TASK(siFlee) TASK_LEAVE_ANY_VEHICLE(NULL, 0, ECF_DONT_WAIT_FOR_VEHICLE_TO_STOP | ECF_JUMP_OUT| ECF_DONT_CLOSE_DOOR) TASK_SMART_FLEE_PED(NULL, PLAYER_PED_ID(), 500, -1) CLOSE_SEQUENCE_TASK(siFlee) TASK_PERFORM_SEQUENCE(mdJoe.piDude, siFlee) CLEAR_SEQUENCE_TASK(siFlee) REMOVE_ALL_PED_WEAPONS(mdJoe.piDude)*/ SET_PED_FLEE_ATTRIBUTES(mdJoe.piDude, FA_FORCE_EXIT_VEHICLE, TRUE) SET_PED_FLEE_ATTRIBUTES(mdJoe.piDude, FA_USE_VEHICLE, FALSE) TASK_SMART_FLEE_PED(mdJoe.piDude, PLAYER_PED_ID(), 500, -1) ENDIF iMexicansFleeTimer = GET_GAME_TIMER() CPRINTLN(DEBUG_MISSION, "Start FLEE_ON_FOOT") missionStage = MS_FLEE_ON_FOOT EXIT ENDIF ENDIF IF IS_PED_UNINJURED(mdJoe.piDude) IF IS_PED_BEING_JACKED(mdJoe.piDude) OR NOT IS_PED_IN_ANY_VEHICLE(mdJoe.piDude) IF DOES_BLIP_EXIST(mdJoe.biBlip) SET_BLIP_SCALE(mdJoe.biBlip, BLIP_SIZE_PED) ELSE mdJoe.biBlip = CREATE_PED_BLIP(mdJoe.piDude) ENDIF TASK_SMART_FLEE_PED(mdJoe.piDude, PLAYER_PED_ID(), 500, -1) IF IS_VEHICLE_OK(viVan) AND IS_PLAYBACK_GOING_ON_FOR_VEHICLE(viVan) STOP_PLAYBACK_RECORDED_VEHICLE(viVan) ENDIF bJackedJoeAndJosef = TRUE CPRINTLN(DEBUG_MISSION, "Start FLEE_ON_FOOT") missionStage = MS_FLEE_ON_FOOT ENDIF ENDIF ENDPROC /// PURPOSE: /// Make the van drive with AI after the vehicle recording has finished. Stop the vehicle recording if Joe has bailed out or is dead PROC VanController() IF IS_VEHICLE_OK(viVan) AND IS_PED_UNINJURED(mdJoe.piDude) IF IsPedPerformingTask(mdJoe.piDude, SCRIPT_TASK_VEHICLE_FOLLOW_WAYPOINT_RECORDING) AND GET_IS_WAYPOINT_RECORDING_LOADED(sJoesWaypointRec) INT iCurrentWaypoint IF WAYPOINT_RECORDING_GET_CLOSEST_WAYPOINT(sJoesWaypointRec, GET_ENTITY_COORDS(viVan), iCurrentWaypoint) IF iCurrentWaypoint > iNumPointsInJoesRec AND bStartAiDriving AND NOT bJackedJoeAndJosef // Joe is reaching the end of his waypoint recording, switch him to flee behaviour IF NOT (GET_SCRIPT_TASK_STATUS(mdJoe.piDude, SCRIPT_TASK_VEHICLE_MISSION) = PERFORMING_TASK) AND NOT (GET_SCRIPT_TASK_STATUS(mdJoe.piDude, SCRIPT_TASK_LEAVE_ANY_VEHICLE) = PERFORMING_TASK) AND NOT IS_PED_FLEEING(mdJoe.piDude) AND NOT (GET_SCRIPT_TASK_STATUS(mdJoe.piDude, SCRIPT_TASK_PERFORM_SEQUENCE) = PERFORMING_TASK) SET_DRIVE_TASK_MAX_CRUISE_SPEED(mdJoe.piDude, 15) TASK_VEHICLE_MISSION_PED_TARGET(mdJoe.piDude, viVan, PLAYER_PED_ID(), MISSION_FLEE, 15.0, DRIVINGMODE_AVOIDCARS_RECKLESS, 100.0,1.0) bStartAiDriving = FALSE ENDIF ELSE // Joe is still on the waypoint recording so control his speed if necessary ENDIF ENDIF ENDIF ENDIF ENDPROC /// PURPOSE: /// Checks if it's appropriate to activate Joe /// PARAMS: /// fAreaWidth - the width of the area outside the barn to check /// bUseTimer - should we activate Joe if 30 seconds have passed? /// RETURNS: /// True if the player is in front of the barn or if 30 seconds have passed (if bUseTimer is true) FUNC BOOL CheckActivateJoe(FLOAT fAreaWidth, BOOL bUseTimer) IF IS_ENTITY_IN_RANGE_COORDS(PLAYER_PED_ID(), vAltJoePos, fAreaWidth) OR (bUseTimer AND GET_GAME_TIMER() > iJoeFleesTimer) MissionSubState = SS_SETUP missionStage = MS_CAR_CHASE RETURN TRUE ENDIF RETURN FALSE ENDFUNC /// PURPOSE: /// Checks if it's appropriate to activate Joe using different values if the player is in a vehicle or not /// PARAMS: /// bUseTimer - should we activate Joe if 30 seconds have passed? /// RETURNS: /// True if Joe should be activated FUNC BOOL ActivateJoe(BOOL bUseTimer = TRUE) IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) RETURN CheckActivateJoe(fJoeDrivesLarge, bUseTimer) ELSE RETURN CheckActivateJoe(fJoeDrives, bUseTimer) ENDIF ENDFUNC /// PURPOSE: /// Blips Josef and sets the mission to the Josef Attacks stage /// PARAMS: /// iDelayTimerValue - How long Josef should pause for before he attacks the player PROC BlipJosef(INT iDelayTimerValue = 0) iJosefAttacksTimer = GET_GAME_TIMER() + iDelayTimerValue TRIGGER_MUSIC_EVENT("MM3_START_FORA") bAudioReady = TRUE iAudioEventTimer = GET_GAME_TIMER() + AUDIO_EVENT_WAIT_TIME MissionSubState = SS_SETUP missionStage = MS_JOSEF_ATTACKS ENDPROC // =========================================================================================================== // MISSION STAGES // =========================================================================================================== /// PURPOSE: /// If this is a replay, skip to the appropriate stage, otherwise play the intro PROC INIT() sDriveLines[0] = "MIN3_DRIVE_1" sDriveLines[1] = "MIN3_DRIVE_2" sDriveLines[2] = "MIN3_DRIVE_3" sDriveLines[3] = "MIN3_DRIVE_4" sJoeBarnLines[0] = "MIN3_ASAA" sJoeBarnLines[1] = "MIN3_ASAB" sJoeBarnLines[2] = "MIN3_ASAC" sJoeBarnLines[3] = "MIN3_ASAD" sJoeBarnLines[4] = "MIN3_ASAE" sJoeBarnLines[5] = "MIN3_ASAF" sChaseLines[0] = "MIN3_CHASE_1" sChaseLines[1] = "MIN3_CHASE_2" sChaseLines[2] = "MIN3_CHASE_3" sChaseLines[3] = "MIN3_CHASE_4" sChaseLines[4] = "MIN3_CHASE_5" sJoeConvs[0] = "MIN3_JOE1" sJoeConvs[1] = "MIN3_JOE2" sJoeConvs[2] = "MIN3_JOE3" /*sJosefConvs[0] = "MIN3_JOSEF1" sJosefConvs[1] = "MIN3_JOSEF2" sJosefConvs[2] = "MIN3_JOSEF3"*/ /*sMexicanLine[0] = "MIN3_AOAA" sMexicanLine[1] = "MIN3_AOAB" sMexicanLine[2] = "MIN3_AOAC" sMexicanLine[3] = "MIN3_AOAD" sMexicanLine[4] = "MIN3_AOAE" sMexicanName[0] = "Min3Mexican0" sMexicanName[1] = "Min3Mexican1" sMexicanName[2] = "Min3Mexican2" sMexicanName[3] = "Min3Mexican3" sMexicanName[4] = "Min3Mexican4"*/ bFleeTalkReady[0] = TRUE bFleeTalkReady[1] = TRUE//FALSE bFleeTalkReady[2] = TRUE bFleeTalkReady[3] = TRUE//FALSE bFleeTalkReady[4] = TRUE REQUEST_ANIM_DICT(ANIM_DICT_GLANCES) REQUEST_ANIM_DICT(ANIM_DICT_PANIC) REQUEST_ADDITIONAL_TEXT("MIN3", MISSION_TEXT_SLOT) SET_CREATE_RANDOM_COPS(FALSE) IF IS_PED_UNINJURED(PLAYER_PED_ID()) FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE) ENDIF IF HAS_ADDITIONAL_TEXT_LOADED(MISSION_TEXT_SLOT) OPEN_TEST_POLY(tpFarmArea) ADD_TEST_POLY_VERT(tpFarmArea, <<468.640381,6547.755859,26.092230>>)//<<444.766785,6551.482910,26.293985>>) ADD_TEST_POLY_VERT(tpFarmArea, <<477.909210,6447.278320,29.429457>>)//<<445.532562,6446.873535,28.948292>>) ADD_TEST_POLY_VERT(tpFarmArea, <<240.051117,6414.416016,30.429955>>) ADD_TEST_POLY_VERT(tpFarmArea, <<148.916870,6500.048828,30.583202>>) ADD_TEST_POLY_VERT(tpFarmArea, <<229.888519,6546.030273,30.679270>>) CLOSE_TEST_POLY(tpFarmArea) IF Is_Replay_In_Progress() IF NOT IS_AUDIO_SCENE_ACTIVE("MINUTE_03_SCENE") START_AUDIO_SCENE("MINUTE_03_SCENE") ENDIF IF IS_PED_UNINJURED(sRCLauncherDataLocal.pedID[MANUEL]) TASK_CLEAR_LOOK_AT(sRCLauncherDataLocal.pedID[MANUEL]) ENDIF INT iReplayStage = GET_REPLAY_MID_MISSION_STAGE() IF g_bShitskipAccepted = TRUE iReplayStage++ // player is skipping this stage ENDIF SAFE_DELETE_OBJECT(sRCLauncherDataLocal.ObjID[1]) SWITCH iReplayStage CASE CP_AFTER_MOCAP START_REPLAY_SETUP(<< -303.3698, 6212.3550, 30.4696 >>, 229.2303) AfterMocapCheckpoint() BREAK CASE CP_KILL_JOSEF ADD_PED_FOR_DIALOGUE(pedConvStruct, TREVOR_ID, PLAYER_PED_ID(), "TREVOR", TRUE) START_REPLAY_SETUP(<< 389.4927, 6554.7339, 26.6191 >>, 270.5771) DebugSkipKillJosef() BREAK CASE CP_KILL_JOE ADD_PED_FOR_DIALOGUE(pedConvStruct, TREVOR_ID, PLAYER_PED_ID(), "TREVOR", TRUE) START_REPLAY_SETUP(<< 423.6803, 6519.7100, 26.6747 >>, 170.9605) DebugSkipChaseJoe() BREAK CASE CP_MISSION_PASSED /*WAIT_FOR_WORLD_TO_LOAD(GET_ENTITY_COORDS(PLAYER_PED_ID())) SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0) SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)*/ START_REPLAY_SETUP(<<428.21, 6509.16, 27.92>>, 161.97) VEHICLE_INDEX viTemp CREATE_VEHICLE_FOR_REPLAY(viTemp, << 424.07, 6509.42, 27.33 >>, 181.39, FALSE, FALSE, TRUE, TRUE, TRUE, SABREGT) END_REPLAY_SETUP() SAFE_FADE_SCREEN_IN_FROM_BLACK() RC_END_Z_SKIP() Script_Passed() BREAK DEFAULT SCRIPT_ASSERT("Replay in progress: Unknown checkpoint selected") BREAK ENDSWITCH ELSE MissionSubState = SS_SETUP missionStage = MS_PRE_INTRO ENDIF ENDIF ENDPROC PROC StopPlayerWhenTooClose() /*IF GET_DISTANCE_BETWEEN_PEDS(PLAYER_PED_ID(), sRCLauncherDataLocal.pedID[0]) < 3 DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MOVE_LR) DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MOVE_UD) ENDIF*/ IF IS_ENTITY_IN_RANGE_COORDS(PLAYER_PED_ID(), <<-303.675201,6212.526855,30.455961>>, 2.0) DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MOVE_LR) DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MOVE_UD) SET_PED_MAX_MOVE_BLEND_RATIO(PLAYER_PED_ID(), PEDMOVEBLENDRATIO_STILL) IF NOT IsPedPerformingTask(PLAYER_PED_ID(), SCRIPT_TASK_TURN_PED_TO_FACE_ENTITY) AND IS_PED_UNINJURED(sRCLauncherDataLocal.pedID[0]) TASK_TURN_PED_TO_FACE_ENTITY(PLAYER_PED_ID(), sRCLauncherDataLocal.pedID[0], -1) ENDIF ENDIF ENDPROC PROC PRE_INTRO() RC_PLAYER_TRIGGER_SCENE_LOCK_IN() //SET_ALL_RANDOM_PEDS_FLEE_THIS_FRAME(PLAYER_ID()) SWITCH MissionSubState CASE SS_SETUP CPRINTLN(DEBUG_MISSION, "Start PRE_INTRO") ADD_PED_FOR_DIALOGUE(pedConvStruct, TREVOR_ID, PLAYER_PED_ID(), "TREVOR") ADD_PED_FOR_DIALOGUE(pedConvStruct, MANUEL_ID, sRCLauncherDataLocal.pedID[0], "MANUEL") StopPlayerWhenTooClose() iConvFailedTimer = -1 // Setup pushin camera IF IS_SCREEN_FADED_IN() // Don't do gameplay hint if skipping to intro AND IS_ENTITY_ALIVE(sRCLauncherDataLocal.pedID[0]) //AND GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), sRCLauncherDataLocal.pedID[0]) > 6 SET_GAMEPLAY_ENTITY_HINT(sRCLauncherDataLocal.pedID[0], (<<0, 0, 0>>), TRUE, -1, 3000) SET_GAMEPLAY_HINT_FOLLOW_DISTANCE_SCALAR(0.45) SET_GAMEPLAY_HINT_CAMERA_RELATIVE_SIDE_OFFSET(-0.01) SET_GAMEPLAY_HINT_FOV(25.00) SET_GAMEPLAY_HINT_CAMERA_BLEND_TO_FOLLOW_PED_MEDIUM_VIEW_MODE(TRUE) //MissionSubState = SS_UPDATE ELSE //MissionSubState = SS_CLEANUP #IF IS_DEBUG_BUILD CPRINTLN(DEBUG_MISSION, "MIN3: Not doing leadin focus camera") #ENDIF ENDIF // Disable the nearby tattoo shop so the tutorial doesn't interfere SET_SHOP_IS_TEMPORARILY_UNAVAILABLE(TATTOO_PARLOUR_03_PB, TRUE) MissionSubState = SS_UPDATE /*IF GET_DISTANCE_BETWEEN_PEDS(PLAYER_PED_ID(), sRCLauncherDataLocal.pedID[0]) < 1.5 MissionSubState = SS_CLEANUP ELSE MissionSubState = SS_UPDATE ENDIF*/ BREAK CASE SS_UPDATE IF CREATE_CONVERSATION(pedConvStruct ,"MIN3AUD", "MIN3_INT_LI", CONV_PRIORITY_MEDIUM, DISPLAY_SUBTITLES) OR CONVERSATION_TIMED_OUT(iConvFailedTimer) MissionSubState = SS_UPDATE_TWO ENDIF StopPlayerWhenTooClose() BREAK CASE SS_UPDATE_TWO IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() MissionSubState = SS_CLEANUP ENDIF StopPlayerWhenTooClose() BREAK CASE SS_CLEANUP IF IS_REPEAT_PLAY_ACTIVE() REQUEST_CUTSCENE("mmb_3_rcm") WHILE NOT HAS_CUTSCENE_LOADED_WITH_FAILSAFE() WAIT(0) ENDWHILE ENDIF IF IS_PED_UNINJURED(PLAYER_PED_ID()) CLEAR_PED_TASKS(PLAYER_PED_ID()) ENDIF // Enable the tattoo shop again SET_SHOP_IS_TEMPORARILY_UNAVAILABLE(TATTOO_PARLOUR_03_PB, FALSE) PlayIntro() BREAK ENDSWITCH ENDPROC /// PURPOSE: /// Wait for the intro to finish then set up the post-intro stuff PROC INTRO_PLAYING() #IF IS_DEBUG_BUILD IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_J) IF IS_CUTSCENE_ACTIVE() STOP_CUTSCENE() ENDIF ENDIF #ENDIF // Debug prints to check the states of Trevor and his pistol /*IF DOES_ENTITY_EXIST(oiPistol) IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Trevors_weapon") CPRINTLN(DEBUG_MISSION, "Pistol exists and is ready to leave the cutscene") ELSE CPRINTLN(DEBUG_MISSION, "Pistol exists and is not ready to leave the cutscene") ENDIF ELSE CPRINTLN(DEBUG_MISSION, "Pistol does not exist") ENDIF IF IS_PED_UNINJURED(PLAYER_PED_ID()) IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Trevor") CPRINTLN(DEBUG_MISSION, "Player exists and is ready to leave the cutscene") ELSE CPRINTLN(DEBUG_MISSION, "Player exists and is not ready to leave the cutscene") ENDIF ELSE CPRINTLN(DEBUG_MISSION, "Player does not exist") ENDIF*/ IF IS_PED_UNINJURED(PLAYER_PED_ID()) AND DOES_ENTITY_EXIST(oiPistol) IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Trevor") AND CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Trevors_weapon") IF HAS_PED_GOT_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_PISTOL) SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_PISTOL, TRUE) ELIF HAS_PED_GOT_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_APPISTOL) SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_APPISTOL, TRUE) ELIF HAS_PED_GOT_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_COMBATPISTOL) SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_COMBATPISTOL, TRUE) /*ELSE GIVE_WEAPON_TO_PED(PLAYER_PED_ID(), WEAPONTYPE_PISTOL, 12, TRUE)*/ ENDIF DELETE_OBJECT(oiPistol) ENDIF ENDIF IF IS_PED_UNINJURED(sRCLauncherDataLocal.pedID[MANUEL]) IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Manuel") /*SET_ENTITY_COLLISION(sRCLauncherDataLocal.pedID[MANUEL], TRUE) FREEZE_ENTITY_POSITION(sRCLauncherDataLocal.pedID[MANUEL], FALSE)*/ //IF WAS_CUTSCENE_SKIPPED() SET_ENTITY_COORDS_GROUNDED(sRCLauncherDataLocal.pedID[MANUEL], vManuelAfterCutscene) SET_ENTITY_HEADING(sRCLauncherDataLocal.pedID[MANUEL], fManuelAfterCutscne) //ENDIF SEQUENCE_INDEX siManuel OPEN_SEQUENCE_TASK(siManuel) //TASK_TURN_PED_TO_FACE_ENTITY(NULL, PLAYER_PED_ID(), 4000) IF IS_VEHICLE_OK(sRCLauncherDataLocal.vehID[MANUEL_CAR]) AND IS_VEHICLE_SEAT_FREE(sRCLauncherDataLocal.vehID[MANUEL_CAR]) AND IS_ENTITY_IN_RANGE_ENTITY(sRCLauncherDataLocal.vehID[MANUEL_CAR], (sRCLauncherDataLocal.pedID[MANUEL]), 25.0) TASK_ENTER_VEHICLE(NULL, sRCLauncherDataLocal.vehID[MANUEL_CAR], DEFAULT_TIME_BEFORE_WARP, VS_DRIVER, PEDMOVE_WALK) TASK_VEHICLE_DRIVE_WANDER(NULL, sRCLauncherDataLocal.vehID[MANUEL_CAR], 20, DRIVINGMODE_AVOIDCARS) ELSE TASK_WANDER_STANDARD(NULL) ENDIF CLOSE_SEQUENCE_TASK(siManuel) TASK_PERFORM_SEQUENCE(sRCLauncherDataLocal.pedID[MANUEL], siManuel) CLEAR_SEQUENCE_TASK(siManuel) ENDIF ENDIF IF CAN_SET_EXIT_STATE_FOR_CAMERA() REPLAY_STOP_EVENT() SET_GAMEPLAY_CAM_RELATIVE_HEADING() SET_GAMEPLAY_CAM_RELATIVE_PITCH() ENDIF /*IF DOES_ENTITY_EXIST(oiPistol) IF CAN_SET_EXIT_STATE_FOR_REGISTERED_ENTITY("Trevors_weapon") DELETE_OBJECT(oiPistol) ENDIF ENDIF*/ IF IS_CUTSCENE_PLAYING() IF IS_GAMEPLAY_HINT_ACTIVE() STOP_GAMEPLAY_HINT() ENDIF ELSE // Make player face Manuel //SET_ENTITY_HEADING(PLAYER_PED_ID(), -94.08) // Reset camera behind player //SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0) //SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0) /*IF DOES_ENTITY_EXIST(sRCLauncherDataLocal.ObjID[MANUEL]) SET_ENTITY_VISIBLE(sRCLauncherDataLocal.ObjID[MANUEL], TRUE) ENDIF*/ // Position Manuel and make him tell the player where to go IF IS_PED_UNINJURED(sRCLauncherDataLocal.pedID[MANUEL]) //IF CREATE_CONVERSATION(pedConvStruct, "MIN3AUD", "MIN3_MANUEL", CONV_PRIORITY_MEDIUM) IF PLAY_SINGLE_LINE_FROM_CONVERSATION(pedConvStruct, "MIN3AUD", "MIN3_MANUEL", "MIN3_MANUEL_1", CONV_PRIORITY_MEDIUM, DO_NOT_DISPLAY_SUBTITLES) RC_END_CUTSCENE_MODE(TRUE, FALSE, TRUE) RC_SET_ENTITY_PROOFS_FOR_CUTSCENE(sRCLauncherDataLocal, FALSE, FALSE) SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(sRCLauncherDataLocal.pedID[MANUEL], TRUE) SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(sRCLauncherDataLocal.pedID[MANUEL], TRUE) SET_PED_CAN_RAGDOLL_FROM_PLAYER_IMPACT(sRCLauncherDataLocal.pedID[MANUEL], FALSE) SET_PED_CAN_BE_TARGETTED(sRCLauncherDataLocal.pedID[MANUEL], FALSE) //SET_ENTITY_COORDS_NO_OFFSET(sRCLauncherDataLocal.pedID[MANUEL], <<-299.33, 6212.24, 31.45>>) //SET_ENTITY_HEADING(sRCLauncherDataLocal.pedID[MANUEL], 95.07) /*SET_ENTITY_COLLISION(sRCLauncherDataLocal.pedID[MANUEL], TRUE) FREEZE_ENTITY_POSITION(sRCLauncherDataLocal.pedID[MANUEL], FALSE)*/ /*SEQUENCE_INDEX siManuel OPEN_SEQUENCE_TASK(siManuel) //TASK_TURN_PED_TO_FACE_ENTITY(NULL, PLAYER_PED_ID(), 4000) IF IS_VEHICLE_OK(sRCLauncherDataLocal.vehID[MANUEL_CAR]) AND IS_VEHICLE_SEAT_FREE(sRCLauncherDataLocal.vehID[MANUEL_CAR]) TASK_ENTER_VEHICLE(NULL, sRCLauncherDataLocal.vehID[MANUEL_CAR], DEFAULT_TIME_BEFORE_WARP, VS_DRIVER, PEDMOVE_WALK) TASK_VEHICLE_DRIVE_WANDER(NULL, sRCLauncherDataLocal.vehID[MANUEL_CAR], 20, DRIVINGMODE_AVOIDCARS) ELSE TASK_WANDER_STANDARD(NULL) ENDIF CLOSE_SEQUENCE_TASK(siManuel) TASK_PERFORM_SEQUENCE(sRCLauncherDataLocal.pedID[MANUEL], siManuel) CLEAR_SEQUENCE_TASK(siManuel)*/ ClearTheFarm() /*IF HAS_PED_GOT_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_PISTOL) SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_PISTOL, TRUE) ELIF HAS_PED_GOT_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_APPISTOL) SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_APPISTOL, TRUE) ELIF HAS_PED_GOT_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_COMBATPISTOL) SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_COMBATPISTOL, TRUE) ELSE GIVE_WEAPON_TO_PED(PLAYER_PED_ID(), WEAPONTYPE_PISTOL, 12, TRUE) ENDIF*/ IF IS_ENTITY_ALIVE(sRCLauncherDataLocal.objID[MANUEL]) SET_ENTITY_COLLISION(sRCLauncherDataLocal.objID[MANUEL], TRUE) FREEZE_ENTITY_POSITION(sRCLauncherDataLocal.objID[MANUEL], FALSE) ENDIF IF NOT IS_AUDIO_SCENE_ACTIVE("MINUTE_03_SCENE") START_AUDIO_SCENE("MINUTE_03_SCENE") ENDIF PRINT_NOW("MIN3_06", DEFAULT_GOD_TEXT_TIME, 1) // Kill ~r~Joe ~s~and ~r~Josef. CreateInitialBlips() //WAIT(500) // hopefully temporary. For some reason I can't work out, Manuel's dialogue won't play without this here MissionSubState = SS_SETUP missionStage = MS_DRIVE_TO_FARM ENDIF ENDIF ENDIF ENDPROC /// PURPOSE: /// The player drives to the farm PROC DRIVE_TO_FARM() ClearJoesBlip() SWITCH MissionSubState CASE SS_SETUP SET_GPS_DISABLED_ZONE(<<168.894516,6408.562988,27.136101>>, <<401.467010,6519.562500,29.836889>>) iConversationTimer = GET_GAME_TIMER() + DRIVE_LINE_TIME iManuelFollowTimer = GET_GAME_TIMER() + (MANUEL_CONV_TIME*2) iManuelBumpTimer = 0 iConvFailedTimer = -1 bKnickedManuelsCar = FALSE CPRINTLN(DEBUG_MISSION, "Start DRIVE_TO_FARM") LoadBrokenCarModels() REPLAY_RECORD_BACK_FOR_TIME(3.0, 10.0, REPLAY_IMPORTANCE_LOWEST) MissionSubState = SS_UPDATE BREAK CASE SS_UPDATE //SpawnBrokenCar() IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() OR CONVERSATION_TIMED_OUT(iConvFailedTimer, 15000) /*PRINT_NOW("MIN3_06", DEFAULT_GOD_TEXT_TIME, 1) // Kill ~r~Joe ~s~and ~r~Josef. CreateInitialBlips()*/ IF PLAY_SINGLE_LINE_FROM_CONVERSATION(pedConvStruct, "MIN3AUD", "MIN3_MANUEL", "MIN3_MANUEL_2", CONV_PRIORITY_MEDIUM) MissionSubState = SS_UPDATE_TWO ENDIF ENDIF BREAK CASE SS_UPDATE_TWO SpawnBrokenCar() IF (GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(PLAYER_PED_ID(), vAltJosefPos) > 100.0) TriggerDriveDialogue() ENDIF // load the farm peds when the player gets close IF IS_ENTITY_AT_COORD(PLAYER_PED_ID(), vAltJosefPos, vSpawnPedsSize) LoadModels() ClearTheFarm() MissionSubState = SS_UPDATE_THREE ENDIF BREAK CASE SS_UPDATE_THREE Setup_Farm() Setup_Farm_Two() TriggerJoeInBarnDialogue() IF (GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(PLAYER_PED_ID(), vAltJosefPos) > 150.0) TriggerDriveDialogue() ELSE SET_WANTED_LEVEL_MULTIPLIER(0.1) ENDIF IF IS_PED_UNINJURED(mdJosef.piDude) AND GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(PLAYER_PED_ID(), vAltJosefPos) < 45.0//60.0 IF CREATE_CONVERSATION(pedConvStruct, "MIN3AUD", "MIN3_J_FARM", CONV_PRIORITY_MEDIUM) REPLAY_RECORD_BACK_FOR_TIME(3.0, 10.0, REPLAY_IMPORTANCE_LOWEST) MissionSubState = SS_CLEANUP ENDIF ENDIF BREAK CASE SS_CLEANUP TriggerJoeInBarnDialogue() IF IS_PED_UNINJURED(mdJosef.piDude) SET_PED_RESET_FLAG(mdJosef.piDude, PRF_InstantBlendToAim, TRUE) IF GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(PLAYER_PED_ID(), vAltJosefPos) < 25.0 IF CAN_PED_SEE_PLAYER(mdJosef.piDude, 90) OR (CAN_PED_SEE_PLAYER(mdJosef.piDude, 0.0) AND NOT GET_PED_STEALTH_MOVEMENT(PLAYER_PED_ID())) KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() IF CREATE_CONVERSATION(pedConvStruct, "MIN3AUD", "MIN3_T_FARM", CONV_PRIORITY_MEDIUM) BlipJosef(JOSEF_PAUSES) ENDIF ENDIF ELIF GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(PLAYER_PED_ID(), vAltJosefPos) > 100.0 IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() ENDIF ELIF IS_PED_UNINJURED(piMexican[0]) IF iMexDialogueTimer > 0 IF GET_GAME_TIMER() > iMexDialogueTimer IF bMexDialogueTriggered IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() AND NOT IS_PED_IN_COMBAT(mdJosef.piDude) SET_ENTITY_ONLY_DAMAGED_BY_PLAYER(piMexican[0], FALSE) SET_ENTITY_HEALTH(piMexican[0], 110) SET_PED_ACCURACY(mdJosef.piDude, 100) TASK_COMBAT_PED(mdJosef.piDude, piMexican[0]) ENDIF ELSE bMexDialogueTriggered = CREATE_CONVERSATION(pedConvStruct, "MIN3AUD", "MIN3_REPLY", CONV_PRIORITY_MEDIUM) ENDIF ENDIF ELSE IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() iMexDialogueTimer = GET_GAME_TIMER() + MEX_DIALOGUE_TIME ADD_PED_FOR_DIALOGUE(pedConvStruct, MEX_ID, piMexican[0], "Min3Mexican0", TRUE) ENDIF ENDIF ENDIF IF GET_INTERIOR_FROM_ENTITY(PLAYER_PED_ID()) <> NULL MissionFailReason = MFR_EXECUTION MissionSubState = SS_SETUP missionStage = MS_FAIL_DELAY ENDIF ENDIF BREAK ENDSWITCH IF (DOES_ENTITY_EXIST(viTractor) AND (HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(viTractor, PLAYER_PED_ID()) OR NOT IS_ENTITY_ALIVE(viTractor))) OR IS_EXPLOSION_IN_SPHERE(EXP_TAG_DONTCARE, vAltJosefPos, 50) BlipJosef() ENDIF IF DOES_ENTITY_EXIST(mdJosef.piDude) IF IS_PED_INJURED(mdJosef.piDude) IF NOT ActivateJoe(FALSE) IF bAllowOneDeadMessage IF PLAY_SINGLE_LINE_FROM_CONVERSATION(pedConvStruct, "MIN3AUD", "MIN3_KILL", "MIN3_KILL_1", CONV_PRIORITY_HIGH) REPLAY_RECORD_BACK_FOR_TIME(3.0, 10.0, REPLAY_IMPORTANCE_LOWEST) bAllowOneDeadMessage = FALSE MissionSubState = SS_SETUP missionStage = MS_SEARCH_FARM ENDIF ENDIF ENDIF ELIF IS_PLAYER_SHOOTING_NEAR_PED(mdJosef.piDude) OR HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(mdJosef.piDude, PLAYER_PED_ID()) BlipJosef() ENDIF ENDIF // remove the farmer if the player is far enough away IF IS_PED_UNINJURED(sRCLauncherDataLocal.pedID[MANUEL]) // if the farmer exists and the player fires a gun, make him flee IF NOT IS_PED_FLEEING(sRCLauncherDataLocal.pedID[MANUEL]) AND NOT IS_PED_IN_ANY_VEHICLE(sRCLauncherDataLocal.pedID[MANUEL], TRUE) IF IS_PED_SHOOTING(PLAYER_PED_ID()) KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() IF CREATE_CONVERSATION(pedConvStruct, "MIN3AUD", "MIN3_THREAT", CONV_PRIORITY_MEDIUM, DO_NOT_DISPLAY_SUBTITLES) TASK_SMART_FLEE_PED(sRCLauncherDataLocal.pedID[MANUEL], PLAYER_PED_ID(), 500, -1) ENDIF ELIF bNotAimedAtManuel AND IS_PLAYER_VISIBLY_TARGETTING_PED(sRCLauncherDataLocal.pedID[MANUEL]) KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() IF CREATE_CONVERSATION(pedConvStruct, "MIN3AUD", "MIN3_AIM", CONV_PRIORITY_MEDIUM, DO_NOT_DISPLAY_SUBTITLES) IF NOT IsPedPerformingTask(sRCLauncherDataLocal.pedID[MANUEL], SCRIPT_TASK_WANDER_STANDARD) TASK_WANDER_STANDARD(sRCLauncherDataLocal.pedID[MANUEL]) ENDIF bNotAimedAtManuel = FALSE ENDIF ENDIF ENDIF IF IS_PED_IN_ANY_VEHICLE(sRCLauncherDataLocal.pedID[MANUEL]) IF IS_PED_STOPPED(sRCLauncherDataLocal.pedID[MANUEL]) IF iManuelStoppedTimer = -1 iManuelStoppedTimer = GET_GAME_TIMER() + MAX_MANUEL_STOPPED_TIME ELSE IF GET_GAME_TIMER() > iManuelStoppedTimer IF NOT IsPedPerformingTask(sRCLauncherDataLocal.pedID[MANUEL], SCRIPT_TASK_WANDER_STANDARD) TASK_WANDER_STANDARD(sRCLauncherDataLocal.pedID[MANUEL]) ENDIF ENDIF ENDIF ELSE IF iManuelStoppedTimer > -1 iManuelStoppedTimer = -1 ENDIF ENDIF ENDIF // Play dialogue if the player bumps or follows Manuel IF GET_GAME_TIMER() > iManuelBumpTimer AND IS_ENTITY_TOUCHING_ENTITY(PLAYER_PED_ID(), sRCLauncherDataLocal.pedID[MANUEL]) enumSubtitlesState eSubtitles = DISPLAY_SUBTITLES IF IS_MESSAGE_BEING_DISPLAYED() eSubtitles = DO_NOT_DISPLAY_SUBTITLES ENDIF IF CREATE_CONVERSATION(pedConvStruct, "MIN3AUD", "MIN3_BUMP", CONV_PRIORITY_MEDIUM, eSubtitles) iManuelBumpTimer = GET_GAME_TIMER() + MANUEL_CONV_TIME ENDIF ENDIF IF GET_GAME_TIMER() > iManuelFollowTimer AND IS_ENTITY_IN_RANGE_ENTITY(PLAYER_PED_ID(), sRCLauncherDataLocal.pedID[MANUEL], 15.0) IF NOT IS_PED_IN_ANY_VEHICLE(sRCLauncherDataLocal.pedID[MANUEL]) AND NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) enumSubtitlesState eSubtitles = DISPLAY_SUBTITLES IF IS_MESSAGE_BEING_DISPLAYED() eSubtitles = DO_NOT_DISPLAY_SUBTITLES ENDIF IF CREATE_CONVERSATION(pedConvStruct, "MIN3AUD", "MIN3_FOLLOW", CONV_PRIORITY_MEDIUM, eSubtitles) iManuelFollowTimer = GET_GAME_TIMER() + MANUEL_CONV_TIME ENDIF ENDIF ENDIF // keep this at the end, releases Manuel IF NOT IS_ENTITY_AT_ENTITY(PLAYER_PED_ID(), sRCLauncherDataLocal.pedID[MANUEL], <<100,100,2.5>>) REMOVE_PED_FOR_DIALOGUE(pedConvStruct, MANUEL_ID) SAFE_RELEASE_PED(sRCLauncherDataLocal.pedID[MANUEL]) ENDIF ENDIF // debug skip to next stage #IF IS_DEBUG_BUILD IF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_J)) IF MissionSubState = SS_UPDATE_THREE OR MissionSubState = SS_CLEANUP RC_START_Z_SKIP() SetPlayerPosWithVehicle(<< 424.9119, 6536.3882, 26.6722 >>, 175.3812)//, FALSE) RC_END_Z_SKIP(TRUE) ELSE DebugSkipKillJosef() ENDIF ELIF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_P)) DebugSkipRestart() ENDIF #ENDIF ENDPROC /// PURPOSE: /// Josef attacks the player PROC JOSEF_ATTACKS() ClearJoesBlip() TriggerJoeInBarnDialogue() SWITCH MissionSubState CASE SS_SETUP IF IS_PED_UNINJURED(mdJosef.piDude) SET_PED_RESET_FLAG(mdJosef.piDude, PRF_InstantBlendToAim, TRUE) ENDIF IF GET_GAME_TIMER() > iJosefAttacksTimer IF IS_PED_UNINJURED(mdJosef.piDude) TASK_COMBAT_PED(mdJosef.piDude, PLAYER_PED_ID()) ENDIF CreateProperBlips() iMexicansFleeTimer = GET_GAME_TIMER() SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CP_KILL_JOSEF, "Kill Josef") SET_WANTED_LEVEL_MULTIPLIER(0.1) CPRINTLN(DEBUG_MISSION, "Start JOSEF_ATTACKS") MissionSubState = SS_UPDATE ENDIF BREAK CASE SS_UPDATE MexicansFlee() IF NOT IS_PED_UNINJURED(mdJosef.piDude) IF IS_PED_UNINJURED(mdJoe.piDude) IF NOT ActivateJoe(FALSE) KILL_CHASE_HINT_CAM(localChaseHintCamStruct) IF bAllowOneDeadMessage IF PLAY_SINGLE_LINE_FROM_CONVERSATION(pedConvStruct, "MIN3AUD", "MIN3_KILL", "MIN3_KILL_1", CONV_PRIORITY_HIGH) REPLAY_RECORD_BACK_FOR_TIME(3.0, 10.0, REPLAY_IMPORTANCE_LOWEST) bAllowOneDeadMessage = FALSE MissionSubState = SS_SETUP missionStage = MS_SEARCH_FARM ENDIF ENDIF ENDIF ELSE MissionSubState = SS_SETUP missionStage = MS_PASS_DELAY ENDIF ENDIF IF bAudioReady IF GET_GAME_TIMER() > iAudioEventTimer TRIGGER_MUSIC_EVENT("MM3_START_STA") bAudioReady = FALSE ENDIF ENDIF IF IS_ENTITY_ALIVE(mdJosef.piDude) AND IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()) CONTROL_PED_CHASE_HINT_CAM_IN_VEHICLE(localChaseHintCamStruct, mdJosef.piDude) ENDIF BREAK ENDSWITCH // debug skip to next stage #IF IS_DEBUG_BUILD IF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_J)) DebugSkipChaseJoe() ELIF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_P)) DebugSkipKillJosef() ENDIF #ENDIF ENDPROC /// PURPOSE: /// Increases the size of Joe's collision capsule while he's in the barn to stop his gun clipping through the doors PROC BOOST_JOES_CAPSULE_SIZE() IF IS_PED_UNINJURED(mdJoe.piDude) IF IS_ENTITY_IN_ANGLED_AREA( mdJoe.piDude, vBarnForJoePos1, vBarnForJoePos2, fBarnForJoeWidth) AND NOT IS_PED_IN_ANY_VEHICLE(mdJoe.piDude) SET_PED_CAPSULE(mdJoe.piDude, 0.35) ENDIF ENDIF ENDPROC /// PURPOSE: /// The player searches the farm for Joe PROC SEARCH_FARM() IF IsJoeDead() EXIT ENDIF TriggerJoeInBarnDialogue() BOOST_JOES_CAPSULE_SIZE() SWITCH MissionSubState CASE SS_SETUP SAFE_REMOVE_BLIP(mdJosef.biBlip) iMexicansFleeTimer = GET_GAME_TIMER() MexicansFlee() iJoeFleesTimer = GET_GAME_TIMER() + JOE_FLEES_TIME bAllowOneDeadMessage = TRUE CPRINTLN(DEBUG_MISSION, "Start SEARCH_FARM") IF bAudioReady TRIGGER_MUSIC_EVENT("MM3_START_FORA") iAudioEventTimer = GET_GAME_TIMER() + AUDIO_EVENT_WAIT_TIME ENDIF MissionSubState = SS_UPDATE BREAK CASE SS_UPDATE MexicansFlee() ActivateJoe() IF bAudioReady IF GET_GAME_TIMER() > iAudioEventTimer TRIGGER_MUSIC_EVENT("MM3_START_STA") bAudioReady = FALSE ENDIF ENDIF BREAK ENDSWITCH // debug skip to next stage #IF IS_DEBUG_BUILD IF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_J)) RC_START_Z_SKIP() SetPlayerPosWithVehicle(<< 422.0315, 6493.4644, 27.2282 >>, 131.0355) RC_END_Z_SKIP(TRUE) ELIF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_P)) DebugSkipKillJosef() ENDIF #ENDIF ENDPROC PROC UnlockBarnDoors() IF DOES_ENTITY_EXIST(oiBarnDoorLeft) FREEZE_ENTITY_POSITION(oiBarnDoorLeft, FALSE) SET_STATE_OF_CLOSEST_DOOR_OF_TYPE(mnBarnDoorLeft, <<424.32, 6477.74, 30.79>>, FALSE, 0.0) SAFE_RELEASE_OBJECT(oiBarnDoorLeft) ENDIF IF DOES_ENTITY_EXIST(oiBarnDoorRight) FREEZE_ENTITY_POSITION(oiBarnDoorRight, FALSE) SET_STATE_OF_CLOSEST_DOOR_OF_TYPE(mnBarnDoorRight, << 419.30, 6471.71, 30.74>>, FALSE, 0.0) SAFE_RELEASE_OBJECT(oiBarnDoorRight) ENDIF ENDPROC /// PURPOSE: /// The player chases Joe in a car PROC CAR_CHASE() IF IsJoeDead() OR BadGuysEscaped() EXIT ENDIF /*IF IS_VEHICLE_OK(viVan) CONTROL_VEHICLE_CHASE_HINT_CAM_IN_VEHICLE(localChaseHintCamStruct, viVan) EL*/IF IS_PED_UNINJURED(mdJoe.piDude) CONTROL_PED_CHASE_HINT_CAM_IN_VEHICLE(localChaseHintCamStruct, mdJoe.piDude) ENDIF MexicansFlee() BOOST_JOES_CAPSULE_SIZE() SWITCH MissionSubState CASE SS_SETUP SAFE_REMOVE_BLIP(mdJosef.biBlip) IF IS_PED_UNINJURED(mdJoe.piDude) IF IS_VEHICLE_OK(viVan) AND IS_VEHICLE_SEAT_FREE(viVan) AND NOT JoeBlockedByPlayer() AND NOT PlayerBlockingBarn() ADD_PED_FOR_DIALOGUE(pedConvStruct, JOE_ID, mdJoe.piDude, "JOE", TRUE) IF IS_ENTITY_ON_SCREEN(mdJoe.piDude) AND (IS_ENTITY_IN_RANGE_COORDS(PLAYER_PED_ID(), <<420.732849,6463.860352,27.903580>>, 5.0) OR IS_ENTITY_IN_RANGE_COORDS(PLAYER_PED_ID(), <<434.056580,6476.199707,27.833858>>, 10.0)) TASK_ENTER_VEHICLE(mdJoe.piDude, viVan) ELSE TASK_WARP_PED_INTO_VEHICLE(mdJoe.piDude, viVan) ENDIF IF bAudioReady TRIGGER_MUSIC_EVENT("MM3_START_FORA") iAudioEventTimer = GET_GAME_TIMER() + AUDIO_EVENT_WAIT_TIME ENDIF SET_WANTED_LEVEL_MULTIPLIER(0.1) PREPARE_MUSIC_EVENT("MM3_TRACTOR") INIT_HAS_PLAYER_RAMMED_ENEMY_ENOUGH(bJoeRammedLastFrame, iRamTimer, iJoeRammedCount, fPlayerVsJoeClosingSpeedLastFrame) MissionSubState = SS_UPDATE ELSE /*SEQUENCE_INDEX siFlee OPEN_SEQUENCE_TASK(siFlee) TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, vLeaveDest2[0], PEDMOVEBLENDRATIO_SPRINT) TASK_SMART_FLEE_PED(NULL, PLAYER_PED_ID(), 500, -1) CLOSE_SEQUENCE_TASK(siFlee) TASK_PERFORM_SEQUENCE(mdJoe.piDude, siFlee) CLEAR_SEQUENCE_TASK(siFlee) SET_PED_DROPS_WEAPON(mdJoe.piDude)*/ TASK_COMBAT_PED(mdJoe.piDude, PLAYER_PED_ID()) IF bAudioReady TRIGGER_MUSIC_EVENT("MM3_START_FORA") iAudioEventTimer = GET_GAME_TIMER() + AUDIO_EVENT_WAIT_TIME ENDIF UnlockBarnDoors() SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CP_KILL_JOE, "Kill Joe", TRUE) missionStage = MS_FLEE_ON_FOOT ENDIF ENDIF BREAK CASE SS_UPDATE IF IS_PED_UNINJURED(mdJoe.piDude) AND IS_VEHICLE_OK(viVan) AND IS_PED_IN_VEHICLE(mdJoe.piDude, viVan) AND GET_IS_WAYPOINT_RECORDING_LOADED(sWaypointRecMain) AND GET_IS_WAYPOINT_RECORDING_LOADED(sWaypointRecAlt) KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() IF CREATE_CONVERSATION(pedConvStruct, "MIN3AUD", "MIN3_T_BARN", CONV_PRIORITY_MEDIUM) UnlockBarnDoors() // start car recording here VEHICLE_INDEX viPlayer viPlayer = GET_PLAYERS_LAST_VEHICLE() IF IS_VEHICLE_OK(viPlayer) AND IS_ENTITY_IN_ANGLED_AREA(viPlayer, vCheckForPlayersCar1, vCheckForPlayersCar2, fCheckForPlayersCar) sJoesWaypointRec = sWaypointRecAlt iNumPointsInJoesRec = 19 ELSE sJoesWaypointRec = sWaypointRecMain iNumPointsInJoesRec = 37 ENDIF REPLAY_RECORD_BACK_FOR_TIME(3.0, 0, REPLAY_IMPORTANCE_LOWEST) // Record Joe driving out of the barn TASK_VEHICLE_FOLLOW_WAYPOINT_RECORDING(mdJoe.piDude, viVan, sJoesWaypointRec, DRIVINGMODE_PLOUGHTHROUGH, 0, EWAYPOINT_NAVMESH_BACK_TO_WAYPOINT_IF_LEFT_ROUTE) SET_VEHICLE_FORWARD_SPEED(viVan, 15.0) LoadTowTruckModels() iConversationTimer = GET_GAME_TIMER() + CHASE_LINE_TIME iMexicansFleeTimer = GET_GAME_TIMER() //SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CP_KILL_JOE, "Kill Joe", TRUE) bSetJoesCheckpoint = TRUE iJoesCheckpointTimer = GET_GAME_TIMER() + JOES_CHECKPOINT_TIME CPRINTLN(DEBUG_MISSION, "Start CAR_CHASE") /*IF DOES_BLIP_EXIST(mdJoe.biBlip) SET_BLIP_SCALE(mdJoe.biBlip, BLIP_SIZE_VEHICLE) ELSE*/ SAFE_REMOVE_BLIP(mdJoe.biBlip) mdJoe.biBlip = CREATE_PED_BLIP(mdJoe.piDude) SET_BLIP_SCALE(mdJoe.biBlip, BLIP_SIZE_VEHICLE) //ENDIF TRIGGER_MUSIC_EVENT("MM3_TRACTOR") MissionSubState = SS_UPDATE_TWO ENDIF ENDIF BREAK CASE SS_UPDATE_TWO VanController() SpawnTowTruck() MexicansFleeTwo() TriggerChaseDialogue() IsCarOk() IF bAudioReady IF GET_GAME_TIMER() > iAudioEventTimer TRIGGER_MUSIC_EVENT("MM3_START_STA") bAudioReady = FALSE ENDIF ENDIF IF bSetJoesCheckpoint AND GET_GAME_TIMER() > iJoesCheckpointTimer SET_REPLAY_MID_MISSION_STAGE_WITH_NAME(CP_KILL_JOE, "Kill Joe", TRUE) bSetJoesCheckpoint = FALSE ENDIF UPDATE_CHASE_BLIP(mdJoe.biBlip, mdJoe.piDude, iEscapeDist) BREAK ENDSWITCH // debug skip to next stage #IF IS_DEBUG_BUILD IF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_J)) IF IS_PED_UNINJURED(mdJoe.piDude) EXPLODE_PED_HEAD(mdJoe.piDude) ENDIF ELIF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_P)) DebugSkipKillJosef() ENDIF #ENDIF ENDPROC /// PURPOSE: /// Joe and Josef flee on foot PROC FLEE_ON_FOOT() IF IsJoeDead() EXIT ENDIF TriggerChaseDialogue() VanController() MexicansFlee() MexicansFleeTwo() IF NOT DOES_ENTITY_EXIST(viTowTruck) AND NOT DOES_ENTITY_EXIST(piTowTruckDriver) LoadTowTruckModels() ENDIF SpawnTowTruck() UPDATE_CHASE_BLIP(mdJoe.biBlip, mdJoe.piDude, iEscapeDist) BOOST_JOES_CAPSULE_SIZE() BOOL joeOk = FALSE IF IS_PED_UNINJURED(mdJoe.piDude) SET_PED_DESIRED_MOVE_BLEND_RATIO(mdJoe.piDude, PEDMOVE_RUN) SET_PED_MAX_MOVE_BLEND_RATIO(mdJoe.piDude, PEDMOVE_RUN) joeOk = TRUE ENDIF BOOL josefOk = FALSE IF IS_PED_UNINJURED(mdJosef.piDude) SET_PED_DESIRED_MOVE_BLEND_RATIO(mdJosef.piDude, PEDMOVE_RUN) SET_PED_MAX_MOVE_BLEND_RATIO(mdJosef.piDude, PEDMOVE_RUN) josefOk = TRUE ENDIF IF joeOk AND josefOk // both are alive so focus on the nearest FLOAT joeDist = GET_DISTANCE_BETWEEN_PEDS(mdJoe.piDude, PLAYER_PED_ID()) FLOAT josefDist = GET_DISTANCE_BETWEEN_PEDS(mdJosef.piDude, PLAYER_PED_ID()) IF joeDist < josefDist CONTROL_PED_CHASE_HINT_CAM_IN_VEHICLE(localChaseHintCamStruct, mdJoe.piDude) ELSE CONTROL_PED_CHASE_HINT_CAM_IN_VEHICLE(localChaseHintCamStruct, mdJosef.piDude) ENDIF ELIF joeOk // Joe is alive, Josef is dead so focus on Joe CONTROL_PED_CHASE_HINT_CAM_IN_VEHICLE(localChaseHintCamStruct, mdJoe.piDude) ELIF josefOk // Josef is alive, Joe is dead so focus on Josef CONTROL_PED_CHASE_HINT_CAM_IN_VEHICLE(localChaseHintCamStruct, mdJosef.piDude) ENDIF IF bAudioReady IF GET_GAME_TIMER() > iAudioEventTimer TRIGGER_MUSIC_EVENT("MM3_START_STA") bAudioReady = FALSE ENDIF ENDIF IF BadGuysEscaped() EXIT ENDIF #IF IS_DEBUG_BUILD IF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_J)) IF IS_PED_UNINJURED(mdJosef.piDude) EXPLODE_PED_HEAD(mdJosef.piDude) ENDIF IF IS_PED_UNINJURED(mdJoe.piDude) EXPLODE_PED_HEAD(mdJoe.piDude) ENDIF ELIF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_P)) DebugSkipChaseJoe() ENDIF #ENDIF ENDPROC /// PURPOSE: /// Plays the mission passed dialogue PROC PASS_DELAY() SWITCH MissionSubState CASE SS_SETUP CLEAR_PRINTS() CLEAR_ALL_BLIPS() KILL_FACE_TO_FACE_CONVERSATION_DO_NOT_FINISH_LAST_LINE() REMOVE_PED_FOR_DIALOGUE(pedConvStruct, JOSEF_ID) REMOVE_PED_FOR_DIALOGUE(pedConvStruct, JOE_ID) CPRINTLN(DEBUG_MISSION, "Start PASS_DELAY") TRIGGER_MUSIC_EVENT("MM3_STOP") REPLAY_RECORD_BACK_FOR_TIME(5.0, 4.0, REPLAY_IMPORTANCE_LOW) MissionSubState = SS_UPDATE BREAK CASE SS_UPDATE IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() IF PLAY_SINGLE_LINE_FROM_CONVERSATION(pedConvStruct, "MIN3AUD", "MIN3_KILL", "MIN3_KILL_2", CONV_PRIORITY_HIGH) MissionSubState = SS_CLEANUP ENDIF ENDIF BREAK CASE SS_CLEANUP IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED() Script_Passed() ENDIF BREAK ENDSWITCH ENDPROC /// PURPOSE: /// Fade out for the fail screen PROC FAIL_DELAY() SWITCH MissionSubState CASE SS_SETUP CLEAR_PRINTS() CLEAR_ALL_BLIPS() STRING sFailReason IF DOES_ENTITY_EXIST(sRCLauncherDataLocal.pedID[MANUEL]) IF IS_PED_INJURED(sRCLauncherDataLocal.pedID[MANUEL]) MissionFailReason = MFR_KILLED_MANUEL ENDIF ENDIF // set the fail reason SWITCH MissionFailReason CASE MFR_NONE // no fail reaon BREAK CASE MFR_KILLED_MANUEL sFailReason = "MIN3_FAIL1" BREAK CASE MFR_KILLED_A_MEXICAN sFailReason = "MIN3_FAIL2" BREAK CASE MFR_INJURED_MANUEL sFailReason = "MIN3_FAIL3" BREAK CASE MFR_INJURED_A_MEXICAN sFailReason = "MIN3_FAIL4" BREAK CASE MFR_JOE_ESCAPED sFailReason = "MIN3_FAIL5" BREAK CASE MFR_EXECUTION sFailReason = "MIN3_FAIL8" BREAK ENDSWITCH TRIGGER_MUSIC_EVENT("MM3_FAIL") IF MissionFailReason = MFR_NONE Random_Character_Failed() ELSE Random_Character_Failed_With_Reason(sFailReason) ENDIF CPRINTLN(DEBUG_MISSION, "Start FAIL_DELAY") MissionSubState = SS_UPDATE BREAK CASE SS_UPDATE IF GET_MISSION_FLOW_SAFE_TO_CLEANUP() DeleteEverything() Script_Cleanup() ELSE // not finished fading out // you may want to handle dialogue etc here. ENDIF BREAK ENDSWITCH ENDPROC // =========================================================================================================== // Script Loop // =========================================================================================================== SCRIPT(g_structRCScriptArgs sRCLauncherDataIn) sRCLauncherDataLocal = sRCLauncherDataIn RC_TakeEntityOwnership(sRCLauncherDataLocal) mScenarioBlocker = Minute3_Scenario_Blocker() SET_MISSION_FLAG(TRUE) // Setup callback when player is killed, arrested or goes to multiplayer IF (HAS_FORCE_CLEANUP_OCCURRED(DEFAULT_FORCE_CLEANUP_FLAGS|FORCE_CLEANUP_FLAG_DEBUG_MENU)) PRINT_LAUNCHER_DEBUG("Force cleanup [TERMINATING]") TRIGGER_MUSIC_EVENT("MM3_FAIL") Random_Character_Failed() Script_Cleanup() ENDIF IF Is_Replay_In_Progress() // Set up the initial scene for replays IF GET_REPLAY_MID_MISSION_STAGE() = CP_AFTER_MOCAP g_bSceneAutoTrigger = TRUE eInitialSceneStage = IS_REQUEST_SCENE WHILE NOT SetupScene_MINUTE_3(sRCLauncherDataLocal) WAIT(0) ENDWHILE RC_SET_ENTITY_PROOFS_FOR_CUTSCENE(sRCLauncherDataLocal, FALSE) g_bSceneAutoTrigger = FALSE ENDIF ENDIF #IF IS_DEBUG_BUILD sSkipMenu[0].sTxtLabel = "Restart" sSkipMenu[1].sTxtLabel = "Kill Josef" sSkipMenu[2].sTxtLabel = "Car Chase" #ENDIF ADD_CONTACT_TO_PHONEBOOK(CHAR_JOE, TREVOR_BOOK, FALSE) ADD_CONTACT_TO_PHONEBOOK(CHAR_JOSEF, TREVOR_BOOK, FALSE) // Loop within here until the mission passes or fails WHILE(TRUE) REPLAY_CHECK_FOR_EVENT_THIS_FRAME("SF_MMB") WAIT(0) UPDATE_MISSION_NAME_DISPLAYING(sRCLauncherDataLocal.sIntroCutscene) //DISPLAY_POLY2(tpFarmArea) CheckForStunGunUse() KillConversationsInShops() IF IS_PED_UNINJURED(PLAYER_PED_ID()) SWITCH missionStage CASE MS_INIT INIT() BREAK CASE MS_PRE_INTRO PRE_INTRO() BREAK CASE MS_INTRO_PLAYING INTRO_PLAYING() BREAK CASE MS_DRIVE_TO_FARM DRIVE_TO_FARM() BREAK CASE MS_JOSEF_ATTACKS JOSEF_ATTACKS() BREAK CASE MS_SEARCH_FARM SEARCH_FARM() BREAK CASE MS_CAR_CHASE CAR_CHASE() BREAK CASE MS_FLEE_ON_FOOT FLEE_ON_FOOT() BREAK CASE MS_PASS_DELAY PASS_DELAY() BREAK CASE MS_FAIL_DELAY FAIL_DELAY() BREAK ENDSWITCH ENDIF // check if any mission essential peds have been killed or hurt by the player IF missionStage <> MS_FAIL_DELAY AND missionStage <> MS_INIT AND missionStage <> MS_PRE_INTRO AND missionStage <> MS_INTRO_PLAYING Check_Essential_Ped(sRCLauncherDataLocal.pedID[MANUEL]) CheckPlayerHurtsPed(sRCLauncherDataLocal.pedID[MANUEL]) CheckManuelsCar() INT i = 0 REPEAT NUM_MEXICANS i Check_Essential_Ped(piMexican[i]) CheckPlayerHurtsPed(piMexican[i]) ENDREPEAT i = 0 REPEAT NUM_MEXICANS_2 i Check_Essential_Ped(piMexican2[i]) CheckPlayerHurtsPed(piMexican2[i]) ENDREPEAT // Check debug completion/failure #IF IS_DEBUG_BUILD DEBUG_Check_Debug_Keys() #ENDIF ENDIF ENDWHILE // Script should never reach here. Always terminate with cleanup function. ENDSCRIPT