Files
2025-09-29 00:52:08 +02:00

3334 lines
112 KiB
Python
Executable File

//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