Files
gtav-src/script/dev_ng/singleplayer/scripts/Minigames/Taxi/Taxi_GotYourBack.sc
T
2025-09-29 00:52:08 +02:00

3028 lines
110 KiB
Python
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
//=======================================================================================================================================
// Taxi_GotYouNow.sc
// Dev : John R. Diaz
/*
Weve got you this time, pal! This is the only scenario that launches without immediately notifying the player. If the player
has angered a specific gang or has committed enough crimes to anger the police, this scenario will launch and mimic a normal passenger.
However, the drop off for this passenger will be someplace unusual. (Such as behind a warehouse or at an abandoned peer.) When you arrive,
the passenger runs from the car and takes cover. Baddies and cars pop out of hiding and ambush you. You shouldnt fuck with ___! they
shout before opening fire. The player can flee, but if they opt to fight the ambushers should have ammo and contraband such that the
player feels that they did not waste their time by picking up cab fares.
*/
//CHANGELOG==========================================================================================================
//9/27/11 - Reformatting/prettifying all taxi oj scripts
//12/20/11 - End of mission cleaned up to allow for better sequence of events. General script cleanup. --johnsripan
//===================================================================================================================
//Compile out Title Update changes to header functions.
//Must be before includes.
//CONST_INT USE_TU_CHANGES 0 // Removed by Kenneth R.
//Includes------------------------------------------------------
USING "Taxi_Includes.sch"
USING "Taxi_ambush_lib.sch"
//Local Variables-----------------------------------------------
TaxiStruct myTaxiData
TaxiAmbushStruct_v2 TAS_Local
TaxiAmbushStruct_v2 TAS_Local2
REL_GROUP_HASH relPursuers
ENUM TAXIOJ_GYB_BONUS
TGYB_BONUS_TERMINATOR = 0,
TGYB_BONUS_TOTAL
ENDENUM
ENUM TAXI_DYNAMIC_REQUESTS
TAXIDR_REQUEST,
TAXIDR_WAIT_STREAM,
TAXIDR_CREATE,
TAXIDR_CLEANUP
ENDENUM
TAXI_DYNAMIC_REQUESTS eTaxiRequestState = TAXIDR_REQUEST
CONST_INT TAXI_CONST_BONUS_CASH_TERMINATOR 200
CONST_INT TAXI_CONST_NUM_TOTAL_ENEMIES 8
CONST_INT k_bDropOffFound 0
CONST_INT k_bPassengerTalking 1
CONST_INT k_bPassengerVulnerable 2
CONST_INT k_bSideTaskLoopB 3
CONST_INT k_bSideTaskOutro 4
CONST_INT k_bMainTaskOutro 5
CONST_INT k_bGivePassengerGun 6
CONST_INT k_bGiveBikerCGun 7
CONST_INT k_bGiveBikerDGun 8
CONST_INT k_bPauseConvo 9
CONST_INT k_bSideConvoPlayed 10
CONST_INT TAXI_CONST_GYB_DIST_TO_HAND_GUN 675 //1000 //550
CONST_FLOAT TAXI_PASSENGER_GUN_TIME 0.838
CONST_FLOAT TAXI_BIKER_C_GUN_TIME 0.853
CONST_FLOAT TAXI_BIKER_D_GUN_TIME 0.218
BONUS_FIELD bonusFieldGotYourBack[TGYB_BONUS_TOTAL]
MODEL_NAMES mPassengerModel = A_M_M_FARMER_01
MODEL_NAMES mBoxPile = PROP_BOX_WOOD04A
MODEL_NAMES mRegularBox = PROP_CARDBORDBOX_03A
MODEL_NAMES mExpBarrel = PROP_BARREL_EXP_01A
//Ambush states for ambush state machine
ENUM AMBUSH_STATES
AMB_INIT = 0,
AMB_TALKING,
AMB_TALKING2,
AMB_STANDOFF,
AMB_COMBAT,
AMB_SECOND_WAVE,
AMB_WAIT_FOR_DEATH,
AMB_END
ENDENUM
AMBUSH_STATES m_AmbushState = AMB_INIT
//Native Data
SEQUENCE_INDEX seqIndexTaxiAIAction
OBJECT_INDEX oiBoxPiles[3]
OBJECT_INDEX oiExpBarrel
OBJECT_INDEX oiRegBox
PED_INDEX piGangsterGirls[2]
PED_INDEX piMedic
VEHICLE_INDEX viExtraBike //one more bike in docks scene that doesn't fit in ambush struct
VEHICLE_INDEX viAmbulance
SCENARIO_BLOCKING_INDEX tempScenarioBlockingIndex
INCIDENT_INDEX ambulanceIndex
INCIDENT_INDEX policeIndex
//Ints
INT iDebugThrottle = 1
INT iAmbushTimer = 0
INT iGiveGunTimer = 0
INT iSyncFailSafeTimer = 0
INT iTaxiGYBCarRecFileNo = 112
INT iStandoffMarker = 0
INT iGangsterKilledCount = 0
INT iPlayerKilledCount = 0
INT iTipIndex = 0
INT iLocalBitSet = 0
INT iSideSceneId
INT iSideSceneId2
INT iSideSceneId3
INT iSideSceneId4
INT iMainSceneId
INT iMainSceneId2
//Bools
BOOL bWeaponGivenToPlayer = FALSE
//BOOL bDisableCin = FALSE
BOOL bEnableBonusCam// = TRUE
//BOOL bCineCamSwitch = TRUE
BOOL bTaxiDelayFail
BOOL bTaxiFailOnce
BOOL bTaxiEarlyAggro
BOOL bAmbushSetup
BOOL bAmbushBlipTransition
BOOL bDispatchSuccessful
BOOL bAmbulanceFound
BOOL bSayShout
BOOL bCutToGamePlay
BOOL bPulseTriggered
//Vectors
VECTOR vPassengerPt = << 11.8607, -1123.4800, 27.6801 >> //Ammunation //<< -271.9266, 248.3547, 89.1946 >> //Viper Room
VECTOR vPassengerPickupPt = << 11.8607, -1123.4800, 27.6801 >> //<< -275.2373, 252.9418, 88.8746 >>
VECTOR vDocksMin = << 144.3291, -3352.7734, 3.6651 >>
VECTOR vDocksMax = << 311.9527, -3305.6133, 10.6651 >>
VECTOR scenePositionSide = << 206.636, -3322.673, 4.6339 >> //4.715 >>
VECTOR sceneRotationSide = << 0.000, 0.000, 24.000 >>
VECTOR scenePositionMain = << 208.786, -3319.823, 4.6339 >> //4.715 >>
VECTOR sceneRotationMain = << 0.000, 0.000, 47.000 >>
VECTOR vPassengerWalkPoint = << 199.51877, -3326.20117, 4.78716 >>
VECTOR vIncidentPoint = << 232.99445, -3327.82495, 4.79877 >>
//Const
CONST_INT kPedLowAccuracy 1
CONST_INT kPedNotSoLowAccuracy 1
CONST_FLOAT fGoodFleeDistance 4000.0
STRING sSyncSceneDict = "oddjobs@taxi@argument"
TEXT_LABEL_23 sStandoffTrigger1 = "txm12_deal1_7"
TEXT_LABEL_23 sStandoffTrigger2 = "txm12_deal1_7"
TEXT_LABEL_23 sCurrentLine
structTimer ambushBanterTimer
structTimer pulseTimer
//Dialogue Queue Info
BOOL g_bDebug = FALSE
TAXI_OJ_DIALOGUE_Q_DATA tTaxiOJ_DQ_Data
TAXI_OJ_DQ_CONVERSATION_LINE tDialogueLine[CONST_TAXIOJ_SIZE_Q]
//Aggro checks
AGGRO_ARGS aggroArgs
SCRIPT_SHARD_BIG_MESSAGE TaxiMidSize
//Debug---------------------------------------------------------------------------------------------------------------
#IF IS_DEBUG_BUILD
WIDGET_GROUP_ID taxiRideWidgets
TEXT_LABEL_63 sDebugString[3]
BOOL bForceReset, bResetting, bPassengerInvincible
BOOL bDebugTurnOnFreeRide = FALSE
BOOL bDebugBonusTermintator = FALSE
TXM_DEBUG_SKIP_STATES tDebugState = TXM_DSS_CHECK_FOR_BUTTON_PRESS
#ENDIF
//FUNCTIONS------------------------------------------------------------------------------------------------------------
/// PURPOSE: Used as an update routine that also gates progress in a conditional statement, also manages blips
///
/// PARAMS:
/// Fighters - Array of peds to be monitored
/// Blips - Array of blips in direct relation to peds
/// RETURNS: returns true if all peds are dead
///
FUNC BOOL UPDATE_AMBUSH_PEDS(PED_INDEX &Fighters[], BLIP_INDEX &Blips[], PED_INDEX &Fighters2[], BLIP_INDEX &Blips2[])
INT i
BOOL bAreAllEnemiesDead = TRUE
iPlayerKilledCount = 0
REPEAT 4 i //COUNT_OF(Fighters) i
IF IS_ENTITY_DEAD( Fighters[i] )
IF DOES_BLIP_EXIST( Blips[i] )
REMOVE_BLIP( Blips[i] )
ENDIF
IF HAS_TAXI_DAMAGED_ENTITY(myTaxiData,Fighters[i])
iPlayerKilledCount++
ENDIF
iGangsterKilledCount++
ELSE
iPlayerKilledCount = 0
bAreAllEnemiesDead = FALSE
ENDIF
IF IS_ENTITY_DEAD( Fighters2[i] )
IF DOES_BLIP_EXIST( Blips2[i] )
REMOVE_BLIP( Blips2[i] )
bSayShout = TRUE
ENDIF
IF HAS_TAXI_DAMAGED_ENTITY(myTaxiData,Fighters2[i])
iPlayerKilledCount++
ENDIF
// ELIF NOT DOES_BLIP_EXIST( Blips2[i] )
// // if blip doesn't exist and entity is not dead, that means ped isn't in combat
// // so do nothing
ELSE
iPlayerKilledCount = 0
bAreAllEnemiesDead = FALSE
ENDIF
ENDREPEAT
RETURN bAreAllEnemiesDead
ENDFUNC
/// PURPOSE:A central location for all the vehicle recording names used in this mission.
///
/// PARAMS:
/// iNum - Corresponds to which car recording we want
/// RETURNS:
///
FUNC STRING GET_TAXI_OJ_GYB_VEHICLE_RECORDING_NAME(INT iNum)
STRING sVehRecName
SWITCH iNum
CASE 0
sVehRecName = "txm12_s01_a"
BREAK
CASE 1
sVehRecName = "txm12_s01_b"
BREAK
ENDSWITCH
RETURN sVehRecName
ENDFUNC
/// PURPOSE: Make all of our mission specific requests here
///
PROC REQUEST_TAXI_ODDJOB_GYB_STREAMS_STAGE_01()
//Load text and UI
REQUEST_MODEL(mPassengerModel)
//Load text and UI
TAXI_INIT_SHARED_STREAMS()
TaxiMidSize.siMovie = REQUEST_MG_MIDSIZED_MESSAGE()
CDEBUG1LN(DEBUG_OJ_TAXI,"TXM - GYB Stage 01 Assets Requested")
ENDPROC
PROC RELEASE_TAXI_ODDJOB_GYB_STREAMS_STAGE_01()
SET_MODEL_AS_NO_LONGER_NEEDED(mPassengerModel)
CDEBUG1LN(DEBUG_OJ_TAXI,"Taxi OJ GYB Stage01 Assets Released")
ENDPROC
PROC REQUEST_TAXI_ODDJOB_GYB_STREAMS_STAGE_AMBUSH()
REQUEST_MODEL(mBoxPile)
REQUEST_MODEL(mRegularBox)
REQUEST_MODEL(mExpBarrel)
REQUEST_MODEL(TAS_Local.gangmodel[0])
REQUEST_MODEL(TAS_Local.gangmodel[1])
REQUEST_MODEL(TAS_Local.modelName_GangCar[0])
REQUEST_MODEL(TAS_Local.modelName_GangCar[1])
REQUEST_MODEL(TAS_Local.modelName_GangCar[2])
REQUEST_MODEL(TAS_Local.modelName_GangCar[3])
REQUEST_MODEL(TAS_Local2.modelName_GangCar[1])
REQUEST_VEHICLE_RECORDING(iTaxiGYBCarRecFileNo, GET_TAXI_OJ_GYB_VEHICLE_RECORDING_NAME(0))
REQUEST_VEHICLE_RECORDING(iTaxiGYBCarRecFileNo, GET_TAXI_OJ_GYB_VEHICLE_RECORDING_NAME(1))
REQUEST_ANIM_DICT("random@countryside_gang_fight")
REQUEST_ANIM_DICT(sSyncSceneDict)
CDEBUG1LN(DEBUG_OJ_TAXI,"TXM - GYB Stage Ambush Assets Requested")
ENDPROC
PROC RELEASE_TAXI_ODDJOB_GYB_STREAMS_STAGE_AMBUSH()
SET_MODEL_AS_NO_LONGER_NEEDED(mBoxPile)
SET_MODEL_AS_NO_LONGER_NEEDED(mRegularBox)
SET_MODEL_AS_NO_LONGER_NEEDED(mExpBarrel)
SET_MODEL_AS_NO_LONGER_NEEDED(TAS_Local.gangmodel[0])
SET_MODEL_AS_NO_LONGER_NEEDED(TAS_Local.gangmodel[1])
SET_MODEL_AS_NO_LONGER_NEEDED(TAS_Local.modelName_GangCar[0])
SET_MODEL_AS_NO_LONGER_NEEDED(TAS_Local.modelName_GangCar[1])
SET_MODEL_AS_NO_LONGER_NEEDED(TAS_Local.modelName_GangCar[2])
SET_MODEL_AS_NO_LONGER_NEEDED(TAS_Local.modelName_GangCar[3])
SET_MODEL_AS_NO_LONGER_NEEDED(TAS_Local2.modelName_GangCar[1])
REMOVE_VEHICLE_RECORDING(iTaxiGYBCarRecFileNo, GET_TAXI_OJ_GYB_VEHICLE_RECORDING_NAME(0))
REMOVE_VEHICLE_RECORDING(iTaxiGYBCarRecFileNo, GET_TAXI_OJ_GYB_VEHICLE_RECORDING_NAME(1))
REMOVE_ANIM_DICT("random@countryside_gang_fight")
REMOVE_ANIM_DICT(sSyncSceneDict)
CDEBUG1LN(DEBUG_OJ_TAXI,"TXM - GYB Stage Ambush Assets Released")
ENDPROC
FUNC BOOL HAVE_TAXI_OJ_FC_STAGE_ABMUSH_ASSETS_LOADED()
IF NOT HAS_MODEL_LOADED(mBoxPile)
CDEBUG_MESSAGE_OJ_TAXI_PERIODIC("TAXI_ASSETS_STREAMED - Loading PROP_BOXPILE_02C",iDebugThrottle)
RETURN FALSE
ENDIF
IF NOT HAS_MODEL_LOADED(mRegularBox)
CDEBUG_MESSAGE_OJ_TAXI_PERIODIC("TAXI_ASSETS_STREAMED - Loading PROP_CARDBORDBOX_03A",iDebugThrottle)
RETURN FALSE
ENDIF
IF NOT HAS_MODEL_LOADED(TAS_Local.gangmodel[0])
CDEBUG_MESSAGE_OJ_TAXI_PERIODIC("TAXI_ASSETS_STREAMED - Loading Baddie driver model",iDebugThrottle)
RETURN FALSE
ENDIF
IF NOT HAS_MODEL_LOADED(TAS_Local.gangmodel[1])
CDEBUG_MESSAGE_OJ_TAXI_PERIODIC("TAXI_ASSETS_STREAMED - Loading Gangster girl model",iDebugThrottle)
RETURN FALSE
ENDIF
IF NOT HAS_MODEL_LOADED(TAS_Local.modelName_GangCar[0])
CDEBUG_MESSAGE_OJ_TAXI_PERIODIC("TAXI_ASSETS_STREAMED - Loading modelName_Car1 model",iDebugThrottle)
RETURN FALSE
ENDIF
IF NOT HAS_MODEL_LOADED(TAS_Local.modelName_GangCar[1])
CDEBUG_MESSAGE_OJ_TAXI_PERIODIC("TAXI_ASSETS_STREAMED - Loading modelName_Car2 model",iDebugThrottle)
RETURN FALSE
ENDIF
IF NOT HAS_MODEL_LOADED(TAS_Local.modelName_GangCar[2])
CDEBUG_MESSAGE_OJ_TAXI_PERIODIC("TAXI_ASSETS_STREAMED - Loading modelName_Car3 model",iDebugThrottle)
RETURN FALSE
ENDIF
IF NOT HAS_MODEL_LOADED(TAS_Local.modelName_GangCar[3])
CDEBUG_MESSAGE_OJ_TAXI_PERIODIC("TAXI_ASSETS_STREAMED - Loading modelName_Car4 model",iDebugThrottle)
RETURN FALSE
ENDIF
IF NOT HAS_MODEL_LOADED(TAS_Local2.modelName_GangCar[1])
CDEBUG_MESSAGE_OJ_TAXI_PERIODIC("TAXI_ASSETS_STREAMED - Loading modelName_Car5 model",iDebugThrottle)
RETURN FALSE
ENDIF
IF NOT HAS_VEHICLE_RECORDING_BEEN_LOADED(iTaxiGYBCarRecFileNo, GET_TAXI_OJ_GYB_VEHICLE_RECORDING_NAME(0))
CDEBUG_MESSAGE_OJ_TAXI_PERIODIC("TAXI_ASSETS_STREAMING - Vehicle Recording Loading TXM12_S01_A...",iDebugThrottle)
RETURN FALSE
ENDIF
IF NOT HAS_VEHICLE_RECORDING_BEEN_LOADED(iTaxiGYBCarRecFileNo, GET_TAXI_OJ_GYB_VEHICLE_RECORDING_NAME(1))
CDEBUG_MESSAGE_OJ_TAXI_PERIODIC("TAXI_ASSETS_STREAMING - Vehicle Recording Loading TXM12_S01_B...",iDebugThrottle)
RETURN FALSE
ENDIF
IF NOT HAS_ANIM_DICT_LOADED("random@countryside_gang_fight")
CDEBUG_MESSAGE_OJ_TAXI_PERIODIC("TAXI_ASSETS_STREAMED - Loading random@countryside_gang_fight ",iDebugThrottle)
RETURN FALSE
ENDIF
IF NOT HAS_ANIM_DICT_LOADED(sSyncSceneDict)
CDEBUG_MESSAGE_OJ_TAXI_PERIODIC("TAXI_ASSETS_STREAMED - Loading sSyncSceneDict ",iDebugThrottle)
RETURN FALSE
ENDIF
//JD - 5/9/12 - For some reason mExpBarrel is loading commenting out for now since it's not a critical prop
IF NOT HAS_MODEL_LOADED(mExpBarrel)
CDEBUG_MESSAGE_OJ_TAXI_PERIODIC("TAXI_ASSETS_STREAMED - Loading PROP_BARREL_EXP_01A",iDebugThrottle)
//RETURN FALSE
ENDIF
RETURN TRUE
ENDFUNC
//// PURPOSE: Waits for our assets to load
///
/// RETURNS: TRUE if everything has loaded correctly FALSE if there was a problem
///
///
FUNC BOOL HAVE_TAXI_OJ_FC_STAGE_01_ASSETS_LOADED()
IF NOT HAS_MODEL_LOADED(mPassengerModel)
CDEBUG_MESSAGE_OJ_TAXI_PERIODIC("TAXI_ASSETS_STREAMED - Loading A_M_M_Farmer_01",iDebugThrottle)
RETURN FALSE
ENDIF
IF NOT HAS_SCALEFORM_MOVIE_LOADED(TaxiMidSize.siMovie)
#IF IS_DEBUG_BUILD
CDEBUG_MESSAGE_OJ_TAXI_PERIODIC("TAXI_ASSETS_STREAMED - Loading TaxiMidSize.siMovie",iDebugThrottle)
#ENDIF
RETURN FALSE
ENDIF
IF NOT TAXI_SHARED_ASSETS_STREAMED(iDebugThrottle)
CDEBUG_MESSAGE_OJ_TAXI_PERIODIC("TAXI_ASSETS_STREAMED - Loading shared assets",iDebugThrottle)
RETURN FALSE
ENDIF
RETURN TRUE
ENDFUNC
PROC Script_Cleanup()
#IF IS_DEBUG_BUILD
IF DOES_WIDGET_GROUP_EXIST(taxiRideWidgets)
DELETE_WIDGET_GROUP(taxiRideWidgets)
ENDIF
CLEANUP_TAXI_WIDGETS()
#ENDIF
CLEANUP_TAXI_OJ_PASSENGER(myTaxiData)
SET_WANTED_LEVEL_MULTIPLIER(1)
SET_ALL_VEHICLE_GENERATORS_ACTIVE_IN_AREA(vDocksMin, vDocksMax, TRUE)
CLEAR_PED_NON_CREATION_AREA()
REMOVE_SCENARIO_BLOCKING_AREA(tempScenarioBlockingIndex)
SET_VEHICLE_AS_NO_LONGER_NEEDED(viExtraBike)
RELEASE_TAXI_ODDJOB_GYB_STREAMS_STAGE_01()
RELEASE_TAXI_ODDJOB_GYB_STREAMS_STAGE_AMBUSH()
IF DOES_CAM_EXIST(myTaxiData.camTaxi)
DESTROY_CAM(myTaxiData.camTaxi)
RENDER_SCRIPT_CAMS(FALSE, FALSE)
SET_CINEMATIC_BUTTON_ACTIVE(TRUE)
ENDIF
// CURRENTLY NOTHING TO CLEANUP
TERMINATE_THIS_THREAD()
ENDPROC
// Perform any special commands if the script fails
// NOTE: This can include WAITs prior to the Mission_Cleanup() call
PROC Script_Failed()
IF NOT bTaxiFailOnce
TAXI_SCRIPT_FAILED(myTaxiData)
bTaxiFailOnce = TRUE
ENDIF
SET_PROPERTY_MANAGEMENT_RESULT(PROPERTY_MANAGEMENT_RESULT_FAILURE)
IF bTaxiDelayFail
IF GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(PLAYER_PED_ID(), myTaxiData.vTaxiOJDropoff) > 50
OR UPDATE_AMBUSH_PEDS( TAS_Local.piAmbush, TAS_Local.blipPedAmbush, TAS_Local2.piAmbush, TAS_Local2.blipPedAmbush )
Script_Cleanup()
ENDIF
ELSE
Script_Cleanup()
ENDIF
ENDPROC
PROC INITIALIZE_TAS_LOCAL()
TAS_Local.gangmodel[0] = G_M_Y_LOST_01
TAS_Local.gangmodel[1] = S_F_Y_Hooker_01
TAS_Local.modelName_GangCar[0] = GBURRITO
TAS_Local.modelName_GangCar[1] = DAEMON //GBURRITO
TAS_Local.modelName_GangCar[2] = HEXER
TAS_Local.modelName_GangCar[3] = EMPEROR
TAS_Local2.gangmodel[0] = G_M_Y_LOST_01
TAS_Local2.modelName_GangCar[0] = GBURRITO
TAS_Local2.modelName_GangCar[1] = HEXER //EMPEROR2
CDEBUG1LN(DEBUG_OJ_TAXI,"TAXI - The Latin Gang is chosen!")
ENDPROC
/// PURPOSE: Get ambush veh spawn position. Range = 1-4
///
FUNC VECTOR GET_AMBUSH_VEHICLE_SPAWN_POSITION( INT idx )
SWITCH idx
CASE 1 //truck
RETURN << 208.8206, -3319.2800, 4.7925 >> //<< 208.5512, -3318.6257, 4.7917 >> //<< 200.2243, -3318.6624, 4.7376 >>
BREAK
CASE 2 //bike
RETURN << 202.0773, -3320.3933, 4.7657 >> //<< 209.8816, -3319.1345, 4.7924 >>
BREAK
CASE 3 //car
RETURN << 216.1051, -3318.8367, 4.7918 >>
BREAK
CASE 4 //car
RETURN << 221.6868, -3324.7466, 5.3063 >>
BREAK
CASE 5 //bike
RETURN << 200.1736, -3320.6655, 4.7361 >> //<< 210.6792, -3320.6277, 4.7932 >>
BREAK
ENDSWITCH
RETURN <<0,0,0>>
ENDFUNC
/// PURPOSE: Get ambush veh spawn heading. Range = 1-4
///
FUNC FLOAT GET_AMBUSH_VEHICLE_SPAWN_HEADING( INT idx )
SWITCH idx
CASE 1
RETURN 301.9600 //293.4266 //50.7207
BREAK
CASE 2
RETURN 33.5561 //103.1631
BREAK
CASE 3
RETURN 87.9127
BREAK
CASE 4
RETURN 195.38
BREAK
CASE 5
RETURN 35.3307 //109.4646
BREAK
ENDSWITCH
RETURN 0.0
ENDFUNC
/// PURPOSE: Get ambush ped spawn position. Range = 1-7
///
FUNC VECTOR GET_AMBUSH_PED_SPAWN_POSITION( INT idx )
SWITCH idx
CASE 1 // gangster left of boss
RETURN << 202.35, -3321.76, 4.79 >>
BREAK
CASE 2 // boss guy
RETURN << 204.27, -3321.77, 5.79 >>
BREAK
CASE 3 // gangster right of boss
RETURn << 204.93, -3322.56, 4.79 >> //>><< 205.90, -3322.58, 5.80 >> //<< 205.48, -3319.82, 5.80 >>
BREAK
CASE 4 // gangster in the back
RETURN << 218.19, -3323.58, 5.80 >> //<< 212.8885, -3314.0981, 5.80 >>
BREAK
CASE 5 // gangster girl to the side
RETURN << 219.52, -3324.00, 5.80 >>
BREAK
CASE 6 // 2nd gangster girl to the side
RETURN << 220.14, -3325.39, 5.80 >>
BREAK
// CASE 7
// RETURN << 211.4085, -3316.9163, 4.7910 >>
// BREAK
ENDSWITCH
RETURN <<0,0,0>>
ENDFUNC
/// PURPOSE: Get ambush ped spawn heading. Range = 1-7
///
FUNC FLOAT GET_AMBUSH_PED_SPAWN_HEADING( INT idx )
SWITCH idx
CASE 1 // gangster left of boss
RETURN 251.3766
BREAK
CASE 2 // boss guy
RETURn -129.32 //169.60
BREAK
CASE 3 // gangster right of boss
RETURN 39.53 //9.74
BREAK
CASE 4 // gangster in the back
RETURN -139.98 //-127.39
BREAK
CASE 5 // gangster girl to the side
RETURN 147.25
BREAK
CASE 6 // 2nd gangster girl to the side
RETURN 68.18
BREAK
// CASE 7
// RETURN 195.4813
// BREAK
ENDSWITCH
RETURN 0.0
ENDFUNC
/// PURPOSE: Get ambush veh spawn position. Range = 1-4
///
FUNC VECTOR GET_AMBUSH_VEHICLE_SPAWN_POSITION2( INT idx )
SWITCH idx
CASE 1
RETURN << 290.2584, -3236.6604, 4.8352 >>
BREAK
CASE 2
RETURN << 299.2215, -3235.2480, 4.7762 >>
BREAK
ENDSWITCH
RETURN <<0,0,0>>
ENDFUNC
/// PURPOSE: Get ambush veh spawn heading. Range = 1-4
///
FUNC FLOAT GET_AMBUSH_VEHICLE_SPAWN_HEADING2( INT idx )
SWITCH idx
CASE 1
RETURN 159.2139
BREAK
CASE 2
RETURN 156.7733
BREAK
ENDSWITCH
RETURN 0.0
ENDFUNC
FUNC VECTOR GET_GANGSTER_IDLE_WALK_POINTS( INT idx)
SWITCH idx
CASE 1
RETURN << 204.43, -3327.59, 4.79 >>
BREAK
CASE 2
RETURN << 207.65, -3328.01, 4.79 >>
BREAK
CASE 3
RETURN << 212.60, -3327.76, 4.80 >>
BREAK
ENDSWITCH
RETURN <<0,0,0>>
ENDFUNC
FUNC VECTOR GET_GANGSTER_WALK_POINTS( INT idx)
SWITCH idx
CASE 1
RETURN << 202.24, -3322.48, 5.79 >>
BREAK
CASE 2
RETURN << 203.40, -3323.22, 5.79 >>
BREAK
CASE 3
RETURN << 205.66, -3322.41, 5.80 >>
BREAK
ENDSWITCH
RETURN <<0,0,0>>
ENDFUNC
/// PURPOSE:
/// Creates and inserts the ambush gang members' cars
PROC CREATE_AMBUSH_CARS()
TAS_Local.viGangCar[0] = CREATE_VEHICLE( TAS_Local.modelName_GangCar[0], GET_AMBUSH_VEHICLE_SPAWN_POSITION(1), GET_AMBUSH_VEHICLE_SPAWN_HEADING(1) )
TAS_Local.viGangCar[1] = CREATE_VEHICLE( TAS_Local.modelName_GangCar[1], GET_AMBUSH_VEHICLE_SPAWN_POSITION(2), GET_AMBUSH_VEHICLE_SPAWN_HEADING(2) )
TAS_Local.viGangCar[2] = CREATE_VEHICLE( TAS_Local.modelName_GangCar[3], GET_AMBUSH_VEHICLE_SPAWN_POSITION(3), GET_AMBUSH_VEHICLE_SPAWN_HEADING(3) )
TAS_Local.viGangCar[3] = CREATE_VEHICLE( TAS_Local.modelName_GangCar[3], GET_AMBUSH_VEHICLE_SPAWN_POSITION(4), GET_AMBUSH_VEHICLE_SPAWN_HEADING(4) )
viExtraBike = CREATE_VEHICLE(TAS_Local.modelName_GangCar[2], GET_AMBUSH_VEHICLE_SPAWN_POSITION(5), GET_AMBUSH_VEHICLE_SPAWN_HEADING(5) )
SET_VEHICLE_NUMBER_PLATE_TEXT(TAS_Local.viGangCar[2],"NikoB")
SET_VEHICLE_NUMBER_PLATE_TEXT(TAS_Local.viGangCar[3],"RomanB")
CDEBUG1LN(DEBUG_OJ_TAXI,"CREATE_AMBUSH_CARS completed")
ENDPROC
/// PURPOSE:
/// Creates and inserts the ambush gang members
PROC CREATE_AMBUSH_PEDS()
TAS_Local.piAmbush[0] = CREATE_PED( PEDTYPE_MISSION, TAS_Local.gangmodel[0], GET_AMBUSH_PED_SPAWN_POSITION(1), GET_AMBUSH_PED_SPAWN_HEADING(1)) // GET_GANGSTER_IDLE_WALK_POINTS(1))
TAS_Local.piAmbush[1] = CREATE_PED( PEDTYPE_MISSION, TAS_Local.gangmodel[0], GET_GANGSTER_WALK_POINTS(2), 0)
TAS_Local.piAmbush[2] = CREATE_PED( PEDTYPE_MISSION, TAS_Local.gangmodel[0], GET_AMBUSH_PED_SPAWN_POSITION(3), GET_AMBUSH_PED_SPAWN_HEADING(3) )
TAS_Local.piAmbush[3] = CREATE_PED( PEDTYPE_MISSION, TAS_Local.gangmodel[0], GET_AMBUSH_PED_SPAWN_POSITION(4), GET_AMBUSH_PED_SPAWN_HEADING(4) )
SET_PED_CONFIG_FLAG(TAS_Local.piAmbush[1], PCF_AllowMedicsToAttend, TRUE)
piGangsterGirls[0] = CREATE_PED( PEDTYPE_MISSION, TAS_Local.gangmodel[1], GET_AMBUSH_PED_SPAWN_POSITION(5), GET_AMBUSH_PED_SPAWN_HEADING(5) )
piGangsterGirls[1] = CREATE_PED( PEDTYPE_MISSION, TAS_Local.gangmodel[1], GET_AMBUSH_PED_SPAWN_POSITION(6), GET_AMBUSH_PED_SPAWN_HEADING(6) )
SET_PED_CAN_BE_TARGETTED(piGangsterGirls[0] , FALSE)
SET_PED_CAN_BE_TARGETTED(piGangsterGirls[1] , FALSE)
IF NOT IS_ENTITY_DEAD(TAS_Local.piAmbush[0])
SET_PED_COMPONENT_VARIATION(TAS_Local.piAmbush[0], INT_TO_ENUM(PED_COMPONENT,0), 1, 1, 0) //(head)
SET_PED_COMPONENT_VARIATION(TAS_Local.piAmbush[0], INT_TO_ENUM(PED_COMPONENT,3), 0, 5, 0) //(uppr)
SET_PED_COMPONENT_VARIATION(TAS_Local.piAmbush[0], INT_TO_ENUM(PED_COMPONENT,4), 0, 2, 0) //(lowr)
SET_PED_COMPONENT_VARIATION(TAS_Local.piAmbush[0], INT_TO_ENUM(PED_COMPONENT,10), 0, 0, 0) //(decl)
ENDIF
IF NOT IS_ENTITY_DEAD(TAS_Local.piAmbush[1])
SET_PED_COMPONENT_VARIATION(TAS_Local.piAmbush[1], INT_TO_ENUM(PED_COMPONENT,0), 0, 0, 0) //(head)
SET_PED_COMPONENT_VARIATION(TAS_Local.piAmbush[1], INT_TO_ENUM(PED_COMPONENT,3), 0, 0, 0) //(uppr)
SET_PED_COMPONENT_VARIATION(TAS_Local.piAmbush[1], INT_TO_ENUM(PED_COMPONENT,4), 1, 0, 0) //(lowr)
SET_PED_COMPONENT_VARIATION(TAS_Local.piAmbush[1], INT_TO_ENUM(PED_COMPONENT,10), 0, 1, 0) //(decl)
ENDIF
IF NOT IS_ENTITY_DEAD(TAS_Local.piAmbush[2])
SET_PED_COMPONENT_VARIATION(TAS_Local.piAmbush[2], INT_TO_ENUM(PED_COMPONENT,0), 1, 0, 0) //(head)
SET_PED_COMPONENT_VARIATION(TAS_Local.piAmbush[2], INT_TO_ENUM(PED_COMPONENT,3), 1, 0, 0) //(uppr)
SET_PED_COMPONENT_VARIATION(TAS_Local.piAmbush[2], INT_TO_ENUM(PED_COMPONENT,4), 1, 2, 0) //(lowr)
SET_PED_COMPONENT_VARIATION(TAS_Local.piAmbush[2], INT_TO_ENUM(PED_COMPONENT,10), 1, 0, 0) //(decl)
ENDIF
IF NOT IS_ENTITY_DEAD(TAS_Local.piAmbush[3])
SET_PED_COMPONENT_VARIATION(TAS_Local.piAmbush[3], INT_TO_ENUM(PED_COMPONENT,0), 0, 2, 0) //(head)
SET_PED_COMPONENT_VARIATION(TAS_Local.piAmbush[3], INT_TO_ENUM(PED_COMPONENT,3), 1, 1, 0) //(uppr)
SET_PED_COMPONENT_VARIATION(TAS_Local.piAmbush[3], INT_TO_ENUM(PED_COMPONENT,4), 0, 2, 0) //(lowr)
SET_PED_COMPONENT_VARIATION(TAS_Local.piAmbush[3], INT_TO_ENUM(PED_COMPONENT,10), 1, 0, 0) //(decl)
ENDIF
// TAS_Local.piAmbush[4] = CREATE_PED( PEDTYPE_MISSION, TAS_Local.gangmodel[1], GET_AMBUSH_PED_SPAWN_POSITION(5), GET_AMBUSH_PED_SPAWN_HEADING(5) )
// TAS_Local.piAmbush[5] = CREATE_PED( PEDTYPE_MISSION, TAS_Local.gangmodel[1], GET_AMBUSH_PED_SPAWN_POSITION(6), GET_AMBUSH_PED_SPAWN_HEADING(6) )
// TAS_Local.piAmbush[6] = CREATE_PED( PEDTYPE_MISSION, TAS_Local.gangmodel[0], GET_AMBUSH_PED_SPAWN_POSITION(7), GET_AMBUSH_PED_SPAWN_HEADING(7) )
CDEBUG1LN(DEBUG_OJ_TAXI,"CREATE_AMBUSH_PEDS completed")
ENDPROC
/// PURPOSE:
/// Creates and inserts second wave of gang members
PROC CREATE_AMBUSH_SECOND_WAVE()
TAS_Local2.viGangCar[0] = CREATE_VEHICLE( TAS_Local2.modelName_GangCar[0], GET_AMBUSH_VEHICLE_SPAWN_POSITION2(1), GET_AMBUSH_VEHICLE_SPAWN_HEADING2(1) )
TAS_Local2.viGangCar[1] = CREATE_VEHICLE( TAS_Local2.modelName_GangCar[1], GET_AMBUSH_VEHICLE_SPAWN_POSITION2(2), GET_AMBUSH_VEHICLE_SPAWN_HEADING2(2) )
TAS_Local2.piAmbush[0] = CREATE_PED_INSIDE_VEHICLE(TAS_Local2.viGangCar[0], PEDTYPE_MISSION, TAS_Local2.gangmodel[0], VS_DRIVER)
TAS_Local2.piAmbush[1] = CREATE_PED_INSIDE_VEHICLE(TAS_Local2.viGangCar[0], PEDTYPE_MISSION, TAS_Local2.gangmodel[0], VS_FRONT_RIGHT)
TAS_Local2.piAmbush[2] = CREATE_PED_INSIDE_VEHICLE(TAS_Local2.viGangCar[1], PEDTYPE_MISSION, TAS_Local2.gangmodel[0], VS_DRIVER)
TAS_Local2.piAmbush[3] = CREATE_PED_INSIDE_VEHICLE(TAS_Local2.viGangCar[1], PEDTYPE_MISSION, TAS_Local2.gangmodel[0], VS_FRONT_RIGHT)
SET_VEHICLE_NUMBER_PLATE_TEXT(TAS_Local2.viGangCar[1],"LuisLopz")
ADD_PED_FOR_DIALOGUE(myTaxiData.tTaxiOJ_Convo, 6, TAS_Local2.piAmbush[0], "TaxiBruce")
SET_AMBIENT_VOICE_NAME(TAS_Local2.piAmbush[0], "TaxiBruce")
GIVE_WEAPON_TO_PED( TAS_Local2.piAmbush[0], WEAPONTYPE_SMG, 100)
GIVE_WEAPON_TO_PED( TAS_Local2.piAmbush[1], WEAPONTYPE_PISTOL, 100)
GIVE_WEAPON_TO_PED( TAS_Local2.piAmbush[2], WEAPONTYPE_SMG, 100)
GIVE_WEAPON_TO_PED( TAS_Local2.piAmbush[3], WEAPONTYPE_PISTOL, 100, TRUE )
INT i
FOR i = 0 TO 3
SET_PED_MONEY(TAS_Local2.piAmbush[i],GET_RANDOM_INT_IN_RANGE(50,100))
SET_PED_COMBAT_ATTRIBUTES(TAS_Local2.piAmbush[i], CA_DO_DRIVEBYS, TRUE)
SET_PED_COMBAT_ATTRIBUTES(TAS_Local2.piAmbush[i], CA_AGGRESSIVE, TRUE)
SET_PED_COMBAT_ATTRIBUTES(TAS_Local2.piAmbush[i], CA_USE_VEHICLE, FALSE)
SET_PED_COMBAT_ATTRIBUTES(TAS_Local2.piAmbush[i], CA_LEAVE_VEHICLES, TRUE)
SET_PED_COMBAT_ATTRIBUTES(TAS_Local2.piAmbush[i], CA_OPEN_COMBAT_WHEN_DEFENSIVE_AREA_IS_REACHED, TRUE)
//Set peds to not influnece Wanted level
SET_PED_CONFIG_FLAG(TAS_Local2.piAmbush[i],PCF_DontInfluenceWantedLevel, TRUE)
SET_PED_SEEING_RANGE(TAS_Local2.piAmbush[i], 300.0)
SET_PED_HEARING_RANGE(TAS_Local2.piAmbush[i], 300.0)
SET_PED_ID_RANGE(TAS_Local2.piAmbush[i], 300.0)
// SET_PED_MAX_HEALTH( TAS_Local2.piAmbush[i], 25 )
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(TAS_Local2.piAmbush[i], TRUE)
SET_PED_RELATIONSHIP_GROUP_HASH( TAS_Local2.piAmbush[i], relPursuers )
SET_PED_ACCURACY(TAS_Local2.piAmbush[i], 50)
// TASK_STAND_STILL( TAS_Local.piAmbush[i], -1 )
ENDFOR
ENDPROC
/// PURPOSE:
/// Initializes the ambush cars. Currently just opens their trunks.
PROC INITIALIZE_AMBUSH_CARS()
//SET_VEHICLE_DOOR_OPEN( TAS_Local.viCar1, SC_DOOR_BOOT ) //commenting out because vans don't have boots
//SET_VEHICLE_DOOR_OPEN( TAS_Local.viCar2, SC_DOOR_BOOT ) //commenting out because vans don't have boots
SET_VEHICLE_DOOR_OPEN( TAS_Local.viGangCar[2], SC_DOOR_BOOT )
SET_VEHICLE_DOOR_OPEN( TAS_Local.viGangCar[3], SC_DOOR_BOOT )
CDEBUG1LN(DEBUG_OJ_TAXI,"INITIALIZE_AMBUSH_CARS completed")
ENDPROC
/// PURPOSE:
/// Places various props and cover points for end scene
PROC CREATE_AMBUSH_OBJECTS()
// oiBoxPiles[0] = CREATE_OBJECT (mBoxPile, << 208.3600, -3329.1101, 4.7800 >>)
// SET_ENTITY_COORDS (oiBoxPiles[0], << 208.3600, -3329.1101, 4.7800 >>)
// SET_ENTITY_ROTATION (oiBoxPiles[0], << 0.0700, 0.0600, -3.3200 >>)
oiBoxPiles[0] = CREATE_OBJECT (mBoxPile, <<204.844513,-3333.998291,4.795367>>)
SET_ENTITY_COORDS (oiBoxPiles[0], <<204.844513,-3333.998291,4.795367>>)
SET_ENTITY_ROTATION (oiBoxPiles[0], <<-0.036243,-0.001240,91.560631>>)
oiBoxPiles[1] = CREATE_OBJECT (mBoxPile, << 212.6700, -3328.7700, 4.7900 >>)
SET_ENTITY_COORDS (oiBoxPiles[1], << 212.6700, -3328.7700, 4.7900 >>)
SET_ENTITY_ROTATION (oiBoxPiles[1], << -0.0400, -0.0100, 86.3600 >>)
oiBoxPiles[2] = CREATE_OBJECT (mBoxPile, << 204.8248, -3328.6311, 4.7915 >>)
SET_ENTITY_COORDS (oiBoxPiles[2], << 204.8248, -3328.6311, 4.7915 >>)
SET_ENTITY_ROTATION (oiBoxPiles[2], << -0.0027, -0.0374, 0.1414 >>)
oiRegBox = CREATE_OBJECT (mRegularBox, << 214.2505, -3314.6729, 4.7883 >>)
SET_ENTITY_COORDS (oiRegBox, << 214.2505, -3314.6729, 4.7883 >>)
SET_ENTITY_ROTATION (oiRegBox, << 0.0, 0.0, -17.3990 >>)
//JD - 5/9/12 - For some reason mExpBarrel is loading commenting out for now since it's not a critical prop
IF HAS_MODEL_LOADED(mExpBarrel)
oiExpBarrel = CREATE_OBJECT (mExpBarrel, << 220.7266, -3320.0015, 5.2749 >>)
SET_ENTITY_COORDS (oiExpBarrel, << 220.7266, -3320.0015, 5.2749 >>)
SET_ENTITY_ROTATION (oiExpBarrel, <<0, 0, 0>>)
ENDIF
ENDPROC
/// PURPOSE:
/// Initializes the ambush gang member peds with prelim data and and tasks them to just stand there.
PROC INITIALIZE_AMBUSH_PEDS()
INT i = 0
// GIVE_WEAPON_TO_PED( TAS_Local.piAmbush[0], WEAPONTYPE_ASSAULTRIFLE, 100)
// GIVE_WEAPON_TO_PED( TAS_Local.piAmbush[1], WEAPONTYPE_PISTOL, 100)
// GIVE_WEAPON_TO_PED( TAS_Local.piAmbush[2], WEAPONTYPE_ASSAULTRIFLE, 100)
// GIVE_WEAPON_TO_PED( TAS_Local.piAmbush[3], WEAPONTYPE_PISTOL, 100)
ADD_PED_FOR_DIALOGUE(myTaxiData.tTaxiOJ_Convo,4,TAS_Local.piAmbush[1],"TaxiDom")
ADD_PED_FOR_DIALOGUE(myTaxiData.tTaxiOJ_Convo,5,TAS_Local.piAmbush[3],"TaxiGangM")
SET_AMBIENT_VOICE_NAME(TAS_Local.piAmbush[1], "TaxiDom")
SET_AMBIENT_VOICE_NAME(TAS_Local.piAmbush[3], "TaxiGangM")
// first wave of gangster dudes
FOR i = 0 TO 3
SET_PED_MONEY(TAS_Local.piAmbush[i],GET_RANDOM_INT_IN_RANGE(20,50))
SET_PED_COMBAT_ATTRIBUTES(TAS_Local.piAmbush[i], CA_DO_DRIVEBYS, TRUE)
SET_PED_COMBAT_ATTRIBUTES(TAS_Local.piAmbush[i], CA_AGGRESSIVE, TRUE)
SET_PED_COMBAT_ATTRIBUTES(TAS_Local.piAmbush[i], CA_USE_VEHICLE, FALSE)
SET_PED_COMBAT_ATTRIBUTES(TAS_Local.piAmbush[i], CA_LEAVE_VEHICLES, TRUE)
SET_PED_COMBAT_ATTRIBUTES(TAS_Local.piAmbush[i], CA_OPEN_COMBAT_WHEN_DEFENSIVE_AREA_IS_REACHED, TRUE)
//Set peds to not influnece Wanted level
SET_PED_CONFIG_FLAG(TAS_Local.piAmbush[i],PCF_DontInfluenceWantedLevel, TRUE)
SET_PED_SEEING_RANGE(TAS_Local.piAmbush[i], 300.0)
SET_PED_HEARING_RANGE(TAS_Local.piAmbush[i], 300.0)
SET_PED_ID_RANGE(TAS_Local.piAmbush[i], 300.0)
// SET_PED_MAX_HEALTH( TAS_Local.piAmbush[i], 25 )
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(TAS_Local.piAmbush[i], FALSE)
//SET_PED_RELATIONSHIP_GROUP_HASH( TAS_Local.piAmbush[i], relPursuers )
SET_PED_ACCURACY(TAS_Local.piAmbush[i], kPedLowAccuracy)
ENDFOR
SET_PED_RELATIONSHIP_GROUP_HASH( TAS_Local.piAmbush[0], relPursuers )
SET_PED_RELATIONSHIP_GROUP_HASH( TAS_Local.piAmbush[1], relPursuers )
SET_PED_RELATIONSHIP_GROUP_HASH( TAS_Local.piAmbush[2], relPursuers )
SET_PED_RELATIONSHIP_GROUP_HASH( TAS_Local.piAmbush[3], relPursuers )
// gangster girls
FOR i = 0 TO 1
SET_PED_CONFIG_FLAG(piGangsterGirls[i],PCF_DontInfluenceWantedLevel, TRUE)
SET_PED_SEEING_RANGE(piGangsterGirls[i], 100.0)
SET_PED_HEARING_RANGE(piGangsterGirls[i], 100.0)
SET_PED_ID_RANGE(piGangsterGirls[i], 100.0)
// SET_PED_MAX_HEALTH( piGangsterGirls[i], 25 )
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(piGangsterGirls[i], TRUE)
// SET_PED_RELATIONSHIP_GROUP_HASH( piGangsterGirls[i], relPursuers )
ENDFOR
ADD_PED_FOR_DIALOGUE(myTaxiData.tTaxiOJ_Convo,7,piGangsterGirls[1],"TaxiGangGirl2")
ADD_PED_FOR_DIALOGUE(myTaxiData.tTaxiOJ_Convo,8,piGangsterGirls[0],"TaxiGangGirl1")
SET_AMBIENT_VOICE_NAME(piGangsterGirls[1], "TaxiGangGirl2")
SET_AMBIENT_VOICE_NAME(piGangsterGirls[0], "TaxiGangGirl1")
CDEBUG1LN(DEBUG_OJ_TAXI,"INITIALIZE_AMBUSH_PEDS completed")
ENDPROC
PROC DEFINE_AMBUSH_STRUCT()
INITIALIZE_TAS_LOCAL()
CDEBUG1LN(DEBUG_OJ_TAXI,"TAXI - Picked Shipyard ambush Location")
//Drop off pos: ShipYard
TAS_Local.DropOffPos = << 187.5257, -3320.1628, 4.6276 >>
ENDPROC
PROC DRAW_AMBUSH_LOCATIONS()
DRAW_DEBUG_TEXT("Drop off Pos", TAS_Local.DropOffPos)
DRAW_DEBUG_SPHERE(TAS_Local.DropOffPos, 1.0)
//
DRAW_DEBUG_TEXT("Big Car 1 Start", GET_AMBUSH_VEHICLE_SPAWN_POSITION( 1 ))
DRAW_DEBUG_SPHERE(GET_AMBUSH_VEHICLE_SPAWN_POSITION( 1 ), 1.0)
//
DRAW_DEBUG_TEXT("Big Car 2 Start", GET_AMBUSH_VEHICLE_SPAWN_POSITION( 2 ))
DRAW_DEBUG_SPHERE(GET_AMBUSH_VEHICLE_SPAWN_POSITION( 2 ), 1.0)
//
DRAW_DEBUG_TEXT("Small Car 1 Start", GET_AMBUSH_VEHICLE_SPAWN_POSITION( 3 ))
DRAW_DEBUG_SPHERE(GET_AMBUSH_VEHICLE_SPAWN_POSITION( 3 ), 1.0)
//
DRAW_DEBUG_TEXT("Small Car 2 Start", GET_AMBUSH_VEHICLE_SPAWN_POSITION( 4 ))
DRAW_DEBUG_SPHERE(GET_AMBUSH_VEHICLE_SPAWN_POSITION( 4 ), 1.0)
ENDPROC
PROC SET_RELATIONSHIP_BETWEEN_EVERYONE( RELATIONSHIP_TYPE relTyp )
SET_RELATIONSHIP_BETWEEN_GROUPS(relTyp, relPursuers, RELGROUPHASH_PLAYER)
SET_RELATIONSHIP_BETWEEN_GROUPS(relTyp, relPursuers, RELGROUPHASH_COP)
SET_RELATIONSHIP_BETWEEN_GROUPS(relTyp, RELGROUPHASH_COP, relPursuers)
ENDPROC
/// PURPOSE:
/// Initializes script variables
PROC INITIALIZE_SCRIPT_VARIABLES()
myTaxiData.vTaxiOJ_WarpPtPickup = << 107.3107, -1124.8654, 28.1980 >> //<< -292.2656, 250.1203, 87.7068 >>
myTaxiData.fTaxiOJ_WarpPtHeadingPickup = 88.9745 //279.13
myTaxiData.vTaxiOJ_WarpPtDropoff = << 195.7672, -2981.7319, 4.8916 >>
myTaxiData.fTaxiOJ_WarpPtHeadingDropoff = 173.6662
ADD_RELATIONSHIP_GROUP("TAXI_Pursuers", relPursuers)
SET_RELATIONSHIP_BETWEEN_EVERYONE( ACQUAINTANCE_TYPE_PED_LIKE )
TAXI_ODDJOB_GLOBAL_SETUP(myTaxiData,TXM_04_GOTYOURBACK)
// Set our initial state up. VIP missions don't start at TRS_FINDING_LOCATION.
myTaxiData.tTaxiOJ_RideState = TRS_INIT_STREAM
SET_TAXI_TIP_CUTOFFS(myTaxiData,CONST_TAXI_OJ_TIP_AVERAGE_CUTOFF,CONST_TAXI_OJ_TIP_AMAZING_CUTOFF)
DEFINE_AMBUSH_STRUCT()
#IF IS_DEBUG_BUILD
#IF DEBUG_iTurnOnAllDXDebug
ENABLE_ALL_DIALOGUE_DEBUG()
#ENDIF
taxiRideWidgets = START_WIDGET_GROUP("Taxi Ride - Got your back")
INIT_ODDJOB_TAXI_WIDGETS()
ADD_WIDGET_STRING("Debug Taxi Bonus")
ADD_WIDGET_BOOL("Terminator ",bDebugBonusTermintator)
ADD_WIDGET_BOOL("Restart Taxi Mission", bForceReset)
ADD_WIDGET_BOOL("Passenger Invincible", bPassengerInvincible)
STOP_WIDGET_GROUP()
#ENDIF
CDEBUG1LN(DEBUG_OJ_TAXI,"-----~~~~~-------------------------------~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~----")
CDEBUG1LN(DEBUG_OJ_TAXI,"-----~~~~~~~~~~~~~~~~ Oddjobs | Taxi | Got Your Back ~~~~~~~~~~~~~~~~----------")
CDEBUG1LN(DEBUG_OJ_TAXI,"-----~~~~~-------------------------------~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~----")
ENDPROC
#IF IS_DEBUG_BUILD
PROC PROCESS_WIDGETS()
UPDATE_TAXI_WIDGETS(myTaxiData,tTaxiOJ_DQ_Data)
IF bDebugBonusTermintator
sDebugString[0] = "Num Baddies Player Killed : "
sDebugString[0] += TAXI_UTILS_GET_STRING_FROM_INT_SP(iPlayerKilledCount)
sDebugString[0] += " /8"
DRAW_DEBUG_TEXT_2D(sDebugString[0],<<0.07,0.75,0.0>>)
//Show if bonus has been unlocked or not
IF iPlayerKilledCount < TAXI_CONST_NUM_TOTAL_ENEMIES
sDebugString[1]= "Terminator Bonus LOCKED "
DRAW_DEBUG_TEXT_2D(sDebugString[1],<<0.07,0.77,0.0>>,255,0,0)
ELSE
sDebugString[1]= "Terminator Bonus UnLOCKED "
DRAW_DEBUG_TEXT_2D(sDebugString[1],<<0.07,0.77,0.0>>)
ENDIF
ENDIF
IF bForceReset
DEFINE_AMBUSH_STRUCT()
REQUEST_TAXI_ODDJOB_GYB_STREAMS_STAGE_01()
myTaxiData.vTaxiOJDropoff = TAS_Local.DropOffPos
bForceReset = FALSE
bResetting = TRUE
ENDIF
IF bResetting
IF HAVE_TAXI_OJ_FC_STAGE_01_ASSETS_LOADED()
bResetting = FALSE
ENDIF
ENDIF
IF bPassengerInvincible
IF NOT IS_PED_INJURED(myTaxiData.piTaxiPassenger)
SET_ENTITY_INVINCIBLE(myTaxiData.piTaxiPassenger, TRUE)
ENDIF
bPassengerInvincible = FALSE
ENDIF
ENDPROC
#ENDIF
PROC TASK_ALL_INITIAL_ANIMS()
IF NOT IS_PED_INJURED(piGangsterGirls[0])
AND NOT IS_PED_INJURED(piGangsterGirls[0])
AND NOT IS_PED_INJURED(TAS_Local.piAmbush[3])
//IF NOT IS_SYNCHRONIZED_SCENE_RUNNING(iSideSceneId)
iSideSceneId = CREATE_SYNCHRONIZED_SCENE(scenePositionSide, sceneRotationSide)
SET_SYNCHRONIZED_SCENE_LOOPED(iSideSceneId,TRUE)
TASK_SYNCHRONIZED_SCENE(TAS_Local.piAmbush[3], iSideSceneId, sSyncSceneDict, "hooker_loop_a_biker_d", INSTANT_BLEND_IN, INSTANT_BLEND_OUT, SYNCED_SCENE_LOOP_WITHIN_SCENE)
TASK_SYNCHRONIZED_SCENE(piGangsterGirls[0], iSideSceneId, sSyncSceneDict, "hooker_loop_a_hooker_a", INSTANT_BLEND_IN, INSTANT_BLEND_OUT, SYNCED_SCENE_LOOP_WITHIN_SCENE)
TASK_SYNCHRONIZED_SCENE(piGangsterGirls[1], iSideSceneId, sSyncSceneDict, "hooker_loop_a_hooker_b", INSTANT_BLEND_IN, INSTANT_BLEND_OUT, SYNCED_SCENE_LOOP_WITHIN_SCENE)
//ENDIF
ENDIF
IF NOT IS_PED_INJURED(TAS_Local.piAmbush[0])
AND NOT IS_PED_INJURED(TAS_Local.piAmbush[1])
AND NOT IS_PED_INJURED(TAS_Local.piAmbush[2])
GIVE_WEAPON_TO_PED(TAS_Local.piAmbush[0], WEAPONTYPE_PISTOL, INFINITE_AMMO, TRUE)
//IF NOT IS_SYNCHRONIZED_SCENE_RUNNING(iMainSceneId)
iMainSceneId = CREATE_SYNCHRONIZED_SCENE(scenePositionMain, sceneRotationMain)
SET_SYNCHRONIZED_SCENE_LOOPED(iMainSceneId,TRUE)
TASK_SYNCHRONIZED_SCENE (TAS_Local.piAmbush[0], iMainSceneId, "oddjobs@taxi@argument", "idle_a_biker_a", INSTANT_BLEND_IN, INSTANT_BLEND_OUT )
TASK_SYNCHRONIZED_SCENE (TAS_Local.piAmbush[1], iMainSceneId, "oddjobs@taxi@argument", "idle_a_biker_b", INSTANT_BLEND_IN, INSTANT_BLEND_OUT )
TASK_SYNCHRONIZED_SCENE (TAS_Local.piAmbush[2], iMainSceneId, "oddjobs@taxi@argument", "idle_a_biker_c", INSTANT_BLEND_IN, INSTANT_BLEND_OUT )
CDEBUG1LN(DEBUG_OJ_TAXI,"main scene id initialised, set to ", iMainSceneId)
//ENDIF
ENDIF
ENDPROC
/// PURPOSE: Tasks all hostile peds to walk away.
///
/// PARAMS:
/// Leavers - Array of hostile peds.
PROC TASK_ALL_PEDS_TO_LEAVE(PED_INDEX &Leavers[])
INT i
REPEAT COUNT_OF(Leavers) i
IF NOT IS_PED_INJURED(Leavers[i])
SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(Leavers[i], FALSE)
SET_PED_COMBAT_ATTRIBUTES(Leavers[i], CA_DO_DRIVEBYS , FALSE)
SET_PED_COMBAT_ATTRIBUTES(Leavers[i], CA_USE_VEHICLE , FALSE)
SET_PED_COMBAT_ATTRIBUTES(Leavers[i], CA_LEAVE_VEHICLES, TRUE)
TASK_LEAVE_ANY_VEHICLE(Leavers[i])
ENDIF
ENDREPEAT
ENDPROC
/// PURPOSE: Tasks an array of peds to attack hated targets. Also re-aligns ped relationships.
///
/// PARAMS:
/// Fighters - Array of soon to be hostile peds.
PROC TASK_ALL_PEDS_TO_FIGHT(PED_INDEX &Fighters[])
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_HATE, relPursuers, RELGROUPHASH_PLAYER)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_HATE, relPursuers, myTaxiData.relPassenger)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_HATE, relPursuers, RELGROUPHASH_COP)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_HATE, RELGROUPHASH_COP, relPursuers)
INT i
WEAPON_TYPE currentWeapon
REPEAT COUNT_OF(Fighters) i
IF NOT IS_PED_INJURED(Fighters[i])
CLEAR_PED_TASKS( Fighters[i] )
GET_CURRENT_PED_WEAPON(Fighters[i], currentWeapon)
IF (currentWeapon = WEAPONTYPE_UNARMED)
GIVE_WEAPON_TO_PED(Fighters[i], WEAPONTYPE_PISTOL, INFINITE_AMMO)
ENDIF
// SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(TAS_Local2.piAmbush[i], FALSE)
SET_PED_ACCURACY(Fighters[i], 30)
TASK_COMBAT_HATED_TARGETS_AROUND_PED(Fighters[i], 1000.0)
SET_PED_KEEP_TASK(Fighters[i], TRUE)
ENDIF
ENDREPEAT
ENDPROC
#IF IS_DEBUG_BUILD
PROC KILL_ALL_TAXI_OJ_ENEMIES(PED_INDEX &Fighters[])
INT iIterator
REPEAT COUNT_OF(Fighters) iIterator
IF NOT IS_ENTITY_DEAD(Fighters[iIterator])
SET_ENTITY_HEALTH(Fighters[iIterator],2)
ENDIF
ENDREPEAT
ENDPROC
#ENDIF
PROC TASK_PEDS_TO_FLEE (PED_INDEX &Runners[])
INT i
REPEAT COUNT_OF(Runners) i
IF NOT IS_PED_INJURED(Runners[i])
CLEAR_PED_TASKS_IMMEDIATELY( Runners[i] )
SET_PED_FLEE_ATTRIBUTES(Runners[i], FA_CAN_SCREAM|FA_USE_COVER|FA_PREFER_PAVEMENTS, TRUE)
CLEAR_SEQUENCE_TASK(seqIndexTaxiAIAction)
OPEN_SEQUENCE_TASK(seqIndexTaxiAIAction)
TASK_STAND_STILL(NULL, GET_RANDOM_INT_IN_RANGE(1, 1000))
TASK_SMART_FLEE_PED(NULL, myTaxiData.piTaxiPassenger, fGoodFleeDistance, -1)
CLOSE_SEQUENCE_TASK(seqIndexTaxiAIAction)
TASK_PERFORM_SEQUENCE(Runners[i], seqIndexTaxiAIAction)
SET_PED_KEEP_TASK(Runners[i], TRUE)
CDEBUG1LN(DEBUG_OJ_TAXI,"stripper set to flee")
ENDIF
ENDREPEAT
ENDPROC
/// PURPOSE: Sets the accuracy of a bunch of peds a bit higher
///
/// PARAMS:
/// Fighters - Array of hostile peds
PROC LET_PEDS_HIT_THINGS(PED_INDEX &Fighters[])
INT i
REPEAT COUNT_OF(Fighters) i
IF NOT IS_PED_INJURED(Fighters[i])
SET_PED_ACCURACY(Fighters[i], kPedNotSoLowAccuracy)
ENDIF
ENDREPEAT
ENDPROC
FUNC BOOL IS_ANY_AMBUSH_PED_OUT_OF_VEHICLE(PED_INDEX &Fighters[])
INT i
REPEAT COUNT_OF(Fighters) i
IF NOT IS_PED_INJURED(Fighters[i])
IF NOT IS_PED_IN_ANY_VEHICLE(Fighters[i])
RETURN TRUE
ENDIF
ENDIF
ENDREPEAT
RETURN FALSE
ENDFUNC
/// PURPOSE: Blips all peds in an array hostile
///
/// PARAMS:
/// Fighters - Array of hostile peds
/// Blips - Array of blips to be stored
PROC BLIP_ALL_PEDS(PED_INDEX &Fighters[], BLIP_INDEX &Blips[])
INT i
REPEAT COUNT_OF(Blips) i
IF NOT IS_PED_INJURED(Fighters[i])
IF NOT DOES_BLIP_EXIST(Blips[i])
Blips[i] = CREATE_BLIP_ON_ENTITY(Fighters[i],FALSE)
CDEBUG1LN(DEBUG_OJ_TAXI,"[AMBUSH] [BLIP] - Blipped baddie" )
ENDIF
ENDIF
ENDREPEAT
ENDPROC
// hard coded for the globals we have here
PROC BLIP_SECOND_WAVE_CARS()
IF NOT DOES_BLIP_EXIST(TAS_Local2.blipVehAmbush[0])
AND NOT DOES_BLIP_EXIST(TAS_Local2.blipVehAmbush[1])
TAS_Local2.blipVehAmbush[0] = CREATE_BLIP_ON_ENTITY(TAS_Local2.viGangCar[0], FALSE)
TAS_Local2.blipVehAmbush[1] = CREATE_BLIP_ON_ENTITY(TAS_Local2.viGangCar[1], FALSE)
ENDIF
ENDPROC
// hard coded for the globals we have here
PROC REMOVE_SECOND_WAVE_CAR_BLIPS()
IF DOES_BLIP_EXIST(TAS_Local2.blipVehAmbush[0])
REMOVE_BLIP(TAS_Local2.blipVehAmbush[0])
ENDIF
IF DOES_BLIP_EXIST(TAS_Local2.blipVehAmbush[1])
REMOVE_BLIP(TAS_Local2.blipVehAmbush[1])
ENDIF
ENDPROC
PROC PRINT_CAR_UPDATE(STRING Carname, STRING UpdateString)
CDEBUG1LN(DEBUG_OJ_TAXI,"Carname - ","",Carname,"", " - TAXI - ", updateString )
ENDPROC
/// PURPOSE: Sets variables for the passenger to go aggressive. Also tasks him into combat.
///
PROC SET_PASSENGER_IN_COMBAT()
IF DOES_ENTITY_EXIST(myTaxiData.piTaxiPassenger)
IF NOT IS_PED_INJURED(myTaxiData.piTaxiPassenger)
IF NOT DOES_BLIP_EXIST(myTaxiData.blipTaxiPassenger)
myTaxiData.blipTaxiPassenger = CREATE_BLIP_ON_ENTITY(myTaxiData.piTaxiPassenger)
ENDIF
WEAPON_TYPE currentWeapon
GET_CURRENT_PED_WEAPON(myTaxiData.piTaxiPassenger, currentWeapon)
IF (currentWeapon = WEAPONTYPE_UNARMED)
GIVE_WEAPON_TO_PED(myTaxiData.piTaxiPassenger, WEAPONTYPE_COMBATPISTOL, 100)
ENDIF
//SET_PED_COMBAT_ATTRIBUTES(myTaxiData.piTaxiPassenger, CA_DO_DRIVEBYS, FALSE)
//SET_PED_COMBAT_ATTRIBUTES(myTaxiData.piTaxiPassenger, CA_USE_VEHICLE, FALSE)
SET_PED_COMBAT_ATTRIBUTES(myTaxiData.piTaxiPassenger, CA_LEAVE_VEHICLES, TRUE)
SET_PED_COMBAT_ATTRIBUTES(myTaxiData.piTaxiPassenger, CA_AGGRESSIVE, FALSE)
SET_PED_COMBAT_ATTRIBUTES(myTaxiData.piTaxiPassenger, CA_BLIND_FIRE_IN_COVER, TRUE)
SET_PED_COMBAT_ATTRIBUTES(myTaxiData.piTaxiPassenger, CA_USE_COVER, TRUE)
SET_PED_COMBAT_ATTRIBUTES(myTaxiData.piTaxiPassenger, CA_USE_PROXIMITY_FIRING_RATE, TRUE)
SET_PED_COMBAT_ATTRIBUTES(myTaxiData.piTaxiPassenger, CA_CAN_USE_PEEKING_VARIATIONS, TRUE)
//SET_PED_COMBAT_ATTRIBUTES(myTaxiData.piTaxiPassenger, CA_JUST_SEEK_COVER, TRUE)
SET_PED_COMBAT_ATTRIBUTES(myTaxiData.piTaxiPassenger, CA_OPEN_COMBAT_WHEN_DEFENSIVE_AREA_IS_REACHED, TRUE)
SET_PED_SEEING_RANGE(myTaxiData.piTaxiPassenger, 300.0)
SET_PED_HEARING_RANGE(myTaxiData.piTaxiPassenger, 300.0)
SET_PED_ID_RANGE(myTaxiData.piTaxiPassenger, 300.0)
SET_PED_COMBAT_MOVEMENT(myTaxiData.piTaxiPassenger, CM_DEFENSIVE)
SET_PED_CAN_EVASIVE_DIVE (myTaxiData.piTaxiPassenger, TRUE)
SET_PED_ACCURACY(myTaxiData.piTaxiPassenger, 80)
SET_PED_COMBAT_RANGE(myTaxiData.piTaxiPassenger, CR_FAR)
SET_PED_ANGLED_DEFENSIVE_AREA(myTaxiData.piTaxiPassenger, <<203.7838, -3326.7012, 4.7901>>, <<204.2880, -3334.8457,6.8830>>, 5.5)
// GIVE_WEAPON_TO_PED(myTaxiData.piTaxiPassenger, WEAPONTYPE_COMBATPISTOL, 200, FALSE)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_HATE, relPursuers, myTaxiData.relPassenger)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_HATE, myTaxiData.relPassenger, relPursuers)
CLEAR_SEQUENCE_TASK(seqIndexTaxiAIAction)
OPEN_SEQUENCE_TASK(seqIndexTaxiAIAction)
TASK_SEEK_COVER_FROM_POS( NULL, <<201.9434, -3324.0291, 4.7888>>, 5000, TRUE)
TASK_COMBAT_HATED_TARGETS_AROUND_PED( NULL,200.0)
CLOSE_SEQUENCE_TASK(seqIndexTaxiAIAction)
TASK_PERFORM_SEQUENCE(myTaxiData.piTaxiPassenger, seqIndexTaxiAIAction)
SET_PED_KEEP_TASK(myTaxiData.piTaxiPassenger, TRUE)
ENDIF
ENDIF
ENDPROC
/// PURPOSE: Tasks the player to walk to gang members and look like he's saying stuff
///
PROC TASK_PASSENGER_TO_WALK()
IF DOES_ENTITY_EXIST(myTaxiData.piTaxiPassenger)
IF NOT IS_PED_INJURED(myTaxiData.piTaxiPassenger)
SET_PED_RELATIONSHIP_GROUP_HASH( myTaxiData.piTaxiPassenger, myTaxiData.relPassenger )
TASK_LOOK_AT_ENTITY(myTaxiData.piTaxiPassenger, TAS_Local.piAmbush[1], INFINITE_TASK_TIME, SLF_WHILE_NOT_IN_FOV, SLF_LOOKAT_VERY_HIGH)
CLEAR_SEQUENCE_TASK(seqIndexTaxiAIAction)
OPEN_SEQUENCE_TASK(seqIndexTaxiAIAction)
TASK_LEAVE_ANY_VEHICLE(NULL, 0, ECF_USE_RIGHT_ENTRY)
//TASK_GO_TO_COORD_ANY_MEANS( NULL, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(myTaxiData.viTaxi, << 0.0, 2.0, 0.0 >>), PEDMOVEBLENDRATIO_WALK, NULL )
//TASK_FOLLOW_NAV_MESH_TO_COORD( NULL, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(myTaxiData.viTaxi, << 1.1, 2.0, 0.0 >>), PEDMOVEBLENDRATIO_WALK )
TASK_FOLLOW_NAV_MESH_TO_COORD( NULL, vPassengerWalkPoint, PEDMOVEBLENDRATIO_WALK, DEFAULT_TIME_BEFORE_WARP + 10000 )
//TASK_CLEAR_LOOK_AT(NULL)
TASK_ACHIEVE_HEADING(NULL, -30.30)
TASK_CLEAR_LOOK_AT(NULL)
//TASK_TURN_PED_TO_FACE_ENTITY(NULL, TAS_Local.piAmbush[1])
CLOSE_SEQUENCE_TASK(seqIndexTaxiAIAction)
TASK_PERFORM_SEQUENCE(myTaxiData.piTaxiPassenger, seqIndexTaxiAIAction)
ENDIF
ENDIF
ENDPROC
PROC TASK_GANGSTER_TO_WALK(PED_INDEX & piGangster, INT iDest, INT iDelayStart = 1, INT iDelayEnd = 2000)
IF DOES_ENTITY_EXIST(piGangster)
IF NOT IS_PED_INJURED(piGangster)
CLEAR_SEQUENCE_TASK(seqIndexTaxiAIAction)
OPEN_SEQUENCE_TASK(seqIndexTaxiAIAction)
TASK_STAND_STILL(NULL, GET_RANDOM_INT_IN_RANGE(iDelayStart, iDelayEnd))
TASK_GO_TO_COORD_ANY_MEANS( NULL, GET_GANGSTER_WALK_POINTS(iDest+1), 1.0, NULL )
TASK_TURN_PED_TO_FACE_ENTITY(NULL, myTaxiData.piTaxiPassenger, -1)
CLOSE_SEQUENCE_TASK(seqIndexTaxiAIAction)
TASK_PERFORM_SEQUENCE(piGangster, seqIndexTaxiAIAction)
SET_PED_KEEP_TASK(piGangster, TRUE)
ENDIF
ENDIF
ENDPROC
PROC TASK_SECOND_WAVE_CAR_RECS()
IF IS_VEHICLE_DRIVEABLE(TAS_Local2.viGangCar[0])
START_PLAYBACK_RECORDED_VEHICLE_WITH_FLAGS(TAS_Local2.viGangCar[0], iTaxiGYBCarRecFileNo, GET_TAXI_OJ_GYB_VEHICLE_RECORDING_NAME(0),ENUM_TO_INT(TURN_ON_ENGINE_INSTANTLY | SWITCH_ON_ANY_VEHICLE_IMPACT),1000)
SET_PLAYBACK_SPEED(TAS_Local2.viGangCar[0], 1)
ENDIF
IF IS_VEHICLE_DRIVEABLE(TAS_Local2.viGangCar[1])
START_PLAYBACK_RECORDED_VEHICLE_WITH_FLAGS(TAS_Local2.viGangCar[1], iTaxiGYBCarRecFileNo, GET_TAXI_OJ_GYB_VEHICLE_RECORDING_NAME(1),ENUM_TO_INT(TURN_ON_ENGINE_INSTANTLY | SWITCH_ON_ANY_VEHICLE_IMPACT),1000)
SET_PLAYBACK_SPEED(TAS_Local2.viGangCar[1], 1)
ENDIF
ENDPROC
ENUM TAXI_GYB_CAMSTATUS
TAXIGYB_CAM1,
TAXIGYB_CAM2,
TAXIGYB_CAM3,
TAXIGYB_CAM4,
TAXIGYB_CAM5,
TAXIGYB_CAM6,
TAXIGYB_INACTIVE
ENDENUM
TAXI_GYB_CAMSTATUS eTaxiGYBCamStatus = TAXIGYB_CAM1 //TAXIGYB_CAM2
INT iCamTimer
INT iCamEnableTimer
BOOL bRStickRight
BOOL bRStickLeft
FUNC BOOL TAXI_CAM_RIGHT()
FLOAT fRightX
fRightX = GET_CONTROL_NORMAL(FRONTEND_CONTROL, INPUT_SCRIPT_RIGHT_AXIS_X)
IF fRightX > 0.8
IF NOT bRStickRight
IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("TAXI_VIEW2")
CLEAR_HELP()
ENDIF
bRStickRight = TRUE
RETURN TRUE
ENDIF
ELSE
IF bRStickRight
bRStickRight = FALSE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL TAXI_CAM_LEFT()
FLOAT fRightX
fRightX = GET_CONTROL_NORMAL(FRONTEND_CONTROL, INPUT_SCRIPT_RIGHT_AXIS_X)
IF fRightX < -0.8
IF NOT bRStickLeft
IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("TAXI_VIEW2")
CLEAR_HELP()
ENDIF
bRStickLeft = TRUE
RETURN TRUE
ENDIF
ELSE
IF bRStickLeft
bRStickLeft = FALSE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
PROC ACTIVATE_GYB_CAM(VECTOR vCamPos, VECTOR vCamRot, FLOAT fFOV)
IF NOT DOES_CAM_EXIST(myTaxiData.camTaxi)
CREATE_TAXI_OJ_CAM(myTaxiData.camTaxi,<<0,0,0>>, <<0,0,0>>, fFOV)
ENDIF
SET_CAM_COORD(myTaxiData.camTaxi, vCamPos)
SET_CAM_ROT(myTaxiData.camTaxi, vCamRot)
SHAKE_CAM(myTaxiData.camTaxi, "HAND_SHAKE", 0.3)
ENDPROC
PROC TAXI_HANDLE_CINEMATIC_CAM()
VECTOR vCamPos
VECTOR vCamRot
FLOAT fFOV
TEXT_LABEL_23 sCamDialogueLine
sCamDialogueLine = GET_CURRENTLY_PLAYING_STANDARD_CONVERSATION_LABEL()
// ***** NEW CAM PLAN *****
// first cam - first two lines
// second cam - in front of the side scene, switch on this line:
// "txm12_ig1c_3" oh he looks really pissed
// third cam - delay a couple of seconds and then go behind bikers
// fourth cam - diagonal view, switch on this line:
// "txm12_deal1_3" i told you, don't worry about kelly
// fifth cam - behind bikers again, switch on this line:
// "txm12_deal1_5"
// sixth cam - side view, switch on this line
// "txm12_deal1_7"
IF m_AmbushState < AMB_COMBAT
AND GET_PLAYER_DISTANCE_FROM_ENTITY(myTaxiData.piTaxiPassenger) < 50
AND myTaxiData.tTaxiOJ_RideState = TRS_DROPPING_OFF
AND IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
AND NOT bCutToGamePlay
IF IS_CONTROL_JUST_PRESSED(PLAYER_CONTROL, INPUT_VEH_CIN_CAM)
IF DOES_CAM_EXIST(myTaxiData.camTaxi)
IF NOT IS_CAM_ACTIVE(myTaxiData.camTaxi)
CDEBUG1LN(DEBUG_OJ_TAXI,"enabling cutscene cam")
iCamEnableTimer = GET_GAME_TIMER()
SET_CAM_ACTIVE(myTaxiData.camTaxi, TRUE)
RENDER_SCRIPT_CAMS(TRUE, FALSE)
ENDIF
ENDIF
ENDIF
ENDIF
IF m_AmbushState < AMB_COMBAT
AND GET_PLAYER_DISTANCE_FROM_ENTITY(myTaxiData.piTaxiPassenger) < 50
AND myTaxiData.tTaxiOJ_RideState = TRS_DROPPING_OFF
AND IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
AND NOT bCutToGamePlay
IF bEnableBonusCam
SWITCH eTaxiGYBCamStatus
CASE TAXIGYB_CAM1
CDEBUG1LN(DEBUG_OJ_TAXI,"reached cutscene cam1")
iCamTimer = GET_GAME_TIMER()
vCamPos = <<223.3000, -3326.3000, 6.4000>> //<<188.9051, -3323.9082, 6.0142>>
vCamRot = <<-4.1000, -0.0000, 78.0000>> //<<-0.3250, 0.0006, -92.2181>>
fFOV = 24.3 //24.45
ACTIVATE_GYB_CAM(vCamPos, vCamRot, fFOV)
eTaxiGYBCamStatus = TAXIGYB_CAM2
BREAK
CASE TAXIGYB_CAM2
IF ARE_STRINGS_EQUAL("txm12_ig1c_3", sCamDialogueLine)
CDEBUG1LN(DEBUG_OJ_TAXI,"reached cutscene cam2")
iCamTimer = GET_GAME_TIMER()
vCamPos = <<211.1000, -3326.1001, 5.8000>> //<<225.2906, -3328.0032, 5.8274>> //<<226.5799, -3330.8562, 6.2288>>
vCamRot = <<4.1000, 0.0000, -81.2000>> //<<0.8983, -0.0169, 73.7207>> //<<-1.2353, 0.0016, 64.0858>>
fFOV = 24.3000 //19.0028 //21.7
ACTIVATE_GYB_CAM(vCamPos, vCamRot, fFOV)
eTaxiGYBCamStatus = TAXIGYB_CAM3
ENDIF
BREAK
CASE TAXIGYB_CAM3
IF (GET_GAME_TIMER() - iCamTimer) > 5000
CDEBUG1LN(DEBUG_OJ_TAXI,"reached cutscene cam3")
iCamTimer = GET_GAME_TIMER()
vCamPos = <<202.0472, -3314.8298, 5.9369>>
vCamRot = <<-1.9358, -0.0169, 169.6817>>
fFOV = 20.9113
ACTIVATE_GYB_CAM(vCamPos, vCamRot, fFOV)
eTaxiGYBCamStatus = TAXIGYB_CAM4
ENDIF
BREAK
CASE TAXIGYB_CAM4
IF ARE_STRINGS_EQUAL("txm12_deal1_3", sCamDialogueLine)
CDEBUG1LN(DEBUG_OJ_TAXI,"reached cutscene cam4")
iCamTimer = GET_GAME_TIMER()
vCamPos = <<194.7488, -3328.1011, 5.9471>>
vCamRot = <<-0.3369, -0.0169, -55.7257>>
fFOV = 24.5237
ACTIVATE_GYB_CAM(vCamPos, vCamRot, fFOV)
eTaxiGYBCamStatus = TAXIGYB_CAM5
ENDIF
BREAK
CASE TAXIGYB_CAM5
IF ARE_STRINGS_EQUAL("txm12_deal1_5", sCamDialogueLine)
CDEBUG1LN(DEBUG_OJ_TAXI,"reached cutscene cam5")
iCamTimer = GET_GAME_TIMER()
vCamPos = <<202.0472, -3314.8298, 5.9369>>
vCamRot = <<-1.9358, -0.0169, 169.6817>>
fFOV = 20.9113
ACTIVATE_GYB_CAM(vCamPos, vCamRot, fFOV)
eTaxiGYBCamStatus = TAXIGYB_CAM6
ENDIF
BREAK
CASE TAXIGYB_CAM6
IF ARE_STRINGS_EQUAL("txm12_deal1_7", sCamDialogueLine)
CDEBUG1LN(DEBUG_OJ_TAXI,"reached cutscene cam6")
iCamTimer = GET_GAME_TIMER()
vCamPos = <<194.1000, -3324.8999, 6.2000>> //<<211.1000, -3326.1001, 5.8000>>
vCamRot = <<-4.6000, 0.0000, -83.1000>> //<<4.1000, 0.0000, -81.2000>>
fFOV = 29.0 //24.3000
ACTIVATE_GYB_CAM(vCamPos, vCamRot, fFOV)
eTaxiGYBCamStatus = TAXIGYB_INACTIVE
ENDIF
BREAK
ENDSWITCH
IF IS_CONTROL_JUST_PRESSED(PLAYER_CONTROL, INPUT_VEH_CIN_CAM)
AND (GET_GAME_TIMER() - iCamEnableTimer) > 500
CDEBUG1LN(DEBUG_OJ_TAXI,"disabling cutscene cam")
IF DOES_CAM_EXIST(myTaxiData.camTaxi)
SET_CAM_ACTIVE(myTaxiData.camTaxi, FALSE)
RENDER_SCRIPT_CAMS(FALSE, FALSE)
ENDIF
ENDIF
ENDIF
ELIF bEnableBonusCam
IF NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
CDEBUG1LN(DEBUG_OJ_TAXI,"TAXI_HANDLE_CINEMATIC_CAM: Player got out of the car, disabling cutscene cam")
IF DOES_CAM_EXIST(myTaxiData.camTaxi)
IF IS_CAM_ACTIVE(myTaxiData.camTaxi)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0)
SET_CAM_ACTIVE(myTaxiData.camTaxi, FALSE)
RENDER_SCRIPT_CAMS(FALSE, FALSE)
ENDIF
ENDIF
ENDIF
IF bCutToGamePlay
IF NOT IS_TIMER_STARTED(pulseTimer)
IF IS_PLAYER_IN_FIRST_PERSON_CAMERA()
AND IS_CAM_ACTIVE(myTaxiData.camTaxi)
IF NOT bPulseTriggered
CDEBUG1LN(DEBUG_OJ_TAXI,"TAXI_HANDLE_CINEMATIC_CAM: triggering pulse")
ANIMPOSTFX_PLAY("CamPushInNeutral", 0, FALSE)
PLAY_SOUND_FRONTEND(-1, "1st_Person_Transition", "PLAYER_SWITCH_CUSTOM_SOUNDSET")
bPulseTriggered = TRUE
ENDIF
ENDIF
RESTART_TIMER_NOW(pulseTimer)
ELIF GET_TIMER_IN_SECONDS(pulseTimer) > 0.3
IF DOES_CAM_EXIST(myTaxiData.camTaxi)
IF IS_CAM_ACTIVE(myTaxiData.camTaxi)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0)
CDEBUG1LN(DEBUG_OJ_TAXI,"TAXI_HANDLE_CINEMATIC_CAM: cutting to gameplay")
SET_CAM_ACTIVE(myTaxiData.camTaxi, FALSE)
RENDER_SCRIPT_CAMS(FALSE, FALSE)
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
SET_CINEMATIC_BUTTON_ACTIVE(TRUE)
ENDIF
ENDPROC
/* __ __
/\ \ /\ \
__ ___ ___ \ \ \____ __ __ ____\ \ \___
/'__`\ /' __` __`\\ \ '__`\ /\ \/\ \ /',__\\ \ _ `\
/\ \L\.\_ /\ \/\ \/\ \\ \ \L\ \\ \ \_\ \/\__, `\\ \ \ \ \
\ \__/.\_\\ \_\ \_\ \_\\ \_,__/ \ \____/\/\____/ \ \_\ \_\
\/__/\/_/ \/_/\/_/\/_/ \/___/ \/___/ \/___/ \/_/\/_/
*/
/// PURPOSE: This is a state machine driven update function.
/// 1) Player drops off passenger. Player sees a bunch of gang members milling about.
/// 2) Passenger goes to talk to gang members.
/// 3) Passenger's discussion with gang members gets heated.
/// 4) Passenger pulls a piece and wastes a gang member.
/// 5) All remaining gang memebers open fire.
/// 6) Player is awarded if all gang members are killed and passenger survives.
///
/// RETURNS: State machine returns TRUE once all states have been completed. FALSE otherwise
///
FUNC BOOL PROCESS_AMBUSH()
IF m_AmbushState < AMB_COMBAT
AND ( IS_PED_INJURED(TAS_Local.piAmbush[0])
OR IS_PED_INJURED(TAS_Local.piAmbush[1])
OR IS_PED_INJURED(TAS_Local.piAmbush[2])
OR ((NOT IS_ENTITY_DEAD(TAS_Local.piAmbush[0])) AND HAS_ENTITY_BEEN_DAMAGED_BY_ANY_VEHICLE(TAS_Local.piAmbush[0]))
OR ((NOT IS_ENTITY_DEAD(TAS_Local.piAmbush[1])) AND HAS_ENTITY_BEEN_DAMAGED_BY_ANY_VEHICLE(TAS_Local.piAmbush[1]))
OR ((NOT IS_ENTITY_DEAD(TAS_Local.piAmbush[2])) AND HAS_ENTITY_BEEN_DAMAGED_BY_ANY_VEHICLE(TAS_Local.piAmbush[2]))
OR ((NOT IS_ENTITY_DEAD(TAS_Local.piAmbush[0])) AND HAS_ENTITY_BEEN_DAMAGED_BY_WEAPON(TAS_Local.piAmbush[0], WEAPONTYPE_INVALID, GENERALWEAPON_TYPE_ANYWEAPON))
OR ((NOT IS_ENTITY_DEAD(TAS_Local.piAmbush[1])) AND HAS_ENTITY_BEEN_DAMAGED_BY_WEAPON(TAS_Local.piAmbush[1], WEAPONTYPE_INVALID, GENERALWEAPON_TYPE_ANYWEAPON))
OR ((NOT IS_ENTITY_DEAD(TAS_Local.piAmbush[2])) AND HAS_ENTITY_BEEN_DAMAGED_BY_WEAPON(TAS_Local.piAmbush[2], WEAPONTYPE_INVALID, GENERALWEAPON_TYPE_ANYWEAPON))
OR (GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), TAS_Local.piAmbush[1]) < 6.0)
OR ( IS_ENTITY_AT_COORD(PLAYER_PED_ID(), <<204.078323,-3331.305420,6.040432>>,<<7.500000,7.500000,1.250000>>)
AND ( ((NOT IS_ENTITY_DEAD(TAS_Local.piAmbush[0])) AND IS_PLAYER_FREE_AIMING_AT_ENTITY(PLAYER_ID(),TAS_Local.piAmbush[0]))
OR ((NOT IS_ENTITY_DEAD(TAS_Local.piAmbush[1])) AND IS_PLAYER_FREE_AIMING_AT_ENTITY(PLAYER_ID(),TAS_Local.piAmbush[1]))
OR ((NOT IS_ENTITY_DEAD(TAS_Local.piAmbush[2])) AND IS_PLAYER_FREE_AIMING_AT_ENTITY(PLAYER_ID(),TAS_Local.piAmbush[2]))
OR ((NOT IS_ENTITY_DEAD(TAS_Local.piAmbush[0])) AND IS_PLAYER_TARGETTING_ENTITY(PLAYER_ID(),TAS_Local.piAmbush[0]))
OR ((NOT IS_ENTITY_DEAD(TAS_Local.piAmbush[1])) AND IS_PLAYER_TARGETTING_ENTITY(PLAYER_ID(),TAS_Local.piAmbush[1]))
OR ((NOT IS_ENTITY_DEAD(TAS_Local.piAmbush[2])) AND IS_PLAYER_TARGETTING_ENTITY(PLAYER_ID(),TAS_Local.piAmbush[2])) ) ) )
// SET_NEXT_TAXI_SPEECH(myTaxiData, TAXI_DI_PLAYER_RUNS, TRUE, TRUE)
myTaxiData.bIsTaxiOJInCombat = TRUE
m_AmbushState = AMB_COMBAT
CDEBUG1LN(DEBUG_OJ_TAXI,"PROCESS_AMBUSH - early aggro moving on to state AMB_COMBAT")
ENDIF
SWITCH m_AmbushState
CASE AMB_INIT
SET_NEXT_TAXI_SPEECH(myTaxiData,TAXI_DI_AMBUSHED_TALK,TRUE)
CLOSE_DIALOGUE_QUEUE(tTaxiOJ_DQ_Data,-1,TRUE)
TASK_PASSENGER_TO_WALK()
//GIVE_WEAPON_TO_PED(myTaxiData.piTaxiPassenger, WEAPONTYPE_COMBATPISTOL, 100, FALSE, TRUE)
CLEAR_BIT( iLocalBitSet, k_bPassengerTalking )
CDEBUG1LN(DEBUG_OJ_TAXI,"PROCESS_AMBUSH - moving on to state AMB_TALKING")
IF NOT IS_SYNCHRONIZED_SCENE_RUNNING(iMainSceneId)
IF NOT IS_PED_INJURED(TAS_Local.piAmbush[0])
AND NOT IS_PED_INJURED(TAS_Local.piAmbush[1])
AND NOT IS_PED_INJURED(TAS_Local.piAmbush[2])
iMainSceneId = CREATE_SYNCHRONIZED_SCENE(scenePositionMain, sceneRotationMain)
SET_SYNCHRONIZED_SCENE_LOOPED(iMainSceneId,TRUE)
TASK_SYNCHRONIZED_SCENE (TAS_Local.piAmbush[0], iMainSceneId, "oddjobs@taxi@argument", "idle_a_biker_a", INSTANT_BLEND_IN, INSTANT_BLEND_OUT )
TASK_SYNCHRONIZED_SCENE (TAS_Local.piAmbush[1], iMainSceneId, "oddjobs@taxi@argument", "idle_a_biker_b", INSTANT_BLEND_IN, INSTANT_BLEND_OUT )
TASK_SYNCHRONIZED_SCENE (TAS_Local.piAmbush[2], iMainSceneId, "oddjobs@taxi@argument", "idle_a_biker_c", INSTANT_BLEND_IN, INSTANT_BLEND_OUT )
CDEBUG1LN(DEBUG_OJ_TAXI,"HAD TO RE-INITIALISE THE MAIN SCENE! set to ", iMainSceneId)
ENDIF
ELSE
CDEBUG1LN(DEBUG_OJ_TAXI,"main scene is running, that's great")
ENDIF
// init cams here
iAmbushTimer = GET_GAME_TIMER()
m_AmbushState = AMB_TALKING
BREAK
CASE AMB_TALKING
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
AND NOT IS_BIT_SET(iLocalBitSet, k_bSideConvoPlayed)
SET_NEXT_TAXI_SPEECH(myTaxiData, TAXI_DI_AMBUSH_EXTRA_BANTER, TRUE)
SET_BIT(iLocalBitSet, k_bSideConvoPlayed)
START_TIMER_NOW(ambushBanterTimer)
ENDIF
IF (GET_GAME_TIMER() - iAmbushTimer) > 4000
IF NOT IS_PLAYER_CONTROL_ON(GET_PLAYER_INDEX())
IF IS_PLAYER_DRIVING_TAXI_OJ(myTaxiData)
PRINT_HELP("TAXI_VIEW")
ENDIF
bEnableBonusCam = TRUE
IF NOT IS_PED_INJURED(TAS_Local.piAmbush[3])
AND NOT IS_PED_INJURED(piGangsterGirls[0])
AND NOT IS_PED_INJURED(piGangsterGirls[1])
iSideSceneId2 = CREATE_SYNCHRONIZED_SCENE(scenePositionSide, sceneRotationSide)
TASK_SYNCHRONIZED_SCENE (TAS_Local.piAmbush[3], iSideSceneId2, "oddjobs@taxi@argument", "bridge_biker_d", INSTANT_BLEND_IN, INSTANT_BLEND_OUT )
TASK_SYNCHRONIZED_SCENE (piGangsterGirls[0], iSideSceneId2, "oddjobs@taxi@argument", "bridge_hooker_a", INSTANT_BLEND_IN, INSTANT_BLEND_OUT )
TASK_SYNCHRONIZED_SCENE (piGangsterGirls[1], iSideSceneId2, "oddjobs@taxi@argument", "bridge_hooker_b", INSTANT_BLEND_IN, INSTANT_BLEND_OUT )
ENDIF
SET_PLAYER_CONTROL(GET_PLAYER_INDEX(), TRUE)
CDEBUG1LN(DEBUG_OJ_TAXI,"PROCESS_AMBUSH - moving on to state AMB_TALKING2")
ENDIF
// stick camera state machine here
ENDIF
IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("TAXI_VIEW")
AND (IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_VEH_CIN_CAM)
OR NOT IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()))
CLEAR_HELP()
ENDIF
// IF IS_TIMER_STARTED(ambushBanterTimer)
// CDEBUG1LN(DEBUG_OJ_TAXI,"talking has been going for ", GET_TIMER_IN_SECONDS(ambushBanterTimer), " seconds")
// ENDIF
IF NOT IS_PED_INJURED(myTaxiData.piTaxiPassenger)
AND ((NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()) OR (GET_TIMER_IN_SECONDS_SAFE(ambushBanterTimer) > 9))
IF IS_ENTITY_AT_COORD(myTaxiData.piTaxiPassenger, vPassengerWalkPoint, << 1.5, 1.5, 2.0>>)
AND GET_SCRIPT_TASK_STATUS(myTaxiData.piTaxiPassenger, SCRIPT_TASK_PERFORM_SEQUENCE) = FINISHED_TASK
AND (IS_SYNCHRONIZED_SCENE_RUNNING(iMainSceneId) AND GET_SYNCHRONIZED_SCENE_PHASE(iMainSceneId) > 0.995)
CDEBUG1LN(DEBUG_OJ_TAXI,"PROCESS_AMBUSH - Passenger has reached his mark, proceeding to talk some shit.")
IF NOT IS_PED_INJURED(TAS_Local.piAmbush[0])
AND NOT IS_PED_INJURED(TAS_Local.piAmbush[1])
AND NOT IS_PED_INJURED(TAS_Local.piAmbush[2])
iMainSceneId2 = CREATE_SYNCHRONIZED_SCENE(scenePositionMain, sceneRotationMain)
TASK_SYNCHRONIZED_SCENE (TAS_Local.piAmbush[0], iMainSceneId2, "oddjobs@taxi@argument", "stand_off_biker_a", INSTANT_BLEND_IN, SLOW_BLEND_OUT )
TASK_SYNCHRONIZED_SCENE (TAS_Local.piAmbush[1], iMainSceneId2, "oddjobs@taxi@argument", "stand_off_biker_b", INSTANT_BLEND_IN, SLOW_BLEND_OUT )
TASK_SYNCHRONIZED_SCENE (TAS_Local.piAmbush[2], iMainSceneId2, "oddjobs@taxi@argument", "stand_off_biker_c", INSTANT_BLEND_IN, SLOW_BLEND_OUT )
SET_SYNCHRONIZED_SCENE_HOLD_LAST_FRAME ( iMainSceneId2, TRUE)
ENDIF
TASK_PLAY_ANIM(myTaxiData.piTaxiPassenger, "oddjobs@taxi@argument", "stand_off_passenger", SLOW_BLEND_IN)
iSyncFailSafeTimer = GET_GAME_TIMER()
iAmbushTimer = GET_GAME_TIMER()
m_AmbushState = AMB_TALKING2
ELSE
#IF IS_DEBUG_BUILD
IF IS_SYNCHRONIZED_SCENE_RUNNING(iMainSceneId)
SET_SYNCHRONIZED_SCENE_RATE(iMainSceneId, 1.45)
// CDEBUG1LN(DEBUG_OJ_TAXI,"main scene id phase = ", GET_SYNCHRONIZED_SCENE_PHASE(iMainSceneId))
ELSE
CDEBUG1LN(DEBUG_OJ_TAXI,"main scene id NOT running")
ENDIF
#ENDIF
ENDIF
ENDIF
BREAK
CASE AMB_TALKING2
IF GET_GAME_TIMER() - iAmbushTimer > 2500
AND NOT IS_BIT_SET( iLocalBitSet, k_bPassengerTalking )
SET_NEXT_TAXI_SPEECH( myTaxiData,TAXI_DI_AMBUSHED,TRUE, TRUE)
SET_BIT( iLocalBitSet, k_bPassengerTalking )
ENDIF
IF GET_SYNCHRONIZED_SCENE_PHASE(iMainSceneId2) >= TAXI_PASSENGER_GUN_TIME
AND NOT IS_PED_INJURED(myTaxiData.piTaxiPassenger)
AND NOT IS_PED_INJURED(TAS_Local.piAmbush[1])
AND NOT IS_BIT_SET( iLocalBitSet, k_bGivePassengerGun )
GIVE_WEAPON_TO_PED(TAS_Local.piAmbush[1], WEAPONTYPE_PISTOL, INFINITE_AMMO, TRUE)
GIVE_WEAPON_TO_PED(myTaxiData.piTaxiPassenger, WEAPONTYPE_PISTOL, INFINITE_AMMO, TRUE)
SET_BIT( iLocalBitSet, k_bGivePassengerGun )
ENDIF
IF GET_SYNCHRONIZED_SCENE_PHASE(iMainSceneId2) >= TAXI_BIKER_C_GUN_TIME
AND NOT IS_PED_INJURED(TAS_Local.piAmbush[2])
AND NOT IS_BIT_SET( iLocalBitSet, k_bGiveBikerCGun )
GIVE_WEAPON_TO_PED(TAS_Local.piAmbush[2], WEAPONTYPE_PISTOL, INFINITE_AMMO, TRUE)
SET_BIT( iLocalBitSet, k_bGiveBikerCGun )
ENDIF
IF NOT IS_BIT_SET( iLocalBitSet, k_bSideTaskLoopB )
IF (IS_SYNCHRONIZED_SCENE_RUNNING(iSideSceneId2) AND GET_SYNCHRONIZED_SCENE_PHASE(iSideSceneId2) = 1.0)
OR NOT IS_SYNCHRONIZED_SCENE_RUNNING(iSideSceneId2)
IF NOT IS_PED_INJURED(TAS_Local.piAmbush[3])
AND NOT IS_PED_INJURED(piGangsterGirls[0])
AND NOT IS_PED_INJURED(piGangsterGirls[1])
iSideSceneId3 = CREATE_SYNCHRONIZED_SCENE(scenePositionSide, sceneRotationSide)
CDEBUG1LN(DEBUG_OJ_TAXI,"PROCESS_AMBUSH - for the loopB iSideSceneId3 = ", iSideSceneId3)
TASK_SYNCHRONIZED_SCENE (TAS_Local.piAmbush[3], iSideSceneId3, "oddjobs@taxi@argument", "hooker_loop_b_biker_d", INSTANT_BLEND_IN, INSTANT_BLEND_OUT )
TASK_SYNCHRONIZED_SCENE (piGangsterGirls[0], iSideSceneId3, "oddjobs@taxi@argument", "hooker_loop_b_hooker_a", INSTANT_BLEND_IN, INSTANT_BLEND_OUT )
TASK_SYNCHRONIZED_SCENE (piGangsterGirls[1], iSideSceneId3, "oddjobs@taxi@argument", "hooker_loop_b_hooker_b", INSTANT_BLEND_IN, INSTANT_BLEND_OUT )
SET_SYNCHRONIZED_SCENE_LOOPED(iSideSceneId3,TRUE)
SET_BIT( iLocalBitSet, k_bSideTaskLoopB )
ENDIF
ENDIF
ENDIF
IF IS_BIT_SET( iLocalBitSet, k_bPassengerTalking)
sCurrentLine = GET_CURRENTLY_PLAYING_STANDARD_CONVERSATION_LABEL()
IF ARE_STRINGS_EQUAL(sStandoffTrigger1, sCurrentLine)
OR ARE_STRINGS_EQUAL(sStandoffTrigger2, sCurrentLine)
IF NOT IS_PED_INJURED(TAS_Local.piAmbush[3])
AND NOT IS_PED_INJURED(piGangsterGirls[0])
AND NOT IS_PED_INJURED(piGangsterGirls[1])
CDEBUG1LN(DEBUG_OJ_TAXI,"PROCESS_AMBUSH - for the outro iSideSceneId3 = ", iSideSceneId3)
IF IS_SYNCHRONIZED_SCENE_RUNNING(iSideSceneId3)
iSideSceneId4 = CREATE_SYNCHRONIZED_SCENE(scenePositionSide, sceneRotationSide)
TASK_SYNCHRONIZED_SCENE (TAS_Local.piAmbush[3], iSideSceneId4, "oddjobs@taxi@argument", "hooker_outro_biker_d", INSTANT_BLEND_IN, INSTANT_BLEND_OUT )
TASK_SYNCHRONIZED_SCENE (piGangsterGirls[0], iSideSceneId4, "oddjobs@taxi@argument", "hooker_outro_hooker_a", INSTANT_BLEND_IN, INSTANT_BLEND_OUT )
TASK_SYNCHRONIZED_SCENE (piGangsterGirls[1], iSideSceneId4, "oddjobs@taxi@argument", "hooker_outro_hooker_b", INSTANT_BLEND_IN, INSTANT_BLEND_OUT )
SET_SYNCHRONIZED_SCENE_HOLD_LAST_FRAME(iSideSceneId4, TRUE)
iGiveGunTimer = GET_GAME_TIMER()
m_AmbushState = AMB_STANDOFF
CDEBUG1LN(DEBUG_OJ_TAXI,"PROCESS_AMBUSH - moving on to state AMB_STANDOFF - 0")
ELSE
iSideSceneId4 = CREATE_SYNCHRONIZED_SCENE(scenePositionSide, sceneRotationSide)
CDEBUG1LN(DEBUG_OJ_TAXI,"PROCESS_AMBUSH - had to re-validate side scene")
TASK_SYNCHRONIZED_SCENE (TAS_Local.piAmbush[3], iSideSceneId4, "oddjobs@taxi@argument", "hooker_outro_biker_d", INSTANT_BLEND_IN, INSTANT_BLEND_OUT )
TASK_SYNCHRONIZED_SCENE (piGangsterGirls[0], iSideSceneId4, "oddjobs@taxi@argument", "hooker_outro_hooker_a", INSTANT_BLEND_IN, INSTANT_BLEND_OUT )
TASK_SYNCHRONIZED_SCENE (piGangsterGirls[1], iSideSceneId4, "oddjobs@taxi@argument", "hooker_outro_hooker_b", INSTANT_BLEND_IN, INSTANT_BLEND_OUT )
SET_SYNCHRONIZED_SCENE_HOLD_LAST_FRAME(iSideSceneId4, TRUE)
iGiveGunTimer = GET_GAME_TIMER()
m_AmbushState = AMB_STANDOFF
CDEBUG1LN(DEBUG_OJ_TAXI,"PROCESS_AMBUSH - moving on to state AMB_STANDOFF - 0")
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE AMB_STANDOFF
SWITCH iStandoffMarker
// first let's task the farmer dude to aim at the drug boss
CASE 0
// IF IS_SYNCHRONIZED_SCENE_RUNNING(iSideSceneId)
// AND GET_SYNCHRONIZED_SCENE_PHASE(iSideSceneId) >= TAXI_BIKER_D_GUN_TIME
IF (GET_GAME_TIMER() - iGiveGunTimer) > 850
AND NOT IS_PED_INJURED(TAS_Local.piAmbush[3])
AND NOT IS_BIT_SET( iLocalBitSet, k_bGiveBikerDGun )
GIVE_WEAPON_TO_PED(TAS_Local.piAmbush[3], WEAPONTYPE_PISTOL, INFINITE_AMMO, TRUE)
CDEBUG1LN(DEBUG_OJ_TAXI,"PROCESS_AMBUSH - gun given to biker d in case 0")
SET_BIT( iLocalBitSet, k_bGiveBikerDGun )
// ELSE
// IF NOT IS_SYNCHRONIZED_SCENE_RUNNING(iSideSceneId)
// CDEBUG1LN(DEBUG_OJ_TAXI," iSideSceneId not running")
// ELIF GET_SYNCHRONIZED_SCENE_PHASE(iSideSceneId) < TAXI_BIKER_D_GUN_TIME
// CDEBUG1LN(DEBUG_OJ_TAXI," iSideSceneId hasn't hit gun point")
// CDEBUG1LN(DEBUG_OJ_TAXI," GET_SYNCHRONIZED_SCENE_PHASE(iSideSceneId) = ", GET_SYNCHRONIZED_SCENE_PHASE(iSideSceneId))
// ENDIF
ENDIF
// sCurrentLine = GET_CURRENTLY_PLAYING_STANDARD_CONVERSATION_LABEL()
// IF ARE_STRINGS_EQUAL("txm12_deal1_8", sCurrentLine)
// AND NOT IS_BIT_SET( iLocalBitSet, k_bPauseConvo )
// PAUSE_FACE_TO_FACE_CONVERSATION(TRUE)
// PRINT_NOW("TAXI_OBJ_GYB", 3000, 0)
// iAmbushTimer = GET_GAME_TIMER()
// SET_BIT( iLocalBitSet, k_bPauseConvo )
// ENDIF
IF NOT IS_PED_INJURED(TAS_Local.piAmbush[0])
AND NOT IS_PED_INJURED(TAS_Local.piAmbush[1])
AND NOT IS_PED_INJURED(TAS_Local.piAmbush[2])
AND NOT IS_PED_INJURED(myTaxiData.piTaxiPassenger)
SET_PED_RESET_FLAG(TAS_Local.piAmbush[0], PRF_InstantBlendToAim, TRUE)
SET_PED_RESET_FLAG(TAS_Local.piAmbush[1], PRF_InstantBlendToAim, TRUE)
SET_PED_RESET_FLAG(TAS_Local.piAmbush[2], PRF_InstantBlendToAim, TRUE)
SET_PED_RESET_FLAG(myTaxiData.piTaxiPassenger, PRF_InstantBlendToAim, TRUE)
IF (IS_SYNCHRONIZED_SCENE_RUNNING(iMainSceneId2) AND GET_SYNCHRONIZED_SCENE_PHASE(iMainSceneId2) = 1.0)
OR NOT IS_SYNCHRONIZED_SCENE_RUNNING(iMainSceneId2)
OR (GET_GAME_TIMER() - iSyncFailSafeTimer) > 27000
IF (GET_GAME_TIMER() - iSyncFailSafeTimer) > 27000
CDEBUG1LN(DEBUG_OJ_TAXI,"PROCESS_AMBUSH - Sync scene hit the fail safe. this is bad but it should manage.")
ENDIF
bCutToGamePlay = TRUE
TASK_AIM_GUN_AT_ENTITY(TAS_Local.piAmbush[0], myTaxiData.piTaxiPassenger, -1)//, TRUE)
TASK_AIM_GUN_AT_ENTITY(TAS_Local.piAmbush[1], myTaxiData.piTaxiPassenger, -1)//, TRUE)
TASK_AIM_GUN_AT_ENTITY(TAS_Local.piAmbush[2], myTaxiData.piTaxiPassenger, -1)//, TRUE)
TASK_AIM_GUN_AT_ENTITY(myTaxiData.piTaxiPassenger, TAS_Local.piAmbush[1], -1)//, TRUE)
CDEBUG1LN(DEBUG_OJ_TAXI,"PROCESS_AMBUSH - aim task given")
iAmbushTimer = 0
iStandoffMarker++
CDEBUG1LN(DEBUG_OJ_TAXI,"PROCESS_AMBUSH - moving on to state AMB_STANDOFF - 1")
ENDIF
ENDIF
BREAK
// second let's task the two gangster dudes to aim at the farmer, shortly after
CASE 1
// IF IS_SYNCHRONIZED_SCENE_RUNNING(iSideSceneId)
// AND GET_SYNCHRONIZED_SCENE_PHASE(iSideSceneId) >= TAXI_BIKER_D_GUN_TIME
IF (GET_GAME_TIMER() - iGiveGunTimer) > 850
AND NOT IS_PED_INJURED(TAS_Local.piAmbush[3])
AND NOT IS_BIT_SET( iLocalBitSet, k_bGiveBikerDGun )
CDEBUG1LN(DEBUG_OJ_TAXI,"PROCESS_AMBUSH - gun given to biker d in case 1")
GIVE_WEAPON_TO_PED(TAS_Local.piAmbush[3], WEAPONTYPE_PISTOL, INFINITE_AMMO, TRUE)
SET_BIT( iLocalBitSet, k_bGiveBikerDGun )
// ELSE
// IF NOT IS_SYNCHRONIZED_SCENE_RUNNING(iSideSceneId)
// CDEBUG1LN(DEBUG_OJ_TAXI," iSideSceneId not running")
// ELIF GET_SYNCHRONIZED_SCENE_PHASE(iSideSceneId) < TAXI_BIKER_D_GUN_TIME
// CDEBUG1LN(DEBUG_OJ_TAXI," iSideSceneId hasn't hit gun point")
// CDEBUG1LN(DEBUG_OJ_TAXI," GET_SYNCHRONIZED_SCENE_PHASE(iSideSceneId) = ", GET_SYNCHRONIZED_SCENE_PHASE(iSideSceneId))
// ENDIF
ENDIF
IF NOT IS_PED_INJURED(TAS_Local.piAmbush[3])
SET_PED_RESET_FLAG(TAS_Local.piAmbush[3], PRF_InstantBlendToAim, TRUE)
ENDIF
IF NOT IS_BIT_SET( iLocalBitSet, k_bSideTaskOutro )
IF NOT IS_SYNCHRONIZED_SCENE_RUNNING(iSideSceneId4)
OR GET_SYNCHRONIZED_SCENE_PHASE(iSideSceneId4) = 1.0
IF NOT IS_PED_INJURED(TAS_Local.piAmbush[3])
AND NOT IS_PED_INJURED(piGangsterGirls[0])
AND NOT IS_PED_INJURED(piGangsterGirls[1])
AND NOT IS_PED_INJURED(myTaxiData.piTaxiPassenger)
// CLEAR_PED_TASKS (piGangsterGirls[0])
// CLEAR_PED_TASKS (piGangsterGirls[1])
// CLEAR_PED_TASKS (TAS_Local.piAmbush[3])
//
CDEBUG1LN(DEBUG_OJ_TAXI,"PROCESS_AMBUSH - Flee task given")
TASK_FOLLOW_NAV_MESH_TO_COORD(piGangsterGirls[0], <<299.3585, -3204.9048, 4.7214>>, PEDMOVE_SPRINT)
TASK_FOLLOW_NAV_MESH_TO_COORD(piGangsterGirls[1], <<299.3585, -3204.9048, 4.7214>>, PEDMOVE_SPRINT)
FORCE_PED_MOTION_STATE(piGangsterGirls[0], MS_ON_FOOT_SPRINT)
FORCE_PED_MOTION_STATE(piGangsterGirls[1], MS_ON_FOOT_SPRINT)
TASK_AIM_GUN_AT_ENTITY(TAS_Local.piAmbush[3], myTaxiData.piTaxiPassenger, -1, TRUE)
SET_BIT( iLocalBitSet, k_bSideTaskOutro )
ENDIF
ENDIF
ENDIF
sCurrentLine = GET_CURRENTLY_PLAYING_STANDARD_CONVERSATION_LABEL()
IF ARE_STRINGS_EQUAL("txm12_deal1_7", sCurrentLine)
AND iAmbushTimer = 0
iAmbushTimer = GET_GAME_TIMER()
ELIF (iAmbushTimer > 0 AND (GET_GAME_TIMER() - iAmbushTimer) > 1500 )
AND NOT IS_BIT_SET( iLocalBitSet, k_bPauseConvo )
//PAUSE_FACE_TO_FACE_CONVERSATION(TRUE)
KILL_ANY_CONVERSATION()
PRINT_NOW("TAXI_OBJ_GYB", 4000, 0)
BLIP_ALL_PEDS( TAS_Local.piAmbush, TAS_Local.blipPedAmbush )
CDEBUG1LN(DEBUG_OJ_TAXI,"PROCESS_AMBUSH - kill the cutscene cam for the objective prompt")
bEnableBonusCam = FALSE
DESTROY_CAM(myTaxiData.camTaxi)
RENDER_SCRIPT_CAMS(FALSE, FALSE)
iAmbushTimer = GET_GAME_TIMER()
iStandoffMarker = 2
CDEBUG1LN(DEBUG_OJ_TAXI,"PROCESS_AMBUSH - moving on to state AMB_STANDOFF - 2")
SET_BIT( iLocalBitSet, k_bPauseConvo )
ELIF (iAmbushTimer > 0 AND (GET_GAME_TIMER() - iAmbushTimer) > 1200 )
IF IS_PLAYER_IN_FIRST_PERSON_CAMERA()
AND IS_CAM_ACTIVE(myTaxiData.camTaxi)
IF NOT bPulseTriggered
CDEBUG1LN(DEBUG_OJ_TAXI,"PROCESS_AMBUSH - triggered pulse")
ANIMPOSTFX_PLAY("CamPushInNeutral", 0, FALSE)
PLAY_SOUND_FRONTEND(-1, "1st_Person_Transition", "PLAYER_SWITCH_CUSTOM_SOUNDSET")
bPulseTriggered = TRUE
ENDIF
ENDIF
ENDIF
BREAK
CASE 2
IF GET_GAME_TIMER() - iAmbushTimer > 4000
AND IS_BIT_SET( iLocalBitSet, k_bPauseConvo )
//PAUSE_FACE_TO_FACE_CONVERSATION(FALSE)
PLAY_SINGLE_LINE_FROM_CONVERSATION(myTaxiData.tTaxiOJ_Convo, myTaxiData.sTaxiOJ_DXSubtitleGroupID, "txm12_deal1", "txm12_deal1_9",CONV_PRIORITY_VERY_HIGH)
iAmbushTimer = GET_GAME_TIMER()
CLEAR_BIT( iLocalBitSet, k_bPauseConvo )
ENDIF
IF NOT IS_PED_INJURED(myTaxiData.piTaxiPassenger)
AND NOT IS_PED_INJURED(TAS_Local.piAmbush[0])
AND NOT IS_PED_INJURED(TAS_Local.piAmbush[2])
//AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
AND NOT IS_BIT_SET( iLocalBitSet, k_bPauseConvo )
AND GET_GAME_TIMER() - iAmbushTimer > 2000
//Setting their health here
SET_ENTITY_HEALTH(TAS_Local.piAmbush[0] , 115)
SET_ENTITY_HEALTH(TAS_Local.piAmbush[2] , 115)
iAmbushTimer = GET_GAME_TIMER()
iStandoffMarker = 8
CDEBUG1LN(DEBUG_OJ_TAXI,"PROCESS_AMBUSH - moving on to state AMB_STANDOFF - 8")
ENDIF
BREAK
// fourth can we get a shaky gun effect or anim here? maybe just aim shakingly
CASE 3
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
SET_NEXT_TAXI_SPEECH(myTaxiData,TAXI_OBJ_GYB,TRUE)
TAXI_RESET_TIMERS(myTaxiData, TT_CUTSCENE)
iAmbushTimer = GET_GAME_TIMER()
iStandoffMarker++
CDEBUG1LN(DEBUG_OJ_TAXI,"PROCESS_AMBUSH - moving on to state AMB_STANDOFF - countdown")
ENDIF
BREAK
CASE 4
IF NOT IS_MESSAGE_BEING_DISPLAYED()//IS_ANY_TEXT_BEING_DISPLAYED(locatesData)
TAXI_RESET_TIMERS(myTaxiData, TT_CUTSCENE)
SET_NEXT_TAXI_SPEECH(myTaxiData,TAXI_DI_ENEMY_EGG_ON_2, TRUE)
iStandoffMarker++
CDEBUG1LN(DEBUG_OJ_TAXI,"PROCESS_AMBUSH - moving on to state AMB_STANDOFF - 5")
ENDIF
BREAK
CASE 5
CASE 6
CASE 7
IF GET_TAXI_TIMER_IN_SECONDS(myTaxiData, TT_CUTSCENE) > 2.0
TAXI_RESET_TIMERS(myTaxiData, TT_CUTSCENE)
SET_NEXT_TAXI_SPEECH(myTaxiData,TAXI_DI_ENEMY_EGG_ON_2,TRUE)
iStandoffMarker++
CDEBUG1LN(DEBUG_OJ_TAXI,"PROCESS_AMBUSH - moving on to state AMB_STANDOFF - ", iStandoffMarker)
ENDIF
BREAK
// fifth boss warns the farmer to run along. he'll count to three before shots are fired. farmer will not shoot
CASE 8
// when the dialogue gets written, change this condition
// IF (GET_TAXI_SPEECH_INDEX(myTaxiData) = TAXI_DI_ENEMY_EGG_ON_2)
// AND IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT IS_PED_INJURED(TAS_Local.piAmbush[0])
AND NOT IS_PED_INJURED(TAS_Local.piAmbush[1])
AND NOT IS_PED_INJURED(TAS_Local.piAmbush[2])
// SET_PED_RELATIONSHIP_GROUP_HASH( TAS_Local.piAmbush[1], relPursuers )
// SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(TAS_Local.piAmbush[1], TRUE)
// TASK_STAND_STILL(TAS_Local.piAmbush[1], 1500)
CLEAR_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE, relPursuers, myTaxiData.relPassenger)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_HATE, relPursuers, myTaxiData.relPassenger)
SET_PED_ACCURACY(TAS_Local.piAmbush[0], 100)
SET_PED_ACCURACY(TAS_Local.piAmbush[2], 100)
TASK_SHOOT_AT_ENTITY(TAS_Local.piAmbush[0], myTaxiData.piTaxiPassenger, 5000, FIRING_TYPE_CONTINUOUS)
TASK_SHOOT_AT_ENTITY(TAS_Local.piAmbush[1], myTaxiData.piTaxiPassenger, 5000, FIRING_TYPE_RANDOM_BURSTS)
TASK_SHOOT_AT_ENTITY(TAS_Local.piAmbush[2], myTaxiData.piTaxiPassenger, 5000, FIRING_TYPE_CONTINUOUS)
//TASK_COMBAT_PED(TAS_Local.piAmbush[0], myTaxiData.piTaxiPassenger)
//TASK_COMBAT_PED(TAS_Local.piAmbush[2], myTaxiData.piTaxiPassenger)
// IF NOT IS_PED_INJURED(myTaxiData.piTaxiPassenger)
// //CLEAR_PED_TASKS(myTaxiData.piTaxiPassenger)
// SET_ENTITY_HEALTH(myTaxiData.piTaxiPassenger, 110)
// ENDIF
iAmbushTimer = GET_GAME_TIMER()
iStandoffMarker++
CDEBUG1LN(DEBUG_OJ_TAXI,"PROCESS_AMBUSH - moving on to state AMB_STANDOFF - ", iStandoffMarker)
ENDIF
// ENDIF
BREAK
CASE 9
IF (GET_GAME_TIMER() - iAmbushTimer) > 5000 //account for the difference in god text time
m_AmbushState = AMB_COMBAT
CDEBUG1LN(DEBUG_OJ_TAXI,"PROCESS_AMBUSH - moving on to state AMB_COMBAT")
ENDIF
BREAK
ENDSWITCH
// look into the gangsters shooting at the player if he gets close
BREAK
CASE AMB_COMBAT
IF NOT myTaxiData.bIsTaxiOJInCombat
myTaxiData.bIsTaxiOJInCombat = TRUE
ENDIF
// setting ignore bits since they're in combat. these will be reset when the fight is over.
// either way, the mission should fail if the passenger dies
SET_BITMASK_AS_ENUM(aggroArgs.iBitFieldDontCheck, (EAggro_Aiming))
SET_BITMASK_AS_ENUM(aggroArgs.iBitFieldDontCheck, (EAggro_Attacked))
SET_BITMASK_AS_ENUM(aggroArgs.iBitFieldDontCheck, (EAggro_MinorAttacked))
KILL_ANY_CONVERSATION()
CREATE_AMBUSH_SECOND_WAVE()
// IF NOT IS_PED_INJURED(TAS_Local.piAmbush[1])
//
// SET_PED_RELATIONSHIP_GROUP_HASH( TAS_Local.piAmbush[1], relPursuers )
// ENDIF
SET_PASSENGER_IN_COMBAT()
TASK_ALL_PEDS_TO_FIGHT( TAS_Local.piAmbush )
BLIP_ALL_PEDS( TAS_Local.piAmbush, TAS_Local.blipPedAmbush )
TASK_PEDS_TO_FLEE( piGangsterGirls )
iAmbushTimer = GET_GAME_TIMER()
m_AmbushState = AMB_SECOND_WAVE
CDEBUG1LN(DEBUG_OJ_TAXI,"PROCESS_AMBUSH - moving on to state AMB_WAIT_FOR_DEATH")
BREAK
CASE AMB_SECOND_WAVE
#IF IS_DEBUG_BUILD
IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_J)
KILL_ALL_TAXI_OJ_ENEMIES(TAS_Local.piAmbush)
ENDIF
#ENDIF
IF iGangsterKilledCount >= 2
AND NOT IS_TAXI_TIMER_STARTED(myTaxiData, TT_FOLLOW)
TAXI_START_TIMER(myTaxiData, TT_FOLLOW)
ELIF IS_TAXI_TIMER_STARTED(myTaxiData, TT_FOLLOW)
AND GET_TAXI_TIMER_IN_SECONDS(myTaxiData, TT_FOLLOW) > 3.0
// SET_NEXT_TAXI_SPEECH(myTaxiData, TAXI_DI_ENEMY_FIRES, TRUE, TRUE)
TASK_SECOND_WAVE_CAR_RECS()
BLIP_SECOND_WAVE_CARS()
iAmbushTimer = GET_GAME_TIMER()
m_AmbushState = AMB_WAIT_FOR_DEATH
ELSE
iGangsterKilledCount = 0
ENDIF
UPDATE_AMBUSH_PEDS( TAS_Local.piAmbush, TAS_Local.blipPedAmbush, TAS_Local2.piAmbush, TAS_Local2.blipPedAmbush )
BREAK
CASE AMB_WAIT_FOR_DEATH
#IF IS_DEBUG_BUILD
IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_J)
KILL_ALL_TAXI_OJ_ENEMIES(TAS_Local2.piAmbush)
KILL_ALL_TAXI_OJ_ENEMIES(TAS_Local.piAmbush)
ENDIF
#ENDIF
IF IS_PED_INJURED(TAS_Local2.piAmbush[0])
// OR HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(TAS_Local2.piAmbush[0], PLAYER_PED_ID())
// OR HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(TAS_Local2.piAmbush[0], myTaxiData.piTaxiPassenger))
AND IS_VEHICLE_DRIVEABLE(TAS_Local2.viGangCar[0])
AND IS_PLAYBACK_GOING_ON_FOR_VEHICLE(TAS_Local2.viGangCar[0])
CDEBUG1LN(DEBUG_OJ_TAXI,"PROCESS_AMBUSH - playback for first vehicle stopped")
STOP_PLAYBACK_RECORDED_VEHICLE(TAS_Local2.viGangCar[0])
ENDIF
IF (IS_PED_INJURED(TAS_Local2.piAmbush[2])
OR HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(TAS_Local2.piAmbush[2], PLAYER_PED_ID())
OR HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY(TAS_Local2.piAmbush[2], myTaxiData.piTaxiPassenger))
AND IS_VEHICLE_DRIVEABLE(TAS_Local2.viGangCar[1])
AND IS_PLAYBACK_GOING_ON_FOR_VEHICLE(TAS_Local2.viGangCar[1])
CDEBUG1LN(DEBUG_OJ_TAXI,"PROCESS_AMBUSH - playback for second vehicle stopped")
STOP_PLAYBACK_RECORDED_VEHICLE(TAS_Local2.viGangCar[1])
ENDIF
IF DOES_BLIP_EXIST(TAS_Local2.blipVehAmbush[0])
AND NOT IS_VEHICLE_DRIVEABLE(TAS_Local2.viGangCar[0])
REMOVE_BLIP(TAS_Local2.blipVehAmbush[0])
ENDIF
IF DOES_BLIP_EXIST(TAS_Local2.blipVehAmbush[1])
AND NOT IS_VEHICLE_DRIVEABLE(TAS_Local2.viGangCar[1])
REMOVE_BLIP(TAS_Local2.blipVehAmbush[1])
ENDIF
IF NOT bAmbushBlipTransition
AND ( (IS_VEHICLE_DRIVEABLE(TAS_Local2.viGangCar[0]) AND NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(TAS_Local2.viGangCar[0]))
OR (IS_VEHICLE_DRIVEABLE(TAS_Local2.viGangCar[1]) AND NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(TAS_Local2.viGangCar[1])) )
IF IS_ANY_AMBUSH_PED_OUT_OF_VEHICLE(TAS_Local2.piAmbush)
BLIP_ALL_PEDS( TAS_Local2.piAmbush, TAS_Local2.blipPedAmbush )
REMOVE_SECOND_WAVE_CAR_BLIPS()
bAmbushBlipTransition = TRUE
ENDIF
ENDIF
IF NOT IS_BIT_SET( iLocalBitSet, k_bPassengerVulnerable )
IF GET_GAME_TIMER() - iAmbushTimer > 5000
TASK_ALL_PEDS_TO_FIGHT( TAS_Local2.piAmbush )
LET_PEDS_HIT_THINGS( TAS_Local.piAmbush )
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_HATE, relPursuers, myTaxiData.relPassenger)
SET_BIT( iLocalBitSet, k_bPassengerVulnerable )
CDEBUG1LN(DEBUG_OJ_TAXI,"PROCESS_AMBUSH - It's been 5 seconds, now setting remaining peds to target passenger")
ENDIF
ELSE
// TAS_Local2.piAmbush[0] seems to be losing his combat task
// it looks like he loses his task since he's saying a dialogue line.
// TODO: find a more elegant way to do this
INT i
REPEAT COUNT_OF(TAS_Local2.piAmbush) i
IF NOT IS_PED_INJURED(TAS_Local2.piAmbush[i])
IF GET_SCRIPT_TASK_STATUS(TAS_Local2.piAmbush[i], SCRIPT_TASK_COMBAT_HATED_TARGETS_AROUND_PED) <> PERFORMING_TASK
AND GET_SCRIPT_TASK_STATUS(TAS_Local2.piAmbush[i], SCRIPT_TASK_COMBAT_HATED_TARGETS_AROUND_PED) <> WAITING_TO_START_TASK
TASK_COMBAT_HATED_TARGETS_AROUND_PED(TAS_Local2.piAmbush[i], 1000.0)
CDEBUG1LN(DEBUG_OJ_TAXI,"TAS_Local2.piAmbush[0] NEEDED TO BE RE-TASKED")
ENDIF
ENDIF
ENDREPEAT
ENDIF
IF NOT IS_PED_INJURED(myTaxiData.piTaxiPassenger)
IF bSayShout
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
SET_NEXT_TAXI_SPEECH(myTaxiData, TAXI_DI_SHOOT, TRUE, FALSE, TRUE)
ELSE
CDEBUG1LN(DEBUG_OJ_TAXI,"not saying a shout because conversation is playing")
ENDIF
bSayShout = FALSE
ENDIF
ENDIF
RETURN UPDATE_AMBUSH_PEDS( TAS_Local.piAmbush, TAS_Local.blipPedAmbush, TAS_Local2.piAmbush, TAS_Local2.blipPedAmbush )
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
PROC UPDATE_DYNAMIC_TAXI_REQUESTS()
SWITCH eTaxiRequestState
CASE TAXIDR_REQUEST
IF IS_VEHICLE_DRIVEABLE(myTaxiData.viTaxi)
AND GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(myTaxiData.viTaxi, myTaxiData.vTaxiOJDropoff) < 300
REQUEST_TAXI_ODDJOB_GYB_STREAMS_STAGE_AMBUSH()
eTaxiRequestState = TAXIDR_WAIT_STREAM
ENDIF
BREAK
CASE TAXIDR_WAIT_STREAM
IF HAVE_TAXI_OJ_FC_STAGE_ABMUSH_ASSETS_LOADED()
eTaxiRequestState = TAXIDR_CREATE
ENDIF
BREAK
CASE TAXIDR_CREATE
IF NOT bAmbushSetup
CREATE_AMBUSH_CARS()
INITIALIZE_AMBUSH_CARS()
CREATE_AMBUSH_PEDS()
INITIALIZE_AMBUSH_PEDS()
TASK_ALL_INITIAL_ANIMS()
CREATE_AMBUSH_OBJECTS()
eTaxiRequestState = TAXIDR_CLEANUP
bAmbushSetup = TRUE
ENDIF
BREAK
CASE TAXIDR_CLEANUP
IF IS_VEHICLE_DRIVEABLE(myTaxiData.viTaxi)
AND GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(myTaxiData.viTaxi, myTaxiData.vTaxiOJDropoff) > 350
RELEASE_TAXI_ODDJOB_GYB_STREAMS_STAGE_AMBUSH()
eTaxiRequestState = TAXIDR_REQUEST
ENDIF
BREAK
ENDSWITCH
ENDPROC
/*
ooooooooo ooooo o ooooo ooooooo ooooooo8
888 88o 888 888 888 o888 888o o888 88
888 888 888 8 88 888 888 888 888 oooo
888 888 888 8oooo88 888 o 888o o888 888o 88
o888ooo88 o888o o88o o888o o888ooooo88 88ooo88 888ooo888
*/
PROC TRIGGER_TAXI_QUEUE_GYB_LINES()
SET_TAXI_OJ_INTERRUPT_TIMER_OFF(myTaxiData)
//Trigger lines
IF IS_BANTER_SAFE_TO_PLAY(myTaxiData,tTaxiOJ_DQ_Data)
SWITCH tTaxiOJ_DQ_Data.iCurrentDQLine
//Make sure if player interrupts the initial line, that the objective prints anyway.
CASE 0
IF myTaxiData.tTaxiOJ_RideState = TRS_DRIVING_PASSENGER
IF NOT IS_TAXI_OJ_INTERRUPTION_LINE_PLAYING(myTaxiData)
IF SAFE_IS_THIS_PRINT_BEING_DISPLAYED("TX_OBJ_GYB_DO")
OR DOES_BLIP_EXIST(myTaxiData.blipTaxiDropOff)
CDEBUG1LN(DEBUG_OJ_TAXI,"--------------------------[Taxi Oddjob Objective] GO TO J Store has been assigned")
tTaxiOJ_DQ_Data.iCurrentDQLine++
ELSE
IF GET_TAXI_SPEECH_INDEX(myTaxiData) <> TAXI_OBJ_GIVE_MAIN
SET_NEXT_TAXI_SPEECH(myTaxiData,TAXI_OBJ_GIVE_MAIN,TRUE,FALSE,TRUE)
CDEBUG1LN(DEBUG_OJ_TAXI,"--------------------------[Taxi Oddjob Objective] GO TO J Store has been REassigned")
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE 1
IF GET_TAXI_SPEECH_INDEX(myTaxiData) > TAXI_OBJ_GIVE_MAIN
AND GET_TAXI_SPEECH_INDEX(myTaxiData) <> TAXI_DI_BANTER
AND NOT IS_TAXI_OJ_INTERRUPTION_LINE_PLAYING(myTaxiData)
SET_NEXT_TAXI_SPEECH(myTaxiData,TAXI_DI_BANTER,TRUE)
IF g_bDebug
SCRIPT_ASSERT("Triggering Banter 1")
ENDIF
//Start the mission timer here
TAXI_START_TIMER(myTaxiData, TT_RIDETODEST)
ENDIF
// IF GET_TAXI_SPEECH_INDEX(myTaxiData) > TAXI_OBJ_GIVE_MAIN
// AND GET_TAXI_SPEECH_INDEX(myTaxiData) <> TAXI_DI_VARIABLE_BANTER
// AND NOT IS_TAXI_OJ_INTERRUPTION_LINE_PLAYING(myTaxiData)
// SET_NEXT_TAXI_SPEECH(myTaxiData,TAXI_DI_VARIABLE_BANTER,TRUE)
// IF g_bDebug
// SCRIPT_ASSERT("Triggering Banter 1")
// ENDIF
//
// //Start the mission timer here
// TAXI_START_TIMER(myTaxiData, TT_RIDETODEST)
// ENDIF
BREAK
CASE 2
IF GET_TAXI_SPEECH_INDEX(myTaxiData) <> TAXI_DI_BANTER_2
AND NOT IS_TAXI_OJ_INTERRUPTION_LINE_PLAYING(myTaxiData)
AND GET_TAXI_TIMER_IN_SECONDS(myTaxiData, TT_DQUEUE) > 2.0
AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
SET_NEXT_TAXI_SPEECH(myTaxiData,TAXI_DI_BANTER_2,TRUE)
IF g_bDebug
SCRIPT_ASSERT("Triggering Banter 2")
ENDIF
ENDIF
BREAK
CASE 3
IF GET_TAXI_TIMER_IN_SECONDS(myTaxiData, TT_DQUEUE) > GET_RANDOM_FLOAT_IN_RANGE(2.0,7.0)
//Set Radio Station Check
IF NOT GET_TAXI_RADIO_CHECK_FLAG(myTaxiData)
TAXI_RADIO_STATION_TURN_ON(myTaxiData)
tTaxiOJ_DQ_Data.iCurrentDQLine++
IF g_bDebug
SCRIPT_ASSERT("The Taxi Radio Should Be Updating")
ENDIF
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDIF
PROCESS_IMPORTANT_DIALOGUE_Q(myTaxiData,tDialogueLine, tTaxiOJ_DQ_Data, g_bDebug)
ENDPROC
PROC TAXI_OJ_GYB_SET_TIP_AND_EXCITEMENT_TO_CHECK()
//Tip Bits
SET_BITMASK_AS_ENUM(myTaxiData.iTaxiOJ_TipsBitMask,TAXI_TIP_BIT_POS_DELIVERY_TIME)
SET_BITMASK_AS_ENUM(myTaxiData.iTaxiOJ_TipsBitMask,TAXI_TIP_BIT_HIT_PED)
SET_BITMASK_AS_ENUM(myTaxiData.iTaxiOJ_TipsBitMask,TAXI_TIP_BIT_TOOK_DAMAGE)
SET_BITMASK_AS_ENUM(myTaxiData.iTaxiOJ_TipsBitMask,TAXI_TIP_BIT_ROLL_CAR)
SET_BITMASK_AS_ENUM(myTaxiData.iTaxiOJ_TipsBitMask,TAXI_TIP_BIT_LEFT_CAR)
SET_BITMASK_AS_ENUM(myTaxiData.iTaxiOJ_TipsBitMask,TAXI_TIP_BIT_STOPPED)
SET_BITMASK_AS_ENUM(myTaxiData.iTaxiOJ_TipsBitMask,TAXI_TIP_BIT_RADIO_STATION_LIKE)
SET_BITMASK_AS_ENUM(myTaxiData.iTaxiOJ_TipsBitMask,TAXI_TIP_BIT_RADIO_STATION_DISLIKE)
SET_BITMASK_AS_ENUM(myTaxiData.iTaxiOJ_TipsBitMask,TAXI_TIP_BIT_FREEBIE)
SET_BITMASK_AS_ENUM(myTaxiData.iTaxiOJ_TipsBitMask,TAXI_TIP_BIT_LOST_POLICE)
//EXCITEMENT BITS
SET_BITMASK_AS_ENUM(myTaxiData.iTaxiOJ_PassengerReactBits, TAXI_DF_HITPED)
SET_BITMASK_AS_ENUM(myTaxiData.iTaxiOJ_PassengerReactBits, TAXI_DF_TOOKDAMAGE)
SET_BITMASK_AS_ENUM(myTaxiData.iTaxiOJ_PassengerReactBits, TAXI_DF_ROLL)
//Turn off aggro bits
SET_BITMASK_AS_ENUM(aggroArgs.iBitFieldDontCheck, EAggro_Wanted)
CDEBUG1LN(DEBUG_OJ_TAXI,"TAXI_OJ_DL_SET_TIPS_TO_CHECK set tips to check on")
ENDPROC
PROC Main_Taxi_OJ_GotYourBack()
//Handles Fail Or No Taxi-------------------------------------------------------------------------------
IF IS_TAXI_JOB_IN_FAIL_STATE(myTaxiData)
TAXI_OJ_CLEAR_ALL_BLIPS(myTaxiData)
IF TAXI_HANDLE_FAIL(myTaxiData)
Script_Failed()
ENDIF
//Proceed
ELSE
//Run Throughtout the Entire Mission--------------------------------------------------------------
TAXI_OJ_MAINTAIN_GLOBAL_GATES(myTaxiData)
IF myTaxiData.tTaxiOJ_RideState >= TRS_DRIVING_PASSENGER
SET_CINEMATIC_BUTTON_ACTIVE(FALSE)
TAXI_HANDLE_CINEMATIC_CAM()
ENDIF
RUN_GLOBAL_TAXI_UPDATES(myTaxiData,aggroArgs)
IF myTaxiData.tTaxiOJ_RideState < TRS_DROPPING_OFF
PROCESS_TAXI_EXCEPTIONS(myTaxiData)
ENDIF
UPDATE_TAXI_OJ_TIP(myTaxiData,iTipIndex)
//Find Dropoff Point
IF myTaxiData.tTaxiOJ_RideState > TRS_MANAGE_PICKUP
AND NOT IS_BIT_SET( iLocalBitSet, k_bDropOffFound )
myTaxiData.vTaxiOJDropoff = << 189.7825, -3325.6838, 4.6697 >>
SET_BIT( iLocalBitSet, k_bDropOffFound )
ENDIF
//Dialogue & Objectives
IF myTaxiData.tTaxiOJ_RideState > TRS_FINDING_LOCATION
IF NOT IS_TAXI_EMERGENCY_FAIL_SET(myTaxiData)
TRIGGER_TAXI_QUEUE_GYB_LINES()
ELSE
TAXI_SET_FAIL(myTaxiData,"Taxi Not Driveable",GET_TAXI_EMERGENCY_FAIL_STRING(myTaxiData))
ENDIF
ENDIF
IF myTaxiData.tTaxiOJ_RideState = TRS_DRIVING_PASSENGER
HANDLE_TAXI_EXCITEMENT(myTaxiData,FALSE,TRUE)
#IF IS_DEBUG_BUILD
ELIF bDebugTurnOnFreeRide
HANDLE_TAXI_EXCITEMENT(myTaxiData,TRUE,TRUE)
#ENDIF
ENDIF
//FAIL CASES
//1. If Walter dies fail mission
IF DOES_ENTITY_EXIST(myTaxiData.piTaxiPassenger)
IF IS_ENTITY_DEAD(myTaxiData.piTaxiPassenger)
IF NOT IS_TAXI_TIMER_STARTED(myTaxiData, TT_GENERIC)
CDEBUG1LN(DEBUG_OJ_TAXI,"Taxi passenger died, starting generic timer")
TAXI_START_TIMER(myTaxiData, TT_GENERIC)
ENDIF
IF myTaxiData.tTaxiOJ_RideState >= TRS_DROPPING_OFF
OR m_AmbushState >= AMB_TALKING
bTaxiDelayFail = TRUE
ENDIF
TASK_ALL_PEDS_TO_FIGHT( TAS_Local.piAmbush )
TASK_ALL_PEDS_TO_FIGHT( TAS_Local2.piAmbush )
TASK_PEDS_TO_FLEE( piGangsterGirls )
TAXI_SET_FAIL(myTaxiData,"TX12_GYB - Walter has been killed", TFS_PASSENGER_DIED)
ENDIF
ENDIF
//================================================================================================
SWITCH myTaxiData.tTaxiOJ_RideState
//PRESTREAM and Check that the player and taxi are good to go
CASE TRS_INIT_STREAM
//Request of our assets
REQUEST_TAXI_ODDJOB_GYB_STREAMS_STAGE_01()
TAXI_RESET_TIMERS(myTaxiData, TT_DIALOGUE,TAXI_DX_DELAY)
TAXI_SPAWN_PASSENGER(myTaxiData, vPassengerPt, vPassengerPickupPt, "TaxiWalter",mPassengerModel,202.0,35.0)
TAXI_INIT_PASSENGER_BLIP(myTaxiData)
//Move on to the next stage
TAXI_JOB_SET_NEXT_STATE(myTaxiData,TRS_STREAMING)
BREAK
//Wait for streaming to finish
CASE TRS_STREAMING
IF HAVE_TAXI_OJ_FC_STAGE_01_ASSETS_LOADED()
INIT_ALL_TAXI_EXCITEMENT_VALUES()
//Init Bonus----------------------------------------
TAXI_INITIALIZE_BONUS_FIELD(bonusFieldGotYourBack[TGYB_BONUS_TERMINATOR], "TAXI_SC_BN_12", TAXI_CONST_BONUS_CASH_TERMINATOR) //Escaped Bonus
TAXI_INITIALIZE_BONUS_INFO(myTaxiData, bonusFieldGotYourBack)
INITIALIZE_GENERIC_TAXI_EXCEPTIONS()
//SET REACT BITS
CLEAR_ALL_TAXI_PASSENGER_REACT_BITS(myTaxiData)
TAXI_JOB_SET_NEXT_STATE(myTaxiData,TRS_FINDING_LOCATION)
ENDIF
BREAK
CASE TRS_FINDING_LOCATION
myTaxiData.vTaxiOJPickup = vPassengerPt
myTaxiData.vTaxiOJDropoff = TAS_Local.DropOffPos
TAXI_JOB_SET_NEXT_STATE(myTaxiData,TRS_SPAWNING)
BREAK
CASE TRS_SPAWNING
// IF TAXI_SPAWN_PASSENGER(myTaxiData, vPassengerPt, vPassengerPickupPt, "TaxiWalter",mPassengerModel,202.0,35.0)
IF PROPERTY_VIP_INIT_READY(myTaxiData)
IF NOT IS_ENTITY_DEAD(myTaxiData.piTaxiPassenger)
SET_PED_COMPONENT_VARIATION(myTaxiData.piTaxiPassenger, PED_COMP_TORSO, 0, 0)
SET_PED_COMPONENT_VARIATION(myTaxiData.piTaxiPassenger, PED_COMP_LEG, 0,2)
SET_PED_COMPONENT_VARIATION(myTaxiData.piTaxiPassenger, PED_COMP_HEAD, 0,2)
ENDIF
//Give player obj to go pickup Passenger
ENABLE_TAXI_SPEECH(myTaxiData)
//Set relationships here
SET_RELATIONSHIP_BETWEEN_GROUPS( ACQUAINTANCE_TYPE_PED_LIKE, relPursuers, myTaxiData.relPassenger)
SET_RELATIONSHIP_BETWEEN_GROUPS( ACQUAINTANCE_TYPE_PED_LIKE, myTaxiData.relPassenger, relPursuers)
SET_PED_CAN_BE_TARGETTED(myTaxiData.piTaxiPassenger, FALSE)
TAXI_JOB_SET_NEXT_STATE(myTaxiData,TRS_MANAGE_PICKUP)
ENDIF
BREAK
CASE TRS_MANAGE_PICKUP
IF TAXI_HANDLE_IV_PICKUP_NO_METER(myTaxiData)
TAXI_JOB_SET_NEXT_STATE(myTaxiData,TRS_WAIT_PARK)
ENDIF
BREAK
CASE TRS_WAIT_PARK
IF IS_PASSENGER_ENTERING_TAXI(myTaxiData)
//Greet the player
SET_NEXT_TAXI_SPEECH(myTaxiData,TAXI_DI_GREET,TRUE)
//CleanUp Pickup Lock & POI
CLEANUP_TAXI_PICKUP_STOP(myTaxiData)
TAXI_JOB_SET_NEXT_STATE(myTaxiData,TRS_WAIT_FOR_TIME)
ENDIF
// check to see if player dived, if so send back to prev state
IF IS_VEHICLE_DRIVEABLE( myTaxiData.viTaxi)
IF NOT IS_PED_IN_VEHICLE(myTaxiData.piTaxiPlayer, myTaxiData.viTaxi)
TAXI_HANDLE_PLAYER_DIVE(myTaxiData)
TAXI_JOB_SET_NEXT_STATE(myTaxiData,TRS_MANAGE_PICKUP)
ENDIF
ENDIF
BREAK
//This state simply waits for the obj to be given before drawing the countdown timer.
CASE TRS_WAIT_FOR_TIME
IF IS_BIT_SET( iLocalBitSet, k_bDropOffFound )
TAXI_OJ_GYB_SET_TIP_AND_EXCITEMENT_TO_CHECK()
TAXI_JOB_SET_NEXT_STATE(myTaxiData,TRS_DRIVING_PASSENGER)
ENDIF
BREAK
CASE TRS_DRIVING_PASSENGER
UPDATE_DYNAMIC_TAXI_REQUESTS()
IF (GET_ENTITY_DISTANCE_FROM_LOCATION(myTaxiData.viTaxi, myTaxiData.vTaxiOJDropoff)) < TAXI_CONST_GYB_DIST_TO_HAND_GUN
AND NOT myTaxiData.bIsCurrentlyWanted
AND NOT bWeaponGivenToPlayer
SET_ALL_VEHICLE_GENERATORS_ACTIVE_IN_AREA(vDocksMin, vDocksMax, FALSE)
SET_PED_NON_CREATION_AREA(vDocksMin, vDocksMax)
tempScenarioBlockingIndex = ADD_SCENARIO_BLOCKING_AREA(vDocksMin, vDocksMax)
CLEAR_AREA_OF_PEDS(<< 195.16, -3282.54, 4.79 >>, 25.0)
//No need to comment on music if approaching destination
TAXI_RADIO_STATION_TURN_OFF(myTaxiData)
CLEAR_DIALOGUE_QUEUE(tDialogueLine)
CLOSE_DIALOGUE_QUEUE(tTaxiOJ_DQ_Data,3)
SET_NEXT_TAXI_SPEECH(myTaxiData, TAXI_DI_CC_BANTER, TRUE)
GIVE_WEAPON_TO_PED(myTaxiData.piTaxiPlayer, WEAPONTYPE_COMBATPISTOL, 200, TRUE)
bWeaponGivenToPlayer = TRUE
ENDIF
IF TAXI_HANDLE_DRIVING(myTaxiData,/*tTaxiOJ_DQ_Data,*/16)
REMOVE_BLIP(myTaxiData.blipTaxiDropOff)
CDEBUG1LN(DEBUG_OJ_TAXI," [ AGGRO ] Turn off aggro checks once arrive at the dropoff")
SET_BITMASK_AS_ENUM(aggroArgs.iBitFieldDontCheck, (EAggro_ShotNear))
SET_BITMASK_AS_ENUM(aggroArgs.iBitFieldDontCheck, (EAggro_HeardShot))
SET_WANTED_LEVEL_MULTIPLIER(0.1)
SETTIMERA(0)
TAXI_JOB_SET_NEXT_STATE(myTaxiData,TRS_DROPPING_OFF)
ENDIF
IF (( GET_ENTITY_DISTANCE_FROM_LOCATION(myTaxiData.viTaxi, myTaxiData.vTaxiOJDropoff) < 10 )
AND ( GET_DISTANCE_BETWEEN_ENTITIES(myTaxiData.viTaxi, TAS_Local.piAmbush[1]) < 10 ))
IF IS_TAXI_FULLY_STOPPED(myTaxiData, TRUE)
REMOVE_BLIP(myTaxiData.blipTaxiDropOff)
//Change exception bits
TAXI_EXCEPTION_SET_ENABLE_BIT(ENUM_TO_INT(TAXI_GENERIC_EXCEPTION_TAXI_NOT_DRIVEABLE),FALSE)
TAXI_EXCEPTION_SET_ENABLE_BIT(ENUM_TO_INT(TAXI_GENERIC_EXCEPTION_TAXI_STOPPED),FALSE)
TAXI_EXCEPTION_SET_ENABLE_BIT(ENUM_TO_INT(TAXI_GENERIC_EXCEPTION_TAXI_FLIPPED),FALSE)
TAXI_EXCEPTION_SET_ENABLE_BIT(ENUM_TO_INT(TAXI_GENERIC_EXCEPTION_TAXI_WATER),FALSE)
TAXI_EXCEPTION_SET_ENABLE_BIT(ENUM_TO_INT(TAXI_GENERIC_EXCEPTION_PLAYER_WANTED),FALSE)
TAXI_EXCEPTION_SET_ENABLE_BIT(ENUM_TO_INT(TAXI_GENERIC_EXCEPTION_PASSENGER_NOT_OK),TRUE)
SET_WANTED_LEVEL_MULTIPLIER(0.1)
SETTIMERA(0)
TAXI_JOB_SET_NEXT_STATE(myTaxiData,TRS_DROPPING_OFF)
ENDIF
ENDIF
IF NOT bTaxiEarlyAggro
//TASK_ALL_INITIAL_ANIMS()
ENDIF
//checking for premature aggro
IF NOT bTaxiEarlyAggro
IF bAmbushSetup
IF (IS_PED_INJURED(TAS_Local.piAmbush[0])
OR IS_PED_INJURED(TAS_Local.piAmbush[1])
OR IS_PED_INJURED(TAS_Local.piAmbush[2])
OR IS_PED_INJURED(TAS_Local.piAmbush[3])
OR ((NOT IS_ENTITY_DEAD(TAS_Local.piAmbush[0])) AND HAS_ENTITY_BEEN_DAMAGED_BY_ANY_VEHICLE(TAS_Local.piAmbush[0]))
OR ((NOT IS_ENTITY_DEAD(TAS_Local.piAmbush[1])) AND HAS_ENTITY_BEEN_DAMAGED_BY_ANY_VEHICLE(TAS_Local.piAmbush[1]))
OR ((NOT IS_ENTITY_DEAD(TAS_Local.piAmbush[2])) AND HAS_ENTITY_BEEN_DAMAGED_BY_ANY_VEHICLE(TAS_Local.piAmbush[2]))
OR ((NOT IS_ENTITY_DEAD(TAS_Local.piAmbush[0])) AND HAS_ENTITY_BEEN_DAMAGED_BY_WEAPON(TAS_Local.piAmbush[0], WEAPONTYPE_INVALID, GENERALWEAPON_TYPE_ANYWEAPON))
OR ((NOT IS_ENTITY_DEAD(TAS_Local.piAmbush[1])) AND HAS_ENTITY_BEEN_DAMAGED_BY_WEAPON(TAS_Local.piAmbush[1], WEAPONTYPE_INVALID, GENERALWEAPON_TYPE_ANYWEAPON))
OR ((NOT IS_ENTITY_DEAD(TAS_Local.piAmbush[2])) AND HAS_ENTITY_BEEN_DAMAGED_BY_WEAPON(TAS_Local.piAmbush[2], WEAPONTYPE_INVALID, GENERALWEAPON_TYPE_ANYWEAPON))
OR (GET_DISTANCE_BETWEEN_ENTITIES(PLAYER_PED_ID(), TAS_Local.piAmbush[1]) < 6.0) )
SET_PED_RELATIONSHIP_GROUP_HASH(TAS_Local.piAmbush[0], relPursuers)
TASK_ALL_PEDS_TO_FIGHT( TAS_Local.piAmbush )
TASK_PEDS_TO_FLEE( piGangsterGirls )
CDEBUG1LN(DEBUG_OJ_TAXI,"Early aggro triggered")
TAXI_SET_FAIL(myTaxiData,"Aggro Heard Shot", TFS_ABANDONED_PASSENGER)
bTaxiEarlyAggro = TRUE
ENDIF
ENDIF
ENDIF
BREAK
CASE TRS_DROPPING_OFF
IF GET_PLAYER_DISTANCE_FROM_ENTITY(myTaxiData.piTaxiPassenger) < 250.0
IF PROCESS_AMBUSH()
CLEAR_BITMASK_AS_ENUM(aggroArgs.iBitFieldDontCheck, (EAggro_Aiming))
CLEAR_BITMASK_AS_ENUM(aggroArgs.iBitFieldDontCheck, (EAggro_Attacked))
CLEAR_BITMASK_AS_ENUM(aggroArgs.iBitFieldDontCheck, (EAggro_MinorAttacked))
SET_NEXT_TAXI_SPEECH(myTaxiData,TAXI_OBJ_RETURN_TO_PED,TRUE)
IF NOT IS_PED_INJURED(myTaxiData.piTaxiPassenger) AND NOT IS_PED_INJURED(myTaxiData.piTaxiPlayer)
CLEAR_PED_TASKS_IMMEDIATELY(myTaxiData.piTaxiPassenger)
TASK_GO_TO_ENTITY(myTaxiData.piTaxiPassenger,myTaxiData.piTaxiPlayer, DEFAULT_TIME_BEFORE_WARP, 6.0)
ENDIF
SETTIMERA(0)
myTaxiData.bIsTaxiOJInCombat = FALSE
TAXI_JOB_SET_NEXT_STATE(myTaxiData,TRS_TIE_UP_LOSE_ENDS)
ENDIF
ELSE
TAXI_SET_FAIL(myTaxiData, "Player abandoned passenger", TFS_ABANDONED_PASSENGER)
ENDIF
BREAK
CASE TRS_TIE_UP_LOSE_ENDS//------------------------------------------------------------------------
//IF IS_ENTITY_AT_ENTITY(myTaxiData.piTaxiPassenger,myTaxiData.piTaxiPlayer, <<7.0,7.0,20.0>>)
IF GET_PLAYER_DISTANCE_FROM_ENTITY(myTaxiData.piTaxiPlayer) < 7.0
AND TIMERA() > 3000
TASK_LOOK_AT_ENTITY(myTaxiData.piTaxiPassenger, myTaxiData.piTaxiPlayer, INFINITE_TASK_TIME, SLF_WHILE_NOT_IN_FOV, SLF_LOOKAT_VERY_HIGH)
CLEAR_SEQUENCE_TASK(seqIndexTaxiAIAction)
OPEN_SEQUENCE_TASK(seqIndexTaxiAIAction)
TASK_TURN_PED_TO_FACE_ENTITY(NULL, myTaxiData.piTaxiPlayer,-1)
CLOSE_SEQUENCE_TASK(seqIndexTaxiAIAction)
TASK_PERFORM_SEQUENCE(myTaxiData.piTaxiPassenger, seqIndexTaxiAIAction)
myTaxiData.iTaxiOJ_CashTip = 50
//CASH$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
SET_TAXI_FARE_OFF_MILEAGE(myTaxiData)
TAXI_OJ_RATE_OVERALL_TIP_LEVEL(myTaxiData)
CONVERT_TAXI_TIP_TO_CASH(myTaxiData)
CDEBUG1LN(DEBUG_OJ_TAXI,"iPlayerKilledCount = ", iPlayerKilledCount)
IF iPlayerKilledCount = TAXI_CONST_NUM_TOTAL_ENEMIES
TAXI_SET_BONUS_AWARD(myTaxiData, ENUM_TO_INT(TGYB_BONUS_TERMINATOR))
ENDIF
TAXI_JOB_SET_NEXT_STATE(myTaxiData,TRS_REGULAR_PAYMENT)
ELIF GET_PLAYER_DISTANCE_FROM_ENTITY(myTaxiData.piTaxiPassenger) > 100.0
TAXI_SET_FAIL(myTaxiData, "Player abandoned passenger", TFS_ABANDONED_PASSENGER)
ENDIF
BREAK
CASE TRS_REGULAR_PAYMENT//------------------------------------------------------------------------
IF NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
AND NOT IS_ENTITY_DEAD(myTaxiData.piTaxiPassenger)
AND GET_TAXI_TIMER_IN_SECONDS(myTaxiData, TT_CUTSCENE) > 2.0
TAXI_CANCEL_TIMERS(myTaxiData, TT_CUTSCENE)
TAXI_JOB_SET_NEXT_STATE(myTaxiData,TRS_SCORECARD_GRADE)
IF CREATE_INCIDENT(DT_AMBULANCE_DEPARTMENT, vIncidentPoint, 1, 0.0, ambulanceIndex)
CDEBUG1LN(DEBUG_OJ_TAXI,"ambulance incident succesfully created")
SET_IDEAL_SPAWN_DISTANCE_FOR_INCIDENT(ambulanceIndex, 200)
bDispatchSuccessful = TRUE
ELSE
CDEBUG1LN(DEBUG_OJ_TAXI,"ambulance incident NOT created")
ENDIF
IF CREATE_INCIDENT(DT_POLICE_VEHICLE_REQUEST, vIncidentPoint, 3, 0.0, policeIndex)
CDEBUG1LN(DEBUG_OJ_TAXI,"police incident succesfully created")
//SET_IDEAL_SPAWN_DISTANCE_FOR_INCIDENT(policeIndex, 200)
bDispatchSuccessful = TRUE
ELSE
CDEBUG1LN(DEBUG_OJ_TAXI,"police incident NOT created")
ENDIF
ENDIF
BREAK
//Pop up the scorecard
CASE TRS_SCORECARD_GRADE
IF TAXI_CALC_SCORECARD(myTaxiData,TaxiMidSize)
IF DOES_ENTITY_EXIST(myTaxiData.piTaxiPassenger)
// CLEAR_SEQUENCE_TASK(seqIndexTaxiAIAction)
// OPEN_SEQUENCE_TASK(seqIndexTaxiAIAction)
//
// TASK_USE_MOBILE_PHONE_TIMED(NULL, 10000)
// TASK_WANDER_IN_AREA(NULL, << 206.0538, -3326.4331, 4.7915 >>, 20.0)
//
// CLOSE_SEQUENCE_TASK(seqIndexTaxiAIAction)
// TASK_PERFORM_SEQUENCE(myTaxiData.piTaxiPassenger, seqIndexTaxiAIAction)
//TASK_WANDER_IN_AREA(myTaxiData.piTaxiPassenger, << 206.0538, -3326.4331, 4.7915 >>, 20.0)
IF NOT IS_ENTITY_DEAD(myTaxiData.piTaxiPassenger)
CLEAR_PED_TASKS(myTaxiData.piTaxiPassenger)
CLEAR_SEQUENCE_TASK(seqIndexTaxiAIAction)
OPEN_SEQUENCE_TASK(seqIndexTaxiAIAction)
TASK_SMART_FLEE_COORD(NULL, myTaxiData.vTaxiOJDropoff, 500.0, 30000)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, << 261.09155, -3089.06152, 4.79249 >>, PEDMOVEBLENDRATIO_RUN, DEFAULT_TIME_NEVER_WARP)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, << 304.63266, -2965.92236, 5.00012 >>, PEDMOVEBLENDRATIO_RUN, DEFAULT_TIME_NEVER_WARP)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL, << 309.89066, -2870.47290, 5.15704 >>, PEDMOVEBLENDRATIO_RUN, DEFAULT_TIME_NEVER_WARP)
TASK_WANDER_STANDARD(NULL)
CLOSE_SEQUENCE_TASK(seqIndexTaxiAIAction)
TASK_PERFORM_SEQUENCE(myTaxiData.piTaxiPassenger, seqIndexTaxiAIAction)
SET_PED_KEEP_TASK(myTaxiData.piTaxiPassenger, TRUE)
ENDIF
ENDIF
TAXI_MISSION_END(TRUE, myTaxiData, FALSE)
CDEBUG1LN(DEBUG_OJ_TAXI,"Starting TIMERA to give the player time leave before activating wanted level")
SETTIMERA(0)
//Move on to the next stage
TAXI_JOB_SET_NEXT_STATE(myTaxiData,TRS_CLEANUP)
ENDIF
BREAK
CASE TRS_CLEANUP
// at this point the passenger tells the player to clear out because he's coming clean to the cops
// player then has 10 seconds to leave the area, else he gets a 1 star wanted level
IF (GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(PLAYER_PED_ID(), << 213.4579, -3329.4707, 4.7971 >>) > 40)
CDEBUG1LN(DEBUG_OJ_TAXI,"GET_DISTANCE_BETWEEN_ENTITY_AND_COORD(PLAYER_PED_ID(), myTaxiData.vTaxiOJDropoff) > 40, cleaning up")
Script_Cleanup()
ELSE
IF bDispatchSuccessful
viAmbulance = GET_RANDOM_VEHICLE_IN_SPHERE(vIncidentPoint, 40, AMBULANCE, 0)
IF IS_VEHICLE_DRIVEABLE(viAmbulance)
CDEBUG1LN(DEBUG_OJ_TAXI,"ambulance vehicle found")
bAmbulanceFound = TRUE
ENDIF
viAmbulance = GET_RANDOM_VEHICLE_IN_SPHERE(vIncidentPoint, 40, POLICE, 0)
IF IS_VEHICLE_DRIVEABLE(viAmbulance)
CDEBUG1LN(DEBUG_OJ_TAXI,"police vehicle found")
bAmbulanceFound = TRUE
ENDIF
piMedic = GET_RANDOM_PED_AT_COORD(vIncidentPoint, <<10,10,5>>)
IF NOT IS_PED_INJURED(piMedic)
CDEBUG1LN(DEBUG_OJ_TAXI,"random ped found")
bAmbulanceFound = TRUE
ENDIF
IF bAmbulanceFound
OR TIMERA() > 30000
CDEBUG1LN(DEBUG_OJ_TAXI,"TIMERA() > 30000, or dispatch found, then cleaning up")
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), 1)
SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID())
Script_Cleanup()
ENDIF
ELSE
CDEBUG1LN(DEBUG_OJ_TAXI,"dispatch was never created, cleaning up")
Script_Cleanup()
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDIF
ENDPROC
SCRIPT
// Handles the player being busted or arrested, or if the player
// jumps into Multiplayer from Singleplayer ensures the script
// gets cleaned up properly under the correct circumstances
IF (HAS_FORCE_CLEANUP_OCCURRED(DEFAULT_FORCE_CLEANUP_FLAGS | FORCE_CLEANUP_FLAG_REPEAT_PLAY))
SET_PROPERTY_MANAGEMENT_RESULT(PROPERTY_MANAGEMENT_RESULT_FAILURE)
Script_Cleanup()
ENDIF
// Any initialisation (generally, only mission scripts should set
// the mission flag to TRUE)
SET_MISSION_FLAG(TRUE)
INITIALIZE_SCRIPT_VARIABLES()
myTaxiData.iTaxiOJ_GetRunModCount = 1
// The script loop
WHILE (TRUE)
// Maintain the script perform per-frame functionality
//All skips and debug shortcuts-------------------------------
#IF IS_DEBUG_BUILD
PROCESS_TAXI_DEBUG_SKIP(myTaxiData,tDebugState)
// Debug Key: Check for Pass (not for Minigmes)
IF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_S))
TAXI_ODDJOB_DEBUG_SKIP_TO_SCORECARD(myTaxiData)
ENDIF
// Debug Key: Check for Fail (not for Minigames)
IF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_F))
TAXI_DEBUG_FAIL_TRIGGERED(myTaxiData)
Script_Failed()
ENDIF
// Debug Key: set vehicle health to 0.0
IF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_E))
IF NOT IS_ENTITY_DEAD(myTaxiData.viTaxi)
SET_VEHICLE_ENGINE_HEALTH(myTaxiData.viTaxi, 0.0)
ENDIF
ENDIF
PROCESS_WIDGETS()
#ENDIF
//END DEBUG----------------------------------------------------
IF DOES_ENTITY_EXIST(myTaxiData.piTaxiPlayer)
Main_Taxi_OJ_GotYourBack()
ELSE
REASSIGN_TAXI_OJ_DRIVER(myTaxiData)
ENDIF
WAIT(0)
ENDWHILE
// Script should never reach here. Always terminate with cleanup function.
ENDSCRIPT