////////////////////////////////////////////////////////////////////////////////////////// // // // 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