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

3082 lines
114 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.
///// appBusinessHub
///// Mark Richardson - 26/04/2018
///// Hacker truck app functionality
///// Scaleform documentation: https://hub.rockstargames.com/pages/viewpage.action?spaceKey=RSGGTAV&title=Hacker+Truck+Desktop+App
USING "rage_builtins.sch"
USING "globals.sch"
USING "cellphone_public.sch"
USING "commands_zone.sch"
USING "menu_public.sch"
USING "net_realty_hangar.sch"
USING "net_gang_boss.sch"
USING "net_simple_interior.sch"
//***********Script CONSTS***********
//Local BS consts
CONST_INT NC_BS_OVERLAY_SCREEN_ACTIVE 0
CONST_INT NC_BS_LAUNCHED_MISSION 1
CONST_INT NC_BS_PRINTED_PAUSE_MENU_ACTIVE 2
CONST_INT NC_BS_WAITING_FOR_BUTTON_RETURN_VALUE 3
CONST_INT NC_BS_JOB_OVERLAY_ACTIVE 4
CONST_INT NC_BS_JOB_OVERLAY_SELECTED_SHIPMENT_SIZE 5
CONST_INT NC_BS_SPECIAL_ITEM_ACTIVE 6
CONST_INT NC_BS_IE_COOLDOWN_RUNNING 7
CONST_INT NC_BS_CURRENTLY_PLAYING_TUTORIAL 8
CONST_INT NC_BS_DIALOGUE_TUTORIAL_COMPLETE 9
CONST_INT NC_BS_INITIAL_TUTORIAL_COMPLETE 10
CONST_INT NC_BS_INITIAL_TUTORIAL_COMPLETE_THIS_BOOT 11
CONST_INT NC_BS_DONE_BUSINESS_PURCHASE_TUT_THIS_BOOT 12
CONST_INT ciINPUT_KEYBOARD_DOWN 300
CONST_INT ciINPUT_KEYBOARD_UP 301
CONST_INT ciTYPE_FORMAT_HIDDEN 0
CONST_INT ciTYPE_FORMAT_CURRENCY 1
CONST_INT ciTYPE_FORMAT_TIME 2
CONST_INT MAX_WORKS_JOBS 6
//Enum for button indexes returned by SF
ENUM BH_BUTTON_INDEXES
BUTTON_OVERLAY_CANCEL = 0,
BUTTON_OVERLAY_ACCEPT,
BUTTON_LOGIN,
BUTTON_HACKER_WORKS_MISSION,
BUTTON_AIR_FREIGHT_MISSION,
BUTTON_SPECIAL_CARGO_MISSION,
BUTTON_VEHICLE_CARGO_MISSION,
BUTTON_GUNRUNNING_MISSION,
BUTTON_DRUG_BUSINESS_MISSION,
BUTTON_JOB1,
BUTTON_JOB2,
BUTTON_JOB3,
BUTTON_JOB4,
BUTTON_JOB5,
BUTTON_JOB6,
BUTTON_JOB7,
BUTTON_JOB8,
BUTTON_JOB9
ENDENUM
//Enum for the current page ID
ENUM BH_PAGE_ID
PAGE_LOGIN = 0,
PAGE_HOME
ENDENUM
ENUM NC_APP_STAGE_ID
NCA_STAGE_IDLE = 0,
//Overlay on screen stages
NCA_STAGE_CONFIRM_HACKER_WORKS_MISSION_LAUNCH, //Confirm the launch of a hacker works mission
NCA_STAGE_CONFIRM_AIR_FREIGHT_MISSION_LAUNCH, //Confirm the launch of a hangar air freight mission
NCA_STAGE_CONFIRM_SPECIAL_CARGO_MISSION_LAUNCH, //Confirm the launch of a special cargo mission
NCA_STAGE_CONFIRM_VEHICLE_CARGO_MISSION_LAUNCH, //Confirm the launch of a vehicle cargo mission
NCA_STAGE_CONFIRM_GUNRUNNING_MISSION_LAUNCH, //Confirm the launch of a gunrunning missionn
NCA_STAGE_CONFIRM_DRUG_BUSINESS_MISSION_LAUNCH //Confirm the launch of a biker business mission
ENDENUM
ENUM NC_MISSION_TYPE
NC_BOSS_WORK,
NC_AIR_FREIGHT,
NC_SPECIAL_CARGO,
NC_VEHICLE_CARGO,
NC_WEAPONS_CARGO,
NC_DRUG_CARGO,
NC_COUNT
ENDENUM
ENUM NC_TT_JOB_NA_REASON
NC_TT_NONE = 0, //No reason to block the launch
NC_TT_JOB_GENERIC, //No specific reason
NC_TT_ON_CD_PRIMARY, //The cooldown is active after just completing this mission
NC_TT_ON_CD_GLOBAL, //The coolodown is active after completing another mission
NC_TT_NEED_DRONE, //You need to purchase the drone
NC_TT_NO_JOB_GANG, //The job is not available due to a gang member being too close
NC_TT_NO_JOB_NON_GANG, //The job is not available due to another being too close
NC_TT_INSUFFICIENT_GOONS, //The job is not available due to a lack of gang menbers
NC_TT_IN_HUB, //The hacker truck is in the hub
//Biker
NC_TT_NOT_SETUP, //You need to setup your biker business
NC_TT_SUPPLIES_FULL, //You do not need supplies
NC_TT_SUSPENDED_PROD, //You have suspended production
NC_TT_BOUGHT_SUPPLIES, //You have already bought supplies
//Smuggler
NC_TT_SMUG_CD, //Air freight mission on cooldown
NC_TT_SMUG_FULL, //The Hangar is full
//Special Cargo
NC_TT_SC_FULL, //The warehouse is full
NC_TT_SC_ON_CD //The cooldown timer is active
ENDENUM
CONST_INT ciMAX_JOB_SLOTS 9
//***********Script variables***********
INT iBS = 0
INT iMissionIDToLaunch = -1
INT iSelectedMissionSubVar = -1
INT iJobUpdateStaggeredLoop = 0 //Staggered loop var to prevent updating all jobs in one frame
INT iTutorialHelpTime = 0
INT iTutorialDialogueID = -1
STRING sMissionLanuchFailReason = ""
BH_PAGE_ID eCurrentPage = PAGE_LOGIN
NC_APP_STAGE_ID eCurrentStage = NCA_STAGE_IDLE
NC_MISSION_TYPE eCurrentMissionType = NC_BOSS_WORK
structPedsForConversation tutPedStruct
NC_TT_JOB_NA_REASON eToolTipReason[ciMAX_JOB_SLOTS]
//Special cargo tracking variables
INT iSelectedSCWarehouse = ciW_Invalid
CONTRABAND_SIZE eSelectedShipmentSize = CONTRABAND_SMALL
CONTRABAND_TYPE eActiveContrabandType = CONTRABAND_TYPE_INVALID
//Hangar mission tracking variables
eSMUGGLED_GOODS_TYPE eSelectedHangarGoodsType
//Biker business tracking variable
FACTORY_ID eSelectedFactory
//The Scaleform movie
SCALEFORM_INDEX mov
SCALEFORM_RETURN_INDEX currentSelectionReturnIndex
//Control input variables
INT iLeftX
INT iLeftY
INT iRightX
INT iRightY
SCRIPT_TIMER stUpdateCDTimer
SCRIPT_TIMER stUpdateLockReasonsTimer
SCRIPT_TIMER stLoginAnimation
SCRIPT_TIMER stTutorialTimer
//***********Script functions***********
PROC SCRIPT_CLEANUP(BOOL bDontCleanupBrowserFlag = FALSE, BOOL bPlayExitSound = TRUE)
SET_SCALEFORM_MOVIE_AS_NO_LONGER_NEEDED(mov)
SET_BROWSER_OPEN(bDontCleanupBrowserFlag)
DISABLE_CELLPHONE(FALSE)
Unpause_Objective_Text()
SET_AUDIO_SCRIPT_CLEANUP_TIME(1000)
IF bPlayExitSound
PLAY_SOUND_FRONTEND(-1, "Logout", "DLC_GR_MOC_Computer_Sounds")
ENDIF
IF IS_PC_VERSION()
SET_MULTIHEAD_SAFE(FALSE, TRUE, TRUE, TRUE)
ENDIF
THEFEED_RESUME()
IF IS_AUDIO_SCENE_ACTIVE("GTAO_Computer_Screen_Active_Scene")
STOP_AUDIO_SCENE("GTAO_Computer_Screen_Active_Scene")
ENDIF
CLEAR_BIT(g_SimpleInteriorData.iForthBS, BS4_SIMPLE_INTERIOR_NC_DRAW_MISSIONS_SCREEN)
TERMINATE_THIS_THREAD()
ENDPROC
PROC PLAY_CLICK_LINK_SOUND()
PLAY_SOUND_FRONTEND(-1, "Select_Mission_Are_You_Sure", "DLC_GR_MOC_Computer_Sounds")
ENDPROC
PROC PLAY_CLICK_LINK_FAIL_SOUND()
PLAY_SOUND_FRONTEND(-1, "Select_Mission_Unavailable", "DLC_GR_MOC_Computer_Sounds")
ENDPROC
#IF IS_DEBUG_BUILD
FUNC STRING DEBUG_GET_BUTTON_NAME(BH_BUTTON_INDEXES eButton)
SWITCH eButton
CASE BUTTON_OVERLAY_CANCEL RETURN "BUTTON_OVERLAY_CANCEL"
CASE BUTTON_OVERLAY_ACCEPT RETURN "BUTTON_OVERLAY_ACCEPT"
CASE BUTTON_LOGIN RETURN "BUTTON_LOGIN"
CASE BUTTON_HACKER_WORKS_MISSION RETURN "BUTTON_HACKER_WORKS_MISSION"
CASE BUTTON_AIR_FREIGHT_MISSION RETURN "BUTTON_AIR_FREIGHT_MISSION"
CASE BUTTON_SPECIAL_CARGO_MISSION RETURN "BUTTON_SPECIAL_CARGO_MISSION"
CASE BUTTON_VEHICLE_CARGO_MISSION RETURN "BUTTON_VEHICLE_CARGO_MISSION"
CASE BUTTON_GUNRUNNING_MISSION RETURN "BUTTON_GUNRUNNING_MISSION"
CASE BUTTON_DRUG_BUSINESS_MISSION RETURN "BUTTON_DRUG_BUSINESS_MISSION"
CASE BUTTON_JOB1 RETURN "BUTTON_JOB1"
CASE BUTTON_JOB2 RETURN "BUTTON_JOB2"
CASE BUTTON_JOB3 RETURN "BUTTON_JOB3"
CASE BUTTON_JOB4 RETURN "BUTTON_JOB4"
CASE BUTTON_JOB5 RETURN "BUTTON_JOB5"
CASE BUTTON_JOB6 RETURN "BUTTON_JOB6"
CASE BUTTON_JOB7 RETURN "BUTTON_JOB7"
CASE BUTTON_JOB8 RETURN "BUTTON_JOB8"
CASE BUTTON_JOB9 RETURN "BUTTON_JOB9"
ENDSWITCH
RETURN "***INVALID***"
ENDFUNC
FUNC STRING DEBUG_GET_PAGE_NAME(BH_PAGE_ID ePage)
SWITCH ePage
CASE PAGE_HOME RETURN "PAGE_HOME"
CASE PAGE_LOGIN RETURN "PAGE_LOGIN"
ENDSWITCH
RETURN "***INVALID***"
ENDFUNC
FUNC STRING NC_APP_GET_APP_STAGE_DEBUG_NAME(NC_APP_STAGE_ID eStage)
SWITCH eStage
CASE NCA_STAGE_IDLE RETURN "NCA_STAGE_IDLE"
CASE NCA_STAGE_CONFIRM_HACKER_WORKS_MISSION_LAUNCH RETURN "NCA_STAGE_CONFIRM_HACKER_WORKS_MISSION_LAUNCH"
CASE NCA_STAGE_CONFIRM_AIR_FREIGHT_MISSION_LAUNCH RETURN "NCA_STAGE_CONFIRM_AIR_FREIGHT_MISSION_LAUNCH"
CASE NCA_STAGE_CONFIRM_SPECIAL_CARGO_MISSION_LAUNCH RETURN "NCA_STAGE_CONFIRM_SPECIAL_CARGO_MISSION_LAUNCH"
CASE NCA_STAGE_CONFIRM_VEHICLE_CARGO_MISSION_LAUNCH RETURN "NCA_STAGE_CONFIRM_VEHICLE_CARGO_MISSION_LAUNCH"
CASE NCA_STAGE_CONFIRM_GUNRUNNING_MISSION_LAUNCH RETURN "NCA_STAGE_CONFIRM_GUNRUNNING_MISSION_LAUNCH"
CASE NCA_STAGE_CONFIRM_DRUG_BUSINESS_MISSION_LAUNCH RETURN "NCA_STAGE_CONFIRM_DRUG_BUSINESS_MISSION_LAUNCH"
ENDSWITCH
RETURN "****Invalid****"
ENDFUNC
FUNC STRING NC_APP_GET_MISSION_TYPE_DEBUG_NAME(NC_MISSION_TYPE eMissionType)
SWITCH eMissionType
CASE NC_BOSS_WORK RETURN "NC_BOSS_WORK"
CASE NC_AIR_FREIGHT RETURN "NC_AIR_FREIGHT"
CASE NC_SPECIAL_CARGO RETURN "NC_SPECIAL_CARGO"
CASE NC_VEHICLE_CARGO RETURN "NC_VEHICLE_CARGO"
CASE NC_WEAPONS_CARGO RETURN "NC_WEAPONS_CARGO"
CASE NC_DRUG_CARGO RETURN "NC_DRUG_CARGO"
CASE NC_COUNT RETURN "NC_COUNT"
ENDSWITCH
RETURN "****Invalid****"
ENDFUNC
FUNC STRING NC_APP_GET_TOOL_TIP_ENUM_DEBUG_NAME(NC_TT_JOB_NA_REASON eReason)
SWITCH eReason
CASE NC_TT_NONE RETURN "NC_TT_NONE"
CASE NC_TT_JOB_GENERIC RETURN "NC_TT_JOB_GENERIC"
CASE NC_TT_ON_CD_PRIMARY RETURN "NC_TT_ON_CD_PRIMARY"
CASE NC_TT_ON_CD_GLOBAL RETURN "NC_TT_ON_CD_GLOBAL"
CASE NC_TT_NEED_DRONE RETURN "NC_TT_NEED_DRONE"
CASE NC_TT_NO_JOB_GANG RETURN "NC_TT_NO_JOB_GANG"
CASE NC_TT_NO_JOB_NON_GANG RETURN "NC_TT_NO_JOB_NON_GANG"
CASE NC_TT_INSUFFICIENT_GOONS RETURN "NC_TT_INSUFFICIENT_GOONS"
CASE NC_TT_IN_HUB RETURN "NC_TT_IN_HUB"
//Biker
CASE NC_TT_NOT_SETUP RETURN "NC_TT_NOT_SETUP"
CASE NC_TT_SUPPLIES_FULL RETURN "NC_TT_SUPPLIES_FULL"
CASE NC_TT_SUSPENDED_PROD RETURN "NC_TT_SUSPENDED_PROD"
CASE NC_TT_BOUGHT_SUPPLIES RETURN "NC_TT_BOUGHT_SUPPLIES"
//Smuggler
CASE NC_TT_SMUG_CD RETURN "NC_TT_SMUG_CD"
CASE NC_TT_SMUG_FULL RETURN "NC_TT_SMUG_FULL"
//Special Cargo
CASE NC_TT_SC_FULL RETURN "NC_TT_SC_FULL"
CASE NC_TT_SC_ON_CD RETURN "NC_TT_SC_ON_CD"
ENDSWITCH
RETURN "****Invalid****"
ENDFUNC
#ENDIF
PROC NC_APP_SET_TOOL_TIP_REASON_FOR_MISSION_WITH_INDEX(NC_TT_JOB_NA_REASON eReason, INT iMissionIndex)
IF iMissionIndex < 0
OR iMissionIndex >= ciMAX_JOB_SLOTS
CASSERTLN(DEBUG_INTERNET, "NC_APP_SET_TOOL_TIP_REASON_FOR_MISSION_WITH_INDEX - Using invalid index: ", iMissionIndex)
EXIT
ENDIF
PRINTLN("<APP_NC> NC_APP_SET_TOOL_TIP_REASON_FOR_MISSION_WITH_INDEX - Index: ", iMissionIndex, " Reason: ", NC_APP_GET_TOOL_TIP_ENUM_DEBUG_NAME(eReason))
eToolTipReason[iMissionIndex] = eReason
ENDPROC
FUNC NC_TT_JOB_NA_REASON NC_APP_GET_TOOL_TIP_REASON_FOR_MISSION_WITH_INDEX(INT iMissionIndex)
IF iMissionIndex < 0
OR iMissionIndex >= ciMAX_JOB_SLOTS
CASSERTLN(DEBUG_INTERNET, "NC_APP_SET_TOOL_TIP_REASON_FOR_MISSION_WITH_INDEX - Using invalid index: ", iMissionIndex)
RETURN NC_TT_NONE
ENDIF
RETURN eToolTipReason[iMissionIndex]
ENDFUNC
FUNC BOOL NC_APP_IS_SPECIAL_ITEM_ACTIVE_FOR_SPECIAL_CARGO()
RETURN IS_BIT_SET(iBS, NC_BS_SPECIAL_ITEM_ACTIVE)
ENDFUNC
PROC SET_FMMC_MISSION_ID(INT iID)
iMissionIDToLaunch = iID
PRINTLN("<APP_NC> SET_FMMC_MISSION_ID - ID: ", iID)
ENDPROC
/// PURPOSE:
/// Returns if the overlay screen is currently active
FUNC BOOL NC_APP_IS_OVERLAY_OPEN()
RETURN IS_BIT_SET(iBS, NC_BS_OVERLAY_SCREEN_ACTIVE)
ENDFUNC
/// PURPOSE:
/// Returns the current app stage
FUNC NC_APP_STAGE_ID NC_APP_GET_APP_STAGE()
RETURN eCurrentStage
ENDFUNC
/// PURPOSE:
/// Sets the current app stage
PROC NC_APP_SET_APP_STAGE(NC_APP_STAGE_ID eNewStage)
IF eCurrentStage != eNewStage
eCurrentStage = eNewStage
PRINTLN("<APP_NC> NC_APP_SET_APP_STAGE Setting new stage to: ", NC_APP_GET_APP_STAGE_DEBUG_NAME(eNewStage))
ENDIF
ENDPROC
/// PURPOSE:
/// Returns the current app stage
FUNC NC_MISSION_TYPE NC_APP_GET_APP_MISSION_TYPE()
RETURN eCurrentMissionType
ENDFUNC
/// PURPOSE:
/// Sets the current app stage
PROC NC_APP_SET_MISSION_TYPE(NC_MISSION_TYPE eNewMissionType)
IF eCurrentMissionType != eNewMissionType
eCurrentMissionType = eNewMissionType
PRINTLN("<APP_NC> NC_APP_SET_MISSION_TYPE Setting new type to: ", NC_APP_GET_MISSION_TYPE_DEBUG_NAME(eNewMissionType))
ENDIF
ENDPROC
PROC OPEN_PAGE(BH_PAGE_ID ePage)
IF ePage = PAGE_HOME
SET_BIT(g_SimpleInteriorData.iForthBS, BS4_SIMPLE_INTERIOR_NC_DRAW_MISSIONS_SCREEN)
ELSE
CLEAR_BIT(g_SimpleInteriorData.iForthBS, BS4_SIMPLE_INTERIOR_NC_DRAW_MISSIONS_SCREEN)
ENDIF
PRINTLN("<APP_NC> OPEN_PAGE - new page = ", DEBUG_GET_PAGE_NAME(ePage))
eCurrentPage = ePage
BEGIN_SCALEFORM_MOVIE_METHOD(mov, "SHOW_SCREEN")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(ENUM_TO_INT(ePage))
END_SCALEFORM_MOVIE_METHOD()
ENDPROC
PROC NC_APP_SET_MISSION_LAUNCH_FAIL_REASON(STRING sReason)
sMissionLanuchFailReason = sReason
PRINTLN("<APP_NC> NC_APP_SET_MISSION_LAUNCH_FAIL_REASON Setting new fail reason: ", GET_FILENAME_FOR_AUDIO_CONVERSATION(sReason))
ENDPROC
PROC NC_APP_CLEAR_MISSION_LAUNCH_FAIL_REASON()
sMissionLanuchFailReason = ""
PRINTLN("<APP_NC> NC_APP_CLEAR_MISSION_LAUNCH_FAIL_REASON called.")
ENDPROC
FUNC STRING NC_APP_GET_MISSION_LAUNCH_FAIL_REASON()
RETURN sMissionLanuchFailReason
ENDFUNC
/// PURPOSE:
/// Sets the mission unavailable value
FUNC BOOL CAN_PLAYER_LAUNCH_BOSS_WORK(INT iMissionToLaunch)
// Check that mission is available
IF NOT GB_IS_BOSS_MISSION_AVAILABLE(PLAYER_ID(), iMissionToLaunch, FALSE)
CPRINTLN(DEBUG_INTERNET, "<APP_NC> CAN_PLAYER_LAUNCH_BOSS_WORK: NOPE! mission unavailable")
INT iReason = GB_GET_BOSS_MISSION_UNAVAILABLE_REASON(PLAYER_ID(), iMissionToLaunch, FALSE)
IF iReason = GB_MU_REASON_GOON_CRITICAL_TO_FME
IF GB_IS_PLAYER_BOSS_OF_A_BIKER_GANG(PLAYER_ID())
NC_APP_SET_MISSION_LAUNCH_FAIL_REASON("HT_BW_L2")
ELIF DOES_PLAYER_OWN_OFFICE(PLAYER_ID())
NC_APP_SET_MISSION_LAUNCH_FAIL_REASON("HT_BW_L3")
ELSE
NC_APP_SET_MISSION_LAUNCH_FAIL_REASON("HT_BW_L4")
ENDIF
ELIF iReason = GB_MU_REASON_BOSS_IS_ANIMAL
NC_APP_SET_MISSION_LAUNCH_FAIL_REASON("BKR_TF_R6")
ELIF iReason = GB_MU_REASON_GOON_IS_ANIMAL
IF GB_IS_PLAYER_BOSS_OF_A_BIKER_GANG(PLAYER_ID())
NC_APP_SET_MISSION_LAUNCH_FAIL_REASON("GENERAL_MLF_G1")
ELIF DOES_PLAYER_OWN_OFFICE(PLAYER_ID())
NC_APP_SET_MISSION_LAUNCH_FAIL_REASON("GENERAL_MLF_G2")
ELSE
NC_APP_SET_MISSION_LAUNCH_FAIL_REASON("GENERAL_MLF_G3")
ENDIF
ELIF iReason = GB_MU_REASON_GOON_GAMBLING
IF GB_IS_PLAYER_BOSS_OF_A_BIKER_GANG(PLAYER_ID())
NC_APP_SET_MISSION_LAUNCH_FAIL_REASON("GENERAL_MLF_G4")
ELIF DOES_PLAYER_OWN_OFFICE(PLAYER_ID())
NC_APP_SET_MISSION_LAUNCH_FAIL_REASON("GENERAL_MLF_G5")
ELSE
NC_APP_SET_MISSION_LAUNCH_FAIL_REASON("GENERAL_MLF_G6")
ENDIF
ELSE
NC_APP_SET_MISSION_LAUNCH_FAIL_REASON("HT_BW_L1")
ENDIF
RETURN FALSE
ENDIF
IF NOT GB_IS_PLAYER_BOSS_OF_A_GANG(PLAYER_ID())
CPRINTLN(DEBUG_INTERNET, "<APP_NC> CAN_PLAYER_LAUNCH_BOSS_WORK: NOPE! GB_IS_PLAYER_BOSS_OF_A_GANG is false")
NC_APP_SET_MISSION_LAUNCH_FAIL_REASON("HT_BW_L5")
RETURN FALSE
ENDIF
// Check we're not taking part in some other mission
IF GB_IS_PLAYER_CRITICAL_TO_JOB(PLAYER_ID())
CPRINTLN(DEBUG_INTERNET, "<APP_NC> CAN_PLAYER_LAUNCH_BOSS_WORK: NOPE! player critical to job")
NC_APP_SET_MISSION_LAUNCH_FAIL_REASON("HT_BW_L6")
RETURN FALSE
ENDIF
IF NETWORK_IS_ACTIVITY_SESSION()
CPRINTLN(DEBUG_INTERNET, "<APP_NC> CAN_PLAYER_LAUNCH_BOSS_WORK: NOPE! NETWORK_IS_ACTIVITY_SESSION is true")
NC_APP_SET_MISSION_LAUNCH_FAIL_REASON("HT_BW_L6")
RETURN FALSE
ENDIF
RETURN TRUE
ENDFUNC
/// PURPOSE:
/// Sets the mission unavailable value
FUNC BOOL CAN_PLAYER_LAUNCH_MISSION(INT iMissionToLaunch)
// Check that mission is available
IF NOT GB_IS_BOSS_MISSION_AVAILABLE(PLAYER_ID(), iMissionToLaunch, FALSE)
CPRINTLN(DEBUG_INTERNET, "<APP_NC> CAN_PLAYER_LAUNCH_MISSION: NOPE! mission unavailable")
INT iReason = GB_GET_BOSS_MISSION_UNAVAILABLE_REASON(PLAYER_ID(), iMissionToLaunch, FALSE)
IF iReason = GB_MU_REASON_GOON_CRITICAL_TO_FME
IF GB_IS_PLAYER_BOSS_OF_A_BIKER_GANG(PLAYER_ID())
NC_APP_SET_MISSION_LAUNCH_FAIL_REASON("UA_ML_F_GOON1")
ELIF DOES_PLAYER_OWN_OFFICE(PLAYER_ID())
NC_APP_SET_MISSION_LAUNCH_FAIL_REASON("UA_ML_F_GOON2")
ELSE
NC_APP_SET_MISSION_LAUNCH_FAIL_REASON("UA_ML_F_GOON3")
ENDIF
ELIF iReason = GB_MU_REASON_BOSS_IS_ANIMAL
NC_APP_SET_MISSION_LAUNCH_FAIL_REASON("BKR_TF_R6")
ELIF iReason = GB_MU_REASON_GOON_IS_ANIMAL
IF GB_IS_PLAYER_BOSS_OF_A_BIKER_GANG(PLAYER_ID())
NC_APP_SET_MISSION_LAUNCH_FAIL_REASON("GENERAL_MLF_G1")
ELIF DOES_PLAYER_OWN_OFFICE(PLAYER_ID())
NC_APP_SET_MISSION_LAUNCH_FAIL_REASON("GENERAL_MLF_G2")
ELSE
NC_APP_SET_MISSION_LAUNCH_FAIL_REASON("GENERAL_MLF_G3")
ENDIF
ELIF iReason = GB_MU_REASON_GOON_GAMBLING
IF GB_IS_PLAYER_BOSS_OF_A_BIKER_GANG(PLAYER_ID())
NC_APP_SET_MISSION_LAUNCH_FAIL_REASON("GENERAL_MLF_G4")
ELIF DOES_PLAYER_OWN_OFFICE(PLAYER_ID())
NC_APP_SET_MISSION_LAUNCH_FAIL_REASON("GENERAL_MLF_G5")
ELSE
NC_APP_SET_MISSION_LAUNCH_FAIL_REASON("GENERAL_MLF_G6")
ENDIF
ELSE
NC_APP_SET_MISSION_LAUNCH_FAIL_REASON("BKR_TF_R6")
ENDIF
RETURN FALSE
ENDIF
IF NOT GB_IS_PLAYER_BOSS_OF_A_GANG(PLAYER_ID())
CPRINTLN(DEBUG_INTERNET, "<APP_NC> CAN_PLAYER_LAUNCH_MISSION: NOPE! GB_IS_PLAYER_BOSS_OF_A_GANG is false")
NC_APP_SET_MISSION_LAUNCH_FAIL_REASON("DBG_BUN_NB")
RETURN FALSE
ENDIF
// Check we're not taking part in some other mission
IF GB_IS_PLAYER_CRITICAL_TO_JOB(PLAYER_ID())
CPRINTLN(DEBUG_INTERNET, "<APP_NC> CAN_PLAYER_LAUNCH_MISSION: NOPE! player critical to job")
NC_APP_SET_MISSION_LAUNCH_FAIL_REASON("BKR_TF_R3")
RETURN FALSE
ENDIF
IF NETWORK_IS_ACTIVITY_SESSION()
CPRINTLN(DEBUG_INTERNET, "<APP_NC> CAN_PLAYER_LAUNCH_MISSION: NOPE! NETWORK_IS_ACTIVITY_SESSION is true")
NC_APP_SET_MISSION_LAUNCH_FAIL_REASON("BKR_TF_R3")
RETURN FALSE
ENDIF
RETURN TRUE
ENDFUNC
PROC SHOW_OVERLAY(STRING sTitle, STRING sMessage, STRING sAcceptButtonLabel, STRING sCancelButtonLabel, BOOL bPlayFailSound, BOOL bPlayClickSound, NC_APP_STAGE_ID eNewAppStage = NCA_STAGE_IDLE, INT iAdditionalINT = -1, INT iSecondAdditionalINT = -1, STRING sAdditionalString = NULL, STRING sAdditionalString2 = NULL)
BEGIN_SCALEFORM_MOVIE_METHOD(mov, "SHOW_OVERLAY")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING(sTitle)
//Build the string we need to display
BEGIN_TEXT_COMMAND_SCALEFORM_STRING(sMessage)
//These parameters need to be given in the correct order(May need a new function if more are added)
IF NOT IS_STRING_NULL_OR_EMPTY(sAdditionalString)
//Add the first int if needed
IF iadditionalINT != -1
ADD_TEXT_COMPONENT_INTEGER(iadditionalINT)
ENDIF
//Add the string
ADD_TEXT_COMPONENT_SUBSTRING_TEXT_LABEL(sAdditionalString)
//Add the extra int if needed
IF iSecondAdditionalINT != -1
//For messages that use all available parameters: Int-String-Int
ADD_TEXT_COMPONENT_INTEGER(iSecondAdditionalINT)
ENDIF
//Add the extra string if needed
IF NOT IS_STRING_NULL_OR_EMPTY(sAdditionalString2)
ADD_TEXT_COMPONENT_SUBSTRING_TEXT_LABEL(sAdditionalString2)
ENDIF
ELSE
IF iadditionalINT != -1
ADD_TEXT_COMPONENT_INTEGER(iadditionalINT)
ENDIF
ENDIF
END_TEXT_COMMAND_SCALEFORM_STRING()
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING(sAcceptButtonLabel)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING(sCancelButtonLabel)
END_SCALEFORM_MOVIE_METHOD()
IF bPlayClickSound
PLAY_CLICK_LINK_SOUND()
ELIF bPlayFailSound
PLAY_CLICK_LINK_FAIL_SOUND()
ENDIF
SET_BIT(iBS, NC_BS_OVERLAY_SCREEN_ACTIVE)
NC_APP_SET_APP_STAGE(eNewAppStage)
PRINTLN("<APP_NC> SHOW_OVERLAY with title: ", sTitle, " message: ", sMessage, " Accebt button: ", sAcceptButtonLabel, " Cancel button: ", sCancelButtonLabel)
ENDPROC
PROC HIDE_OVERLAY()
BEGIN_SCALEFORM_MOVIE_METHOD(mov, "HIDE_OVERLAY")
END_SCALEFORM_MOVIE_METHOD()
NC_APP_SET_APP_STAGE(NCA_STAGE_IDLE)
CLEAR_BIT(iBS, NC_BS_OVERLAY_SCREEN_ACTIVE)
PRINTLN("<APP_NC> HIDE_OVERLAY")
ENDPROC
PROC APP_CONTROL_DISABLE()
SET_CLEAR_ON_CALL_HUD_THIS_FRAME()
IF (NOT IS_SYSTEM_UI_BEING_DISPLAYED())
AND (NOT IS_PAUSE_MENU_ACTIVE())
DISABLE_ALL_CONTROL_ACTIONS(PLAYER_CONTROL)
DISABLE_CONTROL_ACTION(FRONTEND_CONTROL, INPUT_FRONTEND_PAUSE_ALTERNATE)
ENDIF
ENDPROC
PROC SET_INPUT_EXCLUSIVE_AND_ENABLED(CONTROL_TYPE eType, CONTROL_ACTION eAction, BOOL bEnableRelatedActions = TRUE)
IF NOT IS_PAUSE_MENU_ACTIVE_EX()
SET_INPUT_EXCLUSIVE(eType, eAction)
ENABLE_CONTROL_ACTION(eType, eAction, bEnableRelatedActions)
ELSE
#IF IS_DEBUG_BUILD
IF NOT IS_BIT_SET(iBS, NC_BS_PRINTED_PAUSE_MENU_ACTIVE)
PRINTLN("<APP_NC>, SET_INPUT_EXCLUSIVE_AND_ACTIVE called but IS_PAUSE_MENU_ACTIVE_EX returned true")
SET_BIT(iBS, NC_BS_PRINTED_PAUSE_MENU_ACTIVE)
ENDIF
#ENDIF
ENDIF
ENDPROC
PROC RENDER_NC_APP()
HIDE_HUD_AND_RADAR_THIS_FRAME()
HIDE_SCRIPTED_HUD_COMPONENT_THIS_FRAME(HUD_MP_RANK_BAR)
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
APP_CONTROL_DISABLE()
IF g_bInMultiplayer
SHOW_HUD_COMPONENT_THIS_FRAME(NEW_HUD_MP_CASH)//1544427
SHOW_HUD_COMPONENT_THIS_FRAME(NEW_HUD_MP_MESSAGE)
SHOW_HUD_COMPONENT_THIS_FRAME(NEW_HUD_CASH_CHANGE)
SHOW_HUD_COMPONENT_THIS_FRAME(NEW_HUD_CASH)
ENDIF
THEFEED_HIDE_THIS_FRAME()
SET_INPUT_EXCLUSIVE_AND_ENABLED(FRONTEND_CONTROL,INPUT_FRONTEND_PAUSE)
SET_SCRIPT_GFX_DRAW_ORDER(GFX_ORDER_BEFORE_HUD)
DRAW_RECT_FROM_CORNER(0.0, 0.0, 1.0, 1.0, 0, 0, 0, 255)
SET_SCRIPT_GFX_DRAW_ORDER(GFX_ORDER_BEFORE_HUD)
DRAW_SCALEFORM_MOVIE_FULLSCREEN(mov,255,255,255,255)
REPLAY_PREVENT_RECORDING_AND_UI_THIS_FRAME()
DISABLE_CELLPHONE_THIS_FRAME_ONLY()
DISABLE_ALL_MP_HUD_THIS_FRAME()
ENDPROC
PROC CLOSE_JOB_OVERLAY()
BEGIN_SCALEFORM_MOVIE_METHOD(mov, "HIDE_JOB_OVERLAY")
END_SCALEFORM_MOVIE_METHOD()
CLEAR_BIT(iBS, NC_BS_JOB_OVERLAY_ACTIVE)
CLEAR_BIT(iBS, NC_BS_JOB_OVERLAY_SELECTED_SHIPMENT_SIZE)
ENDPROC
FUNC BOOL IS_JOB_OVERLAY_VISIBLE()
RETURN IS_BIT_SET(iBS, NC_BS_JOB_OVERLAY_ACTIVE)
ENDFUNC
//
// Mission Data Functions
//
FUNC BOOL SHOULD_MISSION_TYPE_BUTTON_BE_UNLOCKED(NC_MISSION_TYPE eMissionType)
IF NOT GB_IS_LOCAL_PLAYER_BOSS_OF_A_GANG()
RETURN FALSE
ENDIF
IF MISSION_PC_DID_I_JOIN_A_PRIVATE_SESSION()
AND eMissionType != NC_BOSS_WORK
RETURN FALSE
ENDIF
#IF IS_DEBUG_BUILD
IF GET_COMMANDLINE_PARAM_EXISTS("scRestrictNCAppToClientJobs")
AND eMissionType != NC_BOSS_WORK
RETURN FALSE
ENDIF
#ENDIF
SWITCH eMissionType
CASE NC_BOSS_WORK RETURN TRUE BREAK
CASE NC_AIR_FREIGHT
IF DOES_PLAYER_OWN_A_HANGER(PLAYER_ID())
RETURN IS_HANGAR_SETUP_MISSION_COMPLETE()
ENDIF
BREAK
CASE NC_SPECIAL_CARGO RETURN DOES_PLAYER_OWN_A_WAREHOUSE(PLAYER_ID()) AND GB_IS_LOCAL_PLAYER_BOSS_OF_GANG_TYPE(GT_VIP) BREAK
CASE NC_VEHICLE_CARGO RETURN DOES_PLAYER_OWN_AN_IE_GARAGE(PLAYER_ID()) AND GB_IS_LOCAL_PLAYER_BOSS_OF_GANG_TYPE(GT_VIP) BREAK
CASE NC_WEAPONS_CARGO RETURN DOES_PLAYER_OWN_A_BUNKER(PLAYER_ID()) AND IS_BUSINESS_TYPE_ACTIVE(BUSINESS_TYPE_WEAPONS) AND NOT IS_FACTORY_SHUTDOWN_BY_PLAYER(BUNKER_SAVE_SLOT) BREAK
CASE NC_DRUG_CARGO
IF DOES_PLAYER_OWN_A_FACTORY(PLAYER_ID())
AND GB_IS_PLAYER_BOSS_OF_A_BIKER_GANG(PLAYER_ID())
RETURN TRUE
ENDIF
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
FUNC BOOL IS_MISSION_TYPE_DISABLED_BY_TUNEABLE(NC_MISSION_TYPE eMissionType)
#IF IS_DEBUG_BUILD
IF GET_COMMANDLINE_PARAM_EXISTS("scRestrictNCAppToClientJobs")
AND eMissionType != NC_BOSS_WORK
RETURN TRUE
ENDIF
#ENDIF
SWITCH eMissionType
CASE NC_BOSS_WORK
IF g_sMPTunables.bBB_HACKER_WORK_CLIENT_WORK_DISABLE_JOB_GLOBAL
RETURN TRUE
ENDIF
BREAK
CASE NC_AIR_FREIGHT
IF g_sMPTunables.bBB_HACKER_WORK_AIRFREIGHT_CARGO_DISABLE_JOB_GLOBAL
RETURN TRUE
ENDIF
BREAK
CASE NC_SPECIAL_CARGO
IF g_sMPTunables.bBB_HACKER_WORK_SPECIAL_CARGO_DISABLE_JOB_GLOBAL
RETURN TRUE
ENDIF
BREAK
CASE NC_VEHICLE_CARGO
IF g_sMPTunables.bBB_HACKER_WORK_VEHICLE_CARGO_DISABLE_JOB_GLOBAL
RETURN TRUE
ENDIF
BREAK
CASE NC_WEAPONS_CARGO
IF g_sMPTunables.bBB_HACKER_WORK_GUNRUNNING_SUPPLIES_DISABLE_JOB_GLOBAL
RETURN TRUE
ENDIF
BREAK
CASE NC_DRUG_CARGO
IF g_sMPTunables.bBB_HACKER_WORK_BIKER_SUPPLIES_DISABLE_JOB_GLOBAL
RETURN TRUE
ENDIF
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
PROC UPDATE_PRIMARY_MISSION_WITH_ID(INT iMissionID)
BEGIN_SCALEFORM_MOVIE_METHOD(mov, "UPDATE_MISSION")
NC_MISSION_TYPE eMissionType = INT_TO_ENUM(NC_MISSION_TYPE, iMissionID)
INT iCooldown = 0
BOOL bAvailable = SHOULD_MISSION_TYPE_BUTTON_BE_UNLOCKED(eMissionType)
IF eMissionType = NC_VEHICLE_CARGO
AND NOT GB_HAS_IE_MISSION_COOLDOWN_TIMER_EXPIRED(VEV_EYE_IN_THE_SKY)
iCooldown = (GB_GET_MISSION_COOLDOWN_TIME_REMAINING(VEV_EYE_IN_THE_SKY) + 1)
SET_BIT(iBS, NC_BS_IE_COOLDOWN_RUNNING)
bAvailable = FALSE
ENDIF
IF IS_MISSION_TYPE_DISABLED_BY_TUNEABLE(eMissionType)
bAvailable = FALSE
ENDIF
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(iMissionID) // Mission type
SCALEFORM_MOVIE_METHOD_ADD_PARAM_BOOL(bAvailable) // Available?
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(iCooldown) // Any cooldown running for this mission type
END_SCALEFORM_MOVIE_METHOD()
ENDPROC
PROC SEND_PRIMARY_MISSION_AVAILABILITY_TO_SCALEFORM()
INT i
REPEAT NC_COUNT i
UPDATE_PRIMARY_MISSION_WITH_ID(i)
ENDREPEAT
ENDPROC
PROC SEND_ALL_DATA_TO_SCALEFORM()
OPEN_PAGE(PAGE_LOGIN)
//Base data
SEND_PRIMARY_MISSION_AVAILABILITY_TO_SCALEFORM()
ENDPROC
FUNC INT GET_JOB_ID_FROM_FMMC_ID(INT iFMMCID)
SWITCH iFMMCID
CASE FMMC_TYPE_FMBB_BANK_JOB RETURN 0
CASE FMMC_TYPE_FMBB_DATA_HACK RETURN 1
CASE FMMC_TYPE_FMBB_INFILTRATION RETURN 2
CASE FMMC_TYPE_FMBB_JEWEL_STORE_GRAB RETURN 3
CASE FMMC_TYPE_FMBB_SECURITY_VAN RETURN 4
CASE FMMC_TYPE_FMBB_TARGET_PURSUIT RETURN 5
ENDSWITCH
RETURN -1
ENDFUNC
FUNC INT GET_FMMC_ID_FROM_JOB_ID(INT iJobID)
SWITCH iJobID
CASE 0 RETURN FMMC_TYPE_FMBB_BANK_JOB
CASE 1 RETURN FMMC_TYPE_FMBB_DATA_HACK
CASE 2 RETURN FMMC_TYPE_FMBB_INFILTRATION
CASE 3 RETURN FMMC_TYPE_FMBB_JEWEL_STORE_GRAB
CASE 4 RETURN FMMC_TYPE_FMBB_SECURITY_VAN
CASE 5 RETURN FMMC_TYPE_FMBB_TARGET_PURSUIT
ENDSWITCH
RETURN -1
ENDFUNC
FUNC INT GET_BOSS_WORK_OR_CHALLENGE_COOLDOWN_TIME_REMAINING(INT iFMMCID)
IF IS_FMMC_ID_BBATTLE_BOSS_WORK(iFMMCID)
INT i
REPEAT ciMAX_FMBB_BOSS_CHALLENGE_CD_TIMERS i
IF g_sBattleBossWorksCDVars.sBossWorksCD[i].iFMMCID = iFMMCID
IF HAS_NET_TIMER_STARTED(g_sBattleBossWorksCDVars.sBossWorksCD[i].g_stBossWorksCD)
RETURN GET_TIME_REMAINING_FROM_SCRIPT_TIMER_IN_SECONDS(g_sBattleBossWorksCDVars.sBossWorksCD[i].g_stBossWorksCD, GET_BUSINESS_BATTLE_BOSS_WORK_COOLDOWN_TIME(i))
ENDIF
ENDIF
ENDREPEAT
IF HAS_NET_TIMER_STARTED(g_sBattleBossWorksCDVars.g_stAllBossWorksCD)
RETURN GET_TIME_REMAINING_FROM_SCRIPT_TIMER_IN_SECONDS(g_sBattleBossWorksCDVars.g_stAllBossWorksCD, GET_BUSINESS_BATTLE_BOSS_WORK_GLOBAL_COOLDOWN_TIME())
ENDIF
ELIF IS_FMMC_ID_BBATTLE_BOSS_CHALLENGE(iFMMCID)
IF iFMMCID = FMMC_TYPE_FMBB_SECURITY_VAN
IF HAS_NET_TIMER_STARTED(g_sBattleBossWorksCDVars.g_stSecurityVansCD)
RETURN GET_TIME_REMAINING_FROM_SCRIPT_TIMER_IN_SECONDS(g_sBattleBossWorksCDVars.g_stSecurityVansCD, GET_BUSINESS_BATTLE_BOSS_CHALLENGE_COOLDOWN_TIME(iFMMCID))
ELIF HAS_NET_TIMER_STARTED(g_sBattleBossWorksCDVars.g_stAllBossChallengeCD)
RETURN GET_TIME_REMAINING_FROM_SCRIPT_TIMER_IN_SECONDS(g_sBattleBossWorksCDVars.g_stAllBossChallengeCD, GET_BUSINESS_BATTLE_BOSS_CHALLENGE_GLOBAL_COOLDOWN_TIME())
ENDIF
ELSE
IF HAS_NET_TIMER_STARTED(g_sBattleBossWorksCDVars.g_stTargetPursuitCD)
RETURN GET_TIME_REMAINING_FROM_SCRIPT_TIMER_IN_SECONDS(g_sBattleBossWorksCDVars.g_stTargetPursuitCD, GET_BUSINESS_BATTLE_BOSS_CHALLENGE_COOLDOWN_TIME(iFMMCID))
ELIF HAS_NET_TIMER_STARTED(g_sBattleBossWorksCDVars.g_stAllBossChallengeCD)
RETURN GET_TIME_REMAINING_FROM_SCRIPT_TIMER_IN_SECONDS(g_sBattleBossWorksCDVars.g_stAllBossChallengeCD, GET_BUSINESS_BATTLE_BOSS_CHALLENGE_GLOBAL_COOLDOWN_TIME())
ENDIF
ENDIF
ENDIF
RETURN -1
ENDFUNC
FUNC BOOL IS_BOSS_WORK_OR_CHALLENGE_TIMER_RUNNING(INT iFMMCID, NC_TT_JOB_NA_REASON &eCooldownReason)
eCooldownReason = NC_TT_ON_CD_PRIMARY
IF iFMMCID = FMMC_TYPE_FMBB_SECURITY_VAN
IF HAS_NET_TIMER_STARTED(g_sBattleBossWorksCDVars.g_stSecurityVansCD)
RETURN TRUE
ENDIF
ELIF iFMMCID = FMMC_TYPE_FMBB_TARGET_PURSUIT
IF HAS_NET_TIMER_STARTED(g_sBattleBossWorksCDVars.g_stTargetPursuitCD)
RETURN TRUE
ENDIF
ENDIF
INT i
REPEAT ciMAX_FMBB_BOSS_CHALLENGE_CD_TIMERS i
IF iFMMCID != -1
AND g_sBattleBossWorksCDVars.sBossWorksCD[i].iFMMCID = iFMMCID
RETURN TRUE
ENDIF
ENDREPEAT
eCooldownReason = NC_TT_ON_CD_GLOBAL
IF IS_FMMC_ID_BBATTLE_BOSS_WORK(iFMMCID)
RETURN HAS_NET_TIMER_STARTED(g_sBattleBossWorksCDVars.g_stAllBossWorksCD)
ENDIF
RETURN HAS_NET_TIMER_STARTED(g_sBattleBossWorksCDVars.g_stAllBossChallengeCD)
ENDFUNC
FUNC BOOL RUN_DISTANCE_CHECK_FOR_MISSION_AVAILABILITY(INT iFMMCID)
IF iFMMCID = FMMC_TYPE_FMBB_SECURITY_VAN
PRINTLN("<APP_NC> RUN_DISTANCE_CHECK_FOR_MISSION_AVAILABILITY - Checking FMMC_TYPE_FMBB_SECURITY_VAN - Returning TRUE")
iSelectedMissionSubVar = -1
RETURN TRUE
ENDIF
IF SELECT_TRUCK_WORK_VARIATION(iFMMCID, iSelectedMissionSubVar)
PRINTLN("<APP_NC> RUN_DISTANCE_CHECK_FOR_MISSION_AVAILABILITY - Selected sub variation = ", iSelectedMissionSubVar, " for mission: ", iFMMCID)
RETURN TRUE
ENDIF
PRINTLN("<APP_NC> RUN_DISTANCE_CHECK_FOR_MISSION_AVAILABILITY - RETURN FALSE for mission ", iFMMCID)
RETURN FALSE
ENDFUNC
FUNC BOOL IS_BOSS_MISSION_BLOCKED(INT iFMMCID)
#IF IS_DEBUG_BUILD
IF GET_COMMANDLINE_PARAM_EXISTS("sc_TerrorByteBW_FLOW_PLAY")
IF iFMMCID = FMMC_TYPE_FMBB_TARGET_PURSUIT
RETURN TRUE
ENDIF
ENDIF
#ENDIF
IF g_sMPTunables.bBB_HACKER_WORK_CLIENT_WORK_DISABLE_JOB_GLOBAL
RETURN TRUE
ENDIF
SWITCH iFMMCID
CASE FMMC_TYPE_FMBB_SECURITY_VAN RETURN g_sMPTunables.bBB_HACKER_WORK_HACKER_CHALLENGE_DISABLE_JOB_SECURITY_VANS
CASE FMMC_TYPE_FMBB_TARGET_PURSUIT RETURN g_sMPTunables.bBB_HACKER_WORK_HACKER_CHALLENGE_DISABLE_JOB_TARGET_PURSUIT
CASE FMMC_TYPE_FMBB_BANK_JOB RETURN g_sMPTunables.bBB_HACKER_WORK_CLIENT_WORK_DISABLE_JOB_BANK_JOB
CASE FMMC_TYPE_FMBB_DATA_HACK RETURN g_sMPTunables.bBB_HACKER_WORK_CLIENT_WORK_DISABLE_JOB_DATA_HACK
CASE FMMC_TYPE_FMBB_INFILTRATION RETURN g_sMPTunables.bBB_HACKER_WORK_CLIENT_WORK_DISABLE_JOB_INFILTRATION
CASE FMMC_TYPE_FMBB_JEWEL_STORE_GRAB RETURN g_sMPTunables.bBB_HACKER_WORK_CLIENT_WORK_DISABLE_JOB_JEWEL_STORE_GRAB
ENDSWITCH
RETURN FALSE
ENDFUNC
FUNC BOOL IS_NC_BOSS_WORK_AVAILABLE(INT iMissionID, BOOL bCheckCooldownTimer = TRUE)
INT iFMMCID = GET_FMMC_ID_FROM_JOB_ID(iMissionID)
IF IS_BOSS_MISSION_BLOCKED(iFMMCID)
NC_APP_SET_TOOL_TIP_REASON_FOR_MISSION_WITH_INDEX(NC_TT_JOB_GENERIC, iMissionID)
RETURN FALSE
ENDIF
IF bCheckCooldownTimer
NC_TT_JOB_NA_REASON eCooldownReason
IF IS_BOSS_WORK_OR_CHALLENGE_TIMER_RUNNING(iFMMCID, eCooldownReason)
NC_APP_SET_TOOL_TIP_REASON_FOR_MISSION_WITH_INDEX(eCooldownReason, iMissionID)
RETURN FALSE
ENDIF
ENDIF
IF IS_OWNERS_HACKER_TRUCK_INSIDE_BUSINESS_HUB(PLAYER_ID())
NC_APP_SET_TOOL_TIP_REASON_FOR_MISSION_WITH_INDEX(NC_TT_IN_HUB, iMissionID)
RETURN FALSE
ENDIF
IF iFMMCID = FMMC_TYPE_FMBB_INFILTRATION
OR iFMMCID = FMMC_TYPE_FMBB_JEWEL_STORE_GRAB
//Some missions require the drone stationt to be purchased before launch
IF NOT IS_PLAYER_HACKER_TRUCK_DRONE_STATION_PURCHASED(PLAYER_ID())
NC_APP_SET_TOOL_TIP_REASON_FOR_MISSION_WITH_INDEX(NC_TT_NEED_DRONE, iMissionID)
RETURN FALSE
ENDIF
ENDIF
IF iFMMCID = FMMC_TYPE_FMBB_SECURITY_VAN
OR iFMMCID = FMMC_TYPE_FMBB_TARGET_PURSUIT
//The two challenge missions require a gang boss to have at least one goon
IF GB_GET_BOSS_MISSION_UNAVAILABLE_REASON(PLAYER_ID(), iFMMCID) = GB_MU_REASON_NOT_ENOUGH_GOONS
NC_APP_SET_TOOL_TIP_REASON_FOR_MISSION_WITH_INDEX(NC_TT_INSUFFICIENT_GOONS, iMissionID)
RETURN FALSE
ENDIF
ENDIF
IF NOT RUN_DISTANCE_CHECK_FOR_MISSION_AVAILABILITY(GET_FMMC_ID_FROM_JOB_ID(iMissionID))
IF iSelectedMissionSubVar = TRUCK_WORK_SELECT_FAILED_FOR_CLOSE_GANG
NC_APP_SET_TOOL_TIP_REASON_FOR_MISSION_WITH_INDEX(NC_TT_NO_JOB_GANG, iMissionID)
ELSE
iSelectedMissionSubVar = -1
NC_APP_SET_TOOL_TIP_REASON_FOR_MISSION_WITH_INDEX(NC_TT_NO_JOB_NON_GANG, iMissionID)
ENDIF
RETURN FALSE
ENDIF
NC_APP_SET_TOOL_TIP_REASON_FOR_MISSION_WITH_INDEX(NC_TT_NONE, iMissionID)
RETURN TRUE
ENDFUNC
FUNC STRING GET_NC_BOSS_WORK_UNAVAILABLE_REASON(INT iMissionID)
INT iFMMCID = GET_FMMC_ID_FROM_JOB_ID(iMissionID)
IF IS_BOSS_MISSION_BLOCKED(iFMMCID)
RETURN "HT_BW_L1"
ENDIF
IF iFMMCID = FMMC_TYPE_FMBB_INFILTRATION
OR iFMMCID = FMMC_TYPE_FMBB_JEWEL_STORE_GRAB
//Some missions require the drone stationt to be purchased before launch
IF NOT IS_PLAYER_HACKER_TRUCK_DRONE_STATION_PURCHASED(PLAYER_ID())
RETURN "HT_BW_L8"
ENDIF
ENDIF
IF iFMMCID = FMMC_TYPE_FMBB_SECURITY_VAN
OR iFMMCID = FMMC_TYPE_FMBB_TARGET_PURSUIT
//The two challenge missions require a gang boss to have at least one goon
IF GB_GET_BOSS_MISSION_UNAVAILABLE_REASON(PLAYER_ID(), iFMMCID) = GB_MU_REASON_NOT_ENOUGH_GOONS
IF GB_IS_LOCAL_PLAYER_BOSS_OF_A_BIKER_GANG()
RETURN "HT_BW_L9"
ELIF GB_IS_LOCAL_PLAYER_BOSS_OF_A_GANG()
IF DOES_PLAYER_OWN_OFFICE(PLAYER_ID())
RETURN "HT_BW_L9a"
ELSE
RETURN "HT_BW_L9b"
ENDIF
ENDIF
ENDIF
ENDIF
//This is set by RUN_DISTANCE_CHECK_FOR_MISSION_AVAILABILITY if it is -1 then no variations were suitable
IF iSelectedMissionSubVar = -1
RETURN "HT_BW_L1"
ENDIF
RETURN "HT_BW_L1"
ENDFUNC
PROC OPEN_JOB_LIST_OVERLAY(NC_MISSION_TYPE eMittionType, STRING sTitle)
BEGIN_SCALEFORM_MOVIE_METHOD(mov, "SHOW_JOB_OVERLAY")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(ENUM_TO_INT(eMittionType))
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING(sTitle)
END_SCALEFORM_MOVIE_METHOD()
ENDPROC
PROC CLEAR_JOB_LIST_OVERLAY_DATA()
BEGIN_SCALEFORM_MOVIE_METHOD(mov, "CLEAR_JOBS")
END_SCALEFORM_MOVIE_METHOD()
INT i
REPEAT ciMAX_JOB_SLOTS i
NC_APP_SET_TOOL_TIP_REASON_FOR_MISSION_WITH_INDEX(NC_TT_NONE, i)
ENDREPEAT
ENDPROC
FUNC TEXT_LABEL_15 GET_TOOL_TIP_TEXT_FOR_MISSION_UNAVAILABLE(NC_TT_JOB_NA_REASON eReason, INT iFMMCID)
TEXT_LABEL_15 tlReturn
SWITCH eReason
CASE NC_TT_NONE tlReturn = "INVALID" BREAK
CASE NC_TT_ON_CD_PRIMARY tlReturn = "HT_JOB_CD_0" BREAK
CASE NC_TT_NEED_DRONE tlReturn = "HT_JOB_R3" BREAK
CASE NC_TT_NO_JOB_NON_GANG tlReturn = "HT_JOB_R2" BREAK
CASE NC_TT_IN_HUB tlReturn = "HT_JOB_R6" BREAK
CASE NC_TT_JOB_GENERIC tlReturn = "HT_BW_L1" BREAK
CASE NC_TT_ON_CD_GLOBAL
IF IS_FMMC_ID_BBATTLE_BOSS_WORK(iFMMCID)
tlReturn = "HT_JOB_CD_1"
ELSE
tlReturn = "HT_JOB_CD_2"
ENDIF
BREAK
CASE NC_TT_INSUFFICIENT_GOONS
IF GB_IS_LOCAL_PLAYER_BOSS_OF_A_BIKER_GANG()
tlReturn = "HT_JOB_R4"
ELSE
tlReturn = "HT_JOB_R5"
ENDIF
BREAK
CASE NC_TT_NO_JOB_GANG
IF GB_IS_LOCAL_PLAYER_BOSS_OF_A_BIKER_GANG()
tlReturn = "HT_JOB_R1"
ELSE
tlReturn = "HT_JOB_R1a"
ENDIF
BREAK
CASE NC_TT_NOT_SETUP tlReturn = "HT_DW_P1_D5" BREAK
CASE NC_TT_SUPPLIES_FULL tlReturn = "HT_DW_P1_D7" BREAK
CASE NC_TT_SUSPENDED_PROD tlReturn = "HT_DW_P1_D6" BREAK
CASE NC_TT_BOUGHT_SUPPLIES tlReturn = "HT_DW_P1_D8" BREAK
CASE NC_TT_SC_FULL
IF eSelectedShipmentSize = CONTRABAND_SMALL
tlReturn = "HT_DW_P1_D9"
ELIF eSelectedShipmentSize = CONTRABAND_MEDIUM
tlReturn = "HT_DW_P1_D10"
ELSE
tlReturn = "HT_DW_P1_D11"
ENDIF
BREAK
CASE NC_TT_SC_ON_CD tlReturn = "HT_SC_P1_D3" BREAK
ENDSWITCH
RETURN tlReturn
ENDFUNC
FUNC TEXT_LABEL_15 GET_FACTORY_TYPE_PROPERTY_LABEL(FACTORY_TYPE eType, INT iVariation = 0)
TEXT_LABEL_15 tlReturn = "*INVAILID*"
IF iVariation = 0
SWITCH eType
CASE FACTORY_TYPE_CRACK tlReturn = "HAPP_BTYPE_P2" BREAK
CASE FACTORY_TYPE_METH tlReturn = "HAPP_BTYPE_P3" BREAK
CASE FACTORY_TYPE_WEED tlReturn = "HAPP_BTYPE_P4" BREAK
CASE FACTORY_TYPE_FAKE_IDS tlReturn = "HAPP_BTYPE_P5" BREAK
CASE FACTORY_TYPE_FAKE_MONEY tlReturn = "HAPP_BTYPE_P6" BREAK
ENDSWITCH
ELSE
SWITCH eType
CASE FACTORY_TYPE_CRACK tlReturn = "HAPP_BTYPE_HP2" BREAK
CASE FACTORY_TYPE_METH tlReturn = "HAPP_BTYPE_HP3" BREAK
CASE FACTORY_TYPE_WEED tlReturn = "HAPP_BTYPE_HP4" BREAK
CASE FACTORY_TYPE_FAKE_IDS tlReturn = "HAPP_BTYPE_HP5" BREAK
CASE FACTORY_TYPE_FAKE_MONEY tlReturn = "HAPP_BTYPE_HP6" BREAK
ENDSWITCH
ENDIF
RETURN tlReturn
ENDFUNC
FUNC TEXT_LABEL_15 GET_TOOL_TIP_SUB_STRING_FOR_MISSION_UNAVAILABLE(NC_TT_JOB_NA_REASON eReason, FACTORY_TYPE eType)
TEXT_LABEL_15 tlReturn
SWITCH eReason
CASE NC_TT_SUPPLIES_FULL
CASE NC_TT_BOUGHT_SUPPLIES
CASE NC_TT_NOT_SETUP
CASE NC_TT_SUSPENDED_PROD
tlReturn = GET_FACTORY_TYPE_PROPERTY_LABEL(eType, 1)
BREAK
ENDSWITCH
RETURN tlReturn
ENDFUNC
PROC SETUP_TRUCK_JOB_OVERLAY()
CLEAR_JOB_LIST_OVERLAY_DATA()
INT i
NC_TT_JOB_NA_REASON eCooldownReason
REPEAT MAX_WORKS_JOBS i
BEGIN_SCALEFORM_MOVIE_METHOD(mov, "ADD_JOB")
INT iFMMCID = GET_FMMC_ID_FROM_JOB_ID(i)
BOOL bAvailable = IS_NC_BOSS_WORK_AVAILABLE(i, FALSE)
eCooldownReason = NC_TT_NONE
//Mission name
TEXT_LABEL_15 tlName = "HT_BW_T"
tlName += i
//Description text label
TEXT_LABEL_15 tlDesc = "HT_BW_D"
tlDesc += i
//The challenges reference to the players gang type
IF i >= 4
AND GB_IS_LOCAL_PLAYER_BOSS_OF_A_BIKER_GANG()
tlDesc += "a"
ENDIF
INT iShowCooldown = 0
INT iCooldownTime = ciTYPE_FORMAT_HIDDEN
IF IS_BOSS_WORK_OR_CHALLENGE_TIMER_RUNNING(iFMMCID, eCooldownReason)
iShowCooldown = ciTYPE_FORMAT_TIME
iCooldownTime = GET_BOSS_WORK_OR_CHALLENGE_COOLDOWN_TIME_REMAINING(iFMMCID)
tlDesc = GET_TOOL_TIP_TEXT_FOR_MISSION_UNAVAILABLE(eCooldownReason, iFMMCID)
NC_APP_SET_TOOL_TIP_REASON_FOR_MISSION_WITH_INDEX(eCooldownReason, i)
ELIF NC_APP_GET_TOOL_TIP_REASON_FOR_MISSION_WITH_INDEX(i) != NC_TT_NONE
tlDesc = GET_TOOL_TIP_TEXT_FOR_MISSION_UNAVAILABLE(NC_APP_GET_TOOL_TIP_REASON_FOR_MISSION_WITH_INDEX(i), iFMMCID)
ENDIF
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(i)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING(tlName)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(iCooldownTime)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(iShowCooldown) //Type format for param above: 0 = Hidden 1 = Cash 2 = Time
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING(tlDesc)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_BOOL(bAvailable)
END_SCALEFORM_MOVIE_METHOD()
ENDREPEAT
OPEN_JOB_LIST_OVERLAY(NC_BOSS_WORK, "HT_BW_MT")
SET_BIT(iBS, NC_BS_JOB_OVERLAY_ACTIVE)
ENDPROC
FUNC BOOL SET_BIKER_MISSION_UNAVAILABLE_REASON(FACTORY_ID eFracotryID, INT iSlot, INT iMissionIndex)
IF NOT HAS_PLAYER_COMPLETED_FACTORY_SETUP_MISSION(PLAYER_ID(), eFracotryID)
AND NOT IS_DELAY_PRODUCTION_TIMER_RUNNING(iSlot)
NC_APP_SET_TOOL_TIP_REASON_FOR_MISSION_WITH_INDEX(NC_TT_NOT_SETUP, iMissionIndex)
RETURN TRUE
ENDIF
IF g_iMaterialsTotalForFactory[iSlot] >= g_sMPTunables.iBIKER_RESUPPLY_LAUNCH_SUPPLIES_THRESHOLD
NC_APP_SET_TOOL_TIP_REASON_FOR_MISSION_WITH_INDEX(NC_TT_SUPPLIES_FULL, iMissionIndex)
RETURN TRUE
ENDIF
IF HAS_PLAYER_SUSPENDED_BIKER_BUSINESS_PRODUCTION(PLAYER_ID(), eFracotryID)
NC_APP_SET_TOOL_TIP_REASON_FOR_MISSION_WITH_INDEX(NC_TT_SUSPENDED_PROD, iMissionIndex)
RETURN TRUE
ENDIF
IF IS_PAID_RESUPPLY_TIMER_RUNNING(iSlot)
NC_APP_SET_TOOL_TIP_REASON_FOR_MISSION_WITH_INDEX(NC_TT_BOUGHT_SUPPLIES, iMissionIndex)
RETURN TRUE
ENDIF
NC_APP_SET_TOOL_TIP_REASON_FOR_MISSION_WITH_INDEX(NC_TT_NONE, iMissionIndex)
RETURN FALSE
ENDFUNC
PROC SETUP_BIKER_JOB_OVERLAY()
CLEAR_JOB_LIST_OVERLAY_DATA()
INT i
REPEAT FACTORY_TYPE_WEAPONS i
BOOL bAvailable = FALSE
FACTORY_TYPE eType = INT_TO_ENUM(FACTORY_TYPE, i)
FACTORY_ID eFracotryID = FACTORY_ID_INVALID
IF DOES_PLAYER_OWN_FACTORY_OF_TYPE(PLAYER_ID(), eType)
INT iSlot = GET_SAVE_SLOT_OF_OWNED_FACTORY_TYPE(PLAYER_ID(), eType)
eFracotryID = GET_FACTORY_ID_FROM_FACTORY_SLOT(PLAYER_ID(), iSlot)
IF NOT SET_BIKER_MISSION_UNAVAILABLE_REASON(eFracotryID, iSlot, i)
bAvailable = TRUE
ENDIF
ENDIF
//Mission name
TEXT_LABEL_15 tlName = "HT_DW_T"
tlName += i
//Description text label
TEXT_LABEL_15 tlDescSub
TEXT_LABEL_15 tlDesc = "HT_DW_D"
tlDesc += i
NC_TT_JOB_NA_REASON eReason = NC_APP_GET_TOOL_TIP_REASON_FOR_MISSION_WITH_INDEX(i)
IF NOT DOES_PLAYER_OWN_FACTORY_OF_TYPE(PLAYER_ID(), eType)
tlDesc = "HT_DW_P1_D3"
tlDescSub = GET_FACTORY_TYPE_PROPERTY_LABEL(eType, 0)
ELIF eReason != NC_TT_NONE
tlDesc = GET_TOOL_TIP_TEXT_FOR_MISSION_UNAVAILABLE(eReason, -1)
tlDescSub = GET_TOOL_TIP_SUB_STRING_FOR_MISSION_UNAVAILABLE(eReason, eType)
ENDIF
BEGIN_SCALEFORM_MOVIE_METHOD(mov, "ADD_JOB")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(i)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING(tlName)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(-1)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(ciTYPE_FORMAT_HIDDEN)
IF IS_STRING_NULL_OR_EMPTY(tlDescSub)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING(tlDesc)
ELSE
BEGIN_TEXT_COMMAND_SCALEFORM_STRING(tlDesc)
ADD_TEXT_COMPONENT_SUBSTRING_TEXT_LABEL(tlDescSub)
END_TEXT_COMMAND_SCALEFORM_STRING()
ENDIF
SCALEFORM_MOVIE_METHOD_ADD_PARAM_BOOL(bAvailable)
END_SCALEFORM_MOVIE_METHOD()
ENDREPEAT
OPEN_JOB_LIST_OVERLAY(NC_DRUG_CARGO, "HT_DW_MT")
SET_BIT(iBS, NC_BS_JOB_OVERLAY_ACTIVE)
ENDPROC
FUNC BOOL DOES_PLAYER_OWN_WAREHOUSE_THAT_HAS_SPACE_TO_STORE_A_SHIPMENT_OF_SIZE(CONTRABAND_SIZE eShipmentSize)
INT iNumCratesToStore = ENUM_TO_INT(eShipmentSize)
INT i
REPEAT GET_COUNT_OF_WAREHOUSES_OWNED() i
INT iWarehouseID = GET_WAREHOUSE_ID_FOR_SAVE_SLOT(i)
IF GET_WAREHOUSE_REMAINING_CAPACITY(iWarehouseID) >= iNumCratesToStore
RETURN TRUE
ENDIF
ENDREPEAT
RETURN FALSE
ENDFUNC
FUNC TEXT_LABEL_23 GET_CONTRABAND_WAREHOUSE_SIZE_TEXT_LABEL(EWarehouseSize eSize)
TEXT_LABEL_23 tlReturn
SWITCH eSize
CASE eWarehouseSmall tlReturn = "HT_SCW_DS0" BREAK
CASE eWarehouseMedium tlReturn = "HT_SCW_DS1" BREAK
CASE eWarehouseLarge tlReturn = "HT_SCW_DS2" BREAK
ENDSWITCH
RETURN tlReturn
ENDFUNC
/// PURPOSE:Returns the contraband type assigned to the local playere as a text label
FUNC TEXT_LABEL_23 GET_NC_APP_CONTRABAND_TYPE_LABEL_FOR_SECURO_APP(CONTRABAND_TYPE contaType)
TEXT_LABEL_23 tlContraType = "NC_CONTRATP_"
tlContraType += ENUM_TO_INT(contaType)
CDEBUG3LN(DEBUG_INTERNET, "GET_WAREHOUSE_CONTRABAND_TYPE_STRING: ", tlContraType)
RETURN tlContraType
ENDFUNC
/// PURPOSE: Returns the text label for the name of the specified warehouse - App version for localised language support
/// Validates the warehouse ID before returning its name
FUNC STRING GET_WAREHOUSE_NAME_FOR_APP(INT iWarehouse)
SWITCH iWarehouse
CASE ciW_Elysian_Island_2 RETURN "MP_WHOUSE_HT0" BREAK
CASE ciW_La_Puerta_1 RETURN "MP_WHOUSE_HT1" BREAK
CASE ciW_La_Mesa_1 RETURN "MP_WHOUSE_HT2" BREAK
CASE ciW_Rancho_1 RETURN "MP_WHOUSE_HT3" BREAK
CASE ciW_West_Vinewood_1 RETURN "MP_WHOUSE_HT4" BREAK
CASE ciW_LSIA_1 RETURN "MP_WHOUSE_HT5" BREAK
CASE ciW_Del_Perro_1 RETURN "MP_WHOUSE_HT6" BREAK
CASE ciW_LSIA_2 RETURN "MP_WHOUSE_HT7" BREAK
CASE ciW_Elysian_Island_1 RETURN "MP_WHOUSE_HT8" BREAK
CASE ciW_El_Burro_Heights_1 RETURN "MP_WHOUSE_HT9" BREAK
CASE ciW_Elysian_Island_3 RETURN "MP_WHOUSE_HT10" BREAK
CASE ciW_La_Mesa_2 RETURN "MP_WHOUSE_HT11" BREAK
CASE ciW_Maze_Bank_Arena_1 RETURN "MP_WHOUSE_HT12" BREAK
CASE ciW_Strawberry_1 RETURN "MP_WHOUSE_HT13" BREAK
CASE ciW_Downtown_Vinewood_1 RETURN "MP_WHOUSE_HT14" BREAK
CASE ciW_La_Mesa_3 RETURN "MP_WHOUSE_HT15" BREAK
CASE ciW_La_Mesa_4 RETURN "MP_WHOUSE_HT16" BREAK
CASE ciW_Cypress_Flats_2 RETURN "MP_WHOUSE_HT17" BREAK
CASE ciW_Cypress_Flats_3 RETURN "MP_WHOUSE_HT18" BREAK
CASE ciW_Vinewood_1 RETURN "MP_WHOUSE_HT19" BREAK
CASE ciW_Rancho_2 RETURN "MP_WHOUSE_HT20" BREAK
CASE ciW_Banning_1 RETURN "MP_WHOUSE_HT21" BREAK
ENDSWITCH
CDEBUG1LN(DEBUG_SAFEHOUSE, "[WHOUSE] GET_WAREHOUSE_NAME_FOR_APP: ", iWarehouse, " valid warehouse found. Returning: empty name")
RETURN ""
ENDFUNC
PROC SETUP_SPECIAL_CARGO_WAREHOUSE_LIST_OVERLAY()
CLEAR_JOB_LIST_OVERLAY_DATA()
INT i
INT iOwnedWHCount = GET_COUNT_OF_WAREHOUSES_OWNED()
REPEAT ciMaxOwnedWarehouses i
INT iWarehouseID = ciW_Invalid
TEXT_LABEL_15 tlWarehouseName = ""
TEXT_LABEL_15 tlWarehouseNameSub = "" //Duplicate string for localised languages
BOOL bAvailable = (iOwnedWHCount > i)
IF bAvailable
iWarehouseID = GET_WAREHOUSE_ID_FOR_SAVE_SLOT(i)
//Warehouse name
tlWarehouseName = GET_WAREHOUSE_NAME(iWarehouseID)
tlWarehouseNameSub = GET_WAREHOUSE_NAME_FOR_APP(iWarehouseID)
//Do we have the capacity to store a shipment of this size?
IF GET_WAREHOUSE_REMAINING_CAPACITY(iWarehouseID) < ENUM_TO_INT(eSelectedShipmentSize)
bAvailable = FALSE
NC_APP_SET_TOOL_TIP_REASON_FOR_MISSION_WITH_INDEX(NC_TT_SC_FULL, i)
ENDIF
ELSE
//We don't own a warehouse in this slot so hide it
BREAKLOOP
ENDIF
//Description text label - Based on the selected shipment size
TEXT_LABEL_15 tlDesc = "HT_SCW_D"
tlDesc += (ENUM_TO_INT(eSelectedShipmentSize) - 1)
TEXT_LABEL_23 tlDescSub = GET_NC_APP_CONTRABAND_TYPE_LABEL_FOR_SECURO_APP(eActiveContrabandType)
TEXT_LABEL_23 tlDescSub2
//Tootltip description for a special shipment
IF eSelectedShipmentSize = CONTRABAND_SMALL
AND NC_APP_IS_SPECIAL_ITEM_ACTIVE_FOR_SPECIAL_CARGO()
tlDesc = "HT_SCW_D3"
tlDescSub = GET_CONTRABAND_WAREHOUSE_SIZE_TEXT_LABEL(GET_WAREHOUSE_SIZE(iWarehouseID))
ELSE
tlDescSub2 = GET_CONTRABAND_WAREHOUSE_SIZE_TEXT_LABEL(GET_WAREHOUSE_SIZE(iWarehouseID))
ENDIF
INT buyTimeRem = GET_CONTRABAND_BUY_COOLDOWN(iWarehouseID)
INT iTimeFormat = ciTYPE_FORMAT_HIDDEN
//If necessary grab the time remaining from the sell mission tuneable timer
IF buyTimeRem <= 0
IF NOT GB_HAS_BUY_MISSION_TIMER_EXPIRED()
buyTimeRem = g_sMPTunables.iexec_buy_fail_cooldown - ABSI(GET_TIME_DIFFERENCE(INT_TO_NATIVE(TIME_DATATYPE, GET_GAME_TIMER()), g_sGbWorkCoolDownVars.gbBuyCooldownTimer.Timer))
ENDIF
ENDIF
//Set the mission not available reason
IF buyTimeRem > 0
iTimeFormat = ciTYPE_FORMAT_TIME
NC_APP_SET_TOOL_TIP_REASON_FOR_MISSION_WITH_INDEX(NC_TT_SC_ON_CD, i)
ENDIF
//Set the tooltip description string
IF NC_APP_GET_TOOL_TIP_REASON_FOR_MISSION_WITH_INDEX(i) != NC_TT_NONE
tlDesc = GET_TOOL_TIP_TEXT_FOR_MISSION_UNAVAILABLE(NC_APP_GET_TOOL_TIP_REASON_FOR_MISSION_WITH_INDEX(i), -1)
tlDescSub = ""
IF NC_APP_GET_TOOL_TIP_REASON_FOR_MISSION_WITH_INDEX(i) = NC_TT_SC_FULL
tlDescSub = tlWarehouseNameSub
ENDIF
ENDIF
BEGIN_SCALEFORM_MOVIE_METHOD(mov, "ADD_JOB")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(i)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING(tlWarehouseName)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(buyTimeRem)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(iTimeFormat) //Type format for param above: 0 = Hidden 1 = Cash 2 = Time
//Build the description string
IF IS_STRING_NULL_OR_EMPTY(tlDescSub)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING(tlDesc)
ELSE
BEGIN_TEXT_COMMAND_SCALEFORM_STRING(tlDesc)
ADD_TEXT_COMPONENT_SUBSTRING_TEXT_LABEL(tlDescSub)
IF NOT IS_STRING_NULL_OR_EMPTY(tlDescSub2)
ADD_TEXT_COMPONENT_SUBSTRING_TEXT_LABEL(tlDescSub2)
ENDIF
END_TEXT_COMMAND_SCALEFORM_STRING()
ENDIF
SCALEFORM_MOVIE_METHOD_ADD_PARAM_BOOL(bAvailable)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(-1)
END_SCALEFORM_MOVIE_METHOD()
ENDREPEAT
OPEN_JOB_LIST_OVERLAY(NC_SPECIAL_CARGO, "HT_SC_MTW")
SET_BIT(iBS, NC_BS_JOB_OVERLAY_ACTIVE)
ENDPROC
PROC SETUP_SPECIAL_CARGO_JOB_OVERLAY()
CLEAR_JOB_LIST_OVERLAY_DATA()
INT i
//Store the active contraband type at the time of opening of the overlay
eActiveContrabandType = g_eContrabandType
IF IS_SPECIAL_CONTRABAND_ITEM_ACTIVE()
SET_BIT(iBS, NC_BS_SPECIAL_ITEM_ACTIVE)
PRINTLN("<APP_NC> SETUP_SPECIAL_CARGO_JOB_OVERLAY - Open overlay Specail item active for type: ", eActiveContrabandType)
ELSE
PRINTLN("<APP_NC> SETUP_SPECIAL_CARGO_JOB_OVERLAY - Open overlay for type: ", eActiveContrabandType)
CLEAR_BIT(iBS, NC_BS_SPECIAL_ITEM_ACTIVE)
ENDIF
REPEAT CONTRABAND_LARGE i
TEXT_LABEL_23 tlContrabandType = GET_NC_APP_CONTRABAND_TYPE_LABEL_FOR_SECURO_APP(eActiveContrabandType)
CONTRABAND_SIZE eShipmentSize = INT_TO_ENUM(CONTRABAND_SIZE, (i + 1))
INT iShipmentCost = GET_CONTRABAND_SHIPMENT_COST(eShipmentSize)
INT iShipmentSaleCost = -1
IF eShipmentSize = CONTRABAND_SMALL
AND NC_APP_IS_SPECIAL_ITEM_ACTIVE_FOR_SPECIAL_CARGO()
CONTRABAND_SPECIAL_ITEM eItem = GET_SPECIAL_ITEM_FROM_CONTRABAND_TYPE(eActiveContrabandType)
IF IS_SPECIAL_CONTRABAND_ITEM_ON_SALE(eItem)
iShipmentSaleCost = GET_SPECIAL_CONTRABAND_ITEM_COST(eItem)
iShipmentCost = GET_SPECIAL_CONTRABAND_ITEM_BASE_COST(eItem)
PRINTLN("<APP_NC> Special Contraband shipment available and on sale!")
ELSE
iShipmentCost = GET_SPECIAL_CONTRABAND_ITEM_COST(eItem)
PRINTLN("<APP_NC> Special Contraband shipment available")
ENDIF
ELSE
IF IS_CONTRABAND_SHIPMENT_ON_SALE(eShipmentSize)
iShipmentSaleCost = iShipmentCost
iShipmentCost = GET_CONTRABAND_BASE_SHIPMENT_COST(eShipmentSize)
ENDIF
ENDIF
//Mission name
TEXT_LABEL_15 tlShipmentSize = "HT_SC_T"
tlShipmentSize += i
//Description text label
TEXT_LABEL_15 tlDesc = "HT_SC_D"
tlDesc += i
IF eShipmentSize = CONTRABAND_SMALL
AND NC_APP_IS_SPECIAL_ITEM_ACTIVE_FOR_SPECIAL_CARGO()
tlShipmentSize = "HT_SC_T3"
tlDesc = "HT_SC_D3"
tlContrabandType = ""
ENDIF
BOOL bAvailable = DOES_PLAYER_OWN_A_WAREHOUSE(PLAYER_ID())
BEGIN_SCALEFORM_MOVIE_METHOD(mov, "ADD_JOB")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(i)
IF IS_STRING_NULL_OR_EMPTY(tlContrabandType)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING(tlShipmentSize)
ELSE
BEGIN_TEXT_COMMAND_SCALEFORM_STRING(tlShipmentSize)
ADD_TEXT_COMPONENT_SUBSTRING_TEXT_LABEL(tlContrabandType)
END_TEXT_COMMAND_SCALEFORM_STRING()
ENDIF
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(iShipmentCost)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(ciTYPE_FORMAT_CURRENCY) //Type format for param above: 0 = Hidden 1 = Cash 2 = Time
IF eShipmentSize = CONTRABAND_SMALL
AND NC_APP_IS_SPECIAL_ITEM_ACTIVE_FOR_SPECIAL_CARGO()
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING(tlDesc)
ELSE
BEGIN_TEXT_COMMAND_SCALEFORM_STRING(tlDesc)
ADD_TEXT_COMPONENT_SUBSTRING_TEXT_LABEL(tlContrabandType)
END_TEXT_COMMAND_SCALEFORM_STRING()
ENDIF
SCALEFORM_MOVIE_METHOD_ADD_PARAM_BOOL(bAvailable)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(iShipmentSaleCost)
END_SCALEFORM_MOVIE_METHOD()
ENDREPEAT
OPEN_JOB_LIST_OVERLAY(NC_SPECIAL_CARGO, "HT_SC_MT")
SET_BIT(iBS, NC_BS_JOB_OVERLAY_ACTIVE)
ENDPROC
FUNC eSMUGGLED_GOODS_TYPE GET_SMUGGLED_GOOD_TYPE_FOR_APP_INDEX(INT iJobID)
SWITCH iJobID
CASE 0 RETURN eSGT_NARCOTICS
CASE 1 RETURN eSGT_CHEMICALS
CASE 2 RETURN eSGT_MEDICAL_SUPPLIES
CASE 3 RETURN eSGT_ANIMAL_MATERIALS
CASE 4 RETURN eSGT_ART_AND_ANTIQUES
CASE 5 RETURN eSGT_JEWELRY_AND_GEMSTONES
CASE 6 RETURN eSGT_TOBACCO_AND_ALCOHOL
CASE 7 RETURN eSGT_COUNTERFEIT_GOODS
CASE 8 RETURN eSGT_MIXED
ENDSWITCH
RETURN eSGT_INVALID
ENDFUNC
PROC SETUP_HANGAR_CARGO_JOB_OVERLAY()
CLEAR_JOB_LIST_OVERLAY_DATA()
INT i
REPEAT ciTOTAL_HANGAR_GOODS_TYPES i
//Mission name
TEXT_LABEL_15 tlName = "HT_AF_T"
tlName += i
//Second string for localisation purposes
TEXT_LABEL_15 tlNameL = "HT_AF_TD"
tlNameL += i
//Description text label
TEXT_LABEL_15 tlDesc = "HT_AF_D"
tlDesc += i
BOOL bAvailable = DOES_PLAYER_OWN_A_HANGER(PLAYER_ID()) AND HAS_PLAYER_COMPLETED_HANGAR_SETUP(PLAYER_ID()) AND NOT IS_PLAYERS_HANGAR_CONTRABAND_STORAGE_FULL(PLAYER_ID())
INT iTimeFormat = ciTYPE_FORMAT_HIDDEN
INT iBuyTimeRem = 0
eSMUGGLED_GOODS_TYPE eType = GET_SMUGGLED_GOOD_TYPE_FOR_APP_INDEX(i)
INT iTypeIndex = ENUM_TO_INT(eType)
IF eType != eSGT_MIXED
AND SMUGGLER_HAS_STEAL_COOLDOWN_STARTED(eType)
iBuyTimeRem = GET_TIME_REMAINING_FROM_SCRIPT_TIMER_IN_SECONDS(g_sSmugglerCDVars.stStealCoolDownTimer[iTypeIndex], g_sSmugglerCDVars.iStealCooldownTimes[iTypeIndex])
ENDIF
IF iBuyTimeRem > 0
iTimeFormat = ciTYPE_FORMAT_TIME
NC_APP_SET_TOOL_TIP_REASON_FOR_MISSION_WITH_INDEX(NC_TT_SMUG_CD, i)
tlDesc = "HT_JOB_CD_3"
ELIF IS_PLAYERS_HANGAR_CONTRABAND_STORAGE_FULL(PLAYER_ID())
tlDesc = "HT_AF_P1_D2"
NC_APP_SET_TOOL_TIP_REASON_FOR_MISSION_WITH_INDEX(NC_TT_SMUG_FULL, i)
ENDIF
BEGIN_SCALEFORM_MOVIE_METHOD(mov, "ADD_JOB")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(i)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING(tlName)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(iBuyTimeRem)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(iTimeFormat)
IF iBuyTimeRem <= 0
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING(tlDesc)
ELSE
BEGIN_TEXT_COMMAND_SCALEFORM_STRING(tlDesc)
ADD_TEXT_COMPONENT_SUBSTRING_TEXT_LABEL(tlNameL)
END_TEXT_COMMAND_SCALEFORM_STRING()
ENDIF
SCALEFORM_MOVIE_METHOD_ADD_PARAM_BOOL(bAvailable)
END_SCALEFORM_MOVIE_METHOD()
ENDREPEAT
OPEN_JOB_LIST_OVERLAY(NC_AIR_FREIGHT, "HT_AF_MT")
SET_BIT(iBS, NC_BS_JOB_OVERLAY_ACTIVE)
ENDPROC
//
// Input handling
//
PROC HANDLE_CANCEL_BUTTON_PRESS()
IF NC_APP_IS_OVERLAY_OPEN()
//Hide the currently shown overlay
HIDE_OVERLAY()
ELSE
IF IS_BIT_SET(iBS, NC_BS_JOB_OVERLAY_SELECTED_SHIPMENT_SIZE)
CLEAR_BIT(iBS, NC_BS_JOB_OVERLAY_SELECTED_SHIPMENT_SIZE)
//Go back to the special cargo shipment size overlay
SETUP_SPECIAL_CARGO_JOB_OVERLAY()
ELIF IS_JOB_OVERLAY_VISIBLE()
//Go back to the home page
CLOSE_JOB_OVERLAY()
ELIF eCurrentPage = PAGE_HOME
PRINTLN("<APP_NC> [APP_CLOSE] Back pressed not closing the app. page: ", eCurrentPage)
SCRIPT_CLEANUP()
EXIT
ELSE
SCRIPT_CLEANUP()
ENDIF
ENDIF
PLAY_SOUND_FRONTEND(-1, "Select_Mission_Cancel", "DLC_GR_MOC_Computer_Sounds")
ENDPROC
PROC PASS_INPUTS_TO_SCALEFORM()
// bCursorInputProcessed = FALSE
#IF IS_DEBUG_BUILD
CLEAR_BIT(iBS, NC_BS_PRINTED_PAUSE_MENU_ACTIVE)
#ENDIF
SET_INPUT_EXCLUSIVE_AND_ENABLED(FRONTEND_CONTROL, INPUT_FRONTEND_LB)
IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_LB)
CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(mov, "SET_INPUT_EVENT", TO_FLOAT(ENUM_TO_INT(INPUT_FRONTEND_LB)))
ENDIF
SET_INPUT_EXCLUSIVE_AND_ENABLED(FRONTEND_CONTROL, INPUT_FRONTEND_RB)
IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_RB)
CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(mov, "SET_INPUT_EVENT", TO_FLOAT(ENUM_TO_INT(INPUT_FRONTEND_RB)))
ENDIF
IF IS_USING_CURSOR(FRONTEND_CONTROL)
SET_INPUT_EXCLUSIVE_AND_ENABLED(FRONTEND_CONTROL, INPUT_FRONTEND_UP)
IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_UP)
CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(mov, "SET_INPUT_EVENT", TO_FLOAT(ENUM_TO_INT(ciINPUT_KEYBOARD_UP)))
ENDIF
SET_INPUT_EXCLUSIVE_AND_ENABLED(FRONTEND_CONTROL, INPUT_FRONTEND_DOWN)
IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_DOWN)
CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(mov, "SET_INPUT_EVENT", TO_FLOAT(ENUM_TO_INT(ciINPUT_KEYBOARD_DOWN)))
ENDIF
IF IS_CONTROL_JUST_RELEASED(FRONTEND_CONTROL, INPUT_FRONTEND_DOWN)
CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(mov, "SET_INPUT_RELEASE_EVENT", TO_FLOAT(ENUM_TO_INT(ciINPUT_KEYBOARD_DOWN)))
ENDIF
IF IS_CONTROL_JUST_RELEASED(FRONTEND_CONTROL, INPUT_FRONTEND_UP)
CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(mov, "SET_INPUT_RELEASE_EVENT", TO_FLOAT(ENUM_TO_INT(ciINPUT_KEYBOARD_UP)))
ENDIF
ELSE
SET_INPUT_EXCLUSIVE_AND_ENABLED(FRONTEND_CONTROL, INPUT_FRONTEND_UP)
IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_UP)
CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(mov, "SET_INPUT_EVENT", TO_FLOAT(ENUM_TO_INT(INPUT_FRONTEND_UP)))
ENDIF
SET_INPUT_EXCLUSIVE_AND_ENABLED(FRONTEND_CONTROL, INPUT_FRONTEND_DOWN)
IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_DOWN)
CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(mov, "SET_INPUT_EVENT", TO_FLOAT(ENUM_TO_INT(INPUT_FRONTEND_DOWN)))
ENDIF
ENDIF
SET_INPUT_EXCLUSIVE_AND_ENABLED(FRONTEND_CONTROL, INPUT_FRONTEND_LEFT)
IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_LEFT)
CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(mov, "SET_INPUT_EVENT", TO_FLOAT(ENUM_TO_INT(INPUT_FRONTEND_LEFT)))
ENDIF
SET_INPUT_EXCLUSIVE_AND_ENABLED(FRONTEND_CONTROL, INPUT_FRONTEND_RIGHT)
IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_RIGHT)
CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(mov, "SET_INPUT_EVENT", TO_FLOAT(ENUM_TO_INT(INPUT_FRONTEND_RIGHT)))
ENDIF
SET_INPUT_EXCLUSIVE_AND_ENABLED(FRONTEND_CONTROL, INPUT_FRONTEND_ACCEPT)
IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_ACCEPT)
CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(mov, "SET_INPUT_EVENT", TO_FLOAT(ENUM_TO_INT(INPUT_FRONTEND_ACCEPT)))
ENDIF
SET_INPUT_EXCLUSIVE_AND_ENABLED(FRONTEND_CONTROL, INPUT_FRONTEND_CANCEL)
IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_CANCEL)
HANDLE_CANCEL_BUTTON_PRESS()
ENDIF
SET_INPUT_EXCLUSIVE_AND_ENABLED(FRONTEND_CONTROL, INPUT_FRONTEND_X)
IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_X)
CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(mov, "SET_INPUT_EVENT", TO_FLOAT(ENUM_TO_INT(INPUT_FRONTEND_X)))
ENDIF
SET_INPUT_EXCLUSIVE_AND_ENABLED(FRONTEND_CONTROL, INPUT_FRONTEND_Y)
IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_Y)
CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(mov, "SET_INPUT_EVENT", TO_FLOAT(ENUM_TO_INT(INPUT_FRONTEND_Y)))
ENDIF
IF IS_USING_CURSOR(FRONTEND_CONTROL)
BEGIN_SCALEFORM_MOVIE_METHOD(mov, "SET_MOUSE_INPUT")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_FLOAT(GET_DISABLED_CONTROL_NORMAL(FRONTEND_CONTROL, INPUT_CURSOR_X))
SCALEFORM_MOVIE_METHOD_ADD_PARAM_FLOAT(GET_DISABLED_CONTROL_NORMAL(FRONTEND_CONTROL, INPUT_CURSOR_Y))
END_SCALEFORM_MOVIE_METHOD()
SET_INPUT_EXCLUSIVE_AND_ENABLED(FRONTEND_CONTROL, INPUT_CURSOR_ACCEPT)
IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_CURSOR_ACCEPT)
CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(mov, "SET_INPUT_EVENT", TO_FLOAT(ENUM_TO_INT(INPUT_FRONTEND_ACCEPT)))
ENDIf
SET_INPUT_EXCLUSIVE_AND_ENABLED(FRONTEND_CONTROL, INPUT_CURSOR_CANCEL)
IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_CURSOR_CANCEL)
HANDLE_CANCEL_BUTTON_PRESS()
ENDIf
ELSE
SET_INPUT_EXCLUSIVE_AND_ENABLED(FRONTEND_CONTROL, INPUT_FRONTEND_AXIS_X)
SET_INPUT_EXCLUSIVE_AND_ENABLED(FRONTEND_CONTROL, INPUT_FRONTEND_AXIS_Y)
INT iLeftXNew = GET_CONTROL_VALUE(FRONTEND_CONTROL, INPUT_FRONTEND_AXIS_X)
INT iLeftYNew = GET_CONTROL_VALUE(FRONTEND_CONTROL, INPUT_FRONTEND_AXIS_Y)
IF (iLeftXNew != 127) OR (iLeftX != 127) OR (iLeftYNew != 127) OR (iLeftY != 127)
BEGIN_SCALEFORM_MOVIE_METHOD(mov, "SET_ANALOG_STICK_INPUT")
iLeftX = iLeftXNew
iLeftY = iLeftYNew
SCALEFORM_MOVIE_METHOD_ADD_PARAM_BOOL(TRUE)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(iLeftX)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(iLeftY)
END_SCALEFORM_MOVIE_METHOD()
ENDIF
ENDIF
SET_INPUT_EXCLUSIVE_AND_ENABLED(FRONTEND_CONTROL, INPUT_FRONTEND_RIGHT_AXIS_X)
SET_INPUT_EXCLUSIVE_AND_ENABLED(FRONTEND_CONTROL, INPUT_FRONTEND_RIGHT_AXIS_Y)
INT iRightXNew = GET_CONTROL_VALUE(FRONTEND_CONTROL, INPUT_FRONTEND_RIGHT_AXIS_X)
INT iRightYNew = GET_CONTROL_VALUE(FRONTEND_CONTROL, INPUT_FRONTEND_RIGHT_AXIS_Y)
IF (iRightXNew != 127) OR (iRightX != 127) OR (iRightYNew != 127) OR (iRightY != 127)
BOOL bUsingScrollWheel = (IS_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_CURSOR_SCROLL_DOWN) OR IS_DISABLED_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_CURSOR_SCROLL_DOWN))
IF NOT bUsingScrollWheel
bUsingScrollWheel = (IS_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_CURSOR_SCROLL_UP) OR IS_DISABLED_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_CURSOR_SCROLL_UP))
ENDIF
BEGIN_SCALEFORM_MOVIE_METHOD(mov, "SET_ANALOG_STICK_INPUT")
iRightX = iRightXNew
iRightY = iRightYNew
SCALEFORM_MOVIE_METHOD_ADD_PARAM_BOOL(FALSE)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(iRightX)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(iRightY)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_BOOL(bUsingScrollWheel)
END_SCALEFORM_MOVIE_METHOD()
ENDIF
IF (IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_Y)
OR IS_DISABLED_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_Y))
AND NOT IS_USING_KEYBOARD_AND_MOUSE(FRONTEND_CONTROL)
CPRINTLN(DEBUG_INTERNET,"<APP_NC> EXITING WEBSITE for Triangle press")
SCRIPT_CLEANUP()
ENDIF
#IF IS_DEBUG_BUILD
IF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_F))
SCRIPT_CLEANUP()
ENDIF
#ENDIF
ENDPROC
//
// Mission Launch Functions
//
FUNC BOOL BUY_SPECIAL_CARGO_MISSION(INT iWarehouseID, CONTRABAND_SIZE ShipmentSize, BOOL bSpecialItem, CONTRABAND_TYPE securoContraType, INT iMissionToLaunch)
INT iResultSlot = GET_SAVE_SLOT_FOR_WAREHOUSE(iWarehouseID)
TEXT_LABEL_15 tl_15ContrabandName = GET_WAREHOUSE_NAME(iWarehouseID)
CPRINTLN(DEBUG_INTERNET, "<APP_NC> BUY_SPECIAL_CARGO_MISSION: trying to purchase CONTRABAND #", iWarehouseID, " \"", tl_15ContrabandName, "\"")
BOOL bSpeialItemSelected = FALSE
INT iShipmentCost = GET_CONTRABAND_SHIPMENT_COST(ShipmentSize)
IF bSpecialItem
AND ShipmentSize = CONTRABAND_SMALL
iShipmentCost = GET_SPECIAL_CONTRABAND_ITEM_COST(GET_SPECIAL_ITEM_FROM_CONTRABAND_TYPE(securoContraType))
bSpeialItemSelected = TRUE
ENDIF
CPRINTLN(DEBUG_INTERNET, "<APP_NC> BUY_SPECIAL_CARGO_MISSION: purchase valid, attempting index #", iWarehouseID)
//is it a debit or refund
IF iShipmentCost > 0
//do they have enough money
IF NOT NETWORK_CAN_SPEND_MONEY(iShipmentCost, FALSE, TRUE, FALSE)
CPRINTLN(DEBUG_INTERNET, "<APP_NC> BUY_SPECIAL_CARGO_MISSION: purchase failed, player doesn't have sufficient cash")
//TRIGGER_BROWSER_NAG_SCREEN(GET_HASH_KEY(tl_15ContrabandName), iShipmentCost)
PLAY_SOUND_FRONTEND(-1, "Select_Mission_Unavailable", "DLC_GR_MOC_Computer_Sounds")
RETURN FALSE
ENDIF
ENDIF
// Check that mission is available
IF NOT CAN_PLAYER_LAUNCH_MISSION(iMissionToLaunch)
CPRINTLN(DEBUG_INTERNET, "<APP_NC> BUY_SPECIAL_CARGO_MISSION: purchase failed, CAN_PLAYER_LAUNCH_MISSION = FALSE")
PLAY_SOUND_FRONTEND(-1, "Select_Mission_Unavailable", "DLC_GR_MOC_Computer_Sounds")
RETURN FALSE
ENDIF
IF USE_SERVER_TRANSACTIONS()
/*
BuyContrabandMission
This is used to fill/set the CATEGORY_INVENTORY_CONTRABAND_MISSION
It deducts money for the purchasing of the mission
Basket will be < CATEGORY_INVENTORY_CONTRABAND_MISSION, CATEGORY_CONTRABAND_MISSION, price>
Validation must make sure the player owns the warehouse this CATEGORY_INVENTORY_CONTRABAND_MISSION is associated with
*/
INT iItemId = GET_CONTRABAND_MISSION_KEY_FOR_CATALOGUE(TRUE, ENUM_TO_INT(ShipmentSize), bSpeialItemSelected, ENUM_TO_INT(GET_SPECIAL_ITEM_FROM_CONTRABAND_TYPE(securoContraType)))
INT iInventoryKey = GET_CONTRABAND_MISSION_INVENTORY_KEY_FOR_CATALOGUE(iResultSlot)
INT iProcessSuccess = -1
INT iTransactionStatus = SHOP_BASKET_STAGE_ADD
BOOL bProcessingBasket = TRUE
///////////////////////////////////////////
/// TRANSACTION FOR CONTRABAND
WHILE PROCESSING_SECUROSERVE_CONTRABAND_BASKET(iProcessSuccess, iShipmentCost, iResultSlot, CATEGORY_INVENTORY_CONTRABAND_MISSION, NET_SHOP_ACTION_BUY_CONTRABAND_MISSION, iItemId, iInventoryKey, bProcessingBasket, iTransactionStatus)
RENDER_NC_APP()
WAIT(0)
ENDWHILE
SWITCH iProcessSuccess
CASE 0
CWARNINGLN(DEBUG_INTERNET, "<APP_NC> BUY_SPECIAL_CARGO_MISSION: failed to process transaction")
PLAY_SOUND_FRONTEND(-1, "Select_Mission_Unavailable", "DLC_GR_MOC_Computer_Sounds")
RETURN FALSE
BREAK
CASE 2
CPRINTLN(DEBUG_INTERNET, "<APP_NC> BUY_SPECIAL_CARGO_MISSION: success!!")
// Track this so we can add contraband if the mision was successful.
SET_LAST_PURCHASED_BUY_MISSION_CATALOGUE_KEY(iItemId)
BREAK
DEFAULT
CASSERTLN(DEBUG_INTERNET, "<APP_NC> BUY_SPECIAL_CARGO_MISSION: unknown iProcessSuccess: \"", iProcessSuccess, "\"")
BREAK
ENDSWITCH
ELSE
CPRINTLN(DEBUG_INTERNET, "<APP_NC> BUY_SPECIAL_CARGO_MISSION: ignore NETWORK_REQUEST_BASKET_TRANSACTION")
ENDIF
CPRINTLN(DEBUG_INTERNET, "<APP_NC> BUY_SPECIAL_CARGO_MISSION: final:$", iShipmentCost)
IF iShipmentCost >= 0
AND (iShipmentCost = 0
OR (iShipmentCost > 0 AND (USE_SERVER_TRANSACTIONS() OR NETWORK_CAN_SPEND_MONEY(iShipmentCost,FALSE,TRUE,FALSE))))
IF iShipmentCost > 0
INCREMENT_BY_MP_INT_PLAYER_STAT(MPPLY_INGAMESTORE_MONEYSPENT, iShipmentCost)
ENDIF
IF USE_SERVER_TRANSACTIONS()
CPRINTLN(DEBUG_SHOPS, "[CASH] NET_GAMESERVER_SET_TELEMETRY_NONCE_SEED - basket")
NET_GAMESERVER_SET_TELEMETRY_NONCE_SEED(GET_CASH_TRANSACTION_ID_FROM_INDEX(GET_BASKET_TRANSACTION_SCRIPT_INDEX()))
ENDIF
NETWORK_BUY_CONTRABAND_MISSION(iShipmentCost, iWarehouseID, GET_HASH_KEY(tl_15ContrabandName), FALSE, TRUE)
CPRINTLN(DEBUG_INTERNET, "<APP_NC> BUY_SPECIAL_CARGO_MISSION: Bought contraband ", tl_15ContrabandName, " for $", iShipmentCost)
IF USE_SERVER_TRANSACTIONS()
DELETE_CASH_TRANSACTION(GET_BASKET_TRANSACTION_SCRIPT_INDEX())
ENDIF
ENDIF
RETURN TRUE
ENDFUNC
FUNC BOOL DO_HANGAR_SOURCE_CARGO_LAUNCH_MISSION_TRANSACTION()
IF NOT USE_SERVER_TRANSACTIONS()
RETURN TRUE
ENDIF
CONTRABAND_TRANSACTION_STATE eResult
WHILE NOT PROCESS_TRANSACTION_FOR_HANGAR_CONTRABAND_MISSION(eResult, FALSE)
RENDER_NC_APP()
WAIT(0)
ENDWHILE
RENDER_NC_APP()
RETURN (eResult = CONTRABAND_TRANSACTION_STATE_SUCCESS)
ENDFUNC
FUNC BOOL DO_FACTORY_LAUNCH_MISSION_TRANSACTION(FACTORY_ID eFactory, INT iMissionID)
CPRINTLN(DEBUG_INTERNET, "<APP_NC> DO_FACTORY_LAUNCH_MISSION_TRANSACTION: trying to launch mission for bunker: ", GET_OWNED_BUNKER(PLAYER_ID()))
// Check that mission is available and the player is in an ok state to launch
IF NOT CAN_PLAYER_LAUNCH_MISSION(iMissionID)
CPRINTLN(DEBUG_INTERNET, "<APP_NC> DO_FACTORY_LAUNCH_MISSION_TRANSACTION: purchase failed, mission not available")
RETURN FALSE
ENDIF
CONTRABAND_TRANSACTION_STATE eTransactionState
INT iSaveSlot = GET_SAVE_SLOT_FOR_FACTORY(eFactory)
IF USE_SERVER_TRANSACTIONS()
/*
BuyContrabandMission
This is used to fill/set the CATEGORY_INVENTORY_CONTRABAND_MISSION
Basket will be < CATEGORY_INVENTORY_CONTRABAND_MISSION, CATEGORY_CONTRABAND_MISSION, price>
Validation must make sure the player owns the factory this CATEGORY_INVENTORY_CONTRABAND_MISSION is associated with
*/
INT iItemId = GET_FACTORY_MISSION_KEY_FOR_CATALOGUE(FALSE)
///////////////////////////////////////////
/// TRANSACTION FOR CONTRABAND
WHILE NOT PROCESS_TRANSACTION_FOR_CONTRABAND_MISSION(iSaveSlot, iItemId, eTransactionState)
WAIT(0)
RENDER_NC_APP()
ENDWHILE
RENDER_NC_APP()
IF eTransactionState = CONTRABAND_TRANSACTION_STATE_FAILED
CWARNINGLN(DEBUG_INTERNET, "<APP_NC> DO_FACTORY_LAUNCH_MISSION_TRANSACTION: failed to process transaction")
PLAY_SOUND_FRONTEND(-1, "Select_Mission_Unavailable", "DLC_GR_MOC_Computer_Sounds")
NC_APP_SET_MISSION_LAUNCH_FAIL_REASON("BKR_TF_R6")
RETURN FALSE
ELIF eTransactionState = CONTRABAND_TRANSACTION_STATE_SUCCESS
CPRINTLN(DEBUG_INTERNET, "<APP_NC> DO_FACTORY_LAUNCH_MISSION_TRANSACTION: success!!")
SET_LAST_PURCHASED_FACTORY_MISSION_CATALOGUE_KEY(iItemId)
ENDIF
ELSE
CPRINTLN(DEBUG_INTERNET, "<APP_NC> DO_FACTORY_LAUNCH_MISSION_TRANSACTION: ignore NETWORK_REQUEST_BASKET_TRANSACTION")
ENDIF
RETURN TRUE
ENDFUNC
FUNC BOOL CHECK_MP_VEH_STEAL_MISSION_AVAILABILITY()
CPRINTLN(DEBUG_INTERNET, "<APP_NC> LAUNCH_MP_VEH_STEAL_FROM_SECUROSERV: trying to steal vehicle")
// Check that mission is available
IF NOT GB_IS_BOSS_MISSION_AVAILABLE(PLAYER_ID(), FMMC_TYPE_VEHICLE_EXPORT_BUY , FALSE)
CPRINTLN(DEBUG_INTERNET, "<APP_NC> LAUNCH_MP_VEH_STEAL_FROM_SECUROSERV: purchase failed, mission not available")
RETURN FALSE
ENDIF
IF GB_IS_PLAYER_CRITICAL_TO_JOB(PLAYER_ID())
CPRINTLN(DEBUG_INTERNET, "<APP_NC> LAUNCH_MP_VEH_STEAL_FROM_SECUROSERV: purchase failed, player is critical")
RETURN FALSE
ENDIF
RETURN TRUE
ENDFUNC
FUNC BOOL LAUNCH_IE_STEAL_MISSION()
//Check we are about to launch a mission with a valid vehicle that we don't own
CHECK_IE_VEH_STEAL_LIST_FOR_OWNED_VEHICLES()
IF GET_ACTIVE_IE_STEAL_MISSION_VEHICLE() = IE_VEH_INVALID
//Shuffle the list
SHUFFLE_IE_VEHICLE_LIST_FOR_STEAL_MISSIONS()
//Make sure we don't start at a point in the list with an empty slot
CHECK_IE_VEH_STEAL_LIST_FOR_OWNED_VEHICLES(TRUE)
ENDIF
CDEBUG1LN(DEBUG_INTERNET, "<APP_NC>[Mission_Launch] LAUNCH_IE_STEAL_MISSION Requesting Mission: FMMC_TYPE_VEHICLE_EXPORT_BUY",
" With vehicle: ", GET_STRING_FROM_IE_VEHICLE_ENUM(GET_ACTIVE_IE_STEAL_MISSION_VEHICLE()))
IF GET_ACTIVE_IE_STEAL_MISSION_VEHICLE() != IE_VEH_INVALID
AND CHECK_MP_VEH_STEAL_MISSION_AVAILABILITY()
AND IE_DELIVERY_ACTIVATE_DROPOFF_OF_TYPE_FOR_GANG(VEHICLE_EXPORT_DROPOFF_GB_WAREHOUSE)
//Get the mission vehicle
IE_VEHICLE_ENUM eMissionVeh = GET_ACTIVE_IE_STEAL_MISSION_VEHICLE()
//Launch the mission
GB_BOSS_REQUEST_VEHICLE_EXPORT_MISSION_LAUNCH_FROM_SERVER(FMMC_TYPE_VEHICLE_EXPORT_BUY, eMissionVeh, IE_VEH_INVALID, IE_VEH_INVALID, IE_VEH_INVALID)
//Set the active vehicle for the next steal mission
INCREMENT_ACTIVE_IE_STEAL_MISSION_VEHICLE()
RETURN TRUE
ELSE
#IF IS_DEBUG_BUILD
IF GET_ACTIVE_IE_STEAL_MISSION_VEHICLE() = IE_VEH_INVALID
CASSERTLN(DEBUG_INTERNET, "<APP_NC> LAUNCH_IE_STEAL_MISSION Still trying to launch a mission with an invalid vehicle. This will not work!")
ENDIF
#ENDIF
CDEBUG1LN(DEBUG_INTERNET, "<APP_NC>[Mission_Launch] LAUNCH_IE_STEAL_MISSION Couldn't activate warehouse dropoff!")
ENDIF
RETURN FALSE
ENDFUNC
PROC SCALEFORM_UPDATE_COOLODOWN_TIMER(INT iIndex, INT iUpdatedTime)
BEGIN_SCALEFORM_MOVIE_METHOD(mov, "UPDATE_COOLDOWN")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(iIndex)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(iUpdatedTime)
END_SCALEFORM_MOVIE_METHOD()
ENDPROC
PROC UPDATE_JOB_OVERLAY_COOLDOWN_TIMERS(NC_MISSION_TYPE eMissionType)
INT i, iCooldownTime
NC_TT_JOB_NA_REASON eCooldownReason
SWITCH eMissionType
CASE NC_BOSS_WORK
REPEAT MAX_WORKS_JOBS i
iCooldownTime = GET_BOSS_WORK_OR_CHALLENGE_COOLDOWN_TIME_REMAINING(GET_FMMC_ID_FROM_JOB_ID(i))
IF IS_BOSS_WORK_OR_CHALLENGE_TIMER_RUNNING(GET_FMMC_ID_FROM_JOB_ID(i), eCooldownReason)
SCALEFORM_UPDATE_COOLODOWN_TIMER(i, iCooldownTime)
ENDIF
ENDREPEAT
BREAK
CASE NC_SPECIAL_CARGO
REPEAT GET_COUNT_OF_WAREHOUSES_OWNED() i
iCooldownTime = GET_CONTRABAND_BUY_COOLDOWN(GET_WAREHOUSE_ID_FOR_SAVE_SLOT(i))
IF iCooldownTime <= 0
IF NOT GB_HAS_BUY_MISSION_TIMER_EXPIRED()
iCooldownTime = g_sMPTunables.iexec_buy_fail_cooldown - ABSI(GET_TIME_DIFFERENCE(INT_TO_NATIVE(TIME_DATATYPE, GET_GAME_TIMER()), g_sGbWorkCoolDownVars.gbBuyCooldownTimer.Timer))
ENDIF
ENDIF
IF iCooldownTime >= 0
SCALEFORM_UPDATE_COOLODOWN_TIMER(i, iCooldownTime)
ENDIF
ENDREPEAT
BREAK
CASE NC_AIR_FREIGHT
REPEAT (ciTOTAL_HANGAR_GOODS_TYPES - 1) i
IF SMUGGLER_HAS_STEAL_COOLDOWN_STARTED(GET_SMUGGLED_GOOD_TYPE_FOR_APP_INDEX(i))
INT iTypeIndex
iTypeIndex = ENUM_TO_INT(GET_SMUGGLED_GOOD_TYPE_FOR_APP_INDEX(i))
iCooldownTime = GET_TIME_REMAINING_FROM_SCRIPT_TIMER_IN_SECONDS(g_sSmugglerCDVars.stStealCoolDownTimer[iTypeIndex], g_sSmugglerCDVars.iStealCooldownTimes[iTypeIndex])
ELSE
iCooldownTime = 0
ENDIF
IF iCooldownTime >= 0
SCALEFORM_UPDATE_COOLODOWN_TIMER(i, iCooldownTime)
ENDIF
ENDREPEAT
BREAK
ENDSWITCH
ENDPROC
PROC UPDATE_JOB_OVERLAY_MISSION_LOCKED_REASONS(NC_MISSION_TYPE eMissionType)
INT iFMMCID, iSlot, iWarehouseID, buyTimeRem
BOOL bUpdate
NC_TT_JOB_NA_REASON eCooldownReason
NC_TT_JOB_NA_REASON eNewCooldownReason
SWITCH eMissionType
CASE NC_BOSS_WORK
IF iJobUpdateStaggeredLoop = MAX_WORKS_JOBS
iJobUpdateStaggeredLoop = 0
REINIT_NET_TIMER(stUpdateLockReasonsTimer)
ELSE
iFMMCID = GET_FMMC_ID_FROM_JOB_ID(iJobUpdateStaggeredLoop)
eCooldownReason = NC_APP_GET_TOOL_TIP_REASON_FOR_MISSION_WITH_INDEX(iJobUpdateStaggeredLoop)
//Get the current unavailable reason
IS_NC_BOSS_WORK_AVAILABLE(iJobUpdateStaggeredLoop, TRUE)
IF IS_BOSS_WORK_OR_CHALLENGE_TIMER_RUNNING(iFMMCID, eNewCooldownReason)
IF eNewCooldownReason != eCooldownReason
bUpdate = TRUE
ENDIF
ELIF NC_APP_GET_TOOL_TIP_REASON_FOR_MISSION_WITH_INDEX(iJobUpdateStaggeredLoop) != eCooldownReason
bUpdate = TRUE
ENDIF
IF bUpdate
SETUP_TRUCK_JOB_OVERLAY()
REINIT_NET_TIMER(stUpdateLockReasonsTimer)
iJobUpdateStaggeredLoop = 0
ELSE
iJobUpdateStaggeredLoop ++
ENDIF
ENDIF
BREAK
CASE NC_DRUG_CARGO
IF iJobUpdateStaggeredLoop = ENUM_TO_INT(FACTORY_TYPE_WEAPONS)
iJobUpdateStaggeredLoop = 0
REINIT_NET_TIMER(stUpdateLockReasonsTimer)
ELSE
eCooldownReason = NC_APP_GET_TOOL_TIP_REASON_FOR_MISSION_WITH_INDEX(iJobUpdateStaggeredLoop)
FACTORY_TYPE eType
FACTORY_ID eFracotryID
eType = INT_TO_ENUM(FACTORY_TYPE, iJobUpdateStaggeredLoop)
IF DOES_PLAYER_OWN_FACTORY_OF_TYPE(PLAYER_ID(), eType)
iSlot = GET_SAVE_SLOT_OF_OWNED_FACTORY_TYPE(PLAYER_ID(), eType)
eFracotryID = GET_FACTORY_ID_FROM_FACTORY_SLOT(PLAYER_ID(), iSlot)
SET_BIKER_MISSION_UNAVAILABLE_REASON(eFracotryID, iSlot, iJobUpdateStaggeredLoop)
IF NC_APP_GET_TOOL_TIP_REASON_FOR_MISSION_WITH_INDEX(iJobUpdateStaggeredLoop) != eCooldownReason
bUpdate = TRUE
ENDIF
ENDIF
IF bUpdate
SETUP_BIKER_JOB_OVERLAY()
REINIT_NET_TIMER(stUpdateLockReasonsTimer)
iJobUpdateStaggeredLoop = 0
ELSE
iJobUpdateStaggeredLoop ++
ENDIF
ENDIF
BREAK
CASE NC_AIR_FREIGHT
IF iJobUpdateStaggeredLoop =ciTOTAL_HANGAR_GOODS_TYPES
iJobUpdateStaggeredLoop = 0
REINIT_NET_TIMER(stUpdateLockReasonsTimer)
ELSE
eSMUGGLED_GOODS_TYPE eType
eType = GET_SMUGGLED_GOOD_TYPE_FOR_APP_INDEX(iJobUpdateStaggeredLoop)
IF eType != eSGT_MIXED
IF SMUGGLER_HAS_STEAL_COOLDOWN_STARTED(eType)
bUpdate = (NC_APP_GET_TOOL_TIP_REASON_FOR_MISSION_WITH_INDEX(iJobUpdateStaggeredLoop) != NC_TT_SMUG_CD)
ELSE
IF IS_PLAYERS_HANGAR_CONTRABAND_STORAGE_FULL(PLAYER_ID())
bUpdate = (NC_APP_GET_TOOL_TIP_REASON_FOR_MISSION_WITH_INDEX(iJobUpdateStaggeredLoop) != NC_TT_SMUG_FULL)
ELSE
bUpdate = (NC_APP_GET_TOOL_TIP_REASON_FOR_MISSION_WITH_INDEX(iJobUpdateStaggeredLoop) != NC_TT_NONE)
ENDIF
ENDIF
ELSE
bUpdate = (NC_APP_GET_TOOL_TIP_REASON_FOR_MISSION_WITH_INDEX(iJobUpdateStaggeredLoop) != NC_TT_SMUG_FULL)
ENDIF
IF bUpdate
SETUP_HANGAR_CARGO_JOB_OVERLAY()
REINIT_NET_TIMER(stUpdateLockReasonsTimer)
iJobUpdateStaggeredLoop = 0
ELSE
iJobUpdateStaggeredLoop ++
ENDIF
ENDIF
BREAK
CASE NC_SPECIAL_CARGO
IF IS_BIT_SET(iBS, NC_BS_JOB_OVERLAY_SELECTED_SHIPMENT_SIZE)
IF iJobUpdateStaggeredLoop = GET_COUNT_OF_WAREHOUSES_OWNED()
iJobUpdateStaggeredLoop = 0
REINIT_NET_TIMER(stUpdateLockReasonsTimer)
ELSE
iWarehouseID = GET_WAREHOUSE_ID_FOR_SAVE_SLOT(iJobUpdateStaggeredLoop)
IF GET_WAREHOUSE_REMAINING_CAPACITY(iWarehouseID) < ENUM_TO_INT(eSelectedShipmentSize)
bUpdate = (NC_APP_GET_TOOL_TIP_REASON_FOR_MISSION_WITH_INDEX(iJobUpdateStaggeredLoop) != NC_TT_SC_FULL)
ELSE
bUpdate = (NC_APP_GET_TOOL_TIP_REASON_FOR_MISSION_WITH_INDEX(iJobUpdateStaggeredLoop) = NC_TT_SC_FULL)
ENDIF
IF NOT bUpdate
buyTimeRem = GET_CONTRABAND_BUY_COOLDOWN(iWarehouseID)
IF buyTimeRem <= 0
IF NOT GB_HAS_BUY_MISSION_TIMER_EXPIRED()
buyTimeRem = g_sMPTunables.iexec_buy_fail_cooldown - ABSI(GET_TIME_DIFFERENCE(INT_TO_NATIVE(TIME_DATATYPE, GET_GAME_TIMER()), g_sGbWorkCoolDownVars.gbBuyCooldownTimer.Timer))
ENDIF
ENDIF
IF (NC_APP_GET_TOOL_TIP_REASON_FOR_MISSION_WITH_INDEX(iJobUpdateStaggeredLoop) = NC_TT_SC_ON_CD)
bUpdate = (buyTimeRem <= 0)
ELSE
bUpdate = (buyTimeRem > 0)
ENDIF
ENDIF
IF bUpdate
SETUP_SPECIAL_CARGO_WAREHOUSE_LIST_OVERLAY()
REINIT_NET_TIMER(stUpdateLockReasonsTimer)
iJobUpdateStaggeredLoop = 0
ELSE
iJobUpdateStaggeredLoop ++
ENDIF
ENDIF
ENDIF
BREAK
DEFAULT
iJobUpdateStaggeredLoop = 0
REINIT_NET_TIMER(stUpdateLockReasonsTimer)
BREAK
ENDSWITCH
ENDPROC
PROC UPDATE_JOB_OVERLAY_DATA(NC_MISSION_TYPE eMissionType)
IF IS_BIT_SET(iBS, NC_BS_JOB_OVERLAY_ACTIVE)
IF NOT NC_APP_IS_OVERLAY_OPEN()
IF HAS_NET_TIMER_EXPIRED(stUpdateLockReasonsTimer, 1000)
UPDATE_JOB_OVERLAY_MISSION_LOCKED_REASONS(eMissionType)
ENDIF
IF HAS_NET_TIMER_EXPIRED(stUpdateCDTimer, 500)
UPDATE_JOB_OVERLAY_COOLDOWN_TIMERS(eMissionType)
ENDIF
ENDIF
ELSE
RESET_NET_TIMER(stUpdateLockReasonsTimer)
iJobUpdateStaggeredLoop = 0
IF NOT GB_HAS_IE_MISSION_COOLDOWN_TIMER_EXPIRED(VEV_EYE_IN_THE_SKY)
OR IS_BIT_SET(iBS, NC_BS_IE_COOLDOWN_RUNNING)
IF HAS_NET_TIMER_EXPIRED(stUpdateCDTimer, 500)
RESET_NET_TIMER(stUpdateCDTimer)
UPDATE_PRIMARY_MISSION_WITH_ID(ENUM_TO_INT(NC_VEHICLE_CARGO))
IF GB_HAS_IE_MISSION_COOLDOWN_TIMER_EXPIRED(VEV_EYE_IN_THE_SKY)
CLEAR_BIT(iBS, NC_BS_IE_COOLDOWN_RUNNING)
ELSE
SET_BIT(iBS, NC_BS_IE_COOLDOWN_RUNNING)
ENDIF
ENDIF
ELSE
RESET_NET_TIMER(stUpdateCDTimer)
ENDIF
ENDIF
ENDPROC
PROC LAUNCH_MISSION(INT iMissionID)
IF iMissionID = FMMC_TYPE_GB_CONTRABAND_BUY
BOOL bActivateSpecialItemMission = FALSE
IF NC_APP_IS_SPECIAL_ITEM_ACTIVE_FOR_SPECIAL_CARGO()
AND eSelectedShipmentSize = CONTRABAND_SMALL
bActivateSpecialItemMission = TRUE
ENDIF
GB_BOSS_REQUEST_CONTRABAND_MISSION_LAUNCH_FROM_SERVER(iMissionID, iSelectedSCWarehouse, eSelectedShipmentSize, eActiveContrabandType, bActivateSpecialItemMission)
ELIF iMissionID = FMMC_TYPE_SMUGGLER_BUY
IF eSelectedHangarGoodsType = eSGT_MIXED
PRINTLN("<APP_NC> LAUNCH_MISSION Mixed type not supported. Choosing random new type")
eSelectedHangarGoodsType = INT_TO_ENUM(eSMUGGLED_GOODS_TYPE, GET_RANDOM_INT_IN_RANGE(0, ENUM_TO_INT(eSGT_MIXED)))
GB_SET_GLOBAL_NON_BD_BIT0(eGB_GLOBAL_NON_BD_BITSET_0_LAUNCHED_SMUG_MISSION_WHIT_ANY_TYPE)
ELSE
GB_CLEAR_GLOBAL_NON_BD_BIT0(eGB_GLOBAL_NON_BD_BITSET_0_LAUNCHED_SMUG_MISSION_WHIT_ANY_TYPE)
ENDIF
PRINTLN("<APP_NC> LAUNCH_MISSION Requesting mission launch of type: ", iMissionID, " with goods type: ", DEBUG_GET_SMUGGLED_GOODS_TYPE_NAME(eSelectedHangarGoodsType))
GB_BOSS_REQUEST_SMUGGLER_MISSION_LAUNCH_FROM_SERVER(iMissionID, FREEMODE_DELIVERY_LOCATION_CITY, eSelectedHangarGoodsType)
ELIF iMissionID = FMMC_TYPE_GUNRUNNING_BUY
GB_BOSS_REQUEST_GUNRUNNING_MISSION_LAUNCH_FROM_SERVER(iMissionID)
ELIF iMissionID = FMMC_TYPE_BIKER_BUY
GB_BOSS_REQUEST_ILLICIT_GOODS_MISSION_LAUNCH_FROM_SERVER(iMissionID, eSelectedFactory)
ELSE
GB_BOSS_REQUEST_MISSION_LAUNCH_FROM_SERVER(iMissionID)
ENDIF
g_bLaunchedMissionFrmSMPLIntLaptop = TRUE
SCRIPT_CLEANUP(DEFAULT, FALSE)
ENDPROC
//
// Input result Handling
//
PROC RUN_BOSS_WORK_MISSION_LAUNCH_CEHCKS(INT iJobID)
INT iFMMCID = GET_FMMC_ID_FROM_JOB_ID(iJobID)
IF NOT IS_NC_BOSS_WORK_AVAILABLE(iJobID)
PLAY_CLICK_LINK_FAIL_SOUND()
ELIF NOT CAN_PLAYER_LAUNCH_BOSS_WORK(iFMMCID)
SHOW_OVERLAY("HT_BW_LT", NC_APP_GET_MISSION_LAUNCH_FAIL_REASON(), "OR_OVRLY_OK", "", TRUE, FALSE)
ELSE
TEXT_LABEL_15 tlJob = "HT_BW_T"
tlJob += iJobID
SHOW_OVERLAY("HT_BW_LT", "HT_BW_L0", "WHOUSE_CONF", "WHOUSE_CANC", FALSE, TRUE, NCA_STAGE_CONFIRM_HACKER_WORKS_MISSION_LAUNCH, DEFAULT, DEFAULT, tlJob)
SET_FMMC_MISSION_ID(iFMMCID)
ENDIF
ENDPROC
PROC RUN_AIR_FREIGHT_MISSION_LAUNCH_CEHCKS(INT iJobID)
eSelectedHangarGoodsType = GET_SMUGGLED_GOOD_TYPE_FOR_APP_INDEX(iJobID)
IF IS_PLAYERS_HANGAR_CONTRABAND_STORAGE_FULL(PLAYER_ID())
//SHOW_OVERLAY("HT_AF_P1", "HT_AF_P1_D2", "OR_OVRLY_OK", "", TRUE, FALSE) //FAIL: We have 100% supplies already
PLAY_CLICK_LINK_FAIL_SOUND()
ELIF eSelectedHangarGoodsType != eSGT_MIXED
AND SMUGGLER_HAS_STEAL_COOLDOWN_STARTED(eSelectedHangarGoodsType)
//SHOW_OVERLAY("HT_AF_P1", "HT_AF_P1_D3", "OR_OVRLY_OK", "", TRUE, FALSE) //FAIL: We are on cooldown for this type
PLAY_CLICK_LINK_FAIL_SOUND()
ELIF NOT CAN_PLAYER_LAUNCH_MISSION(FMMC_TYPE_SMUGGLER_BUY)
SHOW_OVERLAY("HT_AF_P1", NC_APP_GET_MISSION_LAUNCH_FAIL_REASON(), "OR_OVRLY_OK", "", TRUE, FALSE) //FAIL: Not available
ELSE
TEXT_LABEL_15 tlConfirm = "HAPP_STEAL_C1"
TEXT_LABEL_15 tlConfirmSubString = ""
IF eSelectedHangarGoodsType != eSGT_MIXED
tlConfirm = "HAPP_STEAL_C0"
tlConfirmSubString = GET_HANGAR_STOCK_TYPE_TEXT_LABEL(eSelectedHangarGoodsType)
ENDIF
SHOW_OVERLAY("HT_AF_P1", tlConfirm, "WHOUSE_CONF", "WHOUSE_CANC", FALSE, TRUE, NCA_STAGE_CONFIRM_AIR_FREIGHT_MISSION_LAUNCH, DEFAULT, DEFAULT, tlConfirmSubString)
ENDIF
ENDPROC
PROC RUN_SPECIAL_CARGO_MISSION_LAUNCH_CEHCKS(INT iSelectedOption)
IF IS_BIT_SET(iBS, NC_BS_JOB_OVERLAY_SELECTED_SHIPMENT_SIZE)
iSelectedSCWarehouse = GET_WAREHOUSE_ID_FOR_SAVE_SLOT(iSelectedOption)
IF NOT DOES_PLAYER_OWN_WAREHOUSE_THAT_HAS_SPACE_TO_STORE_A_SHIPMENT_OF_SIZE(eSelectedShipmentSize)
//SHOW_OVERLAY("HT_SC_P1", "HT_SC_P1_D2", "OR_OVRLY_OK", "", TRUE, FALSE)
PLAY_CLICK_LINK_FAIL_SOUND()
ELIF IS_CONTRABAND_BUY_COOLDOWN_ACTIVE(iSelectedSCWarehouse)
//SHOW_OVERLAY("HT_SC_P1", "HT_SC_P1_D3", "OR_OVRLY_OK", "", TRUE, FALSE)
PLAY_CLICK_LINK_FAIL_SOUND()
ELIF NOT CAN_PLAYER_LAUNCH_MISSION(FMMC_TYPE_GB_CONTRABAND_BUY)
SHOW_OVERLAY("HT_SC_P1", NC_APP_GET_MISSION_LAUNCH_FAIL_REASON(), "OR_OVRLY_OK", "", TRUE, FALSE)
ELSE
TEXT_LABEL_15 tlContrabandLabel = BUILD_BUY_MISSION_CONFIRM_STRING(eActiveContrabandType, eSelectedShipmentSize, NC_APP_IS_SPECIAL_ITEM_ACTIVE_FOR_SPECIAL_CARGO())
SHOW_OVERLAY("HT_SC_P2", tlContrabandLabel, "WHOUSE_CONF", "WHOUSE_CANC", FALSE, TRUE, NCA_STAGE_CONFIRM_SPECIAL_CARGO_MISSION_LAUNCH)
ENDIF
ELSE
eSelectedShipmentSize = INT_TO_ENUM(CONTRABAND_SIZE, (iSelectedOption + 1))
IF NOT DOES_PLAYER_OWN_A_WAREHOUSE(PLAYER_ID())
SHOW_OVERLAY("HT_SC_P1", "HT_SC_P1_D1", "OR_OVRLY_OK", "", TRUE, FALSE)
ELIF NOT DOES_PLAYER_OWN_WAREHOUSE_THAT_HAS_SPACE_TO_STORE_A_SHIPMENT_OF_SIZE(eSelectedShipmentSize)
SHOW_OVERLAY("HT_SC_P1", "HT_SC_P1_D2", "OR_OVRLY_OK", "", TRUE, FALSE)
ELSE
SET_BIT(iBS, NC_BS_JOB_OVERLAY_SELECTED_SHIPMENT_SIZE)
PRINTLN("<APP_NC> RUN_SPECIAL_CARGO_MISSION_LAUNCH_CEHCKS - Selected shipment size ", eSelectedShipmentSize, " calling SETUP_SPECIAL_CARGO_WAREHOUSE_LIST_OVERLAY")
SETUP_SPECIAL_CARGO_WAREHOUSE_LIST_OVERLAY()
PLAY_CLICK_LINK_SOUND()
ENDIF
ENDIF
ENDPROC
PROC RUN_VEHICLE_CARGO_MISSION_LAUNCH_CEHCKS()
IF NOT GB_IS_BOSS_MISSION_AVAILABLE(PLAYER_ID(), FMMC_TYPE_VEHICLE_EXPORT_BUY, FALSE)
INT iFailReason = GB_GET_BOSS_MISSION_UNAVAILABLE_REASON(PLAYER_ID(), FMMC_TYPE_VEHICLE_EXPORT_BUY, FALSE)
IF iFailReason = GB_MU_REASON_BOSS_IS_ANIMAL
SHOW_OVERLAY("HT_VC_P1", "BKR_TF_R6", "OR_OVRLY_OK", "", TRUE, FALSE)
EXIT
ELIF iFailReason = GB_MU_REASON_GOON_IS_ANIMAL
IF GB_IS_PLAYER_BOSS_OF_A_BIKER_GANG(PLAYER_ID())
SHOW_OVERLAY("HT_VC_P1", "GENERAL_MLF_G1", "OR_OVRLY_OK", "", TRUE, FALSE)
ELIF DOES_PLAYER_OWN_OFFICE(PLAYER_ID())
SHOW_OVERLAY("HT_VC_P1", "GENERAL_MLF_G2", "OR_OVRLY_OK", "", TRUE, FALSE)
ELSE
SHOW_OVERLAY("HT_VC_P1", "GENERAL_MLF_G3", "OR_OVRLY_OK", "", TRUE, FALSE)
ENDIF
EXIT
ELIF iFailReason = GB_MU_REASON_GOON_GAMBLING
IF GB_IS_PLAYER_BOSS_OF_A_BIKER_GANG(PLAYER_ID())
SHOW_OVERLAY("HT_VC_P1", "GENERAL_MLF_G4", "OR_OVRLY_OK", "", TRUE, FALSE)
ELIF DOES_PLAYER_OWN_OFFICE(PLAYER_ID())
SHOW_OVERLAY("HT_VC_P1", "GENERAL_MLF_G5", "OR_OVRLY_OK", "", TRUE, FALSE)
ELSE
SHOW_OVERLAY("HT_VC_P1", "GENERAL_MLF_G6", "OR_OVRLY_OK", "", TRUE, FALSE)
ENDIF
EXIT
ENDIF
ENDIF
IF NOT GB_HAS_IE_MISSION_COOLDOWN_TIMER_EXPIRED(VEV_EYE_IN_THE_SKY)
SHOW_OVERLAY("HT_VC_P1", "SEC_V_STEAL_F", "OR_OVRLY_OK", "", TRUE, FALSE)
ELIF IS_PLAYERS_IE_GARAGE_FULL(PLAYER_ID(), GET_PLAYERS_OWNED_IE_GARAGE(PLAYER_ID()))
SHOW_OVERLAY("HT_VC_P1", "HT_VC_P1_D2", "OR_OVRLY_OK", "", TRUE, FALSE)
ELSE
SHOW_OVERLAY("SEC_VEH_STEAL", "SEC_VEH_STEALQ", "WHOUSE_CONF", "WHOUSE_CANC", FALSE, TRUE, NCA_STAGE_CONFIRM_VEHICLE_CARGO_MISSION_LAUNCH)
ENDIF
ENDPROC
PROC RUN_WEAPONS_CARGO_MISSION_LAUNCH_CEHCKS()
IF NOT HAS_PLAYER_COMPLETED_FACTORY_SETUP_MISSION(PLAYER_ID(), GET_OWNED_BUNKER(PLAYER_ID()))
SHOW_OVERLAY("HT_GR_P1", "HT_GR_P1_D2", "OR_OVRLY_OK", "", TRUE, FALSE)
ELIF HAS_PLAYER_SUSPENDED_BUNKER_PRODUCTION()
SHOW_OVERLAY("HT_GR_P1", "OR_RESUP_RES", "OR_OVRLY_OK", "", TRUE, FALSE)
ELIF g_iMaterialsTotalForFactory[BUNKER_SAVE_SLOT] >= g_sMPTunables.iBIKER_RESUPPLY_LAUNCH_SUPPLIES_THRESHOLD //FAIL: We hav 100% supplies already
SHOW_OVERLAY("HT_GR_P1", "OR_MIS_NA_B", "OR_OVRLY_OK", "", TRUE, FALSE)
ELIF IS_PAID_RESUPPLY_TIMER_RUNNING(BUNKER_SAVE_SLOT) //FAIL: We have already paid for a resupply
SHOW_OVERLAY("HT_GR_P1", "OR_MIS_NA_C", "OR_OVRLY_OK", "", TRUE, FALSE)
ELIF NOT CAN_PLAYER_LAUNCH_MISSION(FMMC_TYPE_GUNRUNNING_BUY) //FAIL: Not available
SHOW_OVERLAY("HT_GR_P1", NC_APP_GET_MISSION_LAUNCH_FAIL_REASON(), "OR_OVRLY_OK", "", TRUE, FALSE)
ELSE
SHOW_OVERLAY("HT_GR_P1", "BU_STEAL_SUP", "WHOUSE_CONF", "WHOUSE_CANC", FALSE, TRUE, NCA_STAGE_CONFIRM_GUNRUNNING_MISSION_LAUNCH)
ENDIF
ENDPROC
PROC RUN_DRUG_CARGO_MISSION_LAUNCH_CEHCKS(INT iJobID)
FACTORY_TYPE eFactoryType = INT_TO_ENUM(FACTORY_TYPE, iJobID)
IF DOES_PLAYER_OWN_FACTORY_OF_TYPE(PLAYER_ID(), eFactoryType)
eSelectedFactory = GET_FACTORY_ID_OF_OWNED_FACTORY_TYPE(PLAYER_ID(), eFactoryType)
INT iSaveSlot = GET_PLAYER_SAVE_SLOT_FOR_FACTORY(PLAYER_ID(), eSelectedFactory)
IF NOT HAS_PLAYER_COMPLETED_FACTORY_SETUP_MISSION(PLAYER_ID(), eSelectedFactory)
AND NOT IS_DELAY_PRODUCTION_TIMER_RUNNING(iSaveSlot)
// TEXT_LABEL_15 tlBusinessType = GET_FACTORY_TYPE_PROPERTY_LABEL(eFactoryType)
// SHOW_OVERLAY("HT_GR_P1", "HT_DW_P1_D5", "OR_OVRLY_OK", "", TRUE, FALSE, DEFAULT, DEFAULT, DEFAULT, tlBusinessType)
PLAY_CLICK_LINK_FAIL_SOUND()
ELIF HAS_PLAYER_SUSPENDED_BIKER_BUSINESS_PRODUCTION(PLAYER_ID(), eSelectedFactory)
// TEXT_LABEL_15 tlBusinessType = GET_FACTORY_TYPE_PROPERTY_LABEL(eFactoryType)
// SHOW_OVERLAY("HT_GR_P1", "HT_DW_P1_D6", "OR_OVRLY_OK", "", TRUE, FALSE, DEFAULT, DEFAULT, DEFAULT, tlBusinessType)
PLAY_CLICK_LINK_FAIL_SOUND()
ELIF g_iMaterialsTotalForFactory[GET_SAVE_SLOT_FOR_FACTORY(eSelectedFactory)] >= g_sMPTunables.iBIKER_RESUPPLY_LAUNCH_SUPPLIES_THRESHOLD //FAIL: We hav 100% supplies already
//SHOW_OVERLAY("HT_DW_P1", "OR_MIS_NA_B", "OR_OVRLY_OK", "", TRUE, FALSE)
PLAY_CLICK_LINK_FAIL_SOUND()
ELIF IS_PAID_RESUPPLY_TIMER_RUNNING(GET_SAVE_SLOT_FOR_FACTORY(eSelectedFactory)) //FAIL: We have already paid for a resupply
//SHOW_OVERLAY("HT_DW_P1", "OR_MIS_NA_C", "OR_OVRLY_OK", "", TRUE, FALSE)
PLAY_CLICK_LINK_FAIL_SOUND()
ELIF NOT CAN_PLAYER_LAUNCH_MISSION(FMMC_TYPE_BIKER_BUY) //FAIL: Not available
SHOW_OVERLAY("HT_DW_P1", NC_APP_GET_MISSION_LAUNCH_FAIL_REASON(), "OR_OVRLY_OK", "", TRUE, FALSE)
ELSE
TEXT_LABEL_15 tlBusinessType = GET_FACTORY_TYPE_PROPERTY_LABEL(eFactoryType, 1)
SHOW_OVERLAY("HT_DW_P1", "HT_DW_P1_D4", "WHOUSE_CONF", "WHOUSE_CANC", FALSE, TRUE, NCA_STAGE_CONFIRM_DRUG_BUSINESS_MISSION_LAUNCH, DEFAULT, DEFAULT, tlBusinessType)
ENDIF
ELSE
//TEXT_LABEL_15 tlBusinessType = GET_FACTORY_TYPE_PROPERTY_LABEL(eFactoryType)
//SHOW_OVERLAY("HT_DW_P1", "HT_DW_P1_D3", "OR_OVRLY_OK", "", TRUE, FALSE, DEFAULT, DEFAULT, DEFAULT, tlBusinessType)
PLAY_CLICK_LINK_FAIL_SOUND()
ENDIF
ENDPROC
PROC RUN_INITIAL_MISSION_LAUNCH_CHECKS(NC_MISSION_TYPE eMissionType, INT iJobID)
SWITCH eMissionType
CASE NC_BOSS_WORK RUN_BOSS_WORK_MISSION_LAUNCH_CEHCKS(iJobID) BREAK
CASE NC_AIR_FREIGHT RUN_AIR_FREIGHT_MISSION_LAUNCH_CEHCKS(iJobID) BREAK
CASE NC_SPECIAL_CARGO RUN_SPECIAL_CARGO_MISSION_LAUNCH_CEHCKS(iJobID) BREAK
CASE NC_VEHICLE_CARGO RUN_VEHICLE_CARGO_MISSION_LAUNCH_CEHCKS() BREAK
CASE NC_WEAPONS_CARGO RUN_WEAPONS_CARGO_MISSION_LAUNCH_CEHCKS() BREAK
CASE NC_DRUG_CARGO RUN_DRUG_CARGO_MISSION_LAUNCH_CEHCKS(iJobID) BREAK
ENDSWITCH
ENDPROC
PROC HANDLE_ACCEPT_OVERLAY_PRESS()
IF NC_APP_GET_APP_STAGE() != NCA_STAGE_IDLE
PLAY_SOUND_FRONTEND(-1, "Select_Mission_Launch", "DLC_GR_MOC_Computer_Sounds")
ENDIF
SWITCH NC_APP_GET_APP_STAGE()
CASE NCA_STAGE_CONFIRM_HACKER_WORKS_MISSION_LAUNCH
IF IS_NC_BOSS_WORK_AVAILABLE(GET_JOB_ID_FROM_FMMC_ID(iMissionIDToLaunch))
AND CAN_PLAYER_LAUNCH_BOSS_WORK(iMissionIDToLaunch)
GB_SET_PLAYER_GANG_BOSS_MISSION_VARIATION(iSelectedMissionSubVar)
LAUNCH_MISSION(iMissionIDToLaunch)
ELSE
HIDE_OVERLAY()
SHOW_OVERLAY("HT_BW_LT", "HT_BW_L1", "OR_OVRLY_OK", "", TRUE, FALSE)
EXIT
ENDIF
BREAK
CASE NCA_STAGE_CONFIRM_AIR_FREIGHT_MISSION_LAUNCH
IF DO_HANGAR_SOURCE_CARGO_LAUNCH_MISSION_TRANSACTION()
g_sSMUGGLER_Telemetry_data.m_FromHackerTruck = 1
LAUNCH_MISSION(FMMC_TYPE_SMUGGLER_BUY)
ENDIF
BREAK
CASE NCA_STAGE_CONFIRM_SPECIAL_CARGO_MISSION_LAUNCH
IF BUY_SPECIAL_CARGO_MISSION(iSelectedSCWarehouse, eSelectedShipmentSize, NC_APP_IS_SPECIAL_ITEM_ACTIVE_FOR_SPECIAL_CARGO(), eActiveContrabandType, FMMC_TYPE_GB_CONTRABAND_BUY)
SET_BIT(g_SimpleInteriorData.iFifthBS, BS5_SIMPLE_INTERIOR_LAUNCHED_CARGO_MISSION_FROM_HACKER_TRUCK)
LAUNCH_MISSION(FMMC_TYPE_GB_CONTRABAND_BUY)
ENDIF
BREAK
CASE NCA_STAGE_CONFIRM_VEHICLE_CARGO_MISSION_LAUNCH
IF IS_PLAYERS_IE_GARAGE_FULL(PLAYER_ID(), GET_PLAYERS_OWNED_IE_GARAGE(PLAYER_ID()))
SHOW_OVERLAY("HT_VC_P1", "SEC_V_STEAL_F", "OR_OVRLY_OK", "", TRUE, FALSE)
ELIF LAUNCH_IE_STEAL_MISSION()
SET_BIT(g_SimpleInteriorData.iFifthBS, BS5_SIMPLE_INTERIOR_LAUNCHED_VEH_EXP_MISSION_FROM_HACKER_TRUCK)
PRINTLN("<APP_NC> HANDLE_ACCEPT_OVERLAY_PRESS - Setting BS5_SIMPLE_INTERIOR_LAUNCHED_VEH_EXP_MISSION_FROM_HACKER_TRUCK")
INCREMENT_TOTAL_NUM_STEAL_MISSIONS_STARTED()
SET_PLAYER_IS_ON_IE_VEHICLE_STEAL_MISSION(TRUE)
SCRIPT_CLEANUP()
ELSE
SHOW_OVERLAY("SEC_VEH_STEAL", "SEC_MISS_L_F", "OR_OVRLY_OK", "", TRUE, FALSE)
ENDIF
BREAK
CASE NCA_STAGE_CONFIRM_GUNRUNNING_MISSION_LAUNCH
IF DO_FACTORY_LAUNCH_MISSION_TRANSACTION(GET_OWNED_BUNKER(PLAYER_ID()), FMMC_TYPE_GUNRUNNING_BUY)
g_sGUNRUN_Telemetry_data.m_FromHackerTruck = 1
LAUNCH_MISSION(FMMC_TYPE_GUNRUNNING_BUY)
INCREMENT_BIKER_BUY_MISSION_UNDERTAKEN_COUNT(BUNKER_SAVE_SLOT)
ELSE
SHOW_OVERLAY("HT_GR_P1", NC_APP_GET_MISSION_LAUNCH_FAIL_REASON(), "OR_OVRLY_OK", "", TRUE, FALSE)
ENDIF
BREAK
CASE NCA_STAGE_CONFIRM_DRUG_BUSINESS_MISSION_LAUNCH
IF DO_FACTORY_LAUNCH_MISSION_TRANSACTION(eSelectedFactory, FMMC_TYPE_BIKER_BUY)
g_iResupplyingFactory = ENUM_TO_INT(eSelectedFactory)
g_sBIK_Telemetry_data.m_FromHackerTruck = 1
LAUNCH_MISSION(FMMC_TYPE_BIKER_BUY)
UPDATE_FACTORY_PRODUCTION_ACTIVE_STATE(GET_SAVE_SLOT_FOR_FACTORY(eSelectedFactory), !g_sMPtunables.bStopFactoryProductionOnMissions)
INCREMENT_BIKER_BUY_MISSION_UNDERTAKEN_COUNT(GET_SAVE_SLOT_FOR_FACTORY(eSelectedFactory))
ENDIF
BREAK
CASE NCA_STAGE_IDLE
PLAY_SOUND_FRONTEND(-1, "Select_Mission_Unavailable_OK", "DLC_GR_MOC_Computer_Sounds")
BREAK
ENDSWITCH
HIDE_OVERLAY()
ENDPROC
////////////////////////////////////////////
/// Scaleform methods
FUNC BOOL IS_ACCEPT_BUTTON_INPUT_JUST_PRESSED()
IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_ACCEPT)
OR IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_CURSOR_ACCEPT)
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
PROC MAINTAIN_CHECKS_FOR_CURRENT_SELECTION_ID()
IF IS_ACCEPT_BUTTON_INPUT_JUST_PRESSED()
IF NOT IS_BIT_SET(iBS, NC_BS_WAITING_FOR_BUTTON_RETURN_VALUE)
BEGIN_SCALEFORM_MOVIE_METHOD(mov, "GET_CURRENT_SELECTION")
currentSelectionReturnIndex = END_SCALEFORM_MOVIE_METHOD_RETURN_VALUE()
SET_BIT(iBS, NC_BS_WAITING_FOR_BUTTON_RETURN_VALUE)
ENDIF
ENDIF
ENDPROC
PROC CHECK_BUTTON_PRESS()
MAINTAIN_CHECKS_FOR_CURRENT_SELECTION_ID()
IF IS_BIT_SET(iBS, NC_BS_WAITING_FOR_BUTTON_RETURN_VALUE)
IF IS_SCALEFORM_MOVIE_METHOD_RETURN_VALUE_READY(currentSelectionReturnIndex)
BH_BUTTON_INDEXES eButtonPressed = INT_TO_ENUM(BH_BUTTON_INDEXES, GET_SCALEFORM_MOVIE_METHOD_RETURN_VALUE_INT(currentSelectionReturnIndex))
PRINTLN("<APP_NC> CHECK_BUTTON_PRESS button press returned = ", DEBUG_GET_BUTTON_NAME(eButtonPressed), " ID: ", eButtonPressed)
SWITCH eButtonPressed
CASE BUTTON_OVERLAY_CANCEL
HIDE_OVERLAY()
PLAY_SOUND_FRONTEND(-1, "Select_Mission_Cancel", "DLC_GR_MOC_Computer_Sounds")
BREAK
CASE BUTTON_OVERLAY_ACCEPT
HANDLE_ACCEPT_OVERLAY_PRESS()
BREAK
CASE BUTTON_LOGIN
OPEN_PAGE(PAGE_HOME)
PLAY_SOUND_FRONTEND(-1, "Log_In", "DLC_GR_MOC_Computer_Sounds")
BREAK
CASE BUTTON_HACKER_WORKS_MISSION
IF IS_MISSION_TYPE_DISABLED_BY_TUNEABLE(NC_BOSS_WORK)
SHOW_OVERLAY("HT_BW_LT", "HT_BW_DIS", "OR_OVRLY_OK", "", TRUE, FALSE)
ELIF GB_IS_LOCAL_PLAYER_BOSS_OF_A_GANG()
NC_APP_SET_MISSION_TYPE(NC_BOSS_WORK)
SETUP_TRUCK_JOB_OVERLAY()
PLAY_CLICK_LINK_SOUND()
ELSE
SHOW_OVERLAY("HT_BW_LT", "HT_BW_L5", "OR_OVRLY_OK", "", TRUE, FALSE)
ENDIF
BREAK
CASE BUTTON_AIR_FREIGHT_MISSION
IF IS_MISSION_TYPE_DISABLED_BY_TUNEABLE(NC_AIR_FREIGHT)
SHOW_OVERLAY("HT_BW_LT", "HT_BW_DIS", "OR_OVRLY_OK", "", TRUE, FALSE)
ELIF MISSION_PC_DID_I_JOIN_A_PRIVATE_SESSION()
SHOW_OVERLAY("HT_AF_P1", "NC_PRIV_SES_0", "OR_OVRLY_OK", "", TRUE, FALSE)
ELIF GB_IS_LOCAL_PLAYER_BOSS_OF_A_GANG()
IF DOES_PLAYER_OWN_A_HANGER(PLAYER_ID())
IF HAS_PLAYER_COMPLETED_HANGAR_SETUP_MISSION(PLAYER_ID())
NC_APP_SET_MISSION_TYPE(NC_AIR_FREIGHT)
SETUP_HANGAR_CARGO_JOB_OVERLAY()
PLAY_CLICK_LINK_SOUND()
ELSE
SHOW_OVERLAY("HT_AF_P1", "HT_AF_P1_D4", "OR_OVRLY_OK", "", TRUE, FALSE)
ENDIF
ELSE
SHOW_OVERLAY("HT_AF_P1", "HT_AF_P1_D1", "OR_OVRLY_OK", "", TRUE, FALSE)
ENDIF
ELSE
SHOW_OVERLAY("HT_AF_P1", "HT_BW_L5", "OR_OVRLY_OK", "", TRUE, FALSE)
ENDIF
BREAK
CASE BUTTON_SPECIAL_CARGO_MISSION
IF IS_MISSION_TYPE_DISABLED_BY_TUNEABLE(NC_SPECIAL_CARGO)
SHOW_OVERLAY("HT_BW_LT", "HT_BW_DIS", "OR_OVRLY_OK", "", TRUE, FALSE)
ELIF MISSION_PC_DID_I_JOIN_A_PRIVATE_SESSION()
SHOW_OVERLAY("HT_SC_P1", "NC_PRIV_SES_1", "OR_OVRLY_OK", "", TRUE, FALSE)
ELIF GB_IS_LOCAL_PLAYER_BOSS_OF_GANG_TYPE(GT_VIP)
IF DOES_PLAYER_OWN_A_WAREHOUSE(PLAYER_ID())
NC_APP_SET_MISSION_TYPE(NC_SPECIAL_CARGO)
SETUP_SPECIAL_CARGO_JOB_OVERLAY()
PLAY_CLICK_LINK_SOUND()
ELSE
SHOW_OVERLAY("HT_SC_P1", "HT_SC_P1_D1", "OR_OVRLY_OK", "", TRUE, FALSE)
ENDIF
ELSE
SHOW_OVERLAY("HT_BW_LT", "HT_BW_L11", "OR_OVRLY_OK", "", TRUE, FALSE)
ENDIF
BREAK
CASE BUTTON_VEHICLE_CARGO_MISSION
IF IS_MISSION_TYPE_DISABLED_BY_TUNEABLE(NC_VEHICLE_CARGO)
SHOW_OVERLAY("HT_BW_LT", "HT_BW_DIS", "OR_OVRLY_OK", "", TRUE, FALSE)
ELIF MISSION_PC_DID_I_JOIN_A_PRIVATE_SESSION()
SHOW_OVERLAY("HT_VC_P1", "NC_PRIV_SES_2", "OR_OVRLY_OK", "", TRUE, FALSE)
ELIF GB_IS_LOCAL_PLAYER_BOSS_OF_GANG_TYPE(GT_VIP)
IF DOES_PLAYER_OWN_AN_IE_GARAGE(PLAYER_ID())
NC_APP_SET_MISSION_TYPE(NC_VEHICLE_CARGO)
RUN_INITIAL_MISSION_LAUNCH_CHECKS(NC_VEHICLE_CARGO, -1)
ELSE
SHOW_OVERLAY("HT_VC_P1", "HT_VC_P1_D1", "OR_OVRLY_OK", "", TRUE, FALSE)
ENDIF
ELSE
SHOW_OVERLAY("HT_VC_P1", "HT_BW_L10", "OR_OVRLY_OK", "", TRUE, FALSE)
ENDIF
BREAK
CASE BUTTON_GUNRUNNING_MISSION
IF IS_MISSION_TYPE_DISABLED_BY_TUNEABLE(NC_WEAPONS_CARGO)
SHOW_OVERLAY("HT_BW_LT", "HT_BW_DIS", "OR_OVRLY_OK", "", TRUE, FALSE)
ELIF MISSION_PC_DID_I_JOIN_A_PRIVATE_SESSION()
SHOW_OVERLAY("HT_GR_P1", "NC_PRIV_SES_3", "OR_OVRLY_OK", "", TRUE, FALSE)
ELIF GB_IS_LOCAL_PLAYER_BOSS_OF_A_GANG()
IF DOES_PLAYER_OWN_A_BUNKER(PLAYER_ID())
NC_APP_SET_MISSION_TYPE(NC_WEAPONS_CARGO)
RUN_INITIAL_MISSION_LAUNCH_CHECKS(NC_WEAPONS_CARGO, -1)
ELSE
SHOW_OVERLAY("HT_GR_P1", "HT_GR_P1_D1", "OR_OVRLY_OK", "", TRUE, FALSE)
ENDIF
ELSE
SHOW_OVERLAY("HT_GR_P1", "HT_BW_L5", "OR_OVRLY_OK", "", TRUE, FALSE)
ENDIF
BREAK
CASE BUTTON_DRUG_BUSINESS_MISSION
IF IS_MISSION_TYPE_DISABLED_BY_TUNEABLE(NC_DRUG_CARGO)
SHOW_OVERLAY("HT_BW_LT", "HT_BW_DIS", "OR_OVRLY_OK", "", TRUE, FALSE)
ELIF MISSION_PC_DID_I_JOIN_A_PRIVATE_SESSION()
SHOW_OVERLAY("HT_DW_P1", "NC_PRIV_SES_4", "OR_OVRLY_OK", "", TRUE, FALSE)
ELIF GB_IS_LOCAL_PLAYER_BOSS_OF_A_BIKER_GANG()
IF DOES_PLAYER_OWN_A_BIKER_FACTORY(PLAYER_ID())
NC_APP_SET_MISSION_TYPE(NC_DRUG_CARGO)
SETUP_BIKER_JOB_OVERLAY()
PLAY_CLICK_LINK_SOUND()
ELIF DOES_PLAYER_OWN_CLUBHOUSE(PLAYER_ID())
SHOW_OVERLAY("HT_DW_P1", "HT_DW_P1_D2", "OR_OVRLY_OK", "", TRUE, FALSE)
ELSE
SHOW_OVERLAY("HT_DW_P1", "HT_DW_P1_D1", "OR_OVRLY_OK", "", TRUE, FALSE)
ENDIF
ELSE
SHOW_OVERLAY("HT_DW_P1", "HT_BW_L7", "OR_OVRLY_OK", "", TRUE, FALSE)
ENDIF
BREAK
CASE BUTTON_JOB1
CASE BUTTON_JOB2
CASE BUTTON_JOB3
CASE BUTTON_JOB4
CASE BUTTON_JOB5
CASE BUTTON_JOB6
CASE BUTTON_JOB7
CASE BUTTON_JOB8
CASE BUTTON_JOB9
INT iJobID
iJobID = ENUM_TO_INT(eButtonPressed) - ENUM_TO_INT(BUTTON_JOB1)
RUN_INITIAL_MISSION_LAUNCH_CHECKS(eCurrentMissionType, iJobID)
BREAK
ENDSWITCH
CLEAR_BIT(iBS, NC_BS_WAITING_FOR_BUTTON_RETURN_VALUE)
ENDIF
ENDIF
ENDPROC
////////////////////////////////////////////////////////////////////////////
/// Dialogue tutorials
FUNC BOOL HAVE_ALL_DIALOGUE_TUTORIALS_BEEN_COMPLETED()
IF GET_PACKED_STAT_BOOL(PACKED_MP_BOOL_NC_APP_DIALOGUE_TUT_1)
AND GET_PACKED_STAT_BOOL(PACKED_MP_BOOL_NC_APP_DIALOGUE_TUT_2)
AND GET_PACKED_STAT_BOOL(PACKED_MP_BOOL_NC_APP_DIALOGUE_TUT_3)
AND GET_PACKED_STAT_BOOL(PACKED_MP_BOOL_NC_APP_DIALOGUE_TUT_4)
AND GET_PACKED_STAT_BOOL(PACKED_MP_BOOL_NC_APP_DIALOGUE_TUT_5)
AND GET_PACKED_STAT_BOOL(PACKED_MP_BOOL_NC_APP_DIALOGUE_TUT_6)
AND GET_PACKED_STAT_BOOL(PACKED_MP_BOOL_NC_APP_DIALOGUE_TUT_7)
AND GET_PACKED_STAT_BOOL(PACKED_MP_BOOL_NC_APP_DIALOGUE_TUT_8)
CPRINTLN(DEBUG_INTERNET, "<APP_NC><APP_NC_TUT> HAVE_ALL_DIALOGUE_TUTORIALS_BEEN_COMPLETED TRUE")
RETURN TRUE
ENDIF
CPRINTLN(DEBUG_INTERNET, "<APP_NC><APP_NC_TUT> HAVE_ALL_DIALOGUE_TUTORIALS_BEEN_COMPLETED FALSE")
RETURN FALSE
ENDFUNC
FUNC BOOL HAVE_ALL_INITIAL_DIALOGUE_TUTORIALS_BEEN_COMPLETED()
IF GET_PACKED_STAT_BOOL(PACKED_MP_BOOL_NC_APP_DIALOGUE_TUT_1)
AND GET_PACKED_STAT_BOOL(PACKED_MP_BOOL_NC_APP_DIALOGUE_TUT_2)
AND GET_PACKED_STAT_BOOL(PACKED_MP_BOOL_NC_APP_DIALOGUE_TUT_3)
CPRINTLN(DEBUG_INTERNET, "<APP_NC><APP_NC_TUT> HAVE_ALL_INITIAL_DIALOGUE_TUTORIALS_BEEN_COMPLETED TRUE")
RETURN TRUE
ENDIF
CPRINTLN(DEBUG_INTERNET, "<APP_NC><APP_NC_TUT> HAVE_ALL_INITIAL_DIALOGUE_TUTORIALS_BEEN_COMPLETED FALSE")
RETURN FALSE
ENDFUNC
FUNC STRING NC_TUT_GET_ROOT_LABEL(INT iTutorialID)
SWITCH iTutorialID
CASE 0 RETURN "PAIFM_APPINT" //Intro - Home
CASE 1 RETURN "PAIFM_APPBL" //Main screen - Old jobs
CASE 2 RETURN "PAIFM_APPCJ" //Main screen - Client jobs list
CASE 3 RETURN "PAIFM_REMBL1"
CASE 4 RETURN "PAIFM_REMBL2"
CASE 5 RETURN "PAIFM_REMBL3"
CASE 6 RETURN "PAIFM_REMBB1"
CASE 7 RETURN "PAIFM_REMBB2"
CASE 8 RETURN "PAIFM_REMBB3"
ENDSWITCH
CASSERTLN(DEBUG_SAFEHOUSE, "NC_TUT_GET_ROOT_LABEL: Invalid tutorial ID: ", iTutorialID)
RETURN "PAIFM_APPINT"
ENDFUNC
PROC NC_APP_START_TUTORIAL_DIALOGUE(INT iTutorialID)
IF CREATE_CONVERSATION(tutPedStruct, "PAIFMAU", NC_TUT_GET_ROOT_LABEL(iTutorialID), CONV_PRIORITY_HIGH)
CPRINTLN(DEBUG_INTERNET, "<APP_NC> Created tutorial converstion: ", iTutorialID)
iTutorialDialogueID = -1
ENDIF
ENDPROC
PROC HUB_APP_RUN_TUTORIAL_DIALOGUE()
//Start the dialogue
IF iTutorialDialogueID != -1
NC_APP_START_TUTORIAL_DIALOGUE(iTutorialDialogueID)
ENDIF
ENDPROC
FUNC BOOL SHOULD_APP_PLAY_NC_BUSINESS_REMINDER_DIALOGUE()
IF GET_PACKED_STAT_BOOL(PACKED_MP_BOOL_NC_APP_DIALOGUE_TUT_4)
AND GET_PACKED_STAT_BOOL(PACKED_MP_BOOL_NC_APP_DIALOGUE_TUT_5)
AND GET_PACKED_STAT_BOOL(PACKED_MP_BOOL_NC_APP_DIALOGUE_TUT_6)
AND GET_PACKED_STAT_BOOL(PACKED_MP_BOOL_NC_APP_DIALOGUE_TUT_7)
AND GET_PACKED_STAT_BOOL(PACKED_MP_BOOL_NC_APP_DIALOGUE_TUT_8)
RETURN FALSE
ENDIF
RETURN TRUE
ENDFUNC
PROC INCREMENT_NC_BUSINESS_REMINDER_DIALOGUE_STAT()
IF NOT GET_PACKED_STAT_BOOL(PACKED_MP_BOOL_NC_APP_DIALOGUE_TUT_4)
SET_PACKED_STAT_BOOL(PACKED_MP_BOOL_NC_APP_DIALOGUE_TUT_4, TRUE)
EXIT
ENDIF
IF NOT GET_PACKED_STAT_BOOL(PACKED_MP_BOOL_NC_APP_DIALOGUE_TUT_5)
SET_PACKED_STAT_BOOL(PACKED_MP_BOOL_NC_APP_DIALOGUE_TUT_5, TRUE)
EXIT
ENDIF
IF NOT GET_PACKED_STAT_BOOL(PACKED_MP_BOOL_NC_APP_DIALOGUE_TUT_6)
SET_PACKED_STAT_BOOL(PACKED_MP_BOOL_NC_APP_DIALOGUE_TUT_6, TRUE)
EXIT
ENDIF
IF NOT GET_PACKED_STAT_BOOL(PACKED_MP_BOOL_NC_APP_DIALOGUE_TUT_7)
SET_PACKED_STAT_BOOL(PACKED_MP_BOOL_NC_APP_DIALOGUE_TUT_7, TRUE)
EXIT
ENDIF
IF NOT GET_PACKED_STAT_BOOL(PACKED_MP_BOOL_NC_APP_DIALOGUE_TUT_8)
SET_PACKED_STAT_BOOL(PACKED_MP_BOOL_NC_APP_DIALOGUE_TUT_8, TRUE)
EXIT
ENDIF
ENDPROC
FUNC BOOL SHOULD_APP_PLAY_NC_BUSINESS_PURCHASE_REMINDER_DIALOGUE()
IF GET_PLAYER_OWNED_BUSINESS_COUNT(PLAYER_ID()) = 0
RETURN NOT DOES_PLAYER_OWN_AN_IE_GARAGE(PLAYER_ID())
ENDIF
RETURN FALSE
ENDFUNC
FUNC INT GET_BUSINESS_REMINDER_DIALOGUE_TUTORIAL_ID(BOOL bPurchaseDialogue)
INT iMinTut = 3
INT iMaxTut = 6
IF bPurchaseDialogue
iMinTut = 6
iMaxTut = 9
ENDIF
RETURN GET_RANDOM_INT_IN_RANGE(iMinTut, iMaxTut)
ENDFUNC
PROC HUB_APP_SELECT_DIALOGUE_TUTORIAL()
BOOL bStartNewDialogue
IF NOT IS_BIT_SET(iBS, NC_BS_CURRENTLY_PLAYING_TUTORIAL)
AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF IS_BIT_SET(iBS, NC_BS_INITIAL_TUTORIAL_COMPLETE)
IF IS_BIT_SET(g_iWebsiteTutorialDisplayedBS2, ENUM_TO_INT(eWTBS2_NC_BUSINESS_TUT))
OR IS_BIT_SET(iBS, NC_BS_DONE_BUSINESS_PURCHASE_TUT_THIS_BOOT)
PRINTLN("<APP_NC><APP_NC_TUT> HUB_APP_SELECT_DIALOGUE_TUTORIAL - Setting NC_BS_DIALOGUE_TUTORIAL_COMPLETE for done business reminder. Purch this app boot? ", IS_BIT_SET(iBS, NC_BS_DONE_BUSINESS_PURCHASE_TUT_THIS_BOOT))
SET_BIT(iBS, NC_BS_DIALOGUE_TUTORIAL_COMPLETE)
EXIT
ELIF IS_BIT_SET(g_SimpleInteriorData.iForthBS, BS4_SIMPLE_INTERIOR_NC_DRAW_MISSIONS_SCREEN)
IF NOT IS_BIT_SET(iBS, NC_BS_INITIAL_TUTORIAL_COMPLETE_THIS_BOOT)
IF SHOULD_APP_PLAY_NC_BUSINESS_PURCHASE_REMINDER_DIALOGUE()
IF NOT IS_BIT_SET(g_iWebsiteTutorialDisplayedBS2, ENUM_TO_INT(eWTBS2_NC_BUSINESS_PURCHASE_TUT))
bStartNewDialogue = TRUE
iTutorialHelpTime = 9000
iTutorialDialogueID = GET_BUSINESS_REMINDER_DIALOGUE_TUTORIAL_ID(TRUE)
PRINTLN("<APP_NC><APP_NC_TUT> HUB_APP_SELECT_DIALOGUE_TUTORIAL - Doing business purchase reminder")
SET_BIT(g_iWebsiteTutorialDisplayedBS2, ENUM_TO_INT(eWTBS2_NC_BUSINESS_PURCHASE_TUT))
SET_BIT(iBS, NC_BS_DONE_BUSINESS_PURCHASE_TUT_THIS_BOOT)
ELSE
PRINTLN("<APP_NC><APP_NC_TUT> HUB_APP_SELECT_DIALOGUE_TUTORIAL - Skipping business purchase reminder for BS: ", eWTBS2_NC_BUSINESS_PURCHASE_TUT)
SET_BIT(iBS, NC_BS_DONE_BUSINESS_PURCHASE_TUT_THIS_BOOT)
ENDIF
ELIF SHOULD_APP_PLAY_NC_BUSINESS_REMINDER_DIALOGUE()
bStartNewDialogue = TRUE
iTutorialHelpTime = 9000
iTutorialDialogueID = GET_BUSINESS_REMINDER_DIALOGUE_TUTORIAL_ID(FALSE)
INCREMENT_NC_BUSINESS_REMINDER_DIALOGUE_STAT()
PRINTLN("<APP_NC><APP_NC_TUT> HUB_APP_SELECT_DIALOGUE_TUTORIAL - Doing business reminder")
SET_BIT(g_iWebsiteTutorialDisplayedBS2, ENUM_TO_INT(eWTBS2_NC_BUSINESS_TUT))
ENDIF
ENDIF
ENDIF
ELSE
IF NOT GET_PACKED_STAT_BOOL(PACKED_MP_BOOL_NC_APP_DIALOGUE_TUT_1)
//First login
bStartNewDialogue = TRUE
iTutorialHelpTime = 9000
iTutorialDialogueID = 0
SET_PACKED_STAT_BOOL(PACKED_MP_BOOL_NC_APP_DIALOGUE_TUT_1, TRUE)
ENDIF
IF NOT GET_PACKED_STAT_BOOL(PACKED_MP_BOOL_NC_APP_DIALOGUE_TUT_2)
AND NOT bStartNewDialogue
//Collections page
bStartNewDialogue = TRUE
iTutorialHelpTime = 9000
iTutorialDialogueID = 1
SET_PACKED_STAT_BOOL(PACKED_MP_BOOL_NC_APP_DIALOGUE_TUT_2, TRUE)
ENDIF
IF IS_BIT_SET(iBS, NC_BS_JOB_OVERLAY_ACTIVE)
AND eCurrentMissionType = NC_BOSS_WORK
AND NOT GET_PACKED_STAT_BOOL(PACKED_MP_BOOL_NC_APP_DIALOGUE_TUT_3)
AND NOT bStartNewDialogue
//Collections page
bStartNewDialogue = TRUE
iTutorialHelpTime = 9000
iTutorialDialogueID = 2
SET_PACKED_STAT_BOOL(PACKED_MP_BOOL_NC_APP_DIALOGUE_TUT_3, TRUE)
ENDIF
ENDIF
ENDIF
IF bStartNewDialogue
SET_BIT(iBS, NC_BS_CURRENTLY_PLAYING_TUTORIAL)
CPRINTLN(DEBUG_INTERNET, "<APP_NC><APP_NC_TUT> HUB_APP_SELECT_DIALOGUE_TUTORIAL Running tutorial for: ", iTutorialHelpTime, " seconds. Tutorial ID: ", iTutorialDialogueID)
ELIF IS_BIT_SET(iBS, NC_BS_CURRENTLY_PLAYING_TUTORIAL)
IF NOT HAS_NET_TIMER_STARTED(stTutorialTimer)
START_NET_TIMER(stTutorialTimer)
CPRINTLN(DEBUG_INTERNET, "<APP_NC><APP_NC_TUT> HUB_APP_SELECT_DIALOGUE_TUTORIAL Starting timer time: ", iTutorialHelpTime, " Tutorial ID: ", iTutorialDialogueID)
ELIF HAS_NET_TIMER_EXPIRED(stTutorialTimer, iTutorialHelpTime)
CLEAR_BIT(iBS, NC_BS_CURRENTLY_PLAYING_TUTORIAL)
iTutorialHelpTime = 0
RESET_NET_TIMER(stTutorialTimer)
CPRINTLN(DEBUG_INTERNET, "<APP_NC><APP_NC_TUT> HUB_APP_SELECT_DIALOGUE_TUTORIAL Starting timer expired time: ", iTutorialHelpTime, " Tutorial ID: ", iTutorialDialogueID)
//Once all the tutorial are complete we no longer need this function
IF HAVE_ALL_DIALOGUE_TUTORIALS_BEEN_COMPLETED()
SET_BIT(iBS, NC_BS_DIALOGUE_TUTORIAL_COMPLETE)
ENDIF
//The first three tutorials must have run before we try and play the business reminders
IF HAVE_ALL_INITIAL_DIALOGUE_TUTORIALS_BEEN_COMPLETED()
SET_BIT(iBS, NC_BS_INITIAL_TUTORIAL_COMPLETE)
SET_BIT(iBS, NC_BS_INITIAL_TUTORIAL_COMPLETE_THIS_BOOT)
ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Check for any flags that mean this script should terminate
PROC RUN_CLEANUP_CHECKS()
IF NOT NETWORK_IS_GAME_IN_PROGRESS()
PRINTLN("<APP_NC> Shutting down! No network game is currently active")
SCRIPT_CLEANUP()
ELIF IS_PAUSE_MENU_ACTIVE_EX()
OR IS_CONTROL_JUST_RELEASED(FRONTEND_CONTROL, INPUT_FRONTEND_PAUSE)
CPRINTLN(DEBUG_INTERNET, "<APP_NC> Shutting down! Player opend the pause menu")
SCRIPT_CLEANUP()
ELIF IS_ENTITY_DEAD(PLAYER_PED_ID())
PRINTLN("<APP_NC> Shutting down! Player is injured or dead")
SCRIPT_CLEANUP()
ELIF IS_SCREEN_FADING_OUT()
PRINTLN("<APP_NC> Shutting down! External script is fading out the screen")
SCRIPT_CLEANUP()
ELIF AM_I_TRANSITION_SESSIONS_STARTING_ON_CALL()
PRINTLN("<APP_NC> Shutting down! starting an on call job")
SCRIPT_CLEANUP()
ENDIF
ENDPROC
PROC NC_APP_SETUP_TUTORIAL_DIALOGUE()
IF HAVE_ALL_DIALOGUE_TUTORIALS_BEEN_COMPLETED()
PRINTLN("<APP_NC><APP_NC_TUT> NC_APP_SETUP_TUTORIAL_DIALOGUE setting NC_BS_DIALOGUE_TUTORIAL_COMPLETE")
SET_BIT(iBS, NC_BS_DIALOGUE_TUTORIAL_COMPLETE)
ELSE
IF HAVE_ALL_INITIAL_DIALOGUE_TUTORIALS_BEEN_COMPLETED()
PRINTLN("<APP_NC><APP_NC_TUT> NC_APP_SETUP_TUTORIAL_DIALOGUE setting NC_BS_INITIAL_TUTORIAL_COMPLETE")
SET_BIT(iBS, NC_BS_INITIAL_TUTORIAL_COMPLETE)
ENDIF
SET_USE_DLC_DIALOGUE(TRUE)
ADD_PED_FOR_DIALOGUE(tutPedStruct, 2, NULL, "PAIGE")
CPRINTLN(DEBUG_INTERNET, "<APP_NC> NC_APP_SETUP_TUTORIAL_DIALOGUE ped added for dialogue")
ENDIF
ENDPROC
PROC SCRIPT_INITALISE()
RUN_CLEANUP_CHECKS()
mov = REQUEST_SCALEFORM_MOVIE("hacker_truck_desktop")
WHILE (NOT HAS_SCALEFORM_MOVIE_LOADED(mov))
WAIT(0)
ENDWHILE
HANG_UP_AND_PUT_AWAY_PHONE(TRUE)
DISABLE_CELLPHONE(TRUE)
Pause_Objective_Text()
THEFEED_PAUSE()
SET_BROWSER_OPEN(TRUE)
// Default cleanup
IF HAS_FORCE_CLEANUP_OCCURRED()
OR MPGlobalsAmbience.bRunningFmIntroCut
IF MPGlobalsAmbience.bRunningFmIntroCut
PRINTLN("<APP_NC> bRunningFmIntroCut is true so cleaning up!")
ENDIF
PRINTLN("<APP_NC> DEFAULT CLEANUP")
SCRIPT_CLEANUP()
ENDIF
//Store the active contraband type at the time of opening the app
eActiveContrabandType = g_eContrabandType
SEND_ALL_DATA_TO_SCALEFORM()
START_NET_TIMER(stLoginAnimation)
IF IS_PC_VERSION()
SET_MULTIHEAD_SAFE(TRUE, TRUE, TRUE, TRUE)
ENDIF
IF NOT IS_AUDIO_SCENE_ACTIVE("GTAO_Computer_Screen_Active_Scene")
START_AUDIO_SCENE("GTAO_Computer_Screen_Active_Scene")
ENDIF
//Once all the tutorial are complete we no longer need this function
NC_APP_SETUP_TUTORIAL_DIALOGUE()
//Hold for one frame before we move into the while loop
WAIT(0)
ENDPROC
#IF IS_DEBUG_BUILD
BOOL bRender = TRUE
#ENDIF
//FEATURE_BUSINESS_BATTLES
//***********SCRIPT***********
SCRIPT
PRINTLN("<APP_NC> started \"", GET_THIS_SCRIPT_NAME(), "\"")
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(GET_HASH_KEY("appBusinessHub")) > 1
PRINTLN("<APP_NC> Business hub app script already running! cleaning up.")
SCRIPT_CLEANUP()
ENDIF
NETWORK_SET_SCRIPT_IS_SAFE_FOR_NETWORK_GAME()
SCRIPT_INITALISE()
/// main update loop
WHILE IS_BROWSER_OPEN()
RUN_CLEANUP_CHECKS()
#IF IS_DEBUG_BUILD
IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_1)
bRender = !bRender
PRINTLN("<APP_NC> bRender toggled to ", bRender)
ENDIF
#ENDIF
IF NOT IS_BIT_SET(iBS, NC_BS_DIALOGUE_TUTORIAL_COMPLETE)
HUB_APP_SELECT_DIALOGUE_TUTORIAL()
HUB_APP_RUN_TUTORIAL_DIALOGUE()
ENDIF
//Update any activley displayed cooldowns
UPDATE_JOB_OVERLAY_DATA(eCurrentMissionType)
//Render the scaleform movie
#IF IS_DEBUG_BUILD
IF bRender
#ENDIF
RENDER_NC_APP()
#IF IS_DEBUG_BUILD
ENDIF
#ENDIF
//Pass control inputs to scaleform
PASS_INPUTS_TO_SCALEFORM()
//Handle the return values of player input
CHECK_BUTTON_PRESS()
//Prevent first person view behind the scenes: url:bugstar:4825468
DISABLE_ON_FOOT_FIRST_PERSON_VIEW_THIS_UPDATE()
IF HAS_NET_TIMER_STARTED(stLoginAnimation)
AND HAS_NET_TIMER_EXPIRED(stLoginAnimation, 1800)
SET_BIT(g_SimpleInteriorData.iForthBS, BS4_SIMPLE_INTERIOR_NC_DRAW_MISSIONS_SCREEN)
eCurrentPage = PAGE_HOME
ENDIF
WAIT(0)
ENDWHILE
// Script should never reach here. Always terminate with cleanup function.
CASSERTLN(DEBUG_INTERNET, "<APP_NC> \"", GET_THIS_SCRIPT_NAME(), "\" should never reach here. Always terminate with cleanup function.")
ENDSCRIPT