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

2136 lines
82 KiB
Python
Executable File

USING "rage_builtins.sch"
USING "globals.sch"
USING "cellphone_public.sch"
USING "commands_zone.sch"
USING "website_private.sch"
USING "net_realty_warehouse.sch"
USING "net_gang_boss.sch"
USING "net_realty_vehicle_garage.sch"
USING "SVM_MISSION_FLOW.sch"
USING "net_ie_dropoff_public.sch"
USING "gb_vehicle_export_freemode_header.sch"
//***********Script CONSTS***********
CONST_INT ciMaxSelectableCars (ciMaxIEVehicleModels - 1)
CONST_INT ciMaxSubMenuVehicles 10
CONST_INT ciMaxVehicleCollections 10
CONST_INT ciMaxSelectableMissionVehicles 4
CONST_INT ciVehicleSelectionOffset 10000
CONST_INT ciCollectionSelectionOffset 18000
CONST_INT ciPageID_VehicleSelection 0
CONST_INT ciPageID_Collection 1
CONST_INT ciPageID_Buyers 2
CONST_INT ciFailReasonCriticalToJob 13
CONST_INT ciFailReasonNotBoss 14
CONST_INT ciFailReasonBikerBoss 15
CONST_INT ciFailReasonNoWH 16
CONST_INT ciFailReasonTooFewPlayers 17
CONST_INT ciFailReasonCloudSaveFail 18
CONST_INT ciFailReasonGoonGambling 19
CONST_INT ciFailReasonGoonAnimal 20
CONST_INT ciVehicleCategoryStandard 0
CONST_INT ciVehicleCategoryMid 1
CONST_INT ciVehicleCategoryTop 2
//Bit set consts
CONST_INT AH_BS_CURRENTLY_DISPLAYING_TUTORIAL_HELP 0
CONST_INT AH_BS_HELP_TEXT_TUTORIAL_COMPLETE 1
CONST_INT AH_BS_CURRENTLY_PLAYING_TUTORIAL 2
CONST_INT AH_BS_DIALOGUE_TUTORIAL_COMPLETE 3
CONST_INT AH_BS_TUTORIAL_1_PLAYED_THIS_BOOT 4
CONST_INT AH_BS_TUTORIAL_2_PLAYED_THIS_BOOT 5
CONST_INT AH_BS_TUTORIAL_3_PLAYED_THIS_BOOT 6
ENUM APP_STAGES
eAppStage_SelectingOptions,
eAppStage_WaitingForVehicleMod,
eAppStage_LaunchingMission
ENDENUM
ENUM IE_VEH_BUYER
IE_BUYER_PRIVATE,
IE_BUYER_SHOWROOM,
IE_BUYER_SPECIALIST
ENDENUM
ENUM enumItemConsumed
inputConsumed_0 = 1000000,
inputConsumed_1 = 2000000,
inputConsumed_OVERLAY_CONFIRM = 101, //OVERLAY_ACCEPT_BUTTON:Number
inputConsumed_OVERLAY_CANCEL = 102, //OVERLAY_CANCEL_BUTTON
inputConsumed_EXPORT_VEHICLES = 1002, //Export button for the selected vehicles
inputConsumed_BUYER_0 = 1007,
inputConsumed_BUYER_1 = 1008,
inputConsumed_BUYER_2 = 1009,
inputConsumed_END = 3000000
ENDENUM
//***********Script variables***********
BOOL bWaitingForCarmodEventToProcess = FALSE
BOOL bConfirmMissionLaunch = FALSE
INT iMissionUnavailableReason = -1
INT iCurrentTabID = ciPageID_VehicleSelection
INT iBS
//Set to a garage ID if we're currently inside an IE warehouse
IMPORT_EXPORT_GARAGES eIEGarageID = IE_GARAGE_INVALID
//The four vehicles we have selected for a sell mission
INT iSelectedMissionVehicles[ciMaxSelectableMissionVehicles]
//The four vehicles we have selected when using the vehicle collection option
INT iSelectedCollectionVehicles[ciMaxSelectableMissionVehicles]
//Players assigned to each of the 4 mission vehicle slots
PLAYER_INDEX piAssignedPlayers[ciMaxSelectableMissionVehicles]
//Selected mission drop off point
VEHICLE_EXPORT_DROPOFF_TYPE eDropOffLocation = VEHICLE_EXPORT_DROPOFF_INVALID
//The vehicle collection we have selected if any
IE_VEHICLE_SET_ID eSelectedVehicleCollection = IE_VEH_SET_INVALID
//Scaleform movie
SCALEFORM_INDEX siMovie
SCALEFORM_RETURN_INDEX currentSelectionReturnIndex
SCALEFORM_RETURN_INDEX currentTabReturnIndex
//Input variables
enumItemConsumed currentButtonPressStage = inputConsumed_1
FLOAT iCursorX = 0.0
FLOAT iCursorY = 0.0
FLOAT iCursorXLast = 0.0
FLOAT iCursorYLast = 0.0
INT iLeftX, iLeftY
INT iRightX, iRightY
INT iIETutorialBS1 = 0
INT iIETutorialBS2 = 0
INT iTutorialHelpTime = 0
INT iTutorialDialogueID = -1
BOOL bOverlayActive = FALSE
APP_STAGES eAppStage = eAppStage_SelectingOptions
structPedsForConversation tutPedStruct
SCRIPT_TIMER stModShopTimeOut
SCRIPT_TIMER stTutorialTimer
//#IF IS_DEBUG_BUILD
//STRUCT IE_APP_DEBUG_WIDGET_VARS
// BOOL bSelectBuyMissionVehicle = FALSE
// BOOL bSetIEVehicleAsOwned = FALSE
// BOOL bClearOwnedIEVehicles = FALSE
//
// INT iVehicleSlider = 1
// INT iStealMisVehSlider = 1
//ENDSTRUCT
//IE_APP_DEBUG_WIDGET_VARS eLocalWidgetVars
//#ENDIF
//***********Script functions***********
PROC CLEANUP_IE_APP(BOOL bDontCleanupBrowserFlag = FALSE, BOOL bEnablePlayerControl = TRUE)
g_bIEAppVisible = bDontCleanupBrowserFlag
DISABLE_CELLPHONE(FALSE)
Unpause_Objective_Text()
SET_SCALEFORM_MOVIE_AS_NO_LONGER_NEEDED(siMovie)
IF bEnablePlayerControl
NET_SET_PLAYER_CONTROL(PLAYER_ID(), TRUE, NSPC_DONT_CLEAR_TASKS_ON_RESUME_CONTROL)
STOP_AUDIO_SCENE("GTAO_Computer_Screen_Active_Scene")
ENDIF
IF IS_PC_VERSION()
AND IS_MULTIHEAD_FADE_UP()
SET_MULTIHEAD_SAFE(FALSE, TRUE, TRUE, TRUE)
ENDIF
THEFEED_RESUME()
TERMINATE_THIS_THREAD()
ENDPROC
PROC SET_CURRENT_PAGE_ID(INT iPageID)
IF iCurrentTabID != iPageID
CPRINTLN(DEBUG_INTERNET, "<APP_IE> SET_CURRENT_PAGE_ID: Moving from page ", iCurrentTabID, " To: ", iPageID)
iCurrentTabID = iPageID
ENDIF
ENDPROC
FUNC BOOL HAS_PLAYER_SELECTED_VEHICLE_SET()
RETURN eSelectedVehicleCollection != IE_VEH_SET_INVALID
ENDFUNC
/// PURPOSE:
/// A count of the local players gang members who are insied the local players IE garage
FUNC INT GET_COUNT_OF_GANG_MEMBERS_INSIDE_IE_GARAGE()
INT i, iCount
IF IS_PLAYER_IN_IE_GARAGE(PLAYER_ID())
iCount ++
ENDIF
REPEAT GB_MAX_GANG_GOONS i
IF GlobalplayerBD_FM_3[NATIVE_TO_INT(PLAYER_ID())].sMagnateGangBossData.GangMembers[i] != INVALID_PLAYER_INDEX()
IF IS_PLAYER_IN_IE_GARAGE(GlobalplayerBD_FM_3[NATIVE_TO_INT(PLAYER_ID())].sMagnateGangBossData.GangMembers[i])
AND IS_NET_PLAYER_OK(GlobalplayerBD_FM_3[NATIVE_TO_INT(PLAYER_ID())].sMagnateGangBossData.GangMembers[i], TRUE, TRUE)
AND NOT IS_PLAYER_WALKING_IN_OR_OUT_OF_SIMPLE_INTERIOR(GlobalplayerBD_FM_3[NATIVE_TO_INT(PLAYER_ID())].sMagnateGangBossData.GangMembers[i])
iCount ++
ENDIF
ENDIF
ENDREPEAT
RETURN iCount
ENDFUNC
/// PURPOSE:
/// Returns the count of vehicles we are trying to sell
FUNC INT GET_COUNT_OF_VEHICLES_SELCTED_FOR_SELL_MISSION(BOOL bVehCollection)
INT i, iCount
REPEAT ciMaxSelectableMissionVehicles i
IF NOT bVehCollection
IF iSelectedMissionVehicles[i] != 0
iCount ++
ENDIF
ELSE
IF iSelectedCollectionVehicles[i] != 0
iCount ++
ENDIF
ENDIF
ENDREPEAT
RETURN iCount
ENDFUNC
/// PURPOSE:
/// Returns a string to give mission unavailable feedback
FUNC TEXT_LABEL_15 GET_MISSION_UNAVAILABLE_REASON_TEXT_LABEL(BOOL bSellingVehSet)
TEXT_LABEL_15 tlReturnLabel
SWITCH iMissionUnavailableReason
CASE GB_MU_REASON_UNSUITABLE_SESSION tlReturnLabel = "AH_SES" RETURN tlReturnLabel
CASE ciFailReasonCriticalToJob tlReturnLabel = "AH_CRIT" RETURN tlReturnLabel
CASE ciFailReasonNotBoss tlReturnLabel = "AH_NBOSS" RETURN tlReturnLabel
CASE ciFailReasonBikerBoss tlReturnLabel = "AH_NBOSS" RETURN tlReturnLabel
CASE ciFailReasonCloudSaveFail tlReturnLabel = "AH_SAVING_DOWN" RETURN tlReturnLabel
CASE ciFailReasonTooFewPlayers
tlReturnLabel = "AH_NEPLYRS"
tlReturnLabel += GET_COUNT_OF_VEHICLES_SELCTED_FOR_SELL_MISSION(bSellingVehSet)
RETURN tlReturnLabel
CASE ciFailReasonGoonAnimal
IF GB_IS_PLAYER_BOSS_OF_A_BIKER_GANG(PLAYER_ID())
tlReturnLabel = "GENERAL_MLF_G1"
ELIF DOES_PLAYER_OWN_OFFICE(PLAYER_ID())
tlReturnLabel = "GENERAL_MLF_G2"
ELSE
tlReturnLabel = "GENERAL_MLF_G3"
ENDIF
RETURN tlReturnLabel
CASE ciFailReasonGoonGambling
IF GB_IS_PLAYER_BOSS_OF_A_BIKER_GANG(PLAYER_ID())
tlReturnLabel = "GENERAL_MLF_G4"
ELIF DOES_PLAYER_OWN_OFFICE(PLAYER_ID())
tlReturnLabel = "GENERAL_MLF_G5"
ELSE
tlReturnLabel = "GENERAL_MLF_G6"
ENDIF
RETURN tlReturnLabel
BREAK
ENDSWITCH
IF NETWORK_IS_ACTIVITY_SESSION()
tlReturnLabel = "AH_SES" RETURN tlReturnLabel
ENDIF
tlReturnLabel = "AH_SELL_NA" RETURN tlReturnLabel
ENDFUNC
/// PURPOSE:
/// Returns true if we need to block a mission launch because we can't save at the moment
FUNC BOOL BLOCK_MISSION_LAUNCH_FOR_SAVE_ISSUES()
IF g_bAllowSaveTroubleIESellMissionBloker
AND IS_SAVING_HAVING_TROUBLE()
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Sets the mission unavailable value
FUNC BOOL CAN_PLAYER_LAUNCH_MISSION(BOOL bSellingVehSet, BOOL bCheckAssignedPlayers = FALSE)
//Check we own an IE WH
IF NOT DOES_PLAYER_OWN_AN_IE_GARAGE(PLAYER_ID())
#IF IS_DEBUG_BUILD
AND NOT GET_COMMANDLINE_PARAM_EXISTS("sc_AllowRemoteMissionLaunch")
#ENDIF
CPRINTLN(DEBUG_INTERNET, "<APP_IE> CAN_PLAYER_LAUNCH_MISSION: mission launch failed, no owned IE WH")
iMissionUnavailableReason = ciFailReasonNoWH
RETURN FALSE
ENDIF
// Check that mission is available
IF NOT GB_IS_BOSS_MISSION_AVAILABLE(PLAYER_ID(), FMMC_TYPE_VEHICLE_EXPORT_SELL, FALSE)
CPRINTLN(DEBUG_INTERNET, "<APP_IE> CAN_PLAYER_LAUNCH_MISSION: mission launch failed, mission unavailable")
iMissionUnavailableReason = GB_GET_BOSS_MISSION_UNAVAILABLE_REASON(PLAYER_ID(), FMMC_TYPE_VEHICLE_EXPORT_SELL, FALSE)
IF iMissionUnavailableReason = GB_MU_REASON_GOON_GAMBLING
iMissionUnavailableReason = ciFailReasonGoonGambling
ELIF iMissionUnavailableReason = GB_MU_REASON_GOON_IS_ANIMAL
iMissionUnavailableReason = ciFailReasonGoonAnimal
ENDIF
RETURN FALSE
ENDIF
IF NOT GB_IS_PLAYER_BOSS_OF_A_GANG(PLAYER_ID())
#IF IS_DEBUG_BUILD
AND NOT GET_COMMANDLINE_PARAM_EXISTS("sc_AllowRemoteMissionLaunch")
#ENDIF
CPRINTLN(DEBUG_INTERNET, "<APP_IE> CAN_PLAYER_LAUNCH_MISSION: mission launch failed, GB_IS_PLAYER_BOSS_OF_A_GANG is false")
iMissionUnavailableReason = ciFailReasonNotBoss
RETURN FALSE
ENDIF
IF GB_IS_PLAYER_BOSS_OF_A_BIKER_GANG(PLAYER_ID())
CPRINTLN(DEBUG_INTERNET, "<APP_IE> CAN_PLAYER_LAUNCH_MISSION: mission launch failed, GB_IS_PLAYER_BOSS_OF_A_BIKER_GANG is true")
iMissionUnavailableReason = ciFailReasonBikerBoss
RETURN FALSE
ENDIF
// Check we're not taking part in something
IF GB_IS_PLAYER_CRITICAL_TO_JOB(PLAYER_ID())
CPRINTLN(DEBUG_INTERNET, "<APP_IE> CAN_PLAYER_LAUNCH_MISSION: mission launch failed, player critical to job")
iMissionUnavailableReason = ciFailReasonCriticalToJob
RETURN FALSE
ENDIF
IF NETWORK_IS_ACTIVITY_SESSION()
CPRINTLN(DEBUG_INTERNET, "<APP_IE> CAN_PLAYER_LAUNCH_MISSION: mission launch failed, NETWORK_IS_ACTIVITY_SESSION is true")
iMissionUnavailableReason = GB_MU_REASON_UNSUITABLE_SESSION
RETURN FALSE
ENDIF
IF GET_COUNT_OF_GANG_MEMBERS_INSIDE_IE_GARAGE() < GET_COUNT_OF_VEHICLES_SELCTED_FOR_SELL_MISSION(bSellingVehSet)
CPRINTLN(DEBUG_INTERNET, "<APP_IE> CAN_PLAYER_LAUNCH_MISSION: mission launch failed, Too few players in the building")
iMissionUnavailableReason = ciFailReasonTooFewPlayers
RETURN FALSE
ENDIF
IF BLOCK_MISSION_LAUNCH_FOR_SAVE_ISSUES()
CPRINTLN(DEBUG_INTERNET, "<APP_IE> CAN_PLAYER_LAUNCH_MISSION: mission launch failed due to save failure")
iMissionUnavailableReason = ciFailReasonCloudSaveFail
RETURN FALSE
ENDIF
//Checks all assigned players to make sure we still have the players assigned to a vehicle
IF bCheckAssignedPlayers
INT i
REPEAT MAX_NUMBER_OF_IE_PLAYERS i
PLAYER_INDEX piPlayerToCheck = INT_TO_NATIVE(PLAYER_INDEX, g_sIEVehicleSetupStruct[i].iPlayerIndex)
IF piPlayerToCheck != INVALID_PLAYER_INDEX()
IF NOT NETWORK_IS_PLAYER_CONNECTED(piPlayerToCheck)
OR NOT IS_NET_PLAYER_OK(piPlayerToCheck)
OR NOT IS_PLAYER_IN_IE_GARAGE(piPlayerToCheck)
OR IS_PLAYER_WALKING_IN_OR_OUT_OF_SIMPLE_INTERIOR(piPlayerToCheck)
IF g_sIEVehicleSetupStruct[i].iIEPlayerVehicle = 0
OR g_sIEVehicleSetupStruct[i].iIEPlayerVehicle = -1
CPRINTLN(DEBUG_INTERNET, "<APP_IE> CAN_PLAYER_LAUNCH_MISSION: mission launching, Assigned player is not ok or not in IE WH: ", GET_PLAYER_NAME(piPlayerToCheck), " Continuing launch as they were not assigned a vehicle.")
ELSE
CPRINTLN(DEBUG_INTERNET, "<APP_IE> CAN_PLAYER_LAUNCH_MISSION: mission launch failed, Assigned player is not ok: ", GET_PLAYER_NAME(piPlayerToCheck))
iMissionUnavailableReason = ciFailReasonTooFewPlayers
RETURN FALSE
ENDIF
ENDIF
ENDIF
ENDREPEAT
ENDIF
RETURN TRUE
ENDFUNC
PROC IE_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
/// PURPOSE:
/// Fills a slot with a player ID to be used when launching the mission
PROC ASSIGN_GANG_MEMBER_TO_SLOT(INT iSlot, PLAYER_INDEX piGangMember)
IF piGangMember = INVALID_PLAYER_INDEX()
CASSERTLN(DEBUG_INTERNET, "ASSIGN_GANG_MEMBER_TO_SLOT: Trying to assign an invalid player to slot: ", iSlot)
ENDIF
piAssignedPlayers[iSlot] = piGangMember
ENDPROC
/// PURPOSE:
/// Clears the list of players selected for the mission (Sell missions)
PROC REMOVE_ALL_GANG_MEMBERS_FROM_VEH_SLOT()
INT i
REPEAT ciMaxSelectableMissionVehicles i
piAssignedPlayers[i] = INVALID_PLAYER_INDEX()
ENDREPEAT
ENDPROC
/// PURPOSE:
/// Returns a count of the gang members we have assigned to vehicles
FUNC INT GET_COUNT_OF_ASSIGNED_GANG_MEMBERS()
INT i, iCount
REPEAT ciMaxSelectableMissionVehicles i
IF piAssignedPlayers[i] != INVALID_PLAYER_INDEX()
iCount ++
ENDIF
ENDREPEAT
RETURN iCount
ENDFUNC
/// PURPOSE:
/// Checks if we have already assigned the specified player to a vehicle
FUNC BOOL IS_GANG_MEMBER_ASSIGNED_TO_VEHICLE(PLAYER_INDEX piGangMember)
INT i
REPEAT ciMaxSelectableMissionVehicles i
IF piAssignedPlayers[i] = piGangMember
RETURN TRUE
ENDIF
ENDREPEAT
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Loops through the local players gang members to find any players we have not yet assigned to a vehicle
PROC BUILD_LIST_OF_AVAILABLE_GANG_MEMBERS(PLAYER_INDEX &piGang[])
INT i, iSlotToAssign
INT iMaximumPlayers = ciMaxSelectableMissionVehicles
IF NOT IS_GANG_MEMBER_ASSIGNED_TO_VEHICLE(PLAYER_ID())
piGang[iSlotToAssign] = PLAYER_ID()
iSlotToAssign ++
iMaximumPlayers --
ENDIF
REPEAT iMaximumPlayers i
IF GlobalplayerBD_FM_3[NATIVE_TO_INT(PLAYER_ID())].sMagnateGangBossData.GangMembers[i] != INVALID_PLAYER_INDEX()
AND IS_NET_PLAYER_OK(GlobalplayerBD_FM_3[NATIVE_TO_INT(PLAYER_ID())].sMagnateGangBossData.GangMembers[i], TRUE, TRUE)
AND NOT IS_GANG_MEMBER_ASSIGNED_TO_VEHICLE(GlobalplayerBD_FM_3[NATIVE_TO_INT(PLAYER_ID())].sMagnateGangBossData.GangMembers[i])
AND IS_PLAYER_IN_IE_GARAGE(GlobalplayerBD_FM_3[NATIVE_TO_INT(PLAYER_ID())].sMagnateGangBossData.GangMembers[i])
AND NOT IS_PLAYER_WALKING_IN_OR_OUT_OF_SIMPLE_INTERIOR(GlobalplayerBD_FM_3[NATIVE_TO_INT(PLAYER_ID())].sMagnateGangBossData.GangMembers[i])
piGang[iSlotToAssign] = GlobalplayerBD_FM_3[NATIVE_TO_INT(PLAYER_ID())].sMagnateGangBossData.GangMembers[i]
iSlotToAssign ++
ELSE
piGang[iSlotToAssign] = INVALID_PLAYER_INDEX()
ENDIF
ENDREPEAT
ENDPROC
PROC REMOVE_ALL_SELECTED_VEHICLES(BOOL bVehCollection, BOOL bSendToSF = FALSE)
INT i
REPEAT ciMaxSelectableMissionVehicles i
IF NOT bVehCollection
iSelectedMissionVehicles[i] = 0
ELSE
iSelectedCollectionVehicles[i] = 0
ENDIF
ENDREPEAT
IF bSendToSF
CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(siMovie, "SET_INPUT_EVENT", TO_FLOAT(ENUM_TO_INT(eSelectedVehicleCollection)))
ENDIF
CPRINTLN(DEBUG_INTERNET, "<APP_IE> REMOVE_ALL_SELECTED_VEHICLES Removed all vehicles")
ENDPROC
/// PURPOSE:
/// Returns a count of unassigned gang members
FUNC INT GET_COUNT_OF_GANG_MEMBERS_TO_ASSIGN()
INT iAssigned = GET_COUNT_OF_ASSIGNED_GANG_MEMBERS()
INT iGangSize = GET_COUNT_OF_GANG_MEMBERS_INSIDE_IE_GARAGE()
RETURN (iGangSize - iAssigned)
ENDFUNC
/// PURPOSE:
/// Adds the specified vehicle to the selected vehicle array.
/// This array is used when launching a mission
PROC ADD_SCALEFORM_SELECTED_VEHICLE(INT iVehicleID, BOOL bVehCollection)
INT i
REPEAT ciMaxSelectableMissionVehicles i
IF bVehCollection
IF iSelectedCollectionVehicles[i] = 0
iSelectedCollectionVehicles[i] = iVehicleID
CPRINTLN(DEBUG_INTERNET, "<APP_IE> ADD_SCALEFORM_SELECTED_VEHICLE added vehicle to collection array ", iVehicleID)
EXIT
ENDIF
ELSE
IF iSelectedMissionVehicles[i] = 0
iSelectedMissionVehicles[i] = iVehicleID
CPRINTLN(DEBUG_INTERNET, "<APP_IE> ADD_SCALEFORM_SELECTED_VEHICLE added vehicle ", iVehicleID)
EXIT
ENDIF
ENDIF
ENDREPEAT
CASSERTLN(DEBUG_INTERNET, "ADD_SCALEFORM_SELECTED_VEHICLE no free vehicle slots available!")
ENDPROC
/// PURPOSE:
/// Removes the specified vehicle from the selected vehicle array. Shuffles the vehicle to the end of the list first.
/// This array is used when launching a mission
/// Does not update the SF movie like: REMOVE_LAST_SF_SELECTED_VEHICLE
PROC REMOVE_SCALEFORM_SELECTED_VEHICLE(INT iVehicleID)
INT i
IF iVehicleID > ciVehicleSelectionOffset
iVehicleID -= ciVehicleSelectionOffset
ENDIF
REPEAT ciMaxSelectableMissionVehicles i
IF i = (ciMaxSelectableMissionVehicles - 1)
//Remove this vehicle
iSelectedMissionVehicles[i] = 0
CPRINTLN(DEBUG_INTERNET, "<APP_IE> REMOVE_SCALEFORM_SELECTED_VEHICLE (1) Removed vehicle ", iVehicleID)
ELIF iSelectedMissionVehicles[i] = iVehicleID
IF iSelectedMissionVehicles[(i + 1)] != 0
//Shuffle this one up the list to be removed at the end
iSelectedMissionVehicles[i] = iSelectedMissionVehicles[(i + 1)]
iSelectedMissionVehicles[(i + 1)] = iVehicleID
ELSE
CPRINTLN(DEBUG_INTERNET, "<APP_IE> REMOVE_SCALEFORM_SELECTED_VEHICLE (2) Removed vehicle ", iVehicleID)
iSelectedMissionVehicles[i] = 0
EXIT
ENDIF
ENDIF
ENDREPEAT
ENDPROC
/// PURPOSE:
/// Looks for the specified vehicle in the selected vehicle array
FUNC BOOL IS_VEHICLE_SELECTED(INT iVehicleID, BOOL bVehCollection)
INT i
INT iVehicleIdToCheck = iVehicleID
//Check for the offset we apply when a vehicle is in the selection window
IF iVehicleID > ciVehicleSelectionOffset
iVehicleIdToCheck -= ciVehicleSelectionOffset
ENDIF
REPEAT ciMaxSelectableMissionVehicles i
IF bVehCollection
IF iSelectedCollectionVehicles[i] = iVehicleIdToCheck
RETURN TRUE
ENDIF
ELSE
IF iSelectedMissionVehicles[i] = iVehicleIdToCheck
RETURN TRUE
ENDIF
ENDIF
ENDREPEAT
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Version of the function above to be used with the new SF movie.
/// Assigns the players in order of the gang members array. Always boss first.
PROC ASSIGN_GANG_MEMBERS_TO_MISSION_VEHICLES(BOOL bVehCollection)
INT i
PLAYER_INDEX piUnassignedPlayers[ciMaxSelectableMissionVehicles]
REPEAT ciMaxSelectableMissionVehicles i
IF NOT bVehCollection
AND iSelectedMissionVehicles[i] != 0
OR bVehCollection
AND iSelectedCollectionVehicles[i] != 0
IF i = 0
//Assign the boss to the first vehicle
piAssignedPlayers[i] = PLAYER_ID()
ELSE
//Assign any remaining gang members so they launch the mission correctly
BUILD_LIST_OF_AVAILABLE_GANG_MEMBERS(piUnassignedPlayers)
piAssignedPlayers[i] = piUnassignedPlayers[0]
ENDIF
ENDIF
ENDREPEAT
ENDPROC
/// PURPOSE:
/// Assigns the (up to) 4 vehicles from the specified collection to the mission vehicles list
PROC ASSIGN_COLLECTION_VEHICLES(IE_VEHICLE_SET_ID eCollectionID)
IE_VEHICLE_SET_DATA eCollectionData
FILL_IE_VEHICLE_SET_STRUCT(eCollectionData, eCollectionID)
INT i
REPEAT ciMaxSelectableMissionVehicles i
ADD_SCALEFORM_SELECTED_VEHICLE(ENUM_TO_INT(eCollectionData.eCollectionVehicles[i]), TRUE)
ENDREPEAT
CPRINTLN(DEBUG_INTERNET, "<APP_IE> ASSIGN_COLLECTION_VEHICLES added collection: ", eCollectionID)
ENDPROC
/// PURPOSE:
/// Removes the last selected vehicle from the array and sends a call to update the UI
PROC REMOVE_LAST_SF_SELECTED_VEHICLE()
INT i
FOR i = (ciMaxSelectableMissionVehicles -1) TO 0 STEP -1
IF iSelectedMissionVehicles[i] != 0
CPRINTLN(DEBUG_INTERNET, "<APP_IE> REMOVE_LAST_SF_SELECTED_VEHICLE Removed vehicle ", iSelectedMissionVehicles[i])
CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(siMovie, "SET_INPUT_EVENT", TO_FLOAT(iSelectedMissionVehicles[i]))
iSelectedMissionVehicles[i] = 0
BREAKLOOP
ENDIF
ENDFOR
ENDPROC
FUNC INT GET_EXPORT_VALUE_OF_SELECTED_MISSION_VEHICLES(IE_DROPOFF eDropOff, BOOL bModCostOnly = FALSE)
INT i, iVehicleValue
REPEAT ciMaxSelectableMissionVehicles i
IF iSelectedMissionVehicles[i] != 0
IE_VEHICLE_ENUM eVehicle = INT_TO_ENUM(IE_VEHICLE_ENUM, iSelectedMissionVehicles[i])
iVehicleValue += GET_VEHICLE_EXPORT_VEHICLE_BASE_VALUE(GET_MODEL_NAME_FROM_IE_VEHICLE(eVehicle), eDropOff, bModCostOnly)
ENDIF
ENDREPEAT
RETURN iVehicleValue
ENDFUNC
/// PURPOSE:
/// Shows a popup message over the top of the current screen
/// PARAMS:
/// sTitleBar - Top bar textlable
/// sDescription - Description text label
/// sButton1 - Left side button text label (Moves to center if "" is passed for sButton2
/// sButton2 - Pass "" to show no button. Right side button text label
PROC START_OVERLAY_SCREEN(STRING sTitleBar, STRING sDescription, String sButton1, String sButton2, INT iAdditionalINT = -1, INT iSecondAdditionalINT = -1)
BEGIN_SCALEFORM_MOVIE_METHOD(siMovie, "SHOW_OVERLAY")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING(sTitleBar)
BEGIN_TEXT_COMMAND_SCALEFORM_STRING(sDescription)
IF iAdditionalINT != -1
ADD_TEXT_COMPONENT_INTEGER(iadditionalINT)
ENDIF
IF iSecondAdditionalINT != -1
ADD_TEXT_COMPONENT_INTEGER(iSecondAdditionalINT)
ENDIF
END_TEXT_COMMAND_SCALEFORM_STRING()
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING(sButton1)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING(sButton2)
END_SCALEFORM_MOVIE_METHOD()
bOverlayActive = TRUE
ENDPROC
PROC CLOSE_OVERLAY_SCREEN()
BEGIN_SCALEFORM_MOVIE_METHOD(siMovie, "HIDE_OVERLAY")
END_SCALEFORM_MOVIE_METHOD()
bOverlayActive = FALSE
IF bConfirmMissionLaunch
CPRINTLN(DEBUG_INTERNET, "<APP_IE> CLOSE_OVERLAY_SCREEN setting bConfirmMissionLaunch to FALSE")
bConfirmMissionLaunch = FALSE
ENDIF
ENDPROC
FUNC BOOL IS_IE_VEH_BUYER_DISABLED(IE_VEH_BUYER eBuyerID)
IF BLOCK_MISSION_LAUNCH_FOR_SAVE_ISSUES()
RETURN TRUE
ENDIF
IF eBuyerID = IE_BUYER_PRIVATE
RETURN g_sMPTunables.bIMPEXP_SELL_DISABLE_BUYER1
ELIF eBuyerID = IE_BUYER_SHOWROOM
RETURN g_sMPTunables.bIMPEXP_SELL_DISABLE_BUYER2
ELIF eBuyerID = IE_BUYER_SPECIALIST
RETURN g_sMPTunables.bIMPEXP_SELL_DISABLE_BUYER3
ENDIF
RETURN FALSE
ENDFUNC
PROC SHOW_EXPORT_BUYERS_SCREEN()
INT iPrivateBuyerOffer = GET_EXPORT_VALUE_OF_SELECTED_MISSION_VEHICLES(IE_DROPOFF_PRIVATE_BUYER_1)
INT iShowroomOffer = GET_EXPORT_VALUE_OF_SELECTED_MISSION_VEHICLES(IE_DROPOFF_SHOWROOM_1)
INT iSpecialistOffer = GET_EXPORT_VALUE_OF_SELECTED_MISSION_VEHICLES(IE_DROPOFF_GANGSTER_1)
INT iPrivateBuyerModCost = GET_EXPORT_VALUE_OF_SELECTED_MISSION_VEHICLES(IE_DROPOFF_PRIVATE_BUYER_1, TRUE)
INT iShowroomBuyerModCost = GET_EXPORT_VALUE_OF_SELECTED_MISSION_VEHICLES(IE_DROPOFF_SHOWROOM_1, TRUE)
INT iSpecialistBuyerModCost = GET_EXPORT_VALUE_OF_SELECTED_MISSION_VEHICLES(IE_DROPOFF_GANGSTER_1, TRUE)
BOOL bCanAffordPrivate = TRUE
BOOL bCanAffordShowroom = TRUE
BOOl bCanAffordSpecialist = TRUE
IF iPrivateBuyerModCost > 0
AND NOT NETWORK_CAN_SPEND_MONEY(iPrivateBuyerModCost, FALSE, TRUE, FALSE)
OR IS_IE_VEH_BUYER_DISABLED(IE_BUYER_PRIVATE)
bCanAffordPrivate = FALSE
ENDIF
IF iShowroomBuyerModCost > 0
AND NOT NETWORK_CAN_SPEND_MONEY(iShowroomBuyerModCost, FALSE, TRUE, FALSE)
OR IS_IE_VEH_BUYER_DISABLED(IE_BUYER_SHOWROOM)
bCanAffordShowroom = FALSE
ENDIF
IF iSpecialistBuyerModCost > 0
AND NOT NETWORK_CAN_SPEND_MONEY(iSpecialistBuyerModCost, FALSE, TRUE, FALSE)
OR IS_IE_VEH_BUYER_DISABLED(IE_BUYER_SPECIALIST)
bCanAffordSpecialist = FALSE
ENDIF
BEGIN_SCALEFORM_MOVIE_METHOD(siMovie, "SHOW_BUYERS")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(iPrivateBuyerModCost)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(iShowroomBuyerModCost)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(iSpecialistBuyerModCost)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(iPrivateBuyerOffer)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(iShowroomOffer)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(iSpecialistOffer)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_BOOL(bCanAffordPrivate)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_BOOL(bCanAffordShowroom)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_BOOL(bCanAffordSpecialist)
END_SCALEFORM_MOVIE_METHOD()
SET_CURRENT_PAGE_ID(ciPageID_Buyers)
ENDPROC
/// PURPOSE:
/// Sends data about a specific IE vehilce to SF
PROC PASS_VEHICLE_DATA_TO_SCALEFORM(IE_VEHICLE_ENUM eVehicle, BOOL bForceSelected = FALSE)
INT iVehicleSaleValue = GET_VEHICLE_EXPORT_VEHICLE_BASE_VALUE(GET_MODEL_NAME_FROM_IE_VEHICLE(eVehicle), IE_DROPOFF_PRIVATE_BUYER_1)
INT iVehicleCollectionValue = GET_VEHICLE_EXPORT_VEHICLE_BASE_VALUE(GET_MODEL_NAME_FROM_IE_VEHICLE(eVehicle), IE_DROPOFF_GANGSTER_1, FALSE, FALSE, TRUE)
INT iVehMarketValue = GET_VEHICLE_EXPORT_VEHICLE_BASE_VALUE(GET_MODEL_NAME_FROM_IE_VEHICLE(eVehicle), IE_DROPOFF_PRIVATE_BUYER_1, FALSE, TRUE)
INT iVehicleCategory = ciVehicleCategoryStandard
IF iVehicleSaleValue >= g_sMPTunables.iIMPEXP_SELL_BUYER1_OFFER_HARD
iVehicleCategory = ciVehicleCategoryTop
ELIF iVehicleSaleValue >= g_sMPTunables.iIMPEXP_SELL_BUYER1_OFFER_MED
iVehicleCategory = ciVehicleCategoryMid
ENDIF
BEGIN_SCALEFORM_MOVIE_METHOD(siMovie, "UPDATE_VEHICLE")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(ENUM_TO_INT(eVehicle)) // Vehicle ID
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(iVehicleSaleValue) // Vehicle value
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(iVehicleCollectionValue) // Vehicle value when selling it as part of a collection
SCALEFORM_MOVIE_METHOD_ADD_PARAM_BOOL(bForceSelected) // in case we need to force select a certain car
SCALEFORM_MOVIE_METHOD_ADD_PARAM_BOOL(TRUE) // Do we own it? (passing true because this is setup to only call this method for vehicles we own)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(iVehicleCategory) // Standard, mid range or top class?
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(iVehMarketValue) // The vehicles market value
END_SCALEFORM_MOVIE_METHOD()
CPRINTLN(DEBUG_INTERNET, "<APP_IE> PASS_VEHICLE_DATA_TO_SCALEFORM passing owned vehicle: ", eVehicle, " value: ", iVehicleSaleValue, " iVehicleCollectionValue: ", iVehicleCollectionValue, " iVehMarketValue: ", iVehMarketValue)
ENDPROC
/// PURPOSE:
/// Passes data about the vehicle groups to SF
PROC PASS_COLLECTION_DATA_TO_SCALEFORM(INT iVehicleCollectionID)
IF IS_VEH_SET_DISABLED(INT_TO_ENUM(IE_VEHICLE_SET_ID, iVehicleCollectionID))
CDEBUG1LN(DEBUG_INTERNET, "IS_VEH_SET_DISABLED true vor set: ", iVehicleCollectionID)
EXIT
ENDIF
INT iCollectionSaleValue = GET_IE_VEH_SET_BONUS_SELL_REWARD(INT_TO_ENUM(IE_VEHICLE_SET_ID, iVehicleCollectionID), 1)
BEGIN_SCALEFORM_MOVIE_METHOD(siMovie, "UPDATE_COLLECTION")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(iVehicleCollectionID) // Vehicle collection ID
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(iCollectionSaleValue) // Collection value
SCALEFORM_MOVIE_METHOD_ADD_PARAM_BOOL(FALSE) // Is this collection of vehicles disabled
END_SCALEFORM_MOVIE_METHOD()
CPRINTLN(DEBUG_INTERNET, "<APP_IE> PASS_COLLECTION_DATA_TO_SCALEFORM passing vehicle collection data: ", iVehicleCollectionID, " value: ", iCollectionSaleValue)
ENDPROC
PROC SHOW_EXPORT_VEHICLE_SELECTION_SCREEN()
BEGIN_SCALEFORM_MOVIE_METHOD(siMovie, "SHOW_EXPORT_SCREEN")
END_SCALEFORM_MOVIE_METHOD()
ENDPROC
PROC RUN_CANCEL_PRESS_CHECKS()
IF bOverlayActive
CLOSE_OVERLAY_SCREEN()
ELIF iCurrentTabID = ciPageID_Buyers
SET_CURRENT_PAGE_ID(ciPageID_VehicleSelection)
ELIF HAS_PLAYER_SELECTED_VEHICLE_SET()
AND iCurrentTabID = ciPageID_Collection
REMOVE_ALL_SELECTED_VEHICLES(TRUE, TRUE)
eSelectedVehicleCollection = IE_VEH_SET_INVALID
ELIF GET_COUNT_OF_VEHICLES_SELCTED_FOR_SELL_MISSION(FALSE) > 0
AND iCurrentTabID = ciPageID_VehicleSelection
REMOVE_LAST_SF_SELECTED_VEHICLE()
ELSE
CPRINTLN(DEBUG_INTERNET,"<APP_IE> EXITING WEBSITE")
CLEANUP_IE_APP()
ENDIF
ENDPROC
PROC PASS_DPAD_INPUTS_TO_SCALEFORM()
ENABLE_CONTROL_ACTION(FRONTEND_CONTROL, INPUT_FRONTEND_UP)
IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_UP)
CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(siMovie, "SET_INPUT_EVENT", TO_FLOAT(ENUM_TO_INT(INPUT_FRONTEND_UP)))
ENDIF
ENABLE_CONTROL_ACTION(FRONTEND_CONTROL, INPUT_FRONTEND_DOWN)
IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_DOWN)
CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(siMovie, "SET_INPUT_EVENT", TO_FLOAT(ENUM_TO_INT(INPUT_FRONTEND_DOWN)))
ENDIF
ENABLE_CONTROL_ACTION(FRONTEND_CONTROL, INPUT_FRONTEND_LEFT)
IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_LEFT)
CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(siMovie, "SET_INPUT_EVENT", TO_FLOAT(ENUM_TO_INT(INPUT_FRONTEND_LEFT)))
ENDIF
ENABLE_CONTROL_ACTION(FRONTEND_CONTROL, INPUT_FRONTEND_RIGHT)
IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_RIGHT)
CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(siMovie, "SET_INPUT_EVENT", TO_FLOAT(ENUM_TO_INT(INPUT_FRONTEND_RIGHT)))
ENDIF
ENDPROC
PROC PASS_ANALOGUE_STICK_INPUTS_TO_SF(BOOL BPassInLeftStickInput, BOOL BPassInRightStickInput)
IF BPassInLeftStickInput
ENABLE_CONTROL_ACTION(FRONTEND_CONTROL, INPUT_FRONTEND_AXIS_X)
ENABLE_CONTROL_ACTION(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(siMovie, "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)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_BOOL(FALSE)
END_SCALEFORM_MOVIE_METHOD()
ENDIF
ENDIF
IF BPassInRightStickInput
ENABLE_CONTROL_ACTION(FRONTEND_CONTROL, INPUT_FRONTEND_RIGHT_AXIS_X)
ENABLE_CONTROL_ACTION(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(siMovie, "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
ENDIF
ENDPROC
PROC PASS_CURSOR_INPUT_TO_SF()
iCursorX = GET_DISABLED_CONTROL_NORMAL( FRONTEND_CONTROL, INPUT_CURSOR_X )
iCursorY = GET_DISABLED_CONTROL_NORMAL( FRONTEND_CONTROL, INPUT_CURSOR_Y )
IF iCursorX != iCursorXLast
OR iCursorY != iCursorYLast
BEGIN_SCALEFORM_MOVIE_METHOD(siMovie, "SET_MOUSE_INPUT")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_FLOAT(iCursorX)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_FLOAT(iCursorY)
END_SCALEFORM_MOVIE_METHOD()
iCursorXLast = iCursorX
iCursorYLast = iCursorY
ENDIF
ENABLE_CONTROL_ACTION(FRONTEND_CONTROL, INPUT_CURSOR_ACCEPT)
IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_CURSOR_ACCEPT)
CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(siMovie, "SET_INPUT_EVENT", TO_FLOAT(ENUM_TO_INT(INPUT_CURSOR_ACCEPT)))
ENDIF
ENABLE_CONTROL_ACTION(FRONTEND_CONTROL, INPUT_CURSOR_CANCEL)
IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_CURSOR_CANCEL)
CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(siMovie, "SET_INPUT_EVENT", TO_FLOAT(ENUM_TO_INT(INPUT_FRONTEND_CANCEL)))
RUN_CANCEL_PRESS_CHECKS()
ENDIF
ENDPROC
PROC PASS_INPUTS_TO_SCALEFORM()
ENABLE_CONTROL_ACTION(FRONTEND_CONTROL, INPUT_FRONTEND_LB)
IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_LB)
IF NOT bOverlayActive
SET_CURRENT_PAGE_ID(ciPageID_VehicleSelection)
CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(siMovie, "SET_INPUT_EVENT", TO_FLOAT(ENUM_TO_INT(INPUT_FRONTEND_LB)))
ENDIF
ENDIF
ENABLE_CONTROL_ACTION(FRONTEND_CONTROL, INPUT_FRONTEND_RB)
IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_RB)
IF NOT bOverlayActive
SET_CURRENT_PAGE_ID(ciPageID_Collection)
CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(siMovie, "SET_INPUT_EVENT", TO_FLOAT(ENUM_TO_INT(INPUT_FRONTEND_RB)))
ENDIF
ENDIF
// NB: Using IS_CONTROL_PRESSED for continuous zooming out on map.
ENABLE_CONTROL_ACTION(FRONTEND_CONTROL, INPUT_FRONTEND_LT)
IF IS_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_LT)
CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(siMovie, "SET_INPUT_EVENT", TO_FLOAT(ENUM_TO_INT(INPUT_FRONTEND_LT)))
ENDIF
IF IS_CONTROL_JUST_RELEASED(FRONTEND_CONTROL, INPUT_FRONTEND_LT)
CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(siMovie, "SET_INPUT_RELEASE_EVENT", TO_FLOAT(ENUM_TO_INT(INPUT_FRONTEND_LT)))
ENDIF
// NB: Using IS_CONTROL_PRESSED for continuous zooming in on map.
ENABLE_CONTROL_ACTION(FRONTEND_CONTROL, INPUT_FRONTEND_RT)
IF IS_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_RT)
CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(siMovie, "SET_INPUT_EVENT", TO_FLOAT(ENUM_TO_INT(INPUT_FRONTEND_RT)))
ENDIF
IF IS_CONTROL_JUST_RELEASED(FRONTEND_CONTROL, INPUT_FRONTEND_RT)
CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(siMovie, "SET_INPUT_RELEASE_EVENT", TO_FLOAT(ENUM_TO_INT(INPUT_FRONTEND_RT)))
ENDIF
PASS_DPAD_INPUTS_TO_SCALEFORM()
ENABLE_CONTROL_ACTION(FRONTEND_CONTROL, INPUT_FRONTEND_ACCEPT)
IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_ACCEPT)
CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(siMovie, "SET_INPUT_EVENT", TO_FLOAT(ENUM_TO_INT(INPUT_FRONTEND_ACCEPT)))
ENDIF
ENABLE_CONTROL_ACTION(FRONTEND_CONTROL, INPUT_FRONTEND_CANCEL)
IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_CANCEL)
CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(siMovie, "SET_INPUT_EVENT", TO_FLOAT(ENUM_TO_INT(INPUT_FRONTEND_CANCEL)))
ENDIF
IF IS_CONTROL_JUST_RELEASED(FRONTEND_CONTROL, INPUT_FRONTEND_CANCEL)
CPRINTLN(DEBUG_INTERNET,"<APP_IE> PASS_INPUTS_TO_SCALEFORM INPUT_FRONTEND_CANCEL")
RUN_CANCEL_PRESS_CHECKS()
ENDIF
ENABLE_CONTROL_ACTION(FRONTEND_CONTROL, INPUT_FRONTEND_X)
IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_X)
CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(siMovie, "SET_INPUT_EVENT", TO_FLOAT(ENUM_TO_INT(INPUT_FRONTEND_X)))
ENDIF
// Mouse cursor control
IF IS_USING_CURSOR(FRONTEND_CONTROL)
PASS_CURSOR_INPUT_TO_SF()
IF IS_CONTROL_JUST_RELEASED(FRONTEND_CONTROL, INPUT_CURSOR_ACCEPT)
CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(siMovie, "SET_INPUT_RELEASE_EVENT", TO_FLOAT(ENUM_TO_INT(INPUT_CURSOR_ACCEPT)))
ENDIF
IF IS_CONTROL_JUST_RELEASED(FRONTEND_CONTROL, INPUT_CURSOR_CANCEL)
CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(siMovie, "SET_INPUT_RELEASE_EVENT", TO_FLOAT(ENUM_TO_INT(INPUT_CURSOR_CANCEL)))
ENDIF
//Usng analogue stic input for mouse scroll
PASS_ANALOGUE_STICK_INPUTS_TO_SF(FALSE, TRUE)
ELSE
PASS_ANALOGUE_STICK_INPUTS_TO_SF(TRUE, TRUE)
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_IE> EXITING WEBSITE for Triangle press")
CLEANUP_IE_APP()
ENDIF
#IF IS_DEBUG_BUILD
IF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_S))
CLEANUP_IE_APP()
ENDIF
#ENDIF
ENDPROC
PROC RENDER_IE_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)
IE_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()
ENABLE_CONTROL_ACTION(FRONTEND_CONTROL,INPUT_FRONTEND_PAUSE)
SET_SCRIPT_GFX_DRAW_ORDER(GFX_ORDER_BEFORE_HUD)
DRAW_SCALEFORM_MOVIE_FULLSCREEN(siMovie,255,255,255,255)
REPLAY_PREVENT_RECORDING_AND_UI_THIS_FRAME()
DISABLE_CELLPHONE_THIS_FRAME_ONLY()
DISABLE_ALL_MP_HUD_THIS_FRAME()
ENDPROC
/// PURPOSE:
/// Sends the owned vehicle and collection data to SF
PROC SEND_INITIAL_DATA_TO_SCALEFORM()
INT i
//Send data for the players owned vehicles
REPEAT ciMAX_IE_OWNED_VEHICLES i
IE_VEHICLE_ENUM eTempVeh = INT_TO_ENUM(IE_VEHICLE_ENUM, GlobalplayerBD_FM[NATIVE_TO_INT(PLAYER_ID())].propertyDetails.bdIEgarageData.iWarehouseVehicles[i])
IF ENUM_TO_INT(eTempVeh) > ciIE_COVER_VEHICLE_INDEX
eTempVeh = INT_TO_ENUM(IE_VEHICLE_ENUM, (ENUM_TO_INT(eTempVeh) - ciIE_COVER_VEHICLE_INDEX))
ENDIF
IF eTempVeh > IE_VEH_INVALID
AND eTempVeh < IE_VEHICLE_COUNT
PASS_VEHICLE_DATA_TO_SCALEFORM(eTempVeh)
ENDIF
ENDREPEAT
//Send data for the value of vehicle collections
FOR i = ENUM_TO_INT(IE_VEH_SET_METAL) TO (ENUM_TO_INT(IE_VEH_SET_MAX) - 1)
PASS_COLLECTION_DATA_TO_SCALEFORM(i)
ENDFOR
IF NOT GB_HAS_IE_MISSION_COOLDOWN_TIMER_EXPIRED(VEV_SELL)
INT iTimeRemaining = GB_GET_MISSION_COOLDOWN_TIME_REMAINING(VEV_SELL)
CDEBUG1LN(DEBUG_INTERNET, "<APP_IE> SEND_INITIAL_DATA_TO_SCALEFORM Cooldown timer running. iTimeRemaining = ", iTimeRemaining)
BEGIN_SCALEFORM_MOVIE_METHOD(siMovie, "SET_COOLDOWN")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(iTimeRemaining)
END_SCALEFORM_MOVIE_METHOD()
ENDIF
SHOW_EXPORT_VEHICLE_SELECTION_SCREEN()
CPRINTLN(DEBUG_INTERNET, "<APP_IE> SEND_INITIAL_DATA_TO_SCALEFORM initial vehicle and collection data sent")
ENDPROC
/// PURPOSE:
/// Set's the global data and broadcasts an event to allow either vehicle modding to begin or the mission to starts
/// PARAMS:
/// bSellingVehCollection - True if we want to sell a collection of 2 or more specific vehicles
PROC SET_DATA_FOR_PRE_MISSION_LAUNCH_MODS(BOOL bSellingVehCollection = FALSE)
INT i
PLAYER_INDEX piUnassignedPlayers[ciMaxSelectableMissionVehicles]
REPEAT ciMaxSelectableMissionVehicles i
IF NOT bSellingVehCollection
AND iSelectedMissionVehicles[i] != 0
OR bSellingVehCollection
AND iSelectedCollectionVehicles[i] != 0
INT iVehicleToAssign = iSelectedMissionVehicles[i]
IF bSellingVehCollection
iVehicleToAssign = iSelectedCollectionVehicles[i]
ENDIF
//Assign the slected player to this vehicle for the carmodshop script to use
g_sIEVehicleSetupStruct[i].iIEPlayerVehicle = iVehicleToAssign
g_sIEVehicleSetupStruct[i].iPlayerIndex = NATIVE_TO_INT(piAssignedPlayers[i])
ELSE
//Assign any remaining gang members so they launch the mission correctly
//This happens when the boss selects less vehicles than gang members available
BUILD_LIST_OF_AVAILABLE_GANG_MEMBERS(piUnassignedPlayers)
g_sIEVehicleSetupStruct[i].iIEPlayerVehicle = -1
g_sIEVehicleSetupStruct[i].iPlayerIndex = NATIVE_TO_INT(piUnassignedPlayers[0])
piAssignedPlayers[i] = piUnassignedPlayers[0]
ENDIF
CPRINTLN(DEBUG_INTERNET, "<APP_IE> SET_DATA_FOR_PRE_MISSION_LAUNCH_MODS: slot : ", i, " vehicle: ", g_sIEVehicleSetupStruct[i].iIEPlayerVehicle, " Player ID: ", g_sIEVehicleSetupStruct[i].iPlayerIndex)
ENDREPEAT
IF eDropOffLocation != VEHICLE_EXPORT_DROPOFF_BUYER_PRIVATE
AND NOT bSellingVehCollection
IF IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
KILL_ANY_CONVERSATION()
CPRINTLN(DEBUG_INTERNET, "<APP_IE> SET_DATA_FOR_PRE_MISSION_LAUNCH_MODS: Mechaninc still speaking killing conversation for vehicle modding to begin")
ENDIF
CPRINTLN(DEBUG_INTERNET, "<APP_IE> SET_DATA_FOR_PRE_MISSION_LAUNCH_MODS: Options selcted for buyer: ", eDropOffLocation, " Waiting for modding session to begin.")
SET_PLAYER_MISSION_PERSONAL_CAR_MOD_START(TRUE)
bWaitingForCarmodEventToProcess = TRUE
ELSE
SET_PLAYER_MISSION_PERSONAL_CAR_MOD_IS_READY_TO_START_MISSION (PLAYER_ID(), TRUE)
CPRINTLN(DEBUG_INTERNET, "<APP_IE> SET_DATA_FOR_PRE_MISSION_LAUNCH_MODS: Options selected for private buyer moving on to eAppStage_LaunchingMission")
eAppStage = eAppStage_LaunchingMission
ENDIF
IF bSellingVehCollection
SET_PLAYER_STARTED_VEH_SET_SELL_MISSION(eSelectedVehicleCollection)
ELSE
CLEAR_IE_SELL_VEHICLE_SET_DATA()
ENDIF
SET_OFFICE_PERSONAL_CAR_MOD_IE_MISSION_FAILED(FALSE)
//Broadcast this so the all relevant players know which vehicle to mod
BROADCAST_START_PRE_SELL_VEHICLE_MOD(piAssignedPlayers[0], piAssignedPlayers[1], piAssignedPlayers[2], piAssignedPlayers[3],
g_sIEVehicleSetupStruct[0].iIEPlayerVehicle, g_sIEVehicleSetupStruct[1].iIEPlayerVehicle,
g_sIEVehicleSetupStruct[2].iIEPlayerVehicle, g_sIEVehicleSetupStruct[3].iIEPlayerVehicle, eDropOffLocation, bSellingVehCollection)
g_bLaunchedPreSellVehModFromIEApp = TRUE
ENDPROC
PROC RUN_TRANSACTION_TO_REMOVE_IE_VEHICLES(IE_VEHICLE_ENUM &eVehiclesToRemove[ciMaxSelectableMissionVehicles])
INT i
INT iSlots[ciMaxSelectableMissionVehicles]
INT iVehicles[ciMaxSelectableMissionVehicles]
CONTRABAND_TRANSACTION_STATE eResult
REPEAT ciMaxSelectableMissionVehicles i
IF eVehiclesToRemove[i] = IE_VEH_INVALID
iVehicles[i] = 0
iSlots[i] = -1
ELSE
iVehicles[i] = 0
iSlots[i] = GET_SAVE_SLOT_FOR_IE_VEHICLE(eVehiclesToRemove[i])
ENDIF
CPRINTLN(DEBUG_INTERNET, "<APP_IE>[Mission_Launch] RUN_TRANSACTION_TO_REMOVE_IE_VEHICLES Transaction setup. slot: ", i, " Remove Vehicle ", eVehiclesToRemove[i], " from save slot: ", iSlots[i])
ENDREPEAT
IF USE_SERVER_TRANSACTIONS()
CPRINTLN(DEBUG_INTERNET, "<APP_IE>[Mission_Launch] RUN_TRANSACTION_TO_REMOVE_IE_VEHICLES starting transaction...")
WHILE NOT PROCESS_TRANSACTION_FOR_UPDATE_IE_VEHICLE_SLOT(iSlots, iVehicles, eResult)
WAIT(0)
ENDWHILE
IF eResult = CONTRABAND_TRANSACTION_STATE_SUCCESS
REMOVE_VEHICLE_FROM_IE_WAREHOUSE(eVehiclesToRemove)
ELSE
g_bIEAppFailedRemoveVehicles = TRUE
CASSERTLN(DEBUG_INTERNET, "RUN_TRANSACTION_TO_REMOVE_IE_VEHICLES transaction failed to remove vehicles")
ENDIF
ELSE
REMOVE_VEHICLE_FROM_IE_WAREHOUSE(eVehiclesToRemove)
ENDIF
CPRINTLN(DEBUG_INTERNET, "<APP_IE>[Mission_Launch] RUN_TRANSACTION_TO_REMOVE_IE_VEHICLES Vehicles removed. Moving on")
ENDPROC
PROC LAUNCH_MISSION()
INT i
IE_VEHICLE_ENUM eMissionVehicles[ciMaxSelectableMissionVehicles]
BOOL bSellingVehSet = IS_LOCAL_PLAYER_SELLING_VEHICLE_SET()
CLEAR_BIT(g_SimpleInteriorData.iFifthBS, BS5_SIMPLE_INTERIOR_LAUNCHED_VEH_EXP_MISSION_FROM_HACKER_TRUCK)
//Get the four vehicles we need for the mission
REPEAT ciMaxSelectableMissionVehicles i
IF bSellingVehSet
eMissionVehicles[i] = INT_TO_ENUM(IE_VEHICLE_ENUM, iSelectedCollectionVehicles[i])
ELSE
eMissionVehicles[i] = INT_TO_ENUM(IE_VEHICLE_ENUM, iSelectedMissionVehicles[i])
ENDIF
ENDREPEAT
#IF IS_DEBUG_BUILD
CPRINTLN(DEBUG_INTERNET, "<APP_IE>[Mission_Launch] LAUNCH_MISSION Requesting Mission: FMMC_TYPE_VEHICLE_EXPORT_SELL with vehicles: ",
GET_SELECTED_IE_VEHICLE_STRING(eMissionVehicles[0]), " & ",
GET_SELECTED_IE_VEHICLE_STRING(eMissionVehicles[1]), " & ",
GET_SELECTED_IE_VEHICLE_STRING(eMissionVehicles[2]), " & ",
GET_SELECTED_IE_VEHICLE_STRING(eMissionVehicles[3]), " Dropoff location: ", eDropOffLocation, " Vehicle count: ", GET_COUNT_OF_VEHICLES_SELCTED_FOR_SELL_MISSION(bSellingVehSet))
#ENDIF
IF eDropOffLocation = VEHICLE_EXPORT_DROPOFF_BUYER_PRIVATE
OR IS_LOCAL_PLAYER_SELLING_VEHICLE_SET()
//Private buyers or when we sell a vehicle collection do not require us to mod any vehicles so set this here before the mission launch
SET_PLAYER_MISSION_PERSONAL_CAR_MOD_IS_READY_TO_START_MISSION (PLAYER_ID(), TRUE)
ENDIF
IF IE_DELIVERY_ACTIVATE_DROPOFF_OF_TYPE_FOR_GANG(eDropOffLocation, GET_COUNT_OF_VEHICLES_SELCTED_FOR_SELL_MISSION(bSellingVehSet), bSellingVehSet)
GB_BOSS_REQUEST_VEHICLE_EXPORT_MISSION_LAUNCH_FROM_SERVER(FMMC_TYPE_VEHICLE_EXPORT_SELL, eMissionVehicles[0], eMissionVehicles[1], eMissionVehicles[2], eMissionVehicles[3])
//Run the transaction to remove the mission vehicles
RUN_TRANSACTION_TO_REMOVE_IE_VEHICLES(eMissionVehicles)
// Reset existing dropoffs
IF g_bIEAppFailedRemoveVehicles
REPEAT MAX_NUM_VEHICLE_EXPORT_ENTITIES i
GlobalplayerBD_FM_3[NATIVE_TO_INT(PLAYER_ID())].sMagnateGangBossData.eSelectedSellDropoffs[i] = IE_DROPOFF_INVALID
#IF IS_DEBUG_BUILD
PRINTLN("<APP_IE>[Mission_Launch] LAUNCH_MISSION - Invalidating existing dropoffs!")
#ENDIF
ENDREPEAT
ELSE
//Set the stat
INCREMENT_TOTAL_NUM_EXPORT_MISSIONS_STARTED()
ENDIF
ELSE
CPRINTLN(DEBUG_INTERNET, "<APP_IE>[Mission_Launch] LAUNCH_MISSION Couldn't activate dropoffs!")
ENDIF
ENDPROC
FUNC STRING GET_CONFIRM_SELL_DESCRIPTION(BOOL bPrivateBuyer, BOOL bCantAffordMods = FALSE, INT iPrivateBuyerCost = -1, BOOL bBuyerDisabled = FALSE)
IF bBuyerDisabled
RETURN "AH_BUYER_D6"
ELIF bCantAffordMods
IF GET_COUNT_OF_VEHICLES_SELCTED_FOR_SELL_MISSION(FALSE) = 1
RETURN "AH_BUYER_NM2"
ELSE
RETURN "AH_BUYER_NM1"
ENDIF
ELIF bPrivateBuyer
IF GET_COUNT_OF_VEHICLES_SELCTED_FOR_SELL_MISSION(FALSE) = 1
IF iPrivateBuyerCost > 0
RETURN "AH_BUYER_D4"
ELSE
RETURN "AH_BUYER_D2"
ENDIF
ELIF iPrivateBuyerCost > 0
RETURN "AH_BUYER_D5"
ENDIF
ELSE
IF GET_COUNT_OF_VEHICLES_SELCTED_FOR_SELL_MISSION(FALSE) = 1
RETURN "AH_BUYER_D4"
ELSE
RETURN "AH_BUYER_D5"
ENDIF
ENDIF
RETURN "AH_BUYER_D1"
ENDFUNC
/// PURPOSE:
/// Returns a string based on the number of vehicles in a collection
FUNC STRING GET_COLLECT_MORE_VEHICLES_MESSAGE(IE_VEHICLE_SET_ID eCollectionID)
INT iCollectionVehicleCount = GET_IE_VEH_SET_VEHICLE_COUNT(eCollectionID)
SWITCH iCollectionVehicleCount
CASE 2 RETURN "AH_COL_2VEH"
CASE 3 RETURN "AH_COL_3VEH"
CASE 4 RETURN "AH_COL_4VEH"
ENDSWITCH
RETURN "AH_COL_2VEH"
ENDFUNC
FUNC STRING GET_IE_MISSION_CD_OVERLAY_TEXT()
IF GlobalplayerBD_FM[NATIVE_TO_INT(PLAYER_ID())].propertyDetails.bdIEgarageData.iVehicleTotal > 1
RETURN "AH_COOLDOWN2"
ENDIF
RETURN "AH_COOLDOWN"
ENDFUNC
FUNC BOOL CAN_PLAYER_AFFORD_VEHICLE_MODS(IE_VEH_BUYER eBuyerID)
INT iCost
IF eBuyerID = IE_BUYER_PRIVATE
iCost = GET_EXPORT_VALUE_OF_SELECTED_MISSION_VEHICLES(IE_DROPOFF_PRIVATE_BUYER_1, TRUE)
ELIF eBuyerID = IE_BUYER_SHOWROOM
iCost = GET_EXPORT_VALUE_OF_SELECTED_MISSION_VEHICLES(IE_DROPOFF_SHOWROOM_1, TRUE)
ELIF eBuyerID = IE_BUYER_SPECIALIST
iCost = GET_EXPORT_VALUE_OF_SELECTED_MISSION_VEHICLES(IE_DROPOFF_GANGSTER_1, TRUE)
ENDIF
IF iCost > 0
AND NOT NETWORK_CAN_SPEND_MONEY(iCost, FALSE, TRUE, FALSE)
CPRINTLN(DEBUG_INTERNET, "<APP_IE> CAN_PLAYER_AFFORD_IE_WH_PURCHASE: purchase failed, player doesn't have sufficient cash. Total cost: ", iCost)
RETURN FALSE
ENDIF
RETURN TRUE
ENDFUNC
/// PURPOSE:
/// Deals with button input from the player
PROC HANDLE_APP_SELECTION(enumItemConsumed &eConsumedInput)
IF eConsumedInput < inputConsumed_0
IF BLOCK_MISSION_LAUNCH_FOR_SAVE_ISSUES()
IF eConsumedInput = inputConsumed_BUYER_0
OR eConsumedInput = inputConsumed_BUYER_1
OR eConsumedInput = inputConsumed_BUYER_2
CDEBUG1LN(DEBUG_INTERNET, "<APP_IE> HANDLE_APP_SELECTION BLOCK_MISSION_LAUNCH_FOR_SAVE_ISSUES is true and we've selected a buyer. Blocking mission launch")
START_OVERLAY_SCREEN("AH_BUYER_T", "AH_SAVING_DOWN", "WHOUSE_CONF", "")
bConfirmMissionLaunch = FALSE
eConsumedInput = inputConsumed_1
EXIT
ENDIF
ENDIF
IF eConsumedInput = inputConsumed_OVERLAY_CONFIRM
IF bConfirmMissionLaunch
BOOL bLaunchVehSetMission = HAS_PLAYER_SELECTED_VEHICLE_SET()
IF iCurrentTabID != ciPageID_Collection
bLaunchVehSetMission = FALSE
ENDIF
IF CAN_PLAYER_LAUNCH_MISSION(bLaunchVehSetMission)
//Assign players to vehicles
ASSIGN_GANG_MEMBERS_TO_MISSION_VEHICLES(bLaunchVehSetMission)
//Setup the data and start the next stage
SET_DATA_FOR_PRE_MISSION_LAUNCH_MODS(bLaunchVehSetMission)
CLOSE_OVERLAY_SCREEN()
ELSE
TEXT_LABEL_15 tlFailReason = GET_MISSION_UNAVAILABLE_REASON_TEXT_LABEL(bLaunchVehSetMission)
CLOSE_OVERLAY_SCREEN()
CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(siMovie, "SET_INPUT_EVENT", TO_FLOAT(ENUM_TO_INT(INPUT_FRONTEND_CANCEL)))
IF iMissionUnavailableReason = ciFailReasonTooFewPlayers
AND NOT bLaunchVehSetMission
INT i, iNumVehiclesToRemove
iNumVehiclesToRemove = (GET_COUNT_OF_VEHICLES_SELCTED_FOR_SELL_MISSION(bLaunchVehSetMission) - GET_COUNT_OF_GANG_MEMBERS_INSIDE_IE_GARAGE())
REPEAT iNumVehiclesToRemove i
REMOVE_LAST_SF_SELECTED_VEHICLE()
ENDREPEAT
ENDIF
START_OVERLAY_SCREEN("AH_BUYER_T", tlFailReason, "OR_OVRLY_OK", "")
ENDIF
ELSE
CLOSE_OVERLAY_SCREEN()
ENDIF
ELIF eConsumedInput = inputConsumed_OVERLAY_CANCEL
CLOSE_OVERLAY_SCREEN()
ELIF eConsumedInput = inputConsumed_EXPORT_VEHICLES
IF NOT GB_HAS_IE_MISSION_COOLDOWN_TIMER_EXPIRED(VEV_SELL)
START_OVERLAY_SCREEN("AH_BUYER_T", GET_IE_MISSION_CD_OVERLAY_TEXT(), "OR_OVRLY_OK", "")
#IF FEATURE_CASINO_HEIST
ELIF IS_PLAYER_IN_ARCADE_PROPERTY(PLAYER_ID())
START_OVERLAY_SCREEN("AH_VEH_SEL_T", "AHA_ARCADE_BLCK", "OR_OVRLY_OK", "")
#ENDIF
ELIF iSelectedMissionVehicles[0] = 0 AND iCurrentTabID = ciPageID_VehicleSelection
OR iSelectedCollectionVehicles[0] = 0 AND iCurrentTabID = ciPageID_Collection
//No vehicles selected
START_OVERLAY_SCREEN("AH_VEH_SEL_T", "AH_VEH_SEL_D", "OR_OVRLY_OK", "")
ELIF NOT GB_IS_PLAYER_BOSS_OF_A_GANG(PLAYER_ID())
//Not a boss
START_OVERLAY_SCREEN("AH_BUYER_T", "AH_NBOSS", "OR_OVRLY_OK", "")
ELIF HAS_PLAYER_SELECTED_VEHICLE_SET()
AND iCurrentTabID = ciPageID_Collection
IF BLOCK_MISSION_LAUNCH_FOR_SAVE_ISSUES()
CDEBUG1LN(DEBUG_INTERNET, "<APP_IE> HANDLE_APP_SELECTION BLOCK_MISSION_LAUNCH_FOR_SAVE_ISSUES is true and we've selected a collection. Blocking mission launch")
START_OVERLAY_SCREEN("AH_BUYER_T", "AH_SAVING_DOWN", "WHOUSE_CONF", "")
ELSE
//Vehicle collection selected. No need to select a buyer for this
START_OVERLAY_SCREEN("AH_BUYER_T", "AH_BUYER_D3", "WHOUSE_CONF", "WHOUSE_CANC")
eDropOffLocation = VEHICLE_EXPORT_DROPOFF_BUYER_GANGSTER
bConfirmMissionLaunch = TRUE
ENDIF
ELSE
SHOW_EXPORT_BUYERS_SCREEN()
ENDIF
ELIF eConsumedInput = inputConsumed_BUYER_0
IF IS_IE_VEH_BUYER_DISABLED(IE_BUYER_PRIVATE)
START_OVERLAY_SCREEN("AH_BUYER_T", GET_CONFIRM_SELL_DESCRIPTION(TRUE, TRUE, DEFAULT, TRUE), "WHOUSE_CONF", "")
bConfirmMissionLaunch = FALSE
ELIF CAN_PLAYER_AFFORD_VEHICLE_MODS(IE_BUYER_PRIVATE)
INT iPrivateBuyerModCost = GET_EXPORT_VALUE_OF_SELECTED_MISSION_VEHICLES(IE_DROPOFF_PRIVATE_BUYER_1, TRUE)
INT iPrivateBuyerReward = GET_EXPORT_VALUE_OF_SELECTED_MISSION_VEHICLES(IE_DROPOFF_PRIVATE_BUYER_1)
IF iPrivateBuyerModCost <= 0
iPrivateBuyerModCost = -1
ENDIF
//Buyer 0 confirm message
START_OVERLAY_SCREEN("AH_BUYER_T", GET_CONFIRM_SELL_DESCRIPTION(TRUE, FALSE, iPrivateBuyerModCost), "WHOUSE_CONF", "WHOUSE_CANC", iPrivateBuyerModCost, iPrivateBuyerReward)
eDropOffLocation = VEHICLE_EXPORT_DROPOFF_BUYER_PRIVATE
bConfirmMissionLaunch = TRUE
ELSE
START_OVERLAY_SCREEN("AH_BUYER_T", GET_CONFIRM_SELL_DESCRIPTION(TRUE, TRUE), "WHOUSE_CONF", "")
bConfirmMissionLaunch = FALSE
ENDIF
ELIF eConsumedInput = inputConsumed_BUYER_1
IF IS_IE_VEH_BUYER_DISABLED(IE_BUYER_SHOWROOM)
START_OVERLAY_SCREEN("AH_BUYER_T", GET_CONFIRM_SELL_DESCRIPTION(TRUE, TRUE, DEFAULT, TRUE), "WHOUSE_CONF", "")
bConfirmMissionLaunch = FALSE
ELIF CAN_PLAYER_AFFORD_VEHICLE_MODS(IE_BUYER_SHOWROOM)
INT iShowroomBuyerModCost = GET_EXPORT_VALUE_OF_SELECTED_MISSION_VEHICLES(IE_DROPOFF_SHOWROOM_1, TRUE)
INT iShowroomBuyerReward = GET_EXPORT_VALUE_OF_SELECTED_MISSION_VEHICLES(IE_DROPOFF_SHOWROOM_1)
//Buyer 1 confirm message
START_OVERLAY_SCREEN("AH_BUYER_T", GET_CONFIRM_SELL_DESCRIPTION(FALSE), "WHOUSE_CONF", "WHOUSE_CANC", iShowroomBuyerModCost, iShowroomBuyerReward)
eDropOffLocation = VEHICLE_EXPORT_DROPOFF_BUYER_SHOWROOM
bConfirmMissionLaunch = TRUE
ELSE
START_OVERLAY_SCREEN("AH_BUYER_T", GET_CONFIRM_SELL_DESCRIPTION(TRUE, TRUE), "WHOUSE_CONF", "")
bConfirmMissionLaunch = FALSE
ENDIF
ELIF eConsumedInput = inputConsumed_BUYER_2
IF IS_IE_VEH_BUYER_DISABLED(IE_BUYER_SPECIALIST)
START_OVERLAY_SCREEN("AH_BUYER_T", GET_CONFIRM_SELL_DESCRIPTION(TRUE, TRUE, DEFAULT, TRUE), "WHOUSE_CONF", "")
bConfirmMissionLaunch = FALSE
ELIF CAN_PLAYER_AFFORD_VEHICLE_MODS(IE_BUYER_SPECIALIST)
INT iSpecialistBuyerModCost = GET_EXPORT_VALUE_OF_SELECTED_MISSION_VEHICLES(IE_DROPOFF_GANGSTER_1, TRUE)
INT iSpecialistBuyerReward = GET_EXPORT_VALUE_OF_SELECTED_MISSION_VEHICLES(IE_DROPOFF_GANGSTER_1)
//Buyer 2 confirm message
START_OVERLAY_SCREEN("AH_BUYER_T", GET_CONFIRM_SELL_DESCRIPTION(FALSE), "WHOUSE_CONF", "WHOUSE_CANC", iSpecialistBuyerModCost, iSpecialistBuyerReward)
eDropOffLocation = VEHICLE_EXPORT_DROPOFF_BUYER_GANGSTER
bConfirmMissionLaunch = TRUE
ELSE
START_OVERLAY_SCREEN("AH_BUYER_T", GET_CONFIRM_SELL_DESCRIPTION(TRUE, TRUE), "WHOUSE_CONF", "")
bConfirmMissionLaunch = FALSE
ENDIF
ENDIF
eConsumedInput = inputConsumed_1
ENDIF
ENDPROC
/// PURPOSE:
/// Checks if the button presed is a vehicle or a vehicle plus the export window offset
FUNC BOOL HAS_VEHICLE_BUTTON_BEEN_SELECTED(INT iButtonPressID)
INT iLowestButtonID = ENUM_TO_INT(IE_VEH_INVALID)
INT iHighestButtonID = ENUM_TO_INT(IE_VEHICLE_COUNT)
//Check for the vehicles in the bottom selection window
IF iButtonPressID > iLowestButtonID
AND iButtonPressID < iHighestButtonID
//Check for the vehicles + the offset. (Corresponds to the vehicles in the export selection window)
OR iButtonPressID > (iLowestButtonID + ciVehicleSelectionOffset)
AND iButtonPressID < (iHighestButtonID + ciVehicleSelectionOffset)
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Checks if the button presed is a vehicle collections or a vehicle plus the export window offset
FUNC BOOL HAS_VEHICLE_SET_BUTTON_BEEN_SELECTED(INT iButtonPressID)
INT iLowestButtonID = ENUM_TO_INT(IE_VEH_SET_METAL)
INT iHighestButtonID = ENUM_TO_INT(IE_VEH_SET_MAX)
//Check for the vehicles in the bottom selection window
IF iButtonPressID >= iLowestButtonID
AND iButtonPressID < iHighestButtonID
//Check for the vehicles + the offset. (Corresponds to the vehicles in the export selection window)
OR iButtonPressID > (iLowestButtonID + ciCollectionSelectionOffset)
AND iButtonPressID < (iHighestButtonID + ciCollectionSelectionOffset)
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
PROC CHECK_BUTTON_PRESS()
IF currentButtonPressStage = inputConsumed_1
ENABLE_CONTROL_ACTION(FRONTEND_CONTROL, INPUT_FRONTEND_ACCEPT)
ENABLE_CONTROL_ACTION(FRONTEND_CONTROL, INPUT_CURSOR_ACCEPT)
IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_ACCEPT)
OR IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_CURSOR_ACCEPT)
BEGIN_SCALEFORM_MOVIE_METHOD(siMovie, "GET_CURRENT_SELECTION")
currentSelectionReturnIndex = END_SCALEFORM_MOVIE_METHOD_RETURN_VALUE()
BEGIN_SCALEFORM_MOVIE_METHOD(siMovie, "GET_CURRENT_TAB_ID")
currentTabReturnIndex = END_SCALEFORM_MOVIE_METHOD_RETURN_VALUE()
currentButtonPressStage = inputConsumed_0
ENDIF
ENDIF
IF (currentButtonPressStage = inputConsumed_0)
AND (IS_SCALEFORM_MOVIE_METHOD_RETURN_VALUE_READY(currentSelectionReturnIndex) AND IS_SCALEFORM_MOVIE_METHOD_RETURN_VALUE_READY(currentTabReturnIndex))
iCurrentTabID = GET_SCALEFORM_MOVIE_METHOD_RETURN_VALUE_INT(currentTabReturnIndex)
INT iButtonIndex = GET_SCALEFORM_MOVIE_METHOD_RETURN_VALUE_INT(currentSelectionReturnIndex)
BOOL bSendInputBackToSF = TRUE
BOOL bSetPageID = TRUE
CONST_INT iCONST_Button_Index_101 101 //OVERLAY_ACCEPT_BUTTON:Number
CONST_INT iCONST_Button_Index_102 102 //OVERLAY_CANCEL_BUTTON
CONST_INT iCONST_Button_Index_1000 1000 //Export Tab
CONST_INT iCONST_Button_Index_1001 1001 //Collections Tab
CONST_INT iCONST_Button_Index_1002 1002 //Export button for the selected vehicles
CONST_INT iCONST_Button_Index_1007 1007 //Buyer 1
CONST_INT iCONST_Button_Index_1008 1008 //Buyer 2
CONST_INT iCONST_Button_Index_1009 1009 //Buyer 3
currentButtonPressStage = INT_TO_ENUM(enumItemConsumed, iButtonIndex)
//Individual vehicles
IF HAS_VEHICLE_BUTTON_BEEN_SELECTED(iButtonIndex)
IF NOT GB_HAS_IE_MISSION_COOLDOWN_TIMER_EXPIRED(VEV_SELL)
START_OVERLAY_SCREEN("AH_BUYER_T", GET_IE_MISSION_CD_OVERLAY_TEXT(), "OR_OVRLY_OK", "")
bSendInputBackToSF = FALSE
#IF FEATURE_CASINO_HEIST
ELIF IS_PLAYER_IN_ARCADE_PROPERTY(PLAYER_ID())
START_OVERLAY_SCREEN("AH_VEH_SEL_T", "AHA_ARCADE_BLCK", "OR_OVRLY_OK", "")
bSendInputBackToSF = FALSE
#ENDIF
ELIF NOT IS_VEHICLE_SELECTED(iButtonIndex, FALSE)
IF GET_COUNT_OF_VEHICLES_SELCTED_FOR_SELL_MISSION(FALSE) = ciMaxSelectableMissionVehicles
START_OVERLAY_SCREEN("AH_BUYER_T", "AH_MAX_PLAYERD", "OR_OVRLY_OK", "")
bSendInputBackToSF = FALSE
ELIF GET_COUNT_OF_VEHICLES_SELCTED_FOR_SELL_MISSION(FALSE) < GET_COUNT_OF_GANG_MEMBERS_INSIDE_IE_GARAGE()
ADD_SCALEFORM_SELECTED_VEHICLE(iButtonIndex, FALSE)
ELSE
START_OVERLAY_SCREEN("AH_BUYER_T", "AH_NE_PLAYERD", "OR_OVRLY_OK", "")
bSendInputBackToSF = FALSE
ENDIF
ELSE
IF iButtonIndex > ciVehicleSelectionOffset
iButtonIndex -= ciVehicleSelectionOffset
ENDIF
REMOVE_SCALEFORM_SELECTED_VEHICLE(iButtonIndex)
ENDIF
//Do nothing until the player selects the export button
currentButtonPressStage = inputConsumed_1
//vehicle collections (ID 201 - 210)
ELIF HAS_VEHICLE_SET_BUTTON_BEEN_SELECTED(iButtonIndex)
IE_VEHICLE_SET_ID eCollection = INT_TO_ENUM(IE_VEHICLE_SET_ID, iButtonIndex)
IF NOT GB_HAS_IE_MISSION_COOLDOWN_TIMER_EXPIRED(VEV_SELL)
START_OVERLAY_SCREEN("AH_BUYER_T", GET_IE_MISSION_CD_OVERLAY_TEXT(), "OR_OVRLY_OK", "")
bSendInputBackToSF = FALSE
#IF FEATURE_CASINO_HEIST
ELIF IS_PLAYER_IN_ARCADE_PROPERTY(PLAYER_ID())
START_OVERLAY_SCREEN("AH_VEH_SEL_T", "AHA_ARCADE_BLCK", "OR_OVRLY_OK", "")
bSendInputBackToSF = FALSE
#ENDIF
ELIF NOT DOES_PLAYER_OWN_ALL_VEHICLES_IN_A_SET(eCollection)
//Collect more vehicles message
START_OVERLAY_SCREEN("AH_BUYER_T", GET_COLLECT_MORE_VEHICLES_MESSAGE(eCollection), "OR_OVRLY_OK", "")
bSendInputBackToSF = FALSE
ELIF GET_COUNT_OF_GANG_MEMBERS_INSIDE_IE_GARAGE() < GET_IE_VEH_SET_VEHICLE_COUNT(eCollection)
//Not enough players to launch a mission
START_OVERLAY_SCREEN("AH_BUYER_T", "AH_COL_PLAYERD", "OR_OVRLY_OK", "")
bSendInputBackToSF = FALSE
ELIF eSelectedVehicleCollection = eCollection
//We already have a collection selected so deselect this
eSelectedVehicleCollection = IE_VEH_SET_INVALID
REMOVE_ALL_SELECTED_VEHICLES(TRUE)
CPRINTLN(DEBUG_INTERNET, "<APP_IE> CHECK_BUTTON_PRESS Deselecting collection ", eCollection)
ELIF HAS_PLAYER_SELECTED_VEHICLE_SET()
//We have selected a different collection
REMOVE_ALL_SELECTED_VEHICLES(TRUE) //Remove the old vehicles
//Tell Scaleform to remove the old collection
CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(siMovie, "SET_INPUT_EVENT", TO_FLOAT(ENUM_TO_INT(eSelectedVehicleCollection)))
eSelectedVehicleCollection = eCollection //Select the new collection
ASSIGN_COLLECTION_VEHICLES(eCollection) //Assign the vehicles
CPRINTLN(DEBUG_INTERNET, "<APP_IE> CHECK_BUTTON_PRESS Selecting collection ", eCollection)
ELSE
eSelectedVehicleCollection = eCollection
ASSIGN_COLLECTION_VEHICLES(eCollection)
CPRINTLN(DEBUG_INTERNET, "<APP_IE> CHECK_BUTTON_PRESS Selecting collection ", eCollection)
ENDIF
//Do nothing until the player selects the export button
currentButtonPressStage = inputConsumed_1
ELSE
SWITCH iButtonIndex
CASE iCONST_Button_Index_101 //OVERLAY_ACCEPT_BUTTON
CPRINTLN(DEBUG_INTERNET, "<APP_IE> CHECK_BUTTON_PRESS OVERLAY_ACCEPT_BUTTON clicked ", iButtonIndex)
BREAK
CASE iCONST_Button_Index_102 //OVERLAY_CANCEL_BUTTON
CPRINTLN(DEBUG_INTERNET, "<APP_IE> CHECK_BUTTON_PRESS OVERLAY_CANCEL_BUTTON clicked ", iButtonIndex)
BREAK
CASE iCONST_Button_Index_1002 //Export button for the selected vehicles
CPRINTLN(DEBUG_INTERNET, "<APP_IE> CHECK_BUTTON_PRESS Export button clicked ", iButtonIndex)
BREAK
CASE iCONST_Button_Index_1007 //Buyer 1
CPRINTLN(DEBUG_INTERNET, "<APP_IE> CHECK_BUTTON_PRESS Buyer 1 clicked ", iButtonIndex)
BREAK
CASE iCONST_Button_Index_1008 //Buyer 2
CPRINTLN(DEBUG_INTERNET, "<APP_IE> CHECK_BUTTON_PRESS Buyer 2 clicked ", iButtonIndex)
BREAK
CASE iCONST_Button_Index_1009 //Buyer 3
CPRINTLN(DEBUG_INTERNET, "<APP_IE> CHECK_BUTTON_PRESS Buyer 3 clicked ", iButtonIndex)
BREAK
CASE iCONST_Button_Index_1000 //Export Tab
bSetPageID = FALSE
SET_CURRENT_PAGE_ID(ciPageID_VehicleSelection)
CPRINTLN(DEBUG_INTERNET, "<APP_IE> CHECK_BUTTON_PRESS Export tab button clicked ", iButtonIndex)
BREAK
CASE iCONST_Button_Index_1001 //Collections Tab
bSetPageID = FALSE
SET_CURRENT_PAGE_ID(ciPageID_Collection)
CPRINTLN(DEBUG_INTERNET, "<APP_IE> CHECK_BUTTON_PRESS Collections tab button clicked ", iButtonIndex)
BREAK
DEFAULT
CPRINTLN(DEBUG_INTERNET, "<APP_IE> CHECK_BUTTON_PRESS unhandled button index ", iButtonIndex)
BREAK
ENDSWITCH
ENDIF
IF bSendInputBackToSF
CPRINTLN(DEBUG_INTERNET, "<APP_IE> CHECK_BUTTON_PRESS Sending input value back to SF ", iButtonIndex, " Current tab: ", iCurrentTabID)
CALL_SCALEFORM_MOVIE_METHOD_WITH_NUMBER(siMovie, "SET_INPUT_EVENT", TO_FLOAT(iButtonIndex))
ENDIF
IF bSetPageID
SET_CURRENT_PAGE_ID(iCurrentTabID)
ENDIF
ENDIF
//Handle the control input receivied above
HANDLE_APP_SELECTION(currentButtonPressStage)
ENDPROC
FUNC BOOL HAVE_ALL_IEAPP_HELP_TUTORIALS_BEEN_COMPLETED()
IF HAS_IE_WEBSITE_TUT_BEEN_DONE(iIETutorialBS1, iIETutorialBS2, IE_WEB_TUT_AH_VEH_SELECT)
AND HAS_IE_WEBSITE_TUT_BEEN_DONE(iIETutorialBS1, iIETutorialBS2, IE_WEB_TUT_AH_BUYER_PAGE)
AND HAS_IE_WEBSITE_TUT_BEEN_DONE(iIETutorialBS1, iIETutorialBS2, IE_WEB_TUT_AH_BUYER_PAGE_2)
AND HAS_IE_WEBSITE_TUT_BEEN_DONE(iIETutorialBS1, iIETutorialBS2, IE_WEB_TUT_AH_COLLECTION_PAGE)
AND HAS_IE_WEBSITE_TUT_BEEN_DONE(iIETutorialBS1, iIETutorialBS2, IE_WEB_TUT_AH_COLLECTION_PAGE_2)
AND HAS_IE_WEBSITE_TUT_BEEN_DONE(iIETutorialBS1, iIETutorialBS2, IE_WEB_TUT_AH_EXPORT_COOLDOWN)
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL SHOULD_IEAPP_HELP_TUTORIAL_BE_DISPLAYED(eWEBSITE_TUTORIAL_BS_INDEX eTutorialID)
INT iTutorialID = ENUM_TO_INT(eTutorialID)
SWITCH eTutorialID
CASE eWTBS_AH_VEH_SELECT
IF NOT HAS_IE_WEBSITE_TUT_BEEN_DONE(iIETutorialBS1, iIETutorialBS2, IE_WEB_TUT_AH_VEH_SELECT)
AND NOT IS_BIT_SET(g_iWebsiteTutorialDisplayedBS, iTutorialID)
AND NOT IS_BIT_SET(iBS, AH_BS_TUTORIAL_1_PLAYED_THIS_BOOT)
RETURN TRUE
ENDIF
BREAK
CASE eWTBS_AH_BUYER_PAGE
IF NOT HAS_IE_WEBSITE_TUT_BEEN_DONE(iIETutorialBS1, iIETutorialBS2, IE_WEB_TUT_AH_BUYER_PAGE)
AND NOT IS_BIT_SET(g_iWebsiteTutorialDisplayedBS, iTutorialID)
AND NOT IS_BIT_SET(iBS, AH_BS_TUTORIAL_2_PLAYED_THIS_BOOT)
AND iCurrentTabID = ciPageID_Buyers
RETURN TRUE
ENDIF
BREAK
CASE eWTBS_AH_BUYER_PAGE_2
IF NOT HAS_IE_WEBSITE_TUT_BEEN_DONE(iIETutorialBS1, iIETutorialBS2, IE_WEB_TUT_AH_BUYER_PAGE_2)
AND NOT IS_BIT_SET(g_iWebsiteTutorialDisplayedBS, iTutorialID)
AND NOT IS_BIT_SET(iBS, AH_BS_TUTORIAL_2_PLAYED_THIS_BOOT)
AND iCurrentTabID = ciPageID_Buyers
RETURN TRUE
ENDIF
BREAK
CASE eWTBS_AH_COLLECTION_PAGE
IF NOT HAS_IE_WEBSITE_TUT_BEEN_DONE(iIETutorialBS1, iIETutorialBS2, IE_WEB_TUT_AH_COLLECTION_PAGE)
AND NOT IS_BIT_SET(g_iWebsiteTutorialDisplayedBS, iTutorialID)
AND NOT IS_BIT_SET(iBS, AH_BS_TUTORIAL_3_PLAYED_THIS_BOOT)
AND iCurrentTabID = ciPageID_Collection
RETURN TRUE
ENDIF
BREAK
CASE eWTBS_AH_COLLECTION_PAGE_2
IF NOT HAS_IE_WEBSITE_TUT_BEEN_DONE(iIETutorialBS1, iIETutorialBS2, IE_WEB_TUT_AH_COLLECTION_PAGE_2)
AND NOT IS_BIT_SET(g_iWebsiteTutorialDisplayedBS, iTutorialID)
AND NOT IS_BIT_SET(iBS, AH_BS_TUTORIAL_3_PLAYED_THIS_BOOT)
AND iCurrentTabID = ciPageID_Collection
AND DOES_LOCAL_PLAYER_HAVE_ALL_VEHICLES_IN_ANY_SET()
RETURN TRUE
ENDIF
BREAK
CASE eWTBS_AH_EXPORT_COOLDOWN
IF NOT HAS_IE_WEBSITE_TUT_BEEN_DONE(iIETutorialBS1, iIETutorialBS2, IE_WEB_TUT_AH_EXPORT_COOLDOWN)
AND NOT IS_BIT_SET(g_iWebsiteTutorialDisplayedBS, iTutorialID)
AND NOT GB_HAS_IE_MISSION_COOLDOWN_TIMER_EXPIRED(VEV_SELL)
RETURN TRUE
ENDIF
BREAK
CASE eWTBS_AH_BUYER_PAGE_3
IF NOT HAS_IE_WEBSITE_TUT_BEEN_DONE(iIETutorialBS1, iIETutorialBS2, IE_WEB_TUT_AH_BUYER_PAGE_3)
AND NOT IS_BIT_SET(g_iWebsiteTutorialDisplayedBS, iTutorialID)
AND NOT IS_BIT_SET(iBS, AH_BS_TUTORIAL_2_PLAYED_THIS_BOOT)
AND iCurrentTabID = ciPageID_Buyers
RETURN TRUE
ENDIF
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
PROC UPDATE_IE_WEBSITE_TUTORIAL_BS()
iIETutorialBS1 = GET_MP_INT_CHARACTER_STAT(MP_STAT_IMP_EXP_COMP_TUTORIALS1)
iIETutorialBS2 = GET_MP_INT_CHARACTER_STAT(MP_STAT_IMP_EXP_COMP_TUTORIALS2)
ENDPROC
PROC IEAPP_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 RUN_IEAPP_HELP_TEXT_TUTORIAL()
STRING sHelp
IF NOT IS_BIT_SET(iBS, AH_BS_CURRENTLY_DISPLAYING_TUTORIAL_HELP)
AND NOT IS_BIT_SET(iBS, AH_BS_CURRENTLY_PLAYING_TUTORIAL)
IF SHOULD_IEAPP_HELP_TUTORIAL_BE_DISPLAYED(eWTBS_AH_VEH_SELECT)
sHelp = "IE_SEC_TUT7" //Landing page (Veh selection)
iTutorialHelpTime = 9000
SET_BIT(g_iWebsiteTutorialDisplayedBS, ENUM_TO_INT(eWTBS_AH_VEH_SELECT))
INCREMENT_NUM_TIMES_IE_WEB_TUT_HAS_PLAYED(iIETutorialBS1, iIETutorialBS2, IE_WEB_TUT_AH_VEH_SELECT)
ELIF SHOULD_IEAPP_HELP_TUTORIAL_BE_DISPLAYED(eWTBS_AH_BUYER_PAGE)
sHelp = "IE_SEC_TUT8" //Buyer page
iTutorialHelpTime = 9500
SET_BIT(g_iWebsiteTutorialDisplayedBS, ENUM_TO_INT(eWTBS_AH_BUYER_PAGE))
INCREMENT_NUM_TIMES_IE_WEB_TUT_HAS_PLAYED(iIETutorialBS1, iIETutorialBS2, IE_WEB_TUT_AH_BUYER_PAGE)
ELIF SHOULD_IEAPP_HELP_TUTORIAL_BE_DISPLAYED(eWTBS_AH_BUYER_PAGE_2)
sHelp = "IE_SEC_TUT13" //Buyer page 2
iTutorialHelpTime = 10000
SET_BIT(g_iWebsiteTutorialDisplayedBS, ENUM_TO_INT(eWTBS_AH_BUYER_PAGE_2))
INCREMENT_NUM_TIMES_IE_WEB_TUT_HAS_PLAYED(iIETutorialBS1, iIETutorialBS2, IE_WEB_TUT_AH_BUYER_PAGE_3)
ELIF SHOULD_IEAPP_HELP_TUTORIAL_BE_DISPLAYED(eWTBS_AH_COLLECTION_PAGE)
sHelp = "IE_SEC_TUT9" //Buyer page 2
iTutorialHelpTime = 10000
SET_BIT(g_iWebsiteTutorialDisplayedBS, ENUM_TO_INT(eWTBS_AH_COLLECTION_PAGE))
INCREMENT_NUM_TIMES_IE_WEB_TUT_HAS_PLAYED(iIETutorialBS1, iIETutorialBS2, IE_WEB_TUT_AH_BUYER_PAGE_2)
ELIF SHOULD_IEAPP_HELP_TUTORIAL_BE_DISPLAYED(eWTBS_AH_COLLECTION_PAGE_2)
sHelp = "IE_SEC_TUT10" //Vehicle collections page
iTutorialHelpTime = 8500
SET_BIT(g_iWebsiteTutorialDisplayedBS, ENUM_TO_INT(eWTBS_AH_COLLECTION_PAGE_2))
INCREMENT_NUM_TIMES_IE_WEB_TUT_HAS_PLAYED(iIETutorialBS1, iIETutorialBS2, IE_WEB_TUT_AH_COLLECTION_PAGE)
ELIF SHOULD_IEAPP_HELP_TUTORIAL_BE_DISPLAYED(eWTBS_AH_EXPORT_COOLDOWN)
sHelp = "IE_SEC_TUT11" //We have completed a vehicle collection
iTutorialHelpTime = 8500
SET_BIT(g_iWebsiteTutorialDisplayedBS, ENUM_TO_INT(eWTBS_AH_EXPORT_COOLDOWN))
INCREMENT_NUM_TIMES_IE_WEB_TUT_HAS_PLAYED(iIETutorialBS1, iIETutorialBS2, IE_WEB_TUT_AH_COLLECTION_PAGE_2)
ELIF SHOULD_IEAPP_HELP_TUTORIAL_BE_DISPLAYED(eWTBS_AH_BUYER_PAGE_3)
sHelp = "IE_SEC_TUT12" //Mission CD active
iTutorialHelpTime = 8000
SET_BIT(g_iWebsiteTutorialDisplayedBS, ENUM_TO_INT(eWTBS_AH_BUYER_PAGE_3))
INCREMENT_NUM_TIMES_IE_WEB_TUT_HAS_PLAYED(iIETutorialBS1, iIETutorialBS2, IE_WEB_TUT_AH_EXPORT_COOLDOWN)
ENDIF
ENDIF
IF NOT IS_STRING_NULL_OR_EMPTY(sHelp)
AND NOT IS_BIT_SET(iBS, AH_BS_CURRENTLY_DISPLAYING_TUTORIAL_HELP)
//Display the relevant help text
IEAPP_PRINT_TUTORIAL_HELP(sHelp, iTutorialHelpTime)
SET_BIT(iBS, AH_BS_CURRENTLY_DISPLAYING_TUTORIAL_HELP)
CPRINTLN(DEBUG_INTERNET, "<APP_IE_TUT> RUN_IEAPP_HELP_TEXT_TUTORIAL Printing: sHelp: ", sHelp, " time: ", iTutorialHelpTime)
ELIF IS_BIT_SET(iBS, AH_BS_CURRENTLY_DISPLAYING_TUTORIAL_HELP)
IF NOT HAS_NET_TIMER_STARTED(stTutorialTimer)
START_NET_TIMER(stTutorialTimer)
CPRINTLN(DEBUG_INTERNET, "<APP_IE_TUT> RUN_IEAPP_HELP_TEXT_TUTORIAL Starting timer for: ", sHelp, " time: ", iTutorialHelpTime)
ELIF HAS_NET_TIMER_EXPIRED(stTutorialTimer, iTutorialHelpTime)
CLEAR_BIT(iBS, AH_BS_CURRENTLY_DISPLAYING_TUTORIAL_HELP)
iTutorialHelpTime = 0
RESET_NET_TIMER(stTutorialTimer)
CPRINTLN(DEBUG_INTERNET, "<APP_IE_TUT> RUN_IEAPP_HELP_TEXT_TUTORIAL Starting timer expired for: ", sHelp, " time: ", iTutorialHelpTime)
IF HAVE_ALL_IEAPP_HELP_TUTORIALS_BEEN_COMPLETED()
SET_BIT(iBS, AH_BS_HELP_TEXT_TUTORIAL_COMPLETE)
ENDIF
ENDIF
ENDIF
ENDPROC
FUNC BOOL HAVE_ALL_DIALOGUE_TUTORIALS_BEEN_COMPLETED()
IF GET_PACKED_STAT_BOOL(PACKED_MP_BOOL_AH_AUTO_TUT_1)
AND GET_PACKED_STAT_BOOL(PACKED_MP_BOOL_AH_AUTO_TUT_2)
AND GET_PACKED_STAT_BOOL(PACKED_MP_BOOL_AH_AUTO_TUT_3)
CPRINTLN(DEBUG_INTERNET, "<APP_IE_TUT> HAVE_ALL_DIALOGUE_TUTORIALS_BEEN_COMPLETED TRUE")
RETURN TRUE
ENDIF
CPRINTLN(DEBUG_INTERNET, "<APP_IE_TUT> HAVE_ALL_DIALOGUE_TUTORIALS_BEEN_COMPLETED FALSE")
RETURN FALSE
ENDFUNC
FUNC STRING APPIE_TUT_GET_ROOT_LABEL(INT iTutorialID)
SWITCH iTutorialID
CASE 0 RETURN "IMMEC_TUT1" //First login
CASE 1 RETURN "IMMEC_TUT2" //Buyer page
CASE 2 RETURN "IMMEC_TUT3" //Collections page
ENDSWITCH
CASSERTLN(DEBUG_SAFEHOUSE, "APPIE_TUT_GET_ROOT_LABEL: Invalid tutorial ID: ", iTutorialID)
RETURN "IMMEC_TUT1"
ENDFUNC
PROC APPIE_START_TUTORIAL_DIALOGUE(INT iTutorialID)
IF CREATE_CONVERSATION(tutPedStruct, "IMMECAU", APPIE_TUT_GET_ROOT_LABEL(iTutorialID), CONV_PRIORITY_HIGH)
CPRINTLN(DEBUG_INTERNET, "<APP_IE> Created tutorial converstion: ", iTutorialID)
iTutorialDialogueID = -1
ENDIF
ENDPROC
PROC APPIE_RUN_TUTORIAL_DIALOGUE()
//Start the dialogue
IF iTutorialDialogueID != -1
APPIE_START_TUTORIAL_DIALOGUE(iTutorialDialogueID)
ENDIF
ENDPROC
PROC APPIE_SELECT_APP_DIALOGUE_TUTORIAL()
BOOL bStartNewDialogue
IF NOT IS_BIT_SET(iBS, AH_BS_CURRENTLY_PLAYING_TUTORIAL)
AND NOT IS_ANY_CONVERSATION_ONGOING_OR_QUEUED()
IF NOT GET_PACKED_STAT_BOOL(PACKED_MP_BOOL_AH_AUTO_TUT_1)
//First login
bStartNewDialogue = TRUE
iTutorialHelpTime = 6750
iTutorialDialogueID = 0
SET_PACKED_STAT_BOOL(PACKED_MP_BOOL_AH_AUTO_TUT_1, TRUE)
SET_BIT(iBS, AH_BS_TUTORIAL_1_PLAYED_THIS_BOOT)
ELIF iCurrentTabID = ciPageID_Buyers
AND NOT GET_PACKED_STAT_BOOL(PACKED_MP_BOOL_AH_AUTO_TUT_2)
//Buyers Page
bStartNewDialogue = TRUE
iTutorialHelpTime = 8000
iTutorialDialogueID = 1
SET_PACKED_STAT_BOOL(PACKED_MP_BOOL_AH_AUTO_TUT_2, TRUE)
SET_BIT(iBS, AH_BS_TUTORIAL_2_PLAYED_THIS_BOOT)
ELIF iCurrentTabID = ciPageID_Collection
AND NOT GET_PACKED_STAT_BOOL(PACKED_MP_BOOL_AH_AUTO_TUT_3)
//Collections page
bStartNewDialogue = TRUE
iTutorialHelpTime = 6000
iTutorialDialogueID = 2
SET_PACKED_STAT_BOOL(PACKED_MP_BOOL_AH_AUTO_TUT_3, TRUE)
SET_BIT(iBS, AH_BS_TUTORIAL_3_PLAYED_THIS_BOOT)
ENDIF
ENDIF
IF bStartNewDialogue
SET_BIT(iBS, AH_BS_CURRENTLY_PLAYING_TUTORIAL)
CPRINTLN(DEBUG_INTERNET, "<APP_IE_TUT> APPIE_SELECT_APP_DIALOGUE_TUTORIAL Running tutorial for: ", iTutorialHelpTime, " seconds. Tutorial ID: ", iTutorialDialogueID)
ELIF IS_BIT_SET(iBS, AH_BS_CURRENTLY_PLAYING_TUTORIAL)
IF NOT HAS_NET_TIMER_STARTED(stTutorialTimer)
START_NET_TIMER(stTutorialTimer)
CPRINTLN(DEBUG_INTERNET, "<APP_IE_TUT> APPIE_SELECT_APP_DIALOGUE_TUTORIAL Starting timer time: ", iTutorialHelpTime, " Tutorial ID: ", iTutorialDialogueID)
ELIF HAS_NET_TIMER_EXPIRED(stTutorialTimer, iTutorialHelpTime)
CLEAR_BIT(iBS, AH_BS_CURRENTLY_PLAYING_TUTORIAL)
iTutorialHelpTime = 0
RESET_NET_TIMER(stTutorialTimer)
CPRINTLN(DEBUG_INTERNET, "<APP_IE_TUT> APPIE_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, AH_BS_DIALOGUE_TUTORIAL_COMPLETE)
ENDIF
ENDIF
ENDIF
ENDPROC
PROC APPIE_SETUP_TUTORIAL_DIALOGUE()
SET_USE_DLC_DIALOGUE(TRUE)
ADD_PED_FOR_DIALOGUE(tutPedStruct, 2, NULL, "SECUROMECH")
CPRINTLN(DEBUG_INTERNET, "<APP_IE> APPIE_SETUP_TUTORIAL_DIALOGUE ped added for dialogue")
ENDPROC
#IF IS_DEBUG_BUILD
//PROC SETUP_PRIVATE_IE_APP_WIDGETS(IE_APP_DEBUG_WIDGET_VARS &debug_vars)
// START_WIDGET_GROUP("IE App")
// ADD_WIDGET_INT_SLIDER("IE Vehicle to set as owned", debug_vars.iVehicleSlider, 1, (ENUM_TO_INT(IE_VEHICLE_COUNT) - 1), 1)
// ADD_WIDGET_BOOL("Set IE vehicle as owned", debug_vars.bSetIEVehicleAsOwned)
//
// ADD_WIDGET_INT_SLIDER("IE Vehicle to set for steal mission", debug_vars.iStealMisVehSlider, 1, (ENUM_TO_INT(IE_VEHICLE_COUNT) - 1), 1)
// ADD_WIDGET_BOOL("Set steal mission vehicle", debug_vars.bSelectBuyMissionVehicle)
//
// ADD_WIDGET_BOOL("Remove all owned IE vehicles", debug_vars.bClearOwnedIEVehicles)
//
// INT i
//
// START_WIDGET_GROUP("IE vehicle lookup")
// FOR i = 1 TO (ENUM_TO_INT(IE_VEHICLE_COUNT) - 1)
// TEXT_LABEL_63 tlVehicle = i
// tlVehicle += ": "
// tlVehicle += GET_STRING_FROM_IE_VEHICLE_ENUM(INT_TO_ENUM (IE_VEHICLE_ENUM, i))
// ADD_WIDGET_STRING(tlVehicle)
// ENDFOR
// STOP_WIDGET_GROUP()
// STOP_WIDGET_GROUP()
//ENDPROC
//PROC UPDATE_DEBUG_WIDGETS(IE_APP_DEBUG_WIDGET_VARS &debug_vars)
// IF debug_vars.bSelectBuyMissionVehicle
// g_eIEStealMissionVehList[g_iIEStealMissionActiveVehicle] = INT_TO_ENUM(IE_VEHICLE_ENUM, debug_vars.iStealMisVehSlider)
// debug_vars.bSelectBuyMissionVehicle = FALSE
// ENDIF
// IF debug_vars.bSetIEVehicleAsOwned
//
// IF debug_vars.iVehicleSlider != 0
// IE_VEHICLE_ENUM eVehicle = INT_TO_ENUM(IE_VEHICLE_ENUM, debug_vars.iVehicleSlider)
// MODEL_NAMES eModel = GET_MODEL_NAME_FROM_IE_VEHICLE(eVehicle)
// BROADCAST_PLAYER_DELIVERED_VEHICLE(PLAYER_ID(), PLAYER_ID(), eModel, debug_vars.iVehicleSlider, eVehicle, 0, 0, GET_IE_DROPOFF_FROM_IMPORT_EXPORT_WAREHOUSE(GET_PLAYERS_OWNED_IE_GARAGE(PLAYER_ID())))
// FILL_OWNED_VEHICLE_LIST()
// FILL_VEHICLE_LIST()
// ENDIF
//
// debug_vars.bSetIEVehicleAsOwned = FALSE
// ENDIF
// IF debug_vars.bClearOwnedIEVehicles
// INT i
//
// REPEAT ciMAX_IE_OWNED_VEHICLES i
// GlobalplayerBD_FM[NATIVE_TO_INT(PLAYER_ID())].propertyDetails.bdIEgarageData.iWarehouseVehicles[i] = 0
// SET_MP_INT_CHARACTER_STAT(GET_IE_OWNED_WAREHOUSE_VEHICLE_STAT(i), 0)
// SET_PACKED_STAT_INT(GET_STAT_ENUM_FOR_IE_VEHICLE_HISTORY_LIST(i), 0)
// GlobalplayerBD_FM[NATIVE_TO_INT(PLAYER_ID())].propertyDetails.bdIEgarageData.iVehicleTotal = 0
// ENDREPEAT
//
// FILL_OWNED_VEHICLE_LIST()
//
// debug_vars.bClearOwnedIEVehicles = FALSE
// ENDIF
//ENDPROC
#ENDIF //IS_DEBUG_BILD
//FEATURE_IMPORT_EXPORT
//***********SCRIPT***********
SCRIPT
CPRINTLN(DEBUG_INTERNET, "<APP_IE> started \"", GET_THIS_SCRIPT_NAME(), "\"")
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(GET_HASH_KEY("appImportExport")) > 1
CPRINTLN(DEBUG_SAFEHOUSE, "<APP_IE> appImportExport script already running! cleaning up.")
CLEANUP_IE_APP(TRUE, FALSE)
ENDIF
siMovie = REQUEST_SCALEFORM_MOVIE("IMPORT_EXPORT_WAREHOUSE")
HANG_UP_AND_PUT_AWAY_PHONE(TRUE)
DISABLE_CELLPHONE(TRUE)
Pause_Objective_Text()
THEFEED_PAUSE()
WHILE (NOT HAS_SCALEFORM_MOVIE_LOADED(siMovie))
WAIT(0)
ENDWHILE
g_bIEAppVisible = TRUE
g_bIEAppFailedRemoveVehicles = FALSE
IF IS_PLAYER_IN_IE_GARAGE(PLAYER_ID())
eIEGarageID = GET_IE_GARAGE_PLAYER_IS_IN(PLAYER_ID())
UNUSED_PARAMETER(eIEGarageID)
ENDIF
// #IF IS_DEBUG_BUILD
// SETUP_PRIVATE_IE_APP_WIDGETS(eLocalWidgetVars)
// #ENDIF
g_bLaunchedPreSellVehModFromIEApp = FALSE
NET_SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
REMOVE_ALL_GANG_MEMBERS_FROM_VEH_SLOT()
SEND_INITIAL_DATA_TO_SCALEFORM()
IF IS_PC_VERSION()
SET_MULTIHEAD_SAFE(TRUE, TRUE, TRUE, TRUE)
ENDIF
UPDATE_IE_WEBSITE_TUTORIAL_BS()
IF HAVE_ALL_IEAPP_HELP_TUTORIALS_BEEN_COMPLETED()
SET_BIT(iBS, AH_BS_HELP_TEXT_TUTORIAL_COMPLETE)
ENDIF
IF HAVE_ALL_DIALOGUE_TUTORIALS_BEEN_COMPLETED()
SET_BIT(iBS, AH_BS_DIALOGUE_TUTORIAL_COMPLETE)
ENDIF
APPIE_SETUP_TUTORIAL_DIALOGUE()
START_AUDIO_SCENE("GTAO_Computer_Screen_Active_Scene")
#IF FEATURE_GEN9_EXCLUSIVE
SET_MP_BOOL_CHARACTER_STAT(MP_STAT_DARKNETACCESSED, TRUE)
#ENDIF
/// main update and render loop
WHILE g_bIEAppVisible
IF IS_BIT_SET(GlobalplayerBD_FM[NATIVE_TO_INT(PLAYER_ID())].propertyDetails.iBS,PROPERTY_BROADCAST_BS_PLAYER_EXITING_PROPERTY)
CPRINTLN(DEBUG_INTERNET, "<APP_IE> Shutting down! Player too far from the coords")
CLEANUP_IE_APP()
ELIF IS_PAUSE_MENU_ACTIVE()
IF eAppStage = eAppStage_SelectingOptions
CPRINTLN(DEBUG_INTERNET, "<APP_IE> Shutting down! Player opend the pause menu")
CLEANUP_IE_APP()
ENDIF
ELIF NOT NETWORK_IS_GAME_IN_PROGRESS()
CPRINTLN(DEBUG_INTERNET, "<APP_IE> Shutting down! No network game is currently active")
CLEANUP_IE_APP()
ELIF IS_ENTITY_DEAD(PLAYER_PED_ID())
CPRINTLN(DEBUG_INTERNET, "<APP_IE> Shutting down! Player is injured or dead")
CLEANUP_IE_APP()
ELIF NOT IS_PLAYER_IN_IE_GARAGE(PLAYER_ID())
#IF FEATURE_CASINO_HEIST
AND NOT WAS_BUSINESS_APP_SRIPT_LAUNCHED_FROM_HUB_APP()
#ENDIF
CPRINTLN(DEBUG_INTERNET, "<APP_IE> Shutting down! Player is not inside IE warehouse")
IF IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("IEAPPINPUTTRIG")
OR IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("IEAPPINPUTTRPC")
CLEAR_HELP()
ENDIF
CLEANUP_IE_APP()
ENDIF
SWITCH eAppStage
CASE eAppStage_SelectingOptions
RENDER_IE_APP()
IF NOT IS_BIT_SET(iBS, AH_BS_DIALOGUE_TUTORIAL_COMPLETE)
APPIE_SELECT_APP_DIALOGUE_TUTORIAL()
APPIE_RUN_TUTORIAL_DIALOGUE()
ENDIF
IF NOT IS_BIT_SET(iBS, AH_BS_HELP_TEXT_TUTORIAL_COMPLETE)
RUN_IEAPP_HELP_TEXT_TUTORIAL()
ENDIF
//This flag is set when this script has sent the event to start vehicle moddification
//We have to wait for the Modshop script to process this event for all (up to 4) players before we continue.
IF NOT bWaitingForCarmodEventToProcess
#IF IS_DEBUG_BUILD
//UPDATE_DEBUG_WIDGETS(eLocalWidgetVars)
#ENDIF
PASS_INPUTS_TO_SCALEFORM()
CHECK_BUTTON_PRESS()
ELSE
IF IS_MISSION_PERSONAL_CAR_MOD_STARTED(PLAYER_ID())
AND NETWORK_IS_PLAYER_IN_MP_CUTSCENE(PLAYER_ID())
CPRINTLN(DEBUG_INTERNET, "<APP_IE> SET_DATA_FOR_PRE_MISSION_LAUNCH_MODS: Options selected moving on to eAppStage_WaitingForVehicleMod")
eAppStage = eAppStage_WaitingForVehicleMod
IF IS_PC_VERSION()
SET_MULTIHEAD_SAFE(FALSE, TRUE, TRUE, TRUE)
ENDIF
ENDIF
ENDIF
BREAK
CASE eAppStage_WaitingForVehicleMod
Unpause_Objective_Text()
IF NOT HAS_NET_TIMER_STARTED(stModShopTimeOut)
START_NET_TIMER(stModShopTimeOut)
ELIF HAS_NET_TIMER_EXPIRED(stModShopTimeOut, 301000)
CPRINTLN(DEBUG_INTERNET, "<APP_IE> STAGE: eAppStage_WaitingForVehicleMod 5 minute timer expired sutting down!")
g_bLaunchedPreSellVehModFromIEApp = FALSE
CLEANUP_IE_APP()
ENDIF
IF IS_PERSONAL_CAR_MOD_IS_READY_TO_START_MISSION(PLAYER_ID())
eAppStage = eAppStage_LaunchingMission
RESET_NET_TIMER(stModShopTimeOut)
CPRINTLN(DEBUG_INTERNET, "<APP_IE> STAGE: eAppStage_WaitingForVehicleMod Modding finished, launching mission")
ELIF NOT IS_MISSION_PERSONAL_CAR_MOD_STARTED(PLAYER_ID())
CPRINTLN(DEBUG_INTERNET, "<APP_IE> STAGE: eAppStage_WaitingForVehicleMod IS_MISSION_PERSONAL_CAR_MOD_STARTED = FALSE sutting down!")
g_bLaunchedPreSellVehModFromIEApp = FALSE
CLEANUP_IE_APP()
ENDIF
BREAK
CASE eAppStage_LaunchingMission
IF CAN_PLAYER_LAUNCH_MISSION(IS_LOCAL_PLAYER_SELLING_VEHICLE_SET(), TRUE)
LAUNCH_MISSION()
WHILE IS_PLAYER_IN_ANY_SIMPLE_INTERIOR(PLAYER_ID())
WAIT(0)
ENDWHILE
CLEANUP_IE_APP(DEFAULT, FALSE)
ELSE
CDEBUG1LN(DEBUG_INTERNET, "<APP_IE> app in stage eAppStage_LaunchingMission but CAN_PLAYER_LAUNCH_MISSION returned false!")
IF iMissionUnavailableReason = ciFailReasonTooFewPlayers
g_iFailedToLaunchIEVehicleSellMission = 0
ELSE
g_iFailedToLaunchIEVehicleSellMission = 1
ENDIF
ENDIF
CLEANUP_IE_APP()
BREAK
ENDSWITCH
WAIT(0)
ENDWHILE
// Script should never reach here. Always terminate with cleanup function.
CASSERTLN(DEBUG_INTERNET, "<APP_IE> \"", GET_THIS_SCRIPT_NAME(), "\" should never reach here. Always terminate with cleanup function.")
ENDSCRIPT