////////////////////////////////////////////////////////////////////////////////////////// // // // 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(<>,<>) 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