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

2135 lines
74 KiB
Python
Executable File

///// appSmuggler
///// Mark Richardson - 26/06/17
///// Bunker app functionality
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 SM_BS_WAITING_FOR_BUTTON_RETURN_VALUE 0
CONST_INT SM_BS_OVERLAY_SCREEN_ACTIVE 1
CONST_INT SM_BS_LAUNCHED_MISSION 2
CONST_INT SM_BS_PRINTED_PAUSE_MENU_ACTIVE 3
CONST_INT SM_BS_CURRENTLY_PLAYING_TUTORIAL 4
CONST_INT SM_BS_DIALOGUE_TUTORIAL_COMPLETE 5
CONST_INT SM_BS_DONE_SETUP_MISSION_HELP 6
CONST_INT SM_BS_CURRENTLY_DISPLAYING_TUTORIAL_HELP 7
CONST_INT SM_BS_HELP_TEXT_TUTORIAL_COMPLETE 8
CONST_INT SM_BS_SETUP_COMPLETE 9
CONST_INT SM_BS_STORED_CARGO_ALL_ONE_TYPE 10
CONST_INT SM_BS_SHOW_BONUS_LOST_HELP 11
CONST_INT SM_BS_SHOW_BONUS_HELP 12
CONST_INT SM_BS_SHOW_SETUP_HELP 13
CONST_INT SM_BS_SELL_BONUS_AVAIABLE 14
CONST_INT ciINPUT_KEYBOARD_DOWN 300
CONST_INT ciINPUT_KEYBOARD_UP 301
CONST_INT NUM_RIVAL_SMUGGLERS 31
CONST_INT MAX_DELIVERABLES_PER_GANG 8
//Button state consts
CONST_INT UA_BUTTON_STATE_HIDDEN 0
CONST_INT UA_BUTTON_STATE_DISABLED 1
CONST_INT UA_BUTTON_STATE_ENABLED 2
//Research state consts (Used to avoid ENUM_TO_INT())
CONST_INT UA_RESEARCH_STATE_INACTIVE 0
CONST_INT UA_RESEARCH_STATE_LOCKED 1
CONST_INT UA_RESEARCH_STATE_UNLOCKED 2
//Enum for button indexes returned by SF
ENUM SM_BUTTON_INDEXES
BUTTON_OVERLAY_CANCEL = 0,
BUTTON_OVERLAY_ACCEPT,
BUTTON_STEAL_ALL_GOODS,
BUTTON_STEAL_GOODS_NARCOTICS,
BUTTON_STEAL_GOODS_CHEMICALS,
BUTTON_STEAL_GOODS_MEDICAL,
BUTTON_STEAL_GOODS_ANIMAL,
BUTTON_STEAL_GOODS_ART,
BUTTON_STEAL_GOODS_GEMS,
BUTTON_STEAL_GOODS_TOBACCO,
BUTTON_STEAL_COUNTERFIT_GOODS,
BUTTON_NAV_SELL_ALL_GOODS = 13,
BUTTON_NAV_SELL_GOODS_NARCOTICS,
BUTTON_NAV_SELL_GOODS_CHEMICALS,
BUTTON_NAV_SELL_GOODS_MEDICAL,
BUTTON_NAV_SELL_GOODS_ANIMAL,
BUTTON_NAV_SELL_GOODS_ART,
BUTTON_NAV_SELL_GOODS_GEMS,
BUTTON_NAV_SELL_GOODS_TOBACCO,
BUTTON_NAV_SELL_COUNTERFIT_GOODS,
BUTTON_GRAPH_NARCOTICS,
BUTTON_GRAPH_CHEMICALS,
BUTTON_GRAPH_MEDICAL_SUPPLIES,
BUTTON_GRAPH_ANIMAL_MATERIALS,
BUTTON_GRAPH_ART,
BUTTON_GRAPH_GEMS,
BUTTON_GRAPH_TOBACCO,
BUTTON_GRAPH_COUNTERFIT_GOODS,
BUTTON_ORG_1,
BUTTON_ORG_2,
BUTTON_ORG_3,
BUTTON_ORG_4,
BUTTON_ORG_5,
BUTTON_NAV_OVERVIEW,
BUTTON_STEAL_CARGO,
BUTTON_SELL_CARGO
ENDENUM
//Enum for the current page ID
ENUM SM_PAGE_ID
PAGE_OVERVIEW = 0,
PAGE_STEAL,
PAGE_SELL
ENDENUM
ENUM SMUGGLER_APP_STAGE_ID
SM_STAGE_IDLE = 0,
//Overlay on screen stages
SM_STAGE_CONFIRM_SELL_LAUNCH, //Confirm the launch of a sell mission
SM_STAGE_CONFIRM_BUY_LAUNCH, //Confirm the launch of a buy mission
SM_STAGE_FAIL_OVERLAY, //Overlay screen for failed mission launches or transactions
SM_STAGE_GANG_SIZE_WARNING, //Overlay screen warning the player to hire more gang members
SM_STAGE_LAUNCH_SETUP //Overlay screen for launching Setup
ENDENUM
//***********Script variables***********
INT iBS = 0
INT iPlayerLoop = 0
INT iTutorialDialogueID = -1
INT iTutorialHelpTime = 0
INT iCargoTotal = 0
INT iGangListBS = 0
INT iNumGoons[MAX_NUM_GANGS]
INT iGangIndex[MAX_NUM_GANGS]
STRING sMissionLanuchFailReason = ""
HANGAR_ID eOwnedHangar = HANGAR_ID_INVALID
SM_PAGE_ID eCurrentPage = PAGE_OVERVIEW
SMUGGLER_APP_STAGE_ID eCurrentStage = SM_STAGE_IDLE
eSMUGGLED_GOODS_TYPE eSelectedGoods = eSGT_MIXED
SCRIPT_TIMER stExitDelay
SCRIPT_TIMER stTutorialTimer
SCRIPT_TIMER stCDUpdateTimer
SCRIPT_TIMER stHelpTextTutorialTimer
SCRIPT_TIMER stStockUpdateTimer
structPedsForConversation tutPedStruct
//Hangar individal type totals
INT iGoodsTotal[ciTOTAL_HANGAR_GOODS_TYPES]
//Used to maintain a list of organisations for the securoserv app
INT iActiveUsers[NUM_RIVAL_SMUGGLERS]
//Needed so we can remove this user from the list if they leave the game
TEXT_LABEL_63 tlUserList[NUM_RIVAL_SMUGGLERS]
//The Scaleform movie
SCALEFORM_INDEX mov
SCALEFORM_RETURN_INDEX currentSelectionReturnIndex
//Control input variables
INT iLeftX
INT iLeftY
INT iRightX
INT iRightY
//***********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, "Exit", "GTAO_SMG_Hangar_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
g_sBusAppManagement.iRenderHandShakeFC = -1
TERMINATE_THIS_THREAD()
ENDPROC
FUNC eSMUGGLED_GOODS_TYPE GET_SELECTED_GOODS_TYPE()
RETURN eSelectedGoods
ENDFUNC
PROC SET_SMUGGLED_GOODS_TYPE(eSMUGGLED_GOODS_TYPE eNewType)
PRINTLN("<APP_SMUGGLER> SET_SMUGGLED_GOODS_TYPE new type = ", DEBUG_GET_SMUGGLED_GOODS_TYPE_NAME(eNewType))
eSelectedGoods = eNewType
ENDPROC
/// PURPOSE:
/// Grabs the name of our gang. If we're checking the local player we need to
/// avoid the restricted account checks: 2770221
FUNC STRING GET_PLAYER_ORGANISATION_NAME(PLAYER_INDEX piPlayer)
IF piPlayer = PLAYER_ID()
PLAYER_INDEX playerID = GB_GET_THIS_PLAYER_GANG_BOSS(piPlayer)
IF playerID != INVALID_PLAYER_INDEX()
STRING stReturn = GB_TO_STRING(GlobalplayerBD_FM_3[NATIVE_TO_INT(playerID)].sMagnateGangBossData.tlGangName)
IF IS_STRING_NULL_OR_EMPTY(stReturn)
RETURN GET_DEFAULT_GANG_NAME(playerID)
ELSE
RETURN stReturn
ENDIF
ENDIF
ENDIF
RETURN GB_GET_PLAYER_ORGANIZATION_NAME_AS_A_STRING(piPlayer)
ENDFUNC
PROC PLAY_CLICK_LINK_SOUND()
PLAY_SOUND_FRONTEND(-1, "Click_Link", "GTAO_SMG_Hangar_Computer_Sounds")
ENDPROC
#IF IS_DEBUG_BUILD
FUNC STRING DEBUG_GET_BUTTON_NAME(SM_BUTTON_INDEXES eButton)
SWITCH eButton
CASE BUTTON_OVERLAY_CANCEL RETURN "BUTTON_OVERLAY_CANCEL"
CASE BUTTON_OVERLAY_ACCEPT RETURN "BUTTON_OVERLAY_ACCEPT"
CASE BUTTON_STEAL_ALL_GOODS RETURN "BUTTON_STEAL_ALL_GOODS"
CASE BUTTON_STEAL_GOODS_NARCOTICS RETURN "BUTTON_STEAL_GOODS_NARCOTICS"
CASE BUTTON_STEAL_GOODS_CHEMICALS RETURN "BUTTON_STEAL_GOODS_CHEMICALS"
CASE BUTTON_STEAL_GOODS_MEDICAL RETURN "BUTTON_STEAL_GOODS_MEDICAL"
CASE BUTTON_STEAL_GOODS_ANIMAL RETURN "BUTTON_STEAL_GOODS_ANIMAL"
CASE BUTTON_STEAL_GOODS_ART RETURN "BUTTON_STEAL_GOODS_ART"
CASE BUTTON_STEAL_GOODS_GEMS RETURN "BUTTON_STEAL_GOODS_GEMS"
CASE BUTTON_STEAL_GOODS_TOBACCO RETURN "BUTTON_STEAL_GOODS_TOBACCO"
CASE BUTTON_STEAL_COUNTERFIT_GOODS RETURN "BUTTON_STEAL_COUNTERFIT_GOODS"
CASE BUTTON_NAV_OVERVIEW RETURN "BUTTON_NAV_OVERVIEW"
CASE BUTTON_STEAL_CARGO RETURN "BUTTON_STEAL_CARGO"
CASE BUTTON_SELL_CARGO RETURN "BUTTON_SELL_CARGO"
CASE BUTTON_NAV_SELL_ALL_GOODS RETURN "BUTTON_NAV_SELL_ALL_GOODS"
CASE BUTTON_NAV_SELL_GOODS_NARCOTICS RETURN "BUTTON_NAV_SELL_GOODS_NARCOTICS"
CASE BUTTON_NAV_SELL_GOODS_CHEMICALS RETURN "BUTTON_NAV_SELL_GOODS_CHEMICALS"
CASE BUTTON_NAV_SELL_GOODS_MEDICAL RETURN "BUTTON_NAV_SELL_GOODS_MEDICAL"
CASE BUTTON_NAV_SELL_GOODS_ANIMAL RETURN "BUTTON_NAV_SELL_GOODS_ANIMAL"
CASE BUTTON_NAV_SELL_GOODS_ART RETURN "BUTTON_NAV_SELL_GOODS_ART"
CASE BUTTON_NAV_SELL_GOODS_GEMS RETURN "BUTTON_NAV_SELL_GOODS_GEMS"
CASE BUTTON_NAV_SELL_GOODS_TOBACCO RETURN "BUTTON_NAV_SELL_GOODS_TOBACCO"
CASE BUTTON_NAV_SELL_COUNTERFIT_GOODS RETURN "BUTTON_NAV_SELL_COUNTERFIT_GOODS"
CASE BUTTON_GRAPH_NARCOTICS RETURN "BUTTON_GRAPH_NARCOTICS"
CASE BUTTON_GRAPH_CHEMICALS RETURN "BUTTON_GRAPH_CHEMICALS"
CASE BUTTON_GRAPH_MEDICAL_SUPPLIES RETURN "BUTTON_GRAPH_MEDICAL_SUPPLIES"
CASE BUTTON_GRAPH_ANIMAL_MATERIALS RETURN "BUTTON_GRAPH_ANIMAL_MATERIALS"
CASE BUTTON_GRAPH_ART RETURN "BUTTON_GRAPH_ART"
CASE BUTTON_GRAPH_GEMS RETURN "BUTTON_GRAPH_GEMS"
CASE BUTTON_GRAPH_TOBACCO RETURN "BUTTON_GRAPH_TOBACCO"
CASE BUTTON_GRAPH_COUNTERFIT_GOODS RETURN "BUTTON_GRAPH_COUNTERFIT_GOODS"
CASE BUTTON_ORG_1 RETURN "BUTTON_ORG_1"
CASE BUTTON_ORG_2 RETURN "BUTTON_ORG_2"
CASE BUTTON_ORG_3 RETURN "BUTTON_ORG_3"
CASE BUTTON_ORG_4 RETURN "BUTTON_ORG_4"
CASE BUTTON_ORG_5 RETURN "BUTTON_ORG_5"
ENDSWITCH
RETURN "***INVALID***"
ENDFUNC
FUNC STRING DEBUG_GET_PAGE_NAME(SM_PAGE_ID ePage)
SWITCH ePage
CASE PAGE_OVERVIEW RETURN "PAGE_OVERVIEW"
CASE PAGE_SELL RETURN "PAGE_SELL"
CASE PAGE_STEAL RETURN "PAGE_STEAL"
ENDSWITCH
RETURN "***INVALID***"
ENDFUNC
FUNC STRING SMUGGLER_APP_GET_APP_STAGE_DEBUG_NAME(SMUGGLER_APP_STAGE_ID eStage)
SWITCH eStage
CASE SM_STAGE_IDLE RETURN "SM_STAGE_IDLE"
CASE SM_STAGE_CONFIRM_SELL_LAUNCH RETURN "SM_STAGE_CONFIRM_SELL_LAUNCH"
CASE SM_STAGE_CONFIRM_BUY_LAUNCH RETURN "SM_STAGE_CONFIRM_BUY_LAUNCH"
CASE SM_STAGE_FAIL_OVERLAY RETURN "SM_STAGE_FAIL_OVERLAY"
CASE SM_STAGE_GANG_SIZE_WARNING RETURN "SM_STAGE_GANG_SIZE_WARNING"
CASE SM_STAGE_LAUNCH_SETUP RETURN "SM_STAGE_LAUNCH_SETUP"
ENDSWITCH
RETURN "****Invalid****"
ENDFUNC
#ENDIF
/// PURPOSE:
/// Returns the current app stage
FUNC SMUGGLER_APP_STAGE_ID SMUGGLER_APP_GET_APP_STAGE()
RETURN eCurrentStage
ENDFUNC
/// PURPOSE:
/// Sets the current app stage
PROC SMUGGLER_APP_SET_APP_STAGE(SMUGGLER_APP_STAGE_ID eNewStage)
IF eCurrentStage != eNewStage
eCurrentStage = eNewStage
PRINTLN("<APP_SMUGGLER> SMUGGLER_APP_SET_APP_STAGE Setting new stage to: ", SMUGGLER_APP_GET_APP_STAGE_DEBUG_NAME(eNewStage))
ENDIF
ENDPROC
/// PURPOSE:
/// Returns if the overlay screen is currently active
FUNC BOOL SMUGGLER_APP_IS_OVERLAY_OPEN()
RETURN IS_BIT_SET(iBS, SM_BS_OVERLAY_SCREEN_ACTIVE)
ENDFUNC
PROC SMUGGLER_APP_SET_MISSION_LAUNCH_FAIL_REASON(STRING sReason)
sMissionLanuchFailReason = sReason
#IF IS_DEBUG_BUILD
PRINTLN("<APP_SMUGGLER> SMUGGLER_APP_SET_MISSION_LAUNCH_FAIL_REASON Setting new fail reason: ", GET_FILENAME_FOR_AUDIO_CONVERSATION(sReason))
#ENDIF
ENDPROC
PROC SMUGGLER_APP_CLEAR_MISSION_LAUNCH_FAIL_REASON()
sMissionLanuchFailReason = ""
PRINTLN("<APP_SMUGGLER> SMUGGLER_APP_CLEAR_MISSION_LAUNCH_FAIL_REASON called.")
ENDPROC
FUNC STRING SMUGGLER_APP_GET_MISSION_LAUNCH_FAIL_REASON()
RETURN sMissionLanuchFailReason
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_SMUGGLER>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())
SMUGGLER_APP_SET_MISSION_LAUNCH_FAIL_REASON("UA_ML_F_GOON1")
ELIF DOES_PLAYER_OWN_OFFICE(PLAYER_ID())
SMUGGLER_APP_SET_MISSION_LAUNCH_FAIL_REASON("UA_ML_F_GOON2")
ELSE
SMUGGLER_APP_SET_MISSION_LAUNCH_FAIL_REASON("UA_ML_F_GOON3")
ENDIF
ELIF iReason = GB_MU_REASON_GOON_IS_ANIMAL
IF GB_IS_PLAYER_BOSS_OF_A_BIKER_GANG(PLAYER_ID())
SMUGGLER_APP_SET_MISSION_LAUNCH_FAIL_REASON("GENERAL_MLF_G1")
ELIF DOES_PLAYER_OWN_OFFICE(PLAYER_ID())
SMUGGLER_APP_SET_MISSION_LAUNCH_FAIL_REASON("GENERAL_MLF_G2")
ELSE
SMUGGLER_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())
SMUGGLER_APP_SET_MISSION_LAUNCH_FAIL_REASON("GENERAL_MLF_G4")
ELIF DOES_PLAYER_OWN_OFFICE(PLAYER_ID())
SMUGGLER_APP_SET_MISSION_LAUNCH_FAIL_REASON("GENERAL_MLF_G5")
ELSE
SMUGGLER_APP_SET_MISSION_LAUNCH_FAIL_REASON("GENERAL_MLF_G6")
ENDIF
ELSE
SMUGGLER_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_SMUGGLER> CAN_PLAYER_LAUNCH_MISSION: NOPE! GB_IS_PLAYER_BOSS_OF_A_GANG is false")
SMUGGLER_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_SMUGGLER> CAN_PLAYER_LAUNCH_MISSION: NOPE! player critical to job")
SMUGGLER_APP_SET_MISSION_LAUNCH_FAIL_REASON("BKR_TF_R3")
RETURN FALSE
ENDIF
IF NETWORK_IS_ACTIVITY_SESSION()
CPRINTLN(DEBUG_INTERNET, "<APP_SMUGGLER> CAN_PLAYER_LAUNCH_MISSION: NOPE! NETWORK_IS_ACTIVITY_SESSION is true")
SMUGGLER_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, INT iAdditionalINT = -1, SMUGGLER_APP_STAGE_ID eNewAppStage = SM_STAGE_IDLE, INT iSecondAdditionalINT = -1, STRING sAdditionalString = 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
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_SOUND_FRONTEND(-1, "Click_Link", "GTAO_SMG_Hangar_Computer_Sounds")
ELIF bPlayFailSound
PLAY_SOUND_FRONTEND(-1, "Click_Fail", "GTAO_SMG_Hangar_Computer_Sounds")
ENDIF
SET_BIT(iBS, SM_BS_OVERLAY_SCREEN_ACTIVE)
SMUGGLER_APP_SET_APP_STAGE(eNewAppStage)
CDEBUG1LN(DEBUG_INTERNET, "<APP_SMUGGLER> 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()
SMUGGLER_APP_SET_APP_STAGE(SM_STAGE_IDLE)
CLEAR_BIT(iBS, SM_BS_OVERLAY_SCREEN_ACTIVE)
CDEBUG1LN(DEBUG_INTERNET, "<APP_SMUGGLER> 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, SM_BS_PRINTED_PAUSE_MENU_ACTIVE)
PRINTLN("<APP_SMUGGLER>, SET_INPUT_EXCLUSIVE_AND_ACTIVE called but IS_PAUSE_MENU_ACTIVE_EX returned true")
SET_BIT(iBS, SM_BS_PRINTED_PAUSE_MENU_ACTIVE)
ENDIF
#ENDIF
ENDIF
ENDPROC
PROC RENDER_SMUGGLER_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()
g_sBusAppManagement.iRenderHandShakeFC = GET_FRAME_COUNT()
ENDPROC
PROC HANDLE_CANCEL_BUTTON_PRESS()
IF NOT IS_HANGAR_SETUP_MISSION_COMPLETE()
SCRIPT_CLEANUP()
ENDIF
IF eCurrentPage = PAGE_OVERVIEW
IF NOT SMUGGLER_APP_IS_OVERLAY_OPEN()
SCRIPT_CLEANUP()
ELSE
CDEBUG1LN(DEBUG_INTERNET, "<APP_SMUGGLER> [APP_CLOSE] 2 Back pressed not closing the app. page: ", eCurrentPage, " overlay: ", SMUGGLER_APP_IS_OVERLAY_OPEN())
ENDIF
ELIF !SMUGGLER_APP_IS_OVERLAY_OPEN()
eCurrentPage = PAGE_OVERVIEW
CDEBUG1LN(DEBUG_INTERNET, "<APP_SMUGGLER> [APP_CLOSE] Back pressed not closing the app. page: ", eCurrentPage)
//Show the overview page
CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(mov, "SHOW_SCREEN", 0.0)
PLAY_SOUND_FRONTEND(-1, "Show_Overview_Menu", "GTAO_SMG_Hangar_Computer_Sounds")
EXIT
ENDIF
IF SMUGGLER_APP_IS_OVERLAY_OPEN()
HIDE_OVERLAY()
ELSE
CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(mov, "SET_INPUT_EVENT", TO_FLOAT(ENUM_TO_INT(INPUT_FRONTEND_CANCEL)))
ENDIF
PLAY_SOUND_FRONTEND(-1, "Click_Back", "GTAO_SMG_Hangar_Computer_Sounds")
ENDPROC
PROC PASS_INPUTS_TO_SCALEFORM()
// bCursorInputProcessed = FALSE
#IF IS_DEBUG_BUILD
CLEAR_BIT(iBS, SM_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)))
IF eCurrentPage = PAGE_STEAL
PRINTLN("<APP_SMUGGLER> PASS_INPUTS_TO_SCALEFORM LB - New page = PAGE_OVERVIEW")
eCurrentPage = PAGE_OVERVIEW
PLAY_SOUND_FRONTEND(-1, "Show_Overview_Menu", "GTAO_SMG_Hangar_Computer_Sounds")
ELIF eCurrentPage = PAGE_SELL
PRINTLN("<APP_SMUGGLER> PASS_INPUTS_TO_SCALEFORM LB - New page = PAGE_STEAL")
eCurrentPage = PAGE_STEAL
PLAY_SOUND_FRONTEND(-1, "Show_Source_Menu", "GTAO_SMG_Hangar_Computer_Sounds")
ENDIF
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)))
IF eCurrentPage = PAGE_OVERVIEW
PRINTLN("<APP_SMUGGLER> PASS_INPUTS_TO_SCALEFORM RB - New page = PAGE_STEAL")
eCurrentPage = PAGE_STEAL
PLAY_SOUND_FRONTEND(-1, "Show_Source_Menu", "GTAO_SMG_Hangar_Computer_Sounds")
ELIF eCurrentPage = PAGE_STEAL
PRINTLN("<APP_SMUGGLER> PASS_INPUTS_TO_SCALEFORM RB - New page = PAGE_STEAL")
eCurrentPage = PAGE_SELL
PLAY_SOUND_FRONTEND(-1, "Show_Sell_Menu", "GTAO_SMG_Hangar_Computer_Sounds")
ENDIF
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)))
// bCursorInputProcessed = TRUE
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)))
//bCursorInputProcessed = TRUE
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))
//bCursorInputProcessed = TRUE
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()
// bCursorInputProcessed = TRUE
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()
// IF NOT bUsingScrollWheel
// bCursorInputProcessed = TRUE
// ENDIF
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_SMUGGLER> 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
FUNC FLOAT GET_PERCENTAGE_AS_FLOAT(INT a, INT b)
RETURN (TO_FLOAT(a)/TO_FLOAT(b) * 100)
ENDFUNC
/// PURPOSE:
/// Converts how scaleform orders the smuggler goods types to the script enum
/// Keeping this just in case the order changes later on
FUNC eSMUGGLED_GOODS_TYPE CONVERT_SCALEFROM_ORDER_TO_ENUM(INT i)
SWITCH i
CASE 0 RETURN eSGT_MIXED
CASE 1 RETURN eSGT_NARCOTICS
CASE 2 RETURN eSGT_CHEMICALS
CASE 3 RETURN eSGT_MEDICAL_SUPPLIES
CASE 4 RETURN eSGT_ANIMAL_MATERIALS
CASE 5 RETURN eSGT_ART_AND_ANTIQUES
CASE 6 RETURN eSGT_JEWELRY_AND_GEMSTONES
CASE 7 RETURN eSGT_TOBACCO_AND_ALCOHOL
CASE 8 RETURN eSGT_COUNTERFEIT_GOODS
ENDSWITCH
RETURN eSGT_INVALID
ENDFUNC
/// PURPOSE:
/// Converts how scaleform orders the smuggler goods types to the script enum
/// Keeping this just in case the order changes later on
FUNC INT CONVERT_ENUM_TO_SCALEFORM_ORDER(eSMUGGLED_GOODS_TYPE eGoodsType)
SWITCH eGoodsType
CASE eSGT_MIXED RETURN 0
CASE eSGT_NARCOTICS RETURN 1
CASE eSGT_CHEMICALS RETURN 2
CASE eSGT_MEDICAL_SUPPLIES RETURN 3
CASE eSGT_ANIMAL_MATERIALS RETURN 4
CASE eSGT_ART_AND_ANTIQUES RETURN 5
CASE eSGT_JEWELRY_AND_GEMSTONES RETURN 6
CASE eSGT_TOBACCO_AND_ALCOHOL RETURN 7
CASE eSGT_COUNTERFEIT_GOODS RETURN 8
ENDSWITCH
RETURN 0
ENDFUNC
FUNC BOOL BS_DOES_PLAYER_HOLD_ONLY_ONE_CARGO_TYPE()
RETURN IS_BIT_SET(iBS, SM_BS_STORED_CARGO_ALL_ONE_TYPE)
ENDFUNC
FUNC eSMUGGLED_GOODS_TYPE GET_FIRST_OWNED_CARGO_TYPE()
INT i
REPEAT ciTOTAL_HANGAR_GOODS_TYPES i
IF iGoodsTotal[i] > 0
AND i != 0
RETURN CONVERT_SCALEFROM_ORDER_TO_ENUM(i)
ENDIF
ENDREPEAT
RETURN eSGT_INVALID
ENDFUNC
PROC SEND_HANGAR_DATA_TO_SCALEFORM()
STRING sOrgName = GB_GET_PLAYER_ORGANIZATION_NAME_AS_A_STRING(PLAYER_ID())
INT iLocation = 0
INT iStealsComplete = GET_COUNT_OF_HANAGR_BUY_MISSIONS_COMPLETED()
INT iSalesCompleted = GET_COUNT_OF_HANAGR_SELL_MISSIONS_COMPLETED()
INT iRivalCratesStolen = GET_HANGAR_CONTRABAND_STOLEN_FROM_RIVALS()
INT iTotalEarnings = GET_HANAGR_SELL_MISSION_EARNINGS()
INT iBonusEarnings = GET_HANAGR_SELL_MISSION_BONUS_EARNINGS()
iCargoTotal = GET_LOCAL_PLAYERS_CONTRABAND_UNITS_TOTAL_FOR_HANGAR()
INT iStockCapacity = 50
INT iSellPrice = iCargoTotal * GET_UNIT_VALUE_OF_SMUGGLED_GOOD_TYPE(eSGT_MIXED)
FLOAT fStealsSuccessRate = GET_PERCENTAGE_AS_FLOAT(iStealsComplete, GET_COUNT_OF_HANAGR_BUY_MISSIONS_UNDERTAKEN())
FLOAT fSalesSuccessRate = GET_PERCENTAGE_AS_FLOAT(iSalesCompleted, GET_COUNT_OF_HANAGR_SELL_MISSIONS_UNDERTAKEN())
fStealsSuccessRate = CLAMP(fStealsSuccessRate, 0.0, 100.0)
fSalesSuccessRate = CLAMP(fSalesSuccessRate, 0.0, 100.0)
IF IS_HANGAR_IN_FORT_ZANCUDO(eOwnedHangar)
iLocation = 1 //Fort Zancudo
ENDIF
IF BS_DOES_PLAYER_HOLD_ONLY_ONE_CARGO_TYPE()
eSMUGGLED_GOODS_TYPE eType = GET_FIRST_OWNED_CARGO_TYPE()
iSellPrice = iCargoTotal * GET_UNIT_VALUE_OF_SMUGGLED_GOOD_TYPE(eType)
FLOAT fBonusPercent = (GET_SMUGGLER_REWARD_BONUS_PERCENTAGE(eType, iCargoTotal) * 100.0)
IF fBonusPercent > 0.0
INT iBonus = GET_REWARD_BONUS_FOR_SMUGGLED_GOOD_TYPE(eType, iCargoTotal)
iSellPrice += iBonus
ENDIF
ENDIF
BEGIN_SCALEFORM_MOVIE_METHOD(mov, "SET_STATS")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_LITERAL_STRING(sOrgName) // Gang name
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(iLocation) // LSIA or Zancudo?
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(iStealsComplete) // Mission completed count
SCALEFORM_MOVIE_METHOD_ADD_PARAM_FLOAT(fStealsSuccessRate) // Steal success rate
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(iSalesCompleted) // Sales completed
SCALEFORM_MOVIE_METHOD_ADD_PARAM_FLOAT(fSalesSuccessRate) // sales success rate
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(iRivalCratesStolen) // Rival crates stolen
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(iTotalEarnings) // total earnings from sales
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(iBonusEarnings) // Bonus earnings from sales
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(iCargoTotal) // Stored crates
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(iStockCapacity) // Hangar crate capacity
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(iSellPrice) // Sell all price
END_SCALEFORM_MOVIE_METHOD()
ENDPROC
PROC INIT_CARGO_TOTALS()
INT i
REPEAT ciTOTAL_HANGAR_GOODS_TYPES i
eSMUGGLED_GOODS_TYPE eType = CONVERT_SCALEFROM_ORDER_TO_ENUM(i)
iGoodsTotal[i] = GET_COUNT_OF_CONTRABAND_TYPE_IN_HANGAR(eType)
PRINTLN("<APP_SMUGGLER> INIT_CARGO_TOTALS - ", DEBUG_GET_SMUGGLED_GOODS_TYPE_NAME(eType), " Total = ", iGoodsTotal[i])
ENDREPEAT
ENDPROC
PROC SEND_CARGO_DATA_TO_SCALEFORM(INT iType)
// 0 = All cargo
// 1 = Narcotics
// 2 = Chemicals
// 3 = Medical Supplies
// 4 = Animal Materials
// 5 = Art & Antiques
// 6 = Jewelry & Gemstones
// 7 = Tobacco & Alcohol
// 8 = Counterfeit Goods
INT iStockLevel = iGoodsTotal[iType]
INT iTotalStockLevel = 50
INT iSellPrice = GET_TOTAL_VALUE_OF_SMUGGLED_GOOD_TYPE(CONVERT_SCALEFROM_ORDER_TO_ENUM(iType), iStockLevel)
INT fBonusPercent = ROUND(GET_SMUGGLER_REWARD_BONUS_PERCENTAGE(CONVERT_SCALEFROM_ORDER_TO_ENUM(iType), iStockLevel) * 100.0)
IF fBonusPercent > 0.0
INT iBonus = GET_REWARD_BONUS_FOR_SMUGGLED_GOOD_TYPE(CONVERT_SCALEFROM_ORDER_TO_ENUM(iType), iStockLevel)
iSellPrice += iBonus
SET_BIT(iBS, SM_BS_SELL_BONUS_AVAIABLE)
ENDIF
BEGIN_SCALEFORM_MOVIE_METHOD(mov, "ADD_CARGO")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(iType) // Cargo type
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(iStockLevel) // Current count of this cargo type (percent)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(iTotalStockLevel) // Total stock level
SCALEFORM_MOVIE_METHOD_ADD_PARAM_FLOAT(TO_FLOAT(fBonusPercent)) // Bonus sell for selling just this cargo type
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(iSellPrice) // sell success rate LS (percent)
END_SCALEFORM_MOVIE_METHOD()
ENDPROC
FUNC INT GET_TIME_IN_SECONDS(INT iTimeMs)
RETURN (iTimeMs / 1000)
ENDFUNC
FUNC INT GET_TIME_REMAINING(SCRIPT_TIMER eTimer, INT iTotalTime)
INT iTimeRemaining = (iTotalTime - (ABSI(GET_TIME_DIFFERENCE(GET_NETWORK_TIME(), eTimer.Timer))))
iTimeRemaining = (iTimeRemaining / 1000)
RETURN iTimeRemaining
ENDFUNC
PROC UPDATE_SELL_COOLDOWN_TIMER()
IF SMUGGLER_HAS_SELL_COOLDOWN_STARTED()
BEGIN_SCALEFORM_MOVIE_METHOD(mov, "UPDATE_SELL_COOLDOWN")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(GET_TIME_REMAINING(g_sSmugglerCDVars.stSellCoolDownTimer, g_sSmugglerCDVars.iSellCooldownTime)) // Time Remaining
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(GET_TIME_IN_SECONDS(g_sSmugglerCDVars.iSellCooldownTime) ) // Total time
END_SCALEFORM_MOVIE_METHOD()
ELSE
BEGIN_SCALEFORM_MOVIE_METHOD(mov, "UPDATE_SELL_COOLDOWN")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(0) // Time Remaining
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(0) // Total time
END_SCALEFORM_MOVIE_METHOD()
ENDIF
ENDPROC
PROC UPDATE_STEAL_COOLDOWN_TIMER()
INT i
BEGIN_SCALEFORM_MOVIE_METHOD(mov, "UPDATE_STEAL_COOLDOWN")
FOR i = 1 TO eSGT_MIXED
eSMUGGLED_GOODS_TYPE eType = CONVERT_SCALEFROM_ORDER_TO_ENUM(i)
INT iTypeIndex = ENUM_TO_INT(eType)
IF SMUGGLER_HAS_STEAL_COOLDOWN_STARTED(eType)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(GET_TIME_REMAINING(g_sSmugglerCDVars.stStealCoolDownTimer[iTypeIndex], g_sSmugglerCDVars.iStealCooldownTimes[iTypeIndex])) // Time Remaining
ELSE
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(0) // Time Remaining
ENDIF
ENDFOR
END_SCALEFORM_MOVIE_METHOD()
ENDPROC
FUNC BOOL DOES_PLAYER_HOLD_ONLY_ONE_CARGO_TYPE()
INT i
INT iCount = 0
REPEAT ciTOTAL_HANGAR_GOODS_TYPES i
IF iGoodsTotal[i] > 0
iCount ++
IF iCount > 2
RETURN FALSE
ENDIF
ENDIF
ENDREPEAT
PRINTLN("<APP_SMUGGLER> DOES_PLAYER_HOLD_ONLY_ONE_CARGO_TYPE - iCount = ", iCount)
RETURN (iCount <= 2)
ENDFUNC
PROC SEND_ALL_DATA_TO_SCALEFORM()
INT i
//Get totals
INIT_CARGO_TOTALS()
//Determine the mix of products held
IF DOES_PLAYER_HOLD_ONLY_ONE_CARGO_TYPE()
#IF IS_DEBUG_BUILD
IF GET_LOCAL_PLAYERS_CONTRABAND_UNITS_TOTAL_FOR_HANGAR() > 0
PRINTLN("<APP_SMUGGLER> SEND_ALL_DATA_TO_SCALEFORM - Player holds all cargo of the same type")
ELSE
PRINTLN("<APP_SMUGGLER> SEND_ALL_DATA_TO_SCALEFORM - Player holds no cargo")
ENDIF
#ENDIF
SET_BIT(iBS, SM_BS_STORED_CARGO_ALL_ONE_TYPE)
ELSE
PRINTLN("<APP_SMUGGLER> SEND_ALL_DATA_TO_SCALEFORM DOES_PLAYER_HOLD_ONLY_ONE_CARGO_TYPE = FALSE")
ENDIF
//Base data
SEND_HANGAR_DATA_TO_SCALEFORM()
//Cargo data
REPEAT ciTOTAL_HANGAR_GOODS_TYPES i
SEND_CARGO_DATA_TO_SCALEFORM(i)
ENDREPEAT
//Update the cooldown timers
UPDATE_STEAL_COOLDOWN_TIMER()
UPDATE_SELL_COOLDOWN_TIMER()
START_NET_TIMER(stCDUpdateTimer)
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, SM_BS_WAITING_FOR_BUTTON_RETURN_VALUE)
BEGIN_SCALEFORM_MOVIE_METHOD(mov, "GET_CURRENT_SELECTION")
currentSelectionReturnIndex = END_SCALEFORM_MOVIE_METHOD_RETURN_VALUE()
SET_BIT(iBS, SM_BS_WAITING_FOR_BUTTON_RETURN_VALUE)
ENDIF
ENDIF
ENDPROC
FUNC BOOL DOES_PLAYER_HAVE_STOCK_OF_GOODS_TO_SELL(eSMUGGLED_GOODS_TYPE eMissionGoodsType)
SWITCH eMissionGoodsType
CASE eSGT_MIXED
RETURN !IS_PLAYERS_HANGAR_CONTRABAND_STORAGE_EMPTY(PLAYER_ID())
DEFAULT
RETURN (iGoodsTotal[CONVERT_ENUM_TO_SCALEFORM_ORDER(eMissionGoodsType)] > 0)
ENDSWITCH
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Checks if we can launch a sell mission and sets up the overlay screen with the necessary text
PROC RUN_INITIAL_SELL_CARGO_CHECKS(eSMUGGLED_GOODS_TYPE eMissionGoodsType, BOOL bIgnoreGangSizeCHeck = FALSE)
INT iStockLevel = GET_PLAYERS_CONTRABAND_UNITS_TOTAL_FOR_HANGAR(PLAYER_ID())
IF eMissionGoodsType != eSGT_MIXED
iStockLevel = iGoodsTotal[CONVERT_ENUM_TO_SCALEFORM_ORDER(eMissionGoodsType)]
ENDIF
IF NOT DOES_PLAYER_HAVE_STOCK_OF_GOODS_TO_SELL(eMissionGoodsType) //FAIL: Empty not enough stock
TEXT_LABEL_15 tlError = "HAPP_SELL_D1"
TEXT_LABEL_15 tlSubString = ""
IF eMissionGoodsType != eSGT_MIXED
tlError = "HAPP_SELL_D0"
tlSubString = GET_HANGAR_STOCK_TYPE_TEXT_LABEL(eMissionGoodsType)
ENDIF
SHOW_OVERLAY("HAPP_SELL_T", tlError, "OR_OVRLY_OK", "", TRUE, FALSE, DEFAULT, DEFAULT, DEFAULT, tlSubString)
ELIF SMUGGLER_HAS_SELL_COOLDOWN_STARTED()
SHOW_OVERLAY("HAPP_SELL_T", "HAPP_SELL_C3", "OR_OVRLY_OK", "", TRUE, FALSE)
ELIF NOT CAN_PLAYER_LAUNCH_MISSION(FMMC_TYPE_SMUGGLER_SELL) //FAIL: Not available
SHOW_OVERLAY("HAPP_SELL_T", SMUGGLER_APP_GET_MISSION_LAUNCH_FAIL_REASON(), "OR_OVRLY_OK", "", TRUE, FALSE)
ELIF GET_SMUGGLER_SELL_SIZE_FROM_COUNT(iStockLevel) != eSMUGGLER_SELL_SIZE_SMALL //Show gang size warning
AND NOT bIgnoreGangSizeCHeck
SET_SMUGGLED_GOODS_TYPE(eMissionGoodsType)
SHOW_OVERLAY("HAPP_SELL_T", "HAPP_SELL_GDB", "OR_OVRLY_OK", "", FALSE, TRUE, DEFAULT, SM_STAGE_GANG_SIZE_WARNING)
ELSE //Confirm Launch
TEXT_LABEL_15 tlConfirm = "HAPP_SELL_C2"
TEXT_LABEL_15 tlSubString = ""
INT iBonus = -1
INT iSellPrice = -1
IF (BS_DOES_PLAYER_HOLD_ONLY_ONE_CARGO_TYPE() AND GET_FIRST_OWNED_CARGO_TYPE() != eSGT_INVALID)
OR eMissionGoodsType != eSGT_MIXED
IF BS_DOES_PLAYER_HOLD_ONLY_ONE_CARGO_TYPE()
eMissionGoodsType = GET_FIRST_OWNED_CARGO_TYPE()
iStockLevel = iGoodsTotal[CONVERT_ENUM_TO_SCALEFORM_ORDER(eMissionGoodsType)]
ENDIF
iSellPrice = GET_TOTAL_VALUE_OF_SMUGGLED_GOOD_TYPE(eMissionGoodsType, iStockLevel)
//Basic message for selling without a bonus
tlConfirm = "HAPP_SELL_C0"
FLOAT fBonusPercent = (GET_SMUGGLER_REWARD_BONUS_PERCENTAGE(eMissionGoodsType, iStockLevel) * 100.0)
//If we have a bonus to give then give the bonus value also
IF fBonusPercent > 0.0
iBonus = GET_REWARD_BONUS_FOR_SMUGGLED_GOOD_TYPE(eMissionGoodsType, iStockLevel)
iSellPrice += iBonus
tlConfirm = "HAPP_SELL_C1"
//Once we've calculated the full sell value, get the percentage added
iBonus = ROUND(fBonusPercent)
ENDIF
tlSubString = GET_HANGAR_STOCK_TYPE_TEXT_LABEL(eMissionGoodsType)
ELIF eMissionGoodsType = eSGT_MIXED
SET_BIT(iBS, SM_BS_SHOW_BONUS_LOST_HELP)
ENDIF
SET_SMUGGLED_GOODS_TYPE(eMissionGoodsType)
#IF FEATURE_DLC_1_2022
// Chech for first help msg
IF DID_I_JOIN_A_PRIVATE_SESSION()
IF NOT GET_PACKED_STAT_BOOL(PACKED_MP_BOOL_APP_SELL_GOODS_HELP_TEXT_SMUGGLER)
IF NOT IS_THIS_PRINT_BEING_DISPLAYED("APP_SG_HELP")
PRINT_HELP("APP_SG_HELP")
ENDIF
SET_PACKED_STAT_BOOL (PACKED_MP_BOOL_APP_SELL_GOODS_HELP_TEXT_SMUGGLER, TRUE)
ENDIF
ENDIF
#ENDIF // #IF FEATURE_DLC_1_2022
IF iBonus > 0
SET_BIT(iBS, SM_BS_SHOW_BONUS_HELP)
SHOW_OVERLAY("HAPP_SELL_T", tlConfirm, "WHOUSE_CONF", "WHOUSE_CANC", FALSE, TRUE, iBonus, SM_STAGE_CONFIRM_SELL_LAUNCH, iSellPrice, tlSubString)
ELSE
SHOW_OVERLAY("HAPP_SELL_T", tlConfirm, "WHOUSE_CONF", "WHOUSE_CANC", FALSE, TRUE, iSellPrice, SM_STAGE_CONFIRM_SELL_LAUNCH, iBonus, tlSubString)
ENDIF
ENDIF
SMUGGLER_APP_CLEAR_MISSION_LAUNCH_FAIL_REASON()
ENDPROC
/// PURPOSE:
/// Checks if a setup or resupply mission is available and shows the relevant overlay screen
PROC RUN_INITIAL_STEAL_CARGO_CHECKS(eSMUGGLED_GOODS_TYPE eMissionGoodsType)
IF IS_PLAYERS_HANGAR_CONTRABAND_STORAGE_FULL(PLAYER_ID()) //FAIL: We have 100% supplies already
SHOW_OVERLAY("HAPP_STEAL_T", "HAPP_STEAL_D", "OR_OVRLY_OK", "", TRUE, FALSE)
ELIF eMissionGoodsType != eSGT_MIXED
AND SMUGGLER_HAS_STEAL_COOLDOWN_STARTED(eMissionGoodsType)
SHOW_OVERLAY("HAPP_STEAL_T", "HAPP_STEAL_D1", "OR_OVRLY_OK", "", TRUE, FALSE)
ELIF NOT CAN_PLAYER_LAUNCH_MISSION(FMMC_TYPE_SMUGGLER_BUY) //FAIL: Not available
SHOW_OVERLAY("HAPP_STEAL_T", SMUGGLER_APP_GET_MISSION_LAUNCH_FAIL_REASON(), "OR_OVRLY_OK", "", TRUE, FALSE)
ELSE
SET_SMUGGLED_GOODS_TYPE(eMissionGoodsType)
TEXT_LABEL_15 tlConfirm = "HAPP_STEAL_C1"
TEXT_LABEL_15 tlConfirmSubString = ""
IF eMissionGoodsType != eSGT_MIXED
tlConfirm = "HAPP_STEAL_C0"
tlConfirmSubString = GET_HANGAR_STOCK_TYPE_TEXT_LABEL(eMissionGoodsType)
ENDIF
SHOW_OVERLAY("HAPP_STEAL_T", tlConfirm, "WHOUSE_CONF", "WHOUSE_CANC", FALSE, TRUE, DEFAULT, SM_STAGE_CONFIRM_BUY_LAUNCH, -1, tlConfirmSubString)
ENDIF
SMUGGLER_APP_CLEAR_MISSION_LAUNCH_FAIL_REASON()
ENDPROC
FUNC BOOL DO_LAUNCH_MISSION_TRANSACTION(BOOL bSellMission)
IF NOT USE_SERVER_TRANSACTIONS()
RETURN TRUE
ENDIF
CONTRABAND_TRANSACTION_STATE eResult
WHILE NOT PROCESS_TRANSACTION_FOR_HANGAR_CONTRABAND_MISSION(eResult, bSellMission)
RENDER_SMUGGLER_APP()
WAIT(0)
ENDWHILE
RENDER_SMUGGLER_APP()
RETURN (eResult = CONTRABAND_TRANSACTION_STATE_SUCCESS)
ENDFUNC
PROC LAUNCH_MISSION(INT iMissionType, BOOL bSetup = FALSE)
eSMUGGLED_GOODS_TYPE eLaunchType = GET_SELECTED_GOODS_TYPE()
IF eLaunchType = eSGT_MIXED
AND iMissionType = FMMC_TYPE_SMUGGLER_BUY
PRINTLN("<APP_SMUGGLER> LAUNCH_MISSION Mixed type not supported. Choosing random new type")
eLaunchType = 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
IF bSetup
PRINTLN("<APP_SMUGGLER> LAUNCH_MISSION - Launching setup mission")
GB_SET_PLAYER_GANG_BOSS_MISSION_VARIATION(ENUM_TO_INT(SMV_SETUP_RON))
ENDIF
IF iMissionType = FMMC_TYPE_SMUGGLER_SELL
AND BS_DOES_PLAYER_HOLD_ONLY_ONE_CARGO_TYPE()
AND eLaunchType = eSGT_MIXED
eLaunchType = GET_FIRST_OWNED_CARGO_TYPE()
PRINTLN("<APP_SMUGGLER> LAUNCH_MISSION Mixed type for sell. Player only owns this type.")
ENDIF
g_sSMUGGLER_Telemetry_data.m_FromHackerTruck = 0
PRINTLN("<APP_SMUGGLER> LAUNCH_MISSION Requesting mission launch of type: ", iMissionType, " with goods type: ", DEBUG_GET_SMUGGLED_GOODS_TYPE_NAME(eLaunchType))
GB_BOSS_REQUEST_SMUGGLER_MISSION_LAUNCH_FROM_SERVER(iMissionType, FREEMODE_DELIVERY_LOCATION_CITY, eLaunchType)
//DO_SCREEN_FADE_OUT(500)
TRIGGER_EXIT_FROM_SIMPLE_INTERIOR_NOW()
g_bLaunchedMissionFrmLaptop = TRUE
SET_BIT(iBS, SM_BS_LAUNCHED_MISSION)
ENDPROC
/// PURPOSE:
/// Handles the player pressing confirm on the overlay screen
PROC HANDLE_ACCEPT_OVERLAY_PRESS()
SWITCH SMUGGLER_APP_GET_APP_STAGE()
CASE SM_STAGE_CONFIRM_BUY_LAUNCH
IF DO_LAUNCH_MISSION_TRANSACTION(FALSE)
INCREMENT_HANGAR_BUY_MISSIONS_UNDERTAKEN()
PLAY_SOUND_FRONTEND(-1, "Click_Special", "GTAO_SMG_Hangar_Computer_Sounds")
LAUNCH_MISSION(FMMC_TYPE_SMUGGLER_BUY)
ELSE
SHOW_OVERLAY("", "BKR_TF_R6", "OR_OVRLY_OK", "", TRUE, FALSE)
ENDIF
BREAK
CASE SM_STAGE_CONFIRM_SELL_LAUNCH
IF DO_LAUNCH_MISSION_TRANSACTION(TRUE)
INCREMENT_HANGAR_SELL_MISSIONS_UNDERTAKEN()
PLAY_SOUND_FRONTEND(-1, "Click_Special", "GTAO_SMG_Hangar_Computer_Sounds")
LAUNCH_MISSION(FMMC_TYPE_SMUGGLER_SELL)
PRINTLN("<APP_SMUGGLER> Sell mission launch - set BS2_SIMPLE_INTERIOR_HOLD_EXIT_FADE_IN_UNTIL_MISSION_OK")
ELSE
SHOW_OVERLAY("", "BKR_TF_R6", "OR_OVRLY_OK", "", TRUE, FALSE)
ENDIF
BREAK
CASE SM_STAGE_FAIL_OVERLAY
//HIDE_OVERLAY()
BREAK
CASE SM_STAGE_GANG_SIZE_WARNING
HIDE_OVERLAY()
RUN_INITIAL_SELL_CARGO_CHECKS(GET_SELECTED_GOODS_TYPE(), TRUE)
EXIT
CASE SM_STAGE_LAUNCH_SETUP
IF NOT CAN_PLAYER_LAUNCH_MISSION(FMMC_TYPE_SMUGGLER_BUY)
SHOW_OVERLAY("HAPP_T1", SMUGGLER_APP_GET_MISSION_LAUNCH_FAIL_REASON(), "OR_OVRLY_OK", "", TRUE, FALSE, DEFAULT)
ELSE
IF DO_LAUNCH_MISSION_TRANSACTION(FALSE)
INCREMENT_HANGAR_BUY_MISSIONS_UNDERTAKEN()
PLAY_SOUND_FRONTEND(-1, "Click_Special", "GTAO_SMG_Hangar_Computer_Sounds")
LAUNCH_MISSION(FMMC_TYPE_SMUGGLER_BUY, TRUE)
EXIT
ELSE
SHOW_OVERLAY("HAPP_T1", "BKR_TF_R6", "OR_OVRLY_OK", "", TRUE, FALSE, DEFAULT)
ENDIF
ENDIF
BREAK
DEFAULT
PLAY_CLICK_LINK_SOUND()
BREAK
ENDSWITCH
HIDE_OVERLAY()
ENDPROC
FUNC eSMUGGLED_GOODS_TYPE GET_SGT_FROM_BUTTON(SM_BUTTON_INDEXES eButton)
SWITCH eButton
CASE BUTTON_STEAL_ALL_GOODS
CASE BUTTON_NAV_SELL_ALL_GOODS
RETURN eSGT_MIXED
BREAK
CASE BUTTON_STEAL_GOODS_NARCOTICS
CASE BUTTON_NAV_SELL_GOODS_NARCOTICS
CASE BUTTON_GRAPH_NARCOTICS
RETURN eSGT_NARCOTICS
BREAK
CASE BUTTON_STEAL_GOODS_CHEMICALS
CASE BUTTON_NAV_SELL_GOODS_CHEMICALS
CASE BUTTON_GRAPH_CHEMICALS
RETURN eSGT_CHEMICALS
BREAK
CASE BUTTON_STEAL_GOODS_MEDICAL
CASE BUTTON_NAV_SELL_GOODS_MEDICAL
CASE BUTTON_GRAPH_MEDICAL_SUPPLIES
RETURN eSGT_MEDICAL_SUPPLIES
BREAK
CASE BUTTON_STEAL_GOODS_ANIMAL
CASE BUTTON_NAV_SELL_GOODS_ANIMAL
CASE BUTTON_GRAPH_ANIMAL_MATERIALS
RETURN eSGT_ANIMAL_MATERIALS
BREAK
CASE BUTTON_STEAL_GOODS_ART
CASE BUTTON_NAV_SELL_GOODS_ART
CASE BUTTON_GRAPH_ART
RETURN eSGT_ART_AND_ANTIQUES
BREAK
CASE BUTTON_STEAL_GOODS_GEMS
CASE BUTTON_NAV_SELL_GOODS_GEMS
CASE BUTTON_GRAPH_GEMS
RETURN eSGT_JEWELRY_AND_GEMSTONES
BREAK
CASE BUTTON_STEAL_GOODS_TOBACCO
CASE BUTTON_NAV_SELL_GOODS_TOBACCO
CASE BUTTON_GRAPH_TOBACCO
RETURN eSGT_TOBACCO_AND_ALCOHOL
BREAK
CASE BUTTON_STEAL_COUNTERFIT_GOODS
CASE BUTTON_NAV_SELL_COUNTERFIT_GOODS
CASE BUTTON_GRAPH_COUNTERFIT_GOODS
RETURN eSGT_COUNTERFEIT_GOODS
BREAK
ENDSWITCH
ASSERTLN("<APP_SMUGGLER> GET_SGT_FROM_BUTTON passed invalid button ID: (", eButton, ") ", DEBUG_GET_BUTTON_NAME(eButton))
RETURN eSGT_INVALID
ENDFUNC
PROC CHECK_BUTTON_PRESS()
MAINTAIN_CHECKS_FOR_CURRENT_SELECTION_ID()
IF IS_BIT_SET(iBS, SM_BS_WAITING_FOR_BUTTON_RETURN_VALUE)
IF IS_SCALEFORM_MOVIE_METHOD_RETURN_VALUE_READY(currentSelectionReturnIndex)
SM_BUTTON_INDEXES eButtonPressed = INT_TO_ENUM(SM_BUTTON_INDEXES, GET_SCALEFORM_MOVIE_METHOD_RETURN_VALUE_INT(currentSelectionReturnIndex))
CDEBUG1LN(DEBUG_INTERNET, "<APP_SMUGGLER> CHECK_BUTTON_PRESS button press returned = ", DEBUG_GET_BUTTON_NAME(eButtonPressed), " ID: ", eButtonPressed)
SWITCH eButtonPressed
CASE BUTTON_OVERLAY_CANCEL
PLAY_CLICK_LINK_SOUND()
HIDE_OVERLAY()
BREAK
CASE BUTTON_OVERLAY_ACCEPT
HANDLE_ACCEPT_OVERLAY_PRESS()
BREAK
CASE BUTTON_NAV_OVERVIEW
IF eCurrentPage != PAGE_OVERVIEW
PLAY_SOUND_FRONTEND(-1, "Show_Overview_Menu", "GTAO_SMG_Hangar_Computer_Sounds")
ENDIF
eCurrentPage = PAGE_OVERVIEW
BREAK
CASE BUTTON_STEAL_CARGO
IF eCurrentPage != PAGE_STEAL
PLAY_SOUND_FRONTEND(-1, "Show_Source_Menu", "GTAO_SMG_Hangar_Computer_Sounds")
ENDIF
eCurrentPage = PAGE_STEAL
BREAK
CASE BUTTON_SELL_CARGO
IF eCurrentPage != PAGE_SELL
PLAY_SOUND_FRONTEND(-1, "Show_Sell_Menu", "GTAO_SMG_Hangar_Computer_Sounds")
ENDIF
eCurrentPage = PAGE_SELL
BREAK
CASE BUTTON_NAV_SELL_ALL_GOODS
CASE BUTTON_NAV_SELL_GOODS_NARCOTICS
CASE BUTTON_NAV_SELL_GOODS_CHEMICALS
CASE BUTTON_NAV_SELL_GOODS_MEDICAL
CASE BUTTON_NAV_SELL_GOODS_ANIMAL
CASE BUTTON_NAV_SELL_GOODS_ART
CASE BUTTON_NAV_SELL_GOODS_GEMS
CASE BUTTON_NAV_SELL_GOODS_TOBACCO
CASE BUTTON_NAV_SELL_COUNTERFIT_GOODS
RUN_INITIAL_SELL_CARGO_CHECKS(GET_SGT_FROM_BUTTON(eButtonPressed))
BREAK
CASE BUTTON_GRAPH_NARCOTICS
CASE BUTTON_GRAPH_CHEMICALS
CASE BUTTON_GRAPH_MEDICAL_SUPPLIES
CASE BUTTON_GRAPH_ANIMAL_MATERIALS
CASE BUTTON_GRAPH_ART
CASE BUTTON_GRAPH_GEMS
CASE BUTTON_GRAPH_TOBACCO
CASE BUTTON_GRAPH_COUNTERFIT_GOODS
IF GET_PACKED_STAT_BOOL(PACKED_MP_BOOL_HANGAR_APP_D_TUT_2)
RUN_INITIAL_SELL_CARGO_CHECKS(GET_SGT_FROM_BUTTON(eButtonPressed))
ELSE
//Show the sell page
eCurrentPage = PAGE_SELL
CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(mov, "SHOW_SCREEN", 2.0)
ENDIF
BREAK
CASE BUTTON_STEAL_ALL_GOODS
CASE BUTTON_STEAL_GOODS_NARCOTICS
CASE BUTTON_STEAL_GOODS_CHEMICALS
CASE BUTTON_STEAL_GOODS_MEDICAL
CASE BUTTON_STEAL_GOODS_ANIMAL
CASE BUTTON_STEAL_GOODS_ART
CASE BUTTON_STEAL_GOODS_GEMS
CASE BUTTON_STEAL_GOODS_TOBACCO
CASE BUTTON_STEAL_COUNTERFIT_GOODS
RUN_INITIAL_STEAL_CARGO_CHECKS(GET_SGT_FROM_BUTTON(eButtonPressed))
BREAK
ENDSWITCH
CLEAR_BIT(iBS, SM_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_HANGAR_APP_D_TUT_1)
AND GET_PACKED_STAT_BOOL(PACKED_MP_BOOL_HANGAR_APP_D_TUT_2)
AND GET_PACKED_STAT_BOOL(PACKED_MP_BOOL_HANGAR_APP_D_TUT_3)
CPRINTLN(DEBUG_INTERNET, "<APP_SMUGGLER><APP_SMUGGLER_TUT> HAVE_ALL_DIALOGUE_TUTORIALS_BEEN_COMPLETED TRUE")
RETURN TRUE
ENDIF
CPRINTLN(DEBUG_INTERNET, "<APP_SMUGGLER><APP_SMUGGLER_TUT> HAVE_ALL_DIALOGUE_TUTORIALS_BEEN_COMPLETED FALSE")
RETURN FALSE
ENDFUNC
FUNC STRING SMUGGLER_TUT_GET_ROOT_LABEL(INT iTutorialID)
SWITCH iTutorialID
CASE 0 RETURN "SMGC_LAPTUT1" //Overview page
CASE 1 RETURN "SMGC_LAPTUT2" //Steal page
CASE 2 RETURN "SMGC_LAPTUT3" //Sell page
ENDSWITCH
CASSERTLN(DEBUG_SAFEHOUSE, "SMUGGLER_TUT_GET_ROOT_LABEL: Invalid tutorial ID: ", iTutorialID)
RETURN "SMGC_LAPTUT1"
ENDFUNC
PROC SMUGGLER_START_TUTORIAL_DIALOGUE(INT iTutorialID)
IF CREATE_CONVERSATION(tutPedStruct, "SMGCAUD", SMUGGLER_TUT_GET_ROOT_LABEL(iTutorialID), CONV_PRIORITY_HIGH)
CPRINTLN(DEBUG_INTERNET, "<APP_SMUGGLER> Created tutorial converstion: ", iTutorialID)
iTutorialDialogueID = -1
ENDIF
ENDPROC
PROC SMUGGLER_RUN_TUTORIAL_DIALOGUE()
//Start the dialogue
IF iTutorialDialogueID != -1
SMUGGLER_START_TUTORIAL_DIALOGUE(iTutorialDialogueID)
ENDIF
ENDPROC
PROC SMUGGLER_PRINT_TUTORIAL_HELP(STRING sStringToDisplay, INT HelpTime)
BEGIN_TEXT_COMMAND_DISPLAY_HELP(sStringToDisplay)
END_TEXT_COMMAND_DISPLAY_HELP(HELP_TEXT_SLOT_STANDARD, FALSE, TRUE, HelpTime)
ENDPROC
PROC SMUGGLER_SELECT_APP_DIALOGUE_TUTORIAL()
BOOL bStartNewDialogue
IF NOT IS_BIT_SET(iBS, SM_BS_CURRENTLY_PLAYING_TUTORIAL)
AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF eCurrentPage = PAGE_OVERVIEW
IF NOT GET_PACKED_STAT_BOOL(PACKED_MP_BOOL_HANGAR_APP_D_TUT_1)
//First login
bStartNewDialogue = TRUE
iTutorialHelpTime = 9000
iTutorialDialogueID = 0
SET_PACKED_STAT_BOOL(PACKED_MP_BOOL_HANGAR_APP_D_TUT_1, TRUE)
ENDIF
ELIF eCurrentPage = PAGE_SELL
IF NOT GET_PACKED_STAT_BOOL(PACKED_MP_BOOL_HANGAR_APP_D_TUT_2)
//Collections page
bStartNewDialogue = TRUE
iTutorialHelpTime = 9000
iTutorialDialogueID = 2
SET_PACKED_STAT_BOOL(PACKED_MP_BOOL_HANGAR_APP_D_TUT_2, TRUE)
ENDIF
ELIF eCurrentPage = PAGE_STEAL
IF NOT GET_PACKED_STAT_BOOL(PACKED_MP_BOOL_HANGAR_APP_D_TUT_3)
//Collections page
bStartNewDialogue = TRUE
iTutorialHelpTime = 9000
iTutorialDialogueID = 1
SET_PACKED_STAT_BOOL(PACKED_MP_BOOL_HANGAR_APP_D_TUT_3, TRUE)
ENDIF
ENDIF
ENDIF
IF bStartNewDialogue
SET_BIT(iBS, SM_BS_CURRENTLY_PLAYING_TUTORIAL)
CPRINTLN(DEBUG_INTERNET, "<APP_SMUGGLER><APP_SMUGGLER_TUT> SMUGGLER_SELECT_APP_DIALOGUE_TUTORIAL Running tutorial for: ", iTutorialHelpTime, " seconds. Tutorial ID: ", iTutorialDialogueID)
ELIF IS_BIT_SET(iBS, SM_BS_CURRENTLY_PLAYING_TUTORIAL)
IF NOT HAS_NET_TIMER_STARTED(stTutorialTimer)
START_NET_TIMER(stTutorialTimer)
CPRINTLN(DEBUG_INTERNET, "<APP_SMUGGLER><APP_SMUGGLER_TUT> SMUGGLER_SELECT_APP_DIALOGUE_TUTORIAL Starting timer time: ", iTutorialHelpTime, " Tutorial ID: ", iTutorialDialogueID)
ELIF HAS_NET_TIMER_EXPIRED(stTutorialTimer, iTutorialHelpTime)
CLEAR_BIT(iBS, SM_BS_CURRENTLY_PLAYING_TUTORIAL)
iTutorialHelpTime = 0
RESET_NET_TIMER(stTutorialTimer)
CPRINTLN(DEBUG_INTERNET, "<APP_SMUGGLER><APP_SMUGGLER_TUT> SMUGGLER_SELECT_APP_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, SM_BS_DIALOGUE_TUTORIAL_COMPLETE)
ENDIF
ENDIF
ENDIF
ENDPROC
PROC SMUGGLER_SETUP_TUTORIAL_DIALOGUE()
IF HAVE_ALL_DIALOGUE_TUTORIALS_BEEN_COMPLETED()
SET_BIT(iBS, SM_BS_DIALOGUE_TUTORIAL_COMPLETE)
ELSE
//Introduce an inital delay as we no longer have a login screen
SET_BIT(iBS, SM_BS_CURRENTLY_PLAYING_TUTORIAL)
iTutorialHelpTime = 800
SET_USE_DLC_DIALOGUE(TRUE)
ADD_PED_FOR_DIALOGUE(tutPedStruct, 2, NULL, "NERVOUSRON")
CPRINTLN(DEBUG_INTERNET, "<APP_SMUGGLER> SMUGGLER_SETUP_TUTORIAL_DIALOGUE ped added for dialogue")
ENDIF
ENDPROC
PROC INCREMENT_TUTORIAL_COUNT(eWEBSITE_TUTORIAL_BS2_INDEX eTutorialID)
SWITCH eTutorialID
CASE eWTBS2_SMG_LOOSE_BONUS INCREMENT_TUTORIAL_PACKED_STAT(PACKED_MP_BOOL_TUT_LOOSE_BONUS) BREAK
CASE eWTBS2_SMG_SELL_BONUS INCREMENT_TUTORIAL_PACKED_STAT(PACKED_MP_BOOL_TUT_SELL_BONUS) BREAK
CASE eWTBS2_SMG_SETUP_OVERLAY INCREMENT_TUTORIAL_PACKED_STAT(PACKED_MP_BOOL_TUT_SETUP_OVERLAY) BREAK
CASE eWTBS2_SMG_OVERVIEW_PAGE INCREMENT_TUTORIAL_PACKED_STAT(PACKED_MP_BOOL_TUT_OVERVIEW_PAGE) BREAK
CASE eWTBS2_SMG_STEAL_PAGE_1 INCREMENT_TUTORIAL_PACKED_STAT(PACKED_MP_BOOL_TUT_STEAL_PAGE_1) BREAK
CASE eWTBS2_SMG_STEAL_PAGE_2 INCREMENT_TUTORIAL_PACKED_STAT(PACKED_MP_BOOL_TUT_STEAL_PAGE_2) BREAK
CASE eWTBS2_SMG_SELL_PAGE_1 INCREMENT_TUTORIAL_PACKED_STAT(PACKED_MP_BOOL_TUT_SELL_PAGE_1) BREAK
CASE eWTBS2_SMG_SELL_PAGE_2 INCREMENT_TUTORIAL_PACKED_STAT(PACKED_MP_BOOL_TUT_SELL_PAGE_2) BREAK
CASE eWTBS2_SMG_SELL_PAGE_3 INCREMENT_TUTORIAL_PACKED_STAT(PACKED_MP_BOOL_TUT_SELL_PAGE_3) BREAK
ENDSWITCH
ENDPROC
FUNC BOOL HAS_SMUGGLER_WEBSITE_TUT_BEEN_DONE(eWEBSITE_TUTORIAL_BS2_INDEX eTutorialID)
SWITCH eTutorialID
CASE eWTBS2_SMG_LOOSE_BONUS
RETURN CHECK_TUTORIAL_PACKED_STATS(PACKED_MP_BOOL_TUT_LOOSE_BONUS)
CASE eWTBS2_SMG_SELL_BONUS
RETURN CHECK_TUTORIAL_PACKED_STATS(PACKED_MP_BOOL_TUT_SELL_BONUS)
CASE eWTBS2_SMG_SETUP_OVERLAY
RETURN CHECK_TUTORIAL_PACKED_STATS(PACKED_MP_BOOL_TUT_SETUP_OVERLAY)
CASE eWTBS2_SMG_OVERVIEW_PAGE
RETURN CHECK_TUTORIAL_PACKED_STATS(PACKED_MP_BOOL_TUT_OVERVIEW_PAGE)
CASE eWTBS2_SMG_STEAL_PAGE_1
RETURN CHECK_TUTORIAL_PACKED_STATS(PACKED_MP_BOOL_TUT_STEAL_PAGE_1)
CASE eWTBS2_SMG_STEAL_PAGE_2
RETURN CHECK_TUTORIAL_PACKED_STATS(PACKED_MP_BOOL_TUT_STEAL_PAGE_2)
CASE eWTBS2_SMG_SELL_PAGE_1
RETURN CHECK_TUTORIAL_PACKED_STATS(PACKED_MP_BOOL_TUT_SELL_PAGE_1)
CASE eWTBS2_SMG_SELL_PAGE_2
RETURN CHECK_TUTORIAL_PACKED_STATS(PACKED_MP_BOOL_TUT_SELL_PAGE_2)
CASE eWTBS2_SMG_SELL_PAGE_3
RETURN CHECK_TUTORIAL_PACKED_STATS(PACKED_MP_BOOL_TUT_SELL_PAGE_3)
ENDSWITCH
RETURN FALSE
ENDFUNC
FUNC BOOL HAVE_ALL_SMUGGLER_HELP_TUTORIALS_BEEN_COMPLETED()
IF HAS_SMUGGLER_WEBSITE_TUT_BEEN_DONE(eWTBS2_SMG_LOOSE_BONUS)
AND HAS_SMUGGLER_WEBSITE_TUT_BEEN_DONE(eWTBS2_SMG_SELL_BONUS)
AND HAS_SMUGGLER_WEBSITE_TUT_BEEN_DONE(eWTBS2_SMG_SETUP_OVERLAY)
AND HAS_SMUGGLER_WEBSITE_TUT_BEEN_DONE(eWTBS2_SMG_OVERVIEW_PAGE)
AND HAS_SMUGGLER_WEBSITE_TUT_BEEN_DONE(eWTBS2_SMG_STEAL_PAGE_1)
AND HAS_SMUGGLER_WEBSITE_TUT_BEEN_DONE(eWTBS2_SMG_SELL_PAGE_1)
AND HAS_SMUGGLER_WEBSITE_TUT_BEEN_DONE(eWTBS2_SMG_SELL_PAGE_2)
AND HAS_SMUGGLER_WEBSITE_TUT_BEEN_DONE(eWTBS2_SMG_SELL_PAGE_3)
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL SHOULD_SMUGGLER_HELP_TUTORIAL_BE_DISPLAYED(eWEBSITE_TUTORIAL_BS2_INDEX eTutorialID)
INT iTutorialID = ENUM_TO_INT(eTutorialID)
IF NOT IS_BIT_SET(iBS, SM_BS_SETUP_COMPLETE)
AND eTutorialID != eWTBS2_SMG_SETUP_OVERLAY
RETURN FALSE
ENDIF
SWITCH eTutorialID
CASE eWTBS2_SMG_LOOSE_BONUS
IF NOT HAS_SMUGGLER_WEBSITE_TUT_BEEN_DONE(eTutorialID)
AND NOT IS_BIT_SET(g_iWebsiteTutorialDisplayedBS2, iTutorialID)
AND IS_BIT_SET(iBS, SM_BS_SHOW_BONUS_LOST_HELP)
RETURN TRUE
ENDIF
BREAK
CASE eWTBS2_SMG_SELL_BONUS
IF NOT HAS_SMUGGLER_WEBSITE_TUT_BEEN_DONE(eTutorialID)
AND NOT IS_BIT_SET(g_iWebsiteTutorialDisplayedBS2, iTutorialID)
AND IS_BIT_SET(iBS, SM_BS_SHOW_BONUS_HELP)
RETURN TRUE
ENDIF
BREAK
CASE eWTBS2_SMG_SETUP_OVERLAY
IF NOT HAS_SMUGGLER_WEBSITE_TUT_BEEN_DONE(eTutorialID)
AND NOT IS_BIT_SET(g_iWebsiteTutorialDisplayedBS2, iTutorialID)
AND IS_BIT_SET(iBS, SM_BS_SHOW_SETUP_HELP)
RETURN TRUE
ENDIF
BREAK
CASE eWTBS2_SMG_OVERVIEW_PAGE
IF NOT HAS_SMUGGLER_WEBSITE_TUT_BEEN_DONE(eTutorialID)
AND NOT IS_BIT_SET(g_iWebsiteTutorialDisplayedBS2, iTutorialID)
AND IS_BIT_SET(iBS, SM_BS_SETUP_COMPLETE)
AND eCurrentPage = PAGE_OVERVIEW
RETURN TRUE
ENDIF
BREAK
CASE eWTBS2_SMG_STEAL_PAGE_1
IF NOT HAS_SMUGGLER_WEBSITE_TUT_BEEN_DONE(eTutorialID)
AND NOT IS_BIT_SET(g_iWebsiteTutorialDisplayedBS2, iTutorialID)
AND eCurrentPage = PAGE_STEAL
RETURN TRUE
ENDIF
BREAK
CASE eWTBS2_SMG_STEAL_PAGE_2
IF NOT HAS_SMUGGLER_WEBSITE_TUT_BEEN_DONE(eTutorialID)
AND NOT IS_BIT_SET(g_iWebsiteTutorialDisplayedBS2, iTutorialID)
AND eCurrentPage = PAGE_STEAL
AND (IS_BIT_SET(g_iWebsiteTutorialDisplayedBS2, ENUM_TO_INT(eWTBS2_SMG_STEAL_PAGE_1)) OR HAS_SMUGGLER_WEBSITE_TUT_BEEN_DONE(eWTBS2_SMG_STEAL_PAGE_1))
RETURN TRUE
ENDIF
BREAK
CASE eWTBS2_SMG_SELL_PAGE_1
IF NOT HAS_SMUGGLER_WEBSITE_TUT_BEEN_DONE(eTutorialID)
AND NOT IS_BIT_SET(g_iWebsiteTutorialDisplayedBS2, iTutorialID)
AND eCurrentPage = PAGE_SELL
RETURN TRUE
ENDIF
BREAK
CASE eWTBS2_SMG_SELL_PAGE_2
IF NOT HAS_SMUGGLER_WEBSITE_TUT_BEEN_DONE(eTutorialID)
AND NOT IS_BIT_SET(g_iWebsiteTutorialDisplayedBS2, iTutorialID)
AND eCurrentPage = PAGE_SELL
AND (IS_BIT_SET(g_iWebsiteTutorialDisplayedBS2, ENUM_TO_INT(eWTBS2_SMG_SELL_PAGE_1)) OR HAS_SMUGGLER_WEBSITE_TUT_BEEN_DONE(eWTBS2_SMG_SELL_PAGE_1))
RETURN TRUE
ENDIF
BREAK
CASE eWTBS2_SMG_SELL_PAGE_3
IF NOT HAS_SMUGGLER_WEBSITE_TUT_BEEN_DONE(eTutorialID)
AND NOT IS_BIT_SET(g_iWebsiteTutorialDisplayedBS2, iTutorialID)
AND IS_BIT_SET(iBS, SM_BS_SELL_BONUS_AVAIABLE)
AND eCurrentPage = PAGE_SELL
AND (IS_BIT_SET(g_iWebsiteTutorialDisplayedBS2, ENUM_TO_INT(eWTBS2_SMG_SELL_PAGE_1)) OR HAS_SMUGGLER_WEBSITE_TUT_BEEN_DONE(eWTBS2_SMG_SELL_PAGE_1))
AND (IS_BIT_SET(g_iWebsiteTutorialDisplayedBS2, ENUM_TO_INT(eWTBS2_SMG_SELL_PAGE_2)) OR HAS_SMUGGLER_WEBSITE_TUT_BEEN_DONE(eWTBS2_SMG_SELL_PAGE_2))
RETURN TRUE
ENDIF
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
FUNC TEXT_LABEL_15 GET_TUTORIAL_HELP_LABEL(eWEBSITE_TUTORIAL_BS2_INDEX eTutorial)
TEXT_LABEL_15 tlReturn = ""
SWITCH eTutorial
CASE eWTBS2_SMG_LOOSE_BONUS tlReturn = "HAPP_HELP_1" BREAK
CASE eWTBS2_SMG_SELL_BONUS tlReturn = "HAPP_HELP_2" BREAK
CASE eWTBS2_SMG_SETUP_OVERLAY tlReturn = "HAPP_HELP_3" BREAK
CASE eWTBS2_SMG_OVERVIEW_PAGE tlReturn = "HAPP_HELP_4" BREAK
CASE eWTBS2_SMG_STEAL_PAGE_1 tlReturn = "HAPP_HELP_5" BREAK
CASE eWTBS2_SMG_STEAL_PAGE_2 tlReturn = "HAPP_HELP_6" BREAK
CASE eWTBS2_SMG_SELL_PAGE_1 tlReturn = "HAPP_HELP_7" BREAK
CASE eWTBS2_SMG_SELL_PAGE_2 tlReturn = "HAPP_HELP_8" BREAK
CASE eWTBS2_SMG_SELL_PAGE_3 tlReturn = "HAPP_HELP_9" BREAK
ENDSWITCH
RETURN tlReturn
ENDFUNC
FUNC INT GET_TUTORIAL_HELP_TIME(eWEBSITE_TUTORIAL_BS2_INDEX eTutorial)
SWITCH eTutorial
CASE eWTBS2_SMG_LOOSE_BONUS RETURN 14000
CASE eWTBS2_SMG_SELL_BONUS RETURN 15000
CASE eWTBS2_SMG_SETUP_OVERLAY RETURN 14000
CASE eWTBS2_SMG_OVERVIEW_PAGE RETURN 14500
CASE eWTBS2_SMG_STEAL_PAGE_1 RETURN 14000
CASE eWTBS2_SMG_STEAL_PAGE_2 RETURN 14000
CASE eWTBS2_SMG_SELL_PAGE_1 RETURN 14000
CASE eWTBS2_SMG_SELL_PAGE_2 RETURN 15000
CASE eWTBS2_SMG_SELL_PAGE_3 RETURN 14500
ENDSWITCH
RETURN 0
ENDFUNC
PROC SMUGGLER_RUN_APP_HELP_TEXT_TUTORIAL()
TEXT_LABEL_15 tlHelp
INT i
INT iMaxTutorial = (ENUM_TO_INT(eWTBS2_SMG_SELL_PAGE_3) + 1)
IF NOT IS_BIT_SET(iBS, SM_BS_CURRENTLY_DISPLAYING_TUTORIAL_HELP)
AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
REPEAT iMaxTutorial i
eWEBSITE_TUTORIAL_BS2_INDEX eTutorial = INT_TO_ENUM(eWEBSITE_TUTORIAL_BS2_INDEX, i)
IF SHOULD_SMUGGLER_HELP_TUTORIAL_BE_DISPLAYED(eTutorial)
tlHelp = GET_TUTORIAL_HELP_LABEL(eTutorial)
iTutorialHelpTime = GET_TUTORIAL_HELP_TIME(eTutorial)
SET_BIT(g_iWebsiteTutorialDisplayedBS2, i)
INCREMENT_TUTORIAL_COUNT(eTutorial)
BREAKLOOP
ENDIF
ENDREPEAT
ENDIF
IF NOT IS_BIT_SET(iBS, SM_BS_CURRENTLY_DISPLAYING_TUTORIAL_HELP)
AND NOT IS_STRING_NULL_OR_EMPTY(tlHelp)
//Display the relevant help text
SMUGGLER_PRINT_TUTORIAL_HELP(tlHelp, iTutorialHelpTime)
SET_BIT(iBS, SM_BS_CURRENTLY_DISPLAYING_TUTORIAL_HELP)
CPRINTLN(DEBUG_INTERNET, "<APP_SMUGGLER>[TUTORIAL] SMUGGLER_RUN_APP_HELP_TEXT_TUTORIAL Printing: tlHelp: ", tlHelp, " time: ", iTutorialHelpTime)
ELIF IS_BIT_SET(iBS, SM_BS_CURRENTLY_DISPLAYING_TUTORIAL_HELP)
IF NOT HAS_NET_TIMER_STARTED(stHelpTextTutorialTimer)
START_NET_TIMER(stHelpTextTutorialTimer)
CPRINTLN(DEBUG_INTERNET, "<APP_SMUGGLER>[TUTORIAL] SMUGGLER_RUN_APP_HELP_TEXT_TUTORIAL Starting timer for: ", tlHelp, " time: ", iTutorialHelpTime)
ELIF HAS_NET_TIMER_EXPIRED(stHelpTextTutorialTimer, iTutorialHelpTime)
CLEAR_BIT(iBS, SM_BS_CURRENTLY_DISPLAYING_TUTORIAL_HELP)
iTutorialHelpTime = 0
RESET_NET_TIMER(stHelpTextTutorialTimer)
CPRINTLN(DEBUG_INTERNET, "<APP_SMUGGLER>[TUTORIAL] SMUGGLER_RUN_APP_HELP_TEXT_TUTORIAL Starting timer expired for: ", tlHelp, " time: ", iTutorialHelpTime)
IF HAVE_ALL_SMUGGLER_HELP_TUTORIALS_BEEN_COMPLETED()
SET_BIT(iBS, SM_BS_HELP_TEXT_TUTORIAL_COMPLETE)
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()
CDEBUG1LN(DEBUG_SAFEHOUSE, "<APP_SMUGGLER> Shutting down! No network game is currently active")
SCRIPT_CLEANUP()
ELIF IS_PAUSE_MENU_ACTIVE_EX()
CPRINTLN(DEBUG_INTERNET, "<APP_SMUGGLER> Shutting down! Player opend the pause menu")
SCRIPT_CLEANUP()
ELIF IS_ENTITY_DEAD(PLAYER_PED_ID())
CDEBUG1LN(DEBUG_SAFEHOUSE, "<APP_SMUGGLER> Shutting down! Player is injured or dead")
SCRIPT_CLEANUP()
ENDIF
ENDPROC
/// PURPOSE:
/// Initalises the iActiveUsers array to -1
PROC INIT_ACTIVE_SMUGGLER_LIST()
INT i = 0
REPEAT NUM_RIVAL_SMUGGLERS i
CDEBUG1LN(DEBUG_SAFEHOUSE, "<APP_SMUGGLER> INIT_ACTIVE_SMUGGLER_LIST Setting value: ", i, " of app active user list to -1")
iActiveUsers[i] = -1
ENDREPEAT
i = 0
REPEAT MAX_NUM_GANGS i
iGangIndex[i] = -1
iNumGoons[i] = 0
ENDREPEAT
ENDPROC
/// PURPOSE:
/// Checks a local array for the current player in the loop (iPlayerLoop)
FUNC BOOL IS_PLAYER_IN_ACTIVE_SMUGGLER_LIST()
INT i = 0
REPEAT NUM_RIVAL_SMUGGLERS i
IF iActiveUsers[i] = iPlayerLoop
RETURN TRUE
ENDIF
ENDREPEAT
RETURN FALSE
ENDFUNC
PROC SET_NUM_GOONS_IN_PLAYERS_GANG(PLAYER_INDEX pPlayer, INT iNumberOfGoons)
INT i
REPEAT MAX_NUM_GANGS i
IF iGangIndex[i] = -1
iNumGoons[i] = iNumberOfGoons
iGangIndex[i] = NATIVE_TO_INT(pPlayer)
EXIT
ENDIF
ENDREPEAT
ENDPROC
PROC CLEAR_NUM_GOONS_IN_PLAYERS_GANG(PLAYER_INDEX pPlayer)
INT i
REPEAT MAX_NUM_GANGS i
IF iGangIndex[i] = NATIVE_TO_INT(pPlayer)
iNumGoons[i] = 0
iGangIndex[i] = -1
EXIT
ENDIF
ENDREPEAT
ENDPROC
FUNC BOOL HAVE_PLAYERS_NUM_GANG_MEMBERS_CHANGED()
INT i
REPEAT MAX_NUM_GANGS i
IF iGangIndex[i] = iPlayerLoop
IF NOT GB_IS_PLAYER_BOSS_OF_A_GANG(INT_TO_PLAYERINDEX(iPlayerLoop))
RETURN TRUE
ELSE
RETURN (iNumGoons[i] != GB_GET_NUM_GOONS_IN_PLAYER_GANG(INT_TO_PLAYERINDEX(iPlayerLoop)))
ENDIF
ENDIF
ENDREPEAT
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Adds a player to the local array and calls the relevant scaleform method
PROC ADD_PLAYER_TO_ACTIVE_SMUGGLER_LIST(PLAYER_INDEX piPlayer, INT iPlayerID)
INT i = 0
STRING sPlayerName = GET_PLAYER_NAME(piPlayer)
IF ARE_STRINGS_EQUAL(sPlayerName, "**Invalid**")
CDEBUG1LN(DEBUG_SAFEHOUSE, "<APP_SMUGGLER> ADD_PLAYER_TO_ACTIVE_SMUGGLER_LIST. tried to add **Invalid** player to list")
EXIT
ENDIF
INT iIter
INT iMaxNumGoons = GB_MAX_GANG_GOONS
TEXT_LABEL_63 tlGoons[GB_MAX_GANG_GOONS]
IF GB_IS_PLAYER_BOSS_OF_A_GANG(piPlayer)
REPEAT iMaxNumGoons iIter
PLAYER_INDEX piGoon = GlobalplayerBD_FM_3[iPlayerID].sMagnateGangBossData.GangMembers[iIter]
IF piGoon != INVALID_PLAYER_INDEX()
tlGoons[iIter] = GET_PLAYER_NAME(piGoon)
ELSE
tlGoons[iIter] = ""
ENDIF
ENDREPEAT
//Make sure there are no spaces in the list
REPEAT iMaxNumGoons iIter
IF IS_STRING_NULL_OR_EMPTY(tlGoons[iIter])
IF iIter != iMaxNumGoons
INT j
FOR j = iIter TO (iMaxNumGoons -1)
IF NOT IS_STRING_NULL_OR_EMPTY(tlGoons[j])
tlGoons[iIter] = tlGoons[j]
tlGoons[j] = ""
j = (iMaxNumGoons -1)
CDEBUG1LN(DEBUG_INTERNET, "<APP_SMUGGLER> ADD_PLAYER_TO_ACTIVE_SMUGGLER_LIST Updating list order Empty player slot: ", iIter, " Moving Goon: ", j, " down the list")
ENDIF
ENDFOR
ENDIF
ENDIF
ENDREPEAT
BEGIN_SCALEFORM_MOVIE_METHOD(mov, "ADD_ACTIVE_ORGANISATION")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_LITERAL_STRING(GET_PLAYER_ORGANISATION_NAME(piPlayer))
SCALEFORM_MOVIE_METHOD_ADD_PARAM_LITERAL_STRING(sPlayerName)
REPEAT iMaxNumGoons iIter
SCALEFORM_MOVIE_METHOD_ADD_PARAM_LITERAL_STRING(tlGoons[iIter])
ENDREPEAT
END_SCALEFORM_MOVIE_METHOD()
sPlayerName = GET_PLAYER_ORGANISATION_NAME(piPlayer)
SET_NUM_GOONS_IN_PLAYERS_GANG(piPlayer, GB_GET_NUM_GOONS_IN_PLAYER_GANG(piPlayer))
SET_BIT(iGangListBS, iPlayerID)
ELSE
BEGIN_SCALEFORM_MOVIE_METHOD(mov, "ADD_ACTIVE_ORGANISATION")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_LITERAL_STRING(sPlayerName)
END_SCALEFORM_MOVIE_METHOD()
ENDIF
REPEAT NUM_RIVAL_SMUGGLERS i
IF iActiveUsers[i] = -1
iActiveUsers[i] = iPlayerID
tlUserList[i] = sPlayerName
CDEBUG1LN(DEBUG_SAFEHOUSE, "<APP_SMUGGLER> ADD_PLAYER_TO_ACTIVE_SMUGGLER_LIST. Adding: ", tlUserList[i], " to slot: ", i)
EXIT
ENDIF
ENDREPEAT
CDEBUG1LN(DEBUG_SAFEHOUSE, "<APP_SMUGGLER> ADD_PLAYER_TO_ACTIVE_SMUGGLER_LIST. We have more players to add than GB_GET_MAX_NUM_GANGS: ", GB_GET_MAX_NUM_GANGS())
ENDPROC
/// PURPOSE:
/// Removes a player from the local array and calls the relevant scaleform method
PROC REMOVE_PLAYER_FROM_ACTIVE_SMUGGLER_LIST()
INT i = 0
INT iIndex = -1
REPEAT NUM_RIVAL_SMUGGLERS i
IF iActiveUsers[i] = iPlayerLoop
iActiveUsers[i] = -1
iIndex = i
ENDIF
ENDREPEAT
IF iIndex != -1
AND iIndex < NUM_RIVAL_SMUGGLERS
CDEBUG1LN(DEBUG_SAFEHOUSE, "<APP_SMUGGLER> REMOVE_PLAYER_FROM_ACTIVE_SMUGGLER_LIST. index: ", iIndex)
CDEBUG1LN(DEBUG_SAFEHOUSE, "<APP_SMUGGLER> REMOVE_PLAYER_FROM_ACTIVE_SMUGGLER_LIST. removing: ", tlUserList[iIndex])
BEGIN_SCALEFORM_MOVIE_METHOD(mov, "REMOVE_ACTIVE_ORGANISATION")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_LITERAL_STRING(tlUserList[iIndex])
END_SCALEFORM_MOVIE_METHOD()
tlUserList[iIndex] = ""
CLEAR_BIT(iGangListBS, iPlayerLoop)
CLEAR_NUM_GOONS_IN_PLAYERS_GANG(INT_TO_PLAYERINDEX(iPlayerLoop))
ELSE
CASSERTLN(DEBUG_SAFEHOUSE, "<APP_SMUGGLER> REMOVE_PLAYER_FROM_ACTIVE_SMUGGLER_LIST. Can't find player to remove: ", iIndex)
ENDIF
ENDPROC
/// PURPOSE: One player per frame loop to check gang status
/// Maintains the list of organizations to be displayed in the app
PROC MAINTAIN_ACTIVE_ORGANIZATION_LIST()
iPlayerLoop ++
IF iPlayerLoop = NUM_NETWORK_PLAYERS
iPlayerLoop = 0
ENDIF
PLAYER_INDEX pPlayer = INT_TO_NATIVE(PLAYER_INDEX, iPlayerLoop)
IF pPlayer = PLAYER_ID()
EXIT
ENDIF
IF NETWORK_IS_PLAYER_ACTIVE(pPlayer)
AND DOES_PLAYER_OWN_A_HANGER(pPlayer)
AND NOT GB_IS_PLAYER_MEMBER_OF_A_GANG(pPlayer, FALSE)
AND NOT HAVE_PLAYERS_NUM_GANG_MEMBERS_CHANGED()
IF NOT IS_PLAYER_IN_ACTIVE_SMUGGLER_LIST()
CDEBUG1LN(DEBUG_SAFEHOUSE, "<APP_SMUGGLER> Adding player: ", iPlayerLoop, " to app active user list")
ADD_PLAYER_TO_ACTIVE_SMUGGLER_LIST(pPlayer, iPlayerLoop)
ENDIF
ELSE
IF IS_PLAYER_IN_ACTIVE_SMUGGLER_LIST()
CDEBUG1LN(DEBUG_SAFEHOUSE, "<APP_SMUGGLER> Removing player: ", iPlayerLoop, " from app active user list")
REMOVE_PLAYER_FROM_ACTIVE_SMUGGLER_LIST()
ENDIF
ENDIF
IF IS_BIT_SET(iGangListBS, iPlayerLoop)
IF NOT GB_IS_PLAYER_BOSS_OF_A_GANG(pPlayer)
AND IS_PLAYER_IN_ACTIVE_SMUGGLER_LIST()
CDEBUG1LN(DEBUG_SAFEHOUSE, "<APP_SMUGGLER> Removing player: ", iPlayerLoop, " from app active user list")
REMOVE_PLAYER_FROM_ACTIVE_SMUGGLER_LIST()
ENDIF
ELSE
IF GB_IS_PLAYER_BOSS_OF_A_GANG(pPlayer)
AND IS_PLAYER_IN_ACTIVE_SMUGGLER_LIST()
CDEBUG1LN(DEBUG_SAFEHOUSE, "<APP_SMUGGLER> Removing player: ", iPlayerLoop, " from app active user list")
REMOVE_PLAYER_FROM_ACTIVE_SMUGGLER_LIST()
ENDIF
ENDIF
ENDPROC
PROC SCRIPT_INITALISE()
RUN_CLEANUP_CHECKS()
mov = REQUEST_SCALEFORM_MOVIE("HANGAR_CARGO")
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
CDEBUG1LN(DEBUG_SAFEHOUSE, "<APP_SMUGGLER> bRunningFmIntroCut is true so cleaning up!")
ENDIF
CDEBUG1LN(DEBUG_SAFEHOUSE, "<APP_SMUGGLER> DEFAULT CLEANUP")
SCRIPT_CLEANUP()
ENDIF
SET_BROWSER_OPEN(TRUE)
eOwnedHangar = GET_LOCAL_PLAYERS_OWNED_HANGAR()
SEND_ALL_DATA_TO_SCALEFORM()
SMUGGLER_SETUP_TUTORIAL_DIALOGUE()
IF HAVE_ALL_SMUGGLER_HELP_TUTORIALS_BEEN_COMPLETED()
SET_BIT(iBS, SM_BS_HELP_TEXT_TUTORIAL_COMPLETE)
PRINTLN("<APP_SMUGGLER> SCRIPT_INITALISE - All help text tutorials have been completed")
ENDIF
INIT_ACTIVE_SMUGGLER_LIST()
IF IS_HANGAR_SETUP_MISSION_COMPLETE()
PLAY_SOUND_FRONTEND(-1, "Show_Overview_Menu", "GTAO_SMG_Hangar_Computer_Sounds")
ELSE
PRINTLN("<APP_SMUGGLER> SCRIPT_INITALISE - Local player has not done the setup mission")
ENDIF
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
#IF FEATURE_GEN9_EXCLUSIVE
SET_MP_BOOL_CHARACTER_STAT(MP_STAT_DARKNETACCESSED, TRUE)
#ENDIF
ENDPROC
PROC MAINTAIN_COOLDOWN_TIMERS()
IF HAS_NET_TIMER_STARTED(stCDUpdateTimer)
IF HAS_NET_TIMER_EXPIRED(stCDUpdateTimer, 1000)
UPDATE_STEAL_COOLDOWN_TIMER()
UPDATE_SELL_COOLDOWN_TIMER()
REINIT_NET_TIMER(stCDUpdateTimer)
ENDIF
ELSE
START_NET_TIMER(stCDUpdateTimer)
ENDIF
ENDPROC
PROC MAINATIN_PRE_SETUP_OVERLAY()
IF NOT IS_BIT_SET(iBS, SM_BS_SETUP_COMPLETE)
IF NOT SMUGGLER_APP_IS_OVERLAY_OPEN()
IF NOT IS_HANGAR_SETUP_MISSION_COMPLETE()
SET_BIT(iBS, SM_BS_SHOW_SETUP_HELP)
SHOW_OVERLAY("HAPP_T1", "HAPP_D1", "HAPP_SU", "", FALSE, FALSE, DEFAULT, SM_STAGE_LAUNCH_SETUP)
IF NOT HAS_SMUGGLER_WEBSITE_TUT_BEEN_DONE(eWTBS2_SMG_SETUP_OVERLAY)
AND NOT IS_BIT_SET(g_iWebsiteTutorialDisplayedBS2, ENUM_TO_INT(eWTBS2_SMG_SETUP_OVERLAY))
AND IS_BIT_SET(iBS, SM_BS_SHOW_SETUP_HELP)
SMUGGLER_PRINT_TUTORIAL_HELP("HAPP_HELP_3", 14000)
SET_BIT(g_iWebsiteTutorialDisplayedBS2, ENUM_TO_INT(eWTBS2_SMG_SETUP_OVERLAY))
INCREMENT_TUTORIAL_COUNT(eWTBS2_SMG_SETUP_OVERLAY)
ENDIF
ELSE
SET_BIT(iBS, SM_BS_SETUP_COMPLETE)
ENDIF
ENDIF
ENDIF
ENDPROC
PROC MONITOR_STOCK_LEVELS()
IF iCargoTotal != GET_LOCAL_PLAYERS_CONTRABAND_UNITS_TOTAL_FOR_HANGAR()
IF NOT HAS_NET_TIMER_STARTED(stStockUpdateTimer)
START_NET_TIMER(stStockUpdateTimer)
ELIF HAS_NET_TIMER_EXPIRED(stStockUpdateTimer, 750)
RESET_NET_TIMER(stStockUpdateTimer)
SEND_ALL_DATA_TO_SCALEFORM()
ENDIF
ENDIF
ENDPROC
//FEATURE_SMUGGLER
//***********SCRIPT***********
SCRIPT
CDEBUG1LN(DEBUG_INTERNET, "<APP_SMUGGLER> started \"", GET_THIS_SCRIPT_NAME(), "\"")
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(GET_HASH_KEY("appSmuggler")) > 1
CDEBUG1LN(DEBUG_SAFEHOUSE, "<APP_SMUGGLER> Smuggler app script already running! cleaning up.")
SCRIPT_CLEANUP()
ENDIF
SCRIPT_INITALISE()
CDEBUG1LN(DEBUG_SAFEHOUSE, "<APP_SMUGGLER> Initalisation complete. Hangar = ", eOwnedHangar)
/// main update loop
WHILE IS_BROWSER_OPEN()
RUN_CLEANUP_CHECKS()
IF NOT IS_BIT_SET(iBS, SM_BS_DIALOGUE_TUTORIAL_COMPLETE)
AND IS_HANGAR_SETUP_MISSION_COMPLETE()
SMUGGLER_SELECT_APP_DIALOGUE_TUTORIAL()
SMUGGLER_RUN_TUTORIAL_DIALOGUE()
ENDIF
IF NOT IS_BIT_SET(iBS, SM_BS_HELP_TEXT_TUTORIAL_COMPLETE)
AND IS_BIT_SET(iBS, SM_BS_DIALOGUE_TUTORIAL_COMPLETE)
SMUGGLER_RUN_APP_HELP_TEXT_TUTORIAL()
ENDIF
MAINATIN_PRE_SETUP_OVERLAY()
RENDER_SMUGGLER_APP()
PASS_INPUTS_TO_SCALEFORM()
MAINTAIN_ACTIVE_ORGANIZATION_LIST()
MAINTAIN_COOLDOWN_TIMERS()
MONITOR_STOCK_LEVELS()
IF NOT IS_BIT_SET(iBS, SM_BS_LAUNCHED_MISSION)
CHECK_BUTTON_PRESS()
ELSE
//for: url:bugstar:3015579
IF NOT HAS_NET_TIMER_STARTED(stExitDelay)
START_NET_TIMER(stExitDelay)
PRINTLN("<APP_SMUGGLER> Started exit delay timer for mission launch")
ELIF HAS_NET_TIMER_EXPIRED(stExitDelay, 200)
IF NOT g_SimpleInteriorData.bTriggerExit
AND IS_SCREEN_FADED_OUT()
PRINTLN("<APP_SMUGGLER> Triggering simple interior exit")
TRIGGER_EXIT_FROM_SIMPLE_INTERIOR_NOW()
g_bLaunchedMissionFrmLaptop = TRUE
SCRIPT_CLEANUP()
ENDIF
ENDIF
ENDIF
WAIT(0)
ENDWHILE
// Script should never reach here. Always terminate with cleanup function.
CASSERTLN(DEBUG_SAFEHOUSE, "<APP_SMUGGLER> \"", GET_THIS_SCRIPT_NAME(), "\" should never reach here. Always terminate with cleanup function.")
ENDSCRIPT