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

1127 lines
38 KiB
Scheme
Executable File

//////////////////////////////////////////////////////////////////////////////////////////
// //
// SCRIPT NAME : Traffick UI //
// AUTHOR : Steven Messinger //
// DESCRIPTION : Contains all things HUD, UI, BLIP in AIR trafficking //
// //
//////////////////////////////////////////////////////////////////////////////////////////
USING "minigame_stats_tracker_helpers.sch"
USING "Drug_trafficking_Data.sch"
USING "script_oddjob_funcs.sch"
USING "script_oddjob_queues.sch"
USING "shared_hud_displays.sch"
USING "end_screen.sch"
CONST_INT PENATLY_NORMAL -50
CONST_INT LAND_RADIUS 11
CONST_INT EXPLODE_RADIUS 22
CONST_INT EXPLODE_RADIUS_CARPET 17
END_SCREEN_DATASET airTraffickingEndScreen
COMPLEX_USE_CONTEXT cucEndScreenAir
// UI Update positions
//FLOAT foffSet = 0.030
//FLOAT fBoxPos = 0.194
//FLOAT fLittleBoxPos = 0.200
//FLOAT fBackground = 0.038
//FLOAT fBackOffset = 0.040
// Define colors
//INT iWhite = INT_COLOUR(255, 255, 255, 255)
//INT iRed = INT_COLOUR(255, 0, 0, 255)
//INT iGreen = INT_COLOUR(0, 255, 0, 255)
//INT iYellow = INT_COLOUR(255, 255, 0, 255)
//INT iBlack = INT_COLOUR(0, 0, 0, 255)
//INT iGold = INT_COLOUR(218, 165, 32, 255)
//INT curColor[MAX_NUMBER_PACKAGES]
INT soundIdAlarm = -1
//HUD_COLOURS hcPass[5]
//INT currentReward
//INT flashCount
//BLIP_INDEX blipRadiusPerfect[MAX_NUMBER_DROPS]
//BOOL bProximity = FALSE
BOOL bSideUIExplained = FALSE
BOOL bPrintRudderHelp = FALSE
BOOL bPlayerUsedRudders = FALSE
BOOL bBombBayDoorsOpen = FALSE
BOOL bTriggerNearTrainMusic = FALSE
BOOL bTriggerNearBoatMusic = FALSE
BOOL bAddAirportBlip = FALSE
BOOL bCheckTime = FALSE
BOOL bSkippedEndingScreen = FALSE
BOOL bPlayMusic = FALSE
FLOAT fBombBayTime
FLOAT fBlipChangingDistance = 200
INT iPayment
structTimer tRudderHelpTimer
ENUM CARGO_DROP_UI_STATES
CARGO_DROP_UI_STATES_INIT = 0,
CARGO_DROP_UI_STATES_PREPARE,
CARGO_DROP_UI_STATES_WAITING,
CARGO_DROP_UI_STATES_RUNNING
ENDENUM
PROC HANDLE_SIDE_UI_EXPLANATION(ARGS& myArgs)
UNUSED_PARAMETER(myArgs)
DEBUG_MESSAGE("HANDLE_SIDE_UI_EXPLANATION")
// Only display help text if you're in the right mode
IF NOT bSideUIExplained
// IF myArgs.bDoStationary OR myArgs.bDoBomb OR myArgs.bDoMobile
//CLEAR_HELP(TRUE)
//PRINT_HELP("DTRFAIR_HELPJ")
bSideUIExplained = TRUE
//ENDIF
// ELSE
// CLEAR_HELP(TRUE)
// //IF NOT IS_HELP_MESSAGE_ON_SCREEN()
// DEBUG_MESSAGE("PRINT HELP: DTRFAIR_HELPC")
// PRINT_HELP("DTRFAIR_HELPC")
// bSideUIExplained = TRUE
// //ENDIF
// ENDIF
ELSE
DEBUG_MESSAGE("bSideUIExplained = TRUE")
ENDIF
ENDPROC
PROC CALCULATE_CARGO_BONUS(ARGS& myArgs, PLANE_CARGO_ARGS &cargoArgs, PLANE_DATA& myData, FLOAT fBonusT)
//BOOL bSucess = TRUE
BOOL bAwardDistanceBonus = TRUE
BOOL bAwardAllDropsBonus = TRUE
PRINTLN("myData.iNumDrops: ", myData.iNumDrops, "cargoArgs.iNumReleased: ", cargoArgs.iNumReleased)
IF myData.iNumDrops <> cargoArgs.iNumSuccessfulDrops
PRINTLN("iNumDrops != iNumSuccessfulDrops ", "Not giving an all drop bonus")
bAwardAllDropsBonus = FALSE
ENDIF
PRINTLN("NUMBER DROPS = ", myData.iNumDrops)
PRINTLN("NUMBER RELEASED = ", cargoArgs.iNumReleased)
IF myData.iNumDrops <> cargoArgs.iNumReleased
bAwardDistanceBonus = FALSE
ENDIF
// REPEAT cargoArgs.iNumReleased idx
// IF NOT cargoArgs.bCargoHeightBonus[idx] AND cargoArgs.bCargoSuccessful[idx]
// PRINTLN("One of our drops didn't have bCargoHeightBonus = TRUE.. at index: ", idx, "Not giving heright bonus", " NumReleased: ", cargoArgs.iNumReleased)
// bAwardHeightBonus = FALSE
// ENDIF
// ENDREPEAT
IF myArgs.bDoLowAlt
IF NOT cargoArgs.bDetectedOnRadar
cargoArgs.iHeightBonus = BONUS_MEDIUM
ENDIF
ENDIF
IF bAwardDistanceBonus
PRINTLN("Giving a distance bonus")
cargoArgs.iDistanceBonus = BONUS_MEDIUM
ENDIF
IF bAwardAllDropsBonus
cargoArgs.iAllDropBonus = BONUS_MEDIUM
ENDIF
IF GET_TIMER_IN_SECONDS(cargoArgs.tTotalTime) < fBonusT AND cargoArgs.bPassed
cargoArgs.iTimeBonus = BONUS_MEDIUM
ELSE
PRINTLN("We didn't hit our bonus time of: ", fBonusT, " with a time of: ", GET_TIMER_IN_SECONDS(cargoArgs.tTotalTime))
cargoArgs.iTimeBonus = 0
ENDIF
ENDPROC
//PROC DISPLAY_TIME_INFO(PLANE_CARGO_ARGS& cargoArgs, FLOAT& fDropNum, INT& idx)
//
// SET_TEXT_SCALE(0.75, 0.75)
// DISPLAY_TEXT(0.175, fDropNum, "DTRFAIR_UI03")
//
// fDropNum = fRowPos + (idx*fRowOffset)
// idx += 1
// SET_TEXT_SCALE(0.5, 0.5)
// SET_TEXT_COLOUR(cargoArgs.iTimeColorR, cargoArgs.iTimeColorG, cargoArgs.iTimeColorB, 255)
// DISPLAY_TEXT(0.175, fDropNum, "DTRFAIR_UI06")
// SET_TEXT_SCALE(0.5, 0.5)
// SET_TEXT_COLOUR(cargoArgs.iTimeColorR, cargoArgs.iTimeColorG, cargoArgs.iTimeColorB, 255)
// DISPLAY_TEXT_WITH_3_NUMBERS(0.279, fDropNum, "DTRSHRD_TIMER", 0, iMinutes, iSeconds)
//
//
// SET_TEXT_SCALE(0.5, 0.5)
// SET_TEXT_COLOUR(cargoArgs.iTimeColorR, cargoArgs.iTimeColorG, cargoArgs.iTimeColorB, 255)
// DISPLAY_TEXT_WITH_NUMBER(0.583, fDropNum, "DTRFAIR_PMONEY", cargoArgs.iTimeBonus)
//
// SET_TEXT_SCALE(0.5, 0.5)
// SET_TEXT_COLOUR(cargoArgs.iTimeColorR, cargoArgs.iTimeColorG, cargoArgs.iTimeColorB, 255)
// DISPLAY_TEXT(0.409, fDropNum, cargoArgs.sTimeBonus)
//ENDPROC
//PROC DISPLAY_PROGRESSION_INFO(PLANE_DATA& myData, PLANE_CARGO_ARGS& cargoArgs, FLOAT& fDropNum, INT& idx)
//
// //Display pass or fail info
// SET_TEXT_SCALE(0.5, 0.5)
// DISPLAY_TEXT(0.405, fDropNum, "DTRFAIR_UI09")
// SET_TEXT_SCALE(0.5, 0.5)
// DISPLAY_TEXT_WITH_NUMBER(0.583, fDropNum, "DTRFAIR_PMONEY", myData.iMoneyToPass)
//
//
// SET_TEXT_SCALE(0.9, 0.9)
// IF totalREward >= myData.iMoneyToPass
// cargoArgs.bPassed = TRUE
// DISPLAY_TEXT(0.663, fRowPos + ((idx)*fRowOffset) - fRowOffset/2, "DTRSHRD_PASS")
// ELSE
// DISPLAY_TEXT(0.663, fRowPos + ((idx)*fRowOffset) - fRowOffset/2, "DTRSHRD_FAIL")
// ENDIF
//
// fDropNum = fRowPos + (idx*fRowOffset)
// idx += 1
//ENDPROC
PROC DISPLAY_PACKAGE_PRINT(ARGS& myArgs, PLANE_CARGO_ARGS& cargoArgs, INT num, BOOL bDelay = FALSE)
//Added these prints now that we don't have UI to represent it
cargoArgs.bDroppedOne = TRUE
//if no more packages override bDelay to false
//IF num = 0
bDelay = FALSE
//ENDIF
IF myArgs.bDoBomb
//bombs left
IF bDelay
REGISTER_PRINT_DELAY(cargoArgs.tHelpPrintTimer, "DTRFAIR_BLFT")
ELSE
CLEAR_HELP()
PRINT_HELP_WITH_NUMBER("DTRFAIR_BLFT", num)
ENDIF
ELSE
//packages left
IF bDelay
REGISTER_PRINT_DELAY(cargoArgs.tHelpPrintTimer, "DTRFAIR_PLFT")
ELSE
CLEAR_HELP()
PRINT_HELP_WITH_NUMBER("DTRFAIR_PLFT", num)
ENDIF
ENDIF
ENDPROC
FUNC BOOL DISPLAY_ENDING_UI(PLANE_CARGO_ARGS &cargoArgs, PLANE_DATA& myData, FLOAT fBonusT, CARGO_DROP_UI_STATES &cargoDropUIStates, ARGS& myArgs, BOOL bSkip = FALSE, BOOL bHideRadar = TRUE)
//TODO... all these variables should be consts..
//TODO!!! All the math should only be done once not every frame to display the menu
//INT idx
INT iStatsTime
FLOAT fTotalPayment
FLOAT fTime
BOOL bDoneRenderingEndScreen
//FLOAT fBonusPayment
SWITCH cargoDropUIStates
CASE CARGO_DROP_UI_STATES_INIT
CLEAR_HELP()
IF bHideRadar
DISPLAY_RADAR(FALSE)
ENDIF
IF cargoArgs.bPassed AND NOT bSkip
CLEAR_PRINTS()
// SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
ENDIF
CALCULATE_CARGO_BONUS(myArgs, cargoArgs, myData, fBonusT)
// fTotalPayment += (cargoArgs.iNumSuccessfulDrops * REWARD_MEDIUM)
fTotalPayment += (7000)
PRINTLN("cargoArgs.iHeightBonus = ", cargoArgs.iHeightBonus)
PRINTLN("cargoArgs.iDistanceBonus = ", cargoArgs.iDistanceBonus)
PRINTLN("cargoArgs.iAllDropBonus = ", cargoArgs.iAllDropBonus)
PRINTLN("cargoArgs.iTimeBonus = ", cargoArgs.iTimeBonus)
fTotalPayment += cargoArgs.iHeightBonus + cargoArgs.iDistanceBonus + cargoArgs.iTimeBonus
IF cargoArgs.bPassed
//Award money on pass.. we used to deduct for missing arms packages.. look at PLANE_STATE_DONE
iPayment = ROUND(fTotalPayment)
PRINTLN("PAYMENT = ", ROUND(fTotalPayment))
SET_ENDSCREEN_DATASET_HEADER(airTraffickingEndScreen, "DTRSHRD_MPASS", "DTRSHRD_ART")
ELSE
cargoArgs.iHeightBonus = 0
cargoArgs.iDistanceBonus = 0
cargoArgs.iAllDropBonus = 0
cargoArgs.iTimeBonus = 0
fTotalPayment = 0
SET_ENDSCREEN_DATASET_HEADER(airTraffickingEndScreen, "DTRFAIR_UIF", "DTRSHRD_ART")
ENDIF
IF myArgs.bDoLowAlt
IF cargoArgs.iHeightBonus > 0
ADD_ENDSCREEN_DATASET_CONTENT_ELEMENT(airTraffickingEndScreen, ESEF_DOLLAR_VALUE, "DTRFAIR_UI05D", "", cargoArgs.iHeightBonus, 0, ESCM_CHECKED, FALSE)
ELSE
ADD_ENDSCREEN_DATASET_CONTENT_ELEMENT(airTraffickingEndScreen, ESEF_DOLLAR_VALUE, "DTRFAIR_UI05D", "", cargoArgs.iHeightBonus, 0, ESCM_NO_MARK, FALSE)
ENDIF
ENDIF
IF cargoArgs.iDistanceBonus > 0
ADD_ENDSCREEN_DATASET_CONTENT_ELEMENT(airTraffickingEndScreen, ESEF_DOLLAR_VALUE, "DTRFAIR_UI05C", "", cargoArgs.iDistanceBonus, 0, ESCM_CHECKED, FALSE)
ELSE
ADD_ENDSCREEN_DATASET_CONTENT_ELEMENT(airTraffickingEndScreen, ESEF_DOLLAR_VALUE, "DTRFAIR_UI05C", "", cargoArgs.iDistanceBonus, 0, ESCM_NO_MARK, FALSE)
ENDIF
IF cargoArgs.iTimeBonus > 0
ADD_ENDSCREEN_DATASET_CONTENT_ELEMENT(airTraffickingEndScreen, ESEF_DOLLAR_VALUE, "DTRFAIR_UI05A", "", cargoArgs.iTimeBonus, 0, ESCM_CHECKED, FALSE)
ELSE
ADD_ENDSCREEN_DATASET_CONTENT_ELEMENT(airTraffickingEndScreen, ESEF_DOLLAR_VALUE, "DTRFAIR_UI05A", "", cargoArgs.iTimeBonus, 0, ESCM_NO_MARK, FALSE)
ENDIF
fTime = GET_TIMER_IN_SECONDS(cargoArgs.tTotalTime)
PRINTLN("cargoArgs.tTotalTime = ", fTime)
fTime = (fTime*1000)
// Grab time for Stats Tracking
iStatsTime = ROUND(fTime)
PRINTLN("iStatsTime = ", iStatsTime)
PLAYSTATS_ODDJOB_DONE(iStatsTime, ENUM_TO_INT(MINIGAME_TRAFFICKING_AIR))
PRINTLN("CALLING PLAYSTATS_ODDJOB_DONE - MINIGAME_TRAFFICKING_AIR")
ADD_ENDSCREEN_DATASET_CONTENT_ELEMENT(airTraffickingEndScreen, ESEF_TIME_M_S, "DTRFAIR_UI03", "", ROUND(fTime), 0, ESCM_NO_MARK, FALSE)
CANCEL_TIMER(cargoArgs.tTotalTime)
ADD_ENDSCREEN_DATASET_CONTENT_ELEMENT(airTraffickingEndScreen, ESEF_DOLLAR_VALUE, "DTRFAIR_UI06", "", CEIL(fTotalPayment), 0, ESCM_NO_MARK, FALSE)
SET_ENDSCREEN_COMPLETION_LINE_STATE(airTraffickingEndScreen, FALSE, "", 0,0)
PRINTLN("GOING TO STATE - CARGO_DROP_UI_STATES_PREPARE")
cargoDropUIStates = CARGO_DROP_UI_STATES_PREPARE
BREAK
CASE CARGO_DROP_UI_STATES_PREPARE
IF NOT bPlayMusic
PLAY_MISSION_COMPLETE_AUDIO("TREVOR_SMALL_01")
bPlayMusic = TRUE
ENDIF
IF ENDSCREEN_PREPARE(airTraffickingEndScreen)
AND IS_MISSION_COMPLETE_READY_FOR_UI()
INIT_COMPLEX_USE_CONTEXT(cucEndScreenAir, "DTRSHRD_CONT", GET_CONTROL_INSTRUCTIONAL_BUTTONS_STRING(FRONTEND_CONTROL, INPUT_FRONTEND_ENDSCREEN_ACCEPT))
SETTIMERB(0)
PRINTLN("GOING TO STATE - CARGO_DROP_UI_STATES_WAITING")
cargoDropUIStates = CARGO_DROP_UI_STATES_WAITING
ENDIF
BREAK
CASE CARGO_DROP_UI_STATES_WAITING
IF TIMERB() > 7000 AND NOT bSkippedEndingScreen
UPDATE_COMPLEX_USE_CONTEXT(cucEndScreenAir)
IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_ENDSCREEN_ACCEPT)
OR IS_DISABLED_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_PAUSE_ALTERNATE) // B*2276517 - Player can now press esc to close endscreen, if player control is on during endscreen
PRINTLN("bSkippedEndingScreen = TRUE")
bSkippedEndingScreen = TRUE
ENDIF
ENDIF
bDoneRenderingEndScreen = RENDER_ENDSCREEN(airTraffickingEndScreen, FALSE)
IF bSkippedEndingScreen OR TIMERB() > 12000
//Call endscreen transition out
ENDSCREEN_START_TRANSITION_OUT(airTraffickingEndScreen)
//Wait until transition out completed
IF bDoneRenderingEndScreen
ENDSCREEN_SHUTDOWN(airTraffickingEndScreen)
PRINTLN("cargoDropUIStates = CARGO_DROP_UI_STATES_RUNNING")
cargoDropUIStates = CARGO_DROP_UI_STATES_RUNNING
ENDIF
ELSE
PRINTLN("TIMER FAILING")
ENDIF
BREAK
CASE CARGO_DROP_UI_STATES_RUNNING
IF bHideRadar
ODDJOB_EXIT_CUTSCENE()
ENDIF
RETURN TRUE
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
FUNC FLOAT GET_HEADING_FROM_COORDS(vector oldCoords,vector newCoords, bool invert=FALSE)
float heading
float dX = newCoords.x - oldCoords.x
float dY = newCoords.y - oldCoords.y
if dY != 0
heading = ATAN2(dX,dY)
ELSE
if dX < 0
heading = -90
ELSE
heading = 90
ENDIF
ENDIF
IF invert = TRUE
heading *= -1.0
//below not necessary but helps for debugging
IF heading < 0
heading += 360.0
ENDIF
ENDIF
RETURN heading
ENDFUNC
PROC SET_TEXT_FOR_HUD(int r,int g,int b, float fScale, bool restrictScale=false)
float fFontScale=0.319
if restrictScale = TRUE
if fScale < 0.7
fScale = 0.7
ENDIF
if fScale > 1.5
fScale = 1.5
ENDIF
ENDIF
SET_TEXT_SCALE(fFontScale*fScale,fFontScale*fScale)
SET_TEXT_COLOUR(r,g,b,200)
SET_TEXT_DROPSHADOW(0,0,0,0,0)
SET_TEXT_FONT(FONT_STANDARD)
ENDPROC
PROC DRAW_RANGE_TEXT(float scale,vector v1, vector v2, float screenX, float screenY, int r, int g, int b)
float fRange = GET_DISTANCE_BETWEEN_COORDS(v1,v2,FALSE)
int iRange = floor(fRange)
SET_TEXT_FOR_HUD(r,g,b,scale,true)
if iRange < 10
DISPLAY_TEXT_WITH_NUMBER(screenX,screenY+0.005,"DTRFAIR_DIST",iRange)
else
if iRange < 100
DISPLAY_TEXT_WITH_NUMBER(screenX,screenY+0.005,"DTRFAIR_DIST",iRange)
ELSE
if iRange < 1000
DISPLAY_TEXT_WITH_NUMBER(screenX,screenY+0.005,"DTRFAIR_DIST",iRange)
ELSE
DISPLAY_TEXT_WITH_NUMBER(screenX,screenY+0.005,"DTRFAIR_DIST",iRange)
endif
ENDIF
ENDIF
ENDPROC
PROC DRAW_OFFSCREEN_ARROW_FOR_COORD(vector vDestCoord, int r=255, int g=255, int b=0)
float fpos
if DOES_CAM_EXIST(GET_RENDERING_CAM())
if not GET_SCREEN_COORD_FROM_WORLD_COORD(vDestCoord,fpos,fpos)
vector camCoord = GET_CAM_COORD(GET_RENDERING_CAM())
vector camRot = GET_CAM_ROT(GET_RENDERING_CAM())
float dist = GET_DISTANCE_BETWEEN_COORDS(<<camCoord.x,camCoord.y,0>>,<<vDestCoord.x,vDestCoord.y,0>>)
float height = vDestCoord.z - camCoord.z
float fPitchToPed
if dist > 0
fPitchToPed = ATAN(height/dist)
ELSE
fPitchToPed = 0
ENDIF
float fHeadingToPed = GET_HEADING_FROM_COORDS(camCoord,vDestCoord)
//float angleToPoint=ATAN2(COS(lat1)*SIN(lat2)-SIN(lat1)*COS(lat2)*COS(lon2-lon1),SIN(lon2-lon1)*COS(lat2))
float angleToPoint=ATAN2(COS(camRot.x)*SIN(fPitchToPed)-SIN(camRot.x)*COS(fPitchToPed)*COS((fHeadingToPed*-1)-camRot.z),SIN((fHeadingToPed*-1)-camRot.z)*COS(fPitchToPed))
float sX = 0.5 - (cos(angleToPoint)*0.3)
float sY = 0.5 - (sin(angleToPoint)*0.3)
float stx = 0.5 - (cos(angleToPoint)*0.25)
float sty = 0.5 - (sin(angleToPoint)*0.25) - 0.02
DRAW_SPRITE("helicopterhud", "hudArrow", sX,sY , 0.02, 0.06, angleToPoint-90, r,g,b, 255)
DRAW_RANGE_TEXT(1.0,camCoord,vDestCoord,stx,sty,r,g,b)
ENDIF
ENDIF
ENDPROC
PROC REMOVE_ALL_BLIPS(PLANE_CARGO_ARGS &cargoArgs, BLIP_INDEX& myLocationBlip[], VECTOR& vCurDestObjective[])
DEBUG_MESSAGE("REMOVE_ALL_BLIPS")
INT idx
REPEAT MAX_NUMBER_DROPS idx
IF DOES_BLIP_EXIST(myLocationBlip[idx])
REMOVE_BLIP(myLocationBlip[idx])
vCurDestObjective[idx] = <<0,0,0>>
ENDIF
IF DOES_BLIP_EXIST(cargoArgs.blipCrateDrop[idx])
REMOVE_BLIP(cargoArgs.blipCrateDrop[idx])
ENDIF
// IF DOES_BLIP_EXIST(blipRadiusPerfect[idx])
// REMOVE_BLIP(blipRadiusPerfect[idx])
// ENDIF
ENDREPEAT
REPEAT MAX_NUMBER_FINAL_TARGETS idx
IF DOES_BLIP_EXIST(cargoArgs.blipFinal[idx])
REMOVE_BLIP(cargoArgs.blipFinal[idx])
ENDIF
ENDREPEAT
ENDPROC
PROC REMOVE_SPECIFIC_BLIPS(BLIP_INDEX& coorBlip[], BLIP_INDEX& radiusBlip[], BLIP_INDEX& crateBlip[], INT iDrop, INT iCargo)
DEBUG_MESSAGE("REMOVE_SPECIFIC_BLIPS")
// Remove Single Dot Dropoff Blip
IF DOES_BLIP_EXIST(coorBlip[iDrop])
REMOVE_BLIP(coorBlip[iDrop])
ENDIF
// Remove Dropoff radius blip
IF DOES_BLIP_EXIST(radiusBlip[iDrop])
REMOVE_BLIP(radiusBlip[iDrop])
ENDIF
// Remove package blip
IF DOES_BLIP_EXIST(crateBlip[iCargo])
REMOVE_BLIP(crateBlip[iCargo])
ENDIF
ENDPROC
PROC CLEAR_BLIP_ARRAY(BLIP_INDEX& myLocationBlip[])
DEBUG_MESSAGE("CLEAR_BLIP_ARRAY")
INT idx
REPEAT COUNT_OF(myLocationBlip) idx
IF DOES_BLIP_EXIST(myLocationBlip[idx])
REMOVE_BLIP(myLocationBlip[idx])
ENDIF
ENDREPEAT
ENDPROC
PROC ALTERNATE_LANDING_BLIP(BLIP_INDEX& myLocationBlip[], ENTITY_INDEX myPlane, VECTOR& myLoc, BOOL& bOutOfVehicle, VECTOR& vPlayerPos, BOOL& bCloseRange)
// Do not run check if you're out of your vehicle
IF bOutOfVehicle
EXIT
ENDIF
IF GET_DISTANCE_BETWEEN_COORDS(vPlayerPos, myLoc) < 200 AND IS_POINT_IN_ANGLED_AREA(vPlayerPos, <<2153.2, 4817.9, 31.06>>, <<1958.6, 4726.4, 51.06>>, 25.0)
AND GET_ENTITY_HEIGHT_ABOVE_GROUND(myPlane) < 2.0
IF NOT bCloseRange OR NOT DOES_BLIP_EXIST(myLocationBlip[0])
IF DOES_BLIP_EXIST(myLocationBlip[0])
DEBUG_PRINT("REMOVING LOCATION BLIP VIA ALTERNATE_LANDING_BLIP 01")
REMOVE_BLIP(myLocationBlip[0])
ENDIF
TRIGGER_MUSIC_EVENT("OJDA1_TAXI")
PRINTLN("TRIGGERING MUSIC - OJDA1_TAXI")
//add landing bilp
//Print park plane in the hanger.
PRINT("DTRFAIR_OBJTX", DEFAULT_GOD_TEXT_TIME, 1)
myLocationBlip[0] = ADD_BLIP_FOR_COORD(<< 2134.7576, 4779.1909, 40.0159 >>)//, LAND_RADIUS)
bCloseRange = TRUE
ENDIF
IF NOT bPlayerUsedRudders
IF IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_VEH_FLY_YAW_LEFT)
OR IS_CONTROL_PRESSED(PLAYER_CONTROL, INPUT_VEH_FLY_YAW_RIGHT)
PRINTLN("PLAYER HAS USED RUDDERS")
bPlayerUsedRudders = TRUE
ENDIF
ENDIF
IF NOT IS_MESSAGE_BEING_DISPLAYED()
IF NOT bPrintRudderHelp
IF NOT IS_TIMER_STARTED(tRudderHelpTimer)
START_TIMER_NOW(tRudderHelpTimer)
PRINTLN("STARTING TIMER - tRudderHelpTimer")
ELSE
IF GET_TIMER_IN_SECONDS(tRudderHelpTimer) > 1
AND NOT bPlayerUsedRudders
PRINT_HELP("DTRFAIR_RUDD")
bPrintRudderHelp = TRUE
PRINTLN("PRINTING RUDDER HELP")
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
IF NOT bAddAirportBlip
myLocationBlip[0] = ADD_BLIP_FOR_COORD(myLoc)
SET_BLIP_SCALE(myLocationBlip[0], 1.0)
// SET_BLIP_SPRITE(myLocationBlip[0], RADAR_TRACE_AIRPORT)
// SET_BLIP_COLOUR(myLocationBlip[0], BLIP_COLOUR_YELLOW)
// SET_BLIP_ROTATION(myLocationBlip[0], 120)
// SET_BLIP_PRIORITY(myLocationBlip[0], BLIPPRIORITY_HIGHEST)
DEBUG_PRINT("ADDING LOCATION BLIP VIA ALTERNATE_LANDING_BLIP")
bAddAirportBlip = TRUE
ENDIF
ENDIF
ENDPROC
PROC ALTERNATE_FINAL_BLIP(PLANE_CARGO_ARGS& cargoArgs, BLIP_INDEX& myLocationBlip[], STRING sLastObjective, BOOL& bGenericPrint, BOOL bOutOfVehicle)
INT idx
//HACK airpot vector hardcoded..
IF NOT bOutOfVehicle //might also need a wanted check here
IF GET_PLAYER_DISTANCE_FROM_LOCATION(<< 1487.5842, 3161.5088, 39.9267 >>, FALSE) < 800
IF NOT bGenericPrint
sLastObjective = sLastObjective
bGenericPrint = TRUE
PRINT("DTRFAIR_OBJCF", DEFAULT_GOD_TEXT_TIME, 1)
sLastObjective = "DTRFAIR_OBJCF"
TRIGGER_MUSIC_EVENT("OJDA5_AT_BASE")
PRINTLN("TRIGGERING MUSIC - OJDA5_AT_BASE")
ENDIF
IF DOES_BLIP_EXIST(myLocationBlip[0])
REMOVE_BLIP(myLocationBlip[0])
ENDIF
REPEAT MAX_NUMBER_FINAL_TARGETS idx
IF NOT IS_ENTITY_DEAD(cargoArgs.vehFinal[idx]) AND NOT DOES_BLIP_EXIST(cargoArgs.blipFinal[idx])
cargoArgs.blipFinal[idx] = ADD_BLIP_FOR_ENTITY(cargoArgs.vehFinal[idx])
SET_BLIP_SCALE(cargoArgs.blipFinal[idx], 0.80)
SET_BLIP_NAME_FROM_TEXT_FILE(cargoArgs.blipFinal[idx], "DTRFAIR_TGT1")
PRINTLN("Calling Register Blipped Entity on index: ", idx, " and on blip id: ")
ENDIF
ENDREPEAT
ELSE
//PER TODO 426973 we don't ever go back to single blip
// IF NOT DOES_BLIP_EXIST(myLocationBlip[0])
// //CLEAR_BLIPPED_ENTITIES()
// REPEAT MAX_NUMBER_FINAL_TARGETS idx
// IF DOES_BLIP_EXIST(cargoArgs.blipFinal[idx])
// REMOVE_BLIP(cargoArgs.blipFinal[idx])
// ENDIF
// ENDREPEAT
// myLocationBlip[0] = ADD_BLIP_FOR_COORD(<< 1487.5842, 3161.5088, 39.9267 >>)
// SET_BLIP_SCALE(myLocationBlip[0], 1.5)
// SET_BLIP_COLOUR(myLocationBlip[0], BLIP_COLOUR_YELLOW)
// ENDIF
ENDIF
ENDIF
ENDPROC
FUNC INT GET_ENTITY_INDEX(INT& iGroupToUse, PLANE_CARGO_ARGS &cargoArgs)
INT idx, iIndexToUse
SWITCH iGroupToUse
CASE 0
FOR idx = 0 TO 3
IF NOT IS_ENTITY_DEAD(cargoArgs.vehFinal[idx])
iIndexToUse = idx
PRINTLN("iIndexToUse = ", idx)
BREAK
ENDIF
ENDFOR
BREAK
CASE 1
FOR idx = 4 TO 7
IF NOT IS_ENTITY_DEAD(cargoArgs.vehFinal[idx])
iIndexToUse = idx
PRINTLN("iIndexToUse = ", idx)
BREAK
ENDIF
ENDFOR
BREAK
CASE 2
FOR idx = 8 TO 11
IF NOT IS_ENTITY_DEAD(cargoArgs.vehFinal[idx])
iIndexToUse = idx
PRINTLN("iIndexToUse = ", idx)
BREAK
ENDIF
ENDFOR
BREAK
DEFAULT
ENDSWITCH
PRINTLN("iIndexToUse = ", iIndexToUse)
RETURN iIndexToUse
ENDFUNC
PROC REMOVE_MULTI_BLIP_BEFORE_ADDING_MAIN_BLIP(PLANE_CARGO_ARGS& cargoArgs)
INT closestIndex, idx2
VECTOR vPlayerPosition
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
vPlayerPosition = GET_ENTITY_COORDS(PLAYER_PED_ID())
ENDIF
closestIndex = FIND_CLOSEST_ENTITY_INDEX(cargoArgs.vehDropoff, vPlayerPosition)
PRINTLN("FROM REMOVE_MULTI_BLIP, closestIndex = ", closestIndex)
IF closestIndex = 0
FOR idx2 = 0 TO 3
IF NOT IS_ENTITY_DEAD(cargoArgs.vehFinal[idx2]) AND DOES_BLIP_EXIST(cargoArgs.blipFinal[idx2])
REMOVE_BLIP(cargoArgs.blipFinal[idx2])
PRINTLN("REMOVING BLIP: ", idx2)
ENDIF
ENDFOR
ELIF closestIndex = 1
FOR idx2 = 4 TO 7
IF NOT IS_ENTITY_DEAD(cargoArgs.vehFinal[idx2]) AND DOES_BLIP_EXIST(cargoArgs.blipFinal[idx2])
REMOVE_BLIP(cargoArgs.blipFinal[idx2])
PRINTLN("REMOVING BLIP: ", idx2)
cargoArgs.bOkayToAddBackInObjBlip[closestIndex] = FALSE
ENDIF
ENDFOR
ELIF closestIndex = 2
FOR idx2 = 8 TO 11
IF NOT IS_ENTITY_DEAD(cargoArgs.vehFinal[idx2]) AND DOES_BLIP_EXIST(cargoArgs.blipFinal[idx2])
REMOVE_BLIP(cargoArgs.blipFinal[idx2])
PRINTLN("REMOVING BLIP: ", idx2)
ENDIF
ENDFOR
ENDIF
ENDPROC
PROC ALTERNATE_FINAL_BLIP_REPEATABLE(PLANE_CARGO_ARGS& cargoArgs, BLIP_INDEX& myLocationBlip[], STRING sLastObjective, BOOL& bGenericPrint, BOOL bOutOfVehicle)
INT idx2
INT closestIndex
VECTOR vPlayerPosition
FLOAT fDist
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
vPlayerPosition = GET_ENTITY_COORDS(PLAYER_PED_ID())
ENDIF
/*EXPLANATION: First we check what is the closest group index, then we remove all the multi blips from the non-closest index, i.e
other mini-group blips. This is to ensure we always have IF the player is close enough, 1) one group of mini-blips and 2) 0-2 other
group blips. Once the player is within range, we remove the group blip and blip the mini-blips. If they go out of range, the
group blip should return.
*/
IF NOT bOutOfVehicle //might also need a wanted check here
closestIndex = FIND_CLOSEST_ENTITY_INDEX(cargoArgs.vehDropoff, vPlayerPosition)
// PRINTLN("closestIndex = ", closestIndex)
IF closestIndex <> -1
cargoArgs.bOkayToAddBackInObjBlip[closestIndex] = TRUE
ENDIF
// If closest index is 0, remove groups 1 and 2, i.e. 4-7 and 8-11
IF closestIndex = 0
FOR idx2 = 4 TO 11
IF NOT IS_ENTITY_DEAD(cargoArgs.vehFinal[idx2]) AND DOES_BLIP_EXIST(cargoArgs.blipFinal[idx2])
REMOVE_BLIP(cargoArgs.blipFinal[idx2])
PRINTLN("REMOVING BLIP: ", idx2)
cargoArgs.bOkayToAddBackInObjBlip[closestIndex] = FALSE
ENDIF
ENDFOR
// If the closest index is 1, remove groups 0 and 2, i.e. 0-3 and 8-11
ELIF closestIndex = 1
FOR idx2 = 0 TO 3
IF NOT IS_ENTITY_DEAD(cargoArgs.vehFinal[idx2]) AND DOES_BLIP_EXIST(cargoArgs.blipFinal[idx2])
REMOVE_BLIP(cargoArgs.blipFinal[idx2])
PRINTLN("REMOVING BLIP: ", idx2)
cargoArgs.bOkayToAddBackInObjBlip[closestIndex] = FALSE
ENDIF
ENDFOR
FOR idx2 = 8 TO 11
IF NOT IS_ENTITY_DEAD(cargoArgs.vehFinal[idx2]) AND DOES_BLIP_EXIST(cargoArgs.blipFinal[idx2])
REMOVE_BLIP(cargoArgs.blipFinal[idx2])
PRINTLN("REMOVING BLIP: ", idx2)
cargoArgs.bOkayToAddBackInObjBlip[closestIndex] = FALSE
ENDIF
ENDFOR
// If the closest index is 2, remove groups 0 and 1, i.e. 0-3 and 4-7
ELIF closestIndex = 2
FOR idx2 = 0 TO 7
IF NOT IS_ENTITY_DEAD(cargoArgs.vehFinal[idx2]) AND DOES_BLIP_EXIST(cargoArgs.blipFinal[idx2])
REMOVE_BLIP(cargoArgs.blipFinal[idx2])
PRINTLN("REMOVING BLIP: ", idx2)
cargoArgs.bOkayToAddBackInObjBlip[closestIndex] = FALSE
ENDIF
ENDFOR
ENDIF
IF closestIndex <> -1
fDist = GET_DISTANCE_BETWEEN_ENTITIES(cargoArgs.vehDropoff[closestIndex], PLAYER_PED_ID(), FALSE)
IF fDist < 600
IF NOT bGenericPrint
sLastObjective = sLastObjective
bGenericPrint = TRUE
sLastObjective = "DTRFAIR_OBJCF"
ENDIF
IF DOES_BLIP_EXIST(myLocationBlip[closestIndex])
REMOVE_BLIP(myLocationBlip[closestIndex])
PRINTLN("REMOVING myLocationBlip: ", closestIndex)
ENDIF
IF closestIndex = 0
FOR idx2 = 0 TO 3
IF NOT IS_ENTITY_DEAD(cargoArgs.vehFinal[idx2]) AND NOT DOES_BLIP_EXIST(cargoArgs.blipFinal[idx2])
cargoArgs.blipFinal[idx2] = ADD_BLIP_FOR_ENTITY(cargoArgs.vehFinal[idx2])
PRINTLN("ADDING BLIP INDEX: ", idx2)
ENDIF
ENDFOR
ELIF closestIndex = 1
FOR idx2 = 4 TO 7
IF NOT IS_ENTITY_DEAD(cargoArgs.vehFinal[idx2]) AND NOT DOES_BLIP_EXIST(cargoArgs.blipFinal[idx2])
cargoArgs.blipFinal[idx2] = ADD_BLIP_FOR_ENTITY(cargoArgs.vehFinal[idx2])
PRINTLN("ADDING BLIP INDEX: ", idx2)
ENDIF
ENDFOR
ELIF closestIndex = 2
FOR idx2 = 8 TO 11
IF NOT IS_ENTITY_DEAD(cargoArgs.vehFinal[idx2]) AND NOT DOES_BLIP_EXIST(cargoArgs.blipFinal[idx2])
cargoArgs.blipFinal[idx2] = ADD_BLIP_FOR_ENTITY(cargoArgs.vehFinal[idx2])
PRINTLN("ADDING BLIP INDEX: ", idx2)
ENDIF
ENDFOR
ENDIF
ELSE
IF NOT DOES_BLIP_EXIST(myLocationBlip[closestIndex])
// PRINTLN("closestIndex = ", closestIndex)
IF cargoArgs.bOkayToAddBackInObjBlip[closestIndex]
INT iIndexToUse
iIndexToUse = GET_ENTITY_INDEX(closestIndex, cargoArgs)
IF iIndexToUse <> -1
REMOVE_MULTI_BLIP_BEFORE_ADDING_MAIN_BLIP(cargoArgs)
myLocationBlip[closestIndex] = ADD_BLIP_FOR_ENTITY(cargoArgs.vehFinal[iIndexToUse])
SET_BLIP_SCALE(myLocationBlip[closestIndex], 1.0)
SET_BLIP_COLOUR(myLocationBlip[closestIndex], BLIP_COLOUR_RED)
PRINTLN("ADDING BACK IN myLocationBlip closestIndex = ", closestIndex)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
PROC HANDLE_MUSIC_NEAR_DROP(PLANE_CARGO_ARGS &cargoArgs, BOOL& bDoBomb)
IF g_savedGlobals.sTraffickingData.iAirRank >= 5
IF bDoBomb
TRIGGER_MUSIC_EVENT("OJDA3_HATCH")
PRINTLN("REPEATABLE BOMB: HANDLE_MUSIC_NEAR_DROP - OJDA3_HATCH")
PRINTLN("REPEATABLE BOMB: HANDLE_MUSIC_NEAR_DROP: RANK = ", g_savedGlobals.sTraffickingData.iAirRank)
ELSE
TRIGGER_MUSIC_EVENT("OJDA2_READY_1ST")
PRINTLN("REPEATABLE DROP: HANDLE_MUSIC_NEAR_DROP - OJDA2_READY_1ST")
PRINTLN("REPEATABLE DROP: HANDLE_MUSIC_NEAR_DROP: RANK = ", g_savedGlobals.sTraffickingData.iAirRank)
ENDIF
ENDIF
SWITCH g_savedGlobals.sTraffickingData.iAirRank
CASE 0
IF cargoArgs.iNumSuccessfulDrops = 1
TRIGGER_MUSIC_EVENT("OJDA1_READY_2ND")
PRINTLN("TRIGGERING MUSIC - OJDA1_READY_2ND")
PREPARE_MUSIC_EVENT("OJDA1_2ND_DROPPED")
PRINTLN("PREPARING MUSIC - OJDA1_2ND_DROPPED")
ENDIF
PRINTLN("HANDLE_MUSIC_NEAR_DROP: RANK = ", g_savedGlobals.sTraffickingData.iAirRank)
BREAK
//--------------------------------------------------------------------------------------------------------------------------
CASE 1
IF cargoArgs.iNumSuccessfulDrops = 0
TRIGGER_MUSIC_EVENT("OJDA2_READY_1ST")
PRINTLN("TRIGGERING MUSIC - OJDA2_READY_1ST")
ENDIF
PRINTLN("HANDLE_MUSIC_NEAR_DROP: RANK = ", g_savedGlobals.sTraffickingData.iAirRank)
BREAK
//--------------------------------------------------------------------------------------------------------------------------
CASE 2
BREAK
//--------------------------------------------------------------------------------------------------------------------------
CASE 3
PRINTLN("HANDLE_MUSIC_NEAR_DROP: RANK = ", g_savedGlobals.sTraffickingData.iAirRank)
BREAK
//--------------------------------------------------------------------------------------------------------------------------
CASE 4
BREAK
ENDSWITCH
ENDPROC
//TODO.. shouldn't be doing new blips every frame..
PROC ALTERNATE_BLIP_STYLES(ARGS& myArgs, BLIP_INDEX& myLocationBlip[], VECTOR& vCurDestObjective[], PLANE_DATA& myData,
PLANE_CARGO_ARGS& cargoArgs, VECTOR& vPlayerPos, BOOL& bDoBomb)
INT idx, closestIndex
closestIndex = FIND_CLOSEST_LOCATION_INDEX(vCurDestObjective, vPlayerPos)
IF GET_DISTANCE_BETWEEN_COORDS(vPlayerPos, vCurDestObjective[closestIndex]) < 500
IF NOT bBombBayDoorsOpen
IF NOT IS_ENTITY_DEAD(myData.myPlane)
OPEN_BOMB_BAY_DOORS(myData.myPlane)
bBombBayDoorsOpen = TRUE
ODDJOB_PLAY_SOUND("DRUG_TRAFFIC_AIR_BAY_DOOR_OPEN_MASTER", cargoArgs.soundID, FALSE, myData.myPlane)
ENDIF
ENDIF
ELSE
IF cargoArgs.bButtonPressed
IF NOT IS_TIMER_STARTED(cargoArgs.tBombBayTimer)
START_TIMER_NOW(cargoArgs.tBombBayTimer)
PRINTLN("STARTING TIMER - cargoArgs.tBombBayTimer")
ELSE IS_TIMER_STARTED(cargoArgs.tBombBayTimer)
fBombBayTime = GET_TIMER_IN_SECONDS(cargoArgs.tBombBayTimer)
IF fBombBayTime > 3.0
IF bBombBayDoorsOpen
IF NOT IS_ENTITY_DEAD(myData.myPlane)
CLOSE_BOMB_BAY_DOORS(myData.myPlane)
PRINTLN("bBombBayDoorsOpen = FALSE - SPECIAL")
ODDJOB_PLAY_SOUND("DRUG_TRAFFIC_AIR_BAY_DOOR_OPEN_MASTER", cargoArgs.soundID, FALSE, myData.myPlane)
PRINTLN("CLOSING BOMB BAY DOORS - 04")
bBombBayDoorsOpen = FALSE
cargoArgs.bButtonPressed = FALSE
fBombBayTime = 0
RESTART_TIMER_NOW(cargoArgs.tBombBayTimer)
ENDIF
ENDIF
ENDIF
ENDIF
ELSE
IF bBombBayDoorsOpen AND NOT bCheckTime
IF NOT IS_ENTITY_DEAD(myData.myPlane)
CLOSE_BOMB_BAY_DOORS(myData.myPlane)
ODDJOB_PLAY_SOUND("DRUG_TRAFFIC_AIR_BAY_DOOR_OPEN_MASTER", cargoArgs.soundID, FALSE, myData.myPlane)
PRINTLN("CLOSING BOMB BAY DOORS - 05")
bBombBayDoorsOpen = FALSE
ENDIF
ENDIF
ENDIF
ENDIF
REPEAT myData.iNumDrops idx
IF NOT cargoArgs.bCargoDropComplete[idx]
IF myArgs.bDoTrain
IF idx = 0
IF NOT IS_ENTITY_DEAD(cargoArgs.vehDropoff[0])
vCurDestObjective[0] = GET_ENTITY_COORDS(cargoArgs.vehDropoff[0])
ENDIF
ELIF idx = 1
vCurDestObjective[1] = << -1992.4556, 4764.2944, 0 >>
ENDIF
ENDIF
IF NOT cargoArgs.bCloseRange[idx]
IF idx = closestIndex
IF DOES_BLIP_EXIST(myLocationBlip[idx])
SET_BLIP_SCALE(myLocationBlip[idx], 1.0)
ENDIF
ELSE
IF DOES_BLIP_EXIST(myLocationBlip[idx])
SET_BLIP_SCALE(myLocationBlip[idx], 0.75)
ENDIF
ENDIF
ENDIF
// FLOAT fTempFloat
// fTempFloat = GET_DISTANCE_BETWEEN_COORDS(vPlayerPos, vCurDestObjective[idx])
// PRINTLN("fTempFloat = ", fTempFloat)
// Don't run this check on train.
IF NOT myArgs.bDoTrain
// Draw radius blip
IF GET_DISTANCE_BETWEEN_COORDS(vPlayerPos, vCurDestObjective[idx], FALSE) < fBlipChangingDistance
//cargoArgs.bWithinRange = TRUE
IF NOT cargoArgs.bCloseRange[idx] OR NOT DOES_BLIP_EXIST(myLocationBlip[idx])
HANDLE_MUSIC_NEAR_DROP(cargoArgs, bDoBomb)
cargoArgs.bCloseRange[idx] = TRUE
// Removing coordinate blip and adding in radius blips
REMOVE_BLIP(myLocationBlip[idx])
IF myArgs.bDoBomb
myLocationBlip[idx] = ADD_BLIP_FOR_RADIUS(vCurDestObjective[idx], EXPLODE_RADIUS+5)
SET_BLIP_NAME_FROM_TEXT_FILE(myLocationBlip[idx], "DTRFAIR_TGT")
SET_BLIP_COLOUR(myLocationBlip[idx], BLIP_COLOUR_RED)
PRINTLN("ADDED RADIUS BLIP FOR BLIP INDEX: ", idx)
ELSE
myLocationBlip[idx] = ADD_BLIP_FOR_RADIUS(vCurDestObjective[idx], DROP_RADIUS)
SET_BLIP_NAME_FROM_TEXT_FILE(myLocationBlip[idx], "DTRFAIR_DRP")
SET_BLIP_COLOUR(myLocationBlip[idx], BLIP_COLOUR_YELLOW)
PRINTLN("ADDED RADIUS BLIP FOR BLIP INDEX: ", idx)
ENDIF
SET_BLIP_ALPHA(myLocationBlip[idx], 255)
DEBUG_PRINT("ADDING IN RADIUS BLIP")
ENDIF
// Draw smaller blip
ELSE
//cargoArgs.bWithinRange = FALSE
IF cargoArgs.bCloseRange[idx] OR NOT DOES_BLIP_EXIST(myLocationBlip[idx])
cargoArgs.bCloseRange[idx] = FALSE
REMOVE_BLIP(myLocationBlip[idx])
myLocationBlip[idx] = ADD_BLIP_FOR_COORD(vCurDestObjective[idx])
IF myArgs.bDoBomb
SET_BLIP_COLOUR(myLocationBlip[idx], BLIP_COLOUR_RED)
SET_BLIP_NAME_FROM_TEXT_FILE(myLocationBlip[idx], "DTRFAIR_TGT")
ELSE
SET_BLIP_COLOUR(myLocationBlip[idx], BLIP_COLOUR_YELLOW)
SET_BLIP_NAME_FROM_TEXT_FILE(myLocationBlip[idx], "DTRFAIR_DRP")
ENDIF
DEBUG_MESSAGE("Adding normal blip")
ENDIF
ENDIF
ELSE
// SPECIAL CASE FOR TRAIN
IF GET_DISTANCE_BETWEEN_COORDS(vPlayerPos, vCurDestObjective[0]) < fBlipChangingDistance
IF NOT bTriggerNearTrainMusic
TRIGGER_MUSIC_EVENT("OJDA4_TRAIN")
PRINTLN("TRIGGERING MUSIC - OJDA4_TRAIN")
PREPARE_MUSIC_EVENT("OJDA4_TRAIN_HIT")
PRINTLN("PREPARING MUSIC - OJDA4_TRAIN_HIT")
bTriggerNearTrainMusic = TRUE
ENDIF
ELIF GET_DISTANCE_BETWEEN_COORDS(vPlayerPos, vCurDestObjective[1]) < fBlipChangingDistance
IF NOT bTriggerNearBoatMusic
TRIGGER_MUSIC_EVENT("OJDA4_BOATS")
PRINTLN("TRIGGERING MUSIC - OJDA4_BOATS")
bTriggerNearBoatMusic = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDREPEAT
ENDPROC
FUNC BOOL UPDATE_HEIGHT_HUD(BOOL& bIsHighAlt, PLANE_CARGO_ARGS& cargoArgs, PLANE_DATA& planeData, FLOAT& fHeight, FLOAT& fLastHeight, structTimer& tHighAltTimer, FAIL_REASON_ENUM& failReason, VECTOR& vPlayerPos, structPedsForConversation MyLocalPedStruct)
VECTOR vPlayerVec
FLOAT fWaterHeight = 0.0
FLOAT fIntensity
vPlayerVec = vPlayerPos
//If we can't get a z collision for the ground use the water height instead
IF NOT GET_GROUND_Z_FOR_3D_COORD(vPlayerVec, fHeight)
IF NOT GET_WATER_HEIGHT_NO_WAVES(vPlayerVec, fHeight)
fHeight = (cargoArgs.fActualMaxHeight-1)
ENDIF
ENDIF
IF GET_WATER_HEIGHT_NO_WAVES(vPlayerVec, fWaterHeight)
IF fWaterHeight > fHeight
fHeight = fWaterHeight
ENDIF
ENDIF
SET_FAKE_MINIMAP_MAX_ALTIMETER_HEIGHT(fHeight+planeData.fmaxHeight)
fLastHeight = fHeight
IF (vPlayerVec.z - fHeight) > planeData.fmaxHeight
IF bIsHighAlt
IF TIMER_DO_WHEN_READY(tHighAltTimer, planeData.fAltTimeLimit)
failReason = FAIL_TIME_ALTITUDE
DEBUG_PRINT("FAILED ALTITUDE CHECK, RETURNING TRUE")
RETURN TRUE
ENDIF
ELSE
bIsHighAlt = TRUE
RESTART_TIMER_NOW(tHighAltTimer)
ENDIF
ELSE
bIsHighAlt = FALSE
ENDIF
SET_TEXT_SCALE(0.4, 0.4)
IF (vPlayerVec.z - fLastHeight) > cargoArgs.fActualMaxHeight
cargoArgs.fActualMaxHeight = vPlayerVec.z - fLastHeight
ENDIF
IF bIsHighAlt AND TIMER_DO_WHEN_READY(tHighAltTimer, 1.0)
IF soundIdAlarm = -1
soundIdAlarm = GET_SOUND_ID()
PLAY_SOUND_FRONTEND(soundIdAlarm, "Altitude_Warning", "EXILE_1")
CREATE_CONVERSATION(MyLocalPedStruct, "ARMSAUD", "ARMS_A_HALT", CONV_PRIORITY_VERY_HIGH)
cargoArgs.bDetectedOnRadar = TRUE
ENDIF
FLOAT fHeightAboveAllowable = (vPlayerVec.z - fHeight) - planeData.fmaxHeight
// PRINTLN("MAX HEIGHT = ", planeData.fmaxHeight)
// PRINTLN("ACTUAL HEIGHT ABOVE GROUND = ", (vPlayerVec.z - fHeight))
// PRINTLN("fHeightAboveAllowable = ", fHeightAboveAllowable)
IF fHeightAboveAllowable >= 100
fIntensity = 1.0
PRINTLN("fIntensity = 1.0")
ELIF fHeightAboveAllowable >= 50
fIntensity = 0.5
PRINTLN("fIntensity = 0.5")
ELSE
fIntensity = 0.0
PRINTLN("fIntensity = 0.0")
ENDIF
SET_VARIABLE_ON_SOUND(soundIdAlarm, "Intensity", fIntensity)
ELSE
STOP_SOUND(soundIdAlarm)
RELEASE_SOUND_ID(soundIdAlarm)
soundIdAlarm = -1
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL UPDATE_UI(PLANE_CARGO_ARGS& cargoArgs, PLANE_DATA& myData, BOOL bDoBomb)
INT iNumCargoLeft
IF bDoBomb
DRAW_GENERIC_BIG_DOUBLE_NUMBER(cargoArgs.iNumSuccessfulDrops, myData.iNumDrops, "DTRFAIR_NEW2", -1, HUD_COLOUR_WHITE, HUDORDER_DONTCARE)
ELSE
DRAW_GENERIC_BIG_DOUBLE_NUMBER(cargoArgs.iNumSuccessfulDrops, myData.iNumDrops, "DTRFAIR_NEW1", -1, HUD_COLOUR_WHITE, HUDORDER_DONTCARE)
ENDIF
iNumCargoLeft = (myData.iNumTotalCargo - cargoArgs.iNumReleased)
IF bDoBomb
DRAW_GENERIC_BIG_NUMBER(iNumCargoLeft, "DTRFAIR_NEW4")
ELSE
DRAW_GENERIC_BIG_NUMBER(iNumCargoLeft, "DTRFAIR_NEW3")
ENDIF
RETURN FALSE
ENDFUNC