4796 lines
218 KiB
Python
Executable File
4796 lines
218 KiB
Python
Executable File
//////////////////////////////////////////////////////////////////////////////////////////
|
|
// //
|
|
// SCRIPT NAME : social_controller.sc //
|
|
// AUTHOR : Kenneth Ross //
|
|
// DESCRIPTION : Monitors the social integration events. //
|
|
// //
|
|
//////////////////////////////////////////////////////////////////////////////////////////
|
|
|
|
USING "rage_builtins.sch"
|
|
USING "globals.sch"
|
|
|
|
USING "commands_script.sch"
|
|
USING "commands_apps.sch"
|
|
USING "commands_vehicle.sch"
|
|
USING "comms_control_public.sch"
|
|
USING "vehicle_gen_public.sch"
|
|
USING "reward_unlocks.sch"
|
|
USING "net_scoring_common.sch"
|
|
USING "social_public.sch"
|
|
USING "shop_public.sch"
|
|
USING "finance_modifiers_public.sch"
|
|
USING "Transition_Controller.sch"
|
|
USING "carmod_shop_private.sch"
|
|
USING "respawn_location_private.sch"
|
|
USING "social_feed_controller.sch"
|
|
USING "transition_saving.sch"
|
|
USING "commands_socialclub.sch"
|
|
USING "code_control_data_gta5.sch"
|
|
|
|
USING "net_tuneables_controller.sch"
|
|
USING "net_realty_new.sch"
|
|
USING "FM_Community_Playlists.sch"
|
|
|
|
USING "static_car_app_data.sch"
|
|
|
|
ENUM SOCIAL_STAGE_ENUM
|
|
SOCIAL_STAGE_INIT = 0,
|
|
SOCIAL_STAGE_PROCESS,
|
|
SOCIAL_STAGE_CLEANUP
|
|
ENDENUM
|
|
SOCIAL_STAGE_ENUM eStage = SOCIAL_STAGE_INIT
|
|
|
|
ENUM SOCIAL_INIT_ENUM
|
|
INITIALISED_IN_SP,
|
|
INITIALISED_IN_MP_FM,
|
|
|
|
NOT_INITIALISED
|
|
ENDENUM
|
|
SOCIAL_INIT_ENUM eInit = NOT_INITIALISED
|
|
|
|
INT iCurrentAppFrame
|
|
|
|
INT iMPVehicleBlock
|
|
INT iMPCarAppSlot
|
|
INT iMPSavedVehicleSlot
|
|
BOOL bPriorityUpdate
|
|
|
|
BOOL bCheckPlayerNameDiffSP = TRUE
|
|
BOOL bCheckPlayerNameDiffMP = TRUE
|
|
BOOL bResendAppDataForAccountLinkSP = FALSE
|
|
BOOL bResendAppDataForAccountLinkMP = FALSE
|
|
BOOL bWasLinkedLastFrame = TRUE
|
|
BOOL bResendAppDataForCharacter0 = FALSE
|
|
BOOL bResendAppDataForCharacter1 = FALSE
|
|
|
|
BOOL bDeletingCarData
|
|
INT iDeleteCarDataControl
|
|
|
|
BOOL bBlockFrameUpdate
|
|
|
|
BOOL bProcessModUnlocks
|
|
INT iModUnlockStage
|
|
MODEL_NAMES eModUnlockModel
|
|
TEXT_LABEL_23 sModUnlockBlockName
|
|
TEXT_LABEL_23 sModUnlockVehicleBlockName
|
|
|
|
BOOL bChopDeathProcessed
|
|
|
|
BOOL bRefreshAppDataOnInit
|
|
|
|
BOOL bSaveCarData
|
|
|
|
INT iSCProfanityToken
|
|
INT iSCLicensePlateToken
|
|
INT iSCTextCheckStage
|
|
|
|
INT iInitialOrderCheckTimer
|
|
BOOL bProcessOrderNow[3]
|
|
BOOL bProcessOrderOnPlayerVehicle[3]
|
|
BOOL bInitialOrderCheckComplete[3]
|
|
BOOL bProcessMPOrderNow
|
|
BOOL bPreProcessOrderDone
|
|
BOOL bCheckOrderCost
|
|
|
|
TEXT_LABEL_15 tlProfanityPlate
|
|
INT iAmbProfanityToken
|
|
INT iProfanityPlateBack
|
|
BOOL bProcessedProfanityChecks
|
|
|
|
BOOL bInitialPassComplete
|
|
|
|
INT iMPLockCheck
|
|
|
|
INT iModUnlockCheck
|
|
INT iModColourUnlockCheck
|
|
INT iCached_UnlockBitset[3]
|
|
INT iCarColoursProcessed = 0
|
|
INT iCarColoursUnlocked[6]
|
|
INT iCached_CarColoursUnlocked[6]
|
|
INT iWheelVariation
|
|
TIME_DATATYPE tdFetchTimer
|
|
BOOL bFetchTimerSet
|
|
|
|
STRUCT_MP_PRESENCE_EVENT_VARS socialFeedVars
|
|
|
|
|
|
SCRIPT_TIMER QualPlaylistTimer
|
|
|
|
#IF USE_MULTI_NUMBER_PLATE_SETUP_IN_MP
|
|
BOOL bRebuildPlatesList
|
|
#ENDIF
|
|
|
|
/// PURPOSE: Returns TRUE if the vehicle is of the correct type to use and in a suitable state
|
|
FUNC BOOL IS_VEHICLE_MODEL_SAFE_FOR_CARAPP(MODEL_NAMES eVehicleModel)
|
|
|
|
IF eVehicleModel = DUMMY_MODEL_FOR_SCRIPT
|
|
RETURN FALSE
|
|
ENDIF
|
|
|
|
// Service vehicles
|
|
SWITCH eVehicleModel
|
|
CASE POLICE
|
|
CASE POLICEOLD1
|
|
CASE POLICEOLD2
|
|
CASE POLICE2
|
|
CASE POLICE3
|
|
CASE POLICE4
|
|
CASE FBI
|
|
CASE FBI2
|
|
CASE POLMAV
|
|
CASE POLICEB
|
|
CASE POLICET
|
|
CASE RIOT
|
|
CASE SHERIFF
|
|
CASE PRANGER
|
|
CASE AMBULANCE
|
|
CASE FIRETRUK
|
|
CASE TAXI
|
|
CASE LGUARD
|
|
CASE RIPLEY
|
|
CASE DILETTANTE2
|
|
CASE AIRBUS
|
|
CASE AIRTUG
|
|
// Vans
|
|
CASE BURRITO
|
|
CASE RUMPO2
|
|
CASE SPEEDO
|
|
CASE SPEEDO2
|
|
CASE SCORCHER
|
|
CASE BMX
|
|
CASE CRUISER
|
|
CASE FIXTER
|
|
CASE CADDY
|
|
CASE FORKLIFT
|
|
CASE CADDY2
|
|
CASE CRUSADER
|
|
CASE TRIBIKE
|
|
CASE TRIBIKE2
|
|
CASE TRIBIKE3
|
|
CASE TRACTOR
|
|
CASE TRACTOR2
|
|
CASE MOWER
|
|
CASE TORNADO4
|
|
CASE DOCKTUG
|
|
CASE STRETCH
|
|
CASE BISON2
|
|
CASE BISON3
|
|
CASE BENSON
|
|
CASE POUNDER
|
|
CASE SUBMERSIBLE
|
|
CASE MONSTER
|
|
CASE TECHNICAL
|
|
CASE PHANTOM2
|
|
CASE WASTELANDER
|
|
CASE BOXVILLE5
|
|
CASE TERBYTE
|
|
CASE SPEEDO4
|
|
CASE MULE4
|
|
CASE POUNDER2
|
|
CASE KOSATKA
|
|
CASE DELUXO
|
|
RETURN FALSE
|
|
BREAK
|
|
DEFAULT
|
|
IF IS_VEHICLE_AN_ARENA_CONTENDER_VEHICLE(eVehicleModel)
|
|
RETURN FALSE
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
// Planes/Helis
|
|
IF IS_THIS_MODEL_A_HELI(eVehicleModel)
|
|
OR IS_THIS_MODEL_A_PLANE(eVehicleModel)
|
|
RETURN FALSE
|
|
ENDIF
|
|
|
|
// Nothing failed so must be safe
|
|
RETURN TRUE
|
|
ENDFUNC
|
|
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
|
|
BOOL bBlockInit_Debug, bResetController_Debug
|
|
|
|
BOOL bDebug_FailForLinkedAcccount
|
|
BOOL bDebug_FailForGamemode
|
|
|
|
BOOL bClearSPData
|
|
BOOL bClearMPData
|
|
|
|
BOOL bDeleteDataDebug
|
|
INT iDeleteDataSlotDebug
|
|
|
|
BOOL bSetProfanitPlate
|
|
|
|
BOOL bSetFakePlate
|
|
|
|
BOOL bDoProfanityCheck
|
|
|
|
BOOL bAlwaysAllowAutoProcess = FALSE
|
|
|
|
BOOL bObtain_all_coupon, bRedeem_all_coupon, bCouponObtained[MAX_COUPONS]
|
|
BOOL bRefresh_coupon_status
|
|
|
|
BOOL bRunPlateChecks
|
|
|
|
BOOL bForceMPWipe
|
|
BOOL bForceSPWipe
|
|
|
|
BOOL bGenerateStaticData
|
|
BOOL bDebugOpen
|
|
INT iVehicleModelIndex
|
|
|
|
BOOL bSendCurrentVehDataToApp
|
|
|
|
// BOOL bFetchingData
|
|
|
|
|
|
TEXT_WIDGET_ID widgetFolderName
|
|
TEXT_WIDGET_ID widgetShotName
|
|
STRING sFolderName = "X:/GTA5/"
|
|
STRING sShotName = "testShot"
|
|
STRUCT SCREENSHOT_STRUCT
|
|
INT iScreenShot = 0
|
|
|
|
VECTOR vCamCoord, vCamRot
|
|
FLOAT fCamFOV
|
|
|
|
FLOAT fCamNearOutOfFocusPlane, fCamNearInFocusPlane, fCamFarInFocusPlane, fCamFarOutOfFocusPlane
|
|
FLOAT fCamNearClip, fCamFarClip
|
|
|
|
BOOL bTakeScreenshot
|
|
BOOL bTestScreenshot
|
|
INT iRenderingCam = 0
|
|
ENDSTRUCT
|
|
SCREENSHOT_STRUCT sScreenshot
|
|
|
|
PROC SETUP_SOCIAL_CONTROL_WIDGETS()
|
|
START_WIDGET_GROUP("Social Controller")
|
|
|
|
START_WIDGET_GROUP("Processng vars")
|
|
ADD_WIDGET_BOOL("g_bPopulateEmptyAppSlots", g_bPopulateEmptyAppSlots)
|
|
ADD_WIDGET_INT_SLIDER("iStaggeredMaxFramesAppVehicles", g_sMPTunables.iStaggeredMaxFramesAppVehicles, 0, 1000, 1)
|
|
ADD_WIDGET_INT_SLIDER("iStaggeredMaxFramesAppOrders", g_sMPTunables.iStaggeredMaxFramesAppOrders, 0, 1000, 1)
|
|
STOP_WIDGET_GROUP()
|
|
|
|
ADD_WIDGET_BOOL("Generate static app data", bGenerateStaticData)
|
|
ADD_WIDGET_INT_READ_ONLY("Vehicle model index", iVehicleModelIndex)
|
|
|
|
ADD_WIDGET_BOOL("Run plate checks", bRunPlateChecks)
|
|
|
|
ADD_WIDGET_BOOL("Rebuild plate list", bRebuildPlatesList)
|
|
|
|
ADD_WIDGET_BOOL("Alwys do auto process", bAlwaysAllowAutoProcess)
|
|
|
|
ADD_WIDGET_BOOL("MP 5 min window open", g_b5MinWindowOpen)
|
|
ADD_WIDGET_BOOL("Block init", bBlockInit_Debug)
|
|
ADD_WIDGET_BOOL("Reset controller", bResetController_Debug)
|
|
|
|
ADD_WIDGET_BOOL("Clear SP data", bClearSPData)
|
|
ADD_WIDGET_BOOL("Clear MP data", bClearMPData)
|
|
|
|
ADD_WIDGET_BOOL("Force MP wipe", bForceMPWipe)
|
|
ADD_WIDGET_BOOL("Force SP wipe", bForceSPWipe)
|
|
|
|
ADD_WIDGET_INT_READ_ONLY("Inbox Processing Stage", socialFeedVars.iInboxProcessStage)
|
|
|
|
ADD_WIDGET_INT_READ_ONLY("Delete car data stage", iDeleteCarDataControl)
|
|
START_WIDGET_GROUP("Car App")
|
|
ADD_WIDGET_BOOL("Run profanity check", bDoProfanityCheck)
|
|
ADD_WIDGET_BOOL("Set Fake Plate", bSetFakePlate)
|
|
ADD_WIDGET_BOOL("Set Profanit Plate", bSetProfanitPlate)
|
|
ADD_WIDGET_INT_SLIDER("Vehicle slot", iDeleteDataSlotDebug, 0, MAX_MP_SAVED_VEHICLES-1, 1)
|
|
ADD_WIDGET_BOOL("Send data (current vehicle)", bSendCurrentVehDataToApp)
|
|
ADD_WIDGET_BOOL("Delete data", bDeleteDataDebug)
|
|
STOP_WIDGET_GROUP()
|
|
START_WIDGET_GROUP("Dog App")
|
|
ADD_WIDGET_FLOAT_READ_ONLY("Happiness", g_savedGlobals.sSocialData.sDogAppData.fHappiness)
|
|
ADD_WIDGET_FLOAT_READ_ONLY("Cleanliness", g_savedGlobals.sSocialData.sDogAppData.fCleanliness)
|
|
ADD_WIDGET_FLOAT_READ_ONLY("Hunger", g_savedGlobals.sSocialData.sDogAppData.fHunger)
|
|
ADD_WIDGET_INT_SLIDER("Training Level", g_savedGlobals.sSocialData.sDogAppData.iTrainingLevel, 0, 3, 1)
|
|
ADD_WIDGET_INT_SLIDER("Collar", g_savedGlobals.sSocialData.sDogAppData.iCollar, 0, 5, 1)
|
|
STOP_WIDGET_GROUP()
|
|
|
|
START_WIDGET_GROUP("Coupons")
|
|
ADD_WIDGET_BOOL("bObtain_all_coupon", bObtain_all_coupon)
|
|
ADD_WIDGET_BOOL("bRedeem_all_coupon", bRedeem_all_coupon)
|
|
ADD_WIDGET_BOOL("bRefresh_coupon_status", bRefresh_coupon_status)
|
|
|
|
COUPON_TYPE eC
|
|
REPEAT MAX_COUPONS eC
|
|
ADD_WIDGET_BOOL(GET_COUPON_STRING(eC), bCouponObtained[eC])
|
|
ENDREPEAT
|
|
|
|
ADD_WIDGET_INT_READ_ONLY("SP iSaveCoupons", g_savedGlobals.sFinanceData.iSaveCoupons)
|
|
ADD_WIDGET_INT_READ_ONLY("MP iSaveCoupons", g_savedMPGlobalsNew.g_savedMPGlobals[GET_SAVE_GAME_ARRAY_SLOT()].MpSavedGeneral.iSaveCoupons)
|
|
STOP_WIDGET_GROUP()
|
|
|
|
START_WIDGET_GROUP("Take Screenshot")
|
|
widgetFolderName = ADD_TEXT_WIDGET("Folder Name")
|
|
widgetShotName = ADD_TEXT_WIDGET("Screenshot Name")
|
|
SET_CONTENTS_OF_TEXT_WIDGET(widgetFolderName, sFolderName)
|
|
SET_CONTENTS_OF_TEXT_WIDGET(widgetShotName, sShotName)
|
|
ADD_WIDGET_BOOL("bTakeScreenshot", sScreenshot.bTakeScreenshot)
|
|
ADD_WIDGET_BOOL("bTestScreenshot", sScreenshot.bTestScreenshot)
|
|
|
|
START_NEW_WIDGET_COMBO()
|
|
ADD_TO_WIDGET_COMBO("GAMEPLAY RENDERING")
|
|
ADD_TO_WIDGET_COMBO("DEBUG RENDERING")
|
|
ADD_TO_WIDGET_COMBO("SCRIPT CAM RENDERING")
|
|
ADD_TO_WIDGET_COMBO("XXX_3")
|
|
ADD_TO_WIDGET_COMBO("XXX_4")
|
|
ADD_TO_WIDGET_COMBO("XXX_5")
|
|
ADD_TO_WIDGET_COMBO("XXX_6")
|
|
ADD_TO_WIDGET_COMBO("XXX_7")
|
|
STOP_WIDGET_COMBO("iRenderingCam", sScreenshot.iRenderingCam)
|
|
|
|
ADD_WIDGET_STRING("Cam Params")
|
|
ADD_WIDGET_VECTOR_SLIDER("vCamCoord", sScreenshot.vCamCoord, -9999, 9999, 0.1)
|
|
ADD_WIDGET_VECTOR_SLIDER("vCamRot", sScreenshot.vCamRot, -9999, 9999, 0.1)
|
|
ADD_WIDGET_FLOAT_SLIDER("fCamFOV", sScreenshot.fCamFOV, -9999, 9999, 0.1)
|
|
|
|
ADD_WIDGET_STRING("Near Out Of Focus Plane")
|
|
ADD_WIDGET_FLOAT_SLIDER("fCamNearOutOfFocusPlane", sScreenshot.fCamNearOutOfFocusPlane, -9999, 9999, 0.1)
|
|
ADD_WIDGET_FLOAT_SLIDER("fCamNearInFocusPlane", sScreenshot.fCamNearInFocusPlane, -9999, 9999, 0.1)
|
|
|
|
ADD_WIDGET_STRING("Far Out Of Focus Plane")
|
|
ADD_WIDGET_FLOAT_SLIDER("fCamFarInFocusPlane", sScreenshot.fCamFarInFocusPlane, -9999, 9999, 0.1)
|
|
ADD_WIDGET_FLOAT_SLIDER("fCamFarOutOfFocusPlane", sScreenshot.fCamFarOutOfFocusPlane, -9999, 9999, 0.1)
|
|
|
|
ADD_WIDGET_STRING("Near/Far Clip")
|
|
ADD_WIDGET_FLOAT_SLIDER("fCamNearClip", sScreenshot.fCamNearClip, -9999, 9999, 0.1)
|
|
ADD_WIDGET_FLOAT_SLIDER("fCamFarClip", sScreenshot.fCamFarClip, -9999, 9999, 0.1)
|
|
STOP_WIDGET_GROUP()
|
|
|
|
|
|
|
|
STOP_WIDGET_GROUP()
|
|
ENDPROC
|
|
|
|
PROC MAINTAIN_SOCIAL_CONTROL_WIDGETS()
|
|
|
|
// IF NETWORK_IS_GAME_IN_PROGRESS()
|
|
// IF bFetchingData
|
|
// DRAW_RECT(0.5, 0.1, 0.1, 0.05, 255, 255, 0, 255)
|
|
// ELIF ABSI(GET_TIME_DIFFERENCE(GET_NETWORK_TIME(), tdFetchTimer)) < 1500
|
|
// FLOAT fCooldownPerc = TO_FLOAT(ABSI(GET_TIME_DIFFERENCE(GET_NETWORK_TIME(), tdFetchTimer))) / 1500.0
|
|
// DRAW_RECT(0.5, 0.1, 0.1-(0.1*fCooldownPerc), 0.05, 0, 128, 255, 255)
|
|
// ENDIF
|
|
// ENDIF
|
|
|
|
IF bSendCurrentVehDataToApp
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
AND IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
VEHICLE_INDEX vehID = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID(), TRUE)
|
|
IF DOES_ENTITY_EXIST(vehID)
|
|
AND IS_VEHICLE_DRIVEABLE(vehID)
|
|
IF NETWORK_IS_GAME_IN_PROGRESS()
|
|
MP_SAVE_VEHICLE_STORE_CAR_DETAILS_IN_SLOT(vehID, iDeleteDataSlotDebug, TRUE, FALSE, TRUE, TRUE, TRUE)
|
|
ELSE
|
|
UPDATE_PLAYER_PED_SAVED_VEHICLE(GET_CURRENT_PLAYER_PED_ENUM(), vehID, 0, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
bSendCurrentVehDataToApp = FALSE
|
|
ENDIF
|
|
|
|
IF bGenerateStaticData
|
|
|
|
OPEN_DEBUG_FILE()
|
|
bDebugOpen = TRUE
|
|
SAVE_NEWLINE_TO_DEBUG_FILE()
|
|
|
|
SAVE_STRING_TO_DEBUG_FILE("PROC GET_STATIC_CAR_APP_DATA_FOR_VEHICLE(MODEL_NAMES eModel, STATIC_CAR_APP_DATA &sData)")SAVE_NEWLINE_TO_DEBUG_FILE()
|
|
SAVE_STRING_TO_DEBUG_FILE(" INT iModel = ENUM_TO_INT(eModel)")SAVE_NEWLINE_TO_DEBUG_FILE()
|
|
|
|
INT iSwitchReset = -1
|
|
MODEL_NAMES eReturnVehicleModelHashKey
|
|
VEHICLE_INDEX tempVeh
|
|
|
|
iVehicleModelIndex = 0
|
|
|
|
WHILE GET_VEHICLE_MODEL_FROM_INDEX(iVehicleModelIndex, eReturnVehicleModelHashKey)
|
|
|
|
IF IS_VEHICLE_MODEL_SAFE_FOR_CARAPP(eReturnVehicleModelHashKey)
|
|
|
|
REQUEST_MODEL(eReturnVehicleModelHashKey)
|
|
WHILE NOT HAS_MODEL_LOADED(eReturnVehicleModelHashKey)
|
|
REQUEST_MODEL(eReturnVehicleModelHashKey)
|
|
WAIT(0)
|
|
ENDWHILE
|
|
|
|
tempVeh = CREATE_VEHICLE(eReturnVehicleModelHashKey, <<0, 0, 500>>, 0.0, FALSE, FALSE)
|
|
|
|
IF DOES_ENTITY_EXIST(tempVeh)
|
|
AND IS_VEHICLE_DRIVEABLE(tempVeh)
|
|
AND GET_NUM_MOD_KITS(tempVeh) > 0
|
|
|
|
|
|
IF iSwitchReset = 0
|
|
SAVE_STRING_TO_DEBUG_FILE(" ENDSWITCH")SAVE_NEWLINE_TO_DEBUG_FILE()
|
|
SAVE_STRING_TO_DEBUG_FILE(" SWITCH iModel")SAVE_NEWLINE_TO_DEBUG_FILE()
|
|
ENDIF
|
|
IF iSwitchReset = -1
|
|
SAVE_STRING_TO_DEBUG_FILE(" SWITCH iModel")SAVE_NEWLINE_TO_DEBUG_FILE()
|
|
iSwitchReset++
|
|
ENDIF
|
|
iSwitchReset++
|
|
IF iSwitchReset > 25
|
|
WAIT(0)
|
|
iSwitchReset = 0
|
|
DOES_ENTITY_EXIST(tempVeh)
|
|
IS_VEHICLE_DRIVEABLE(tempVeh)
|
|
ENDIF
|
|
|
|
SET_VEHICLE_MOD_KIT(tempVeh, 0)
|
|
|
|
SAVE_STRING_TO_DEBUG_FILE(" CASE ")SAVE_INT_TO_DEBUG_FILE(ENUM_TO_INT(eReturnVehicleModelHashKey))SAVE_STRING_TO_DEBUG_FILE(" // ")SAVE_STRING_TO_DEBUG_FILE(GET_MODEL_NAME_FOR_DEBUG(eReturnVehicleModelHashKey))SAVE_NEWLINE_TO_DEBUG_FILE()
|
|
SAVE_STRING_TO_DEBUG_FILE(" sData.iModCountEngine = ")SAVE_INT_TO_DEBUG_FILE(GET_NUM_VEHICLE_MODS(tempVeh, MOD_ENGINE)+1)SAVE_NEWLINE_TO_DEBUG_FILE()
|
|
SAVE_STRING_TO_DEBUG_FILE(" sData.iModCountBrakes = ")SAVE_INT_TO_DEBUG_FILE(GET_NUM_VEHICLE_MODS(tempVeh, MOD_BRAKES)+1)SAVE_NEWLINE_TO_DEBUG_FILE()
|
|
SAVE_STRING_TO_DEBUG_FILE(" sData.iModCountExhaust = ")SAVE_INT_TO_DEBUG_FILE(GET_NUM_VEHICLE_MODS(tempVeh, MOD_EXHAUST)+1)SAVE_NEWLINE_TO_DEBUG_FILE()
|
|
SAVE_STRING_TO_DEBUG_FILE(" sData.iModCountArmour = ")SAVE_INT_TO_DEBUG_FILE(GET_NUM_VEHICLE_MODS(tempVeh, MOD_ARMOUR)+1)SAVE_NEWLINE_TO_DEBUG_FILE()
|
|
SAVE_STRING_TO_DEBUG_FILE(" sData.iModCountHorn = ")SAVE_INT_TO_DEBUG_FILE(GET_NUM_VEHICLE_MODS(tempVeh, MOD_HORN)+1)SAVE_NEWLINE_TO_DEBUG_FILE()
|
|
SAVE_STRING_TO_DEBUG_FILE(" sData.iModCountSuspension = ")SAVE_INT_TO_DEBUG_FILE(GET_NUM_VEHICLE_MODS(tempVeh, MOD_SUSPENSION)+1)SAVE_NEWLINE_TO_DEBUG_FILE()
|
|
SAVE_STRING_TO_DEBUG_FILE(" sData.fModPriceModifier = ")SAVE_FLOAT_TO_DEBUG_FILE(GET_VEHICLE_MOD_PRICE_MODIFIER(tempVeh))SAVE_NEWLINE_TO_DEBUG_FILE()
|
|
SAVE_STRING_TO_DEBUG_FILE(" sData.iModColoursThatCanBeSet = ")SAVE_INT_TO_DEBUG_FILE(GET_VEHICLE_COLOURS_WHICH_CAN_BE_SET(tempVeh))SAVE_NEWLINE_TO_DEBUG_FILE()
|
|
SAVE_STRING_TO_DEBUG_FILE(" sData.iModKitType = ")SAVE_INT_TO_DEBUG_FILE(ENUM_TO_INT(GET_VEHICLE_MOD_KIT_TYPE(tempVeh)))SAVE_NEWLINE_TO_DEBUG_FILE()
|
|
SAVE_STRING_TO_DEBUG_FILE(" BREAK")SAVE_NEWLINE_TO_DEBUG_FILE()
|
|
ENDIF
|
|
|
|
DELETE_VEHICLE(tempVeh)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(eReturnVehicleModelHashKey)
|
|
ENDIF
|
|
|
|
iVehicleModelIndex++
|
|
|
|
IF NOT bGenerateStaticData
|
|
iVehicleModelIndex = 9999
|
|
ENDIF
|
|
ENDWHILE
|
|
|
|
IF iSwitchReset != 0
|
|
SAVE_STRING_TO_DEBUG_FILE(" ENDSWITCH")SAVE_NEWLINE_TO_DEBUG_FILE()
|
|
ENDIF
|
|
|
|
SAVE_STRING_TO_DEBUG_FILE("ENDPROC")SAVE_NEWLINE_TO_DEBUG_FILE()
|
|
CLOSE_DEBUG_FILE()
|
|
bDebugOpen = FALSE
|
|
|
|
bGenerateStaticData = FALSE
|
|
ELSE
|
|
IF bDebugOpen
|
|
CLOSE_DEBUG_FILE()
|
|
bDebugOpen = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
IF bDoProfanityCheck
|
|
bProcessedProfanityChecks = FALSE
|
|
g_savedGlobals.sSocialData.tlCarAppPlateText = "CUMFACE"
|
|
g_savedGlobals.sSocialData.bCarAppPlateSet = TRUE
|
|
bDoProfanityCheck = FALSE
|
|
ENDIF
|
|
IF bSetFakePlate
|
|
g_savedGlobals.sSocialData.bCarAppPlateSet = TRUE
|
|
g_savedGlobals.sSocialData.tlCarAppPlateText = "KEK SP"
|
|
g_savedGlobals.sSocialData.iCarAppPlateBack = 1
|
|
|
|
g_savedMPGlobalsNew.g_savedMPGlobals[GET_SAVE_GAME_ARRAY_SLOT()].MpSavedCarApp.bCarAppPlateSet = TRUE
|
|
g_savedMPGlobalsNew.g_savedMPGlobals[GET_SAVE_GAME_ARRAY_SLOT()].MpSavedCarApp.tlCarAppPlateText = "KEK MP"
|
|
g_savedMPGlobalsNew.g_savedMPGlobals[GET_SAVE_GAME_ARRAY_SLOT()].MpSavedCarApp.iCarAppPlateBack = 1
|
|
|
|
bSetFakePlate = FALSE
|
|
ENDIF
|
|
IF bSetProfanitPlate
|
|
|
|
SET_PACKED_STAT_INT(PACKED_MP_SC_PLATE_0, 5)
|
|
SET_PACKED_STAT_INT(PACKED_MP_SC_PLATE_1, 20)
|
|
SET_PACKED_STAT_INT(PACKED_MP_SC_PLATE_2, 2)
|
|
SET_PACKED_STAT_INT(PACKED_MP_SC_PLATE_3, 10)
|
|
|
|
g_tlPlateTextForSCAccount[0] = "fuck"
|
|
|
|
g_bAddPlateTextToSC = TRUE
|
|
bRebuildPlatesList = FALSE
|
|
|
|
bSetProfanitPlate = FALSE
|
|
ENDIF
|
|
IF bDeleteDataDebug
|
|
IF NETWORK_IS_GAME_IN_PROGRESS()
|
|
SET_BIT(g_MpSavedVehicles[iDeleteDataSlotDebug].iVehicleBS, MP_SAVED_VEHICLE_CARAPP_DELETE)
|
|
ELSE
|
|
IF iDeleteDataSlotDebug >= COUNT_OF(g_savedGlobals.sSocialData.sCarAppData)
|
|
iDeleteDataSlotDebug = COUNT_OF(g_savedGlobals.sSocialData.sCarAppData)-1
|
|
ENDIF
|
|
g_savedGlobals.sSocialData.sCarAppData[iDeleteDataSlotDebug].bDeleteData = TRUE
|
|
ENDIF
|
|
bDeleteDataDebug = FALSE
|
|
ENDIF
|
|
IF bClearSPData
|
|
g_savedGlobals.sSocialData.bSingleplayeDataWiped = FALSE
|
|
bClearSPData = FALSE
|
|
ENDIF
|
|
IF bClearMPData
|
|
g_savedMPGlobalsNew.g_savedMPGlobals[GET_SAVE_GAME_ARRAY_SLOT()].MpSavedCarApp.bMultiplayerDataWiped = FALSE
|
|
bClearMPData = FALSE
|
|
ENDIF
|
|
|
|
COUPON_TYPE eC
|
|
IF bObtain_all_coupon
|
|
OR IS_DEBUG_KEY_JUST_PRESSED(KEY_C, KEYBOARD_MODIFIER_CTRL, "Coupon command line script debug trigger - obtain all (keyboard)")
|
|
IF bObtain_all_coupon
|
|
CPRINTLN(DEBUG_SOCIAL,"Coupon command line script debug trigger - obtain all (widget)")
|
|
ELSE
|
|
CPRINTLN(DEBUG_SOCIAL,"Coupon command line script debug trigger - obtain all (keyboard)")
|
|
ENDIF
|
|
|
|
REPEAT MAX_COUPONS eC
|
|
OBTAIN_COUPON(eC)
|
|
ENDREPEAT
|
|
|
|
bObtain_all_coupon = FALSE
|
|
ENDIF
|
|
IF bRedeem_all_coupon
|
|
CPRINTLN(DEBUG_SOCIAL,"Coupon command line script debug trigger - redeem all")
|
|
REPEAT MAX_COUPONS eC
|
|
REDEEM_COUPON(eC)
|
|
ENDREPEAT
|
|
|
|
bRedeem_all_coupon = FALSE
|
|
ENDIF
|
|
IF bRefresh_coupon_status
|
|
REPEAT MAX_COUPONS eC
|
|
IF NOT HAS_IMPORTANT_STATS_LOADED()
|
|
AND (eC = COUPON_CASINO_PLANE_SITE
|
|
OR eC = COUPON_CASINO_BOAT_SITE
|
|
OR eC = COUPON_CASINO_CAR_SITE
|
|
OR eC = COUPON_CASINO_CAR_SITE2
|
|
OR eC = COUPON_CASINO_MIL_SITE
|
|
OR eC = COUPON_CASINO_BIKE_SITE
|
|
#IF FEATURE_GEN9_EXCLUSIVE
|
|
OR IS_THIS_HSW_MOD_COUPON(eC)
|
|
OR IS_THIS_HSW_UPGRADE_COUPON(eC)
|
|
#ENDIF )
|
|
//
|
|
ELSE
|
|
bCouponObtained[eC] = DOES_SAVE_HAVE_COUPON(eC)
|
|
ENDIF
|
|
ENDREPEAT
|
|
bRefresh_coupon_status = FALSE
|
|
ENDIF
|
|
|
|
IF sScreenshot.bTakeScreenshot
|
|
OR sScreenshot.bTestScreenshot
|
|
|
|
IF IS_VECTOR_ZERO(sScreenshot.vCamCoord)
|
|
AND IS_VECTOR_ZERO(sScreenshot.vCamRot)
|
|
AND (sScreenshot.fCamFOV = 0)
|
|
sScreenshot.vCamCoord = GET_CAM_COORD(GET_RENDERING_CAM())
|
|
sScreenshot.vCamRot = GET_CAM_ROT(GET_RENDERING_CAM())
|
|
sScreenshot.fCamFOV = GET_CAM_FOV(GET_RENDERING_CAM())
|
|
ENDIF
|
|
|
|
// FLOAT fCamDOFStrength = GET_CAM_DOF_STRENGTH(GET_RENDERING_CAM())
|
|
|
|
IF (sScreenshot.fCamNearOutOfFocusPlane = 0)
|
|
AND (sScreenshot.fCamNearInFocusPlane = 0)
|
|
AND (sScreenshot.fCamFarInFocusPlane = 0)
|
|
AND (sScreenshot.fCamFarOutOfFocusPlane = 0)
|
|
GET_CAM_DOF_PLANES(GET_RENDERING_CAM(), sScreenshot.fCamNearOutOfFocusPlane, sScreenshot.fCamNearInFocusPlane, sScreenshot.fCamFarInFocusPlane, sScreenshot.fCamFarOutOfFocusPlane)
|
|
ENDIF
|
|
|
|
IF sScreenshot.fCamNearClip = 0
|
|
sScreenshot.fCamNearClip = GET_CAM_NEAR_CLIP(GET_RENDERING_CAM())
|
|
ENDIF
|
|
IF sScreenshot.fCamFarClip = 0
|
|
sScreenshot.fCamFarClip = GET_CAM_FAR_CLIP(GET_RENDERING_CAM())
|
|
ENDIF
|
|
|
|
CAMERA_INDEX camClone = CREATE_CAMERA_WITH_PARAMS(CAMTYPE_SCRIPTED, sScreenshot.vCamCoord, sScreenshot.vCamRot, sScreenshot.fCamFOV)
|
|
SET_CAM_DOF_PLANES(camClone, sScreenshot.fCamNearOutOfFocusPlane, sScreenshot.fCamNearInFocusPlane, sScreenshot.fCamFarInFocusPlane, sScreenshot.fCamFarOutOfFocusPlane)
|
|
|
|
SET_CAM_NEAR_CLIP(camClone, sScreenshot.fCamNearClip)
|
|
SET_CAM_FAR_CLIP(camClone, sScreenshot.fCamFarClip)
|
|
|
|
INTERIOR_INSTANCE_INDEX InteriorInstanceIndex
|
|
INT RoomKey
|
|
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
|
|
InteriorInstanceIndex = GET_INTERIOR_FROM_ENTITY(GET_PLAYER_PED(PLAYER_ID()))
|
|
RoomKey = GET_ROOM_KEY_FROM_ENTITY(PLAYER_PED_ID())
|
|
ENDIF
|
|
|
|
SET_CAM_ACTIVE(camClone, TRUE)
|
|
RENDER_SCRIPT_CAMS(TRUE, FALSE, 0)
|
|
WAIT(0)
|
|
|
|
OBJECT_INDEX objID
|
|
WHILE sScreenshot.bTestScreenshot
|
|
SET_CAM_COORD(GET_RENDERING_CAM(), sScreenshot.vCamCoord)
|
|
SET_CAM_ROT(GET_RENDERING_CAM(), sScreenshot.vCamRot)
|
|
SET_CAM_FOV(GET_RENDERING_CAM(), sScreenshot.fCamFOV)
|
|
|
|
SET_CAM_DOF_PLANES(camClone, sScreenshot.fCamNearOutOfFocusPlane, sScreenshot.fCamNearInFocusPlane, sScreenshot.fCamFarInFocusPlane, sScreenshot.fCamFarOutOfFocusPlane)
|
|
|
|
SET_CAM_NEAR_CLIP(camClone, sScreenshot.fCamNearClip)
|
|
SET_CAM_FAR_CLIP(camClone, sScreenshot.fCamFarClip)
|
|
|
|
IF NOT DOES_ENTITY_EXIST(objID)
|
|
MODEL_NAMES modelBag = PROP_GOLF_BALL
|
|
REQUEST_MODEL(modelBag)
|
|
IF HAS_MODEL_LOADED(modelBag)
|
|
objID = CREATE_OBJECT(modelBag, sScreenshot.vCamCoord)
|
|
SET_ENTITY_ROTATION(objID, sScreenshot.vCamRot)
|
|
FREEZE_ENTITY_POSITION(objID, TRUE)
|
|
SET_ENTITY_VISIBLE(objID, FALSE)
|
|
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(modelBag)
|
|
ENDIF
|
|
ELSE
|
|
VECTOR vSphereG = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(objID, <<0,(sScreenshot.fCamNearClip+0.75),0>>)
|
|
DRAW_DEBUG_SPHERE(vSphereG, 1.0, 000,255,000,255)
|
|
ENDIF
|
|
|
|
FORCE_ROOM_FOR_GAME_VIEWPORT(InteriorInstanceIndex, RoomKey)
|
|
|
|
IF IS_GAMEPLAY_CAM_RENDERING()
|
|
sScreenshot.iRenderingCam = 0 // ADD_TO_WIDGET_COMBO("GAMEPLAY RENDERING")
|
|
|
|
IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_C)
|
|
sScreenshot.vCamCoord = GET_GAMEPLAY_CAM_COORD()
|
|
sScreenshot.vCamRot = GET_GAMEPLAY_CAM_ROT()
|
|
sScreenshot.fCamFOV = GET_GAMEPLAY_CAM_FOV()
|
|
ENDIF
|
|
ENDIF
|
|
IF IS_CAM_RENDERING(GET_DEBUG_CAM())
|
|
STRING sLiteral = "DEBUG RENDERING"
|
|
HUD_COLOURS eColour = HUD_COLOUR_PURPLE
|
|
|
|
INT red = 0, green = 0, blue = 0, alpha_value = 0
|
|
GET_HUD_COLOUR(eColour, red, green, blue, alpha_value)
|
|
|
|
// SET_TEXT_SCALE(0.45, 0.45)
|
|
SET_TEXT_COLOUR(red, green, blue, alpha_value)
|
|
DISPLAY_TEXT_WITH_LITERAL_STRING(0.5, 0.5, "STRING", sLiteral)
|
|
sScreenshot.iRenderingCam = 1 // ADD_TO_WIDGET_COMBO("DEBUG RENDERING")
|
|
|
|
IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_C)
|
|
sScreenshot.vCamCoord = GET_CAM_COORD(GET_RENDERING_CAM())
|
|
sScreenshot.vCamRot = GET_CAM_ROT(GET_RENDERING_CAM())
|
|
sScreenshot.fCamFOV = GET_CAM_FOV(GET_RENDERING_CAM())
|
|
ENDIF
|
|
ENDIF
|
|
IF IS_CAM_RENDERING(camClone)
|
|
sScreenshot.iRenderingCam = 2 // ADD_TO_WIDGET_COMBO("SCRIPT CAM RENDERING")
|
|
ENDIF
|
|
|
|
IF sScreenshot.bTakeScreenshot
|
|
sScreenshot.bTestScreenshot = FALSE
|
|
ENDIF
|
|
|
|
WAIT(0)
|
|
ENDWHILE
|
|
IF DOES_ENTITY_EXIST(objID)
|
|
DELETE_OBJECT(objID)
|
|
ENDIF
|
|
|
|
// Check widget for screenshot name
|
|
sFolderName = GET_CONTENTS_OF_TEXT_WIDGET(widgetFolderName)
|
|
sShotName = GET_CONTENTS_OF_TEXT_WIDGET(widgetShotName)
|
|
|
|
// Build screenshot name and directory
|
|
TEXT_LABEL_63 sTemp = sFolderName
|
|
sTemp += sShotName
|
|
IF sScreenshot.iScreenShot < 10
|
|
sTemp += "_00"
|
|
ELIF sScreenshot.iScreenShot < 100
|
|
sTemp += "_0"
|
|
ELSE
|
|
sTemp += "_"
|
|
ENDIF
|
|
sTemp += sScreenshot.iScreenShot
|
|
|
|
// Take screenshot
|
|
SAVE_SCREENSHOT(sTemp)
|
|
sScreenshot.iScreenShot++
|
|
|
|
IF DOES_CAM_EXIST(camClone)
|
|
IF IS_CAM_ACTIVE(camClone)
|
|
SET_CAM_ACTIVE(camClone, FALSE)
|
|
ENDIF
|
|
DESTROY_CAM(camClone)
|
|
ENDIF
|
|
RENDER_SCRIPT_CAMS(FALSE, FALSE)
|
|
|
|
sScreenshot.bTakeScreenshot = FALSE
|
|
sScreenshot.bTestScreenshot = FALSE
|
|
ENDIF
|
|
ENDPROC
|
|
#ENDIF
|
|
|
|
// ===========================================================================================================
|
|
// Cleanup
|
|
// ===========================================================================================================
|
|
|
|
// PURPOSE: Ensures that the script gets a chance to cleanup under specific circumstances (ie: moving from SP to MP)
|
|
//
|
|
PROC Script_Cleanup()
|
|
// CURRENTLY NOTHING TO CLEANUP
|
|
TERMINATE_THIS_THREAD()
|
|
ENDPROC
|
|
|
|
|
|
|
|
FUNC STRING GET_APP_ATTRIBUTE_INT(STRING sAttribute)
|
|
|
|
INT iAttributeHash = GET_HASH_KEY(sAttribute)
|
|
|
|
IF GET_HASH_KEY("uid") = iAttributeHash RETURN "0" ENDIF
|
|
IF GET_HASH_KEY("carModel") = iAttributeHash RETURN "1" ENDIF
|
|
IF GET_HASH_KEY("playerSlot") = iAttributeHash RETURN "2" ENDIF
|
|
IF GET_HASH_KEY("playerRank") = iAttributeHash RETURN "3" ENDIF
|
|
IF GET_HASH_KEY("playerGangR") = iAttributeHash RETURN "4" ENDIF
|
|
IF GET_HASH_KEY("playerGangG") = iAttributeHash RETURN "5" ENDIF
|
|
IF GET_HASH_KEY("playerGangB") = iAttributeHash RETURN "6" ENDIF
|
|
IF GET_HASH_KEY("carColour1") = iAttributeHash RETURN "7" ENDIF
|
|
IF GET_HASH_KEY("carColour2") = iAttributeHash RETURN "8" ENDIF
|
|
IF GET_HASH_KEY("carPlateBack") = iAttributeHash RETURN "9" ENDIF
|
|
IF GET_HASH_KEY("windowTint") = iAttributeHash RETURN "10" ENDIF
|
|
IF GET_HASH_KEY("bulletProofTyres") = iAttributeHash RETURN "11" ENDIF
|
|
IF GET_HASH_KEY("carEngine") = iAttributeHash RETURN "12" ENDIF
|
|
IF GET_HASH_KEY("carBrakes") = iAttributeHash RETURN "13" ENDIF
|
|
IF GET_HASH_KEY("carExhaust") = iAttributeHash RETURN "14" ENDIF
|
|
IF GET_HASH_KEY("carWheel") = iAttributeHash RETURN "15" ENDIF
|
|
IF GET_HASH_KEY("carHorn1") = iAttributeHash RETURN "16" ENDIF
|
|
IF GET_HASH_KEY("carHorn2") = iAttributeHash RETURN "17" ENDIF
|
|
IF GET_HASH_KEY("carHorn3") = iAttributeHash RETURN "18" ENDIF
|
|
IF GET_HASH_KEY("carHorn4") = iAttributeHash RETURN "19" ENDIF
|
|
IF GET_HASH_KEY("carHorn5") = iAttributeHash RETURN "20" ENDIF
|
|
IF GET_HASH_KEY("carHorn6") = iAttributeHash RETURN "21" ENDIF
|
|
IF GET_HASH_KEY("carHorn7") = iAttributeHash RETURN "22" ENDIF
|
|
IF GET_HASH_KEY("carHorn8") = iAttributeHash RETURN "23" ENDIF
|
|
IF GET_HASH_KEY("carHorn9") = iAttributeHash RETURN "24" ENDIF
|
|
IF GET_HASH_KEY("tyreSmoke") = iAttributeHash RETURN "25" ENDIF
|
|
IF GET_HASH_KEY("tyreSmokeColourRed") = iAttributeHash RETURN "26" ENDIF
|
|
IF GET_HASH_KEY("tyreSmokeColourGreen") = iAttributeHash RETURN "27" ENDIF
|
|
IF GET_HASH_KEY("tyreSmokeColourBlue") = iAttributeHash RETURN "28" ENDIF
|
|
IF GET_HASH_KEY("carHorn") = iAttributeHash RETURN "29" ENDIF
|
|
IF GET_HASH_KEY("carArmour") = iAttributeHash RETURN "30" ENDIF
|
|
IF GET_HASH_KEY("carTurbo") = iAttributeHash RETURN "31" ENDIF
|
|
IF GET_HASH_KEY("carSuspension") = iAttributeHash RETURN "32" ENDIF
|
|
IF GET_HASH_KEY("carXenonLights") = iAttributeHash RETURN "33" ENDIF
|
|
IF GET_HASH_KEY("carWheelType") = iAttributeHash RETURN "34" ENDIF
|
|
IF GET_HASH_KEY("carUnlocked") = iAttributeHash RETURN "35" ENDIF
|
|
IF GET_HASH_KEY("carColour1Unlocked") = iAttributeHash RETURN "36" ENDIF
|
|
IF GET_HASH_KEY("carColour2Unlocked") = iAttributeHash RETURN "37" ENDIF
|
|
IF GET_HASH_KEY("tyreSmokeColourEnabled") = iAttributeHash RETURN "38" ENDIF
|
|
IF GET_HASH_KEY("carEngineCount") = iAttributeHash RETURN "39" ENDIF
|
|
IF GET_HASH_KEY("carBrakesCount") = iAttributeHash RETURN "40" ENDIF
|
|
IF GET_HASH_KEY("carExhaustCount") = iAttributeHash RETURN "41" ENDIF
|
|
IF GET_HASH_KEY("carWheelCount") = iAttributeHash RETURN "42" ENDIF
|
|
IF GET_HASH_KEY("carHornCount") = iAttributeHash RETURN "43" ENDIF
|
|
IF GET_HASH_KEY("carArmourCount") = iAttributeHash RETURN "44" ENDIF
|
|
IF GET_HASH_KEY("carSuspensionCount") = iAttributeHash RETURN "45" ENDIF
|
|
IF GET_HASH_KEY("carColoursUnlocked0") = iAttributeHash RETURN "46" ENDIF
|
|
IF GET_HASH_KEY("carColoursUnlocked1") = iAttributeHash RETURN "47" ENDIF
|
|
IF GET_HASH_KEY("carColoursUnlocked2") = iAttributeHash RETURN "48" ENDIF
|
|
IF GET_HASH_KEY("carColoursUnlocked3") = iAttributeHash RETURN "49" ENDIF
|
|
IF GET_HASH_KEY("carColoursUnlocked4") = iAttributeHash RETURN "50" ENDIF
|
|
IF GET_HASH_KEY("carColoursUnlocked5") = iAttributeHash RETURN "51" ENDIF
|
|
IF GET_HASH_KEY("carPriceModifier") = iAttributeHash RETURN "52" ENDIF
|
|
IF GET_HASH_KEY("carType") = iAttributeHash RETURN "53" ENDIF
|
|
IF GET_HASH_KEY("playerGang") = iAttributeHash RETURN "54" ENDIF
|
|
IF GET_HASH_KEY("unlockBitset1") = iAttributeHash RETURN "55" ENDIF
|
|
IF GET_HASH_KEY("unlockBitset2") = iAttributeHash RETURN "56" ENDIF
|
|
|
|
IF GET_HASH_KEY("orderCount_sp0") = iAttributeHash RETURN "57" ENDIF
|
|
IF GET_HASH_KEY("orderCount_sp1") = iAttributeHash RETURN "58" ENDIF
|
|
IF GET_HASH_KEY("orderCount_sp2") = iAttributeHash RETURN "59" ENDIF
|
|
IF GET_HASH_KEY("orderCount_mp0") = iAttributeHash RETURN "60" ENDIF
|
|
IF GET_HASH_KEY("orderCount_mp1") = iAttributeHash RETURN "61" ENDIF
|
|
IF GET_HASH_KEY("orderCount_mp2") = iAttributeHash RETURN "62" ENDIF
|
|
IF GET_HASH_KEY("orderCount_mp3") = iAttributeHash RETURN "63" ENDIF
|
|
IF GET_HASH_KEY("orderCount_mp4") = iAttributeHash RETURN "64" ENDIF
|
|
|
|
IF GET_HASH_KEY("spDiscount") = iAttributeHash RETURN "65" ENDIF
|
|
IF GET_HASH_KEY("mpDiscount") = iAttributeHash RETURN "66" ENDIF
|
|
|
|
IF GET_HASH_KEY("carColour1Group") = iAttributeHash RETURN "67" ENDIF
|
|
IF GET_HASH_KEY("carColour2Group") = iAttributeHash RETURN "68" ENDIF
|
|
|
|
IF GET_HASH_KEY("unlockBitset3") = iAttributeHash RETURN "69" ENDIF
|
|
|
|
IF GET_HASH_KEY("playerName") = iAttributeHash RETURN "70" ENDIF
|
|
|
|
IF GET_HASH_KEY("newItemUnlocks") = iAttributeHash RETURN "72" ENDIF
|
|
|
|
IF GET_HASH_KEY("playerNameSP") = iAttributeHash RETURN "73" ENDIF
|
|
IF GET_HASH_KEY("playerNameMP") = iAttributeHash RETURN "74" ENDIF
|
|
|
|
RETURN sAttribute
|
|
ENDFUNC
|
|
|
|
PROC APP_SET_INT_DATA(STRING sAttribute, INT iValue)
|
|
APP_SET_INT(GET_APP_ATTRIBUTE_INT(sAttribute), iValue)
|
|
ENDPROC
|
|
|
|
PROC APP_SET_FLOAT_DATA(STRING sAttribute, FLOAT fValue)
|
|
APP_SET_FLOAT(GET_APP_ATTRIBUTE_INT(sAttribute), fValue)
|
|
ENDPROC
|
|
|
|
PROC APP_SET_STRING_DATA(STRING sAttribute, STRING sValue)
|
|
APP_SET_STRING(GET_APP_ATTRIBUTE_INT(sAttribute), sValue)
|
|
ENDPROC
|
|
|
|
FUNC INT APP_GET_INT_DATA(STRING sAttribute)
|
|
RETURN APP_GET_INT(GET_APP_ATTRIBUTE_INT(sAttribute))
|
|
ENDFUNC
|
|
|
|
FUNC STRING APP_GET_STRING_DATA(STRING sAttribute)
|
|
RETURN APP_GET_STRING(GET_APP_ATTRIBUTE_INT(sAttribute))
|
|
ENDFUNC
|
|
|
|
FUNC INT GENERATE_RANDOM_UNIQUE_ID()
|
|
INT iUID
|
|
|
|
INT i
|
|
REPEAT 32 i
|
|
IF GET_RANDOM_INT_IN_RANGE(0, 2) = 0
|
|
SET_BIT(iUID, i)
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
CPRINTLN(DEBUG_SOCIAL,"GENERATE_RANDOM_UNIQUE_ID = ", iUID)
|
|
|
|
RETURN iUID
|
|
ENDFUNC
|
|
|
|
|
|
PROC DO_HIDE_VEHICLE_SLOT_IN_APP(INT iSlot)
|
|
IF NOT g_savedMPGlobalsNew.g_savedMPGlobals[GET_SAVE_GAME_ARRAY_SLOT()].MpSavedCarApp.bCarHiddenInApp[iSlot]
|
|
|
|
CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_DELETE_DATA - hiding multiplayer vehicle data in slot ", iSlot)
|
|
|
|
APP_SET_APP("car")
|
|
|
|
TEXT_LABEL_15 tlBlockName = "multiplayer"
|
|
tlBlockName += GET_ACTIVE_CHARACTER_SLOT()
|
|
|
|
APP_SET_BLOCK(tlBlockName)
|
|
tlBlockName = "vehicle"
|
|
tlBlockName += iSlot
|
|
APP_SET_BLOCK(tlBlockName)
|
|
APP_SET_INT_DATA("carUnlocked", 0)
|
|
APP_CLOSE_BLOCK()
|
|
bSaveCarData = TRUE SETTIMERA(0)
|
|
APP_CLOSE_BLOCK()
|
|
|
|
APP_CLOSE_APP()
|
|
|
|
g_savedMPGlobalsNew.g_savedMPGlobals[GET_SAVE_GAME_ARRAY_SLOT()].MpSavedCarApp.bCarHiddenInApp[iSlot] = TRUE
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
|
|
/// PURPOSE: Clears all app data when we restart singleplayer and clears the car app data when an order has been processed
|
|
PROC DO_PROCESS_DELETE_DATA()
|
|
|
|
INT iSaveGameArraySlot = GET_SAVE_GAME_ARRAY_SLOT()
|
|
|
|
TEXT_LABEL_15 tlBlockName, sOrderBlockName
|
|
|
|
IF NETWORK_IS_GAME_IN_PROGRESS()
|
|
|
|
// New game so wipe all the data
|
|
IF NOT g_savedMPGlobalsNew.g_savedMPGlobals[iSaveGameArraySlot].MpSavedCarApp.bMultiplayerDataWiped
|
|
|
|
CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_DELETE_DATA - wiping multiplayer data")
|
|
|
|
APP_SET_APP("car")
|
|
|
|
tlBlockName = "multiplayer"
|
|
tlBlockName += GET_ACTIVE_CHARACTER_SLOT()
|
|
|
|
APP_SET_BLOCK(tlBlockName)
|
|
|
|
INT iSlot
|
|
REPEAT MAX_MP_VEHICLE_APP_CAN_HANDLE iSlot
|
|
tlBlockName = "vehicle"
|
|
tlBlockName += iSlot
|
|
APP_SET_BLOCK(tlBlockName)
|
|
APP_SET_INT_DATA("carUnlocked", 0)
|
|
APP_CLOSE_BLOCK()
|
|
ENDREPEAT
|
|
APP_CLOSE_BLOCK()
|
|
|
|
//APP_SET_BLOCK("plate")
|
|
//APP_SET_INT_DATA("carPlateBack", 0)
|
|
//APP_SET_STRING_DATA("carPlateText", "")
|
|
//APP_CLOSE_BLOCK()
|
|
|
|
APP_SET_BLOCK("appdata")
|
|
TEXT_LABEL_23 tlAttribute
|
|
tlAttribute = "orderCount_mp"
|
|
tlAttribute += GET_ACTIVE_CHARACTER_SLOT()
|
|
APP_SET_INT_DATA(tlAttribute, 0)
|
|
APP_CLOSE_BLOCK()
|
|
|
|
bSaveCarData = TRUE SETTIMERA(0)
|
|
APP_CLOSE_APP()
|
|
|
|
|
|
g_savedMPGlobalsNew.g_savedMPGlobals[iSaveGameArraySlot].MpSavedCarApp.bMultiplayerDataWiped = TRUE
|
|
ENDIF
|
|
|
|
// Asked to delete the current vehicle block data
|
|
IF iMPSavedVehicleSlot >= 0
|
|
AND IS_BIT_SET(g_MpSavedVehicles[iMPSavedVehicleSlot].iVehicleBS, MP_SAVED_VEHICLE_CARAPP_DELETE)
|
|
|
|
// Determine which vehicle block this is stored in.
|
|
INT iBlock
|
|
REPEAT MAX_MP_VEHICLE_APP_CAN_HANDLE iBlock
|
|
IF (g_savedMPGlobalsNew.g_savedMPGlobals[iSaveGameArraySlot].MpSavedCarApp.iProcessSlot[iBlock]-1) = iMPSavedVehicleSlot
|
|
|
|
CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_DELETE_DATA - deleting multiplayer vehicle ", iMPSavedVehicleSlot, " in block ", iBlock)
|
|
|
|
APP_SET_APP("car")
|
|
|
|
tlBlockName = "multiplayer"
|
|
tlBlockName += GET_ACTIVE_CHARACTER_SLOT()
|
|
|
|
APP_SET_BLOCK(tlBlockName)
|
|
tlBlockName = "vehicle"
|
|
tlBlockName += iBlock
|
|
APP_SET_BLOCK(tlBlockName)
|
|
APP_SET_INT_DATA("carUnlocked", 0)
|
|
APP_CLOSE_BLOCK()
|
|
bSaveCarData = TRUE SETTIMERA(0)
|
|
APP_CLOSE_BLOCK()
|
|
|
|
APP_CLOSE_APP()
|
|
|
|
CLEAR_BIT(g_MpSavedVehicles[iMPSavedVehicleSlot].iVehicleBS, MP_SAVED_VEHICLE_CARAPP_SEND)
|
|
CLEAR_BIT(g_MpSavedVehicles[iMPSavedVehicleSlot].iVehicleBS, MP_SAVED_VEHICLE_CARAPP_DELETE)
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
ENDIF
|
|
|
|
// Order processed so delete car data
|
|
SWITCH iDeleteCarDataControl
|
|
CASE 0
|
|
IF g_savedMPGlobalsNew.g_savedMPGlobals[iSaveGameArraySlot].MpSavedCarApp.bDeleteCarData
|
|
CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_DELETE_DATA - deleting car data from MP")
|
|
APP_DELETE_APP_DATA("car")
|
|
bDeletingCarData = TRUE
|
|
iDeleteCarDataControl++
|
|
ELSE
|
|
bDeletingCarData = FALSE
|
|
ENDIF
|
|
BREAK
|
|
CASE 1
|
|
CPRINTLN(DEBUG_SOCIAL,"APP_GET_DELETED_FILE_STATUS() = ", ENUM_TO_INT(APP_GET_DELETED_FILE_STATUS()))
|
|
IF APP_GET_DELETED_FILE_STATUS() != APP_FILE_STATUS_PENDING
|
|
// Done
|
|
IF APP_GET_DELETED_FILE_STATUS() != APP_FILE_STATUS_FAILED
|
|
g_savedMPGlobalsNew.g_savedMPGlobals[iSaveGameArraySlot].MpSavedCarApp.bDeleteCarData = FALSE
|
|
ENDIF
|
|
|
|
APP_SET_APP("car")
|
|
|
|
// Delete the order block.
|
|
sOrderBlockName = "mp"
|
|
sOrderBlockName += GET_ACTIVE_CHARACTER_SLOT()
|
|
sOrderBlockName += "_order"
|
|
APP_SET_BLOCK(sOrderBlockName)
|
|
CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP - clearing app block: ", sOrderBlockName)
|
|
APP_CLEAR_BLOCK()
|
|
APP_CLOSE_BLOCK()
|
|
|
|
APP_SET_BLOCK("appdata")
|
|
TEXT_LABEL_23 tlAttribute
|
|
tlAttribute = "orderCount_mp"
|
|
tlAttribute += GET_ACTIVE_CHARACTER_SLOT()
|
|
APP_SET_INT_DATA(tlAttribute, g_savedMPGlobalsNew.g_savedMPGlobals[iSaveGameArraySlot].MpSavedCarApp.iOrderCount)
|
|
APP_CLOSE_BLOCK()
|
|
APP_CLOSE_APP()
|
|
|
|
iDeleteCarDataControl = 0
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
ELSE
|
|
|
|
// New game so wipe all the data
|
|
IF NOT g_savedGlobals.sSocialData.bSingleplayeDataWiped
|
|
|
|
CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_DELETE_DATA - wiping singleplayer data")
|
|
|
|
APP_SET_APP("car")
|
|
|
|
APP_SET_BLOCK("singleplayer0")
|
|
APP_SET_INT_DATA("carUnlocked", 0)
|
|
APP_CLOSE_BLOCK()
|
|
|
|
// APP_SET_BLOCK("singleplayer1")
|
|
// APP_SET_INT_DATA("carUnlocked", 0)
|
|
// APP_CLOSE_BLOCK()
|
|
|
|
APP_SET_BLOCK("singleplayer2")
|
|
APP_SET_INT_DATA("carUnlocked", 0)
|
|
APP_CLOSE_BLOCK()
|
|
|
|
//APP_SET_BLOCK("plate")
|
|
//APP_SET_INT_DATA("carPlateBack", 0)
|
|
//APP_SET_STRING_DATA("carPlateText", "")
|
|
//APP_CLOSE_BLOCK()
|
|
|
|
APP_SET_BLOCK("appdata")
|
|
APP_SET_INT_DATA("orderCount_sp0", 0)
|
|
APP_SET_INT_DATA("orderCount_sp1", 0)
|
|
APP_SET_INT_DATA("orderCount_sp2", 0)
|
|
APP_CLOSE_BLOCK()
|
|
|
|
bSaveCarData = TRUE SETTIMERA(0)
|
|
APP_CLOSE_APP()
|
|
|
|
APP_SET_APP("dog")
|
|
APP_SET_BLOCK("saveData")
|
|
APP_SET_INT_DATA("chopSafeHouse", 0)
|
|
APP_SAVE_DATA()
|
|
APP_CLOSE_BLOCK()
|
|
APP_CLOSE_APP()
|
|
|
|
|
|
g_savedGlobals.sSocialData.bPlayerUnlockedInApp[0] = FALSE
|
|
g_savedGlobals.sSocialData.bPlayerUnlockedInApp[1] = FALSE
|
|
g_savedGlobals.sSocialData.bPlayerUnlockedInApp[2] = FALSE
|
|
|
|
g_savedGlobals.sSocialData.bSingleplayeDataWiped = TRUE
|
|
ENDIF
|
|
|
|
// Asked to delete SP characters vehicle data
|
|
INT iPed
|
|
REPEAT NUM_OF_PLAYABLE_PEDS iPed
|
|
IF g_savedGlobals.sSocialData.sCarAppData[iPed].bDeleteData
|
|
|
|
CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_DELETE_DATA - deleting singleplayer vehicle data in slot ", ENUM_TO_INT(iPed))
|
|
|
|
APP_SET_APP("car")
|
|
|
|
tlBlockName = "singleplayer"
|
|
tlBlockName += ENUM_TO_INT(iPed)
|
|
|
|
APP_SET_BLOCK(tlBlockName)
|
|
APP_SET_INT_DATA("carUnlocked", 0)
|
|
bSaveCarData = TRUE SETTIMERA(0)
|
|
APP_CLOSE_BLOCK()
|
|
|
|
APP_CLOSE_APP()
|
|
|
|
g_savedGlobals.sSocialData.bPlayerUnlockedInApp[iPed] = FALSE
|
|
g_savedGlobals.sSocialData.sCarAppData[iPed].bDeleteData = FALSE
|
|
g_savedGlobals.sSocialData.sCarAppData[iPed].bSendDataToCloud = FALSE
|
|
g_savedGlobals.sSocialData.sCarAppData[iPed].eModel = DUMMY_MODEL_FOR_SCRIPT
|
|
g_savedGlobals.sSocialData.bPlayerUnlockedInApp[iPed] = FALSE
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
// Order processed so delete car data
|
|
SWITCH iDeleteCarDataControl
|
|
CASE 0
|
|
IF g_savedGlobals.sSocialData.bDeleteCarData
|
|
CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_DELETE_DATA - deleting car data from SP")
|
|
APP_DELETE_APP_DATA("car")
|
|
bDeletingCarData = TRUE
|
|
iDeleteCarDataControl++
|
|
ELSE
|
|
bDeletingCarData = FALSE
|
|
ENDIF
|
|
BREAK
|
|
CASE 1
|
|
CPRINTLN(DEBUG_SOCIAL,"APP_GET_DELETED_FILE_STATUS() = ", ENUM_TO_INT(APP_GET_DELETED_FILE_STATUS()))
|
|
IF APP_GET_DELETED_FILE_STATUS() != APP_FILE_STATUS_PENDING
|
|
// Done
|
|
IF APP_GET_DELETED_FILE_STATUS() != APP_FILE_STATUS_FAILED
|
|
g_savedGlobals.sSocialData.bDeleteCarData = FALSE
|
|
ENDIF
|
|
|
|
APP_SET_APP("car")
|
|
|
|
// Delete the order block.
|
|
sOrderBlockName = "sp"
|
|
sOrderBlockName += g_savedGlobals.sSocialData.iOrderToDelete
|
|
sOrderBlockName += "_order"
|
|
APP_SET_BLOCK(sOrderBlockName)
|
|
CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP - clearing app block: ", sOrderBlockName)
|
|
APP_CLEAR_BLOCK()
|
|
APP_CLOSE_BLOCK()
|
|
|
|
APP_SET_BLOCK("appdata")
|
|
APP_SET_INT_DATA("orderCount_sp0", g_savedGlobals.sSocialData.iOrderCount[0])
|
|
APP_SET_INT_DATA("orderCount_sp1", g_savedGlobals.sSocialData.iOrderCount[1])
|
|
APP_SET_INT_DATA("orderCount_sp2", g_savedGlobals.sSocialData.iOrderCount[2])
|
|
APP_CLOSE_BLOCK()
|
|
APP_CLOSE_APP()
|
|
|
|
iDeleteCarDataControl = 0
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC RESEND_APP_DATA_FOR_CHARACTER(INT iSlot, BOOL bResendData)
|
|
SWITCH iSlot
|
|
CASE 0
|
|
bResendAppDataForCharacter0 = bResendData
|
|
SET_PACKED_STAT_BOOL(PACKED_MP_RESEND_APP_DATA_FOR_CHARACTER_0, bResendData)
|
|
BREAK
|
|
CASE 1
|
|
bResendAppDataForCharacter1 = bResendData
|
|
SET_PACKED_STAT_BOOL(PACKED_MP_RESEND_APP_DATA_FOR_CHARACTER_1, bResendData)
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDPROC
|
|
|
|
FUNC BOOL SHOULD_RESEND_APP_DATA_FOR_CHARACTER(INT iSlot)
|
|
SWITCH iSlot
|
|
CASE 0
|
|
RETURN bResendAppDataForCharacter0
|
|
BREAK
|
|
CASE 1
|
|
RETURN bResendAppDataForCharacter1
|
|
BREAK
|
|
ENDSWITCH
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
/// PURPOSE: Clears all multiplayer app data and resends any info
|
|
PROC DO_PROCESS_DELETE_ALL_DATA_FOR_NEW_ACCOUNT()
|
|
|
|
IF NETWORK_IS_SIGNED_ONLINE()
|
|
IF NETWORK_IS_GAME_IN_PROGRESS()
|
|
// Check if the stored playerName matches - if it doesn't, wipe all the data.
|
|
|
|
BOOL bDeleteAllData = FALSE
|
|
|
|
// Only check name difference once per boot or when we change SC account.
|
|
BOOL bResendAppDataForNameChange = FALSE
|
|
IF bCheckPlayerNameDiffMP
|
|
APP_SET_APP("car")
|
|
APP_SET_BLOCK("appdata")
|
|
INT iStoredPlayerName = APP_GET_INT_DATA("playerNameMP")
|
|
IF (iStoredPlayerName != 0 AND iStoredPlayerName != GET_HASH_KEY(GET_PLAYER_NAME(PLAYER_ID())))
|
|
bResendAppDataForNameChange = TRUE
|
|
ENDIF
|
|
APP_CLOSE_BLOCK()
|
|
APP_CLOSE_APP()
|
|
bCheckPlayerNameDiffMP = FALSE
|
|
ENDIF
|
|
|
|
IF bResendAppDataForNameChange
|
|
OR bResendAppDataForAccountLinkMP
|
|
#IF IS_DEBUG_BUILD
|
|
OR bForceMPWipe
|
|
bForceMPWipe = FALSE
|
|
#ENDIF
|
|
|
|
APP_SET_APP("car")
|
|
APP_SET_BLOCK("appdata")
|
|
APP_SET_INT_DATA("playerNameMP", GET_HASH_KEY(GET_PLAYER_NAME(PLAYER_ID())))
|
|
|
|
bDeleteAllData = TRUE
|
|
RESEND_APP_DATA_FOR_CHARACTER(0, TRUE)
|
|
RESEND_APP_DATA_FOR_CHARACTER(1, TRUE)
|
|
|
|
bResendAppDataForAccountLinkMP = FALSE
|
|
APP_CLOSE_BLOCK()
|
|
|
|
IF bDeleteAllData
|
|
|
|
CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_DELETE_ALL_DATA_FOR_NEW_ACCOUNT - wiping all multiplayer data")
|
|
|
|
INT iMPSlot
|
|
INT iVehSlot
|
|
TEXT_LABEL_15 tlBlockName
|
|
|
|
REPEAT 5 iMPSlot
|
|
tlBlockName = "multiplayer"
|
|
tlBlockName += iMPSlot
|
|
APP_SET_BLOCK(tlBlockName)
|
|
REPEAT MAX_MP_VEHICLE_APP_CAN_HANDLE iVehSlot
|
|
tlBlockName = "vehicle"
|
|
tlBlockName += iVehSlot
|
|
APP_SET_BLOCK(tlBlockName)
|
|
APP_SET_INT_DATA("carUnlocked", 0)
|
|
APP_CLOSE_BLOCK()
|
|
ENDREPEAT
|
|
APP_CLOSE_BLOCK()
|
|
ENDREPEAT
|
|
ENDIF
|
|
|
|
APP_CLOSE_APP()
|
|
ENDIF
|
|
ELSE
|
|
// Check if the stored playerName matches - if it doesn't, wipe all the data.
|
|
|
|
BOOL bWipeMPData = FALSE
|
|
|
|
// Only check name difference once per boot or when we change SC account.
|
|
BOOL bResendAppDataForNameChange = FALSE
|
|
IF bCheckPlayerNameDiffSP
|
|
APP_SET_APP("car")
|
|
APP_SET_BLOCK("appdata")
|
|
INT iStoredPlayerName = APP_GET_INT_DATA("playerNameSP")
|
|
IF (iStoredPlayerName != 0 AND iStoredPlayerName != GET_HASH_KEY(GET_PLAYER_NAME(PLAYER_ID())))
|
|
bResendAppDataForNameChange = TRUE
|
|
ENDIF
|
|
APP_CLOSE_BLOCK()
|
|
APP_CLOSE_APP()
|
|
bCheckPlayerNameDiffSP = FALSE
|
|
ENDIF
|
|
|
|
IF bResendAppDataForNameChange
|
|
OR bResendAppDataForAccountLinkSP
|
|
#IF IS_DEBUG_BUILD
|
|
OR bForceSPWipe
|
|
bForceSPWipe = FALSE
|
|
#ENDIF
|
|
|
|
APP_SET_APP("car")
|
|
APP_SET_BLOCK("appdata")
|
|
|
|
CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_DELETE_ALL_DATA_FOR_NEW_ACCOUNT - resend SP data")
|
|
|
|
APP_SET_INT_DATA("playerNameSP", GET_HASH_KEY(GET_PLAYER_NAME(PLAYER_ID())))
|
|
bRefreshAppDataOnInit = TRUE
|
|
bResendAppDataForAccountLinkSP = FALSE
|
|
|
|
bWipeMPData = TRUE
|
|
|
|
APP_CLOSE_BLOCK()
|
|
|
|
IF bWipeMPData
|
|
// Clear all MP data when we are in SP
|
|
CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_DELETE_ALL_DATA_FOR_NEW_ACCOUNT - wiping all multiplayer data from SP")
|
|
|
|
INT iMPSlot
|
|
INT iVehSlot
|
|
TEXT_LABEL_15 tlBlockName
|
|
|
|
REPEAT 5 iMPSlot
|
|
tlBlockName = "multiplayer"
|
|
tlBlockName += iMPSlot
|
|
APP_SET_BLOCK(tlBlockName)
|
|
REPEAT MAX_MP_VEHICLE_APP_CAN_HANDLE iVehSlot
|
|
tlBlockName = "vehicle"
|
|
tlBlockName += iVehSlot
|
|
APP_SET_BLOCK(tlBlockName)
|
|
APP_SET_INT_DATA("carUnlocked", 0)
|
|
APP_CLOSE_BLOCK()
|
|
ENDREPEAT
|
|
APP_CLOSE_BLOCK()
|
|
ENDREPEAT
|
|
ENDIF
|
|
|
|
APP_CLOSE_APP()
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC GET_COLOUR_UNLOCKS_STAGE_1(INT &iUnlockBitset)
|
|
|
|
iUnlockBitset = 0
|
|
|
|
IF IS_CARMOD_ITEM_UNLOCKED(DUMMY_CARMOD_UNLOCK_ITEM) SET_BIT(iUnlockBitset, 0) ENDIF //tyreSmokeColourEnabled
|
|
IF IS_CARMOD_ITEM_UNLOCKED(DUMMY_CARMOD_UNLOCK_ITEM) SET_BIT(iUnlockBitset, 1) ENDIF //windowTint0Unlocked
|
|
IF IS_CARMOD_ITEM_UNLOCKED(CARMOD_UNLOCK_LIGHT_SMOKE_WINDOWS) SET_BIT(iUnlockBitset, 2) ENDIF //windowTint1Unlocked
|
|
IF IS_CARMOD_ITEM_UNLOCKED(CARMOD_UNLOCK_DARK_SMOKE_WINDOWS) SET_BIT(iUnlockBitset, 3) ENDIF //windowTint2Unlocked
|
|
IF IS_CARMOD_ITEM_UNLOCKED(CARMOD_UNLOCK_LIMO_WINDOWS) SET_BIT(iUnlockBitset, 4) ENDIF //windowTint3Unlocked
|
|
IF IS_CARMOD_ITEM_UNLOCKED(CARMOD_UNLOCK_TYRE_SMOKE_WHITE) SET_BIT(iUnlockBitset, 5) ENDIF //tyreSmokeColourWhiteUnlocked
|
|
IF IS_CARMOD_ITEM_UNLOCKED(CARMOD_UNLOCK_TYRE_SMOKE_ORANGE) SET_BIT(iUnlockBitset, 6) ENDIF //tyreSmokeColourOrangeUnlocked
|
|
IF IS_CARMOD_ITEM_UNLOCKED(CARMOD_UNLOCK_TYRE_SMOKE_RED) SET_BIT(iUnlockBitset, 7) ENDIF //tyreSmokeColourRedUnlocked
|
|
IF IS_CARMOD_ITEM_UNLOCKED(CARMOD_UNLOCK_TYRE_SMOKE_YELLOW) SET_BIT(iUnlockBitset, 8) ENDIF //tyreSmokeColourYellowUnlocked
|
|
IF IS_CARMOD_ITEM_UNLOCKED(CARMOD_UNLOCK_TYRE_SMOKE_BLUE) SET_BIT(iUnlockBitset, 9) ENDIF //tyreSmokeColourBlueUnlocked
|
|
IF IS_CARMOD_ITEM_UNLOCKED(CARMOD_UNLOCK_TYRE_SMOKE_BLACK) SET_BIT(iUnlockBitset, 10) ENDIF //tyreSmokeColourBlackUnlocked
|
|
IF IS_CARMOD_ITEM_UNLOCKED(DUMMY_CARMOD_UNLOCK_ITEM) SET_BIT(iUnlockBitset, 11) ENDIF //carEngine1Unlocked
|
|
IF IS_CARMOD_ITEM_UNLOCKED(CARMOD_UNLOCK_ENGINE_L2) SET_BIT(iUnlockBitset, 12) ENDIF //carEngine2Unlocked
|
|
IF IS_CARMOD_ITEM_UNLOCKED(CARMOD_UNLOCK_ENGINE_L3) SET_BIT(iUnlockBitset, 13) ENDIF //carEngine3Unlocked
|
|
IF IS_CARMOD_ITEM_UNLOCKED(CARMOD_UNLOCK_ENGINE_L4) SET_BIT(iUnlockBitset, 14) ENDIF //carEngine4Unlocked
|
|
IF IS_CARMOD_ITEM_UNLOCKED(CARMOD_UNLOCK_ENGINE_L5) SET_BIT(iUnlockBitset, 15) ENDIF //carEngine5Unlocked
|
|
IF IS_CARMOD_ITEM_UNLOCKED(DUMMY_CARMOD_UNLOCK_ITEM) SET_BIT(iUnlockBitset, 16) ENDIF //carBrakes1Unlocked
|
|
IF IS_CARMOD_ITEM_UNLOCKED(CARMOD_UNLOCK_BRAKES_L2) SET_BIT(iUnlockBitset, 17) ENDIF //carBrakes2Unlocked
|
|
IF IS_CARMOD_ITEM_UNLOCKED(CARMOD_UNLOCK_BRAKES_L3) SET_BIT(iUnlockBitset, 18) ENDIF //carBrakes3Unlocked
|
|
IF IS_CARMOD_ITEM_UNLOCKED(CARMOD_UNLOCK_BRAKES_L4) SET_BIT(iUnlockBitset, 19) ENDIF //carBrakes4Unlocked
|
|
IF IS_CARMOD_ITEM_UNLOCKED(CARMOD_UNLOCK_BRAKES_L5) SET_BIT(iUnlockBitset, 20) ENDIF //carBrakes5Unlocked
|
|
IF IS_CARMOD_ITEM_UNLOCKED(DUMMY_CARMOD_UNLOCK_ITEM) SET_BIT(iUnlockBitset, 21) ENDIF //carExhaust1Unlocked
|
|
IF IS_CARMOD_ITEM_UNLOCKED(CARMOD_UNLOCK_EXHAUST_L2) SET_BIT(iUnlockBitset, 22) ENDIF //carExhaust2Unlocked
|
|
IF IS_CARMOD_ITEM_UNLOCKED(DUMMY_CARMOD_UNLOCK_ITEM) SET_BIT(iUnlockBitset, 23) ENDIF //carWheel1Unlocked
|
|
IF IS_CARMOD_ITEM_UNLOCKED(DUMMY_CARMOD_UNLOCK_ITEM) SET_BIT(iUnlockBitset, 24) ENDIF //carWheel2Unlocked
|
|
IF IS_CARMOD_ITEM_UNLOCKED(DUMMY_CARMOD_UNLOCK_ITEM) SET_BIT(iUnlockBitset, 25) ENDIF //carWheel3Unlocked
|
|
IF IS_CARMOD_ITEM_UNLOCKED(DUMMY_CARMOD_UNLOCK_ITEM) SET_BIT(iUnlockBitset, 26) ENDIF //carWheel4Unlocked
|
|
IF IS_CARMOD_ITEM_UNLOCKED(DUMMY_CARMOD_UNLOCK_ITEM) SET_BIT(iUnlockBitset, 27) ENDIF //carWheel5Unlocked
|
|
IF IS_CARMOD_ITEM_UNLOCKED(DUMMY_CARMOD_UNLOCK_ITEM) SET_BIT(iUnlockBitset, 28) ENDIF //carWheel6Unlocked
|
|
IF IS_CARMOD_ITEM_UNLOCKED(CARMOD_UNLOCK_BULLET_PROOF_TYRES) SET_BIT(iUnlockBitset, 29) ENDIF //bulletProofTyresUnlocked
|
|
ENDPROC
|
|
|
|
PROC GET_COLOUR_UNLOCKS_STAGE_2(INT &iUnlockBitset)
|
|
|
|
iUnlockBitset = 0
|
|
|
|
IF IS_CARMOD_ITEM_UNLOCKED(DUMMY_CARMOD_UNLOCK_ITEM) SET_BIT(iUnlockBitset, 0) ENDIF //carHorn1Unlocked
|
|
IF IS_CARMOD_ITEM_UNLOCKED(CARMOD_UNLOCK_HORN_L2) SET_BIT(iUnlockBitset, 1) ENDIF //carHorn2Unlocked
|
|
IF IS_CARMOD_ITEM_UNLOCKED(CARMOD_UNLOCK_HORN_L3) SET_BIT(iUnlockBitset, 2) ENDIF //carHorn3Unlocked
|
|
IF IS_CARMOD_ITEM_UNLOCKED(CARMOD_UNLOCK_HORN_L4) SET_BIT(iUnlockBitset, 3) ENDIF //carHorn4Unlocked
|
|
IF IS_CARMOD_ITEM_UNLOCKED(CARMOD_UNLOCK_HORN_L5) SET_BIT(iUnlockBitset, 4) ENDIF //carHorn5Unlocked
|
|
|
|
IF IS_CARMOD_ITEM_UNLOCKED(CARMOD_UNLOCK_BODY_ARMOUR_20) SET_BIT(iUnlockBitset, 5) ENDIF //carArmour1Unlocked
|
|
IF IS_CARMOD_ITEM_UNLOCKED(CARMOD_UNLOCK_BODY_ARMOUR_40) SET_BIT(iUnlockBitset, 6) ENDIF //carArmour2Unlocked
|
|
IF IS_CARMOD_ITEM_UNLOCKED(CARMOD_UNLOCK_BODY_ARMOUR_60) SET_BIT(iUnlockBitset, 7) ENDIF //carArmour3Unlocked
|
|
IF IS_CARMOD_ITEM_UNLOCKED(CARMOD_UNLOCK_BODY_ARMOUR_80) SET_BIT(iUnlockBitset, 8) ENDIF //carArmour4Unlocked
|
|
IF IS_CARMOD_ITEM_UNLOCKED(CARMOD_UNLOCK_BODY_ARMOUR_100) SET_BIT(iUnlockBitset, 9) ENDIF //carArmour5Unlocked
|
|
|
|
IF IS_CARMOD_ITEM_UNLOCKED(DUMMY_CARMOD_UNLOCK_ITEM) SET_BIT(iUnlockBitset, 10) ENDIF //carSuspension1Unlocked
|
|
IF IS_CARMOD_ITEM_UNLOCKED(CARMOD_UNLOCK_SUSPENSION_L1) SET_BIT(iUnlockBitset, 11) ENDIF //carSuspension2Unlocked
|
|
|
|
IF IS_CARMOD_ITEM_UNLOCKED(CARMOD_UNLOCK_XENON_LIGHTS) SET_BIT(iUnlockBitset, 12) ENDIF //carXenonLightsUnlocked
|
|
IF IS_CARMOD_ITEM_UNLOCKED(CARMOD_UNLOCK_TURBO) SET_BIT(iUnlockBitset, 13) ENDIF //carTurboUnlocked
|
|
|
|
IF IS_CARMOD_ITEM_UNLOCKED(DUMMY_CARMOD_UNLOCK_ITEM) SET_BIT(iUnlockBitset, 14) ENDIF //plates1Unlocked
|
|
IF IS_CARMOD_ITEM_UNLOCKED(CARMOD_UNLOCK_PLATES_L2) SET_BIT(iUnlockBitset, 15) ENDIF //plates2Unlocked
|
|
IF IS_CARMOD_ITEM_UNLOCKED(CARMOD_UNLOCK_PLATES_L3) SET_BIT(iUnlockBitset, 16) ENDIF //plates3Unlocked
|
|
IF IS_CARMOD_ITEM_UNLOCKED(CARMOD_UNLOCK_PLATES_L4) SET_BIT(iUnlockBitset, 17) ENDIF //plates4Unlocked
|
|
IF IS_CARMOD_ITEM_UNLOCKED(CARMOD_UNLOCK_PLATES_L5) SET_BIT(iUnlockBitset, 18) ENDIF //plates5Unlocked
|
|
|
|
IF IS_MP_HIPSTER_PACK_PRESENT()
|
|
SET_BIT(iUnlockBitset, 19) // windowTint4Unlocked (Pure Black Windows) - Hipster pack addition...
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
FUNC INT GET_COLOUR_UNLOCKS_STAGE_3(INT &iCarColUnlocked[6], INT iColourCheck = -1)
|
|
|
|
INT iColourCount = 0
|
|
|
|
IF iColourCheck != -1
|
|
iColourCount = iColourCheck
|
|
ENDIF
|
|
|
|
BOOL bGotData = FALSE
|
|
INT iGroup
|
|
TEXT_LABEL tlLabel
|
|
INT iAppCol1, iAppCol2
|
|
VEHICLE_MOD_COLOUR_ENUM eModCol
|
|
|
|
WHILE (iColourCheck = -1 OR iColourCheck = iColourCount) AND GET_CAR_APP_COLOUR_DATA(iColourCount, tlLabel, iGroup, iAppCol1, iAppCol2)
|
|
|
|
bGotData = TRUE
|
|
eModCol = GET_VEHICLE_MOD_COLOUR_FROM_LABEL(tlLabel)
|
|
|
|
IF (iGroup = 0)
|
|
IF IS_VEHICLE_MOD_COLOUR_UNLOCKED(MCT_METALLIC, eModCol) SET_BIT(iCarColUnlocked[iColourCount/32], iColourCount%32) ENDIF
|
|
ELIF (iGroup = 1)
|
|
IF IS_VEHICLE_MOD_COLOUR_UNLOCKED(MCT_CLASSIC, eModCol) SET_BIT(iCarColUnlocked[iColourCount/32], iColourCount%32) ENDIF
|
|
ELIF (iGroup = 2)
|
|
IF IS_VEHICLE_MOD_COLOUR_UNLOCKED(MCT_MATTE, eModCol) SET_BIT(iCarColUnlocked[iColourCount/32], iColourCount%32) ENDIF
|
|
ELIF (iGroup = 3)
|
|
IF IS_VEHICLE_MOD_COLOUR_UNLOCKED(MCT_METALS, eModCol) SET_BIT(iCarColUnlocked[iColourCount/32], iColourCount%32) ENDIF
|
|
ELIF (iGroup = 4)
|
|
IF IS_VEHICLE_MOD_COLOUR_UNLOCKED(MCT_CHROME, eModCol) SET_BIT(iCarColUnlocked[iColourCount/32], iColourCount%32) ENDIF
|
|
ENDIF
|
|
|
|
iColourCount++
|
|
ENDWHILE
|
|
|
|
IF NOT bGotData
|
|
RETURN -1
|
|
ELSE
|
|
RETURN iColourCheck
|
|
ENDIF
|
|
ENDFUNC
|
|
|
|
FUNC BOOL IS_PERFORMANCE_MOD_UNLOCKED_FOR_APP(MOD_TYPE eMod, INT iIndex)
|
|
CARMOD_UNLOCK_PERFORMANCE_RACES ePerformanceMod
|
|
IF GET_CARMOD_UNLOCK_PERFORMANCE_RACES_FROM_MOD_TYPE(eModUnlockModel, eMod, iIndex, ePerformanceMod)
|
|
RETURN IS_PERFORMANACE_CAR_MOD_UNLOCKED(ePerformanceMod)
|
|
ENDIF
|
|
RETURN TRUE
|
|
ENDFUNC
|
|
|
|
PROC GET_COLOUR_UNLOCKS_STAGE_4(INT &iUnlockBitset)
|
|
// Performance mods.
|
|
IF IS_PERFORMANCE_MOD_UNLOCKED_FOR_APP(MOD_TOGGLE_TURBO, 1) OR IS_CARMOD_ITEM_UNLOCKED(CARMOD_UNLOCK_TURBO) SET_BIT(iUnlockBitset, 0) ENDIF //carTurboUnlocked
|
|
IF IS_PERFORMANCE_MOD_UNLOCKED_FOR_APP(MOD_ENGINE, 0) SET_BIT(iUnlockBitset, 1) ENDIF //carEngine1Unlocked
|
|
IF IS_PERFORMANCE_MOD_UNLOCKED_FOR_APP(MOD_ENGINE, 1) OR IS_CARMOD_ITEM_UNLOCKED(CARMOD_UNLOCK_ENGINE_L2) SET_BIT(iUnlockBitset, 2) ENDIF //carEngine2Unlocked
|
|
IF IS_PERFORMANCE_MOD_UNLOCKED_FOR_APP(MOD_ENGINE, 2) OR IS_CARMOD_ITEM_UNLOCKED(CARMOD_UNLOCK_ENGINE_L3) SET_BIT(iUnlockBitset, 3) ENDIF //carEngine3Unlocked
|
|
IF IS_PERFORMANCE_MOD_UNLOCKED_FOR_APP(MOD_ENGINE, 3) OR IS_CARMOD_ITEM_UNLOCKED(CARMOD_UNLOCK_ENGINE_L4) SET_BIT(iUnlockBitset, 4) ENDIF //carEngine4Unlocked
|
|
IF IS_PERFORMANCE_MOD_UNLOCKED_FOR_APP(MOD_ENGINE, 4) OR IS_CARMOD_ITEM_UNLOCKED(CARMOD_UNLOCK_ENGINE_L5) SET_BIT(iUnlockBitset, 5) ENDIF //carEngine5Unlocked
|
|
IF IS_PERFORMANCE_MOD_UNLOCKED_FOR_APP(MOD_BRAKES, 0) SET_BIT(iUnlockBitset, 6) ENDIF //carBrakes1Unlocked
|
|
IF IS_PERFORMANCE_MOD_UNLOCKED_FOR_APP(MOD_BRAKES, 1) OR IS_CARMOD_ITEM_UNLOCKED(CARMOD_UNLOCK_BRAKES_L2) SET_BIT(iUnlockBitset, 7) ENDIF //carBrakes2Unlocked
|
|
IF IS_PERFORMANCE_MOD_UNLOCKED_FOR_APP(MOD_BRAKES, 2) OR IS_CARMOD_ITEM_UNLOCKED(CARMOD_UNLOCK_BRAKES_L3) SET_BIT(iUnlockBitset, 8) ENDIF //carBrakes3Unlocked
|
|
IF IS_PERFORMANCE_MOD_UNLOCKED_FOR_APP(MOD_BRAKES, 3) OR IS_CARMOD_ITEM_UNLOCKED(CARMOD_UNLOCK_BRAKES_L4) SET_BIT(iUnlockBitset, 9) ENDIF //carBrakes4Unlocked
|
|
IF IS_PERFORMANCE_MOD_UNLOCKED_FOR_APP(MOD_BRAKES, 4) OR IS_CARMOD_ITEM_UNLOCKED(CARMOD_UNLOCK_BRAKES_L5) SET_BIT(iUnlockBitset, 10) ENDIF //carBrakes5Unlocked
|
|
IF IS_PERFORMANCE_MOD_UNLOCKED_FOR_APP(MOD_EXHAUST, 0) SET_BIT(iUnlockBitset, 11) ENDIF //carExhaust1Unlocked
|
|
IF IS_PERFORMANCE_MOD_UNLOCKED_FOR_APP(MOD_EXHAUST, 1) OR IS_CARMOD_ITEM_UNLOCKED(CARMOD_UNLOCK_EXHAUST_L2) SET_BIT(iUnlockBitset, 12) ENDIF //carExhaust2Unlocked
|
|
ENDPROC
|
|
|
|
PROC DO_PROCESS_MOD_UNLOCKS()
|
|
|
|
CONST_INT NO_COLOURS_TO_PROCESS_PER_FRAME 25
|
|
|
|
INT iUnlockBitset
|
|
|
|
SWITCH iModUnlockStage
|
|
CASE 0
|
|
IF bProcessModUnlocks
|
|
CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP - Start processing mod unlocks, sModUnlockBlockName = ", sModUnlockBlockName, ", sModUnlockVehicleBlockName = ", sModUnlockVehicleBlockName)
|
|
|
|
IF NOT NETWORK_IS_GAME_IN_PROGRESS()
|
|
Execute_Activate_Shop_Carmod(0, FALSE)
|
|
ENDIF
|
|
|
|
GET_COLOUR_UNLOCKS_STAGE_1(iUnlockBitset)
|
|
|
|
CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP - unlockBitset1 = ", iUnlockBitset)
|
|
|
|
APP_SET_APP("car")
|
|
IF NETWORK_IS_GAME_IN_PROGRESS()
|
|
APP_SET_BLOCK(sModUnlockBlockName)
|
|
APP_SET_BLOCK("mpUnlocks")
|
|
ELSE
|
|
APP_SET_BLOCK("spUnlocks")
|
|
ENDIF
|
|
|
|
APP_SET_INT_DATA("unlockBitset1", iUnlockBitset) iCached_UnlockBitset[0] = iUnlockBitset
|
|
|
|
// Done
|
|
IF NETWORK_IS_GAME_IN_PROGRESS()
|
|
APP_CLOSE_BLOCK()
|
|
APP_CLOSE_BLOCK()
|
|
ELSE
|
|
APP_CLOSE_BLOCK()
|
|
ENDIF
|
|
APP_CLOSE_APP()
|
|
|
|
iModUnlockStage++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 1
|
|
|
|
GET_COLOUR_UNLOCKS_STAGE_2(iUnlockBitset)
|
|
|
|
CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP - unlockBitset2 = ", iUnlockBitset)
|
|
|
|
APP_SET_APP("car")
|
|
IF NETWORK_IS_GAME_IN_PROGRESS()
|
|
APP_SET_BLOCK(sModUnlockBlockName)
|
|
APP_SET_BLOCK("mpUnlocks")
|
|
ELSE
|
|
APP_SET_BLOCK("spUnlocks")
|
|
ENDIF
|
|
|
|
APP_SET_INT_DATA("unlockBitset2", iUnlockBitset) iCached_UnlockBitset[1] = iUnlockBitset
|
|
|
|
// Done
|
|
IF NETWORK_IS_GAME_IN_PROGRESS()
|
|
APP_CLOSE_BLOCK()
|
|
APP_CLOSE_BLOCK()
|
|
ELSE
|
|
APP_CLOSE_BLOCK()
|
|
ENDIF
|
|
APP_CLOSE_APP()
|
|
|
|
//Clear colour unlock data. #1715985
|
|
INT iColourUnlockIndex
|
|
REPEAT 6 iColourUnlockIndex
|
|
iCarColoursUnlocked[iColourUnlockIndex] = 0
|
|
ENDREPEAT
|
|
iCarColoursProcessed = 0
|
|
|
|
iModUnlockStage++
|
|
BREAK
|
|
|
|
CASE 2
|
|
IF NETWORK_IS_GAME_IN_PROGRESS()
|
|
//Scheduled MP colour data lookup across multiple frames to ensure we don't run over our instruction count per frame. #1715985
|
|
INT iColoursProcessedThisFrame
|
|
BOOL bProcessedAllColours
|
|
|
|
//Look up a quota of colours per frame defined by NO_COLOURS_TO_PROCESS_PER_FRAME.
|
|
WHILE iColoursProcessedThisFrame < NO_COLOURS_TO_PROCESS_PER_FRAME AND NOT bProcessedAllColours
|
|
//Look up data for 1 colour each time through the loop.
|
|
IF GET_COLOUR_UNLOCKS_STAGE_3(iCarColoursUnlocked, iCarColoursProcessed) = -1
|
|
//All colours processed.
|
|
bProcessedAllColours = TRUE
|
|
iModUnlockStage++
|
|
ENDIF
|
|
iCarColoursProcessed++
|
|
iColoursProcessedThisFrame++
|
|
ENDWHILE
|
|
ELSE
|
|
iModUnlockStage++
|
|
ENDIF
|
|
BREAK
|
|
|
|
CASE 3
|
|
// Colour and performance unlocks are vehicle specific in MP.
|
|
IF NETWORK_IS_GAME_IN_PROGRESS()
|
|
APP_SET_APP("car")
|
|
APP_SET_BLOCK(sModUnlockBlockName)
|
|
APP_SET_BLOCK(sModUnlockVehicleBlockName)
|
|
//Colour data used to be unlocked here but is now scheduled across multiple frames in CASE 2. #1715985
|
|
APP_SET_INT_DATA("carColoursUnlocked0", iCarColoursUnlocked[0]) CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP - carColoursUnlocked0 = ", iCarColoursUnlocked[0]) iCached_CarColoursUnlocked[0] = iCarColoursUnlocked[0]
|
|
APP_SET_INT_DATA("carColoursUnlocked1", iCarColoursUnlocked[1]) CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP - carColoursUnlocked1 = ", iCarColoursUnlocked[1]) iCached_CarColoursUnlocked[1] = iCarColoursUnlocked[1]
|
|
APP_SET_INT_DATA("carColoursUnlocked2", iCarColoursUnlocked[2]) CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP - carColoursUnlocked2 = ", iCarColoursUnlocked[2]) iCached_CarColoursUnlocked[2] = iCarColoursUnlocked[2]
|
|
APP_SET_INT_DATA("carColoursUnlocked3", iCarColoursUnlocked[3]) CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP - carColoursUnlocked3 = ", iCarColoursUnlocked[3]) iCached_CarColoursUnlocked[3] = iCarColoursUnlocked[3]
|
|
APP_SET_INT_DATA("carColoursUnlocked4", iCarColoursUnlocked[4]) CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP - carColoursUnlocked4 = ", iCarColoursUnlocked[4]) iCached_CarColoursUnlocked[4] = iCarColoursUnlocked[4]
|
|
APP_SET_INT_DATA("carColoursUnlocked5", iCarColoursUnlocked[5]) CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP - carColoursUnlocked5 = ", iCarColoursUnlocked[5]) iCached_CarColoursUnlocked[5] = iCarColoursUnlocked[5]
|
|
|
|
GET_COLOUR_UNLOCKS_STAGE_4(iUnlockBitset)
|
|
APP_SET_INT_DATA("unlockBitset3", iUnlockBitset) CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP - unlockBitset3 = ", iUnlockBitset) iCached_UnlockBitset[2] = iUnlockBitset
|
|
|
|
APP_CLOSE_BLOCK()
|
|
APP_CLOSE_BLOCK()
|
|
APP_CLOSE_APP()
|
|
ELSE
|
|
APP_SET_APP("car")
|
|
APP_SET_BLOCK("spUnlocks")
|
|
GET_COLOUR_UNLOCKS_STAGE_3(iCarColoursUnlocked)
|
|
APP_SET_INT_DATA("carColoursUnlocked0", iCarColoursUnlocked[0]) CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP - carColoursUnlocked0 = ", iCarColoursUnlocked[0]) iCached_CarColoursUnlocked[0] = iCarColoursUnlocked[0]
|
|
APP_SET_INT_DATA("carColoursUnlocked1", iCarColoursUnlocked[1]) CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP - carColoursUnlocked1 = ", iCarColoursUnlocked[1]) iCached_CarColoursUnlocked[1] = iCarColoursUnlocked[1]
|
|
APP_SET_INT_DATA("carColoursUnlocked2", iCarColoursUnlocked[2]) CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP - carColoursUnlocked2 = ", iCarColoursUnlocked[2]) iCached_CarColoursUnlocked[2] = iCarColoursUnlocked[2]
|
|
APP_SET_INT_DATA("carColoursUnlocked3", iCarColoursUnlocked[3]) CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP - carColoursUnlocked3 = ", iCarColoursUnlocked[3]) iCached_CarColoursUnlocked[3] = iCarColoursUnlocked[3]
|
|
APP_SET_INT_DATA("carColoursUnlocked4", iCarColoursUnlocked[4]) CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP - carColoursUnlocked4 = ", iCarColoursUnlocked[4]) iCached_CarColoursUnlocked[4] = iCarColoursUnlocked[4]
|
|
APP_SET_INT_DATA("carColoursUnlocked5", iCarColoursUnlocked[5]) CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP - carColoursUnlocked5 = ", iCarColoursUnlocked[5]) iCached_CarColoursUnlocked[5] = iCarColoursUnlocked[5]
|
|
APP_CLOSE_BLOCK()
|
|
APP_CLOSE_APP()
|
|
ENDIF
|
|
iModUnlockStage++
|
|
BREAK
|
|
|
|
CASE 4
|
|
CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP - Stop processing mod unlocks")
|
|
bProcessModUnlocks = FALSE
|
|
iModUnlockStage = 0
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDPROC
|
|
|
|
FUNC BOOL IS_MP_ORDER_VALID(SOCIAL_CAR_APP_ORDER_DATA &sCarAppOrder, INT iVehicleSlot)
|
|
|
|
INT iBaseCost = 0
|
|
INT iMod
|
|
|
|
INT iCol1 = g_MpSavedVehicles[iVehicleSlot].vehicleSetupMP.VehicleSetup.iColour1
|
|
INT iCol2 = g_MpSavedVehicles[iVehicleSlot].vehicleSetupMP.VehicleSetup.iColour2
|
|
INT iCol3 = g_MpSavedVehicles[iVehicleSlot].vehicleSetupMP.VehicleSetup.iColourExtra1
|
|
INT iTint = g_MpSavedVehicles[iVehicleSlot].vehicleSetupMP.VehicleSetup.iWindowTintColour
|
|
IF iTint = -1
|
|
iTint = 0
|
|
ENDIF
|
|
IF sCarAppOrder.iWindowTint = -1
|
|
sCarAppOrder.iWindowTint = 0
|
|
ENDIF
|
|
|
|
CPRINTLN(DEBUG_SOCIAL,"social_controller : Car app order breakdown")
|
|
CPRINTLN(DEBUG_SOCIAL,"Order cost = ", sCarAppOrder.iCost)
|
|
CPRINTLN(DEBUG_SOCIAL,"Colour1 = ", sCarAppOrder.iColourID1)
|
|
CPRINTLN(DEBUG_SOCIAL,"Colour2 = ", sCarAppOrder.iColourID2)
|
|
CPRINTLN(DEBUG_SOCIAL,"Order engine = ", sCarAppOrder.iEngine, " : Current engine = ", g_MpSavedVehicles[iVehicleSlot].vehicleSetupMP.VehicleSetup.iModIndex[MOD_ENGINE])
|
|
CPRINTLN(DEBUG_SOCIAL,"Order brakes = ", sCarAppOrder.iBrakes, " : Current brakes = ", g_MpSavedVehicles[iVehicleSlot].vehicleSetupMP.VehicleSetup.iModIndex[MOD_BRAKES])
|
|
CPRINTLN(DEBUG_SOCIAL,"Order exhaust = ", sCarAppOrder.iExhaust, " : Current exhaust = ", g_MpSavedVehicles[iVehicleSlot].vehicleSetupMP.VehicleSetup.iModIndex[MOD_EXHAUST])
|
|
CPRINTLN(DEBUG_SOCIAL,"Order wheels = ", sCarAppOrder.iWheels, " : Current wheels = ", g_MpSavedVehicles[iVehicleSlot].vehicleSetupMP.VehicleSetup.iModIndex[MOD_WHEELS])
|
|
CPRINTLN(DEBUG_SOCIAL,"Order armour = ", sCarAppOrder.iArmour, " : Current armour = ", g_MpSavedVehicles[iVehicleSlot].vehicleSetupMP.VehicleSetup.iModIndex[MOD_ARMOUR])
|
|
CPRINTLN(DEBUG_SOCIAL,"Order suspension = ", sCarAppOrder.iSuspension, " : Current suspension = ", g_MpSavedVehicles[iVehicleSlot].vehicleSetupMP.VehicleSetup.iModIndex[MOD_SUSPENSION])
|
|
CPRINTLN(DEBUG_SOCIAL,"Order horn = ", sCarAppOrder.iHorn, " : Current horn = ", g_MpSavedVehicles[iVehicleSlot].vehicleSetupMP.VehicleSetup.iModIndex[MOD_HORN])
|
|
CPRINTLN(DEBUG_SOCIAL,"Order lights = ", sCarAppOrder.iLights, " : Current lights = ", g_MpSavedVehicles[iVehicleSlot].vehicleSetupMP.VehicleSetup.iModIndex[MOD_TOGGLE_XENON_LIGHTS])
|
|
CPRINTLN(DEBUG_SOCIAL,"Order turbo = ", sCarAppOrder.iTurbo, " : Current turbo = ", g_MpSavedVehicles[iVehicleSlot].vehicleSetupMP.VehicleSetup.iModIndex[MOD_TOGGLE_TURBO])
|
|
CPRINTLN(DEBUG_SOCIAL,"Order tint = ", sCarAppOrder.iWindowTint, " : Current tint = ", iTint)
|
|
|
|
// Things to check...
|
|
// - Primary colour
|
|
// - Secondary colour
|
|
INT iPrim1, iPrim2, iSec1, iDummy
|
|
INT iAppColGroup
|
|
TEXT_LABEL_15 tlAppColLabel
|
|
MOD_COLOR_TYPE eModColType
|
|
|
|
INT iColCost = 0
|
|
IF GET_VEHICLE_COLOUR_FROM_CAR_APP_COLOUR_INDEX(sCarAppOrder.iColourID1, iPrim1, iPrim2)
|
|
IF iPrim1 != -1 AND iPrim2 != -1 AND (iPrim1 != iCol1 OR iPrim2 != iCol3)
|
|
|
|
GET_CAR_APP_COLOUR_DATA(sCarAppOrder.iColourID1, tlAppColLabel, iAppColGroup, iPrim1, iPrim2)
|
|
|
|
IF (iAppColGroup = 0) eModColType = MCT_METALLIC //metallic
|
|
ELIF (iAppColGroup = 1) eModColType = MCT_CLASSIC //classic
|
|
ELIF (iAppColGroup = 2) eModColType = MCT_MATTE //matte
|
|
ELIF (iAppColGroup = 3) eModColType = MCT_METALS //metals
|
|
ELIF (iAppColGroup = 4) eModColType = MCT_CHROME //chrome
|
|
ENDIF
|
|
|
|
iColCost = GET_BASE_CARMOD_COLOUR_PRICE_FROM_TEXT_LABEL(tlAppColLabel, eModColType, TRUE, TRUE, FALSE, FALSE, FALSE)
|
|
iBaseCost += iColCost
|
|
CPRINTLN(DEBUG_SOCIAL," Primary Colour......$", iColCost)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF GET_VEHICLE_COLOUR_FROM_CAR_APP_COLOUR_INDEX(sCarAppOrder.iColourID2, iSec1, iDummy)
|
|
IF iSec1 != -1 AND iSec1 != iCol2
|
|
GET_CAR_APP_COLOUR_DATA(sCarAppOrder.iColourID2, tlAppColLabel, iAppColGroup, iPrim1, iPrim2)
|
|
|
|
IF (iAppColGroup = 0) eModColType = MCT_METALLIC //metallic
|
|
ELIF (iAppColGroup = 1) eModColType = MCT_CLASSIC //classic
|
|
ELIF (iAppColGroup = 2) eModColType = MCT_MATTE //matte
|
|
ELIF (iAppColGroup = 3) eModColType = MCT_METALS //metals
|
|
ELIF (iAppColGroup = 4) eModColType = MCT_CHROME //chrome
|
|
ENDIF
|
|
|
|
iColCost = GET_BASE_CARMOD_COLOUR_PRICE_FROM_TEXT_LABEL(tlAppColLabel, eModColType, FALSE, TRUE, FALSE, FALSE, FALSE)
|
|
|
|
iBaseCost += iColCost
|
|
CPRINTLN(DEBUG_SOCIAL," Secondary Colour......$", iColCost)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// - Plates
|
|
IF sCarAppOrder.iPlateBack_pending != g_MpSavedVehicles[iVehicleSlot].vehicleSetupMP.VehicleSetup.iPlateIndex
|
|
IF sCarAppOrder.iPlateBack_pending = 3 // Blue on White 1
|
|
iBaseCost += 200
|
|
CPRINTLN(DEBUG_SOCIAL," Plates, Blue on White 1......$", 200)
|
|
ELIF sCarAppOrder.iPlateBack_pending = 0 // Blue on White 2
|
|
iBaseCost += 200
|
|
CPRINTLN(DEBUG_SOCIAL," Plates, Blue on White 2......$", 200)
|
|
ELIF sCarAppOrder.iPlateBack_pending= 4 // Blue on White 3
|
|
iBaseCost += 200
|
|
CPRINTLN(DEBUG_SOCIAL," Plates, Blue on White 3......$", 200)
|
|
ELIF sCarAppOrder.iPlateBack_pending = 2 // Orange on Blue
|
|
iBaseCost += 300
|
|
CPRINTLN(DEBUG_SOCIAL," Plates, Orange on Blue......$", 300)
|
|
ELIF sCarAppOrder.iPlateBack_pending = 1 // Yellow on Black
|
|
iBaseCost += 600
|
|
CPRINTLN(DEBUG_SOCIAL," Plates, Yellow on Black......$", 600)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// - Bullet proof tyres
|
|
IF NOT IS_BIT_SET(g_MpSavedVehicles[iVehicleSlot].vehicleSetupMP.VehicleSetup.iFlags, VEHICLE_SETUP_FLAG_BULLETPROOF_TYRES)
|
|
IF sCarAppOrder.bBulletProofTyres
|
|
iBaseCost += 25000
|
|
CPRINTLN(DEBUG_SOCIAL," Bullet proof tyres......$", 25000)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// - Tyre smoke
|
|
INT iRed, iGreen, iBlue
|
|
iRed = g_MpSavedVehicles[iVehicleSlot].vehicleSetupMP.VehicleSetup.iTyreR
|
|
iGreen = g_MpSavedVehicles[iVehicleSlot].vehicleSetupMP.VehicleSetup.iTyreG
|
|
iBlue = g_MpSavedVehicles[iVehicleSlot].vehicleSetupMP.VehicleSetup.iTyreB
|
|
|
|
IF sCarAppOrder.iTyreSmokeR != iRed
|
|
OR sCarAppOrder.iTyreSmokeG != iGreen
|
|
OR sCarAppOrder.iTyreSmokeB != iBlue
|
|
SWITCH GET_TYRE_SMOKE_COLOUR_ENUM_FROM_RGB(sCarAppOrder.iTyreSmokeR, sCarAppOrder.iTyreSmokeG, sCarAppOrder.iTyreSmokeB)
|
|
CASE TYRE_SMOKE_WHITE
|
|
iBaseCost += 1500
|
|
CPRINTLN(DEBUG_SOCIAL," Tyre smoke white......$", 1500)
|
|
BREAK
|
|
CASE TYRE_SMOKE_BLACK
|
|
iBaseCost += 5000
|
|
CPRINTLN(DEBUG_SOCIAL," Tyre smoke black......$", 5000)
|
|
BREAK
|
|
CASE TYRE_SMOKE_BLUE
|
|
iBaseCost += 10000
|
|
CPRINTLN(DEBUG_SOCIAL," Tyre smoke blue......$", 10000)
|
|
BREAK
|
|
CASE TYRE_SMOKE_YELLOW
|
|
iBaseCost += 12500
|
|
CPRINTLN(DEBUG_SOCIAL," Tyre smoke yellow......$", 12500)
|
|
BREAK
|
|
CASE TYRE_SMOKE_ORANGE
|
|
iBaseCost += 15000
|
|
CPRINTLN(DEBUG_SOCIAL," Tyre smoke orange......$", 15000)
|
|
BREAK
|
|
CASE TYRE_SMOKE_RED
|
|
iBaseCost += 20000
|
|
CPRINTLN(DEBUG_SOCIAL," Tyre smoke red......$", 20000)
|
|
BREAK
|
|
CASE TYRE_SMOKE_BUSINESS_PURPLE
|
|
iBaseCost += 14000
|
|
CPRINTLN(DEBUG_SOCIAL," Tyre smoke red......$", 14000)
|
|
BREAK
|
|
CASE TYRE_SMOKE_BUSINESS_GREEN
|
|
iBaseCost += 17500
|
|
CPRINTLN(DEBUG_SOCIAL," Tyre smoke purple......$", 17500)
|
|
BREAK
|
|
CASE TYRE_SMOKE_HIPSTER_PINK
|
|
iBaseCost += g_sMPTunables.iDLC_hipster_modifier_Pink_Tire_Smoke
|
|
CPRINTLN(DEBUG_SOCIAL," Tyre smoke pink......$", g_sMPTunables.iDLC_hipster_modifier_Pink_Tire_Smoke)
|
|
BREAK
|
|
CASE TYRE_SMOKE_HIPSTER_BROWN
|
|
iBaseCost += g_sMPTunables.iDLC_hipster_modifier_Brown_Tire_Smoke
|
|
CPRINTLN(DEBUG_SOCIAL," Tyre smoke brown......$", g_sMPTunables.iDLC_hipster_modifier_Brown_Tire_Smoke)
|
|
BREAK
|
|
CASE TYRE_SMOKE_INDI_PAT
|
|
iBaseCost += g_sMPTunables.iVehiclekit_IndependenceDay_Patriot_Tire_Smoke
|
|
CPRINTLN(DEBUG_SOCIAL," Tyre smoke red/white/blue......$", g_sMPTunables.iVehiclekit_IndependenceDay_Patriot_Tire_Smoke)
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDIF
|
|
|
|
// - Window tint
|
|
IF sCarAppOrder.iWindowTint != iTint
|
|
IF sCarAppOrder.iWindowTint = 0
|
|
iBaseCost += 500
|
|
CPRINTLN(DEBUG_SOCIAL," Window tint none......$", 500)
|
|
ELIF sCarAppOrder.iWindowTint = 1
|
|
iBaseCost += 5000
|
|
CPRINTLN(DEBUG_SOCIAL," Window tint limo......$", 5000)
|
|
ELIF sCarAppOrder.iWindowTint = 2
|
|
iBaseCost += 3500
|
|
CPRINTLN(DEBUG_SOCIAL," Window tint dark smoke......$", 3500)
|
|
ELIF sCarAppOrder.iWindowTint = 3
|
|
iBaseCost += 1500
|
|
CPRINTLN(DEBUG_SOCIAL," Window tint light smoke......$", 1500)
|
|
ELIF sCarAppOrder.iWindowTint = 5
|
|
iBaseCost += g_sMPTunables.iDLC_hipster_modifier_Pure_Black
|
|
CPRINTLN(DEBUG_SOCIAL," Window tint pure black ......$", g_sMPTunables.iDLC_hipster_modifier_Pure_Black)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// - Engine
|
|
iMod = g_MpSavedVehicles[iVehicleSlot].vehicleSetupMP.VehicleSetup.iModIndex[MOD_ENGINE]
|
|
IF sCarAppOrder.iEngine != iMod
|
|
AND sCarAppOrder.iEngine != -1
|
|
IF sCarAppOrder.iEngine = 0
|
|
iBaseCost += 500
|
|
CPRINTLN(DEBUG_SOCIAL," Engine......$", 500)
|
|
ELIF sCarAppOrder.iEngine = 1
|
|
iBaseCost += 1800
|
|
CPRINTLN(DEBUG_SOCIAL," Engine......$", 1800)
|
|
ELIF sCarAppOrder.iEngine = 2
|
|
iBaseCost += 2500
|
|
CPRINTLN(DEBUG_SOCIAL," Engine......$", 2500)
|
|
ELIF sCarAppOrder.iEngine = 3
|
|
iBaseCost += 3600
|
|
CPRINTLN(DEBUG_SOCIAL," Engine......$", 3600)
|
|
ELIF sCarAppOrder.iEngine = 4
|
|
iBaseCost += 6700
|
|
CPRINTLN(DEBUG_SOCIAL," Engine......$", 6700)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// - Brakes
|
|
iMod = g_MpSavedVehicles[iVehicleSlot].vehicleSetupMP.VehicleSetup.iModIndex[MOD_BRAKES]
|
|
IF sCarAppOrder.iBrakes != iMod
|
|
AND sCarAppOrder.iBrakes != -1
|
|
IF sCarAppOrder.iBrakes = 0
|
|
iBaseCost += 200
|
|
CPRINTLN(DEBUG_SOCIAL," Brakes......$", 200)
|
|
ELIF sCarAppOrder.iBrakes = 1
|
|
iBaseCost += 4000
|
|
CPRINTLN(DEBUG_SOCIAL," Brakes......$", 4000)
|
|
ELIF sCarAppOrder.iBrakes = 2
|
|
iBaseCost += 5400
|
|
CPRINTLN(DEBUG_SOCIAL," Brakes......$", 5400)
|
|
ELIF sCarAppOrder.iBrakes = 3
|
|
iBaseCost += 7000
|
|
CPRINTLN(DEBUG_SOCIAL," Brakes......$", 7000)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// - Exhaust
|
|
iMod = g_MpSavedVehicles[iVehicleSlot].vehicleSetupMP.VehicleSetup.iModIndex[MOD_EXHAUST]
|
|
IF sCarAppOrder.iExhaust != iMod
|
|
AND sCarAppOrder.iExhaust != -1
|
|
IF sCarAppOrder.iExhaust = 0
|
|
iBaseCost += 260
|
|
CPRINTLN(DEBUG_SOCIAL," Exhaust......$", 260)
|
|
ELIF sCarAppOrder.iExhaust = 1
|
|
iBaseCost += 750
|
|
CPRINTLN(DEBUG_SOCIAL," Exhaust......$", 750)
|
|
ELIF sCarAppOrder.iExhaust = 2
|
|
iBaseCost += 1800
|
|
CPRINTLN(DEBUG_SOCIAL," Exhaust......$", 1800)
|
|
ELIF sCarAppOrder.iExhaust = 3
|
|
iBaseCost += 3000
|
|
CPRINTLN(DEBUG_SOCIAL," Exhaust......$", 3000)
|
|
ELIF sCarAppOrder.iExhaust = 4
|
|
iBaseCost += 9550
|
|
CPRINTLN(DEBUG_SOCIAL," Exhaust......$", 9550)
|
|
ELIF sCarAppOrder.iExhaust = 5
|
|
iBaseCost += 9750
|
|
CPRINTLN(DEBUG_SOCIAL," Exhaust......$", 9750)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// - Wheels
|
|
iMod = g_MpSavedVehicles[iVehicleSlot].vehicleSetupMP.VehicleSetup.iModIndex[MOD_WHEELS]
|
|
IF sCarAppOrder.iWheels != iMod
|
|
AND sCarAppOrder.iWheels != -1
|
|
// wheels cost
|
|
ENDIF
|
|
|
|
// - Horn
|
|
iMod = g_MpSavedVehicles[iVehicleSlot].vehicleSetupMP.VehicleSetup.iModIndex[MOD_HORN]
|
|
IF sCarAppOrder.iHorn != iMod
|
|
AND sCarAppOrder.iHorn != -1
|
|
IF sCarAppOrder.iHorn = 0
|
|
iBaseCost += 500
|
|
CPRINTLN(DEBUG_SOCIAL," Horn......$", 500)
|
|
ELIF sCarAppOrder.iHorn = 1
|
|
iBaseCost += 2000
|
|
CPRINTLN(DEBUG_SOCIAL," Horn......$", 2000)
|
|
ELIF sCarAppOrder.iHorn = 2
|
|
iBaseCost += 3000
|
|
CPRINTLN(DEBUG_SOCIAL," Horn......$", 3000)
|
|
ELIF sCarAppOrder.iHorn = 3
|
|
iBaseCost += 5000
|
|
CPRINTLN(DEBUG_SOCIAL," Horn......$", 5000)
|
|
ELIF sCarAppOrder.iHorn = 4
|
|
iBaseCost += 10000
|
|
CPRINTLN(DEBUG_SOCIAL," Horn......$", 10000)
|
|
ELIF sCarAppOrder.iHorn = 5
|
|
iBaseCost += 12500
|
|
CPRINTLN(DEBUG_SOCIAL," Horn......$", 12500)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// - Armour
|
|
iMod = g_MpSavedVehicles[iVehicleSlot].vehicleSetupMP.VehicleSetup.iModIndex[MOD_ARMOUR]
|
|
IF sCarAppOrder.iArmour != iMod
|
|
AND sCarAppOrder.iArmour != -1
|
|
IF sCarAppOrder.iArmour = 0
|
|
iBaseCost += 200
|
|
CPRINTLN(DEBUG_SOCIAL," Armour......$", 200)
|
|
ELIF sCarAppOrder.iArmour = 1
|
|
iBaseCost += 3600
|
|
CPRINTLN(DEBUG_SOCIAL," Armour......$", 3600)
|
|
ELIF sCarAppOrder.iArmour = 2
|
|
iBaseCost += 6000
|
|
CPRINTLN(DEBUG_SOCIAL," Armour......$", 6000)
|
|
ELIF sCarAppOrder.iArmour = 3
|
|
iBaseCost += 9600
|
|
CPRINTLN(DEBUG_SOCIAL," Armour......$", 9600)
|
|
ELIF sCarAppOrder.iArmour = 4
|
|
iBaseCost += 16800
|
|
CPRINTLN(DEBUG_SOCIAL," Armour......$", 16800)
|
|
ELIF sCarAppOrder.iArmour = 5
|
|
iBaseCost += 24000
|
|
CPRINTLN(DEBUG_SOCIAL," Armour......$", 24000)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// - Suspension
|
|
iMod = g_MpSavedVehicles[iVehicleSlot].vehicleSetupMP.VehicleSetup.iModIndex[MOD_SUSPENSION]
|
|
IF sCarAppOrder.iSuspension != iMod
|
|
AND sCarAppOrder.iSuspension != -1
|
|
IF sCarAppOrder.iSuspension = 0
|
|
iBaseCost += 200
|
|
CPRINTLN(DEBUG_SOCIAL," Suspension......$", 200)
|
|
ELIF sCarAppOrder.iSuspension = 1
|
|
iBaseCost += 1000
|
|
CPRINTLN(DEBUG_SOCIAL," Suspension......$", 1000)
|
|
ELIF sCarAppOrder.iSuspension = 2
|
|
iBaseCost += 2000
|
|
CPRINTLN(DEBUG_SOCIAL," Suspension......$", 2000)
|
|
ELIF sCarAppOrder.iSuspension = 3
|
|
iBaseCost += 3400
|
|
CPRINTLN(DEBUG_SOCIAL," Suspension......$", 3400)
|
|
ELIF sCarAppOrder.iSuspension = 4
|
|
iBaseCost += 4400
|
|
CPRINTLN(DEBUG_SOCIAL," Suspension......$", 4400)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// - Lights
|
|
IF sCarAppOrder.iLights != -1
|
|
IF (sCarAppOrder.iLights != 1 AND g_MpSavedVehicles[iVehicleSlot].vehicleSetupMP.VehicleSetup.iModIndex[MOD_TOGGLE_XENON_LIGHTS] > 0)
|
|
iBaseCost += 100
|
|
CPRINTLN(DEBUG_SOCIAL," No lights......$", 100)
|
|
ELIF (sCarAppOrder.iLights = 1 AND g_MpSavedVehicles[iVehicleSlot].vehicleSetupMP.VehicleSetup.iModIndex[MOD_TOGGLE_XENON_LIGHTS] <= 0)
|
|
iBaseCost += 2000
|
|
CPRINTLN(DEBUG_SOCIAL," Lights......$", 2000)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// - Turbo
|
|
IF sCarAppOrder.iTurbo != -1
|
|
IF (sCarAppOrder.iTurbo != 1 AND g_MpSavedVehicles[iVehicleSlot].vehicleSetupMP.VehicleSetup.iModIndex[MOD_TOGGLE_TURBO] > 0)
|
|
iBaseCost += 1000
|
|
CPRINTLN(DEBUG_SOCIAL," No turbo......$", 1000)
|
|
ELIF (sCarAppOrder.iTurbo = 1 AND g_MpSavedVehicles[iVehicleSlot].vehicleSetupMP.VehicleSetup.iModIndex[MOD_TOGGLE_TURBO] <= 0)
|
|
iBaseCost += 24000
|
|
CPRINTLN(DEBUG_SOCIAL," Turbo......$", 24000)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
CPRINTLN(DEBUG_SOCIAL,"IS_MP_ORDER_VALID")
|
|
CPRINTLN(DEBUG_SOCIAL,"...Base cost = ", iBaseCost)
|
|
CPRINTLN(DEBUG_SOCIAL,"...Order cost = ", sCarAppOrder.iCost)
|
|
|
|
RETURN (sCarAppOrder.iCost >= iBaseCost)
|
|
ENDFUNC
|
|
|
|
|
|
PROC FILL_CAR_APP_DATA(SOCIAL_CAR_APP_DATA &sData, INT iSelectedVehSlot)
|
|
// Saved vehicle data
|
|
sData.eModel = g_MpSavedVehicles[iSelectedVehSlot].vehicleSetupMP.VehicleSetup.eModel
|
|
sData.iWindowTint = g_MpSavedVehicles[iSelectedVehSlot].vehicleSetupMP.VehicleSetup.iWindowTintColour
|
|
sData.iTyreSmokeR = g_MpSavedVehicles[iSelectedVehSlot].vehicleSetupMP.VehicleSetup.iTyreR
|
|
sData.iTyreSmokeG = g_MpSavedVehicles[iSelectedVehSlot].vehicleSetupMP.VehicleSetup.iTyreG
|
|
sData.iTyreSmokeB = g_MpSavedVehicles[iSelectedVehSlot].vehicleSetupMP.VehicleSetup.iTyreB
|
|
sData.iWheelType = g_MpSavedVehicles[iSelectedVehSlot].vehicleSetupMP.VehicleSetup.iWheelType
|
|
sData.bBulletProofTyres = (IS_BIT_SET(g_MpSavedVehicles[iSelectedVehSlot].vehicleSetupMP.VehicleSetup.iFlags, VEHICLE_SETUP_FLAG_BULLETPROOF_TYRES))
|
|
sData.tlPlateText = g_MpSavedVehicles[iSelectedVehSlot].vehicleSetupMP.VehicleSetup.tlPlateText
|
|
sData.iPlateBack = g_MpSavedVehicles[iSelectedVehSlot].vehicleSetupMP.VehicleSetup.iPlateIndex
|
|
sData.iEngine = g_MpSavedVehicles[iSelectedVehSlot].vehicleSetupMP.VehicleSetup.iModIndex[MOD_ENGINE]
|
|
sData.iBrakes = g_MpSavedVehicles[iSelectedVehSlot].vehicleSetupMP.VehicleSetup.iModIndex[MOD_BRAKES]
|
|
sData.iWheels = g_MpSavedVehicles[iSelectedVehSlot].vehicleSetupMP.VehicleSetup.iModIndex[MOD_WHEELS]
|
|
sData.iExhaust = g_MpSavedVehicles[iSelectedVehSlot].vehicleSetupMP.VehicleSetup.iModIndex[MOD_EXHAUST]
|
|
sData.iSuspension = g_MpSavedVehicles[iSelectedVehSlot].vehicleSetupMP.VehicleSetup.iModIndex[MOD_SUSPENSION]
|
|
sData.iArmour = g_MpSavedVehicles[iSelectedVehSlot].vehicleSetupMP.VehicleSetup.iModIndex[MOD_ARMOUR]
|
|
sData.iHorn = g_MpSavedVehicles[iSelectedVehSlot].vehicleSetupMP.VehicleSetup.iModIndex[MOD_HORN]
|
|
sData.iLights = g_MpSavedVehicles[iSelectedVehSlot].vehicleSetupMP.VehicleSetup.iModIndex[MOD_TOGGLE_XENON_LIGHTS]
|
|
sData.iTyreSmoke = g_MpSavedVehicles[iSelectedVehSlot].vehicleSetupMP.VehicleSetup.iModIndex[MOD_TOGGLE_TYRE_SMOKE]
|
|
sData.iTurbo = g_MpSavedVehicles[iSelectedVehSlot].vehicleSetupMP.VehicleSetup.iModIndex[MOD_TOGGLE_TURBO]
|
|
sData.bSendDataToCloud = (IS_BIT_SET(g_MpSavedVehicles[iSelectedVehSlot].iVehicleBS, MP_SAVED_VEHICLE_CARAPP_SEND))
|
|
sData.bDeleteData = (IS_BIT_SET(g_MpSavedVehicles[iSelectedVehSlot].iVehicleBS, MP_SAVED_VEHICLE_CARAPP_DELETE))
|
|
|
|
GET_CAR_APP_COLOUR_INDEX_FROM_VEHICLE_COLOUR(g_MpSavedVehicles[iSelectedVehSlot].vehicleSetupMP.VehicleSetup.iColour1, g_MpSavedVehicles[iSelectedVehSlot].vehicleSetupMP.VehicleSetup.iColourExtra1, g_MpSavedVehicles[iSelectedVehSlot].iPrimaryColourGroup, TRUE, sData.iColourID1)
|
|
GET_CAR_APP_COLOUR_INDEX_FROM_VEHICLE_COLOUR(g_MpSavedVehicles[iSelectedVehSlot].vehicleSetupMP.VehicleSetup.iColour2, -1, g_MpSavedVehicles[iSelectedVehSlot].iSecondaryColourGroup, FALSE, sData.iColourID2)
|
|
|
|
// Clear the colourID's if we have a crew colour.
|
|
IF (IS_BIT_SET(g_MpSavedVehicles[iSelectedVehSlot].vehicleSetupMP.VehicleSetup.iFlags, VEHICLE_SETUP_FLAG_CUSTOM_PRIMARY))
|
|
sData.iColourID1 = -1
|
|
ENDIF
|
|
IF (IS_BIT_SET(g_MpSavedVehicles[iSelectedVehSlot].vehicleSetupMP.VehicleSetup.iFlags, VEHICLE_SETUP_FLAG_CUSTOM_SECONDARY))
|
|
sData.iColourID2 = -1
|
|
ENDIF
|
|
|
|
// Common data for all vehicles in MP
|
|
sData.bUpdateMods = g_savedMPGlobalsNew.g_savedMPGlobals[GET_SAVE_GAME_ARRAY_SLOT()].MpSavedCarApp.bUpdateMods
|
|
ENDPROC
|
|
|
|
FUNC BOOL FILL_STATIC_CAR_APP_DATA(SOCIAL_CAR_APP_DATA &sData)
|
|
|
|
// The purpose of this function is to replace the following data lookup to ensure the data we have is 100% up to date.
|
|
// STATIC_CAR_APP_DATA sStaticData
|
|
// GET_STATIC_CAR_APP_DATA_FOR_VEHICLE(sData.eModel, sStaticData)
|
|
|
|
|
|
IF NOT IS_VEHICLE_MODEL_SAFE_FOR_CARAPP(sData.eModel)
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
IF bFetchTimerSet
|
|
IF ABSI(GET_TIME_DIFFERENCE(GET_NETWORK_TIME(), tdFetchTimer)) < 1500
|
|
RETURN FALSE
|
|
ENDIF
|
|
ENDIF
|
|
bFetchTimerSet = FALSE
|
|
|
|
// #IF IS_DEBUG_BUILD
|
|
// bFetchingData = TRUE
|
|
// #ENDIF
|
|
REQUEST_MODEL(sData.eModel)
|
|
IF NOT HAS_MODEL_LOADED(sData.eModel)
|
|
RETURN FALSE
|
|
ENDIF
|
|
|
|
VEHICLE_INDEX vehID
|
|
IF NETWORK_IS_GAME_IN_PROGRESS()
|
|
vehID = CREATE_VEHICLE(sData.eModel, <<660.3092+(NATIVE_TO_INT(PLAYER_ID())*10), 4977.6084, 1222.0242>>, 0, FALSE, FALSE)
|
|
ELSE
|
|
vehID = CREATE_VEHICLE(sData.eModel, <<660.3092, 4977.6084, 1222.0242>>, 0, FALSE, FALSE)
|
|
ENDIF
|
|
|
|
IF GET_NUM_MOD_KITS(vehID) > 0
|
|
SET_VEHICLE_MOD_KIT(vehID, 0)
|
|
ENDIF
|
|
|
|
// Apply stored vehicle mods?
|
|
SET_VEHICLE_WHEEL_TYPE(vehID, INT_TO_ENUM(MOD_WHEEL_TYPE, g_MpSavedVehicles[iMPSavedVehicleSlot].vehicleSetupMP.VehicleSetup.iWheelType))
|
|
|
|
// No longer saving vehicle data in the MP savegame so just grab from the vehicle we created.
|
|
sData.iHornHash[0] = GET_VEHICLE_DEFAULT_HORN_IGNORE_MODS(vehID)
|
|
sData.iHornHash[1] = GET_VEHICLE_MOD_MODIFIER_VALUE(vehID, MOD_HORN, 0)
|
|
sData.iHornHash[2] = GET_VEHICLE_MOD_MODIFIER_VALUE(vehID, MOD_HORN, 1)
|
|
sData.iHornHash[3] = GET_VEHICLE_MOD_MODIFIER_VALUE(vehID, MOD_HORN, 2)
|
|
sData.iHornHash[4] = GET_VEHICLE_MOD_MODIFIER_VALUE(vehID, MOD_HORN, 3)
|
|
sData.iModCountEngine = GET_NUM_VEHICLE_MODS(vehID, MOD_ENGINE)+1
|
|
sData.iModCountBrakes = GET_NUM_VEHICLE_MODS(vehID, MOD_BRAKES)+1
|
|
sData.iModCountExhaust = GET_NUM_VEHICLE_MODS(vehID, MOD_EXHAUST)+1
|
|
sData.iModCountHorn = GET_NUM_VEHICLE_MODS(vehID, MOD_HORN)+1
|
|
sData.iModCountArmour = GET_NUM_VEHICLE_MODS(vehID, MOD_ARMOUR)+1
|
|
sData.iModCountSuspension = GET_NUM_VEHICLE_MODS(vehID, MOD_SUSPENSION)+1
|
|
sData.fModPriceModifier = GET_VEHICLE_MOD_PRICE_MODIFIER(vehID)
|
|
sData.iModColoursThatCanBeSet = GET_VEHICLE_COLOURS_WHICH_CAN_BE_SET(vehID)
|
|
sData.eModKitType = GET_VEHICLE_MOD_KIT_TYPE(vehID)
|
|
sData.iModCountWheels = GET_NUM_VEHICLE_MODS(vehID, MOD_WHEELS)+1
|
|
iWheelVariation = GET_VEHICLE_MOD_VARIATION(vehID, MOD_WHEELS)
|
|
|
|
IF !NETWORK_IS_GAME_IN_PROGRESS()
|
|
IF sData.eModel = PATRIOT
|
|
sData.iModCountExhaust = 0
|
|
PRINTLN("FILL_STATIC_CAR_APP_DATA iExhaust setting to = 0")
|
|
ENDIF
|
|
IF sData.eModel = PRAIRIE
|
|
IF sData.iModCountExhaust > 1
|
|
PRINTLN("FILL_STATIC_CAR_APP_DATA iExhaust setting to = 1 it was: ", sData.iModCountExhaust)
|
|
sData.iModCountExhaust = 1
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
DELETE_VEHICLE(vehID)
|
|
SET_MODEL_AS_NO_LONGER_NEEDED(sData.eModel)
|
|
|
|
bFetchTimerSet = TRUE
|
|
tdFetchTimer = GET_NETWORK_TIME()
|
|
|
|
// Prevent save from kicking in.
|
|
SETTIMERA(0)
|
|
|
|
RETURN TRUE
|
|
ENDFUNC
|
|
|
|
PROC UPDATE_SAVED_MP_CAR_APP_DATA(SOCIAL_CAR_APP_DATA &sData)
|
|
|
|
IF sData.bSendDataToCloud
|
|
SET_BIT(g_MpSavedVehicles[iMPSavedVehicleSlot].iVehicleBS, MP_SAVED_VEHICLE_CARAPP_SEND)
|
|
ELSE
|
|
CLEAR_BIT(g_MpSavedVehicles[iMPSavedVehicleSlot].iVehicleBS, MP_SAVED_VEHICLE_CARAPP_SEND)
|
|
ENDIF
|
|
|
|
IF sData.bDeleteData
|
|
SET_BIT(g_MpSavedVehicles[iMPSavedVehicleSlot].iVehicleBS, MP_SAVED_VEHICLE_CARAPP_DELETE)
|
|
ELSE
|
|
CLEAR_BIT(g_MpSavedVehicles[iMPSavedVehicleSlot].iVehicleBS, MP_SAVED_VEHICLE_CARAPP_DELETE)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
|
|
CONST_INT NUM_SUPERMOD_WHEELS_BENNY_ORIGINAL 31
|
|
CONST_INT NUM_SUPERMOD_WHEELS_BENNY_BESPOKE 31
|
|
CONST_INT NUM_SUPERMOD_WHEELS_RACE 20
|
|
CONST_INT NUM_SUPERMOD_WHEELS_STREET 30
|
|
CONST_INT NUM_SUPERMOD_WHEELS_TRACK 30
|
|
|
|
/// PURPOSE: Gets the unique wheel mod count for a vehicle. Excludes mods with tyre variants.
|
|
FUNC INT GET_VEHICLE_MOD_WHEEL_COUNT(SOCIAL_CAR_APP_DATA &sData)
|
|
|
|
SWITCH INT_TO_ENUM(MOD_WHEEL_TYPE, sData.iWheelType)
|
|
CASE MWT_SUPERMOD1
|
|
RETURN NUM_SUPERMOD_WHEELS_BENNY_ORIGINAL
|
|
BREAK
|
|
CASE MWT_SUPERMOD2
|
|
RETURN NUM_SUPERMOD_WHEELS_BENNY_BESPOKE
|
|
BREAK
|
|
CASE MWT_SUPERMOD3
|
|
IF IS_VEHICLE_AN_OPEN_WHEEL_VEHICLE(sData.eModel)
|
|
RETURN NUM_SUPERMOD_WHEELS_RACE
|
|
ENDIF
|
|
BREAK
|
|
CASE MWT_SUPERMOD4
|
|
RETURN NUM_SUPERMOD_WHEELS_STREET
|
|
BREAK
|
|
CASE MWT_SUPERMOD5
|
|
RETURN NUM_SUPERMOD_WHEELS_TRACK
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
RETURN sData.iModCountWheels - 1
|
|
ENDFUNC
|
|
|
|
/// PURPOSE: Gets the global mod wheel index for a given mod index and set.
|
|
FUNC INT GET_VEHICLE_MOD_WHEEL_INDEX_FOR_VARIATION(SOCIAL_CAR_APP_DATA &sData)
|
|
INT iWheelCount = GET_VEHICLE_MOD_WHEEL_COUNT(sData)
|
|
PRINTLN("GET_VEHICLE_MOD_WHEEL_INDEX_FOR_VARIATION iWheelCount: ", iWheelCount, " sData.iWheels: ", sData.iWheels, " sData.iWheelVariation: ", iWheelVariation)
|
|
RETURN ((sData.iWheels % iWheelCount) + (iWheelVariation * iWheelCount))
|
|
ENDFUNC
|
|
|
|
/// PURPOSE: Attempts to fetch the car app data and sends txt if successful.
|
|
PROC DO_PROCESS_CAR_APP(enumCharacterList ePed)
|
|
|
|
BOOL bGetPlate
|
|
INT iPass
|
|
INT iSlotID
|
|
INT iMPCharSlot
|
|
INT iR, iG, iB, iA
|
|
TEXT_LABEL_23 sBlockName
|
|
TEXT_LABEL_23 sOrderBlockName
|
|
TEXT_LABEL_23 sVehicleBlockName
|
|
SOCIAL_CAR_APP_DATA sData
|
|
SOCIAL_CAR_APP_ORDER_DATA sOrder
|
|
|
|
IF ePed = CHAR_MICHAEL
|
|
iSlotID = 0
|
|
sBlockName = "singleplayer0"
|
|
sOrderBlockName = "sp0_order"
|
|
sData = g_savedGlobals.sSocialData.sCarAppData[CHAR_MICHAEL]
|
|
sOrder = g_savedGlobals.sSocialData.sCarAppOrder[CHAR_MICHAEL]
|
|
ELIF ePed = CHAR_FRANKLIN
|
|
iSlotID = 1
|
|
sBlockName = "singleplayer1"
|
|
sOrderBlockName = "sp1_order"
|
|
sData = g_savedGlobals.sSocialData.sCarAppData[CHAR_FRANKLIN]
|
|
sOrder = g_savedGlobals.sSocialData.sCarAppOrder[CHAR_FRANKLIN]
|
|
ELIF ePed = CHAR_TREVOR
|
|
iSlotID = 2
|
|
sBlockName = "singleplayer2"
|
|
sOrderBlockName = "sp2_order"
|
|
sData = g_savedGlobals.sSocialData.sCarAppData[CHAR_TREVOR]
|
|
sOrder = g_savedGlobals.sSocialData.sCarAppOrder[CHAR_TREVOR]
|
|
ELIF ePed = CHAR_MULTIPLAYER
|
|
iMPCharSlot = GET_ACTIVE_CHARACTER_SLOT()
|
|
iSlotID = 3+iMPCharSlot
|
|
sBlockName = "multiplayer"
|
|
sBlockName += iMPCharSlot
|
|
sOrderBlockName = "mp"
|
|
sOrderBlockName += iMPCharSlot
|
|
sOrderBlockName += "_order"
|
|
|
|
INT iSavedVehicleSlot
|
|
IF GET_SAVE_VEHICLE_SLOT_FROM_CAR_APP_SLOT(iMPCarAppSlot, iSavedVehicleSlot)
|
|
FILL_CAR_APP_DATA(sData, iSavedVehicleSlot)
|
|
ELSE
|
|
FILL_CAR_APP_DATA(sData, 0)
|
|
ENDIF
|
|
sOrder = g_savedMPGlobalsNew.g_savedMPGlobals[GET_SAVE_GAME_ARRAY_SLOT()].MpSavedCarApp.sCarAppOrder // we need to determine what the last used vehicle slot was..
|
|
sVehicleBlockName = "vehicle"
|
|
sVehicleBlockName += iMPVehicleBlock
|
|
ELSE
|
|
EXIT
|
|
ENDIF
|
|
|
|
///////////////////////////////////////////////////////
|
|
///
|
|
/// REFERSH APP DATA
|
|
///
|
|
IF bRefreshAppDataOnInit
|
|
OR (NOT NETWORK_IS_GAME_IN_PROGRESS() AND bResendAppDataForAccountLinkSP)
|
|
IF NETWORK_IS_GAME_IN_PROGRESS()
|
|
// dont bother with mp for now - not going to be changing profiles much.
|
|
bRefreshAppDataOnInit = FALSE
|
|
ELSE
|
|
CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP - refreshing contents of app.")
|
|
|
|
APP_SET_APP("car")
|
|
|
|
APP_SET_BLOCK("singleplayer0")
|
|
APP_SET_INT_DATA("carUnlocked", 0)
|
|
APP_CLOSE_BLOCK()
|
|
|
|
// APP_SET_BLOCK("singleplayer1")
|
|
// APP_SET_INT_DATA("carUnlocked", 0)
|
|
// APP_CLOSE_BLOCK()
|
|
|
|
APP_SET_BLOCK("singleplayer2")
|
|
APP_SET_INT_DATA("carUnlocked", 0)
|
|
APP_CLOSE_BLOCK()
|
|
|
|
APP_CLOSE_APP()
|
|
|
|
IF NETWORK_IS_SIGNED_ONLINE()
|
|
APP_SET_APP("car")
|
|
APP_SET_BLOCK("appdata")
|
|
CPRINTLN(DEBUG_SOCIAL,"playerName = ", GET_PLAYER_NAME(PLAYER_ID()), " with hash ", GET_HASH_KEY((GET_PLAYER_NAME(PLAYER_ID()))), ", mp=", NETWORK_IS_GAME_IN_PROGRESS())
|
|
APP_SET_INT_DATA("playerName", GET_HASH_KEY(GET_PLAYER_NAME(PLAYER_ID())))
|
|
APP_CLOSE_BLOCK()
|
|
APP_CLOSE_APP()
|
|
ENDIF
|
|
|
|
INT iSlot
|
|
REPEAT COUNT_OF(g_savedGlobals.sSocialData.sCarAppData) iSlot
|
|
IF NOT g_savedGlobals.sSocialData.sCarAppData[iSlot].bDeleteData
|
|
g_savedGlobals.sSocialData.sCarAppData[iSlot].bSendDataToCloud = FALSE
|
|
IF g_savedGlobals.sSocialData.sCarAppData[iSlot].eModel != DUMMY_MODEL_FOR_SCRIPT
|
|
AND g_savedGlobals.sSocialData.sCarAppData[iSlot].iModCountArmour != 0 // we have to set model so check if mod count is set.
|
|
g_savedGlobals.sSocialData.sCarAppData[iSlot].bSendDataToCloud = TRUE
|
|
CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP - resending vehicle in slot ", iSlot)
|
|
ELSE
|
|
g_savedGlobals.sSocialData.bPlayerUnlockedInApp[iSlot] = FALSE
|
|
CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP - resending vehicle in slot ", iSlot, " (defaults)")
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
bRefreshAppDataOnInit = FALSE
|
|
ENDIF
|
|
|
|
IF ENUM_TO_INT(ePed) >= NUM_OF_PLAYABLE_PEDS-1 // On last ped?
|
|
bRefreshAppDataOnInit = FALSE
|
|
bResendAppDataForAccountLinkSP = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
///////////////////////////////////////////////////////
|
|
///
|
|
/// UNLOCK SP CHARACTER
|
|
///
|
|
IF NOT NETWORK_IS_GAME_IN_PROGRESS()
|
|
IF NOT g_savedGlobals.sSocialData.bPlayerUnlockedInApp[ePed]
|
|
IF ((NOT IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_STORY) AND NOT IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_STORY_FRIENDS) AND NOT IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_STORY_PREP)) OR (NOT GET_MISSION_COMPLETE_STATE(SP_MISSION_ARMENIAN_1)))
|
|
IF (ePed = CHAR_FRANKLIN)
|
|
OR (ePed = CHAR_MICHAEL AND GET_MISSION_COMPLETE_STATE(SP_MISSION_ARMENIAN_1) AND IS_PLAYER_PED_AVAILABLE(ePed) AND NOT g_savedGlobals.sFlow.controls.flagIDs[FLOWFLAG_MICHAEL_KILLED])
|
|
OR (ePed = CHAR_TREVOR AND GET_MISSION_COMPLETE_STATE(SP_MISSION_ARMENIAN_1) AND IS_PLAYER_PED_AVAILABLE(ePed) AND NOT g_savedGlobals.sFlow.controls.flagIDs[FLOWFLAG_TREVOR_KILLED])
|
|
|
|
CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP - sending initial vehicle data to cloud: ", sBlockName)
|
|
|
|
APP_SET_APP("car")
|
|
APP_SET_BLOCK(sBlockName)
|
|
|
|
APP_CLEAR_BLOCK()
|
|
|
|
PED_VEH_DATA_STRUCT sVehData
|
|
GET_PLAYER_VEH_DATA(ePed, sVehData, VEHICLE_TYPE_CAR)
|
|
|
|
INT iColID1, iColID2
|
|
GET_CAR_APP_COLOUR_INDEX_FROM_VEHICLE_COLOUR(sVehData.iColour1, sVehData.iColourExtra1, -1, TRUE, iColID1)
|
|
GET_CAR_APP_COLOUR_INDEX_FROM_VEHICLE_COLOUR(sVehData.iColour2, -1, -1, FALSE, iColID2)
|
|
|
|
|
|
APP_SET_INT_DATA("carUnlocked", 1)
|
|
|
|
APP_SET_INT_DATA("carModel", ENUM_TO_INT(sVehData.model))
|
|
|
|
APP_SET_INT_DATA("tyreSmokeColourEnabled", 1)
|
|
|
|
APP_SET_INT_DATA("tyreSmokeColourRed", 255)
|
|
APP_SET_INT_DATA("tyreSmokeColourGreen", 255)
|
|
APP_SET_INT_DATA("tyreSmokeColourBlue", 255)
|
|
|
|
IF sVehData.model = BUFFALO2
|
|
|
|
APP_SET_STRING_DATA("carType", "sport")
|
|
|
|
APP_SET_INT_DATA("carEngineCount", 5)
|
|
APP_SET_INT_DATA("carBrakesCount", 4)
|
|
APP_SET_INT_DATA("carExhaustCount", 6)
|
|
APP_SET_INT_DATA("carWheelCount", 26)
|
|
APP_SET_INT_DATA("carHornCount", 5)
|
|
APP_SET_INT_DATA("carArmourCount", 6)
|
|
APP_SET_INT_DATA("carSuspensionCount", 5)
|
|
|
|
APP_SET_INT_DATA("carHorn1", 1748384362)
|
|
APP_SET_INT_DATA("carHorn2", 1766676233)
|
|
APP_SET_INT_DATA("carHorn3", -1390777827)
|
|
APP_SET_INT_DATA("carHorn4", -1751761149)
|
|
APP_SET_INT_DATA("carHorn5", 1732399718)
|
|
|
|
APP_SET_FLOAT_DATA("carPriceModifier", 3.25)
|
|
|
|
APP_SET_INT_DATA("carColour1", iColID1)
|
|
APP_SET_INT_DATA("carColour2", iColID2)
|
|
APP_SET_INT_DATA("carColour1Unlocked", 1)
|
|
APP_SET_INT_DATA("carColour2Unlocked", 1)
|
|
|
|
ELIF sVehData.model = BODHI2
|
|
|
|
APP_SET_STRING_DATA("carType", "car")
|
|
|
|
APP_SET_INT_DATA("carEngineCount", 5)
|
|
APP_SET_INT_DATA("carBrakesCount", 4)
|
|
APP_SET_INT_DATA("carExhaustCount", 1)
|
|
APP_SET_INT_DATA("carWheelCount", 26)
|
|
APP_SET_INT_DATA("carHornCount", 5)
|
|
APP_SET_INT_DATA("carArmourCount", 6)
|
|
APP_SET_INT_DATA("carSuspensionCount", 1)
|
|
|
|
APP_SET_INT_DATA("carHorn1", -1512308941)
|
|
APP_SET_INT_DATA("carHorn2", 1766676233)
|
|
APP_SET_INT_DATA("carHorn3", -1390777827)
|
|
APP_SET_INT_DATA("carHorn4", -1751761149)
|
|
APP_SET_INT_DATA("carHorn5", 1732399718)
|
|
|
|
APP_SET_FLOAT_DATA("carPriceModifier", 1.0)
|
|
|
|
APP_SET_INT_DATA("carColour1", iColID1)
|
|
APP_SET_INT_DATA("carColour1Unlocked", 1)
|
|
|
|
ELIF sVehData.model = TAILGATER
|
|
|
|
APP_SET_STRING_DATA("carType", "car")
|
|
|
|
APP_SET_INT_DATA("carEngineCount", 5)
|
|
APP_SET_INT_DATA("carBrakesCount", 5)
|
|
APP_SET_INT_DATA("carExhaustCount", 5)
|
|
APP_SET_INT_DATA("carWheelCount", 26)
|
|
APP_SET_INT_DATA("carHornCount", 5)
|
|
APP_SET_INT_DATA("carArmourCount", 6)
|
|
APP_SET_INT_DATA("carSuspensionCount", 5)
|
|
|
|
APP_SET_INT_DATA("carHorn1", 36213993)
|
|
APP_SET_INT_DATA("carHorn2", 1766676233)
|
|
APP_SET_INT_DATA("carHorn3", -1390777827)
|
|
APP_SET_INT_DATA("carHorn4", -1751761149)
|
|
APP_SET_INT_DATA("carHorn5", 1732399718)
|
|
|
|
APP_SET_FLOAT_DATA("carPriceModifier", 1.0)
|
|
|
|
APP_SET_INT_DATA("carColour1", iColID1)
|
|
APP_SET_INT_DATA("carColour2", iColID2)
|
|
APP_SET_INT_DATA("carColour1Unlocked", 1)
|
|
APP_SET_INT_DATA("carColour2Unlocked", 1)
|
|
|
|
ENDIF
|
|
// Done
|
|
APP_CLOSE_BLOCK()
|
|
|
|
sModUnlockBlockName = sBlockName
|
|
sModUnlockVehicleBlockName = sVehicleBlockName
|
|
eModUnlockModel = sVehData.model
|
|
bProcessModUnlocks = TRUE
|
|
bSaveCarData = TRUE SETTIMERA(0)
|
|
APP_CLOSE_APP()
|
|
|
|
g_savedGlobals.sSocialData.bPlayerUnlockedInApp[ePed] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
// Lock when ped is killed!
|
|
IF (ePed = CHAR_MICHAEL AND g_savedGlobals.sFlow.controls.flagIDs[FLOWFLAG_MICHAEL_KILLED])
|
|
OR (ePed = CHAR_TREVOR AND g_savedGlobals.sFlow.controls.flagIDs[FLOWFLAG_TREVOR_KILLED])
|
|
g_savedGlobals.sSocialData.sCarAppData[ePed].bDeleteData = TRUE
|
|
g_savedGlobals.sSocialData.bPlayerUnlockedInApp[ePed] = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
|
|
///////////////////////////////////////////////////////
|
|
///
|
|
/// LOCK MP CHARACTERS
|
|
///
|
|
IF NETWORK_IS_GAME_IN_PROGRESS()
|
|
|
|
BOOL bDataHasBeenSent = FALSE
|
|
|
|
IF (iMPLockCheck = 0)
|
|
bDataHasBeenSent = GET_MP_BOOL_PLAYER_STAT(MPPLY_CARAPP_DATA_SENT_0)
|
|
ELIF (iMPLockCheck = 1)
|
|
bDataHasBeenSent = GET_MP_BOOL_PLAYER_STAT(MPPLY_CARAPP_DATA_SENT_1)
|
|
ELIF (iMPLockCheck = 2)
|
|
bDataHasBeenSent = GET_MP_BOOL_PLAYER_STAT(MPPLY_CARAPP_DATA_SENT_2)
|
|
ELIF (iMPLockCheck = 3)
|
|
bDataHasBeenSent = GET_MP_BOOL_PLAYER_STAT(MPPLY_CARAPP_DATA_SENT_3)
|
|
ELIF (iMPLockCheck = 4)
|
|
bDataHasBeenSent = GET_MP_BOOL_PLAYER_STAT(MPPLY_CARAPP_DATA_SENT_4)
|
|
ENDIF
|
|
|
|
IF bDataHasBeenSent
|
|
AND NOT IS_STAT_CHARACTER_ACTIVE(iMPLockCheck)
|
|
|
|
// Remove the character
|
|
CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP - removing MP character data from cloud, slot = ", iMPLockCheck)
|
|
|
|
APP_SET_APP("car")
|
|
|
|
TEXT_LABEL_15 tlBlock
|
|
tlBlock = "multiplayer"
|
|
tlBlock += iMPLockCheck
|
|
|
|
APP_SET_BLOCK(tlBlock)
|
|
INT iSlot
|
|
REPEAT MAX_MP_VEHICLE_APP_CAN_HANDLE iSlot
|
|
tlBlock = "vehicle"
|
|
tlBlock += iSlot
|
|
APP_SET_BLOCK(tlBlock)
|
|
APP_SET_INT_DATA("carUnlocked", 0)
|
|
APP_CLOSE_BLOCK()
|
|
ENDREPEAT
|
|
APP_CLOSE_BLOCK()
|
|
|
|
bSaveCarData = TRUE SETTIMERA(0)
|
|
APP_CLOSE_APP()
|
|
|
|
IF (iMPLockCheck = 0)
|
|
SET_MP_BOOL_PLAYER_STAT(MPPLY_CARAPP_DATA_SENT_0, FALSE)
|
|
ELIF (iMPLockCheck = 1)
|
|
SET_MP_BOOL_PLAYER_STAT(MPPLY_CARAPP_DATA_SENT_1, FALSE)
|
|
ELIF (iMPLockCheck = 2)
|
|
SET_MP_BOOL_PLAYER_STAT(MPPLY_CARAPP_DATA_SENT_2, FALSE)
|
|
ELIF (iMPLockCheck = 3)
|
|
SET_MP_BOOL_PLAYER_STAT(MPPLY_CARAPP_DATA_SENT_3, FALSE)
|
|
ELIF (iMPLockCheck = 4)
|
|
SET_MP_BOOL_PLAYER_STAT(MPPLY_CARAPP_DATA_SENT_4, FALSE)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
iMPLockCheck++
|
|
IF iMPLockCheck > 4
|
|
iMPLockCheck = 0
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
///////////////////////////////////////////////////////
|
|
///
|
|
/// UPDATE THE UNLOCKS
|
|
///
|
|
IF NOT bProcessModUnlocks
|
|
IF sData.bUpdateMods
|
|
|
|
CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP - updating unlocked mod states")
|
|
|
|
sModUnlockBlockName = sBlockName
|
|
sModUnlockVehicleBlockName = sVehicleBlockName
|
|
eModUnlockModel = sData.eModel
|
|
bProcessModUnlocks = TRUE
|
|
bSaveCarData = TRUE SETTIMERA(0)
|
|
|
|
sData.bUpdateMods = FALSE
|
|
|
|
IF NETWORK_IS_GAME_IN_PROGRESS()
|
|
g_savedMPGlobalsNew.g_savedMPGlobals[GET_SAVE_GAME_ARRAY_SLOT()].MpSavedCarApp.bUpdateMods = FALSE
|
|
ENDIF
|
|
ELSE
|
|
// Periodically check if the mod unlocks have changed.
|
|
IF NETWORK_IS_GAME_IN_PROGRESS()
|
|
AND IS_NET_PLAYER_OK(PLAYER_ID(), TRUE, TRUE)
|
|
|
|
IF TIMERB() > 5000
|
|
BOOL bForceUpdate = FALSE
|
|
IF iModUnlockCheck = 0
|
|
INT iModUnlockBitset
|
|
GET_COLOUR_UNLOCKS_STAGE_1(iModUnlockBitset)
|
|
bForceUpdate = (iModUnlockBitset != iCached_UnlockBitset[0])
|
|
iModUnlockCheck++
|
|
SETTIMERB(0)
|
|
ELIF iModUnlockCheck = 1
|
|
INT iModUnlockBitset
|
|
GET_COLOUR_UNLOCKS_STAGE_2(iModUnlockBitset)
|
|
bForceUpdate = (iModUnlockBitset != iCached_UnlockBitset[1])
|
|
iModUnlockCheck++
|
|
SETTIMERB(0)
|
|
ELIF iModUnlockCheck = 2
|
|
INT iModUnlockBitsets[6]
|
|
IF GET_COLOUR_UNLOCKS_STAGE_3(iModUnlockBitsets, iModColourUnlockCheck) = -1
|
|
iModColourUnlockCheck = 0
|
|
iModUnlockCheck++
|
|
SETTIMERB(0)
|
|
ELSE
|
|
bForceUpdate = ((IS_BIT_SET(iModUnlockBitsets[iModColourUnlockCheck/32], iModColourUnlockCheck%32)) != (IS_BIT_SET(iCached_CarColoursUnlocked[iModColourUnlockCheck/32], iModColourUnlockCheck%32)))
|
|
iModColourUnlockCheck++
|
|
SETTIMERB(4900) // slight delay for next check
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF bForceUpdate
|
|
CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP - updating unlocked mod states (FORCED) ", iModUnlockCheck)
|
|
sModUnlockBlockName = sBlockName
|
|
sModUnlockVehicleBlockName = sVehicleBlockName
|
|
eModUnlockModel = sData.eModel
|
|
bProcessModUnlocks = TRUE
|
|
bSaveCarData = TRUE SETTIMERA(0)
|
|
ENDIF
|
|
|
|
IF iModUnlockCheck > 2
|
|
iModUnlockCheck = 0
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
///////////////////////////////////////////////////////
|
|
///
|
|
/// PROCESS ORDER
|
|
///
|
|
IF sOrder.bProcessOrder
|
|
IF NETWORK_IS_GAME_IN_PROGRESS()
|
|
IF GET_CURRENT_GAMEMODE() = GAMEMODE_FM
|
|
|
|
INT iOrderSlot = g_savedMPGlobalsNew.g_savedMPGlobals[GET_SAVE_GAME_ARRAY_SLOT()].MpSavedCarApp.iOrderVehicle
|
|
|
|
IF g_MpSavedVehicles[iOrderSlot].vehicleSetupMP.VehicleSetup.eModel = sOrder.eModel
|
|
IF sOrder.bCheckPlateProfanity
|
|
|
|
sOrder.bSCProfanityFailed = FALSE
|
|
|
|
IF iSCTextCheckStage = 0
|
|
IF SC_PROFANITY_GET_CHECK_IS_VALID(iSCProfanityToken)
|
|
IF NOT SC_PROFANITY_GET_CHECK_IS_PENDING(iSCProfanityToken)
|
|
IF SC_PROFANITY_GET_STRING_PASSED(iSCProfanityToken)
|
|
iSCProfanityToken = 0
|
|
sOrder.bCheckPlateProfanity = FALSE
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
IF bRunPlateChecks
|
|
sOrder.bCheckPlateProfanity = TRUE
|
|
iSCTextCheckStage++
|
|
ENDIF
|
|
#ENDIF
|
|
ELSE
|
|
sOrder.bSCProfanityFailed = TRUE
|
|
iSCProfanityToken = 0
|
|
sOrder.bCheckPlateProfanity = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
SC_PROFANITY_CHECK_STRING(g_savedMPGlobalsNew.g_savedMPGlobals[GET_SAVE_GAME_ARRAY_SLOT()].MpSavedCarApp.sCarAppOrder.tlPlateText_pending, iSCProfanityToken)
|
|
ENDIF
|
|
ELIF iSCTextCheckStage = 1
|
|
|
|
#IF USE_MULTI_NUMBER_PLATE_SETUP_IN_MP
|
|
IF iSCLicensePlateToken = 0
|
|
SC_LICENSEPLATE_ISVALID(g_savedMPGlobalsNew.g_savedMPGlobals[GET_SAVE_GAME_ARRAY_SLOT()].MpSavedCarApp.sCarAppOrder.tlPlateText_pending, iSCLicensePlateToken)
|
|
ELIF NOT SC_LICENSEPLATE_GET_ISVALID_IS_PENDING(iSCLicensePlateToken)
|
|
CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP - plate valid check finished in state ", SC_LICENSEPLATE_GET_ISVALID_STATUS(iSCLicensePlateToken))
|
|
SWITCH SC_LICENSEPLATE_GET_ISVALID_STATUS(iSCLicensePlateToken)
|
|
CASE LICENSEPLATE_ISVALID_OK
|
|
iSCLicensePlateToken = 0
|
|
sOrder.bCheckPlateProfanity = FALSE
|
|
BREAK
|
|
DEFAULT
|
|
sOrder.bSCProfanityFailed = TRUE
|
|
iSCLicensePlateToken = 0
|
|
sOrder.bCheckPlateProfanity = FALSE
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDIF
|
|
#ENDIF
|
|
|
|
#IF NOT USE_MULTI_NUMBER_PLATE_SETUP_IN_MP
|
|
IF SC_LICENSEPLATE_GET_CHECK_IS_VALID(iSCLicensePlateToken)
|
|
IF NOT SC_LICENSEPLATE_GET_CHECK_IS_PENDING(iSCLicensePlateToken)
|
|
IF SC_LICENSEPLATE_GET_STRING_PASSED(iSCLicensePlateToken)
|
|
iSCLicensePlateToken = 0
|
|
sOrder.bCheckPlateProfanity = FALSE
|
|
ELSE
|
|
sOrder.bSCProfanityFailed = TRUE
|
|
iSCLicensePlateToken = 0
|
|
sOrder.bCheckPlateProfanity = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
SC_LICENSEPLATE_CHECK_STRING(g_savedMPGlobalsNew.g_savedMPGlobals[GET_SAVE_GAME_ARRAY_SLOT()].MpSavedCarApp.sCarAppOrder.tlPlateText_pending, iSCLicensePlateToken)
|
|
ENDIF
|
|
#ENDIF
|
|
ENDIF
|
|
|
|
ELIF NOT IS_PLAYER_CONTROL_ON(PLAYER_ID())
|
|
// wait for control
|
|
ELIF IS_PLAYER_ON_ANY_FM_MISSION(PLAYER_ID())
|
|
// wait for mission to end
|
|
|
|
ELIF NOT HAS_IMPORTANT_STATS_LOADED()
|
|
// wait for player to be in a game
|
|
|
|
ELIF sOrder.bSCProfanityFailed
|
|
CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP - send MP profanity text.")
|
|
IF Request_MP_Comms_Txtmsg(CHAR_LS_CUSTOMS, "SOCIAL_CARAPP2")
|
|
sOrder.bProcessOrder = FALSE
|
|
sOrder.bOrderPending = FALSE
|
|
sOrder.bOrderReceivedOnBoot = FALSE
|
|
sOrder.bOrderForPlayerVehicle = FALSE
|
|
ENDIF
|
|
|
|
ELIF bProcessMPOrderNow
|
|
sOrder.bOrderFailedFunds = FALSE
|
|
|
|
// Fix for bug # 1687509 - Players are able to mod ifruit data so need to determine if order cost is valid or not.
|
|
IF bCheckOrderCost
|
|
IF NOT IS_MP_ORDER_VALID(sOrder, iOrderSlot)
|
|
CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP - MP order is not valid, someone has been messing with the prices so make them visit the mod shop, slot=", iOrderSlot)
|
|
bProcessMPOrderNow = FALSE
|
|
ENDIF
|
|
bCheckOrderCost = FALSE
|
|
|
|
//ELIF (NETWORK_GET_VC_BANK_BALANCE()+NETWORK_GET_VC_WALLET_BALANCE() < sOrder.iCost)
|
|
ELIF (sOrder.iCost > 0 AND NOT NETWORK_CAN_SPEND_MONEY(sOrder.iCost, FALSE, TRUE, FALSE))
|
|
|
|
CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP - order received on startup but player can't afford!")
|
|
CPRINTLN(DEBUG_SOCIAL,"...order cost = ", sOrder.iCost)
|
|
CPRINTLN(DEBUG_SOCIAL,"...player cash = ", NETWORK_GET_VC_WALLET_BALANCE())
|
|
CPRINTLN(DEBUG_SOCIAL,"...player bank = ", NETWORK_GET_VC_BANK_BALANCE())
|
|
|
|
sOrder.bOrderFailedFunds = TRUE
|
|
bProcessMPOrderNow = FALSE
|
|
// this proc will fall through and send text message.
|
|
ELSE
|
|
CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP - order received on startup so apply immediately!")
|
|
|
|
IF NOT bPreProcessOrderDone
|
|
COPY_CARAPP_ORDER_INTO_MP_SAVED_DATA(sOrder, FALSE)
|
|
// Make sure this gets applied!
|
|
SET_BIT(g_MpSavedVehicles[iOrderSlot].iVehicleBS,MP_SAVED_VEHICLE_REAPPLY_MODS)
|
|
bPreProcessOrderDone = TRUE
|
|
MP_SAVE_VEHICLE_SLOT_STATS_FROM_SAVEGAME(iOrderSlot,g_MpSavedVehicles[iOrderSlot],TRUE)
|
|
REQUEST_SAVE(SSR_REASON_CAR_APP_UPDATE, STAT_SAVETYPE_IMMEDIATE_FLUSH)
|
|
ENDIF
|
|
|
|
IF Request_MP_Comms_Txtmsg_With_Components(CHAR_LS_CUSTOMS, "SOCIAL_CARAPP1", GET_DISPLAY_NAME_FROM_VEHICLE_MODEL(sOrder.eModel))
|
|
BOOL fromBank = ((NETWORK_GET_VC_BANK_BALANCE() >= sOrder.iCost))
|
|
BOOL fromBankAndWallet = (NOT fromBank AND NETWORK_GET_VC_BANK_BALANCE() > 0)
|
|
IF sOrder.iCost > 0
|
|
NETWORK_BUY_ITEM(sOrder.iCost, ENUM_TO_INT(sOrder.eModel), PURCHASE_CARMODS, 1, fromBank, "CMOD_MAIN_0", GET_HASH_KEY(GET_SHOP_NAME(CARMOD_SHOP_01_AP)), GET_HASH_KEY("CMOD_MAIN_0"), 0, fromBankAndWallet)
|
|
ENDIF
|
|
sOrder.bProcessOrder = FALSE
|
|
sOrder.bOrderPending = TRUE
|
|
sOrder.bOrderReceivedOnBoot = TRUE
|
|
bProcessMPOrderNow = FALSE
|
|
COPY_CARAPP_ORDER_INTO_MP_SAVED_DATA(sOrder, TRUE)
|
|
SET_CAR_APP_ORDER_HAS_BEEN_PROCESSED(sOrder, CHAR_MULTIPLAYER)
|
|
|
|
// Make sure this gets applied!
|
|
SET_BIT(g_MpSavedVehicles[iOrderSlot].iVehicleBS,MP_SAVED_VEHICLE_REAPPLY_MODS)
|
|
MP_SAVE_VEHICLE_SLOT_STATS_FROM_SAVEGAME(iOrderSlot,g_MpSavedVehicles[iOrderSlot],TRUE)
|
|
REQUEST_SAVE(SSR_REASON_CAR_APP_UPDATE, STAT_SAVETYPE_IMMEDIATE_FLUSH)
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF sOrder.bOrderFailedFunds
|
|
IF Request_MP_Comms_Txtmsg_With_Components(CHAR_LS_CUSTOMS, "SOCIAL_CARAPP3", GET_DISPLAY_NAME_FROM_VEHICLE_MODEL(sOrder.eModel))
|
|
sOrder.bProcessOrder = FALSE
|
|
sOrder.bOrderPending = TRUE
|
|
sOrder.bOrderReceivedOnBoot = FALSE
|
|
sOrder.bOrderForPlayerVehicle = FALSE
|
|
ENDIF
|
|
ELSE
|
|
IF Request_MP_Comms_Txtmsg_With_Components(CHAR_LS_CUSTOMS, "SOCIAL_CARAPP", GET_DISPLAY_NAME_FROM_VEHICLE_MODEL(sOrder.eModel))
|
|
sOrder.bProcessOrder = FALSE
|
|
sOrder.bOrderPending = TRUE
|
|
sOrder.bOrderReceivedOnBoot = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
bBlockFrameUpdate = TRUE
|
|
ELSE
|
|
// Order doesn't match the vehicle in the slot so just ignore...
|
|
CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP - data doesn't match player vehicle data so cancel, slot=", iOrderSlot)
|
|
sOrder.bProcessOrder = FALSE
|
|
sOrder.bOrderPending = FALSE
|
|
sOrder.bOrderReceivedOnBoot = FALSE
|
|
sOrder.bOrderForPlayerVehicle = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF ePed = GET_CURRENT_PLAYER_PED_ENUM()
|
|
IF g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_CAR][ePed].model = sOrder.eModel
|
|
OR g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_BIKE][ePed].model = sOrder.eModel
|
|
OR g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_GARAGE][ePed].model = sOrder.eModel
|
|
OR g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_MODDED][ePed].model = sOrder.eModel
|
|
|
|
// Allow the default orders too...
|
|
OR (ePed = CHAR_FRANKLIN AND sOrder.eModel = BUFFALO2 AND NOT g_savedGlobals.sSocialData.bFirstOrderProcessed[ePed])
|
|
OR (ePed = CHAR_MICHAEL AND sOrder.eModel = TAILGATER AND NOT g_savedGlobals.sSocialData.bFirstOrderProcessed[ePed])
|
|
OR (ePed = CHAR_TREVOR AND sOrder.eModel = BODHI2 AND NOT g_savedGlobals.sSocialData.bFirstOrderProcessed[ePed])
|
|
IF sOrder.bCheckPlateProfanity
|
|
|
|
sOrder.bSCProfanityFailed = FALSE
|
|
|
|
IF iSCTextCheckStage = 0
|
|
IF SC_PROFANITY_GET_CHECK_IS_VALID(iSCProfanityToken)
|
|
IF NOT SC_PROFANITY_GET_CHECK_IS_PENDING(iSCProfanityToken)
|
|
IF SC_PROFANITY_GET_STRING_PASSED(iSCProfanityToken)
|
|
iSCProfanityToken = 0
|
|
sOrder.bCheckPlateProfanity = FALSE
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
IF bRunPlateChecks
|
|
sOrder.bCheckPlateProfanity = TRUE
|
|
iSCTextCheckStage++
|
|
ENDIF
|
|
#ENDIF
|
|
ELSE
|
|
sOrder.bSCProfanityFailed = TRUE
|
|
iSCProfanityToken = 0
|
|
sOrder.bCheckPlateProfanity = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
SC_PROFANITY_CHECK_STRING(g_savedGlobals.sSocialData.sCarAppOrder[ePed].tlPlateText_pending, iSCProfanityToken)
|
|
ENDIF
|
|
ELIF iSCTextCheckStage = 1
|
|
|
|
#IF USE_MULTI_NUMBER_PLATE_SETUP_IN_MP
|
|
IF iSCLicensePlateToken = 0
|
|
SC_LICENSEPLATE_ISVALID(g_savedGlobals.sSocialData.sCarAppOrder[ePed].tlPlateText_pending, iSCLicensePlateToken)
|
|
ELIF NOT SC_LICENSEPLATE_GET_ISVALID_IS_PENDING(iSCLicensePlateToken)
|
|
CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP - plate valid check finished in state ", SC_LICENSEPLATE_GET_ISVALID_STATUS(iSCLicensePlateToken))
|
|
SWITCH SC_LICENSEPLATE_GET_ISVALID_STATUS(iSCLicensePlateToken)
|
|
CASE LICENSEPLATE_ISVALID_OK
|
|
iSCLicensePlateToken = 0
|
|
sOrder.bCheckPlateProfanity = FALSE
|
|
BREAK
|
|
DEFAULT
|
|
sOrder.bSCProfanityFailed = TRUE
|
|
iSCLicensePlateToken = 0
|
|
sOrder.bCheckPlateProfanity = FALSE
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDIF
|
|
#ENDIF
|
|
|
|
#IF NOT USE_MULTI_NUMBER_PLATE_SETUP_IN_MP
|
|
IF SC_LICENSEPLATE_GET_CHECK_IS_VALID(iSCLicensePlateToken)
|
|
IF NOT SC_LICENSEPLATE_GET_CHECK_IS_PENDING(iSCLicensePlateToken)
|
|
IF SC_LICENSEPLATE_GET_STRING_PASSED(iSCLicensePlateToken)
|
|
iSCLicensePlateToken = 0
|
|
sOrder.bCheckPlateProfanity = FALSE
|
|
ELSE
|
|
sOrder.bSCProfanityFailed = TRUE
|
|
iSCLicensePlateToken = 0
|
|
sOrder.bCheckPlateProfanity = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
SC_LICENSEPLATE_CHECK_STRING(g_savedGlobals.sSocialData.sCarAppOrder[ePed].tlPlateText_pending, iSCLicensePlateToken)
|
|
ENDIF
|
|
#ENDIF
|
|
ENDIF
|
|
|
|
ELIF sOrder.bSCProfanityFailed
|
|
// Do not send text on mission
|
|
IF NOT IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_STORY)
|
|
AND NOT IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_STORY_FRIENDS)
|
|
AND NOT IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_STORY_PREP)
|
|
IF SEND_TEXT_MESSAGE_TO_CURRENT_PLAYER(CHAR_LS_CUSTOMS, "SOCIAL_CARAPP2", TXTMSG_LOCKED)
|
|
sOrder.bProcessOrder = FALSE
|
|
sOrder.bOrderPending = FALSE
|
|
sOrder.bOrderReceivedOnBoot = FALSE
|
|
sOrder.bOrderForPlayerVehicle = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ELIF bProcessOrderNow[ePed]
|
|
bProcessOrderNow[ePed] = FALSE
|
|
sOrder.bOrderFailedFunds = FALSE
|
|
sOrder.bOrderForPlayerVehicle = FALSE
|
|
|
|
IF NOT CAN_PLAYER_AFFORD_ITEM_COST(sOrder.iCost)
|
|
AND (ePed != CHAR_FRANKLIN OR g_savedGlobals.sSocialData.bFirstOrderProcessed[ePed])
|
|
CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP - order received on startup but player can't afford!")
|
|
sOrder.bOrderFailedFunds = TRUE
|
|
// this proc will fall through and send text message.
|
|
ELSE
|
|
CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP - order received on startup so apply immediately!")
|
|
sOrder.bProcessOrder = FALSE
|
|
sOrder.bOrderPending = TRUE
|
|
sOrder.bOrderReceivedOnBoot = TRUE
|
|
sOrder.bOrderForPlayerVehicle = bProcessOrderOnPlayerVehicle[ePed]
|
|
// player controller will drop this on the players vehicle when it spawns in...
|
|
ENDIF
|
|
|
|
bProcessOrderOnPlayerVehicle[ePed] = FALSE
|
|
ELSE
|
|
IF sOrder.bOrderFailedFunds
|
|
// Do not send text on mission
|
|
IF NOT IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_STORY)
|
|
AND NOT IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_STORY_FRIENDS)
|
|
AND NOT IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_STORY_PREP)
|
|
IF SEND_TEXT_MESSAGE_TO_CURRENT_PLAYER_WITH_SPECIAL_COMPONENTS(CHAR_LS_CUSTOMS, "SOCIAL_CARAPP3", TXTMSG_LOCKED, GET_FILENAME_FOR_AUDIO_CONVERSATION(GET_DISPLAY_NAME_FROM_VEHICLE_MODEL(g_savedGlobals.sSocialData.sCarAppOrder[ePed].eModel)), -99, "NULL", STRING_COMPONENT)
|
|
sOrder.bProcessOrder = FALSE
|
|
sOrder.bOrderPending = TRUE
|
|
sOrder.bOrderReceivedOnBoot = FALSE
|
|
sOrder.bOrderForPlayerVehicle = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
// Do not send text on mission
|
|
IF NOT IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_STORY)
|
|
AND NOT IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_STORY_FRIENDS)
|
|
AND NOT IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_STORY_PREP)
|
|
|
|
TEXT_LABEL_15 tlLabel = "SOCIAL_CARAPP"
|
|
IF (ePed = CHAR_FRANKLIN AND NOT g_savedGlobals.sSocialData.bFirstOrderProcessed[ePed])
|
|
tlLabel = "SOCIAL_FREE"
|
|
ENDIF
|
|
|
|
IF SEND_TEXT_MESSAGE_TO_CURRENT_PLAYER_WITH_SPECIAL_COMPONENTS(CHAR_LS_CUSTOMS, tlLabel, TXTMSG_LOCKED, GET_FILENAME_FOR_AUDIO_CONVERSATION(GET_DISPLAY_NAME_FROM_VEHICLE_MODEL(g_savedGlobals.sSocialData.sCarAppOrder[ePed].eModel)), -99, "NULL", STRING_COMPONENT)
|
|
sOrder.bProcessOrder = FALSE
|
|
sOrder.bOrderPending = TRUE
|
|
sOrder.bOrderReceivedOnBoot = FALSE
|
|
sOrder.bOrderForPlayerVehicle = FALSE
|
|
|
|
// Save the game as orders get wiped from cloud.
|
|
MAKE_AUTOSAVE_REQUEST()
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
bBlockFrameUpdate = TRUE
|
|
ELSE
|
|
// Order doesn't match any of the stored vehicles so just ignore...
|
|
CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP - data doesn't match player vehicle data so cancel, slot=", ePed)
|
|
sOrder.bProcessOrder = FALSE
|
|
sOrder.bOrderPending = FALSE
|
|
sOrder.bOrderReceivedOnBoot = FALSE
|
|
sOrder.bOrderForPlayerVehicle = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
///////////////////////////////////////////////////////
|
|
///
|
|
/// GET DATA
|
|
///
|
|
BOOL bSafeToProcessOrder = TRUE
|
|
// Only accept orders when the mod shop is available.
|
|
IF NETWORK_IS_GAME_IN_PROGRESS()
|
|
IF ePed != CHAR_MULTIPLAYER
|
|
OR NOT IS_SHOP_AVAILABLE(CARMOD_SHOP_01_AP)
|
|
OR IS_PLAYER_BROWSING_ITEMS_IN_ANY_SHOP()
|
|
OR IS_PLAYER_IN_PROPERTY(PLAYER_ID(), TRUE)
|
|
bSafeToProcessOrder = FALSE
|
|
ENDIF
|
|
ELSE
|
|
// IF IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_STORY) // Allow orders to process on mission, just send text later.
|
|
IF (NOT IS_PLAYER_PED_PLAYABLE(ePed))
|
|
OR IS_PLAYER_BROWSING_ITEMS_IN_ANY_SHOP()
|
|
bSafeToProcessOrder = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF bSafeToProcessOrder
|
|
AND NOT sOrder.bProcessOrder
|
|
|
|
// INT i, j, k
|
|
// VEHICLE_INDEX nearbyVehs[5]
|
|
// TEXT_LABEL_31 tlGarageName
|
|
|
|
REPEAT 2 iPass
|
|
IF (iPass = 0)
|
|
|
|
APP_SET_APP("car")
|
|
APP_SET_BLOCK(sOrderBlockName)
|
|
|
|
// Fetch the data we require
|
|
IF APP_DATA_VALID()
|
|
|
|
INT iUID = APP_GET_INT_DATA("uid")
|
|
IF (iUID != 0)
|
|
AND (iUID <> sOrder.iUID)
|
|
AND (APP_GET_INT_DATA("character") = iSlotID) // Make sure the order is for this character
|
|
AND (NOT NETWORK_IS_GAME_IN_PROGRESS() OR APP_GET_INT_DATA("vehicle") = iMPVehicleBlock) // Make sure the order is for this vehicle
|
|
|
|
// We are now safe to access the fetched members
|
|
IF NETWORK_IS_GAME_IN_PROGRESS()
|
|
CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP - process UID: ", iUID, " for character ", iSlotID, " and vehicle ", iMPSavedVehicleSlot)
|
|
ELSE
|
|
CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP - process UID: ", iUID, " for character ", iSlotID)
|
|
ENDIF
|
|
|
|
sOrder.iUID = iUID
|
|
sOrder.eModel = INT_TO_ENUM(MODEL_NAMES, APP_GET_INT_DATA("carModel"))
|
|
|
|
IF NOT IS_MODEL_A_VEHICLE(sOrder.eModel)
|
|
CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP - model not valid, grabbing default")
|
|
// The user must have used the app before the game so we should use the default player vehicle models.
|
|
IF ePed = CHAR_MICHAEL
|
|
sOrder.eModel = GET_PLAYER_VEH_MODEL(CHAR_MICHAEL, VEHICLE_TYPE_CAR)
|
|
ELIF ePed = CHAR_FRANKLIN
|
|
sOrder.eModel = GET_PLAYER_VEH_MODEL(CHAR_FRANKLIN, VEHICLE_TYPE_CAR)
|
|
ELIF ePed = CHAR_TREVOR
|
|
sOrder.eModel = GET_PLAYER_VEH_MODEL(CHAR_TREVOR, VEHICLE_TYPE_CAR)
|
|
ELSE
|
|
sOrder.eModel = BUFFALO2 // Default
|
|
ENDIF
|
|
ENDIF
|
|
#IF IS_DEBUG_BUILD
|
|
IF IS_MODEL_IN_CDIMAGE(sOrder.eModel)
|
|
CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP - carName = ", GET_DISPLAY_NAME_FROM_VEHICLE_MODEL(sData.eModel), ", model = ", sData.eModel)
|
|
ELSE
|
|
CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP - model = ", sData.eModel)
|
|
ENDIF
|
|
#ENDIF
|
|
sOrder.iCost = APP_GET_INT_DATA("cost")
|
|
sOrder.iColourID1 = APP_GET_INT_DATA("carColour1")
|
|
sOrder.iColourID2 = APP_GET_INT_DATA("carColour2")
|
|
sOrder.iColour1Group = APP_GET_INT_DATA("carColour1Group")
|
|
sOrder.iColour2Group = APP_GET_INT_DATA("carColour2Group")
|
|
sOrder.iWindowTint = APP_GET_INT_DATA("windowTint")
|
|
sOrder.bBulletProofTyres = INT_TO_BOOL(APP_GET_INT_DATA("bulletProofTyres"))
|
|
sOrder.iEngine = APP_GET_INT_DATA("carEngine")
|
|
sOrder.iBrakes = APP_GET_INT_DATA("carBrakes")
|
|
sOrder.iExhaust = APP_GET_INT_DATA("carExhaust")
|
|
sOrder.iWheels = APP_GET_INT_DATA("carWheel")
|
|
sOrder.iTyreSmokeR = APP_GET_INT_DATA("tyreSmokeColourRed")
|
|
sOrder.iTyreSmokeG = APP_GET_INT_DATA("tyreSmokeColourGreen")
|
|
sOrder.iTyreSmokeB = APP_GET_INT_DATA("tyreSmokeColourBlue")
|
|
sOrder.iHorn = APP_GET_INT_DATA("carHorn")
|
|
sOrder.iArmour = APP_GET_INT_DATA("carArmour")
|
|
sOrder.iTurbo = APP_GET_INT_DATA("carTurbo")
|
|
sOrder.iSuspension = APP_GET_INT_DATA("carSuspension")
|
|
sOrder.iLights = APP_GET_INT_DATA("carXenonLights")
|
|
sOrder.iTyreSmoke = APP_GET_INT_DATA("tyreSmoke")
|
|
|
|
sOrder.iWheelType = sData.iWheelType
|
|
|
|
CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP - iWheelType = ", sData.iWheelType)
|
|
|
|
bGetPlate = TRUE
|
|
|
|
// Process order immediately checks
|
|
IF NOT NETWORK_IS_GAME_IN_PROGRESS()
|
|
|
|
// Received order on startup
|
|
IF (NOT bInitialOrderCheckComplete[ePed] AND (GET_GAME_TIMER() - iInitialOrderCheckTimer) < 20000)
|
|
CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP - order received within first 20 seconds - process now!")
|
|
bProcessOrderNow[ePed] = TRUE
|
|
|
|
// Received during armenian1
|
|
ELIF NOT GET_MISSION_COMPLETE_STATE(SP_MISSION_ARMENIAN_1)
|
|
AND GET_NUMBER_OF_SCRIPT_CREATED_PLAYER_VEHICLES(CHAR_FRANKLIN) = 0
|
|
AND (g_savedGlobals.sFlow.isGameflowActive OR IS_REPEAT_PLAY_ACTIVE())
|
|
AND (IS_BIT_SET(g_savedGlobals.sFlow.strandSavedVars[STRAND_PROLOGUE].savedBitflags, SAVED_BITS_STRAND_ACTIVATED) OR IS_REPEAT_PLAY_ACTIVE())
|
|
CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP - order received before armenian 1 - process now!")
|
|
bProcessOrderNow[ePed] = TRUE
|
|
bProcessOrderOnPlayerVehicle[ePed] = TRUE
|
|
|
|
// For player vehicle that hasn't been created
|
|
ELIF (ePed = CHAR_MICHAEL AND sOrder.eModel = TAILGATER)
|
|
OR (ePed = CHAR_FRANKLIN AND sOrder.eModel = BUFFALO2)
|
|
OR (ePed = CHAR_FRANKLIN AND sOrder.eModel = BAGGER)
|
|
OR (ePed = CHAR_TREVOR AND sOrder.eModel = BODHI2)
|
|
IF GET_NUMBER_OF_SCRIPT_CREATED_PLAYER_VEHICLES(ePed, sOrder.eModel) = 0
|
|
CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP - order received and player vehicle doesnt exist - process now!")
|
|
bProcessOrderNow[ePed] = TRUE
|
|
bProcessOrderOnPlayerVehicle[ePed] = TRUE
|
|
ENDIF
|
|
|
|
// For garage vehicle and the vehicle doesnt exist
|
|
/*ELIF g_savedGlobals.sPlayerData.sInfo.eLastVehicleSentToCloudSavehouse[ePed] != NUMBER_OF_SAVEHOUSE_LOCATIONS
|
|
|
|
BOOL bVehicleInGarage = FALSE
|
|
WHILE GET_PLAYER_GARAGE_DATA(ePed, i, tlGarageName, eSavehouse)
|
|
IF eSavehouse = g_savedGlobals.sPlayerData.sInfo.eLastVehicleSentToCloudSavehouse[ePed]
|
|
j = GET_PED_NEARBY_VEHICLES(PLAYER_PED_ID(), nearbyVehs)
|
|
REPEAT j k
|
|
IF DOES_ENTITY_EXIST(nearbyVehs[k])
|
|
AND IS_VEHICLE_DRIVEABLE(nearbyVehs[k])
|
|
AND IS_VEHICLE_IN_GARAGE_AREA(tlGarageName, nearbyVehs[k])
|
|
AND sOrder.eModel = GET_ENTITY_MODEL(nearbyVehs[k])
|
|
bVehicleInGarage = TRUE
|
|
k=100 //Bail
|
|
ENDIF
|
|
ENDREPEAT
|
|
i=100 //Bail
|
|
ENDIF
|
|
i++
|
|
ENDWHILE
|
|
|
|
IF NOT bVehicleInGarage
|
|
CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP - order received and vehicle doesnt exist in garage - process now!")
|
|
bProcessOrderNow[ePed] = TRUE
|
|
ENDIF*/
|
|
ENDIF
|
|
|
|
IF NOT bProcessOrderNow[ePed]
|
|
CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP - order received, order time = ", (iInitialOrderCheckTimer - GET_GAME_TIMER()))
|
|
ENDIF
|
|
|
|
ELSE
|
|
// Plates now cost $100k in GTA Online so we should force the player to go to the mod shop to confirm their purchase.
|
|
#IF NOT USE_MULTI_NUMBER_PLATE_SETUP_IN_MP
|
|
IF iMPSavedVehicleSlot >= 0
|
|
AND (g_savedMPGlobalsNew.g_savedMPGlobals[GET_SAVE_GAME_ARRAY_SLOT()].MpSavedGeneral.iLastSavedCarUsed != iMPSavedVehicleSlot OR NOT IS_SAVED_VEHICLE_FLAG_SET( MP_SAVED_VEH_FLAG_CREATED) OR (IS_PLAYER_SWITCH_IN_PROGRESS() AND GET_PLAYER_SWITCH_STATE() <= SWITCH_STATE_JUMPCUT_DESCENT))
|
|
AND NOT (IS_BIT_SET(g_MpSavedVehicles[iMPSavedVehicleSlot].iVehicleBS,MP_SAVED_VEHICLE_OUT_GARAGE) OR (IS_PLAYER_SWITCH_IN_PROGRESS() AND GET_PLAYER_SWITCH_STATE() <= SWITCH_STATE_JUMPCUT_DESCENT))
|
|
AND NOT MPGlobals.VehicleData.bAssignToMainScript
|
|
AND NOT IS_PLAYER_IN_MP_GARAGE(PLAYER_ID(), TRUE)
|
|
AND NOT IS_PLAYER_IN_MP_PROPERTY(PLAYER_ID(), TRUE)
|
|
CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP - order received and mp player vehicle is not created - process now!")
|
|
CPRINTLN(DEBUG_SOCIAL,"...iMPSavedVehicleSlot = ", iMPSavedVehicleSlot)
|
|
CPRINTLN(DEBUG_SOCIAL,"...g_savedMPGlobalsNew.g_savedMPGlobals[GET_SAVE_GAME_ARRAY_SLOT()].MpSavedGeneral.iLastSavedCarUsed = ", g_savedMPGlobalsNew.g_savedMPGlobals[GET_SAVE_GAME_ARRAY_SLOT()].MpSavedGeneral.iLastSavedCarUsed)
|
|
CPRINTLN(DEBUG_SOCIAL,"...IS_SAVED_VEHICLE_FLAG_SET( MP_SAVED_VEH_FLAG_CREATED = ", IS_SAVED_VEHICLE_FLAG_SET( MP_SAVED_VEH_FLAG_CREATED))
|
|
bProcessMPOrderNow = TRUE
|
|
bCheckOrderCost = TRUE
|
|
bPreProcessOrderDone = FALSE
|
|
ELSE
|
|
CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP - unable to process mp order automatically")
|
|
CPRINTLN(DEBUG_SOCIAL,"...iMPSavedVehicleSlot = ", iMPSavedVehicleSlot)
|
|
CPRINTLN(DEBUG_SOCIAL,"...g_savedMPGlobalsNew.g_savedMPGlobals[GET_SAVE_GAME_ARRAY_SLOT()].MpSavedGeneral.iLastSavedCarUsed = ", g_savedMPGlobalsNew.g_savedMPGlobals[GET_SAVE_GAME_ARRAY_SLOT()].MpSavedGeneral.iLastSavedCarUsed)
|
|
CPRINTLN(DEBUG_SOCIAL,"...IS_SAVED_VEHICLE_FLAG_SET( MP_SAVED_VEH_FLAG_CREATED) = ", IS_SAVED_VEHICLE_FLAG_SET( MP_SAVED_VEH_FLAG_CREATED))
|
|
CPRINTLN(DEBUG_SOCIAL,"...MPGlobals.VehicleData.bAssignToMainScript = ", MPGlobals.VehicleData.bAssignToMainScript)
|
|
CPRINTLN(DEBUG_SOCIAL,"...IS_PLAYER_IN_MP_GARAGE(PLAYER_ID(), TRUE) = ", IS_PLAYER_IN_MP_GARAGE(PLAYER_ID(), TRUE))
|
|
CPRINTLN(DEBUG_SOCIAL,"...IS_PLAYER_IN_MP_PROPERTY(PLAYER_ID(), TRUE) = ", IS_PLAYER_IN_MP_PROPERTY(PLAYER_ID(), TRUE))
|
|
bProcessMPOrderNow = FALSE
|
|
ENDIF
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
IF bAlwaysAllowAutoProcess
|
|
bProcessMPOrderNow = TRUE
|
|
bCheckOrderCost = TRUE
|
|
bPreProcessOrderDone = FALSE
|
|
ENDIF
|
|
#ENDIF
|
|
#ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// App data valid so clear initial order check
|
|
IF NOT NETWORK_IS_GAME_IN_PROGRESS()
|
|
bInitialOrderCheckComplete[ePed] = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
APP_CLOSE_BLOCK() // order
|
|
APP_CLOSE_APP() // car
|
|
|
|
ELIF (iPass = 1 AND bGetPlate)
|
|
|
|
APP_SET_APP("car")
|
|
APP_SET_BLOCK("plate")
|
|
|
|
IF APP_DATA_VALID()
|
|
sOrder.iPlateBack_pending = APP_GET_INT_DATA("carPlateBack") CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP_PLATE - cloud plate back: ", sOrder.iPlateBack_pending)
|
|
|
|
// Validate plate background
|
|
IF sOrder.iPlateBack_pending > 4
|
|
sOrder.iPlateBack_pending = 0
|
|
sOrder.iPlateBack_pending = APP_GET_INT_DATA("carPlateBack") CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP_PLATE - cloud plate back overriden: ", sOrder.iPlateBack_pending)
|
|
ENDIF
|
|
|
|
sOrder.tlPlateText_pending = APP_GET_STRING_DATA("carPlateText") CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP_PLATE - cloud plate text: ", sOrder.tlPlateText_pending)
|
|
ENDIF
|
|
APP_CLOSE_BLOCK()
|
|
APP_CLOSE_APP()
|
|
|
|
// Ready to send text and process in LSC
|
|
sOrder.bProcessOrder = TRUE
|
|
sOrder.bCheckPlateProfanity = TRUE
|
|
sOrder.bOrderFailedFunds = FALSE
|
|
sOrder.bOrderReceivedOnBoot = FALSE
|
|
sOrder.bOrderPaidFor = FALSE
|
|
|
|
IF NOT NETWORK_IS_GAME_IN_PROGRESS()
|
|
STAT_SET_BOOL(CAR_MOD_APP_USED, TRUE)
|
|
BAWSAQ_INCREMENT_MODIFIER(BSMF_SM_CARAPP) //#1514495 - stockmarket
|
|
g_savedGlobals.sSocialData.bCarAppUsed = TRUE
|
|
ELSE
|
|
g_savedMPGlobalsNew.g_savedMPGlobals[GET_SAVE_GAME_ARRAY_SLOT()].MpSavedCarApp.iOrderVehicle = iMPSavedVehicleSlot
|
|
SET_MP_BOOL_CHARACTER_STAT(MP_STAT_CL_MOD_CAR_USING_APP, TRUE)
|
|
ENDIF
|
|
|
|
#IF USE_MULTI_NUMBER_PLATE_SETUP_IN_MP
|
|
bRebuildPlatesList = TRUE
|
|
#ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
ENDIF
|
|
|
|
///////////////////////////////////////////////////////
|
|
///
|
|
/// SET DATA
|
|
///
|
|
IF NOT sData.bDeleteData
|
|
AND bSafeToProcessOrder
|
|
AND sData.bSendDataToCloud
|
|
|
|
// Fetch static data for MP
|
|
IF NETWORK_IS_GAME_IN_PROGRESS()
|
|
IF NOT FILL_STATIC_CAR_APP_DATA(sData)
|
|
// Need to wait until we have the data.
|
|
#IF IS_DEBUG_BUILD
|
|
IF GET_FRAME_COUNT() % 60 = 0
|
|
CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP - fetching static")
|
|
ENDIF
|
|
#ENDIF
|
|
bBlockFrameUpdate = TRUE
|
|
EXIT
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NETWORK_IS_GAME_IN_PROGRESS()
|
|
CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP - sending vehicle data to cloud: ", sBlockName, " for vehicle ", iMPSavedVehicleSlot, " in vehicle block ", iMPVehicleBlock)
|
|
ELSE
|
|
CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP - sending vehicle data to cloud: ", sBlockName)
|
|
ENDIF
|
|
|
|
APP_SET_APP("car")
|
|
APP_SET_BLOCK("appdata")
|
|
INT iGameUID = GENERATE_RANDOM_UNIQUE_ID()
|
|
IF iGameUID = 0
|
|
iGameUID = GENERATE_RANDOM_UNIQUE_ID()
|
|
ENDIF
|
|
APP_SET_INT_DATA("appUID", iGameUID)
|
|
g_savedGlobals.sSocialData.iGameUID = iGameUID
|
|
|
|
// DISCOUNTS
|
|
INT iSPDiscount = 0
|
|
INT iMPDiscount = 0
|
|
|
|
// - 5% for 95% positive reports
|
|
IF HAS_IMPORTANT_STATS_LOADED()
|
|
IF SHOULD_GIVE_SHOP_DISCOUNT()
|
|
iMPDiscount += g_sMPTunables.iShopDiscountPercentValue
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// // 20% discount for SE
|
|
// IF IS_SPECIAL_EDITION_GAME()
|
|
// OR IS_COLLECTORS_EDITION_GAME()
|
|
// iSPDiscount += 20
|
|
// ENDIF
|
|
|
|
APP_SET_FLOAT_DATA("spDiscount", (1.0 - (TO_FLOAT(iSPDiscount) / 100)))
|
|
APP_SET_FLOAT_DATA("mpDiscount", (1.0 - (TO_FLOAT(iMPDiscount) / 100)))
|
|
|
|
IF NETWORK_IS_SIGNED_ONLINE()
|
|
CPRINTLN(DEBUG_SOCIAL,"playerName = ", GET_PLAYER_NAME(PLAYER_ID()), " with hash ", GET_HASH_KEY((GET_PLAYER_NAME(PLAYER_ID()))), ", mp=", NETWORK_IS_GAME_IN_PROGRESS())
|
|
APP_SET_INT_DATA("playerName", GET_HASH_KEY(GET_PLAYER_NAME(PLAYER_ID())))
|
|
|
|
IF NETWORK_IS_GAME_IN_PROGRESS()
|
|
APP_SET_INT_DATA("playerNameMP", GET_HASH_KEY(GET_PLAYER_NAME(PLAYER_ID())))
|
|
ELSE
|
|
APP_SET_INT_DATA("playerNameSP", GET_HASH_KEY(GET_PLAYER_NAME(PLAYER_ID())))
|
|
ENDIF
|
|
ENDIF
|
|
|
|
APP_CLOSE_BLOCK()
|
|
|
|
APP_SET_BLOCK(sBlockName)
|
|
|
|
IF NETWORK_IS_GAME_IN_PROGRESS()
|
|
APP_SET_BLOCK(sVehicleBlockName)
|
|
ENDIF
|
|
|
|
IF NOT IS_VEHICLE_MODEL_SAFE_FOR_CARAPP(sData.eModel)
|
|
APP_SET_INT_DATA("carUnlocked", 0)
|
|
CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP - invalid vehicle model (", GET_MODEL_NAME_FOR_DEBUG(sData.eModel), ") - locking!")
|
|
ELSE
|
|
APP_SET_INT_DATA("carUnlocked", 1)
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
/// Special cases that we dont want to send to the app
|
|
IF (sData.eModel = SANCHEZ)
|
|
OR (sData.eModel = FAGGIO2)
|
|
OR (sData.eModel = DUNE)
|
|
OR (sData.eModel = BFINJECTION)
|
|
OR NOT IS_THIS_WHEEL_TYPE_ALLOWED_FOR_CARAPP_ORDER(INT_TO_ENUM(MOD_WHEEL_TYPE, sData.iWheelType))
|
|
sData.iModCountWheels = 0
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_A_SUPERMOD_MODEL(sData.eModel, SUPERMOD_FLAG_HAS_HYDRAULICS)
|
|
sData.iModCountSuspension = 0
|
|
ENDIF
|
|
|
|
IF (sData.eModel = LECTRO)
|
|
OR (sData.eModel = VINDICATOR)
|
|
sData.iModCountHorn = 0
|
|
ENDIF
|
|
|
|
IF !NETWORK_IS_GAME_IN_PROGRESS()
|
|
IF sData.eModel = PATRIOT
|
|
sData.iModCountExhaust = 0
|
|
CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_AP iExhaust setting to = 0")
|
|
ENDIF
|
|
IF sData.eModel = PRAIRIE
|
|
IF sData.iModCountExhaust > 1
|
|
CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_AP iExhaust setting to = 1 it was: ", sData.iModCountExhaust)
|
|
sData.iModCountExhaust = 1
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF sData.iLights > 1
|
|
CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_AP iLights setting to = 0 it was: ", sData.iLights)
|
|
sData.iLights = 0
|
|
ENDIF
|
|
|
|
// limitation on the iFruit side doesn't handle Tire Designs
|
|
INT iWheelIndexForVariation = GET_VEHICLE_MOD_WHEEL_INDEX_FOR_VARIATION(sData)
|
|
PRINTLN("social_controller: DO_PROCESS_CAR_AP sData.iWheels ", sData.iWheels, " wheel index for variation: ", iWheelIndexForVariation)
|
|
sData.iWheels = iWheelIndexForVariation
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
/// Player info, vehicle name, number plate background
|
|
IF NETWORK_IS_GAME_IN_PROGRESS()
|
|
APP_SET_INT_DATA("playerSlot", iMPCharSlot)
|
|
APP_SET_INT_DATA("playerRank", GET_PLAYER_FM_RANK(PLAYER_ID()))
|
|
|
|
SWITCH GET_ENTITY_MODEL(PLAYER_PED_ID())
|
|
CASE MP_M_FREEMODE_01
|
|
CASE MP_F_FREEMODE_01
|
|
APP_SET_STRING_DATA("playerGang", "None") CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP - playerGang = None")
|
|
GET_HUD_COLOUR(HUD_COLOUR_FREEMODE, iR, iG, iB, iA)
|
|
BREAK
|
|
ENDSWITCH
|
|
APP_SET_INT_DATA("playerGangR", iR)
|
|
APP_SET_INT_DATA("playerGangG", iG)
|
|
APP_SET_INT_DATA("playerGangB", iB)
|
|
ENDIF
|
|
|
|
IF NOT IS_MODEL_A_VEHICLE(sData.eModel)
|
|
CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP - carName = DEFAULT, model = ", sData.eModel)
|
|
APP_SET_INT_DATA("carModel", -1)
|
|
APP_SET_INT_DATA("carUnlocked", 0)
|
|
ELSE
|
|
#IF IS_DEBUG_BUILD
|
|
IF IS_MODEL_IN_CDIMAGE(sData.eModel)
|
|
CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP - carName = ", GET_DISPLAY_NAME_FROM_VEHICLE_MODEL(sData.eModel), ", model = ", sData.eModel)
|
|
ELSE
|
|
CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP - model = ", sData.eModel)
|
|
ENDIF
|
|
#ENDIF
|
|
APP_SET_INT_DATA("carModel", ENUM_TO_INT(sData.eModel))
|
|
ENDIF
|
|
|
|
|
|
IF NOT NETWORK_IS_GAME_IN_PROGRESS()
|
|
SWITCH sData.eModKitType
|
|
CASE MKT_STANDARD
|
|
IF IS_THIS_MODEL_A_CAR(sData.eModel)
|
|
APP_SET_STRING_DATA("carType", "car") CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP - carType = car")
|
|
ELSE
|
|
APP_SET_STRING_DATA("carType", "bike") CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP - carType = bike")
|
|
ENDIF
|
|
BREAK
|
|
CASE MKT_SPORT APP_SET_STRING_DATA("carType", "sport") CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP - carType = sport") BREAK
|
|
CASE MKT_SUV APP_SET_STRING_DATA("carType", "suv") CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP - carType = suv") BREAK
|
|
CASE MKT_SPECIAL APP_SET_STRING_DATA("carType", "special") CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP - carType = special") BREAK
|
|
ENDSWITCH
|
|
ELSE
|
|
INT iPriceVariation = GET_VEHICLE_MOD_PRICE_VARIATION_FOR_CATALOGUE(sData.eModel)
|
|
SWITCH INT_TO_ENUM(MOD_PRICE_VARIATION_ENUM, iPriceVariation)
|
|
CASE MPV_STANDARD APP_SET_STRING_DATA("carType", "car") CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP - carType = car ***") BREAK
|
|
CASE MPV_SPORT APP_SET_STRING_DATA("carType", "sport") CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP - carType = sport ***") BREAK
|
|
CASE MPV_SUV APP_SET_STRING_DATA("carType", "suv") CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP - carType = suv ***") BREAK
|
|
CASE MPV_SPECIAL APP_SET_STRING_DATA("carType", "special") CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP - carType = special ***") BREAK
|
|
CASE MPV_BIKE APP_SET_STRING_DATA("carType", "bike") CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP - carType = bike ***") BREAK
|
|
CASE MPV_BTYPE3 APP_SET_STRING_DATA("carType", "special") CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP - carType = special ***") BREAK
|
|
CASE MPV_SULTANRS APP_SET_STRING_DATA("carType", "car") CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP - carType = car ***") BREAK
|
|
CASE MPV_BANSHEE2 APP_SET_STRING_DATA("carType", "special") CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP - carType = special ***") BREAK
|
|
CASE MPV_VIRGO2 APP_SET_STRING_DATA("carType", "special") CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP - carType = special ***") BREAK
|
|
CASE MPV_SLAMVAN3 APP_SET_STRING_DATA("carType", "car") CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP - carType = car ***") BREAK
|
|
CASE MPV_IE_BIKE APP_SET_STRING_DATA("carType", "car") CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP - carType = car ***") BREAK
|
|
CASE MPV_IE_RETRO APP_SET_STRING_DATA("carType", "special") CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP - carType = special ***") BREAK
|
|
CASE MPV_IE_HIGH APP_SET_STRING_DATA("carType", "special") CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP - carType = special ***") BREAK
|
|
CASE MPV_GR_HEAVY APP_SET_STRING_DATA("carType", "special") CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP - carType = special ***") BREAK
|
|
CASE MPV_GR_LIGHT APP_SET_STRING_DATA("carType", "special") CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP - carType = special ***") BREAK
|
|
CASE MPV_GR_BIKE APP_SET_STRING_DATA("carType", "special") CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP - carType = special ***") BREAK
|
|
CASE MPV_GR_TRAILERLARGE APP_SET_STRING_DATA("carType", "special") CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP - carType = special ***") BREAK
|
|
DEFAULT
|
|
//SCRIPT_ASSERT("DO_PROCESS_CAR_APP - Missing mod price variation lookup")
|
|
APP_SET_STRING_DATA("carType", "special") CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP - carType = special (DEFAULT) ***")
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDIF
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
/// All the mods
|
|
APP_SET_INT_DATA("carColour1", sData.iColourID1) CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP - carColour1 = ", sData.iColourID1)
|
|
APP_SET_INT_DATA("carColour2", sData.iColourID2) CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP - carColour2 = ", sData.iColourID2)
|
|
APP_SET_INT_DATA("windowTint", sData.iWindowTint) CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP - windowTint = ", sData.iWindowTint)
|
|
APP_SET_INT_DATA("bulletProofTyres", BOOL_TO_INT(sData.bBulletProofTyres))
|
|
APP_SET_INT_DATA("carEngine", sData.iEngine) CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP - carEngine = ", sData.iEngine)
|
|
APP_SET_INT_DATA("carBrakes", sData.iBrakes) CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP - carBrakes = ", sData.iBrakes)
|
|
APP_SET_INT_DATA("carExhaust", sData.iExhaust) CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP - carExhaust = ", sData.iExhaust)
|
|
APP_SET_INT_DATA("carWheel", sData.iWheels) CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP - carWheel = ", sData.iWheels)
|
|
APP_SET_INT_DATA("tyreSmokeColourRed", sData.iTyreSmokeR) CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP - tyreSmokeColourRed = ", sData.iTyreSmokeR)
|
|
APP_SET_INT_DATA("tyreSmokeColourGreen", sData.iTyreSmokeG) CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP - tyreSmokeColourGreen = ", sData.iTyreSmokeG)
|
|
APP_SET_INT_DATA("tyreSmokeColourBlue", sData.iTyreSmokeB) CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP - tyreSmokeColourBlue = ", sData.iTyreSmokeB)
|
|
APP_SET_INT_DATA("carHorn", sData.iHorn) CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP - carHorn = ", sData.iHorn)
|
|
APP_SET_INT_DATA("carArmour", sData.iArmour) CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP - carArmour = ", sData.iArmour)
|
|
APP_SET_INT_DATA("carTurbo", sData.iTurbo) CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP - carTurbo = ", sData.iTurbo)
|
|
APP_SET_INT_DATA("carSuspension", sData.iSuspension) CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP - carSuspension = ", sData.iSuspension)
|
|
APP_SET_INT_DATA("carXenonLights", sData.iLights) CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP - carXenonLights = ", sData.iLights)
|
|
APP_SET_INT_DATA("tyreSmoke", sData.iTyreSmoke) CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP - tyreSmoke = ", sData.iTyreSmoke)
|
|
APP_SET_INT_DATA("tyreSmoke", sData.iTyreSmoke) CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP - tyreSmoke = ", sData.iTyreSmoke)
|
|
APP_SET_INT_DATA("carWheelType", sData.iWheelType) CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP - carWheelType = ", sData.iWheelType)
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
/// Mod counts
|
|
APP_SET_INT_DATA("carEngineCount", sData.iModCountEngine) CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP - carEngineCount = ", sData.iModCountEngine)
|
|
APP_SET_INT_DATA("carBrakesCount", sData.iModCountBrakes) CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP - carBrakesCount = ", sData.iModCountBrakes)
|
|
APP_SET_INT_DATA("carExhaustCount", sData.iModCountExhaust) CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP - carExhaustCount = ", sData.iModCountExhaust)
|
|
APP_SET_INT_DATA("carWheelCount", sData.iModCountWheels) CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP - carWheelCount = ", sData.iModCountWheels)
|
|
APP_SET_INT_DATA("carHornCount", sData.iModCountHorn) CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP - carHornCount = ", sData.iModCountHorn)
|
|
APP_SET_INT_DATA("carArmourCount", sData.iModCountArmour) CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP - carArmourCount = ", sData.iModCountArmour)
|
|
APP_SET_INT_DATA("carSuspensionCount", sData.iModCountSuspension) CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP - carSuspensionCount = ", sData.iModCountSuspension)
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
/// Horn hash
|
|
APP_SET_INT_DATA("carHorn1", sData.iHornHash[0]) CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP - carHorn1 = ", sData.iHornHash[0])
|
|
APP_SET_INT_DATA("carHorn2", sData.iHornHash[1]) CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP - carHorn2 = ", sData.iHornHash[1])
|
|
APP_SET_INT_DATA("carHorn3", sData.iHornHash[2]) CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP - carHorn3 = ", sData.iHornHash[2])
|
|
APP_SET_INT_DATA("carHorn4", sData.iHornHash[3]) CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP - carHorn4 = ", sData.iHornHash[3])
|
|
APP_SET_INT_DATA("carHorn5", sData.iHornHash[4]) CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP - carHorn5 = ", sData.iHornHash[4])
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
/// Price modifier
|
|
APP_SET_FLOAT_DATA("carPriceModifier", sData.fModPriceModifier) CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP - carPriceModifier = ", sData.fModPriceModifier)
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
/// All the unlocks
|
|
IF NOT IS_BIT_SET(sData.iModColoursThatCanBeSet, 0) // Primary Colour
|
|
OR sData.eModel = SOVEREIGN
|
|
APP_SET_INT_DATA("carColour1Unlocked", 0)
|
|
ELSE
|
|
APP_SET_INT_DATA("carColour1Unlocked", 1)
|
|
ENDIF
|
|
|
|
IF NOT IS_BIT_SET(sData.iModColoursThatCanBeSet, 1) // Secondary Colour
|
|
OR sData.eModel = SOVEREIGN
|
|
APP_SET_INT_DATA("carColour2Unlocked", 0)
|
|
ELSE
|
|
APP_SET_INT_DATA("carColour2Unlocked", 1)
|
|
ENDIF
|
|
|
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////
|
|
/// New item unlocks - patriot smoke, indi horns
|
|
INT iNewUnlockFlags = 0
|
|
IF NOT NETWORK_IS_GAME_IN_PROGRESS()
|
|
OR (IS_BIT_SET(g_MpSavedVehicles[iMPSavedVehicleSlot].iVehicleBS, MP_SAVED_VEHICLE_BOUGHT_INDI_SMOKE))
|
|
SET_BIT(iNewUnlockFlags, 0)
|
|
ENDIF
|
|
IF NOT NETWORK_IS_GAME_IN_PROGRESS()
|
|
OR (IS_BIT_SET(g_MpSavedVehicles[iMPSavedVehicleSlot].iVehicleBS, MP_SAVED_VEHICLE_BOUGHT_INDI_HORN))
|
|
SET_BIT(iNewUnlockFlags, 1)
|
|
ENDIF
|
|
APP_SET_INT_DATA("newItemUnlocks", iNewUnlockFlags)
|
|
ENDIF
|
|
|
|
IF NETWORK_IS_GAME_IN_PROGRESS()
|
|
APP_CLOSE_BLOCK()
|
|
ENDIF
|
|
|
|
// Done
|
|
APP_CLOSE_BLOCK()
|
|
|
|
sModUnlockBlockName = sBlockName
|
|
sModUnlockVehicleBlockName = sVehicleBlockName
|
|
eModUnlockModel = sData.eModel
|
|
bProcessModUnlocks = TRUE
|
|
|
|
CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP - sending vehicle plate to cloud: ", sBlockName)
|
|
APP_SET_BLOCK("plate")
|
|
APP_SET_INT_DATA("carPlateBack", sData.iPlateBack) CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP - carPlateBack = ", sData.iPlateBack)
|
|
APP_CLOSE_BLOCK()
|
|
|
|
APP_CLOSE_APP()
|
|
|
|
// Done updating
|
|
sData.bSendDataToCloud = FALSE
|
|
|
|
bSaveCarData = TRUE SETTIMERA(0)
|
|
|
|
IF NOT NETWORK_IS_GAME_IN_PROGRESS()
|
|
g_savedGlobals.sSocialData.bFirstVehicleSentToCloud[ePed] = TRUE
|
|
ELSE
|
|
IF (iMPCharSlot = 0)
|
|
SET_MP_BOOL_PLAYER_STAT(MPPLY_CARAPP_DATA_SENT_0, TRUE)
|
|
ELIF (iMPCharSlot = 1)
|
|
SET_MP_BOOL_PLAYER_STAT(MPPLY_CARAPP_DATA_SENT_1, TRUE)
|
|
ELIF (iMPCharSlot = 2)
|
|
SET_MP_BOOL_PLAYER_STAT(MPPLY_CARAPP_DATA_SENT_2, TRUE)
|
|
ELIF (iMPCharSlot = 3)
|
|
SET_MP_BOOL_PLAYER_STAT(MPPLY_CARAPP_DATA_SENT_3, TRUE)
|
|
ELIF (iMPCharSlot = 4)
|
|
SET_MP_BOOL_PLAYER_STAT(MPPLY_CARAPP_DATA_SENT_4, TRUE)
|
|
ENDIF
|
|
g_savedMPGlobalsNew.g_savedMPGlobals[GET_SAVE_GAME_ARRAY_SLOT()].MpSavedCarApp.bCarHiddenInApp[iMPVehicleBlock] = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// Update saved globals
|
|
SWITCH ePed
|
|
CASE CHAR_MICHAEL
|
|
CASE CHAR_FRANKLIN
|
|
CASE CHAR_TREVOR
|
|
g_savedGlobals.sSocialData.sCarAppData[ePed] = sData
|
|
g_savedGlobals.sSocialData.sCarAppOrder[ePed] = sOrder
|
|
BREAK
|
|
CASE CHAR_MULTIPLAYER
|
|
UPDATE_SAVED_MP_CAR_APP_DATA(sData)
|
|
g_savedMPGlobalsNew.g_savedMPGlobals[GET_SAVE_GAME_ARRAY_SLOT()].MpSavedCarApp.sCarAppOrder = sOrder
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDPROC
|
|
|
|
/// PURPOSE: Attempts to fetch the dog app data and sends txt if successful.
|
|
PROC DO_PROCESS_DOG_APP()
|
|
|
|
// Only process in singleplayer
|
|
IF NETWORK_IS_GAME_IN_PROGRESS()
|
|
EXIT
|
|
ENDIF
|
|
|
|
// Only process off mission
|
|
IF IS_CURRENTLY_ON_MISSION_OF_ANY_TYPE()
|
|
EXIT
|
|
ENDIF
|
|
|
|
|
|
///////////////////////////////////////////////////////
|
|
///
|
|
/// SET DATA
|
|
///
|
|
IF g_bPlayerHasKilledChop
|
|
IF NOT bChopDeathProcessed
|
|
|
|
CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_DOG_APP - processing Chop death")
|
|
|
|
APP_SET_APP("dog")
|
|
APP_SET_BLOCK("saveData")
|
|
APP_SET_INT_DATA("chopKilled", GET_RANDOM_INT_IN_RANGE())
|
|
APP_SAVE_DATA()
|
|
APP_CLOSE_BLOCK()
|
|
APP_CLOSE_APP()
|
|
|
|
bChopDeathProcessed = TRUE
|
|
ENDIF
|
|
ELSE
|
|
bChopDeathProcessed = FALSE
|
|
ENDIF
|
|
|
|
|
|
///////////////////////////////////////////////////////
|
|
///
|
|
/// GET DATA
|
|
///
|
|
APP_SET_APP("dog")
|
|
APP_SET_BLOCK("saveData")
|
|
|
|
IF APP_DATA_VALID()
|
|
// Only progress if the fetched block is valid
|
|
//IF APP_BLOCK_VALID()
|
|
|
|
// We are now safe to access the fetched members
|
|
//CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_DOG_APP - processing stats")
|
|
|
|
INT happinessTimer = APP_GET_INT("happinessTimer")
|
|
IF happinessTimer = 0
|
|
//Default happiness timer if this value hasn't been set yet
|
|
happinessTimer = 450
|
|
ENDIF
|
|
|
|
INT happinessDecrement = APP_GET_INT("happinessDecrement")
|
|
IF happinessDecrement = 0
|
|
//Default happiness decrement if this value hasn't been set yet
|
|
happinessDecrement = 1
|
|
ENDIF
|
|
|
|
INT appTime = APP_GET_INT("time_stamp")
|
|
INT cloudTime = GET_CLOUD_TIME_AS_INT()
|
|
|
|
IF cloudTime = 0
|
|
//Default cloud time to app time incase its zero
|
|
cloudTime = appTime
|
|
ENDIF
|
|
|
|
INT currentHappiness = APP_GET_INT("happiness")
|
|
INT time_stamp = cloudTime - appTime
|
|
INT happinessDecrease = ( time_stamp / happinessTimer ) * happinessDecrement
|
|
INT happiness = CLAMP_INT(currentHappiness - happinessDecrease, 0, 100)
|
|
|
|
g_savedGlobals.sSocialData.sDogAppData.fHappiness = TO_FLOAT(happiness)
|
|
g_savedGlobals.sSocialData.sDogAppData.fCleanliness = APP_GET_FLOAT("cleanliness")
|
|
g_savedGlobals.sSocialData.sDogAppData.fHunger = APP_GET_FLOAT("hunger")
|
|
g_savedGlobals.sSocialData.sDogAppData.iTrainingLevel = APP_GET_INT_DATA("trainingLevel")
|
|
g_savedGlobals.sSocialData.sDogAppData.iCollar = APP_GET_INT_DATA("collar")
|
|
|
|
g_savedGlobals.sSocialData.sDogAppData.bAppDataReceived = TRUE
|
|
|
|
// Update stock market modifier
|
|
IF g_savedGlobals.sSocialData.sDogAppData.fHappiness > 50
|
|
////BAWSAQ_INCREMENT_MODIFIER(BSMF_HAPPYDOGTIME, 1)
|
|
ELSE
|
|
////BAWSAQ_INCREMENT_MODIFIER(BSMF_UNHAPPYDOGTIME, 1)
|
|
ENDIF
|
|
|
|
IF g_savedGlobals.sSocialData.sDogAppData.fHunger > 50
|
|
////BAWSAQ_INCREMENT_MODIFIER(BSMF_DOGFED, 0)
|
|
ELSE
|
|
////BAWSAQ_INCREMENT_MODIFIER(BSMF_DOGFED, 1)
|
|
ENDIF
|
|
|
|
// Flag that we have used the app
|
|
g_savedGlobals.sSocialData.bDogAppUsed = (APP_GET_INT_DATA("usedApp") != 0)
|
|
|
|
BOOL bStatState
|
|
IF STAT_GET_BOOL(CHOP_APP_USED, bStatState)
|
|
IF NOT bStatState
|
|
IF g_savedGlobals.sSocialData.bDogAppUsed
|
|
STAT_SET_BOOL(CHOP_APP_USED, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
//ENDIF
|
|
ENDIF
|
|
APP_CLOSE_BLOCK()
|
|
APP_CLOSE_APP()
|
|
|
|
|
|
IF g_savedGlobals.sSocialData.bUpdateDogLocation
|
|
APP_SET_APP("dog")
|
|
APP_SET_BLOCK("saveData")
|
|
IF Is_Savehouse_Respawn_Available(SAVEHOUSE_FRANKLIN_VH)
|
|
APP_SET_INT_DATA("chopSafeHouse", 1)
|
|
CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_DOG_APP - chopSafeHouse = 1")
|
|
ELSE
|
|
APP_SET_INT_DATA("chopSafeHouse", 0)
|
|
CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_DOG_APP - chopSafeHouse = 0")
|
|
ENDIF
|
|
APP_SAVE_DATA()
|
|
APP_CLOSE_BLOCK()
|
|
APP_CLOSE_APP()
|
|
g_savedGlobals.sSocialData.bUpdateDogLocation = FALSE
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// PURPOSE: Checks to see if the social controller should be re-initialised
|
|
PROC CHECK_CONTROLLER_RESET()
|
|
|
|
IF eStage != SOCIAL_STAGE_INIT
|
|
AND eInit != NOT_INITIALISED
|
|
// Reset if we have changed game modes
|
|
IF eInit = INITIALISED_IN_SP
|
|
IF NETWORK_IS_GAME_IN_PROGRESS()
|
|
eInit = NOT_INITIALISED
|
|
ENDIF
|
|
ELIF eInit = INITIALISED_IN_MP_FM
|
|
IF (NOT NETWORK_IS_GAME_IN_PROGRESS() AND NOT IS_TRANSITION_SESSION_LAUNCHING() AND NOT IS_TRANSITION_SESSION_KILLING_SESSION())
|
|
eInit = NOT_INITIALISED
|
|
ENDIF
|
|
IF GET_CURRENT_GAMEMODE() != GAMEMODE_FM
|
|
eInit = NOT_INITIALISED
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT APP_HAS_LINKED_SOCIAL_CLUB_ACCOUNT()
|
|
eInit = NOT_INITIALISED
|
|
ENDIF
|
|
|
|
IF g_bResetSocialController #IF IS_DEBUG_BUILD OR bResetController_Debug #ENDIF
|
|
eInit = NOT_INITIALISED
|
|
ENDIF
|
|
|
|
|
|
|
|
// Jump back to the initialisation stage if we have switched game modes
|
|
IF eInit = NOT_INITIALISED
|
|
eStage = SOCIAL_STAGE_INIT
|
|
PRINTSTRING("\n social_controller: RESET")PRINTNL()
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// PURPOSE: Wait for the game to be in the correct state before proceeding
|
|
PROC DO_INITIALISE()
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
IF bBlockInit_Debug
|
|
CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_INITIALISE - blocked by debug widget")
|
|
EXIT
|
|
ENDIF
|
|
#ENDIF
|
|
|
|
// Wait for account to be linked with social club
|
|
IF NOT APP_HAS_LINKED_SOCIAL_CLUB_ACCOUNT() OR NOT APP_HAS_SYNCED_DATA("car")
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
IF NOT bDebug_FailForLinkedAcccount
|
|
CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_INITIALISE - not linked to Social Club account")
|
|
bDebug_FailForLinkedAcccount = TRUE
|
|
ENDIF
|
|
#ENDIF
|
|
bWasLinkedLastFrame = FALSE
|
|
EXIT
|
|
ELSE
|
|
//If the player is linked but wasn't during the last check , do full cleanup
|
|
IF NOT bWasLinkedLastFrame
|
|
bResendAppDataForAccountLinkSP = TRUE
|
|
bResendAppDataForAccountLinkMP = TRUE
|
|
bCheckPlayerNameDiffSP = TRUE
|
|
bCheckPlayerNameDiffMP = TRUE
|
|
|
|
// Re-grab SC plates
|
|
PRINTLN("[PURCHASED PLATES] Changed account, re-grab plates.")
|
|
g_bRebuildSCPlateList = TRUE
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_INITIALISE - player has linked a different Social Club account")
|
|
#ENDIF
|
|
ENDIF
|
|
bWasLinkedLastFrame = TRUE
|
|
ENDIF
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
bDebug_FailForLinkedAcccount = FALSE
|
|
#ENDIF
|
|
|
|
// Wait for MP player to be in main game
|
|
IF NETWORK_IS_GAME_IN_PROGRESS()
|
|
IF GET_CURRENT_GAMEMODE() != GAMEMODE_FM
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
IF NOT bDebug_FailForGamemode
|
|
CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_INITIALISE - not in FM")
|
|
bDebug_FailForGamemode = TRUE
|
|
ENDIF
|
|
#ENDIF
|
|
|
|
EXIT
|
|
ENDIF
|
|
|
|
IF NOT HAS_IMPORTANT_STATS_LOADED()
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
IF NOT bDebug_FailForGamemode
|
|
CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_INITIALISE - waiting on important stats loading")
|
|
bDebug_FailForGamemode = TRUE
|
|
ENDIF
|
|
#ENDIF
|
|
|
|
EXIT
|
|
ENDIF
|
|
ENDIF
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
bDebug_FailForGamemode = FALSE
|
|
#ENDIF
|
|
|
|
IF NETWORK_IS_GAME_IN_PROGRESS()
|
|
IF GET_CURRENT_GAMEMODE() = GAMEMODE_FM
|
|
CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_INITIALISE - initialised in FM")
|
|
eInit = INITIALISED_IN_MP_FM
|
|
ENDIF
|
|
|
|
// Initialise the new app update
|
|
IF NOT g_savedMPGlobalsNew.g_savedMPGlobals[GET_SAVE_GAME_ARRAY_SLOT()].MpSavedCarApp.bNewSetupInitialised
|
|
INT i
|
|
FOR i = MAX_MP_VEHICLE_APP_CAN_HANDLE-1 TO 0 STEP -1
|
|
g_savedMPGlobalsNew.g_savedMPGlobals[GET_SAVE_GAME_ARRAY_SLOT()].MpSavedCarApp.iProcessSlot[i] = i+1
|
|
g_savedMPGlobalsNew.g_savedMPGlobals[GET_SAVE_GAME_ARRAY_SLOT()].MpSavedCarApp.iSlotPriority[i] = i+1
|
|
g_savedMPGlobalsNew.g_savedMPGlobals[GET_SAVE_GAME_ARRAY_SLOT()].MpSavedCarApp.bCarHiddenInApp[i] = FALSE
|
|
ENDFOR
|
|
|
|
g_savedMPGlobalsNew.g_savedMPGlobals[GET_SAVE_GAME_ARRAY_SLOT()].MpSavedCarApp.iLastSavedVehUsed = -1
|
|
g_savedMPGlobalsNew.g_savedMPGlobals[GET_SAVE_GAME_ARRAY_SLOT()].MpSavedCarApp.bNewSetupInitialised = TRUE
|
|
ENDIF
|
|
|
|
bResendAppDataForCharacter0 = GET_PACKED_STAT_BOOL(PACKED_MP_RESEND_APP_DATA_FOR_CHARACTER_0)
|
|
bResendAppDataForCharacter1 = GET_PACKED_STAT_BOOL(PACKED_MP_RESEND_APP_DATA_FOR_CHARACTER_1)
|
|
|
|
IF IS_LAST_GEN_PLAYER()
|
|
IF NOT GET_PACKED_STAT_BOOL(PACKED_MP_STAT_RESEND_APP_DATA_FOR_PLAYER)
|
|
RESEND_APP_DATA_FOR_CHARACTER(0, TRUE)
|
|
RESEND_APP_DATA_FOR_CHARACTER(1, TRUE)
|
|
|
|
SET_PACKED_STAT_BOOL(PACKED_MP_STAT_RESEND_APP_DATA_FOR_PLAYER, TRUE)
|
|
|
|
CPRINTLN(DEBUG_SOCIAL,"DO_INITIALISE - Player is last gen player so resend all app data")
|
|
ENDIF
|
|
ELSE
|
|
IF GET_PACKED_STAT_BOOL(PACKED_MP_STAT_RESEND_APP_DATA_FOR_PLAYER)
|
|
SET_PACKED_STAT_BOOL(PACKED_MP_STAT_RESEND_APP_DATA_FOR_PLAYER, FALSE)
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_INITIALISE - initialised in SP")
|
|
eInit = INITIALISED_IN_SP
|
|
ENDIF
|
|
|
|
#IF USE_MULTI_NUMBER_PLATE_SETUP_IN_MP
|
|
// If we have a pending order, make sure we grab the plate list from players SC account.
|
|
IF NETWORK_IS_GAME_IN_PROGRESS()
|
|
IF g_savedMPGlobalsNew.g_savedMPGlobals[GET_SAVE_GAME_ARRAY_SLOT()].MpSavedCarApp.sCarAppOrder.bOrderPending
|
|
PRINTLN("[PURCHASED PLATES] DO_INITIALISE - Order pending so rebuild list of plates (MP)")
|
|
bRebuildPlatesList = TRUE
|
|
ENDIF
|
|
|
|
IF GET_MP_BOOL_CHARACTER_STAT(MP_STAT_REBUILDSCPLATELIST)
|
|
bRebuildPlatesList = TRUE
|
|
SET_MP_BOOL_CHARACTER_STAT(MP_STAT_REBUILDSCPLATELIST, FALSE)
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
CPRINTLN(DEBUG_SOCIAL,"[PURCHASED PLATES] DO_INITIALISE - Plates edited in SC admin so rebuilding")
|
|
#ENDIF
|
|
ENDIF
|
|
|
|
// Plates are now part of the vehicle dupe protection system so we need to grab.
|
|
IF NOT g_sMPTunables.bDisable_SC_Number_Plate_Initial_Get
|
|
AND NOT g_bInitialSCPlateListGrabbedMP
|
|
PRINTLN("[PURCHASED PLATES] DO_INITIALISE - Entering MP for first time so build list of plates")
|
|
bRebuildPlatesList = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF g_savedGlobals.sSocialData.sCarAppOrder[CHAR_MICHAEL].bOrderPending
|
|
OR g_savedGlobals.sSocialData.sCarAppOrder[CHAR_FRANKLIN].bOrderPending
|
|
OR g_savedGlobals.sSocialData.sCarAppOrder[CHAR_TREVOR].bOrderPending
|
|
PRINTLN("[PURCHASED PLATES] DO_INITIALISE - Order pending so rebuild list of plates (SP)")
|
|
bRebuildPlatesList = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
#ENDIF
|
|
|
|
iDeleteCarDataControl = 0
|
|
iMPVehicleBlock = 0
|
|
iMPCarAppSlot = 0
|
|
iMPSavedVehicleSlot = 0
|
|
|
|
bProcessedProfanityChecks = FALSE
|
|
|
|
bProcessModUnlocks = FALSE
|
|
iModUnlockStage = 0
|
|
|
|
IF NOT bInitialPassComplete
|
|
OR g_bResetSocialController
|
|
// Always refresh chop data on init
|
|
g_savedGlobals.sSocialData.bUpdateDogLocation = TRUE
|
|
|
|
// Refresh car data if we have stored vehicles or used the cloud
|
|
bRefreshAppDataOnInit = FALSE
|
|
APP_SET_APP("car")
|
|
APP_SET_BLOCK("appdata")
|
|
INT iCloudUID = APP_GET_INT_DATA("appUID")
|
|
IF iCloudUID != g_savedGlobals.sSocialData.iGameUID
|
|
CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_INITIALISE - game and cloud data differ, refresh! gameUID=", g_savedGlobals.sSocialData.iGameUID, ", cloudUID=", iCloudUID)
|
|
bRefreshAppDataOnInit = TRUE
|
|
ENDIF
|
|
APP_CLOSE_BLOCK()
|
|
APP_CLOSE_APP()
|
|
|
|
INT iSlot
|
|
REPEAT COUNT_OF(g_savedGlobals.sSocialData.sCarAppOrder) iSlot
|
|
bProcessOrderNow[iSlot] = FALSE
|
|
bProcessOrderOnPlayerVehicle[iSlot] = FALSE
|
|
bInitialOrderCheckComplete[iSlot] = FALSE
|
|
ENDREPEAT
|
|
bProcessMPOrderNow = FALSE
|
|
ENDIF
|
|
|
|
g_bResetSocialController = FALSE
|
|
bInitialPassComplete = TRUE
|
|
|
|
eStage = SOCIAL_STAGE_PROCESS
|
|
ENDPROC
|
|
|
|
INT iLastUsedVehiclesStage
|
|
PROC DO_MAINTAIN_LAST_USED_SAVED_VEHICLES()
|
|
|
|
IF NOT NETWORK_IS_GAME_IN_PROGRESS()
|
|
EXIT
|
|
ENDIF
|
|
|
|
INT i, j, iVehUpdate, iFreeSlots, iSavedVehicles, iFirstFreeSlot
|
|
BOOL bUpdatePriorities
|
|
INT iSlotPriorityCopy[MAX_MP_VEHICLE_APP_CAN_HANDLE]
|
|
|
|
// Make a copy of the priority update array
|
|
REPEAT MAX_MP_VEHICLE_APP_CAN_HANDLE i
|
|
iSlotPriorityCopy[i] = g_savedMPGlobalsNew.g_savedMPGlobals[GET_SAVE_GAME_ARRAY_SLOT()].MpSavedCarApp.iSlotPriority[i]
|
|
ENDREPEAT
|
|
|
|
SWITCH iLastUsedVehiclesStage
|
|
|
|
// Remove old vehicles
|
|
CASE 0
|
|
bUpdatePriorities = FALSE
|
|
IF NOT IS_PLAYER_IN_MP_GARAGE(PLAYER_ID(), TRUE)
|
|
REPEAT MAX_MP_VEHICLE_APP_CAN_HANDLE i
|
|
iVehUpdate = g_savedMPGlobalsNew.g_savedMPGlobals[GET_SAVE_GAME_ARRAY_SLOT()].MpSavedCarApp.iSlotPriority[i]-1
|
|
IF iVehUpdate >= 0
|
|
AND (g_MpSavedVehicles[iVehUpdate].vehicleSetupMP.VehicleSetup.eModel = DUMMY_MODEL_FOR_SCRIPT
|
|
OR (IS_BIT_SET(g_MpSavedVehicles[iVehUpdate].iVehicleBS,MP_SAVED_VEHICLE_DESTROYED) AND NOT IS_BIT_SET(g_MpSavedVehicles[iVehUpdate].iVehicleBS,MP_SAVED_VEHICLE_INSURED)))
|
|
|
|
CPRINTLN(DEBUG_SOCIAL,"DO_MAINTAIN_LAST_USED_SAVED_VEHICLES - Vehicle ", iVehUpdate, " no longer valid -- remove")
|
|
|
|
// remove from priority array + copy array
|
|
g_savedMPGlobalsNew.g_savedMPGlobals[GET_SAVE_GAME_ARRAY_SLOT()].MpSavedCarApp.iSlotPriority[i] = 0
|
|
iSlotPriorityCopy[i] = 0
|
|
|
|
// remove from process slot array
|
|
REPEAT MAX_MP_VEHICLE_APP_CAN_HANDLE j
|
|
IF g_savedMPGlobalsNew.g_savedMPGlobals[GET_SAVE_GAME_ARRAY_SLOT()].MpSavedCarApp.iProcessSlot[j] = iVehUpdate+1
|
|
g_savedMPGlobalsNew.g_savedMPGlobals[GET_SAVE_GAME_ARRAY_SLOT()].MpSavedCarApp.iProcessSlot[j] = 0
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
bUpdatePriorities = TRUE
|
|
ENDIF
|
|
ENDREPEAT
|
|
ENDIF
|
|
|
|
IF bUpdatePriorities
|
|
j = 0
|
|
REPEAT MAX_MP_VEHICLE_APP_CAN_HANDLE i
|
|
IF iSlotPriorityCopy[i] != 0
|
|
g_savedMPGlobalsNew.g_savedMPGlobals[GET_SAVE_GAME_ARRAY_SLOT()].MpSavedCarApp.iSlotPriority[j] = iSlotPriorityCopy[i]
|
|
CPRINTLN(DEBUG_SOCIAL,"...slot[", j, "] Vehicle = ", g_savedMPGlobalsNew.g_savedMPGlobals[GET_SAVE_GAME_ARRAY_SLOT()].MpSavedCarApp.iSlotPriority[j]-1)
|
|
j++
|
|
ENDIF
|
|
ENDREPEAT
|
|
FOR i = j TO MAX_MP_VEHICLE_APP_CAN_HANDLE-1
|
|
g_savedMPGlobalsNew.g_savedMPGlobals[GET_SAVE_GAME_ARRAY_SLOT()].MpSavedCarApp.iSlotPriority[i] = 0
|
|
CPRINTLN(DEBUG_SOCIAL,"...slot[", i, "] Vehicle = ", g_savedMPGlobalsNew.g_savedMPGlobals[GET_SAVE_GAME_ARRAY_SLOT()].MpSavedCarApp.iSlotPriority[i]-1)
|
|
ENDFOR
|
|
ENDIF
|
|
|
|
iLastUsedVehiclesStage++
|
|
BREAK
|
|
|
|
// Update last used vehicle
|
|
CASE 1
|
|
iVehUpdate = -1
|
|
IF g_savedMPGlobalsNew.g_savedMPGlobals[GET_SAVE_GAME_ARRAY_SLOT()].MpSavedGeneral.iLastSavedCarUsed != g_savedMPGlobalsNew.g_savedMPGlobals[GET_SAVE_GAME_ARRAY_SLOT()].MpSavedCarApp.iLastSavedVehUsed
|
|
AND g_savedMPGlobalsNew.g_savedMPGlobals[GET_SAVE_GAME_ARRAY_SLOT()].MpSavedGeneral.iLastSavedCarUsed != -1
|
|
AND g_MpSavedVehicles[g_savedMPGlobalsNew.g_savedMPGlobals[GET_SAVE_GAME_ARRAY_SLOT()].MpSavedGeneral.iLastSavedCarUsed].vehicleSetupMP.VehicleSetup.eModel != DUMMY_MODEL_FOR_SCRIPT
|
|
AND (NOT IS_BIT_SET(g_MpSavedVehicles[g_savedMPGlobalsNew.g_savedMPGlobals[GET_SAVE_GAME_ARRAY_SLOT()].MpSavedGeneral.iLastSavedCarUsed].iVehicleBS,MP_SAVED_VEHICLE_DESTROYED) OR IS_BIT_SET(g_MpSavedVehicles[g_savedMPGlobalsNew.g_savedMPGlobals[GET_SAVE_GAME_ARRAY_SLOT()].MpSavedGeneral.iLastSavedCarUsed].iVehicleBS,MP_SAVED_VEHICLE_INSURED))
|
|
iVehUpdate = g_savedMPGlobalsNew.g_savedMPGlobals[GET_SAVE_GAME_ARRAY_SLOT()].MpSavedGeneral.iLastSavedCarUsed
|
|
g_savedMPGlobalsNew.g_savedMPGlobals[GET_SAVE_GAME_ARRAY_SLOT()].MpSavedCarApp.iLastSavedVehUsed = iVehUpdate
|
|
CPRINTLN(DEBUG_SOCIAL,"DO_MAINTAIN_LAST_USED_SAVED_VEHICLES - Last used vehicle updated")
|
|
ELIF g_savedMPGlobalsNew.g_savedMPGlobals[GET_SAVE_GAME_ARRAY_SLOT()].MpSavedCarApp.iNewSavedVehToProcess != 0
|
|
iVehUpdate = g_savedMPGlobalsNew.g_savedMPGlobals[GET_SAVE_GAME_ARRAY_SLOT()].MpSavedCarApp.iNewSavedVehToProcess-1
|
|
g_savedMPGlobalsNew.g_savedMPGlobals[GET_SAVE_GAME_ARRAY_SLOT()].MpSavedCarApp.iNewSavedVehToProcess = 0
|
|
CPRINTLN(DEBUG_SOCIAL,"DO_MAINTAIN_LAST_USED_SAVED_VEHICLES - New vehicle added, save slot = ", iVehUpdate)
|
|
ENDIF
|
|
|
|
IF iVehUpdate != -1
|
|
CPRINTLN(DEBUG_SOCIAL,"DO_MAINTAIN_LAST_USED_SAVED_VEHICLES - Vehicle ", iVehUpdate, " is now the top priority")
|
|
|
|
BOOL bSlotDefined
|
|
bSlotDefined = FALSE
|
|
|
|
// Check to see if we already have a slot defined for this vehicle
|
|
REPEAT MAX_MP_VEHICLE_APP_CAN_HANDLE i
|
|
IF g_savedMPGlobalsNew.g_savedMPGlobals[GET_SAVE_GAME_ARRAY_SLOT()].MpSavedCarApp.iProcessSlot[i] = (iVehUpdate+1)
|
|
CPRINTLN(DEBUG_SOCIAL,"...Vehicle already stored in app slot ", i)
|
|
bSlotDefined = TRUE
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
// If not defined, replace the lowest priority vehicle
|
|
IF NOT bSlotDefined
|
|
INT iLowestPrioritySlot
|
|
iLowestPrioritySlot = -1
|
|
REPEAT MAX_MP_VEHICLE_APP_CAN_HANDLE i
|
|
IF g_savedMPGlobalsNew.g_savedMPGlobals[GET_SAVE_GAME_ARRAY_SLOT()].MpSavedCarApp.iSlotPriority[i] > 0
|
|
iLowestPrioritySlot = i
|
|
ENDIF
|
|
ENDREPEAT
|
|
// If we're not at fully capacity pick the next free slot
|
|
IF iLowestPrioritySlot < MAX_MP_VEHICLE_APP_CAN_HANDLE-1
|
|
iLowestPrioritySlot++
|
|
ENDIF
|
|
|
|
// Find the vehicle slot we used with this priority
|
|
REPEAT MAX_MP_VEHICLE_APP_CAN_HANDLE i
|
|
IF g_savedMPGlobalsNew.g_savedMPGlobals[GET_SAVE_GAME_ARRAY_SLOT()].MpSavedCarApp.iProcessSlot[i] = g_savedMPGlobalsNew.g_savedMPGlobals[GET_SAVE_GAME_ARRAY_SLOT()].MpSavedCarApp.iSlotPriority[iLowestPrioritySlot]
|
|
g_savedMPGlobalsNew.g_savedMPGlobals[GET_SAVE_GAME_ARRAY_SLOT()].MpSavedCarApp.iProcessSlot[i] = (iVehUpdate+1)
|
|
CPRINTLN(DEBUG_SOCIAL,"...Vehicle now stored in app slot ", i)
|
|
i = MAX_MP_VEHICLE_APP_CAN_HANDLE+1// Bail
|
|
ENDIF
|
|
ENDREPEAT
|
|
ENDIF
|
|
|
|
// Update the priorities
|
|
g_savedMPGlobalsNew.g_savedMPGlobals[GET_SAVE_GAME_ARRAY_SLOT()].MpSavedCarApp.iSlotPriority[0] = (iVehUpdate+1)
|
|
#IF IS_DEBUG_BUILD
|
|
IF IS_MODEL_IN_CDIMAGE(g_MpSavedVehicles[iVehUpdate].vehicleSetupMP.VehicleSetup.eModel)
|
|
CPRINTLN(DEBUG_SOCIAL,"...priority slot[0] Vehicle ", g_savedMPGlobalsNew.g_savedMPGlobals[GET_SAVE_GAME_ARRAY_SLOT()].MpSavedCarApp.iSlotPriority[0]-1, " = ", GET_DISPLAY_NAME_FROM_VEHICLE_MODEL(g_MpSavedVehicles[iVehUpdate].vehicleSetupMP.VehicleSetup.eModel))
|
|
ELSE
|
|
CPRINTLN(DEBUG_SOCIAL,"...priority slot[0] Vehicle ", g_savedMPGlobalsNew.g_savedMPGlobals[GET_SAVE_GAME_ARRAY_SLOT()].MpSavedCarApp.iSlotPriority[0]-1, " = ", g_MpSavedVehicles[iVehUpdate].vehicleSetupMP.VehicleSetup.eModel)
|
|
ENDIF
|
|
#ENDIF
|
|
|
|
|
|
j = 1
|
|
REPEAT MAX_MP_VEHICLE_APP_CAN_HANDLE i
|
|
IF iSlotPriorityCopy[i] != 0
|
|
AND iSlotPriorityCopy[i] != (iVehUpdate+1)
|
|
AND j < MAX_MP_VEHICLE_APP_CAN_HANDLE
|
|
g_savedMPGlobalsNew.g_savedMPGlobals[GET_SAVE_GAME_ARRAY_SLOT()].MpSavedCarApp.iSlotPriority[j] = iSlotPriorityCopy[i]
|
|
#IF IS_DEBUG_BUILD
|
|
IF IS_MODEL_IN_CDIMAGE(g_MpSavedVehicles[iSlotPriorityCopy[i]-1].vehicleSetupMP.VehicleSetup.eModel)
|
|
CPRINTLN(DEBUG_SOCIAL,"...priority slot[", j, "] Vehicle ", g_savedMPGlobalsNew.g_savedMPGlobals[GET_SAVE_GAME_ARRAY_SLOT()].MpSavedCarApp.iSlotPriority[j]-1, " = ", GET_DISPLAY_NAME_FROM_VEHICLE_MODEL(g_MpSavedVehicles[iSlotPriorityCopy[i]-1].vehicleSetupMP.VehicleSetup.eModel))
|
|
ELSE
|
|
CPRINTLN(DEBUG_SOCIAL,"...priority slot[", j, "] Vehicle ", g_savedMPGlobalsNew.g_savedMPGlobals[GET_SAVE_GAME_ARRAY_SLOT()].MpSavedCarApp.iSlotPriority[j]-1, " = ", g_MpSavedVehicles[iSlotPriorityCopy[i]-1].vehicleSetupMP.VehicleSetup.eModel)
|
|
ENDIF
|
|
#ENDIF
|
|
|
|
j++
|
|
ENDIF
|
|
ENDREPEAT
|
|
// Clear out remaining slots
|
|
FOR i = j TO MAX_MP_VEHICLE_APP_CAN_HANDLE-1
|
|
g_savedMPGlobalsNew.g_savedMPGlobals[GET_SAVE_GAME_ARRAY_SLOT()].MpSavedCarApp.iSlotPriority[i] = 0
|
|
CPRINTLN(DEBUG_SOCIAL,"...priority slot[", i, "] Vehicle ", g_savedMPGlobalsNew.g_savedMPGlobals[GET_SAVE_GAME_ARRAY_SLOT()].MpSavedCarApp.iSlotPriority[i]-1)
|
|
ENDFOR
|
|
|
|
|
|
// No updates took place so check to see if we can fill the empty app slots
|
|
ELIF g_bPopulateEmptyAppSlots
|
|
iFreeSlots = 0
|
|
iFirstFreeSlot = -1
|
|
FOR i = 0 TO MAX_MP_VEHICLE_APP_CAN_HANDLE-1
|
|
IF g_savedMPGlobalsNew.g_savedMPGlobals[GET_SAVE_GAME_ARRAY_SLOT()].MpSavedCarApp.iSlotPriority[i] = 0
|
|
IF iFirstFreeSlot = -1
|
|
iFirstFreeSlot = i
|
|
ENDIF
|
|
iFreeSlots++
|
|
ENDIF
|
|
ENDFOR
|
|
//CPRINTLN(DEBUG_SOCIAL,"DO_MAINTAIN_LAST_USED_SAVED_VEHICLES - iFreeSlots = ", iFreeSlots)
|
|
|
|
IF iFreeSlots > 0
|
|
|
|
iSavedVehicles = 0
|
|
FOR i = 0 TO MAX_MP_SAVED_VEHICLES-1
|
|
IF GET_CAR_APP_SLOT_FOR_SAVE_VEHICLE(i, j)
|
|
AND g_MpSavedVehicles[i].vehicleSetupMP.VehicleSetup.eModel != DUMMY_MODEL_FOR_SCRIPT
|
|
AND (NOT IS_BIT_SET(g_MpSavedVehicles[i].iVehicleBS,MP_SAVED_VEHICLE_DESTROYED) OR IS_BIT_SET(g_MpSavedVehicles[i].iVehicleBS,MP_SAVED_VEHICLE_INSURED))
|
|
AND IS_VEHICLE_MODEL_SAFE_FOR_CARAPP(g_MpSavedVehicles[i].vehicleSetupMP.VehicleSetup.eModel)
|
|
iSavedVehicles++
|
|
ENDIF
|
|
IF iSavedVehicles > (MAX_MP_VEHICLE_APP_CAN_HANDLE-iFreeSlots)
|
|
BREAKLOOP
|
|
ENDIF
|
|
ENDFOR
|
|
//CPRINTLN(DEBUG_SOCIAL,"DO_MAINTAIN_LAST_USED_SAVED_VEHICLES - iSavedVehicles = ", iSavedVehicles)
|
|
|
|
IF iSavedVehicles > (MAX_MP_VEHICLE_APP_CAN_HANDLE-iFreeSlots)
|
|
CPRINTLN(DEBUG_SOCIAL,"DO_MAINTAIN_LAST_USED_SAVED_VEHICLES - We have a space to store a vehicle! iFreeSlots=", iFreeSlots, ", iSavedVehicles=", iSavedVehicles)
|
|
|
|
FOR i = 0 TO MAX_MP_SAVED_VEHICLES-1
|
|
IF GET_CAR_APP_SLOT_FOR_SAVE_VEHICLE(i, j)
|
|
AND g_MpSavedVehicles[i].vehicleSetupMP.VehicleSetup.eModel != DUMMY_MODEL_FOR_SCRIPT
|
|
AND (NOT IS_BIT_SET(g_MpSavedVehicles[i].iVehicleBS,MP_SAVED_VEHICLE_DESTROYED) OR IS_BIT_SET(g_MpSavedVehicles[i].iVehicleBS,MP_SAVED_VEHICLE_INSURED))
|
|
AND IS_VEHICLE_MODEL_SAFE_FOR_CARAPP(g_MpSavedVehicles[i].vehicleSetupMP.VehicleSetup.eModel)
|
|
|
|
BOOL bSlotDefined
|
|
bSlotDefined = FALSE
|
|
|
|
// Check to see if we already have a slot defined for this vehicle
|
|
REPEAT MAX_MP_VEHICLE_APP_CAN_HANDLE j
|
|
IF g_savedMPGlobalsNew.g_savedMPGlobals[GET_SAVE_GAME_ARRAY_SLOT()].MpSavedCarApp.iProcessSlot[j] = (i+1)
|
|
bSlotDefined = TRUE
|
|
j = MAX_MP_VEHICLE_APP_CAN_HANDLE+1 // Bail
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
IF NOT bSlotDefined
|
|
iVehUpdate = i // Use this vehicle
|
|
i = MAX_MP_SAVED_VEHICLES+1 // Bail
|
|
ENDIF
|
|
ENDIF
|
|
ENDFOR
|
|
|
|
IF iVehUpdate != -1
|
|
// Find the vehicle slot we used with this priority
|
|
REPEAT MAX_MP_VEHICLE_APP_CAN_HANDLE i
|
|
IF g_savedMPGlobalsNew.g_savedMPGlobals[GET_SAVE_GAME_ARRAY_SLOT()].MpSavedCarApp.iProcessSlot[i] = g_savedMPGlobalsNew.g_savedMPGlobals[GET_SAVE_GAME_ARRAY_SLOT()].MpSavedCarApp.iSlotPriority[iFirstFreeSlot]
|
|
g_savedMPGlobalsNew.g_savedMPGlobals[GET_SAVE_GAME_ARRAY_SLOT()].MpSavedCarApp.iProcessSlot[i] = (iVehUpdate+1)
|
|
CPRINTLN(DEBUG_SOCIAL,"...Vehicle ", iVehUpdate, " now stored in app slot ", i)
|
|
i = MAX_MP_VEHICLE_APP_CAN_HANDLE+1// Bail
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
// Update the priorities
|
|
g_savedMPGlobalsNew.g_savedMPGlobals[GET_SAVE_GAME_ARRAY_SLOT()].MpSavedCarApp.iSlotPriority[iFirstFreeSlot] = (iVehUpdate+1)
|
|
#IF IS_DEBUG_BUILD
|
|
IF IS_MODEL_IN_CDIMAGE(g_MpSavedVehicles[iVehUpdate].vehicleSetupMP.VehicleSetup.eModel)
|
|
CPRINTLN(DEBUG_SOCIAL,"...priority slot[", iFirstFreeSlot, "] Vehicle ", g_savedMPGlobalsNew.g_savedMPGlobals[GET_SAVE_GAME_ARRAY_SLOT()].MpSavedCarApp.iSlotPriority[iFirstFreeSlot]-1, " = ", GET_DISPLAY_NAME_FROM_VEHICLE_MODEL(g_MpSavedVehicles[iVehUpdate].vehicleSetupMP.VehicleSetup.eModel))
|
|
ELSE
|
|
CPRINTLN(DEBUG_SOCIAL,"...priority slot[", iFirstFreeSlot, "] Vehicle ", g_savedMPGlobalsNew.g_savedMPGlobals[GET_SAVE_GAME_ARRAY_SLOT()].MpSavedCarApp.iSlotPriority[iFirstFreeSlot]-1, " = ", g_MpSavedVehicles[iVehUpdate].vehicleSetupMP.VehicleSetup.eModel)
|
|
ENDIF
|
|
#ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDIF
|
|
iLastUsedVehiclesStage++
|
|
BREAK
|
|
|
|
DEFAULT
|
|
iLastUsedVehiclesStage++
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
IF iLastUsedVehiclesStage > g_sMPTunables.iStaggeredMaxFramesAppVehicles
|
|
iLastUsedVehiclesStage = 0
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
PROC DO_MAINTAIN_APP_DATA_RESEND()
|
|
IF NETWORK_IS_GAME_IN_PROGRESS()
|
|
AND IS_NET_PLAYER_OK(PLAYER_ID(), TRUE, TRUE)
|
|
|
|
INT iSaveGameArraySlot = GET_SAVE_GAME_ARRAY_SLOT()
|
|
|
|
IF SHOULD_RESEND_APP_DATA_FOR_CHARACTER(iSaveGameArraySlot)
|
|
|
|
CPRINTLN(DEBUG_SOCIAL,"DO_MAINTAIN_APP_DATA_RESEND - Resending app data for slot ", iSaveGameArraySlot)
|
|
|
|
INT i
|
|
INT iVehUpdate
|
|
INT iAppSlot
|
|
REPEAT MAX_MP_VEHICLE_APP_CAN_HANDLE i
|
|
iVehUpdate = g_savedMPGlobalsNew.g_savedMPGlobals[iSaveGameArraySlot].MpSavedCarApp.iSlotPriority[i]-1
|
|
|
|
CPRINTLN(DEBUG_SOCIAL,"...iVehUpdate[", i, "] = ", iVehUpdate)
|
|
|
|
IF iVehUpdate >= 0
|
|
AND g_MpSavedVehicles[iVehUpdate].vehicleSetupMP.VehicleSetup.eModel != DUMMY_MODEL_FOR_SCRIPT
|
|
AND (NOT IS_BIT_SET(g_MpSavedVehicles[iVehUpdate].iVehicleBS,MP_SAVED_VEHICLE_DESTROYED) OR IS_BIT_SET(g_MpSavedVehicles[iVehUpdate].iVehicleBS,MP_SAVED_VEHICLE_INSURED))
|
|
AND IS_VEHICLE_MODEL_SAFE_FOR_CARAPP(g_MpSavedVehicles[iVehUpdate].vehicleSetupMP.VehicleSetup.eModel)
|
|
|
|
IF GET_CAR_APP_SLOT_FOR_SAVE_VEHICLE(iVehUpdate, iAppSlot)
|
|
IF NOT IS_BIT_SET(g_MpSavedVehicles[iVehUpdate].iVehicleBS, MP_SAVED_VEHICLE_CARAPP_DELETE)
|
|
// AND g_savedMPGlobalsNew.g_savedMPGlobals[iSaveGameArraySlot].MpSavedCarApp.sCarAppData[iAppSlot].eModel = g_MpSavedVehicles[iVehUpdate].vehicleSetupMP.VehicleSetup.eModel
|
|
SET_BIT(g_MpSavedVehicles[iVehUpdate].iVehicleBS, MP_SAVED_VEHICLE_CARAPP_SEND)
|
|
CPRINTLN(DEBUG_SOCIAL,"DO_MAINTAIN_APP_DATA_RESEND - resending vehicle, saved_slot=", iVehUpdate, ", app_slot=", iAppSlot)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
g_savedMPGlobalsNew.g_savedMPGlobals[iSaveGameArraySlot].MpSavedCarApp.bMultiplayerDataWiped = FALSE
|
|
|
|
RESEND_APP_DATA_FOR_CHARACTER(iSaveGameArraySlot, FALSE)
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// PURPOSE: Do the main processing here
|
|
PROC DO_APP_PROCESSING()
|
|
|
|
IF NETWORK_IS_GAME_IN_PROGRESS()
|
|
AND IS_PLAYER_IN_BUSINESS_HUB(PLAYER_ID())
|
|
EXIT
|
|
ENDIF
|
|
|
|
// #IF IS_DEBUG_BUILD
|
|
// bFetchingData = FALSE
|
|
// #ENDIF
|
|
|
|
// Do not try to delete data if we in the process of sending mod unlocks.
|
|
IF iModUnlockStage = 0
|
|
|
|
DO_PROCESS_DELETE_DATA()
|
|
|
|
// Dont do any processing if we are deleting the car data
|
|
IF bDeletingCarData
|
|
EXIT
|
|
ENDIF
|
|
|
|
DO_PROCESS_DELETE_ALL_DATA_FOR_NEW_ACCOUNT()
|
|
ENDIF
|
|
|
|
DO_PROCESS_MOD_UNLOCKS()
|
|
|
|
// Dont do any processing if we are sending new mod data
|
|
IF bProcessModUnlocks
|
|
EXIT
|
|
ENDIF
|
|
|
|
DO_MAINTAIN_LAST_USED_SAVED_VEHICLES()
|
|
DO_MAINTAIN_APP_DATA_RESEND()
|
|
|
|
// Update the frame that we are processing
|
|
BOOL bBlocked = bBlockFrameUpdate
|
|
BOOL bAllowSave = (iCurrentAppFrame = 0 AND NOT bProcessModUnlocks AND NOT bDeletingCarData)
|
|
IF bBlockFrameUpdate
|
|
bBlockFrameUpdate = FALSE
|
|
ELSE
|
|
iCurrentAppFrame = (iCurrentAppFrame+1) % g_sMPTunables.iStaggeredMaxFramesAppOrders
|
|
ENDIF
|
|
|
|
IF NETWORK_IS_GAME_IN_PROGRESS()
|
|
|
|
IF iCurrentAppFrame < (MAX_MP_VEHICLE_APP_CAN_HANDLE*2) // 2 pass: 0=priority, 1=cleanup
|
|
IF NOT bBlocked
|
|
iMPVehicleBlock++
|
|
IF iMPVehicleBlock >= MAX_MP_VEHICLE_APP_CAN_HANDLE
|
|
iMPVehicleBlock = 0
|
|
bPriorityUpdate = !bPriorityUpdate
|
|
ENDIF
|
|
ENDIF
|
|
|
|
iMPSavedVehicleSlot = (g_savedMPGlobalsNew.g_savedMPGlobals[GET_SAVE_GAME_ARRAY_SLOT()].MpSavedCarApp.iProcessSlot[iMPVehicleBlock]-1)
|
|
|
|
IF bPriorityUpdate
|
|
IF GET_CAR_APP_SLOT_FOR_SAVE_VEHICLE(iMPSavedVehicleSlot, iMPCarAppSlot)
|
|
DO_PROCESS_CAR_APP(CHAR_MULTIPLAYER)
|
|
ENDIF
|
|
ELSE
|
|
// If this slot is not used as one of the priority vehicles, hide
|
|
IF g_savedMPGlobalsNew.g_savedMPGlobals[GET_SAVE_GAME_ARRAY_SLOT()].MpSavedCarApp.iProcessSlot[iMPVehicleBlock] = 0
|
|
DO_HIDE_VEHICLE_SLOT_IN_APP(iMPVehicleBlock)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
SWITCH iCurrentAppFrame
|
|
CASE 0 DO_PROCESS_CAR_APP(CHAR_MICHAEL) BREAK
|
|
CASE 1 DO_PROCESS_CAR_APP(CHAR_FRANKLIN) BREAK
|
|
CASE 2 DO_PROCESS_CAR_APP(CHAR_TREVOR) BREAK
|
|
CASE 3 DO_PROCESS_DOG_APP() BREAK
|
|
ENDSWITCH
|
|
ENDIF
|
|
|
|
IF bAllowSave
|
|
IF bSaveCarData
|
|
IF TIMERA() > 5000
|
|
CPRINTLN(DEBUG_SOCIAL,"social_controller: DO_PROCESS_CAR_APP - saving car data")
|
|
APP_SET_APP("car")
|
|
APP_SAVE_DATA()
|
|
APP_CLOSE_APP()
|
|
bSaveCarData = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// PURPOSE: Check to see if the players last vehicle has a profance license plate.
|
|
PROC DO_PROFANITY_CHECKS()
|
|
IF NOT bProcessedProfanityChecks
|
|
IF SC_PROFANITY_GET_CHECK_IS_VALID(iAmbProfanityToken)
|
|
IF NOT SC_PROFANITY_GET_CHECK_IS_PENDING(iAmbProfanityToken)
|
|
IF SC_PROFANITY_GET_STRING_PASSED(iAmbProfanityToken)
|
|
iAmbProfanityToken = 0
|
|
bProcessedProfanityChecks = TRUE
|
|
CPRINTLN(DEBUG_SOCIAL,"DO_PROFANITY_CHECKS - End: passed")
|
|
ELSE
|
|
CPRINTLN(DEBUG_SOCIAL,"DO_PROFANITY_CHECKS - End: failed")
|
|
IF NETWORK_IS_GAME_IN_PROGRESS()
|
|
g_savedMPGlobalsNew.g_savedMPGlobals[GET_SAVE_GAME_ARRAY_SLOT()].MpSavedCarApp.tlCarAppPlateText = GENERATE_RANDOM_NUMBER_PLATE()
|
|
CPRINTLN(DEBUG_SOCIAL,"DO_PROFANITY_CHECKS - Change: plate = ", g_savedMPGlobalsNew.g_savedMPGlobals[GET_SAVE_GAME_ARRAY_SLOT()].MpSavedCarApp.tlCarAppPlateText)
|
|
ELSE
|
|
g_savedGlobals.sSocialData.tlCarAppPlateText = GENERATE_RANDOM_NUMBER_PLATE()
|
|
CPRINTLN(DEBUG_SOCIAL,"DO_PROFANITY_CHECKS - Change: plate = ", g_savedGlobals.sSocialData.tlCarAppPlateText)
|
|
ENDIF
|
|
iAmbProfanityToken = 0
|
|
bProcessedProfanityChecks = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF GET_CAR_APP_NUMBER_PLATE(tlProfanityPlate, iProfanityPlateBack)
|
|
SC_PROFANITY_CHECK_STRING(tlProfanityPlate, iAmbProfanityToken)
|
|
CPRINTLN(DEBUG_SOCIAL,"DO_PROFANITY_CHECKS - Start: token = ", iAmbProfanityToken)
|
|
ELSE
|
|
CPRINTLN(DEBUG_SOCIAL,"DO_PROFANITY_CHECKS - End: no stored plate")
|
|
iAmbProfanityToken = 0
|
|
bProcessedProfanityChecks = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
PROC Maintain_QualPlaylistReminder() //Can't edit header file. Needs to be here. For TODO 1562725
|
|
|
|
IF NOT HAS_NET_TIMER_STARTED(QualPlaylistTimer)
|
|
START_NET_TIMER(QualPlaylistTimer)
|
|
ELIF HAS_NET_TIMER_EXPIRED(QualPlaylistTimer, (120 * 60000)) //Change this to two hours after testing...
|
|
|
|
IF IS_EVENT_PLAYLIST_ACTIVE_BY_TYPE(ciQUALIFING_TOURNAMENT_PLAYLIST)
|
|
|
|
|
|
//SCRIPT_TIMER iLocalGarageCheck
|
|
|
|
//Two hour timer has expired. Make checks for free-roam and playlist
|
|
IF HAS_PLAYER_COMPLETED_RACE_AND_DM_TUTORIAL(PLAYER_ID())
|
|
|
|
IF NOT IS_TRANSITION_ACTIVE() // B*1663140 - stop messages appearing on the transition screen.
|
|
|
|
//IF CAN_DO_QUICK_MATCH(iLocalGarageCheck) = 0 //Zero is "Okay" result.
|
|
|
|
|
|
RESET_NET_TIMER(QualPlaylistTimer)
|
|
|
|
//Steve T. 1562725
|
|
BEGIN_TEXT_COMMAND_THEFEED_POST ("SC_PLAY_REM")
|
|
|
|
#if IS_DEBUG_BUILD
|
|
|
|
cdPrintnl()
|
|
cdPrintstring("SOCIAL_CONTROLLER - Displayed qualifying playlist reminder SC_PLAY_REM")
|
|
cdPrintnl()
|
|
|
|
#endif
|
|
|
|
/* Alternatively
|
|
TEXT_LABEL_63 s_MPGamerTagTempHolder
|
|
|
|
//Grab player name and apply prefix and suffix for displaying the sender name with the condensed font.
|
|
|
|
s_MPGamerTagTempHolder += "~HUD_COLOUR_SOCIAL_CLUB~"
|
|
s_MPGamerTagTempHolder += "Social Club"
|
|
s_MPGamerTagTempHolder += "~HUD_COLOUR_SOCIAL_CLUB~"
|
|
|
|
ND_TEXT_COMMAND_THEFEED_POST_MESSAGETEXT ("CHAR_SOCIAL_CLUB", "CHAR_SOCIAL_CLUB", FALSE, TEXT_ICON_BLANK, s_MPGamerTagTempHolder)
|
|
|
|
*/
|
|
|
|
|
|
//END_TEXT_COMMAND_THEFEED_POST_MESSAGETEXT ("CHAR_SOCIAL_CLUB", "CHAR_SOCIAL_CLUB", FALSE, TEXT_ICON_BLANK, "CONTENT_TICK")
|
|
|
|
|
|
|
|
END_TEXT_COMMAND_THEFEED_POST_TICKER(FALSE, TRUE)
|
|
|
|
|
|
//ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
|
|
ENDIF
|
|
|
|
|
|
ENDPROC
|
|
|
|
#IF USE_MULTI_NUMBER_PLATE_SETUP_IN_MP
|
|
|
|
INT iPurchasedPlatesStage
|
|
INT iPurchasedPlateIndex
|
|
INT iPurchasedPlateToken
|
|
|
|
PROC GET_ARRAY_OF_PLATE_DATA_FLAGS(STRING sPlateData, TEXT_LABEL_31 &tlPlateFlags[10])
|
|
INT iStrLen = 0
|
|
IF NOT IS_STRING_NULL_OR_EMPTY(sPlateData)
|
|
iStrLen = GET_LENGTH_OF_LITERAL_STRING(sPlateData)
|
|
ENDIF
|
|
|
|
INT iCurrentChar
|
|
TEXT_LABEL_7 tlCurrentChar
|
|
TEXT_LABEL_31 tlCurrentFlag = ""
|
|
BOOL bProcessingFlags = (iStrLen != 0)
|
|
|
|
INT iFlagIndex
|
|
|
|
INT i
|
|
REPEAT COUNT_OF(tlPlateFlags) i
|
|
tlPlateFlags[i] = ""
|
|
ENDREPEAT
|
|
|
|
// Query each character to build up the flag bitset
|
|
WHILE bProcessingFlags
|
|
tlCurrentChar = GET_CHARACTER_FROM_AUDIO_CONVERSATION_FILENAME(sPlateData, iCurrentChar, iCurrentChar+1)
|
|
|
|
iCurrentChar++
|
|
|
|
// Reached end of flag
|
|
IF GET_HASH_KEY(tlCurrentChar) = HASH(",")
|
|
OR iCurrentChar >= iStrLen
|
|
|
|
// If we have hit the end, make sure we add the last character
|
|
IF GET_HASH_KEY(tlCurrentChar) != HASH(",")
|
|
tlCurrentFlag += tlCurrentChar
|
|
ENDIF
|
|
|
|
IF iFlagIndex < COUNT_OF(tlPlateFlags)
|
|
tlPlateFlags[iFlagIndex] = tlCurrentFlag
|
|
iFlagIndex++
|
|
ENDIF
|
|
|
|
tlCurrentFlag = ""
|
|
ELSE
|
|
tlCurrentFlag += tlCurrentChar
|
|
ENDIF
|
|
|
|
// Reached end of string
|
|
IF iCurrentChar >= iStrLen
|
|
bProcessingFlags = FALSE
|
|
ENDIF
|
|
ENDWHILE
|
|
ENDPROC
|
|
|
|
FUNC BOOL HAS_PLATE_DATA_GOT_FLAG_SET(STRING sPlateData, STRING sFlag)
|
|
// Grab list of current flags
|
|
TEXT_LABEL_31 tlPlateFlags[10]
|
|
GET_ARRAY_OF_PLATE_DATA_FLAGS(sPlateData, tlPlateFlags)
|
|
|
|
// Cycle through list and see if any match the flag passed in
|
|
INT iPlate
|
|
INT iFlagHash = GET_HASH_KEY(sFlag)
|
|
REPEAT COUNT_OF(tlPlateFlags) iPlate
|
|
IF NOT IS_STRING_NULL_OR_EMPTY(tlPlateFlags[iPlate])
|
|
IF GET_HASH_KEY(tlPlateFlags[iPlate]) = iFlagHash
|
|
RETURN TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
PROC MAINTAIN_PURCHASED_PLATES_UPDATE_FLAG(TEXT_LABEL_63 &tlPlateData, STRING sFlag, BOOL bSet)
|
|
|
|
//NATIVE FUNC STRING SC_LICENSEPLATE_GET_PLATE_DATA(INT token, INT index)
|
|
|
|
//PLATE_DATA_GIFTED_PLATE = 1 // == �NoDelete� string
|
|
//PLATE_DATA_SPPLATE = 2 // == �SPPlate� string
|
|
|
|
//NATIVE FUNC BOOL SC_LICENSEPLATE_SET_PLATE_DATA(STRING oldPlateText, STRING newPlateText, INT bitfield)
|
|
|
|
PRINTLN("MAINTAIN_PURCHASED_PLATES_UPDATE_FLAG")
|
|
PRINTLN("...tlPlateData = '", tlPlateData, "'")
|
|
IF bSet
|
|
PRINTLN("...add '", sFlag, "'")
|
|
ELSE
|
|
PRINTLN("...remove '", sFlag, "'")
|
|
ENDIF
|
|
|
|
// Grab list of current flags
|
|
TEXT_LABEL_31 tlPlateFlags[10]
|
|
GET_ARRAY_OF_PLATE_DATA_FLAGS(tlPlateData, tlPlateFlags)
|
|
|
|
// Cycle through list and add all flags except the one passed in to this proc
|
|
tlPlateData = ""
|
|
|
|
INT iPlate
|
|
INT iFlagHash = GET_HASH_KEY(sFlag)
|
|
INT iPlateFlagHash
|
|
BOOL bAddComma
|
|
REPEAT COUNT_OF(tlPlateFlags) iPlate
|
|
IF NOT IS_STRING_NULL_OR_EMPTY(tlPlateFlags[iPlate])
|
|
iPlateFlagHash = GET_HASH_KEY(tlPlateFlags[iPlate])
|
|
IF iPlateFlagHash != iFlagHash
|
|
IF bAddComma
|
|
tlPlateData += ","
|
|
bAddComma = FALSE
|
|
ENDIF
|
|
tlPlateData += tlPlateFlags[iPlate]
|
|
bAddComma = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
// Now add the flag passed in if required
|
|
IF bSet
|
|
IF bAddComma
|
|
tlPlateData += ","
|
|
bAddComma = FALSE
|
|
ENDIF
|
|
tlPlateData += sFlag
|
|
bAddComma = TRUE
|
|
ENDIF
|
|
|
|
PRINTLN("...Return string = '", tlPlateData, "'")
|
|
ENDPROC
|
|
|
|
PROC MAINTAIN_PURCHASED_PLATES_LIST()
|
|
IF g_bRebuildSCPlateList
|
|
AND NOT bRebuildPlatesList
|
|
bRebuildPlatesList = TRUE
|
|
g_bRebuildSCPlateList = FALSE
|
|
ENDIF
|
|
|
|
IF bRebuildPlatesList
|
|
AND iPurchasedPlatesStage = 0
|
|
AND NOT bProcessModUnlocks
|
|
AND NOT g_sMPTunables.bDisable_SC_Number_Plate_Get
|
|
AND eStage != SOCIAL_STAGE_INIT
|
|
|
|
// Check if we have ever ordered a plate.
|
|
INT iOrderedPlateCount = 0
|
|
|
|
APP_SET_APP("car")
|
|
APP_SET_BLOCK("appdata")
|
|
iOrderedPlateCount += APP_GET_INT_DATA("orderCount_sp0")
|
|
iOrderedPlateCount += APP_GET_INT_DATA("orderCount_sp1")
|
|
iOrderedPlateCount += APP_GET_INT_DATA("orderCount_sp2")
|
|
iOrderedPlateCount += APP_GET_INT_DATA("orderCount_mp0")
|
|
iOrderedPlateCount += APP_GET_INT_DATA("orderCount_mp1")
|
|
iOrderedPlateCount += APP_GET_INT_DATA("orderCount_mp2")
|
|
iOrderedPlateCount += APP_GET_INT_DATA("orderCount_mp3")
|
|
iOrderedPlateCount += APP_GET_INT_DATA("orderCount_mp4")
|
|
APP_CLOSE_BLOCK()
|
|
APP_CLOSE_APP()
|
|
|
|
iOrderedPlateCount = iOrderedPlateCount
|
|
|
|
IF SC_LICENSEPLATE_GET_CHECK_IS_VALID(iPurchasedPlateToken)
|
|
IF NOT SC_LICENSEPLATE_GET_CHECK_IS_PENDING(iPurchasedPlateToken)
|
|
|
|
CPRINTLN(DEBUG_SOCIAL,"[PURCHASED PLATES] MAINTAIN_PURCHASED_PLATES_LIST - Building list of plates")
|
|
|
|
INT iPlate
|
|
INT iPlateCount = COUNT_OF(g_tlPlateTextFromSCAccount)
|
|
REPEAT iPlateCount iPlate
|
|
g_tlPlateTextFromSCAccount[iPlate] = ""
|
|
g_bPlateTextFromSCAccountInMPList[iPlate] = FALSE
|
|
ENDREPEAT
|
|
|
|
iPlateCount = SC_LICENSEPLATE_GET_COUNT(iPurchasedPlateToken)
|
|
|
|
PRINTLN("...iPlateCount = ", iPlateCount)
|
|
PRINTLN("...iOrderedPlateCount = ", iOrderedPlateCount)
|
|
|
|
g_bPlateCountOnSCAccountFull = (iPlateCount >= COUNT_OF(g_tlPlateTextFromSCAccount))
|
|
PRINTLN("...g_bPlateCountOnSCAccountFull = ", g_bPlateCountOnSCAccountFull)
|
|
|
|
TEXT_LABEL_63 tlPlateData
|
|
|
|
// IF iPlateCount > 1 OR iOrderedPlateCount > 0
|
|
REPEAT iPlateCount iPlate
|
|
IF iPlate < COUNT_OF(g_tlPlateTextFromSCAccount)
|
|
g_tlPlateTextFromSCAccount[iPlate] = SC_LICENSEPLATE_GET_PLATE(iPurchasedPlateToken, iPlate)
|
|
|
|
tlPlateData = SC_LICENSEPLATE_GET_PLATE_DATA(iPurchasedPlateToken, iPlate)
|
|
IF HAS_PLATE_DATA_GOT_FLAG_SET(tlPlateData, "MPPlate")
|
|
OR HAS_PLATE_DATA_GOT_FLAG_SET(tlPlateData, "NoDelete")
|
|
OR iPlate = 0
|
|
g_bPlateTextFromSCAccountInMPList[iPlate] = TRUE
|
|
ENDIF
|
|
|
|
PRINTLN("...Added '", g_tlPlateTextFromSCAccount[iPlate], "' plateData = ", tlPlateData)
|
|
ELSE
|
|
PRINTLN("...Skipped '", SC_LICENSEPLATE_GET_PLATE(iPurchasedPlateToken, iPlate), "'")
|
|
ENDIF
|
|
ENDREPEAT
|
|
// ENDIF
|
|
|
|
// Done processing so clear token and check
|
|
iPurchasedPlateToken = 0
|
|
bRebuildPlatesList = FALSE
|
|
|
|
g_bInitialSCPlateListGrabbedMP = TRUE
|
|
ENDIF
|
|
ELSE
|
|
SC_LICENSEPLATE_CHECK_STRING("TEST", iPurchasedPlateToken)
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
BOOL bPlateQueueTimerSet
|
|
TIME_DATATYPE tdPlateQueueTimer
|
|
INT iArrayOfPlateDigits[8]
|
|
|
|
PROC MAINTAIN_PURCHASED_PLATES_ADD()
|
|
|
|
// The purpose of this proc is to take the queued plates and add them to the players social club account.
|
|
// If the player buys this in MP then we need to set a flag on the plateData field so that the iFruit app
|
|
// knows that the player has paid for it.
|
|
// We store the MP plate characters in packed stats so that we can retry failed attempts. Once we have
|
|
// successfully added a plate and the MPPlate flag to the plateData we then clear the packed stats.
|
|
|
|
SWITCH iPurchasedPlatesStage
|
|
CASE 0
|
|
IF g_bAddPlateTextToSC
|
|
AND NOT bRebuildPlatesList
|
|
AND NOT g_sMPTunables.bDisable_SC_Number_Plate_Add
|
|
|
|
INT iPlate
|
|
iPurchasedPlateIndex = -1
|
|
REPEAT COUNT_OF(g_tlPlateTextForSCAccount) iPlate
|
|
IF NOT IS_STRING_NULL_OR_EMPTY(g_tlPlateTextForSCAccount[iPlate])
|
|
iPurchasedPlateIndex = iPlate
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
IF iPurchasedPlateIndex != -1
|
|
CPRINTLN(DEBUG_SOCIAL,"[PURCHASED PLATES] Attempting to add plate '", g_tlPlateTextForSCAccount[iPurchasedPlateIndex], "' with hash ", GET_HASH_KEY(g_tlPlateTextForSCAccount[iPurchasedPlateIndex]))
|
|
iPurchasedPlatesStage++
|
|
ELSE
|
|
CPRINTLN(DEBUG_SOCIAL,"[PURCHASED PLATES] No plates in queue, end.")
|
|
g_bAddPlateTextToSC = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// If we are not adding any plates do a check to see if we have one that was stored and never added to SC.
|
|
IF NOT g_bAddPlateTextToSC
|
|
AND NETWORK_IS_GAME_IN_PROGRESS()
|
|
AND GET_PACKED_STAT_BOOL(PACKED_MP_STAT_SC_PLATE_STORED)
|
|
AND (NOT bPlateQueueTimerSet OR ABSI(GET_TIME_DIFFERENCE(GET_NETWORK_TIME(), tdPlateQueueTimer)) > 25000)
|
|
|
|
TEXT_LABEL_15 tlNumberPlate
|
|
iArrayOfPlateDigits[0] = GET_PACKED_STAT_INT(PACKED_MP_SC_PLATE_0)
|
|
iArrayOfPlateDigits[1] = GET_PACKED_STAT_INT(PACKED_MP_SC_PLATE_1)
|
|
iArrayOfPlateDigits[2] = GET_PACKED_STAT_INT(PACKED_MP_SC_PLATE_2)
|
|
iArrayOfPlateDigits[3] = GET_PACKED_STAT_INT(PACKED_MP_SC_PLATE_3)
|
|
iArrayOfPlateDigits[4] = GET_PACKED_STAT_INT(PACKED_MP_SC_PLATE_4)
|
|
iArrayOfPlateDigits[5] = GET_PACKED_STAT_INT(PACKED_MP_SC_PLATE_5)
|
|
iArrayOfPlateDigits[6] = GET_PACKED_STAT_INT(PACKED_MP_SC_PLATE_6)
|
|
iArrayOfPlateDigits[7] = GET_PACKED_STAT_INT(PACKED_MP_SC_PLATE_7)
|
|
|
|
GET_VEHICLE_NUMBER_PLATE_FROM_INTS(tlNumberPlate, iArrayOfPlateDigits)
|
|
PRINTLN("[PURCHASED PLATES] Plate stored in MP stats '", tlNumberPlate, "'")
|
|
|
|
ADD_NUMBER_PLATE_TEXT_TO_PLAYERS_SC_ACCOUNT(tlNumberPlate)
|
|
|
|
bPlateQueueTimerSet = FALSE
|
|
ENDIF
|
|
BREAK
|
|
CASE 1
|
|
IF iPurchasedPlateToken = 0
|
|
SC_LICENSEPLATE_ISVALID(g_tlPlateTextForSCAccount[iPurchasedPlateIndex], iPurchasedPlateToken)
|
|
ELIF NOT SC_LICENSEPLATE_GET_ISVALID_IS_PENDING(iPurchasedPlateToken)
|
|
SWITCH SC_LICENSEPLATE_GET_ISVALID_STATUS(iPurchasedPlateToken)
|
|
CASE LICENSEPLATE_ISVALID_OK
|
|
CPRINTLN(DEBUG_SOCIAL,"[PURCHASED PLATES] Plate passed valid checks")
|
|
|
|
// Check if we already have the plate
|
|
INT iPlateCount
|
|
INT iPlate
|
|
BOOL bAlreadyExists
|
|
|
|
bAlreadyExists = FALSE
|
|
iPlateCount = COUNT_OF(g_tlPlateTextFromSCAccount)
|
|
|
|
CPRINTLN(DEBUG_SOCIAL,"[PURCHASED PLATES] Checking if plate already exists")
|
|
|
|
REPEAT iPlateCount iPlate
|
|
IF NOT IS_STRING_NULL_OR_EMPTY(g_tlPlateTextFromSCAccount[iPlate])
|
|
CPRINTLN(DEBUG_SOCIAL,"...[", iPlate, "] = '", g_tlPlateTextFromSCAccount[iPlate], "' with hash ", GET_HASH_KEY(g_tlPlateTextFromSCAccount[iPlate]))
|
|
IF GET_HASH_KEY(g_tlPlateTextFromSCAccount[iPlate]) = GET_HASH_KEY(g_tlPlateTextForSCAccount[iPurchasedPlateIndex])
|
|
bAlreadyExists = TRUE
|
|
iPlate = iPlateCount+1// Bail
|
|
ENDIF
|
|
ELSE
|
|
CPRINTLN(DEBUG_SOCIAL,"...[", iPlate, "] = empty")
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
IF bAlreadyExists
|
|
// We now need to add the SP or MP flag so we know that this plate has been authorised by script
|
|
PRINTLN("[PURCHASED PLATES] Plate already exists, proceed to modify plate data")
|
|
iPurchasedPlatesStage = 3
|
|
ELSE
|
|
// We now need to add the plate
|
|
PRINTLN("[PURCHASED PLATES] Plate doesn't exist, proceed to add plate")
|
|
iPurchasedPlatesStage = 2
|
|
ENDIF
|
|
BREAK
|
|
DEFAULT
|
|
CPRINTLN(DEBUG_SOCIAL,"[PURCHASED PLATES] Plate failed valid check, status = ", SC_LICENSEPLATE_GET_ISVALID_STATUS(iPurchasedPlateToken))
|
|
|
|
g_tlPlateTextForSCAccount[iPurchasedPlateIndex] = ""
|
|
|
|
// url:bugstar:6564951 - Anomalous spike in calls to licenseplates.asmx/IsValid
|
|
IF (SC_LICENSEPLATE_GET_ISVALID_STATUS(iPurchasedPlateToken) = LICENSEPLATE_ISVALID_PROFANE)
|
|
CPRINTLN(DEBUG_SOCIAL,"[PURCHASED PLATES] Plate failed profane. clear stat and notify player")
|
|
IF NETWORK_IS_GAME_IN_PROGRESS()
|
|
SET_PACKED_STAT_BOOL(PACKED_MP_STAT_SC_PLATE_STORED, FALSE)
|
|
CPRINTLN(DEBUG_SOCIAL,"[PURCHASED PLATES] Plate failed profane. SET_PACKED_STAT_BOOL(PACKED_MP_STAT_SC_PLATE_STORED, FALSE)")
|
|
ENDIF
|
|
ENDIF
|
|
|
|
iPurchasedPlatesStage = 0 // Jump back to start and check for next plate
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
iPurchasedPlateToken = 0 // Clear the token
|
|
ENDIF
|
|
BREAK
|
|
//////////////////////////////////////////////////////////////////////////////////////
|
|
/// ADD PLATE
|
|
///
|
|
CASE 2
|
|
IF iPurchasedPlateToken = 0
|
|
|
|
TEXT_LABEL_63 tlPlateData
|
|
tlPlateData = ""
|
|
|
|
IF g_bAddSCPlateToMPList[iPurchasedPlateIndex]
|
|
// Clear SPPlate flag and set MPPlate flag
|
|
MAINTAIN_PURCHASED_PLATES_UPDATE_FLAG(tlPlateData, "SPPlate", FALSE)
|
|
MAINTAIN_PURCHASED_PLATES_UPDATE_FLAG(tlPlateData, "MPPlate", TRUE)
|
|
ELSE
|
|
// Set SPPlate flag
|
|
MAINTAIN_PURCHASED_PLATES_UPDATE_FLAG(tlPlateData, "SPPlate", TRUE)
|
|
ENDIF
|
|
|
|
SC_LICENSEPLATE_ADD(g_tlPlateTextForSCAccount[iPurchasedPlateIndex], tlPlateData, iPurchasedPlateToken)
|
|
|
|
ELIF NOT SC_LICENSEPLATE_GET_ADD_IS_PENDING(iPurchasedPlateToken)
|
|
SWITCH SC_LICENSEPLATE_GET_ADD_STATUS(iPurchasedPlateToken)
|
|
CASE LICENSEPLATE_ADD_OK
|
|
CPRINTLN(DEBUG_SOCIAL,"[PURCHASED PLATES] Plate successfully added")
|
|
|
|
// Done processsing
|
|
bRebuildPlatesList = TRUE
|
|
iPurchasedPlatesStage = 0 // Jump back to start and check for next plate
|
|
g_tlPlateTextForSCAccount[iPurchasedPlateIndex] = ""
|
|
|
|
iPurchasedPlateToken = 0 // Clear the token
|
|
|
|
IF NETWORK_IS_GAME_IN_PROGRESS()
|
|
SET_PACKED_STAT_BOOL(PACKED_MP_STAT_SC_PLATE_STORED, FALSE)
|
|
ENDIF
|
|
BREAK
|
|
DEFAULT
|
|
CPRINTLN(DEBUG_SOCIAL,"[PURCHASED PLATES] Plate failed to add, status = ", SC_LICENSEPLATE_GET_ADD_STATUS(iPurchasedPlateToken))
|
|
iPurchasedPlateToken = 0 // Clear the token
|
|
iPurchasedPlatesStage = 0 // Jump back to start and check for next plate
|
|
g_tlPlateTextForSCAccount[iPurchasedPlateIndex] = ""
|
|
|
|
// We can queue this back up later.
|
|
IF NETWORK_IS_GAME_IN_PROGRESS()
|
|
PRINTLN("[PURCHASED PLATES] Will rety MP plate in 25 seconds...")
|
|
bPlateQueueTimerSet = TRUE
|
|
tdPlateQueueTimer = GET_NETWORK_TIME()
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
iPurchasedPlateToken = 0 // Clear the token
|
|
ENDIF
|
|
BREAK
|
|
//////////////////////////////////////////////////////////////////////////////////////
|
|
/// MODIFY PLATE
|
|
///
|
|
CASE 3
|
|
// Re-grab the data since we just added a plate but use the CHECK_STRING method to get the token.
|
|
IF SC_LICENSEPLATE_GET_CHECK_IS_VALID(iPurchasedPlateToken)
|
|
IF NOT SC_LICENSEPLATE_GET_CHECK_IS_PENDING(iPurchasedPlateToken)
|
|
// Grab the plate index so we can modify the data
|
|
INT iPlateIndex
|
|
INT iPlateCount
|
|
INT iPlate
|
|
STRING sPlateText
|
|
TEXT_LABEL_63 tlPlateData
|
|
iPlateIndex = -1
|
|
iPlateCount = SC_LICENSEPLATE_GET_COUNT(iPurchasedPlateToken)
|
|
|
|
PRINTLN("[PURCHASED PLATES] Grabbing index for plate '", g_tlPlateTextForSCAccount[iPurchasedPlateIndex], "' with hash ", GET_HASH_KEY(g_tlPlateTextForSCAccount[iPurchasedPlateIndex]))
|
|
|
|
REPEAT iPlateCount iPlate
|
|
sPlateText = SC_LICENSEPLATE_GET_PLATE(iPurchasedPlateToken, iPlate)
|
|
PRINTLN("...Plate[", iPlate, "] = '", sPlateText, "'")
|
|
IF NOT IS_STRING_NULL_OR_EMPTY(sPlateText)
|
|
AND GET_HASH_KEY(sPlateText) = GET_HASH_KEY(g_tlPlateTextForSCAccount[iPurchasedPlateIndex])
|
|
iPlateIndex = iPlate
|
|
iPlate = iPlateCount+1//Bail
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
IF iPlateIndex != -1
|
|
|
|
// Grab current plate data string
|
|
tlPlateData = SC_LICENSEPLATE_GET_PLATE_DATA(iPurchasedPlateToken, iPlateIndex)
|
|
|
|
PRINTLN("[PURCHASED PLATES] Found index ", iPlateIndex, ", data = '", tlPlateData, "'")
|
|
|
|
IF g_bAddSCPlateToMPList[iPurchasedPlateIndex]
|
|
// Clear SPPlate flag and set MPPlate flag
|
|
MAINTAIN_PURCHASED_PLATES_UPDATE_FLAG(tlPlateData, "SPPlate", FALSE)
|
|
MAINTAIN_PURCHASED_PLATES_UPDATE_FLAG(tlPlateData, "MPPlate", TRUE)
|
|
|
|
ELIF NOT HAS_PLATE_DATA_GOT_FLAG_SET(tlPlateData, "MPPlate")
|
|
// Set SPPlate flag
|
|
MAINTAIN_PURCHASED_PLATES_UPDATE_FLAG(tlPlateData, "SPPlate", TRUE)
|
|
ENDIF
|
|
|
|
// Now push to backend.
|
|
SC_LICENSEPLATE_SET_PLATE_DATA(sPlateText, sPlateText, tlPlateData)
|
|
|
|
IF NETWORK_IS_GAME_IN_PROGRESS()
|
|
SET_PACKED_STAT_BOOL(PACKED_MP_STAT_SC_PLATE_STORED, FALSE)
|
|
ENDIF
|
|
ELSE
|
|
PRINTLN("[PURCHASED PLATES] Failed to find plate index")
|
|
|
|
// We can queue this back up later.
|
|
IF NETWORK_IS_GAME_IN_PROGRESS()
|
|
PRINTLN("[PURCHASED PLATES] Will rety MP plate in 25 seconds...")
|
|
bPlateQueueTimerSet = TRUE
|
|
tdPlateQueueTimer = GET_NETWORK_TIME()
|
|
ENDIF
|
|
ENDIF
|
|
|
|
bRebuildPlatesList = TRUE
|
|
iPurchasedPlatesStage = 0 // Jump back to start and check for next plate
|
|
g_tlPlateTextForSCAccount[iPurchasedPlateIndex] = ""
|
|
|
|
iPurchasedPlateToken = 0 // Clear the token
|
|
ENDIF
|
|
ELSE
|
|
SC_LICENSEPLATE_CHECK_STRING("TEST", iPurchasedPlateToken)
|
|
ENDIF
|
|
BREAK
|
|
ENDSWITCH
|
|
ENDPROC
|
|
|
|
#ENDIF
|
|
|
|
PROC MAINTAIN_INVALID_TRANSACTION_CHECK()
|
|
IF NETWORK_IS_GAME_IN_PROGRESS()
|
|
AND g_bKickPlayerForInvalidTransaction
|
|
#IF IS_DEBUG_BUILD
|
|
AND NOT GET_COMMANDLINE_PARAM_EXISTS("sc_SkipTransactionValidation")
|
|
#ENDIF
|
|
SCRIPT_ASSERT("MAINTAIN_INVALID_TRANSACTION_CHECK - Invalid transaction data - kicking player")
|
|
PRINTLN("MAINTAIN_INVALID_TRANSACTION_CHECK - Invalid transaction data - kicking player")
|
|
NETWORK_BAIL(ENUM_TO_INT(NETWORK_BAIL_INVALID_TRANSACTION_DETECTED))
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
SCRIPT
|
|
|
|
PRINTSTRING("\nStarting social controller")PRINTNL()
|
|
|
|
// This script needs to cleanup only when the game runs the magdemo
|
|
IF (HAS_FORCE_CLEANUP_OCCURRED(FORCE_CLEANUP_FLAG_MAGDEMO))
|
|
PRINTSTRING("...social_controller.sc has been forced to cleanup (MAGDEMO)")
|
|
PRINTNL()
|
|
|
|
TERMINATE_THIS_THREAD()
|
|
ENDIF
|
|
|
|
NETWORK_SET_SCRIPT_IS_SAFE_FOR_NETWORK_GAME()
|
|
|
|
// Setup some debug widgets
|
|
#IF IS_DEBUG_BUILD
|
|
SETUP_SOCIAL_CONTROL_WIDGETS()
|
|
#ENDIF
|
|
|
|
iInitialOrderCheckTimer = GET_GAME_TIMER()
|
|
|
|
SETTIMERA(0)
|
|
SETTIMERB(0)
|
|
|
|
// Main loop
|
|
WHILE (TRUE)
|
|
|
|
WAIT(0)
|
|
|
|
IF IS_PLAYING_DLC_INTRO_BINK()
|
|
PRINTSTRING("social controller suspended, bink video playing")
|
|
|
|
ELSE
|
|
|
|
#IF IS_DEBUG_BUILD
|
|
MAINTAIN_SOCIAL_CONTROL_WIDGETS()
|
|
#ENDIF
|
|
|
|
CHECK_CONTROLLER_RESET()
|
|
|
|
MAINTAIN_TUNEABLES()
|
|
MAINTAIN_INVALID_TRANSACTION_CHECK()
|
|
|
|
SWITCH eStage
|
|
CASE SOCIAL_STAGE_INIT
|
|
DO_INITIALISE()
|
|
BREAK
|
|
CASE SOCIAL_STAGE_PROCESS
|
|
DO_APP_PROCESSING()
|
|
DO_PROFANITY_CHECKS()
|
|
MAINTAIN_SOCIAL_FEED(socialFeedVars)
|
|
#IF USE_MULTI_NUMBER_PLATE_SETUP_IN_MP
|
|
MAINTAIN_PURCHASED_PLATES_LIST()
|
|
MAINTAIN_PURCHASED_PLATES_ADD()
|
|
#ENDIF
|
|
|
|
IF NETWORK_IS_GAME_IN_PROGRESS()
|
|
Maintain_QualPlaylistReminder()
|
|
ENDIF
|
|
|
|
BREAK
|
|
CASE SOCIAL_STAGE_CLEANUP
|
|
Script_Cleanup()
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
ENDIF
|
|
ENDWHILE
|
|
|
|
ENDSCRIPT
|