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

1058 lines
35 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_TakeToBest.sc
// Dev : John R. Diaz
/*
Take me to the best This passenger does not give a specific destination but rather asks the player to take them to a type of location.
This could be a strip club, a restaurant, or a clothing store. The passenger will talk about what kind of place they are looking for and
provide the player clues to their preferences. The player will receive bonus tips based on how much the passenger likes the place they
are dropped at or no tip if its a terrible choice. (For example: the conservative straight passenger heading to hit the clubs will not
pay the driver that drops them at the gay bar.)
*/
//CHANGELOG==========================================================================================================
//11/29/11 - Removed Blip scaling on shop blips on radar per #290240
//9/27/11 - Reformatting/prettifying all taxi oj scripts
//===================================================================================================================
//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 "shop_public.sch"
//Consts
CONST_INT TAXI_SHOPS_MAX_NUM_SHOPS 3
CONST_INT TAXI_TTB_TIP_HIGH 30
CONST_INT TAXI_TTB_TIP_MED 10
//Local Variables-----------------------------------------------
CONST_INT TAXI_CONST_BONUS_CASH_BEST_STORE 500
TaxiStruct myTaxiData
SHOP_NAME_ENUM targetShopName, nearestShopName
MODEL_NAMES mPassengerModel = A_F_Y_BEVHILLS_03
ENUM TAXIOJ_DL_BONUS
TTTB_BONUS_GENERIC,
TTTB_BONUS_TOTAL
ENDENUM
BONUS_FIELD bonusTakeToBest[TTTB_BONUS_TOTAL]
//Native Data
BLIP_INDEX blipTaxiShop[TAXI_SHOPS_MAX_NUM_SHOPS]
SEQUENCE_INDEX siTemp
//Vectors
VECTOR vPassengerPt = << -412.0875, 1171.3588, 324.8176 >> //Los Santos Obeservatory
VECTOR vPassengerPickupPt = << -411.0378, 1175.7334, 324.6417 >>
VECTOR vTaxiDropoffShopPos[NUMBER_OF_SHOPS] //Droppoints
VECTOR vTaxiDropoffPOIPos[NUMBER_OF_SHOPS] //Passenger POI Walk Pts
VECTOR vTaxiDropoffWarpPos[NUMBER_OF_SHOPS] //Taxi Warp Pts
VECTOR vTaxiInStorePos[NUMBER_OF_SHOPS]
VECTOR vTaxiCurrentWalkInStorePos
//Bools
BOOL bNotCheckInModeOn = FALSE //FALSE TRUE
BOOL bLeftTaxi
BOOL bWentWanted
//BOOL bShowDebug = TRUE // TRUE FALSE
//Ints
INT iDebugThrottle = 1
#IF IS_DEBUG_BUILD
INT iBestShopIndex = 0
#ENDIF // IS_DEBUG_BUILD
INT iTipIndex = 0
BOOL bCheckMidComplete = FALSE
BOOL bCheckEndComplete = FALSE
BOOL bFirstDropoffBlipEnabled = FALSE
//Floats
FLOAT fTaxiDropoffWarpHeading[NUMBER_OF_SHOPS]
//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_ARGS aggroArgs
SCRIPT_SHARD_BIG_MESSAGE TaxiMidSize
//Debug---------------------------------------------------------------------------------------------------------------
#IF IS_DEBUG_BUILD
WIDGET_GROUP_ID taxiRideWidgets,ojTaxiWidgets_Shops
BOOL bShowDropoffPt, bShowBestChoice
BOOL bDebugTurnOnFreeRide
TXM_DEBUG_SKIP_STATES tDebugState = TXM_DSS_CHECK_FOR_BUTTON_PRESS
#ENDIF
//FUNCTIONS------------------------------------------------------------------------------------------------------------
/*
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_TTB_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_TTB_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_TTB_BANTER
AND NOT IS_TAXI_OJ_INTERRUPTION_LINE_PLAYING(myTaxiData)
CDEBUG1LN(DEBUG_OJ_TAXI,"Current speech index:", GET_TAXI_SPEECH_INDEX(myTaxiData))
SET_NEXT_TAXI_SPEECH(myTaxiData,TAXI_DI_TTB_BANTER,TRUE)
IF g_bDebug
SCRIPT_ASSERT("Triggering TTB Banter ")
ENDIF
ENDIF
BREAK
CASE 2
IF GET_TAXI_TIMER_IN_SECONDS(myTaxiData, TT_DQUEUE) > GET_RANDOM_FLOAT_IN_RANGE(2.0,10.0)
IF GET_TAXI_SPEECH_INDEX(myTaxiData) <> TAXI_DI_BANTER_3
SET_NEXT_TAXI_SPEECH(myTaxiData,TAXI_DI_BANTER_3,TRUE)
IF g_bDebug
SCRIPT_ASSERT("Triggering Banter 3")
ENDIF
ENDIF
ENDIF
BREAK
CASE 3
IF GET_TAXI_TIMER_IN_SECONDS(myTaxiData, TT_DQUEUE) > GET_RANDOM_FLOAT_IN_RANGE(2.0,10.0)
IF GET_TAXI_SPEECH_INDEX(myTaxiData) <> TAXI_DI_BANTER_4
SET_NEXT_TAXI_SPEECH(myTaxiData,TAXI_DI_BANTER_4,TRUE)
IF g_bDebug
SCRIPT_ASSERT("Triggering Banter 4")
ENDIF
ENDIF
ENDIF
BREAK
CASE 4
IF GET_TAXI_TIMER_IN_SECONDS(myTaxiData, TT_DQUEUE) > 30.0//GET_RANDOM_FLOAT_IN_RANGE(2.0,10.0)
IF GET_TAXI_SPEECH_INDEX(myTaxiData) <> TAXI_DI_BANTER_2
SET_NEXT_TAXI_SPEECH(myTaxiData,TAXI_DI_BANTER_2,TRUE)
IF g_bDebug
SCRIPT_ASSERT("Triggering Banter 2")
ENDIF
ENDIF
ENDIF
BREAK
CASE 5
IF GET_TAXI_TIMER_IN_SECONDS(myTaxiData, TT_DQUEUE) > GET_RANDOM_FLOAT_IN_RANGE(8.0,16.0)
//Set Radio Station Check
// IF NOT GET_TAXI_RADIO_CHECK_FLAG(myTaxiData)
// TAXI_RADIO_STATION_TURN_ON(myTaxiData)
// 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_SHOP_SETUP_BLIPS(BLIP_INDEX &blipShop, SHOP_NAME_ENUM eShopName, BLIP_SPRITE eBlipSprite, INT iBlipColor = BLIP_COLOUR_YELLOW )
//Make my own
IF DOES_BLIP_EXIST(blipShop)
REMOVE_BLIP(blipShop)
ENDIF
blipShop = ADD_BLIP_FOR_COORD(GET_SHOP_COORDS(eShopName))
SET_BLIP_SPRITE(blipShop, eBlipSprite)
SET_BLIP_COLOUR(blipShop,iBlipColor)
// B* 926655 Taxi Take To Best: The map refers to all blipped clothing stores as "Discount Store". - have to hard code clothes store for now
SET_BLIP_NAME_FROM_TEXT_FILE(blipShop,GET_SHOP_NAME(eShopName))
CDEBUG1LN(DEBUG_OJ_TAXI,"TAXI_SHOP_SETUP_BLIPS - Shops name is ", GET_SHOP_NAME(eShopName))
//SET_BLIP_NAME_FROM_TEXT_FILE(blipShop,"BLIP_73")
//SET_BLIP_AS_MINIMAL_ON_EDGE(blipShop,TRUE)
SET_BLIP_SCALE(blipShop, BLIP_SIZE_COORD)
SET_BLIP_AS_MISSION_CREATOR_BLIP(blipShop, TRUE)
CDEBUG1LN(DEBUG_OJ_TAXI,"TAXI_SHOP_SETUP_BLIPS - Shops blipped")
ENDPROC
PROC TAXI_SHOP_DELETE_ALL_BLIPS(BLIP_INDEX &blipArray[])
INT i
REPEAT 3 i
IF DOES_BLIP_EXIST(blipArray[i])
REMOVE_BLIP(blipArray[i])
ENDIF
ENDREPEAT
CDEBUG1LN(DEBUG_OJ_TAXI,"TAXI_SHOP_DELETE_ALL_BLIPS - Blips cleaned up")
ENDPROC
PROC UPDATE_PROGRESS()
IF EVALUATE_OVERALL_TIME(myTaxiData, TAXI_DI_TIME_BAD, 168)
ELIF NOT bCheckMidComplete
bCheckMidComplete = EVALUATE_PROGRESS(myTaxiData, TAXI_DI_TIME_FAST, TAXI_DI_TIME_BAD, 1000, 73)
ELIF NOT bCheckEndComplete
bCheckEndComplete = EVALUATE_PROGRESS(myTaxiData, TAXI_DI_TIME_FAST, TAXI_DI_TIME_BAD, 28, 148)
ENDIF
ENDPROC
PROC TAXI_OJ_SET_SHOP_DROPOFFS()
vTaxiDropoffShopPos[HAIRDO_SHOP_01_BH] = << -829.8521, -192.3817, 36.3936 >>
vTaxiDropoffShopPos[HAIRDO_SHOP_02_SC] = << 129.8964, -1716.6322, 28.0725 >>
vTaxiDropoffShopPos[CLOTHES_SHOP_L_01_SC] = << 88.1425, -1391.7910, 28.1999 >>
vTaxiDropoffShopPos[CLOTHES_SHOP_M_01_SM] = << -1210.9993, -785.9365, 16.0056 >>
vTaxiDropoffShopPos[CLOTHES_SHOP_H_01_BH] = << -723.82043, -160.79854, 35.92944 >> //<< -723.9122, -161.8416, 35.9609 >>
vTaxiDropoffShopPos[TATTOO_PARLOUR_01_HW] = << 339.2214, 158.9484, 102.1509 >>
vTaxiDropoffShopPos[GUN_SHOP_01_DT] = << 15.1447, -1127.1610, 27.7764 >>
//Set POI points (point where passenger is going to walk toward
//If these are not working, I think it's because shop scripts aren't all active or waiting to be discovered
vTaxiDropoffPOIPos[HAIRDO_SHOP_01_BH] = << -815.6819, -183.7194, 36.5695 >>
vTaxiDropoffPOIPos[HAIRDO_SHOP_02_SC] = << 136.1871, -1712.0688, 28.2916 >>
vTaxiDropoffPOIPos[CLOTHES_SHOP_L_01_SC] = << 84.2585, -1379.5623, 28.2919 >>
vTaxiDropoffPOIPos[CLOTHES_SHOP_M_01_SM] = << -1206.15601, -777.45782, 16.32830 >>
vTaxiDropoffPOIPos[CLOTHES_SHOP_H_01_BH] = << -716.05505, -160.17415, 35.98816 >>
vTaxiDropoffPOIPos[TATTOO_PARLOUR_01_HW] = << 342.1741, 172.9035, 102.1543 >>
vTaxiDropoffPOIPos[GUN_SHOP_01_DT] = << 22.1268, -1109.8680, 28.7970 >>
vTaxiInStorePos[CLOTHES_SHOP_L_01_SC] = << 76.3885, -1397.6653, 28.3719 >>
vTaxiInStorePos[CLOTHES_SHOP_M_01_SM] = << -1193.4290, -769.2299, 16.3289 >>
vTaxiInStorePos[CLOTHES_SHOP_H_01_BH] = << -710.8855, -152.4612, 36.4106 >>
vTaxiDropoffWarpPos[HAIRDO_SHOP_01_BH] = << -821.3112, -207.0323, 36.3333 >>
vTaxiDropoffWarpPos[HAIRDO_SHOP_02_SC] = << 138.4111, -1726.9070, 28.0569 >>
vTaxiDropoffWarpPos[CLOTHES_SHOP_L_01_SC] = << 96.1429, -1407.3462, 28.1563 >>
vTaxiDropoffWarpPos[CLOTHES_SHOP_M_01_SM] = << -1202.8093, -795.3967, 15.2069 >>
vTaxiDropoffWarpPos[CLOTHES_SHOP_H_01_BH] = << -710.7402, -178.9253, 35.8931 >>
vTaxiDropoffWarpPos[TATTOO_PARLOUR_01_HW] = << 348.4406, 156.2108, 101.9483 >>
vTaxiDropoffWarpPos[GUN_SHOP_01_DT] = << 40.1115, -1113.9235, 28.1427 >>
fTaxiDropoffWarpHeading[HAIRDO_SHOP_01_BH] = 33.19
fTaxiDropoffWarpHeading[HAIRDO_SHOP_02_SC] = 50.6
fTaxiDropoffWarpHeading[CLOTHES_SHOP_L_01_SC] = 48.99
fTaxiDropoffWarpHeading[CLOTHES_SHOP_M_01_SM] = 37.21
fTaxiDropoffWarpHeading[CLOTHES_SHOP_H_01_BH] = 28.39
fTaxiDropoffWarpHeading[TATTOO_PARLOUR_01_HW] = 71.56
fTaxiDropoffWarpHeading[GUN_SHOP_01_DT] = 148.91
/*
SWITCH eShopType
CASE SHOP_TYPE_HAIRDO
vTaxiDropoffShopPos[0] = << -829.8521, -192.3817, 36.3936 >>
vTaxiDropoffShopPos[1] = << 129.8964, -1716.6322, 28.0725 >>
BREAK
CASE SHOP_TYPE_CLOTHES
vTaxiDropoffShopPos[0] = << 88.1425, -1391.7910, 28.1999 >>
vTaxiDropoffShopPos[1] = << -1210.9993, -785.9365, 16.0056 >>
vTaxiDropoffShopPos[2] = << -723.9122, -161.8416, 35.9609 >>
BREAK
CASE SHOP_TYPE_TATTOO
vTaxiDropoffShopPos[0] = << 339.2214, 158.9484, 102.1509 >>
BREAK
CASE SHOP_TYPE_GUN
vTaxiDropoffShopPos[0] = << 15.1447, -1127.1610, 27.7764 >>
BREAK
ENDSWITCH
*/
ENDPROC
PROC TAXI_SHOP_HIDE_BLIPS()
INT iTemp
REPEAT TAXI_SHOPS_MAX_NUM_SHOPS iTemp
IF DOES_BLIP_EXIST(blipTaxiShop[iTemp])
SET_BLIP_ALPHA(blipTaxiShop[iTemp],0)
ENDIF
ENDREPEAT
ENDPROC
PROC TAXI_SHOP_SHOW_BLIPS()
INT iTemp
REPEAT TAXI_SHOPS_MAX_NUM_SHOPS iTemp
IF DOES_BLIP_EXIST(blipTaxiShop[iTemp])
SET_BLIP_ALPHA(blipTaxiShop[iTemp],255)
ENDIF
ENDREPEAT
ENDPROC
PROC TAXI_SHOP_ENABLE_BLIP_FOR_DESTINATION(SHOP_TYPE_ENUM eShopType)
#IF IS_DEBUG_BUILD
INT iTemp
#ENDIF // IS_DEBUG_BUILD
TAXI_OJ_SET_SHOP_DROPOFFS()
SWITCH eShopType
//"Clothing Shop"
CASE SHOP_TYPE_HAIRDO
BREAK
CASE SHOP_TYPE_CLOTHES
//Turn off the one on it
SET_STATIC_BLIP_CATEGORY_VISIBILITY(STATIC_BLIP_CATEGORY_SHOP, FALSE)
// clears out local blips
TAXI_SHOP_DELETE_ALL_BLIPS(blipTaxiShop)
//Make my own
TAXI_SHOP_SETUP_BLIPS(blipTaxiShop[0],CLOTHES_SHOP_L_01_SC,RADAR_TRACE_CLOTHES_STORE)
TAXI_SHOP_SETUP_BLIPS(blipTaxiShop[1],CLOTHES_SHOP_M_01_SM,RADAR_TRACE_CLOTHES_STORE)
TAXI_SHOP_SETUP_BLIPS(blipTaxiShop[2],CLOTHES_SHOP_H_01_BH,RADAR_TRACE_CLOTHES_STORE)
BREAK
//"Tattoo "
CASE SHOP_TYPE_TATTOO
BREAK
//"Gunshop"
CASE SHOP_TYPE_GUN
BREAK
ENDSWITCH
#IF IS_DEBUG_BUILD
REPEAT TAXI_SHOPS_MAX_NUM_SHOPS iTemp
IF DOES_BLIP_EXIST(blipTaxiShop[iTemp])
IF ARE_VECTORS_EQUAL(GET_BLIP_COORDS(blipTaxiShop[iTemp]),GET_SHOP_COORDS(targetShopName))
iBestShopIndex = iTemp
CDEBUG1LN(DEBUG_OJ_TAXI,"Taxi Shops Best one is ", iBestShopIndex)
ENDIF
ENDIF
ENDREPEAT
#ENDIF // IS_DEBUG_BUILD
ENDPROC
PROC ENABLE_INCORRECT_SHOP_BLIPS(BOOL bEnable)
IF bEnable
SET_STATIC_BLIP_CATEGORY_VISIBILITY(STATIC_BLIP_CATEGORY_SHOP, TRUE)
CDEBUG1LN(DEBUG_OJ_TAXI,"Enabled Shop Blips.")
ELSE
SET_STATIC_BLIP_CATEGORY_VISIBILITY(STATIC_BLIP_CATEGORY_SHOP, FALSE)
CDEBUG1LN(DEBUG_OJ_TAXI,"Disabled Shop Blip.")
ENDIF
ENDPROC
/// PURPOSE: Request all our mission specific assets here
///
PROC REQUEST_TAXI_ODDJOB_TTB_STREAMS_STAGE_01()
//Load text and UI
REQUEST_MODEL(mPassengerModel)
TaxiMidSize.siMovie = REQUEST_MG_MIDSIZED_MESSAGE()
TAXI_INIT_SHARED_STREAMS(FALSE)
CDEBUG1LN(DEBUG_OJ_TAXI,"TXM - TTB Stage 01 Assets Requested")
ENDPROC
PROC RELEASE_TAXI_ODDJOB_TTB_STREAMS_STAGE_01()
SET_MODEL_AS_NO_LONGER_NEEDED(mPassengerModel)
CDEBUG1LN(DEBUG_OJ_TAXI,"Taxi OJ Follow Car Stage01 Assets Released")
ENDPROC
/// 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_F_Y_BevHills_03",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,FALSE)
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
IF DOES_WIDGET_GROUP_EXIST(ojTaxiWidgets_Shops)
DELETE_WIDGET_GROUP(ojTaxiWidgets_Shops)
ENDIF
CLEANUP_TAXI_WIDGETS()
#ENDIF
ENABLE_INCORRECT_SHOP_BLIPS(TRUE)
TAXI_SHOP_DELETE_ALL_BLIPS(blipTaxiShop)
RELEASE_TAXI_ODDJOB_TTB_STREAMS_STAGE_01()
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()
TAXI_SCRIPT_FAILED(myTaxiData)
Script_Cleanup()
ENDPROC
PROC INITIALIZE_SCRIPT_VARIABLES()
TAXI_ODDJOB_GLOBAL_SETUP(myTaxiData,TXM_05_TAKETOBEST)
// Set our initial state up. VIP missions don't start at TRS_FINDING_LOCATION.
myTaxiData.tTaxiOJ_RideState = TRS_INIT_STREAM
// iDebugShop = iPrevDebugShop
myTaxiData.fTaxiOJ_BanterDelay = 20.0
myTaxiData.vTaxiOJ_WarpPtPickup = << -422.4797, 1181.7690, 324.6417 >>
myTaxiData.fTaxiOJ_WarpPtHeadingPickup = 225.6436
myTaxiData.vTaxiOJ_WarpPtDropoff = << 171.1731, -3288.1711, 4.7828 >>
myTaxiData.fTaxiOJ_WarpPtHeadingDropoff = 184.17
SET_TAXI_TIP_CUTOFFS(myTaxiData, 20, 40)
#IF IS_DEBUG_BUILD
#IF DEBUG_iTurnOnAllDXDebug
ENABLE_ALL_DIALOGUE_DEBUG()
#ENDIF
taxiRideWidgets = START_WIDGET_GROUP("Taxi Ride - Take To Best")
INIT_ODDJOB_TAXI_WIDGETS()
//Excitement Widget
ojTaxiWidgets_Shops = START_WIDGET_GROUP("Shops")
ADD_WIDGET_STRING("Locations Debugging")
ADD_WIDGET_BOOL("Show Drop Pts ",bShowDropoffPt)
ADD_WIDGET_BOOL("Toggle Best Shop GREEN",bShowBestChoice)
STOP_WIDGET_GROUP()
STOP_WIDGET_GROUP()
#ENDIF
CDEBUG1LN(DEBUG_OJ_TAXI,"-----~~~~~-------------------------------~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~----")
CDEBUG1LN(DEBUG_OJ_TAXI,"-----~~~~~~~~~~~~~~~~ Oddjobs | Taxi | Take To Best ~~~~~~~~~~~~~~~~~----------")
CDEBUG1LN(DEBUG_OJ_TAXI,"-----~~~~~-------------------------------~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~----")
ENDPROC
#IF IS_DEBUG_BUILD
PROC PROCESS_WIDGETS()
UPDATE_TAXI_WIDGETS(myTaxiData,tTaxiOJ_DQ_Data)
IF bShowDropoffPt
DRAW_DEBUG_SPHERE(myTaxiData.vTaxiOJDropoff,3.0,255,215,0,150)
DRAW_DEBUG_TEXT("Closest Shop Dropoff Pt Here", myTaxiData.vTaxiOJDropoff)
ENDIF
IF bShowBestChoice
IF GET_BLIP_COLOUR(blipTaxiShop[iBestShopIndex]) = BLIP_COLOUR_YELLOW
SET_BLIP_COLOUR(blipTaxiShop[iBestShopIndex], BLIP_COLOUR_GREEN)
ELIF GET_BLIP_COLOUR(blipTaxiShop[iBestShopIndex]) = BLIP_COLOUR_GREEN
SET_BLIP_COLOUR(blipTaxiShop[iBestShopIndex], BLIP_COLOUR_YELLOW)
ENDIF
bShowBestChoice = FALSE
ENDIF
ENDPROC
#ENDIF
FUNC SHOP_TYPE_ENUM CHOOSE_RANDOM_SHOP_TYPE()
INT NumOptions = 4
INT tempInt
SHOP_TYPE_ENUM returnEnum = SHOP_TYPE_EMPTY
STRING sShoptype = "SHOP_TYPE_EMPTY"
IF NOT bNotCheckInModeOn
tempInt = GET_RANDOM_INT_IN_RANGE() % NumOptions
ELSE
// tempInt = iDebugShop
ENDIF
SWITCH tempInt
CASE 0
returnEnum = SHOP_TYPE_HAIRDO
sShoptype = "SHOP_TYPE_HAIRDO"
BREAK
CASE 1
returnEnum = SHOP_TYPE_CLOTHES
sShoptype = "SHOP_TYPE_CLOTHES"
BREAK
CASE 2
returnEnum = SHOP_TYPE_TATTOO
sShoptype = "SHOP_TYPE_TATTOO"
BREAK
CASE 3
returnEnum = SHOP_TYPE_GUN
sShoptype = "SHOP_TYPE_GUN"
BREAK
ENDSWITCH
CDEBUG1LN(DEBUG_OJ_TAXI,"TAXI - Looking for shop type: ","",sShoptype)
RETURN returnEnum
ENDFUNC
FUNC SHOP_NAME_ENUM CHOOSE_RANDOM_SHOP_NAME_OF_TYPE(SHOP_TYPE_ENUM inputType, BOOL bPickRandomStore = TRUE)
INT i, startingInt, endingInt, countInt, randInt
SHOP_NAME_ENUM returnEnum = EMPTY_SHOP
startingInt = -1
endingInt = -1
//CLOTHES_SHOP_H_01_BH
REPEAT COUNT_OF(SHOP_NAME_ENUM) i
IF GET_SHOP_TYPE_ENUM((INT_TO_ENUM(SHOP_NAME_ENUM, i))) = inputType
countInt++
IF startingInt = -1
startingInt = i
ELSE
endingInt = i
ENDIF
ENDIF
ENDREPEAT
IF countInt > 0
IF endingInt <> -1
IF bPickRandomStore
randInt = GET_RANDOM_INT_IN_RANGE() % countInt
returnEnum = INT_TO_ENUM(SHOP_NAME_ENUM, (randInt + startingInt))
ELSE
returnEnum = CLOTHES_SHOP_H_01_BH
ENDIF
ELSE
returnEnum = INT_TO_ENUM(SHOP_NAME_ENUM, startingInt)
ENDIF
ENDIF
#IF IS_DEBUG_BUILD
CDEBUG1LN(DEBUG_OJ_TAXI,"TAXI - Looking for shop named: ", Get_Shop_Display_String_From_Shop_ID(returnEnum), " Enum Int = ", ENUM_TO_INT(returnEnum) )
#ENDIF
RETURN returnEnum
ENDFUNC
PROC BEST_CALCULATE_FARE_VALUES()
//No longer doing Random shops, hardcoding to HAIR SALON
//myTaxiData.targetShopType = CHOOSE_RANDOM_SHOP_TYPE()
// this just hardcodes it to CLOTHES_SHOP_H_01_BH
targetShopName = CHOOSE_RANDOM_SHOP_NAME_OF_TYPE(myTaxiData.targetShopType, FALSE)
TAXI_SHOP_ENABLE_BLIP_FOR_DESTINATION(myTaxiData.targetShopType)
IF targetShopName <> EMPTY_SHOP
FLOAT fDist
fDist = GET_ENTITY_DISTANCE_FROM_LOCATION(PLAYER_PED_ID(), GET_SHOP_COORDS(targetShopName))
myTaxiData.fTaxiOJ_TimeDeadline = (fDist * 0.3)
ELSE
myTaxiData.fTaxiOJ_TimeDeadline = 120.0
ENDIF
IF IS_VEHICLE_DRIVEABLE(myTaxiData.viTaxi)
myTaxiData.iOldVehicleHealth = GET_ENTITY_HEALTH(myTaxiData.viTaxi)
ENDIF
ENDPROC
PROC Update_Destination_shop()
//Handle hiding/showing shop blips when player enters/exits taxi
IF NOT bLeftTaxi
IF IS_TAXI_TIMER_STARTED(myTaxiData, TT_NOTINCAB)
TAXI_SHOP_HIDE_BLIPS()
SET_NEXT_TAXI_SPEECH(myTaxiData,TAXI_OBJ_LEFT_CAR,TRUE)
bLeftTaxi = TRUE
ENDIF
//Has Left Taxi
ELSE
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
IF NOT IS_TAXI_TIMER_STARTED(myTaxiData, TT_NOTINCAB)
SET_PLAYER_LEFT_TAXI_OJ(myTaxiData)
TAXI_SHOP_SHOW_BLIPS()
bLeftTaxi = FALSE
ENDIF
ENDIF
ENDIF
IF myTaxiData.bIsCurrentlyWanted
TAXI_SHOP_HIDE_BLIPS()
bWentWanted = TRUE
ELSE
IF bWentWanted
TAXI_SHOP_SHOW_BLIPS()
bWentWanted = FALSE
ENDIF
ENDIF
nearestShopName = GET_CLOSEST_SHOP_OF_TYPE(GET_ENTITY_COORDS(PLAYER_PED_ID()), myTaxiData.targetShopType)
IF nearestShopName <> EMPTY_SHOP
SHOP_NAME_ENUM enumClosestShop = GET_CLOSEST_SHOP_OF_TYPE(GET_ENTITY_COORDS(PLAYER_PED_ID()), myTaxiData.targetShopType)
IF NOT ARE_VECTORS_EQUAL(myTaxiData.vTaxiOJDropoff, vTaxiDropoffShopPos[enumClosestShop])
myTaxiData.vTaxiOJDropoff = vTaxiDropoffShopPos[enumClosestShop]
myTaxiData.vTaxiOJ_PassengerGoToPt = vTaxiDropoffPOIPos[enumClosestShop]
myTaxiData.vTaxiOJ_WarpPtDropoff = vTaxiDropoffWarpPos[enumClosestShop]
myTaxiData.fTaxiOJ_WarpPtHeadingDropoff = fTaxiDropoffWarpHeading[enumClosestShop]
vTaxiCurrentWalkInStorePos = vTaxiInStorePos[enumClosestShop]
ENDIF
ENDIF
ENDPROC
PROC TAXI_OJ_TTB_SET_TIPS_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_ROLL)
SET_BITMASK_AS_ENUM(myTaxiData.iTaxiOJ_PassengerReactBits, TAXI_DF_TOOKDAMAGE)
//Turn off aggro bits
SET_BITMASK_AS_ENUM(aggroArgs.iBitFieldDontCheck, EAggro_Wanted)
//Start the mission timer here
TAXI_START_TIMER(myTaxiData, TT_RIDETODEST)
CDEBUG1LN(DEBUG_OJ_TAXI,"TAXI_OJ_DL_SET_TIPS_TO_CHECK set tips to check on")
ENDPROC
/*
oooo oooo o ooooo oooo oooo
8888o 888 888 888 8888o 88
88 888o8 88 8 88 888 88 888o88
88 888 88 8oooo88 888 88 8888
o88o 8 o88o o88o o888o o888o o88o 88
*/
PROC Main_Taxi_OJ_TakeToBest()
//Handles Fail Or No Taxi-------------------------------------------------------------------------------
IF IS_TAXI_JOB_IN_FAIL_STATE(myTaxiData)
TAXI_OJ_CLEAR_ALL_BLIPS(myTaxiData)
IF myTaxiData.tTaxiOJ_RideState > TRS_INIT_STREAM
IF TAXI_HANDLE_FAIL(myTaxiData)
Script_Failed()
ENDIF
ELSE
IF GET_TAXI_TIMER_IN_SECONDS(myTaxiData, TT_CLEANUP) > 5.0
CDEBUG1LN(DEBUG_OJ_TAXI,"Fail During State: "," ", myTaxiData.sTaxiOJ_RideState, " ", myTaxiData.sTaxiOJ_Reason4Fail)
SET_PROPERTY_MANAGEMENT_RESULT(PROPERTY_MANAGEMENT_RESULT_FAILURE)
Script_Cleanup()
ENDIF
ENDIF
//Proceed
ELSE
//Run Throughtout the Entire Mission--------------------------------------------------------------
TAXI_OJ_MAINTAIN_GLOBAL_GATES(myTaxiData)
//Gobal taxi updates that all taxi missions run every frame
RUN_GLOBAL_TAXI_UPDATES(myTaxiData,aggroArgs)
UPDATE_TAXI_OJ_TIP(myTaxiData,iTipIndex)
PROCESS_TAXI_EXCEPTIONS(myTaxiData)
//Dialogue & Objectives
IF myTaxiData.tTaxiOJ_RideState > TRS_FINDING_LOCATION
TAXI_ODDJOB_HANDLE_TAXI_BLIPPING(myTaxiData)
IF NOT IS_TAXI_EMERGENCY_FAIL_SET(myTaxiData)
TRIGGER_TAXI_QUEUE_TTB_LINES()
ELSE
TAXI_SET_FAIL(myTaxiData,"Taxi Not Driveable",GET_TAXI_EMERGENCY_FAIL_STRING(myTaxiData))
ENDIF
ENDIF
//Track Driver progress
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
//================================================================================================
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_TTB_STREAMS_STAGE_01()
TAXI_RESET_TIMERS(myTaxiData, TT_DIALOGUE,TAXI_DX_DELAY)
TAXI_SPAWN_PASSENGER(myTaxiData, vPassengerPt, vPassengerPickupPt, "TaxiMiranda",mPassengerModel,0,10.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()
INITIALIZE_GENERIC_TAXI_EXCEPTIONS()
TAXI_INITIALIZE_BONUS_FIELD(bonusTakeToBest[TTTB_BONUS_GENERIC], "TAXI_SC_BN_08", TAXI_CONST_BONUS_CASH_BEST_STORE)
TAXI_INITIALIZE_BONUS_INFO(myTaxiData, bonusTakeToBest)
myTaxiData.vTaxiOJPickup = vPassengerPt
//SET REACT BITS******************
CLEAR_ALL_TAXI_PASSENGER_REACT_BITS(myTaxiData)
//Move on to the next stage
TAXI_JOB_SET_NEXT_STATE(myTaxiData,TRS_SPAWNING)
ENDIF
BREAK
//Spawn passenger & designate the shop
CASE TRS_SPAWNING
IF PROPERTY_VIP_INIT_READY(myTaxiData)
IF NOT IS_ENTITY_DEAD(myTaxiData.piTaxiPassenger)
SET_PED_COMPONENT_VARIATION(myTaxiData.piTaxiPassenger, PED_COMP_TORSO, 0, 2)
SET_PED_COMPONENT_VARIATION(myTaxiData.piTaxiPassenger, PED_COMP_HAIR, 1, 0)
SET_PED_COMPONENT_VARIATION(myTaxiData.piTaxiPassenger, PED_COMP_LEG, 1,0)
SET_PED_COMPONENT_VARIATION(myTaxiData.piTaxiPassenger, PED_COMP_HEAD, 0,1)
SET_PED_CONFIG_FLAG(myTaxiData.piTaxiPassenger, PCF_GetOutUndriveableVehicle, FALSE)
ENDIF
//Setting the shop type to clothes---------------------------------------
myTaxiData.targetShopType = SHOP_TYPE_CLOTHES
//Give player obj to go pickup Passenger
ENABLE_TAXI_SPEECH(myTaxiData)
//Move on to the next stage
TAXI_JOB_SET_NEXT_STATE(myTaxiData,TRS_MANAGE_PICKUP)
ENDIF
BREAK
CASE TRS_MANAGE_PICKUP
IF TAXI_HANDLE_IV_PICKUP_NO_METER(myTaxiData)
//Move on to the next stage
TAXI_JOB_SET_NEXT_STATE(myTaxiData,TRS_WAIT_PARK)
ENDIF
BREAK
CASE TRS_WAIT_PARK
IF IS_PASSENGER_ENTERING_TAXI(myTaxiData)
//Greet Driver as soon as they sit down & blip
SET_NEXT_TAXI_SPEECH(myTaxiData,TAXI_DI_TTB_SHOP,TRUE)
//CleanUp Pickup Lock & POI
CLEANUP_TAXI_PICKUP_STOP(myTaxiData)
TAXI_OJ_TTB_SET_TIPS_AND_EXCITEMENT_TO_CHECK()
//Move on to the next stage
TAXI_JOB_SET_NEXT_STATE(myTaxiData,TRS_DRIVING_PASSENGER)
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
CASE TRS_DRIVING_PASSENGER
IF NOT bFirstDropoffBlipEnabled
IF myTaxiData.bObjPrinted
BEST_CALCULATE_FARE_VALUES()
ENABLE_INCORRECT_SHOP_BLIPS(FALSE)
bFirstDropoffBlipEnabled = TRUE
ENDIF
ENDIF
Update_Destination_shop()
IF TAXI_HANDLE_DRIVING(myTaxiData/*,tTaxiOJ_DQ_Data*/, 5)
CLEAR_DIALOGUE_QUEUE(tDialogueLine)
CLOSE_DIALOGUE_QUEUE(tTaxiOJ_DQ_Data,CONST_TAXI_OJ_LINE_NUM_TO_CLOSE_DIALOGUE_Q)
IF nearestShopName = targetShopName
//TAXI_OVERRIDE_BONUS_AWARD(myTaxiData,bonusTakeToBest[TTTB_BONUS_TIP].cash,ENUM_TO_INT(TTTB_BONUS_TIP),TAXI_TTB_TIP_HIGH)
TASK_LOOK_AT_COORD(myTaxiData.piTaxiPassenger, <<-713.44891, -153.40938, 37.14410>>, 10000, SLF_SLOW_TURN_RATE | SLF_WHILE_NOT_IN_FOV, SLF_LOOKAT_HIGH)
TAXI_SET_BONUS_AWARD(myTaxiData,ENUM_TO_INT(TTTB_BONUS_GENERIC))
myTaxiData.iTaxiOJ_CashTip = 50
myTaxiData.bTaxiOJ_DoSayNoThanks = FALSE
CDEBUG1LN(DEBUG_OJ_TAXI,"Main_Taxi_OJ_TakeToBest: at CLOTHES_SHOP_H_01_BH")
ELIF nearestShopName = CLOTHES_SHOP_M_01_SM
//TAXI_OVERRIDE_BONUS_AWARD(myTaxiData,bonusTakeToBest[TTTB_BONUS_TIP].cash,ENUM_TO_INT(TTTB_BONUS_TIP),TAXI_TTB_TIP_MED)
//TAXI_SET_BONUS_AWARD(myTaxiData,ENUM_TO_INT(TTTB_BONUS_TIP))
TASK_LOOK_AT_COORD(myTaxiData.piTaxiPassenger, <<-1196.37183, -772.46075, 17.30166>>, 10000, SLF_SLOW_TURN_RATE | SLF_WHILE_NOT_IN_FOV, SLF_LOOKAT_HIGH)
myTaxiData.iTaxiOJ_CashTip = 25
myTaxiData.bTaxiOJ_DoSayNoThanks = FALSE
CDEBUG1LN(DEBUG_OJ_TAXI,"Main_Taxi_OJ_TakeToBest: at CLOTHES_SHOP_M_01_SM")
ELSE
TASK_LOOK_AT_COORD(myTaxiData.piTaxiPassenger, <<72.87311, -1392.59741, 29.76223>>, 10000, SLF_SLOW_TURN_RATE | SLF_WHILE_NOT_IN_FOV, SLF_LOOKAT_HIGH)
myTaxiData.iTaxiOJ_CashTip = 0
myTaxiData.bTaxiOJ_DoSayNoThanks = TRUE
CDEBUG1LN(DEBUG_OJ_TAXI,"Main_Taxi_OJ_TakeToBest: at CLOTHES_SHOP CRAP!")
ENDIF
//CASH $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$
SET_TAXI_FARE_OFF_MILEAGE(myTaxiData)
TAXI_OJ_RATE_OVERALL_TIP_LEVEL(myTaxiData)
CONVERT_TAXI_TIP_TO_CASH(myTaxiData)
TAXI_JOB_SET_NEXT_STATE(myTaxiData,TRS_REGULAR_PAYMENT)
ENDIF
BREAK
//Regular Payment
CASE TRS_REGULAR_PAYMENT
//Wait til passenger is done speaking/paying than tell him to leave vehicle
IF HAS_TAXI_OJ_PASSENGER_BEEN_DROPPED_OFF(myTaxiData)
CLEAR_PED_TASKS(myTaxiData.piTaxiPassenger)
CLEAR_SEQUENCE_TASK(siTemp)
OPEN_SEQUENCE_TASK(siTemp)
TASK_LEAVE_ANY_VEHICLE(NULL)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL,myTaxiData.vTaxiOJ_PassengerGoToPt,PEDMOVEBLENDRATIO_WALK,-1)
TASK_USE_NEAREST_SCENARIO_TO_COORD(NULL, myTaxiData.vTaxiOJ_PassengerGoToPt, 15, 5000)
TASK_SET_BLOCKING_OF_NON_TEMPORARY_EVENTS(NULL, FALSE)
TASK_FOLLOW_NAV_MESH_TO_COORD(NULL,vTaxiCurrentWalkInStorePos,PEDMOVEBLENDRATIO_WALK,-1)
TASK_USE_NEAREST_SCENARIO_TO_COORD(NULL, vTaxiCurrentWalkInStorePos, 15)
CLOSE_SEQUENCE_TASK(siTemp)
TASK_PERFORM_SEQUENCE(myTaxiData.piTaxiPassenger, siTemp)
SET_PED_KEEP_TASK(myTaxiData.piTaxiPassenger, TRUE)
//TAXI_OJ_TASK_PASSENGER_DROPOFF(myTaxiData)
TAXI_JOB_SET_NEXT_STATE(myTaxiData,TRS_SCORECARD_GRADE)
ENDIF
BREAK
//Pop up the scorecard
CASE TRS_SCORECARD_GRADE
//SET_PED_RESET_FLAG(myTaxiData.piTaxiPassenger, PRF_SearchForClosestDoor, TRUE)
IF TAXI_CALC_SCORECARD(myTaxiData,TaxiMidSize)
TAXI_MISSION_END(TRUE, myTaxiData,FALSE)
TAXI_RESET_TIMERS(myTaxiData,TT_CLEANUP)
//Move on to the next stage
TAXI_JOB_SET_NEXT_STATE(myTaxiData,TRS_CLEANUP)
ENDIF
BREAK
CASE TRS_CLEANUP
//SET_PED_RESET_FLAG(myTaxiData.piTaxiPassenger, PRF_SearchForClosestDoor, TRUE)
// IF IS_ENTITY_AT_COORD(myTaxiData.piTaxiPassenger, <<80.6663, -1391.2383, 28.3876>>, <<25.0,25.0, LOCATE_SIZE_HEIGHT>>, FALSE, TRUE, TM_ON_FOOT) //Low End Clothing
// OR IS_ENTITY_AT_COORD(myTaxiData.piTaxiPassenger, <<-1198.8291, -775.9587, 16.3238>>, <<2.0, 2.0, LOCATE_SIZE_HEIGHT>>, FALSE, TRUE, TM_ON_FOOT) //SubUrban
// OR IS_ENTITY_AT_COORD(myTaxiData.piTaxiPassenger, <<-714.7526, -155.4902, 36.4152>>, <<2.0, 2.0, LOCATE_SIZE_HEIGHT>>, FALSE, TRUE, TM_ON_FOOT) //Ponsonbys
// OR GET_TAXI_TIMER_IN_SECONDS(myTaxiData,TT_CLEANUP) > 15
CLEANUP_TAXI_OJ_PASSENGER(myTaxiData)
Script_Cleanup()
// 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()
// 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 NOT IS_ENTITY_DEAD(myTaxiData.piTaxiPlayer)
Main_Taxi_OJ_TakeToBest()
ELSE
REASSIGN_TAXI_OJ_DRIVER(myTaxiData)
ENDIF
WAIT(0)
ENDWHILE
// Script should never reach here. Always terminate with cleanup function.
ENDSCRIPT