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

4817 lines
201 KiB
Python
Executable File

//////////////////////////////////////////////////////////////////////////////////////////
// //
// SCRIPT NAME : player_controller.sc //
// AUTHOR : Kenneth Ross & Alwyn Roberts //
// DESCRIPTION : Initialises the global data for each player character. //
// Keeps track of all the player data such as weapons, health, //
// armour, last time active, and last known coords. //
// //
//////////////////////////////////////////////////////////////////////////////////////////
//Compile out Title Update changes to header functions.
//Must be before includes.
//CONST_INT USE_TU_CHANGES 0 // Removed by Kenneth R.
USING "rage_builtins.sch"
USING "globals.sch"
USING "player_ped_public.sch"
USING "player_ped_scenes.sch"
USING "selector_public.sch"
USING "cellphone_public.sch"
USING "stats_private.sch"
USING "commands_camera.sch"
USING "comms_control_public.sch"
USING "shop_public.sch"
USING "code_control_data_gta5.sch"
USING "beast_secret_hunt.sch"
#IF IS_DEBUG_BUILD
USING "commands_debug.sch"
//USING "player_controller_debug.sch"
#ENDIF
ENUM PLAYER_CONTROL_STAGE_ENUM
PC_STAGE_INIT = 0,
PC_STAGE_WAIT,
PC_STAGE_SWITCH,
PC_STAGE_END
ENDENUM
PLAYER_CONTROL_STAGE_ENUM eStage = PC_STAGE_INIT
//SELECTOR_SLOTS_ENUM eSelectorPed
//SELECTOR_CAM_STRUCT sSelectorCam
INT iTimeNextPlayerMissionCheck
INT iTimeNextSwitchDeniedCheck
INT iPlayerCharToCheckThisFrame = 0
INT iTimeNextGarageVehicleCheck
//BOOL bRunwayBlipsActive = TRUE
BOOL bWantedRelationshipsSet = FALSE
PED_SCENE_STRUCT sSceneData // The struct used for the new scene system
//Purposefully "hidden" in amongst this script. We want it to be hard
//for hackers to spot these scripts in decompiled output. -BenR
#IF FEATURE_SP_DLC_BEAST_SECRET
#IF NOT FEATURE_SP_DLC_BEAST_SECRET_DEBUG
BeastHuntVars sBeastHuntVars
#ENDIF
#ENDIF
// Cutscene data
BOOL bCutscenePed_VarsSet[NUM_OF_PLAYABLE_PEDS]
BOOL bCutscenePed_DataSet[NUM_OF_PLAYABLE_PEDS]
BOOL bCutsceneVeh_DataSet[NUM_OF_PLAYABLE_PEDS]
VECTOR vLastPlayerVehicleCoords[NUM_PLAYER_VEHICLE_IDS]
FLOAT fLastPlayerVehicleHeading[NUM_PLAYER_VEHICLE_IDS]
BOOL bLastPlayerVehicleInGarage[NUM_PLAYER_VEHICLE_IDS]
MODEL_NAMES eAutoOrderModel
BOOL bSendCarAppAutoProcessEmail = FALSE
BOOL bCarAppOrderFree = FALSE
BOOL bPlayerInCarInGarage = FALSE
INT iMartin1Stage
BOOL bMartin1RecordingRequested
VEHICLE_INDEX viMartin1Veh
INT iContentCheckStage
INT iContentCheckTimer
BOOL bDisplayContentFeedMessage
BOOL bDisplayContentRemovedWarning
TEXT_LABEL_31 tlContentLabel
INT iContentTickerINT
INT iProcessAmbientQueue = 0
SELECTOR_SLOTS_ENUM eAmbientPlayerSelectorChar = INT_TO_ENUM(SELECTOR_SLOTS_ENUM, 0)
INT iTempCol1, iTempCol2, iTempCol3, iTempCol4
CONST_INT iCONTENT_CHECK_0_SPECIAL_EDITION NCU_SPECIAL_EDITION
CONST_INT iCONTENT_CHECK_1_COLLECTORS_EDITION NCU_COLLECTORS_EDITION
CONST_INT iCONTENT_CHECK_2_SOCIAL_CLUB NCU_SOCIAL_CLUB
CONST_INT iCONTENT_CHECK_3_BLIMP NCU_BLIMP
CONST_INT iCONTENT_CHECK_4_WEAPONS 4
CONST_INT iCONTENT_CHECK_5_VEHICLES 5
CONST_INT iCONTENT_CHECK_6_CLOTHES 6
CONST_INT iCONTENT_CHECK_7_HAIRDOS 7
CONST_INT iCONTENT_CHECK_8_TATTOOS 8
CONST_INT iCONTENT_CHECK_9_STUNT_PLANES 9
CONST_INT iCONTENT_CHECK_10_JAPANESE_SE 10
CONST_INT iCONTENT_CHECK_12_NEXT_GEN_PREORDER 11
CONST_INT iCONTENT_CHECK_13_CG_TO_NG 12
CONST_INT iCONTENT_CHECK_14_HEISTS 13
CONST_INT iCONTENT_CHECK_CASH_GIFT 14
CONST_INT iMAX_LAST_ITEMS 15
INT iCacheShopData
CONST_INT CACHE_SHOP_VEHICLE_DATA_BS 0
CONST_INT CACHE_SHOP_WEAPON_DATA_BS 1
CONST_INT CACHE_SHOP_CLOTHES_DATA_BS 2
CONST_INT CACHE_SHOP_TATTOO_DATA_BS 3
CONST_INT CACHE_SHOP_HAIRD_DATA_BS 4
#IF IS_DEBUG_BUILD
//Mission list debug variables
BOOL bMissionCountHasChanged[3]
WIDGET_GROUP_ID widgetID
//WIDGET_GROUP_ID wPlayerControllerWidget
//BOOL bGetAverageOfMissionArray
BOOL bCreateVehicle[NUM_OF_PLAYABLE_PEDS]
BOOL bCreateNPCVehicle
//INT iTempRecentlySelectedScene
INT iVehicleTypeDebug
//BOOL bUpdateLocations
//TEXT_WIDGET_ID wTestWidget
BOOL bRandomisePlayerVariations
BOOL bSetDefaultOutfit
BOOL bOpenTrevorsDoor = FALSE
BOOL bSetRandomoutfitOnStartup
MODEL_NAMES eCompLookupPed
INT iCompLookupType, iCompLookupItem, iCompLookupBitset, iCompLookupDummyItems
INT iLastDraw, iLastTex
BOOL bCheckMissingPedComponents
TEXT_WIDGET_ID text_widgetID
PED_INDEX MissingComponentsPed
BOOL bTestTimelapseCutscene, bTestDefaultPlayerSwitchState
BOOL bDrawSelectorShuit
BOOL bPrintCurrentPedCompInfo, bPrintBitsetInfo
BOOL debug_store_weapons, debug_restore_weapons, debug_remove_weapons, debug_remove_ammo, debug_store_snapshot, debug_restore_snapshot, debug_restore_snapshot_keeper
BOOL debug_do_mask_test
PROC SETUP_PLAYER_CONTROL_DEBUG_WIDGETS()
widgetID = START_WIDGET_GROUP("Player Controller")
ADD_WIDGET_BOOL("Draw debug display", g_bDrawPlayerControlDebugDisplay)
ADD_WIDGET_BOOL("Draw Literal Scene String", g_bDrawLiteralSceneString)
ADD_WIDGET_BOOL("Set player clothes in cutscenes", g_bSetPlayerClothesInCutscenes)
ADD_WIDGET_BOOL("Set player weapons in cutscenes", g_bSetPlayerWeaponsInCutscenes)
ADD_WIDGET_BOOL("Do mask test", debug_do_mask_test)
START_WIDGET_GROUP("Player Ped Weapons")
ADD_WIDGET_BOOL("Store weapons", debug_store_weapons)
ADD_WIDGET_BOOL("Restore weapons", debug_restore_weapons)
ADD_WIDGET_BOOL("Remove weapons", debug_remove_weapons)
ADD_WIDGET_BOOL("Remove ammo", debug_remove_ammo)
ADD_WIDGET_BOOL("Store snapshot", debug_store_snapshot)
ADD_WIDGET_BOOL("Restore snapshot", debug_restore_snapshot)
ADD_WIDGET_BOOL("Restore snapshot and keep", debug_restore_snapshot_keeper)
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("Player Ped Clothes")
text_widgetID = ADD_TEXT_WIDGET("Model to check")
SET_CONTENTS_OF_TEXT_WIDGET(text_widgetID, "player_zero")
ADD_WIDGET_BOOL("Check missing components", bCheckMissingPedComponents)
ADD_WIDGET_BOOL("Player is changing clothes (READ ONLY)", g_bPlayerIsChangingClothes)
ADD_WIDGET_BOOL("Randomise Player Variations", bRandomisePlayerVariations)
ADD_WIDGET_BOOL("Set random start outfit", bSetRandomoutfitOnStartup)
ADD_WIDGET_BOOL("Set default outfit", bSetDefaultOutfit)
ADD_WIDGET_BOOL("Print player's current ped component info", bPrintCurrentPedCompInfo)
ADD_WIDGET_BOOL("Print bitset totals", bPrintBitsetInfo)
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("Player Ped Globals")
ADD_WIDGET_BOOL("Can change clothes on mission", g_bPlayerCanChangeClothesOnMission)
ADD_WIDGET_BOOL("Michael available", g_savedGlobals.sPlayerData.sInfo.bPedAvailable[CHAR_MICHAEL])
ADD_WIDGET_BOOL("Franklin available", g_savedGlobals.sPlayerData.sInfo.bPedAvailable[CHAR_FRANKLIN])
ADD_WIDGET_BOOL("Trevor available", g_savedGlobals.sPlayerData.sInfo.bPedAvailable[CHAR_TREVOR])
ADD_WIDGET_INT_READ_ONLY("Michael missions", g_iAvailablePlayerMissions[CHAR_MICHAEL])
ADD_WIDGET_INT_READ_ONLY("Franklin missions", g_iAvailablePlayerMissions[CHAR_FRANKLIN])
ADD_WIDGET_INT_READ_ONLY("Trevor missions", g_iAvailablePlayerMissions[CHAR_TREVOR])
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("Player Vehicles")
ADD_WIDGET_INT_SLIDER("Type", iVehicleTypeDebug, 0, NUM_OF_PLAYER_PED_VEHICLE_TYPES-1, 1)
ADD_WIDGET_BOOL("Create Michael's vehicle", bCreateVehicle[0])
ADD_WIDGET_BOOL("Create Franklin's vehicle", bCreateVehicle[1])
ADD_WIDGET_BOOL("Create Trevor's vehicle", bCreateVehicle[2])
ADD_WIDGET_BOOL("Create NPC's vehicle", bCreateNPCVehicle)
STOP_WIDGET_GROUP()
// START_WIDGET_GROUP("Player Locations")
//
// ADD_WIDGET_BOOL("Update locations", bUpdateLocations)
// ADD_WIDGET_BOOL("Debug Print: Scene Schedule Info", g_bDebugPrint_SceneScheduleInfo)
//
// PED_REQUEST_SCENE_ENUM eScene
//
// START_NEW_WIDGET_COMBO()
// REPEAT (ENUM_TO_INT(NUM_OF_PED_REQUEST_SCENES)+2) eScene
// ADD_TO_WIDGET_COMBO(Get_String_From_Ped_Request_Scene_Enum(eScene))
// ENDREPEAT
// STOP_WIDGET_COMBO("Recent Location", iTempRecentlySelectedScene)
//
// g_iSelectedDebugPlayerCharScene = GET_RANDOM_INT_IN_RANGE(0, ENUM_TO_INT(NUM_OF_PED_REQUEST_SCENES))
//
// START_NEW_WIDGET_COMBO()
// REPEAT NUM_OF_PED_REQUEST_SCENES eScene
// ADD_TO_WIDGET_COMBO(Get_String_From_Ped_Request_Scene_Enum(eScene))
// ENDREPEAT
// STOP_WIDGET_COMBO("Locations", g_iSelectedDebugPlayerCharScene)
//
// ADD_WIDGET_INT_SLIDER("Location num", g_iSelectedDebugPlayerCharScene, 0, ENUM_TO_INT(NUM_OF_PED_REQUEST_SCENES)-1, 1)
// wTestWidget = ADD_TEXT_WIDGET("Location name")
// SET_CONTENTS_OF_TEXT_WIDGET(wTestWidget, Get_String_From_Ped_Request_Scene_Enum(INT_TO_ENUM(PED_REQUEST_SCENE_ENUM, g_iSelectedDebugPlayerCharScene)))
//
// ADD_WIDGET_BOOL("Warp to selected location", g_bWarpDebugPlayerCharScene)
// ADD_WIDGET_BOOL("Perform Scene Demo", bPerformDemo)
//
// ADD_WIDGET_BOOL("Get Average Of Mission Array", bGetAverageOfMissionArray)
// STOP_WIDGET_GROUP()
START_WIDGET_GROUP("Player Switch Values")
// ADD_WIDGET_BOOL("g_bUseProtoTypeCamSpline", g_bUseProtoTypeCamSpline)
// ADD_WIDGET_BOOL("g_bUseProtoTypeCamStreaming", g_bUseProtoTypeCamStreaming)
ADD_WIDGET_BOOL("bOpenTrevorsDoor", bOpenTrevorsDoor)
// START_WIDGET_GROUP("Camera Positions")
// START_WIDGET_GROUP("Max Height")
// ADD_WIDGET_FLOAT_SLIDER("fMaxCamZ", fMaxCamZ, 0.0, 20000, 1.0)
// ADD_WIDGET_FLOAT_SLIDER("Duration", fSkyDuration, 0.0, 200000, 1.0)
// STOP_WIDGET_GROUP()
// START_WIDGET_GROUP("Start Ped 1")
// ADD_WIDGET_FLOAT_SLIDER("From Gamplay to first cam", fGameplayToSpline, 0.0, 20000, 1.0)
// ADD_WIDGET_FLOAT_SLIDER("Start Ped Height1", fFromPedHeight1, 0.0, 20000, 1.0)
// ADD_WIDGET_FLOAT_SLIDER("Start Duration1", fFromPedDuration1, 0, 20000, 1.0)
// STOP_WIDGET_GROUP()
// START_WIDGET_GROUP("Start Ped 2")
// ADD_WIDGET_FLOAT_SLIDER("Start Ped Height2", fFromPedHeight2, 0.0,20000, 1.0)
// ADD_WIDGET_FLOAT_SLIDER("Start Duration2", fFromPedDuration2, 0.0, 20000, 1.0)
// STOP_WIDGET_GROUP()
// START_WIDGET_GROUP("Start Ped 3")
// ADD_WIDGET_FLOAT_SLIDER("Start Ped Height3", fFromPedHeight3, 0.0, 20000, 1.0)
// ADD_WIDGET_FLOAT_SLIDER("Start Duration3", fFromPedDuration3, 0.0, 20000, 1.0)
// STOP_WIDGET_GROUP()
// START_WIDGET_GROUP("End Ped 1")
// ADD_WIDGET_FLOAT_SLIDER("End Ped Height1", fTOPedHeight1, 0.0, 20000, 1.0)
// ADD_WIDGET_FLOAT_SLIDER("End Duration1", fTOPedDuration1, 0, 20000, 1.0)
// STOP_WIDGET_GROUP()
// START_WIDGET_GROUP("End Ped 2")
// ADD_WIDGET_FLOAT_SLIDER("End Ped Height2", fTOPedHeight2, 0.0,20000, 1.0)
// ADD_WIDGET_FLOAT_SLIDER("End Duration2", fTOPedDuration2, 0.0, 20000, 1.0)
// STOP_WIDGET_GROUP()
// START_WIDGET_GROUP("End Ped 3")
// ADD_WIDGET_FLOAT_SLIDER("End Ped Height3", fTOPedHeight3, 0.0, 20000, 1.0)
// ADD_WIDGET_FLOAT_SLIDER("End Duration3", fTOPedDuration3, 0.0, 20000, 1.0)
// STOP_WIDGET_GROUP()
// ADD_WIDGET_FLOAT_SLIDER("Motion Blur (at highest level)", fSkyMotionBlur, 0.0, 100.0, 0.1)
// STOP_WIDGET_GROUP()
// START_WIDGET_GROUP("Geo Loading")
//
//// ADD_WIDGET_INT_SLIDER("Camera Node to start loading", iLoadCamTo , 0, 20, 1)
//// ADD_WIDGET_INT_SLIDER("Camera Node to Force Low LOD", iForceLOWlod , 0, 20, 1)
//// ADD_WIDGET_INT_SLIDER("Camera Node to Disable Force Low LOD", iDisableForcedLOWlod, 0, 20, 1)
//
// STOP_WIDGET_GROUP()
// START_WIDGET_GROUP("Flash Effect")
// ADD_WIDGET_FLOAT_SLIDER("Minimum Exposure", fMinExposure, 0.0, 32.0, 0.1)
// ADD_WIDGET_FLOAT_SLIDER("Maximum Exposure", fMaxExposure, 0.0, 32.0, 0.1)
// ADD_WIDGET_INT_SLIDER("Ramp Up duration (msec)", iRampUpDuration, 0, 5000, 25)
// ADD_WIDGET_INT_SLIDER("Hold duration (msec)", iRampUpDuration, 0, 5000, 25)
// ADD_WIDGET_INT_SLIDER("Ramp Down duration (msec)", iRampUpDuration, 0, 5000, 25)
// STOP_WIDGET_GROUP()
STOP_WIDGET_GROUP()
ADD_WIDGET_BOOL("bTestTimelapseCutscene", bTestTimelapseCutscene)
ADD_WIDGET_BOOL("bTestDefaultPlayerSwitchState", bTestDefaultPlayerSwitchState)
ADD_WIDGET_BOOL("bDrawSelectorShuit", bDrawSelectorShuit)
STOP_WIDGET_GROUP()
ENDPROC
FUNC STRING GET_PED_COMP_STRING(PED_COMPONENT eType)
SWITCH eType
CASE PED_COMP_HEAD RETURN "HEAD" BREAK
CASE PED_COMP_HAIR RETURN "HAIR" BREAK
CASE PED_COMP_TORSO RETURN "TORSO" BREAK
CASE PED_COMP_LEG RETURN "LEG" BREAK
CASE PED_COMP_FEET RETURN "FEET" BREAK
CASE PED_COMP_HAND RETURN "HAND" BREAK
CASE PED_COMP_SPECIAL RETURN "SPECIAL" BREAK
CASE PED_COMP_SPECIAL2 RETURN "SPECIAL2" BREAK
CASE PED_COMP_DECL RETURN "DECL" BREAK
CASE PED_COMP_BERD RETURN "BERD" BREAK
CASE PED_COMP_TEETH RETURN "TEETH" BREAK
CASE PED_COMP_JBIB RETURN "JBIB" BREAK
ENDSWITCH
RETURN ""
ENDFUNC
// Check what ped components we have yet to set up
FUNC BOOL CHECK_MISSING_PED_COMPONENTS()
IF NOT DOES_ENTITY_EXIST(MissingComponentsPed)
OR IS_PED_INJURED(MissingComponentsPed)
RETURN TRUE
ENDIF
PED_COMP_ITEM_DATA_STRUCT sCompData
INT iBit, iTempItem, iStartLoop
REPEAT 32 iBit
// Get data for this item
sCompData = GET_PED_COMP_DATA_FOR_ITEM_SP(eCompLookupPed, GET_COMP_TYPE_FROM_PED_COMPONENT(INT_TO_ENUM(PED_COMPONENT, iCompLookupType)), INT_TO_ENUM(PED_COMP_NAME_ENUM, (iCompLookupBitset*32)+iBit))
IF sCompData.iItemBit > -1
IF (sCompData.iDrawable = iLastDraw AND sCompData.iTexture = iLastTex)
CPRINTLN(DEBUG_PED_COMP, "...*** Duplicate ", GET_PED_COMP_STRING(INT_TO_ENUM(PED_COMPONENT, iCompLookupType)), " [", sCompData.iDrawable, ", ", sCompData.iTexture, "] ***")
ELIF (sCompData.iTexture < iLastTex AND sCompData.iDrawable <= iLastDraw)
CPRINTLN(DEBUG_PED_COMP, "...*** Order messed up ", GET_PED_COMP_STRING(INT_TO_ENUM(PED_COMPONENT, iCompLookupType)), " ***")
ELSE
// Fill in any gaps...
WHILE (iLastDraw > -1 AND sCompData.iDrawable > iLastDraw)
OR (sCompData.iTexture > iLastTex+1)
// Textures for previous drawables
IF sCompData.iDrawable > iLastDraw
IF sCompData.iDrawable > iLastDraw+1
AND iLastTex = -1
CPRINTLN(DEBUG_PED_COMP, "...Item missing ", GET_PED_COMP_STRING(INT_TO_ENUM(PED_COMPONENT, iCompLookupType)), " [", iLastDraw, ", ", 0, "]")
iCompLookupItem++
iCompLookupDummyItems++
iLastTex = 0
ENDIF
iStartLoop = iLastTex+1
FOR iTempItem = iStartLoop TO GET_NUMBER_OF_PED_TEXTURE_VARIATIONS(MissingComponentsPed, INT_TO_ENUM(PED_COMPONENT, iCompLookupType), iLastDraw)-1
CPRINTLN(DEBUG_PED_COMP, "...Item missing ", GET_PED_COMP_STRING(INT_TO_ENUM(PED_COMPONENT, iCompLookupType)), " [", iLastDraw, ", ", iTempItem, "]")
iCompLookupItem++
iCompLookupDummyItems++
iLastTex = iTempItem
ENDFOR
iLastTex=-1
iLastDraw++
// Textures for current drawable
ELSE
iStartLoop = iLastTex+1
FOR iTempItem = iStartLoop TO sCompData.iTexture-1
CPRINTLN(DEBUG_PED_COMP, "...Item missing ", GET_PED_COMP_STRING(INT_TO_ENUM(PED_COMPONENT, iCompLookupType)), " [", iLastDraw, ", ", iTempItem, "]")
iCompLookupItem++
iCompLookupDummyItems++
iLastTex = iTempItem
ENDFOR
ENDIF
ENDWHILE
// Add current item
//PRINTLN("...Adding item ", GET_PED_COMP_STRING(INT_TO_ENUM(PED_COMPONENT, iCompLookupType)), " [", sCompData.iDrawable, ", ", sCompData.iTexture, "]")
iCompLookupItem++
ENDIF
iLastDraw = sCompData.iDrawable
iLastTex = sCompData.iTexture
ENDIF
ENDREPEAT
// Process the next bitset on the next frame
iCompLookupBitset++
// Process the next item type when we have processed these bitsets
IF iCompLookupBitset >= PED_COMPONENT_BITSETS
iCompLookupBitset = 0
iCompLookupType++
iLastDraw = -1
iLastTex = -1
ENDIF
// Finish processing when we have processed the types
IF iCompLookupType >= NUM_PED_COMPONENTS
CPRINTLN(DEBUG_PED_COMP, "...Finished")
CPRINTLN(DEBUG_PED_COMP,"...Total items = ", iCompLookupItem)
CPRINTLN(DEBUG_PED_COMP,"...Total items setup = ", iCompLookupItem-iCompLookupDummyItems)
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
PROC MAINTAIN_PLAYER_CONTROL_DEBUG_WIDGETS()
IF debug_do_mask_test
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
AND GET_CURRENT_PLAYER_PED_ENUM() = CHAR_MICHAEL
SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_HAIR, HAIR_P0_3_0, FALSE)
SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_BERD, BERD_P0_4_0, FALSE)
SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_SPECIAL2, SPECIAL2_P0_WRESTLER_MASK_3, FALSE)
STORE_PLAYER_PED_VARIATIONS(PLAYER_PED_ID(), TRUE)
ENDIF
debug_do_mask_test = FALSE
ENDIF
IF debug_store_weapons
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
STORE_PLAYER_PED_WEAPONS(PLAYER_PED_ID())
ENDIF
debug_store_weapons = FALSE
ENDIF
IF debug_restore_weapons
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
RESTORE_PLAYER_PED_WEAPONS(PLAYER_PED_ID())
ENDIF
debug_restore_weapons = FALSE
ENDIF
IF debug_remove_weapons
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
REMOVE_ALL_PED_WEAPONS(PLAYER_PED_ID())
ENDIF
debug_remove_weapons = FALSE
ENDIF
IF debug_remove_ammo
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
INT iSlot
WEAPON_TYPE eWeapon
WEAPON_SLOT eSlot
REPEAT NUM_PLAYER_PED_WEAPON_SLOTS iSlot
eSlot = GET_PLAYER_PED_WEAPON_SLOT_FROM_INT(iSlot)
IF eSlot != WEAPONSLOT_INVALID
AND eSlot != WEAPONSLOT_UNARMED
eWeapon = GET_PED_WEAPONTYPE_IN_SLOT(PLAYER_PED_ID(), GET_PLAYER_PED_WEAPON_SLOT_FROM_INT(iSlot))
IF eWeapon != WEAPONTYPE_INVALID
AND eWeapon != WEAPONTYPE_UNARMED
AND IS_WEAPON_AVAILABLE_FOR_GAME(eWeapon)
SET_PED_AMMO(PLAYER_PED_ID(), eWeapon, 0)
ENDIF
ENDIF
ENDREPEAT
ENDIF
debug_remove_ammo = FALSE
ENDIF
IF debug_store_snapshot
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
STORE_PLAYER_PED_WEAPONS_IN_SNAPSHOT(PLAYER_PED_ID())
ENDIF
debug_store_snapshot = FALSE
ENDIF
IF debug_restore_snapshot
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
RESTORE_PLAYER_PED_WEAPONS_IN_SNAPSHOT(PLAYER_PED_ID(), TRUE)
ENDIF
debug_restore_snapshot = FALSE
ENDIF
IF debug_restore_snapshot_keeper
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
RESTORE_PLAYER_PED_WEAPONS_IN_SNAPSHOT(PLAYER_PED_ID(), FALSE)
ENDIF
debug_restore_snapshot_keeper = FALSE
ENDIF
IF bCheckMissingPedComponents
eCompLookupPed = INT_TO_ENUM(MODEL_NAMES, GET_HASH_KEY(GET_CONTENTS_OF_TEXT_WIDGET(text_widgetID)))
IF IS_MODEL_A_PED(eCompLookupPed)
IF DOES_ENTITY_EXIST(MissingComponentsPed)
DELETE_PED(MissingComponentsPed)
ENDIF
REQUEST_MODEL(eCompLookupPed)
WHILE NOT HAS_MODEL_LOADED(eCompLookupPed)
WAIT(0)
ENDWHILE
MissingComponentsPed = CREATE_PED(PEDTYPE_MISSION, eCompLookupPed, <<100, 100, 100>>)
SET_ENTITY_COLLISION(MissingComponentsPed, FALSE)
SET_ENTITY_VISIBLE(MissingComponentsPed, FALSE)
FREEZE_ENTITY_POSITION(MissingComponentsPed, TRUE)
SET_MODEL_AS_NO_LONGER_NEEDED(eCompLookupPed)
iCompLookupType = 0
iCompLookupBitset = 0
iCompLookupItem = 0
iCompLookupDummyItems = 0
iLastDraw = -1
iLastTex = -1
CPRINTLN(DEBUG_PED_COMP, "****************************************")
CPRINTLN(DEBUG_PED_COMP, "CHECK_MISSING_PED_COMPONENTS")
CPRINTLN(DEBUG_PED_COMP, "...Model = ", GET_CONTENTS_OF_TEXT_WIDGET(text_widgetID))
WHILE NOT CHECK_MISSING_PED_COMPONENTS()
WAIT(0)
ENDWHILE
CPRINTLN(DEBUG_PED_COMP, "****************************************")
IF DOES_ENTITY_EXIST(MissingComponentsPed)
DELETE_PED(MissingComponentsPed)
ENDIF
ENDIF
bCheckMissingPedComponents = FALSE
ENDIF
IF bSetDefaultOutfit
SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_DEFAULT, FALSE)
bSetDefaultOutfit = FALSE
ENDIF
IF bRandomisePlayerVariations
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
SET_PED_RANDOM_COMPONENT_VARIATION(PLAYER_PED_ID())
ENDIF
bRandomisePlayerVariations = FALSE
ENDIF
// print the ped comp details of all of the player's current clothes
IF bPrintCurrentPedCompInfo = TRUE
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
PRINT_CURRENT_PED_COMP_INFO_SP(PLAYER_PED_ID())
ENDIF
bPrintCurrentPedCompInfo = FALSE
ENDIF
// print the ped comp details of all of the player's current clothes
IF bPrintBitsetInfo = TRUE
PRINT_PED_COMP_BITSETS_REQUIRED()
bPrintBitsetInfo = FALSE
ENDIF
// IF bUpdateLocations
// iTempRecentlySelectedScene = ENUM_TO_INT(g_eRecentlySelectedScene)
// ENDIF
// SET_CONTENTS_OF_TEXT_WIDGET(wTestWidget, Get_String_From_Ped_Request_Scene_Enum(INT_TO_ENUM(PED_REQUEST_SCENE_ENUM, g_iSelectedDebugPlayerCharScene)))
// IF g_bWarpDebugPlayerCharScene
// //for bug 884228
// sSceneData.sSelectorPeds.ePreviousSelectorPed = SELECTOR_PED_MICHAEL
//
//
// sSceneData.iStage = 0
// sSceneData.eScene = INT_TO_ENUM(PED_REQUEST_SCENE_ENUM, g_iSelectedDebugPlayerCharScene)
// sSceneData.sSelectorCam.bSplineCreated = FALSE
//
//
//
// GET_PLAYER_CHAR_FOR_PED_REQUEST_SCENE(sSceneData.eScene, sSceneData.ePed)
//
// IF (sSceneData.ePed = CHAR_MULTIPLAYER)
//
// IF (sSceneData.eScene = PR_SCENE_FTa_FRANKLIN1a
// OR sSceneData.eScene = PR_SCENE_FTa_FRANKLIN1b
// OR sSceneData.eScene = PR_SCENE_FTa_FRANKLIN1c
// OR sSceneData.eScene = PR_SCENE_FTa_FRANKLIN1d
// OR sSceneData.eScene = PR_SCENE_FTa_FRANKLIN1e)
//
// SWITCH GET_CURRENT_PLAYER_PED_ENUM()
// CASE CHAR_MICHAEL
// IF GET_RANDOM_INT_IN_RANGE(0, 100) < 50
// sSceneData.ePed = CHAR_FRANKLIN
// ELSE
// sSceneData.ePed = CHAR_TREVOR
// ENDIF
// BREAK
// CASE CHAR_FRANKLIN
// sSceneData.ePed = CHAR_TREVOR
// BREAK
// CASE CHAR_TREVOR
// sSceneData.ePed = CHAR_FRANKLIN
// BREAK
// ENDSWITCH
// ENDIF
// ENDIF
//
//
// FLOAT fScenePercent = -1
// PED_REQUEST_SCENE_ENUM eDebugSelectedScene = PR_SCENE_INVALID
// IF NOT GET_PLAYER_PED_POSITION_FOR_SCENE(sSceneData.eScene, sSceneData.vCreateCoords, sSceneData.fCreateHead, sSceneData.tCreateRoom)
// PLAYER_TIMETABLE_SCENE_STRUCT sPassedScene
// eDebugSelectedScene = sSceneData.eScene
// GET_PLAYER_PED_SCENE_FOR_CURRENT_TIME(sSceneData.ePed, sSceneData.eScene, fScenePercent, sSceneData, sPassedScene)
//
// ENDIF
//
//// PED_INFO_STRUCT sInfo
//// IF GetLastKnownPedInfoPostMission(sSceneData.eScene,
//// sInfo.vLastKnownCoords[sSceneData.ePed],
//// sInfo.fLastKnownHead[sSceneData.ePed])
//// TestSelectedMissionSceneCoords(sSceneData.eScene, sSceneData.ePed, sInfo)
//// ENDIF
//
// IF IS_PED_THE_CURRENT_PLAYER_PED(sSceneData.ePed)
// SELECTOR_SLOTS_ENUM newSelectorPed
// SWITCH sSceneData.ePed
// CASE CHAR_MICHAEL
// IF GET_RANDOM_INT_IN_RANGE(0, 100) < 50
// newSelectorPed = SELECTOR_PED_FRANKLIN
// ELSE
// newSelectorPed = SELECTOR_PED_TREVOR
// ENDIF
// BREAK
// CASE CHAR_FRANKLIN
// IF GET_RANDOM_INT_IN_RANGE(0, 100) < 50
// newSelectorPed = SELECTOR_PED_MICHAEL
// ELSE
// newSelectorPed = SELECTOR_PED_TREVOR
// ENDIF
// BREAK
// CASE CHAR_TREVOR
// IF GET_RANDOM_INT_IN_RANGE(0, 100) < 50
// newSelectorPed = SELECTOR_PED_MICHAEL
// ELSE
// newSelectorPed = SELECTOR_PED_FRANKLIN
// ENDIF
// BREAK
// ENDSWITCH
//
// WHILE NOT SET_CURRENT_SELECTOR_PED(newSelectorPed)
// WAIT(0)
// ENDWHILE
// ENDIF
//
// SWITCH GET_CURRENT_PLAYER_PED_ENUM()
// CASE CHAR_MICHAEL
// Set_Mission_Flow_Flag_State(FLOWFLAG_PLAYER_PED_INTRODUCED_M, TRUE)
// SET_PLAYER_PED_AVAILABLE(CHAR_MICHAEL, TRUE)
// BREAK
// CASE CHAR_FRANKLIN
// Set_Mission_Flow_Flag_State(FLOWFLAG_PLAYER_PED_INTRODUCED_F, TRUE)
// SET_PLAYER_PED_AVAILABLE(CHAR_FRANKLIN, TRUE)
// BREAK
// CASE CHAR_TREVOR
// Set_Mission_Flow_Flag_State(FLOWFLAG_PLAYER_PED_INTRODUCED_T, TRUE)
// SET_PLAYER_PED_AVAILABLE(CHAR_TREVOR, TRUE)
// BREAK
// ENDSWITCH
//
// // // // #949607
// SELECTOR_SLOTS_ENUM ePedSlot = GET_SELECTOR_SLOT_FROM_PLAYER_PED_ENUM(sSceneData.ePed)
// PRINTSTRING("slot ")
// PRINTSTRING(GET_PLAYER_PED_STRING(sSceneData.ePed))
// PRINTSTRING(" has ")
// IF DOES_ENTITY_EXIST(sSceneData.sSelectorPeds.pedID[ePedSlot])
// PRINTSTRING("sSceneData exists")
//
// VECTOR vCreateCoords
// FLOAT fCreateHead
// TEXT_LABEL_31 tRoom
// IF GET_PLAYER_PED_POSITION_FOR_SCENE(sSceneData.eScene, vCreateCoords, fCreateHead, tRoom)
//
// VECTOR vPedSlotCoord = GET_ENTITY_COORDS(sSceneData.sSelectorPeds.pedID[ePedSlot], FALSE)
//
// IF NOT ARE_VECTORS_ALMOST_EQUAL(vCreateCoords, vPedSlotCoord, 5.0)
// PRINTSTRING(" pedTo(")
// PRINTVECTOR(vPedSlotCoord)
// PRINTSTRING(") nowhere near vCreateCoords(")
// PRINTVECTOR(vCreateCoords)
// PRINTSTRING("): dist:")
// PRINTFLOAT(VDIST(vCreateCoords, vPedSlotCoord))
//
// SET_ENTITY_COORDS(sSceneData.sSelectorPeds.pedID[ePedSlot], vCreateCoords)
// SET_ENTITY_HEADING(sSceneData.sSelectorPeds.pedID[ePedSlot], fCreateHead)
// ENDIF
// ENDIF
// ELSE
// PRINTSTRING("sSceneData DOESNT exist")
// ENDIF
// PRINTNl()
// // // //
//
// IF NOT IS_PED_INJURED(PLAYER_PED_ID())
// CLEAR_AREA(GET_ENTITY_COORDS(PLAYER_PED_ID()), 50.0, TRUE)
// CLEAR_AREA_OF_VEHICLES(GET_ENTITY_COORDS(PLAYER_PED_ID()), 50.0)
// ENDIF
//
// BOOL bPerformingGenericPedScene = TRUE
// WHILE IS_PLAYER_PLAYING(PLAYER_ID())
// AND bPerformingGenericPedScene
// IF NOT GENERIC_PED_SCENE(sSceneData,
// &SCENE_CUSTOM_SCRIPT_REQUEST,
// &SCENE_CUSTOM_SCRIPT_SETUP)
//
//
// IF (eDebugSelectedScene <> PR_SCENE_INVALID)
//
//
// #IF IS_DEBUG_BUILD
// IF g_bDrawLiteralSceneString
//
// STRING sScene
// sScene = Get_String_From_Ped_Request_Scene_Enum(eDebugSelectedScene)
// HUD_COLOURS eHudColour
// eHudColour = HUD_COLOUR_BLUELIGHT
//
// TEXT_LABEL_63 sLiteral
// sLiteral = ("eDebugSelectedScene = \"")
// sLiteral += GET_STRING_FROM_STRING(sScene,
// GET_LENGTH_OF_LITERAL_STRING("PR_SCENE_"),
// GET_LENGTH_OF_LITERAL_STRING(sScene))
// sLiteral += ("\" , percent: ")
// sLiteral += GET_STRING_FROM_FLOAT(fScenePercent)
//
// SET_TEXT_SCALE(0.4, 0.4)
// SET_TEXT_HUD_COLOUR(eHudColour, 127)
// SET_TEXT_JUSTIFICATION(FONT_CENTRE)
// SET_TEXT_OUTLINE()
// DISPLAY_TEXT_WITH_LITERAL_STRING(0.5, 0.925 - 0.03 - 0.03, "STRING", sLiteral)
// ENDIF
// #ENDIF
//
// ENDIF
//
// iTempRecentlySelectedScene = ENUM_TO_INT(g_eRecentlySelectedScene)
// ELSE
// bPerformingGenericPedScene = FALSE
// ENDIF
// WAIT(0)
// ENDWHILE
//
// SWITCH GET_CURRENT_PLAYER_PED_ENUM()
// CASE CHAR_MICHAEL
// Set_Mission_Flow_Flag_State(FLOWFLAG_PLAYER_PED_INTRODUCED_M, TRUE)
// SET_PLAYER_PED_AVAILABLE(CHAR_MICHAEL, TRUE)
// BREAK
// CASE CHAR_FRANKLIN
// Set_Mission_Flow_Flag_State(FLOWFLAG_PLAYER_PED_INTRODUCED_F, TRUE)
// SET_PLAYER_PED_AVAILABLE(CHAR_FRANKLIN, TRUE)
// BREAK
// CASE CHAR_TREVOR
// Set_Mission_Flow_Flag_State(FLOWFLAG_PLAYER_PED_INTRODUCED_T, TRUE)
// SET_PLAYER_PED_AVAILABLE(CHAR_TREVOR, TRUE)
// BREAK
// ENDSWITCH
//
// g_bWarpDebugPlayerCharScene = FALSE
// ENDIF
// IF bPerformDemo
// PED_REQUEST_SCENE_ENUM sceneArray[NUM_OF_PED_REQUEST_SCENES]
// INT iSceneWait[NUM_OF_PED_REQUEST_SCENES]
//
// Perform_Switch_Demo(sceneArray, iSceneWait,
// bPerformDemo, iTempRecentlySelectedScene)
// bPerformDemo = FALSE
// ENDIF
// IF bTestSelectedMissionSceneCoords
//
// PED_REQUEST_SCENE_ENUM eReqScene
// REPEAT NUM_OF_PED_REQUEST_SCENES eReqScene
// IF (eReqScene <> PR_SCENE_DEAD)
// enumCharacterList ePed = NO_CHARACTER
// GET_PLAYER_CHAR_FOR_PED_REQUEST_SCENE(eReqScene, ePed)
//
// IF TestSelectedMissionSceneCoords(eReqScene)
//
// PRINTSTRING("TestSelectedMissionSceneCoords(")
// PRINTSTRING(Get_String_From_Ped_Request_Scene_Enum(eReqScene))
// PRINTSTRING("): TRUE")
//
// ELSE
//
// PRINTSTRING("TestSelectedMissionSceneCoords(")
// PRINTSTRING(Get_String_From_Ped_Request_Scene_Enum(eReqScene))
// PRINTSTRING("): FALSE")
//
// ENDIF
//
// PRINTNL()
// ENDIF
// ENDREPEAT
//
// bTestSelectedMissionSceneCoords = FALSE
// ENDIF
// IF bGetAverageOfMissionArray
// Get_Average_Of_Mission_Array(wPlayerControllerWidget, bGetAverageOfMissionArray)
// bGetAverageOfMissionArray = FALSE
// ENDIF
// Vehicles
INT iPed
VEHICLE_INDEX vehTemp
VECTOR vCoords
FLOAT fHeading
REPEAT NUM_OF_PLAYABLE_PEDS iPed
IF bCreateVehicle[iPed]
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
vCoords = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(PLAYER_PED_ID(), << 0.0, 2.5, 0.0>>)
fHeading = GET_ENTITY_HEADING(PLAYER_PED_ID())
WHILE NOT CREATE_PLAYER_VEHICLE(vehTemp, INT_TO_ENUM(enumCharacterList, iPed), vCoords, fHeading, TRUE, INT_TO_ENUM(VEHICLE_CREATE_TYPE_ENUM, iVehicleTypeDebug))
WAIT(0)
ENDWHILE
IF DOES_ENTITY_EXIST(vehTemp)
SET_VEHICLE_AS_NO_LONGER_NEEDED(vehTemp)
ENDIF
ENDIF
bCreateVehicle[iPed] = FALSE
ENDIF
ENDREPEAT
IF bCreateNPCVehicle
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
vCoords = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(PLAYER_PED_ID(), << 0.0, 2.5, 0.0>>)
fHeading = GET_ENTITY_HEADING(PLAYER_PED_ID())
WHILE NOT CREATE_NPC_VEHICLE(vehTemp, CHAR_AMANDA, vCoords, fHeading, TRUE, INT_TO_ENUM(VEHICLE_CREATE_TYPE_ENUM, iVehicleTypeDebug))
WAIT(0)
ENDWHILE
IF DOES_ENTITY_EXIST(vehTemp)
SET_VEHICLE_AS_NO_LONGER_NEEDED(vehTemp)
ENDIF
ENDIF
bCreateNPCVehicle = FALSE
ENDIF
IF bOpenTrevorsDoor = TRUE
SET_STATE_OF_CLOSEST_DOOR_OF_TYPE(v_ilev_trevtraildr, (<< 1973.0, 3815.0, 34.0 >>), TRUE, 1.0, TRUE )
bOpenTrevorsDoor = FALSE
ENDIF
IF bSetRandomoutfitOnStartup
AND NOT IS_PED_INJURED(PLAYER_PED_ID())
PRINTLN("Setting random outfit on the player")
SWITCH GET_CURRENT_PLAYER_PED_ENUM()
CASE CHAR_MICHAEL
SWITCH GET_RANDOM_INT_IN_RANGE(0, 27)
CASE 0 SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P0_DEFAULT, FALSE) BREAK
CASE 1 SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P0_NAVY_JANITOR, FALSE) BREAK
CASE 2 SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P0_HIGHWAY_PATROL, FALSE) BREAK
CASE 3 SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P0_GOLF, FALSE) BREAK
CASE 4 SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P0_YOGA, FALSE) BREAK
CASE 5 SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P0_EPSILON, FALSE) BREAK
CASE 6 SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P0_TENNIS, FALSE) BREAK
CASE 7 SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P0_STEALTH, FALSE) BREAK
CASE 8 SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P0_TRIATHLON, FALSE) BREAK
CASE 9 SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P0_SECURITY, FALSE) BREAK
CASE 10 SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P0_EXTERMINATOR, FALSE) BREAK
CASE 11 SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P0_MOVIE_TUXEDO, FALSE) BREAK
CASE 12 SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P0_LUDENDORFF, FALSE) BREAK
CASE 13 SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P0_BLUE_BOILER_SUIT, FALSE) BREAK
CASE 14 SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P0_PREP_BOILER_SUIT_1, FALSE) BREAK
CASE 15 SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P0_PREP_BOILER_SUIT_2, FALSE) BREAK
CASE 16 SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P0_PREP_BOILER_SUIT_3, FALSE) BREAK
CASE 17 SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P0_PROLOGUE, FALSE) BREAK
CASE 18 SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P0_COMMANDO, FALSE) BREAK
CASE 19 SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P0_DENIM, FALSE) BREAK
CASE 20 SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P0_LEATHER_AND_JEANS, FALSE) BREAK
CASE 21 SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P0_EPSILON_WITH_MEDAL, FALSE) BREAK
CASE 22 SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P0_DARK_GRAY_SUIT, FALSE) BREAK
CASE 23 SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P0_SHIRT_AND_PANTS, FALSE) BREAK
CASE 24 SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P0_YOGA_FLIP_FLOPS, FALSE) BREAK
CASE 25 SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P0_POLOSHIRT_PANTS, FALSE) BREAK
CASE 26 SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P0_BED, FALSE) BREAK
ENDSWITCH
BREAK
CASE CHAR_FRANKLIN
SWITCH GET_RANDOM_INT_IN_RANGE(0, 34)
CASE 0 SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P1_DEFAULT, FALSE) BREAK
CASE 1 SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P1_WHITE_TUXEDO, FALSE) BREAK
CASE 2 SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P1_GOLF, FALSE) BREAK
CASE 3 SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P1_STEALTH, FALSE) BREAK
CASE 4 SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P1_TRIATHLON, FALSE) BREAK
CASE 5 SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P1_EXTERMINATOR, FALSE) BREAK
CASE 6 SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P1_BLACK_BOILER, FALSE) BREAK
CASE 7 SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P1_SKYDIVING, FALSE) BREAK
CASE 8 SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P1_TUXEDO, FALSE) BREAK
CASE 9 SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P1_BLUE_BOILER_SUIT, FALSE) BREAK
CASE 10 SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P1_PREP_BOILER_SUIT_1, FALSE) BREAK
CASE 11 SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P1_PREP_BOILER_SUIT_2, FALSE) BREAK
CASE 12 SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P1_PREP_BOILER_SUIT_3, FALSE) BREAK
CASE 13 SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P1_GREEN_SHIRT_JEANS, FALSE) BREAK
CASE 14 SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P1_SUIT_1, FALSE) BREAK
CASE 15 SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P1_HOODIE_AND_JEANS_1, FALSE) BREAK
CASE 16 SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P1_TRACKSUIT_JEANS, FALSE) BREAK
CASE 17 SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P1_WHITE_SHIRT_JEANS, FALSE) BREAK
CASE 18 SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P1_3PC_SUIT_0, FALSE) BREAK
CASE 19 SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P1_3PC_SUIT_1, FALSE) BREAK
CASE 20 SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P1_3PC_SUIT_2, FALSE) BREAK
CASE 21 SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P1_3PC_SUIT_3, FALSE) BREAK
CASE 22 SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P1_3PC_SUIT_4, FALSE) BREAK
CASE 23 SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P1_3PC_SUIT_5, FALSE) BREAK
CASE 24 SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P1_3PC_SUIT_6, FALSE) BREAK
CASE 25 SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P1_3PC_SUIT_7, FALSE) BREAK
CASE 26 SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P1_3PC_SUIT_8, FALSE) BREAK
CASE 27 SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P1_3PC_SUIT_9, FALSE) BREAK
CASE 28 SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P1_3PC_SUIT_10, FALSE) BREAK
CASE 29 SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P1_3PC_SUIT_11, FALSE) BREAK
CASE 30 SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P1_3PC_SUIT_12, FALSE) BREAK
CASE 31 SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P1_3PC_SUIT_13, FALSE) BREAK
CASE 32 SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P1_3PC_SUIT_14, FALSE) BREAK
CASE 33 SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P1_3PC_SUIT_15, FALSE) BREAK
ENDSWITCH
BREAK
CASE CHAR_TREVOR
SWITCH GET_RANDOM_INT_IN_RANGE(0, 39)
CASE 0 SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P2_DEFAULT, FALSE) BREAK
CASE 1 SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P2_DOCK_WORKER, FALSE) BREAK
CASE 2 SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P2_HIGHWAY_PATROL, FALSE) BREAK
CASE 3 SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P2_GOLF, FALSE) BREAK
CASE 4 SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P2_TENNIS, FALSE) BREAK
CASE 5 SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P2_STEALTH, FALSE) BREAK
CASE 6 SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P2_TRIATHLON, FALSE) BREAK
CASE 7 SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P2_UNDERWEAR, FALSE) BREAK
CASE 8 SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P2_SECURITY, FALSE) BREAK
CASE 9 SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P2_DEFAULT, FALSE) BREAK
CASE 10 SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P2_PROLOGUE, FALSE) BREAK
CASE 11 SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P2_TUXEDO, FALSE) BREAK
CASE 12 SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P2_LADIES, FALSE) BREAK
CASE 13 SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P2_BLUE_BOILER_SUIT, FALSE) BREAK
CASE 14 SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P2_PREP_BOILER_SUIT_1, FALSE) BREAK
CASE 15 SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P2_PREP_BOILER_SUIT_2, FALSE) BREAK
CASE 16 SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P2_PREP_BOILER_SUIT_3, FALSE) BREAK
CASE 17 SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P2_HUNTING, FALSE) BREAK
CASE 18 SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P2_TSHIRT_CARGOPANTS_1, FALSE) BREAK
CASE 19 SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P2_DENIM, FALSE) BREAK
CASE 20 SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P2_LUDENDORFF, FALSE) BREAK
CASE 21 SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P2_CHEAPSUIT_0, FALSE) BREAK
CASE 22 SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P2_CHEAPSUIT_1, FALSE) BREAK
CASE 23 SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P2_CHEAPSUIT_2, FALSE) BREAK
CASE 24 SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P2_CHEAPSUIT_3, FALSE) BREAK
CASE 25 SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P2_CHEAPSUIT_4, FALSE) BREAK
CASE 26 SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P2_CHEAPSUIT_5, FALSE) BREAK
CASE 27 SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P2_CHEAPSUIT_6, FALSE) BREAK
CASE 28 SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P2_CHEAPSUIT_7, FALSE) BREAK
CASE 29 SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P2_CHEAPSUIT_8, FALSE) BREAK
CASE 30 SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P2_CHEAPSUIT_9, FALSE) BREAK
CASE 31 SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P2_STYLESUIT_0, FALSE) BREAK
CASE 32 SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P2_STYLESUIT_1, FALSE) BREAK
CASE 33 SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P2_STYLESUIT_2, FALSE) BREAK
CASE 34 SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P2_STYLESUIT_3, FALSE) BREAK
CASE 35 SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P2_STYLESUIT_4, FALSE) BREAK
CASE 36 SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P2_STYLESUIT_5, FALSE) BREAK
CASE 37 SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P2_STYLESUIT_6, FALSE) BREAK
CASE 38 SET_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P2_TSHIRT_CARGOPANTS_2, FALSE) BREAK
ENDSWITCH
BREAK
ENDSWITCH
bSetRandomoutfitOnStartup = FALSE
ENDIF
IF bTestTimelapseCutscene
INT iMissionEnum = GET_RANDOM_INT_IN_RANGE(0, ENUM_TO_INT(SP_MISSION_MAX)), iSavedMissionEnum
structTimelapse sTimelapse
structTimelapseSettings sTimelapseSettings
BOOL bMF_DO_TRIGGER_TOD_M, bMF_DO_TRIGGER_TOD_F, bMF_DO_TRIGGER_TOD_T
BOOL bTriggerTODRegardlessOfTimeForClothes = TRUE, bClearTheArea = TRUE
BOOL bDoTimelapse
TEXT_WIDGET_ID wTestWidget
SET_CURRENT_WIDGET_GROUP(widgetID)
WIDGET_GROUP_ID timelapseWidgetID = START_WIDGET_GROUP("bTestTimelapseCutscene")
ADD_WIDGET_BOOL("bTestTimelapseCutscene", bTestTimelapseCutscene)
ADD_WIDGET_INT_SLIDER("missionEnum", iMissionEnum, 0, ENUM_TO_INT(SP_MISSION_MAX)-1, 1)
wTestWidget = ADD_TEXT_WIDGET("missionEnum name")
SET_CONTENTS_OF_TEXT_WIDGET(wTestWidget, GET_SP_MISSION_DISPLAY_STRING_FROM_ID(INT_TO_ENUM(SP_MISSIONS, iMissionEnum)))
ADD_WIDGET_BOOL("bMF_DO_TRIGGER_TOD_M", bMF_DO_TRIGGER_TOD_M)
ADD_WIDGET_BOOL("bMF_DO_TRIGGER_TOD_F", bMF_DO_TRIGGER_TOD_F)
ADD_WIDGET_BOOL("bMF_DO_TRIGGER_TOD_T", bMF_DO_TRIGGER_TOD_T)
ADD_WIDGET_BOOL("bDoTimelapse", bDoTimelapse)
START_WIDGET_GROUP("GET_TOD_CUTSCENE_ATTRIBUTES")
ADD_WIDGET_VECTOR_SLIDER("camNode1Pos", sTimelapseSettings.vCamPos1 , -5000, 5000, 0.001)
ADD_WIDGET_VECTOR_SLIDER("camNode1Rot", sTimelapseSettings.vCamRot1, -360, 360, 0.001)
ADD_WIDGET_VECTOR_SLIDER("camNode2Pos", sTimelapseSettings.vCamPos2, -5000, 5000, 0.001)
ADD_WIDGET_VECTOR_SLIDER("camNode2Rot", sTimelapseSettings.vCamRot2, -360, 360, 0.001)
ADD_WIDGET_FLOAT_SLIDER("fCamFov", sTimelapseSettings.fCamFOV, -0, 100, 0.1)
ADD_WIDGET_INT_SLIDER("iSplineCamTime", sTimelapseSettings.iCamTime, 0, 15000, 0500)
ADD_WIDGET_STRING("tWeatherType") //, tWeatherType, -5000, 5000, 0.001)
ADD_WIDGET_STRING("tCloudHat") //, tCloudHat, -5000, 5000, 0.001)
ADD_WIDGET_BOOL("bSkipToNightTime", sTimelapse.bSkipToNightTime)
STOP_WIDGET_GROUP()
START_WIDGET_GROUP("GET_TOD_WINDOW_TIME")
ADD_WIDGET_INT_SLIDER("iTimeWindowStart", sTimelapse.iTimeWindowStart, -1, 25, 1)
ADD_WIDGET_INT_SLIDER("iTimeWindowEnd", sTimelapse.iTimeWindowEnd, -1, 25, 1)
ADD_WIDGET_BOOL("bTriggerTODRegardlessOfTimeForClothes", bTriggerTODRegardlessOfTimeForClothes)
ADD_WIDGET_BOOL("bClearTheArea", bClearTheArea)
STOP_WIDGET_GROUP()
STOP_WIDGET_GROUP()
CLEAR_CURRENT_WIDGET_GROUP(widgetID)
SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE(TRUE)
WHILE bTestTimelapseCutscene
SET_CONTENTS_OF_TEXT_WIDGET(wTestWidget, GET_SP_MISSION_DISPLAY_STRING_FROM_ID(INT_TO_ENUM(SP_MISSIONS, iMissionEnum)))
IF (iSavedMissionEnum <> iMissionEnum)
// CONST_INT MF_INDEX_DO_TRIGGER_TOD_M 8 // This mission will time of day skip to meet time restrictions before any lead-in scene is created for Michael.
// CONST_INT MF_INDEX_DO_TRIGGER_TOD_F 9 // This mission will time of day skip to meet time restrictions before any lead-in scene is created for Franklin.
// CONST_INT MF_INDEX_DO_TRIGGER_TOD_T 10 // This mission will time of day skip to meet time restrictions before any lead-in scene is created for Trevor.
bMF_DO_TRIGGER_TOD_M = IS_BIT_SET(g_sMissionStaticData[iMissionEnum].settingsBitset, MF_INDEX_DO_TRIGGER_TOD_M)
bMF_DO_TRIGGER_TOD_F = IS_BIT_SET(g_sMissionStaticData[iMissionEnum].settingsBitset, MF_INDEX_DO_TRIGGER_TOD_F)
bMF_DO_TRIGGER_TOD_T = IS_BIT_SET(g_sMissionStaticData[iMissionEnum].settingsBitset, MF_INDEX_DO_TRIGGER_TOD_T)
SP_MISSIONS eMissionID = INT_TO_ENUM(SP_MISSIONS, iMissionEnum)
GET_SP_MISSION_TOD_CUTSCENE_ATTRIBUTES(eMissionID, sTimelapseSettings)
GET_SP_MISSION_TOD_WINDOW_TIME(eMissionID, sTimelapseSettings.iLapseStartHour, sTimelapseSettings.iLapseEndHour)
sTimelapse.iTimeWindowStart = sTimelapseSettings.iLapseStartHour
sTimelapse.iTimeWindowEnd = sTimelapseSettings.iLapseEndHour
iSavedMissionEnum = iMissionEnum
ENDIF
IF INT_TO_ENUM(SP_MISSIONS, iMissionEnum) < SP_MISSION_MAX
STATIC_BLIP_NAME_ENUM eBluip = g_sMissionStaticData[iMissionEnum].blip
IF ENUM_TO_INT(eBluip) < g_iTotalStaticBlips
VECTOR vBlipPosition = g_GameBlips[eBluip].vCoords[0]
DRAW_DEBUG_SPHERE(vBlipPosition, 1.0, 000, 255, 128, 255)
ENDIF
ENDIF
IF IS_DEBUG_KEY_JUST_PRESSED(KEY_C, KEYBOARD_MODIFIER_SHIFT, "store camNode1")
sTimelapseSettings.vCamPos1 = GET_CAM_COORD(GET_DEBUG_CAM())
sTimelapseSettings.vCamRot1 = GET_CAM_ROT(GET_DEBUG_CAM())
sTimelapseSettings.fCamFOV = GET_CAM_FOV(GET_DEBUG_CAM())
ENDIF
IF IS_DEBUG_KEY_JUST_PRESSED(KEY_C, KEYBOARD_MODIFIER_CTRL, "store camNode2")
sTimelapseSettings.vCamPos2 = GET_CAM_COORD(GET_DEBUG_CAM())
sTimelapseSettings.vCamRot2 = GET_CAM_ROT(GET_DEBUG_CAM())
sTimelapseSettings.fCamFOV = GET_CAM_FOV(GET_DEBUG_CAM())
ENDIF
IF IS_DEBUG_KEY_JUST_PRESSED(KEY_C, KEYBOARD_MODIFIER_NONE, "save camNode1 & camNode2")
SAVE_STRING_TO_DEBUG_FILE("iMissionEnum = ")SAVE_STRING_TO_DEBUG_FILE(GET_SP_MISSION_DISPLAY_STRING_FROM_ID(INT_TO_ENUM(SP_MISSIONS, iMissionEnum)))SAVE_NEWLINE_TO_DEBUG_FILE()
SAVE_STRING_TO_DEBUG_FILE("camNode1Pos = ")SAVE_VECTOR_TO_DEBUG_FILE(sTimelapseSettings.vCamPos1)SAVE_NEWLINE_TO_DEBUG_FILE()
SAVE_STRING_TO_DEBUG_FILE("camNode1Rot = ")SAVE_VECTOR_TO_DEBUG_FILE(sTimelapseSettings.vCamRot1)SAVE_NEWLINE_TO_DEBUG_FILE()
SAVE_NEWLINE_TO_DEBUG_FILE()
SAVE_STRING_TO_DEBUG_FILE("camNode2Pos = ")SAVE_VECTOR_TO_DEBUG_FILE(sTimelapseSettings.vCamPos2)SAVE_NEWLINE_TO_DEBUG_FILE()
SAVE_STRING_TO_DEBUG_FILE("camNode2Rot = ")SAVE_VECTOR_TO_DEBUG_FILE(sTimelapseSettings.vCamRot2)SAVE_NEWLINE_TO_DEBUG_FILE()
SAVE_NEWLINE_TO_DEBUG_FILE()
SAVE_STRING_TO_DEBUG_FILE("fCamFov = ")SAVE_FLOAT_TO_DEBUG_FILE(sTimelapseSettings.fCamFOV)SAVE_NEWLINE_TO_DEBUG_FILE()
SAVE_NEWLINE_TO_DEBUG_FILE()
ENDIF
IF bDoTimelapse
LOAD_SCENE(sTimelapseSettings.vCamPos1)
VECTOR vMISSION_TOD_TRIGGER_POSITION
IF INT_TO_ENUM(SP_MISSIONS, iMissionEnum) < SP_MISSION_MAX
STATIC_BLIP_NAME_ENUM eBluip = g_sMissionStaticData[iMissionEnum].blip
IF ENUM_TO_INT(eBluip) < g_iTotalStaticBlips
vMISSION_TOD_TRIGGER_POSITION = g_GameBlips[eBluip].vCoords[0]
ENDIF
ENDIF
IF ARE_VECTORS_EQUAL(vMISSION_TOD_TRIGGER_POSITION, <<0,0,0>>)
vMISSION_TOD_TRIGGER_POSITION = GET_MISSION_TOD_END_POSITION(INT_TO_ENUM(SP_MISSIONS, iMissionEnum))
ENDIF
IF ARE_VECTORS_EQUAL(vMISSION_TOD_TRIGGER_POSITION, <<0,0,0>>)
vMISSION_TOD_TRIGGER_POSITION = sTimelapseSettings.vCamPos1
ENDIF
SET_ENTITY_COORDS(PLAYER_PED_ID(), vMISSION_TOD_TRIGGER_POSITION)
SET_ENTITY_HEADING(PLAYER_PED_ID(), GET_MISSION_TOD_END_HEADING(INT_TO_ENUM(SP_MISSIONS, iMissionEnum)))
// //
WHILE bDoTimelapse
CONST_INT iTIMELAPSE_0_request 0
CONST_INT iTIMELAPSE_1_create 1
CONST_INT iTIMELAPSE_22_run 22 //custom
CONST_INT iTIMELAPSE_2_run 2
CONST_INT iTIMELAPSE_3_hold 3
CONST_INT iTIMELAPSE_4_end 4
CONST_INT iTIMELAPSE_null -1
#IF IS_DEBUG_BUILD
CONST_INT iDrawLiteralSceneStringRow 0
// TEXT_LABEL_63 str
DrawLiteralSceneStringInt("iTimelapseCut:", sTimelapse.iTimelapseCut, iDrawLiteralSceneStringRow+0)
#ENDIF
CONST_FLOAT fCONST_timelapseCut 0.5
// Playing mission normally
SWITCH sTimelapse.iTimelapseCut
CASE iTIMELAPSE_0_request
CPRINTLN(DEBUG_SYSTEM, "<TOD> waiting on request AUDIO BANK \"TIME_LAPSE\".")
IF REQUEST_AMBIENT_AUDIO_BANK("TIME_LAPSE")
sTimelapse.iTimelapseCut = iTIMELAPSE_1_create
ENDIF
BREAK
CASE iTIMELAPSE_1_create
IF bTriggerTODRegardlessOfTimeForClothes
#IF IS_DEBUG_BUILD
IF sTimelapse.bSkipToNightTime
CPRINTLN(DEBUG_SYSTEM, "<TOD> Creating FORCED NIGHT timelapse. Starting from current hour ", GET_CLOCK_HOURS(), ". Blending to window end hour ", sTimelapse.iTimeWindowEnd, ".")
ELSE
CPRINTLN(DEBUG_SYSTEM, "<TOD> Creating FORCED DAY timelapse. Starting from current hour ", GET_CLOCK_HOURS(), ". Blending to window start hour ", sTimelapse.iTimeWindowStart, ".")
ENDIF
#ENDIF
DESTROY_CAM(sTimelapse.splineCamera)
sTimelapse.splineCamera = CREATE_CAM("DEFAULT_SPLINE_CAMERA")
ADD_CAM_SPLINE_NODE(sTimelapse.splineCamera, sTimelapseSettings.vCamPos1, sTimelapseSettings.vCamRot1, sTimelapseSettings.iCamTime)
IF (sTimelapseSettings.iCustomBehaviour < 0)
ADD_CAM_SPLINE_NODE(sTimelapse.splineCamera,sTimelapseSettings.vCamPos2, sTimelapseSettings.vCamRot2, sTimelapseSettings.iCamTime)
ELSE
ADD_CAM_SPLINE_NODE(sTimelapse.splineCamera,sTimelapseSettings.vCamPos1, sTimelapseSettings.vCamRot1, ROUND(TO_FLOAT(sTimelapseSettings.iCamTime) * fCONST_timelapseCut))
ENDIF
SET_CAM_FOV(sTimelapse.splineCamera, sTimelapseSettings.fCamFOV)
SET_CAM_ACTIVE(sTimelapse.splineCamera,TRUE)
CLEAR_ROOM_FOR_GAME_VIEWPORT()
CLEAR_AREA_OF_COPS(sTimelapseSettings.vCamPos1, GET_CAM_FAR_CLIP(sTimelapse.splineCamera)) //#1012871
SET_TIMEOFDAY(sTimelapse.currentTimeOfDay, 0, 0, 0, GET_CLOCK_DAY_OF_MONTH(), GET_CLOCK_MONTH(), GET_CLOCK_YEAR())
SET_TODS_CUTSCENE_RUNNING(sTimelapse, TRUE)
CASCADE_SHADOWS_SET_CASCADE_BOUNDS_SCALE(0.6)
CASCADE_SHADOWS_ENABLE_ENTITY_TRACKER(FALSE)
SET_PLAYER_VEH_RADIO_OFF_FOR_TIMELAPSE()
sTimelapse.iSplineStageSound = GET_SOUND_ID()
PLAY_SOUND_FRONTEND(sTimelapse.iSplineStageSound, "TIME_LAPSE_MASTER")
sTimelapse.iTimelapseCut = iTIMELAPSE_2_run
CPRINTLN(DEBUG_SYSTEM, "<TOD> Timelapse running...")
ELIF NOT IS_TIME_BETWEEN_THESE_HOURS(sTimelapse.iTimeWindowStart, sTimelapse.iTimeWindowEnd) //IS_DAYLIGHT_HOURS()
IF sTimelapse.bSkipToNightTime
CPRINTLN(DEBUG_SYSTEM, "<TOD> Creating NIGHT timelapse. Starting from current hour ", GET_CLOCK_HOURS(), ". Blending to window end hour ", sTimelapse.iTimeWindowEnd, ".")
DESTROY_CAM(sTimelapse.splineCamera)
sTimelapse.splineCamera = CREATE_CAM("DEFAULT_SPLINE_CAMERA")
ADD_CAM_SPLINE_NODE(sTimelapse.splineCamera, sTimelapseSettings.vCamPos1, sTimelapseSettings.vCamRot1, sTimelapseSettings.iCamTime)
IF (sTimelapseSettings.iCustomBehaviour < 0)
ADD_CAM_SPLINE_NODE(sTimelapse.splineCamera, sTimelapseSettings.vCamPos2, sTimelapseSettings.vCamRot2, sTimelapseSettings.iCamTime)
ELSE
ADD_CAM_SPLINE_NODE(sTimelapse.splineCamera, sTimelapseSettings.vCamPos1, sTimelapseSettings.vCamRot1, ROUND(TO_FLOAT(sTimelapseSettings.iCamTime) * fCONST_timelapseCut))
ENDIF
SET_CAM_FOV(sTimelapse.splineCamera, sTimelapseSettings.fCamFOV)
SET_CAM_ACTIVE(sTimelapse.splineCamera,TRUE)
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
CPRINTLN(DEBUG_SYSTEM, "<TOD> Hiding player as TOD camera deactivates.")
SET_ENTITY_VISIBLE(PLAYER_PED_ID(), FALSE)
ENDIF
VEHICLE_INDEX vehPlayerLast
vehPlayerLast = GET_PLAYERS_LAST_VEHICLE()
IF DOES_ENTITY_EXIST(vehPlayerLast)
CPRINTLN(DEBUG_SYSTEM, "<TOD> Hiding player's last vehicle as TOD camera deactivates.")
SET_ENTITY_VISIBLE(vehPlayerLast, FALSE)
ENDIF
CLEAR_ROOM_FOR_GAME_VIEWPORT()
CLEAR_AREA_OF_COPS(sTimelapseSettings.vCamPos1, GET_CAM_FAR_CLIP(sTimelapse.splineCamera)) //#1012871
SET_TIMEOFDAY(sTimelapse.currentTimeOfDay, 0, 0, 8, GET_CLOCK_DAY_OF_MONTH(), GET_CLOCK_MONTH(), GET_CLOCK_YEAR())
SET_TODS_CUTSCENE_RUNNING(sTimelapse, TRUE)
CASCADE_SHADOWS_SET_CASCADE_BOUNDS_SCALE(0.6)
CASCADE_SHADOWS_ENABLE_ENTITY_TRACKER(FALSE)
SET_PLAYER_VEH_RADIO_OFF_FOR_TIMELAPSE()
sTimelapse.iSplineStageSound = GET_SOUND_ID()
PLAY_SOUND_FRONTEND(sTimelapse.iSplineStageSound, "TIME_LAPSE_MASTER")
sTimelapse.iTimelapseCut = iTIMELAPSE_2_run
CPRINTLN(DEBUG_SYSTEM, "<TOD> Timelapse running...")
ELSE
CPRINTLN(DEBUG_SYSTEM, "<TOD> Night timelapse not running as current hour ", GET_CLOCK_HOURS(), " is already in valid window [", sTimelapse.iTimeWindowEnd, "->", sTimelapse.iTimeWindowStart, "].")
RELEASE_AMBIENT_AUDIO_BANK()
bDoTimelapse = NOT TRUE
ENDIF
ELSE
IF NOT sTimelapse.bSkipToNightTime
CPRINTLN(DEBUG_SYSTEM, "<TOD> Creating DAY timelapse. Starting from current hour ", GET_CLOCK_HOURS(), ". Blending to window start hour ", sTimelapse.iTimeWindowStart, ".")
DESTROY_CAM(sTimelapse.splineCamera)
sTimelapse.splineCamera = CREATE_CAM("DEFAULT_SPLINE_CAMERA")
ADD_CAM_SPLINE_NODE(sTimelapse.splineCamera, sTimelapseSettings.vCamPos1, sTimelapseSettings.vCamRot1, sTimelapseSettings.iCamTime)
IF (sTimelapseSettings.iCustomBehaviour < 0)
ADD_CAM_SPLINE_NODE(sTimelapse.splineCamera, sTimelapseSettings.vCamPos2, sTimelapseSettings.vCamRot2, sTimelapseSettings.iCamTime)
ELSE
ADD_CAM_SPLINE_NODE(sTimelapse.splineCamera, sTimelapseSettings.vCamPos1, sTimelapseSettings.vCamRot1, ROUND(TO_FLOAT(sTimelapseSettings.iCamTime) * fCONST_timelapseCut))
ENDIF
SET_CAM_FOV(sTimelapse.splineCamera, sTimelapseSettings.fCamFOV)
SET_CAM_SPLINE_SMOOTHING_STYLE(sTimelapse.splineCamera, CAM_SPLINE_SLOW_IN_OUT_SMOOTH)
SET_CAM_ACTIVE(sTimelapse.splineCamera,TRUE)
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
CPRINTLN(DEBUG_SYSTEM, "<TOD> Hiding player as TOD camera deactivates.")
SET_ENTITY_VISIBLE(PLAYER_PED_ID(), FALSE)
ENDIF
VEHICLE_INDEX vehPlayerLast
vehPlayerLast = GET_PLAYERS_LAST_VEHICLE()
IF DOES_ENTITY_EXIST(vehPlayerLast)
CPRINTLN(DEBUG_SYSTEM, "<TOD> Hiding player's last vehicle as TOD camera deactivates.")
SET_ENTITY_VISIBLE(vehPlayerLast, FALSE)
ENDIF
CLEAR_ROOM_FOR_GAME_VIEWPORT()
CLEAR_AREA_OF_COPS(sTimelapseSettings.vCamPos1, GET_CAM_FAR_CLIP(sTimelapse.splineCamera)) //#1012871
SET_TIMEOFDAY(sTimelapse.currentTimeOfDay, 0, 0, 0, GET_CLOCK_DAY_OF_MONTH(), GET_CLOCK_MONTH(), GET_CLOCK_YEAR())
SET_TODS_CUTSCENE_RUNNING(sTimelapse, TRUE)
CASCADE_SHADOWS_SET_CASCADE_BOUNDS_SCALE(0.6)
CASCADE_SHADOWS_ENABLE_ENTITY_TRACKER(FALSE)
SET_PLAYER_VEH_RADIO_OFF_FOR_TIMELAPSE()
sTimelapse.iSplineStageSound = GET_SOUND_ID()
PLAY_SOUND_FRONTEND(sTimelapse.iSplineStageSound, "TIME_LAPSE_MASTER")
sTimelapse.iTimelapseCut = iTIMELAPSE_2_run
CPRINTLN(DEBUG_SYSTEM, "<TOD> Timelapse running...")
ELSE
CPRINTLN(DEBUG_SYSTEM, "<TOD> Day timelapse not running as current hour ", GET_CLOCK_HOURS(), " is already in valid window [", sTimelapse.iTimeWindowStart, "->", sTimelapse.iTimeWindowEnd, "].")
RELEASE_AMBIENT_AUDIO_BANK()
bDoTimelapse = NOT TRUE
ENDIF
ENDIF
BREAK
CASE iTIMELAPSE_2_run
IF bClearTheArea
CLEAR_AREA(sTimelapseSettings.vCamPos1, 300.0, TRUE, TRUE)
ENDIF
IF NOT sTimelapse.bSkipToNightTime
IF SKIP_TO_TIME_DURING_SPLINE_CAMERA(sTimelapse.iTimeWindowEnd, 0, sTimelapseSettings.tWeatherType, sTimelapseSettings.tCloudHat, sTimelapse)
IF (sTimelapseSettings.iCustomBehaviour < 0)
sTimelapse.iGameTimeHold = GET_GAME_TIMER()
sTimelapse.iTimelapseCut = iTIMELAPSE_3_hold
CPRINTLN(DEBUG_SYSTEM, "<TOD> Timelapse holding...")
ELSE
sTimelapse.splineCamera = CREATE_CAM("DEFAULT_SPLINE_CAMERA")
ADD_CAM_SPLINE_NODE(sTimelapse.splineCamera, sTimelapseSettings.vCamPos1, sTimelapseSettings.vCamRot1, sTimelapseSettings.iCamTime)
ADD_CAM_SPLINE_NODE(sTimelapse.splineCamera, sTimelapseSettings.vCamPos2, sTimelapseSettings.vCamRot2, ROUND(TO_FLOAT(sTimelapseSettings.iCamTime) * (1-fCONST_timelapseCut)))
SET_CAM_FOV(sTimelapse.splineCamera, sTimelapseSettings.fCamFOV)
SET_CAM_SPLINE_SMOOTHING_STYLE(sTimelapse.splineCamera, CAM_SPLINE_SLOW_IN_OUT_SMOOTH)
SET_CAM_ACTIVE(sTimelapse.splineCamera,TRUE)
sTimelapse.iGameTimeHold = GET_GAME_TIMER()
sTimelapse.iTimelapseCut = iTIMELAPSE_22_run
CPRINTLN(DEBUG_SYSTEM, "<TOD> Custom timelapse running...")
ENDIF
ENDIF
ELSE
IF SKIP_TO_TIME_DURING_SPLINE_CAMERA(sTimelapse.iTimeWindowStart, 0, sTimelapseSettings.tWeatherType, sTimelapseSettings.tCloudHat, sTimelapse)
IF (sTimelapseSettings.iCustomBehaviour < 0)
sTimelapse.iGameTimeHold = GET_GAME_TIMER()
sTimelapse.iTimelapseCut = iTIMELAPSE_3_hold
CPRINTLN(DEBUG_SYSTEM, "<TOD> Timelapse holding...")
ELSE
sTimelapse.splineCamera = CREATE_CAM("DEFAULT_SPLINE_CAMERA")
ADD_CAM_SPLINE_NODE(sTimelapse.splineCamera, sTimelapseSettings.vCamPos1, sTimelapseSettings.vCamRot1, sTimelapseSettings.iCamTime)
ADD_CAM_SPLINE_NODE(sTimelapse.splineCamera, sTimelapseSettings.vCamPos2, sTimelapseSettings.vCamRot2, ROUND(TO_FLOAT(sTimelapseSettings.iCamTime) * (1-fCONST_timelapseCut)))
SET_CAM_FOV(sTimelapse.splineCamera, sTimelapseSettings.fCamFOV)
SET_CAM_SPLINE_SMOOTHING_STYLE(sTimelapse.splineCamera, CAM_SPLINE_SLOW_IN_OUT_SMOOTH)
SET_CAM_ACTIVE(sTimelapse.splineCamera,TRUE)
sTimelapse.iGameTimeHold = GET_GAME_TIMER()
sTimelapse.iTimelapseCut = iTIMELAPSE_22_run
CPRINTLN(DEBUG_SYSTEM, "<TOD> Custom timelapse running...")
ENDIF
ENDIF
ENDIF
IF IS_CUTSCENE_SKIP_BUTTON_JUST_PRESSED_WITH_DELAY()
CPRINTLN(DEBUG_SYSTEM, "<TOD> Timelapse skipped by user input.")
DO_SCREEN_FADE_OUT(DEFAULT_FADE_TIME_SHORT)
WHILE NOT IS_SCREEN_FADED_OUT()
HIDE_HUD_AND_RADAR_THIS_FRAME()
HIDE_HUD_COMPONENT_THIS_FRAME(NEW_HUD_AREA_NAME)
WAIT(0)
ENDWHILE
SET_TODS_CUTSCENE_RUNNING(sTimelapse, FALSE)
sTimelapse.iTimelapseCut = iTIMELAPSE_4_end
ENDIF
BREAK
CASE iTIMELAPSE_22_run
IF (DOES_CAM_EXIST(sTimelapse.splineCamera)
AND IS_CAM_INTERPOLATING(sTimelapse.splineCamera))
//
ELSE
sTimelapse.iGameTimeHold = GET_GAME_TIMER()
sTimelapse.iTimelapseCut = iTIMELAPSE_3_hold
CPRINTLN(DEBUG_SYSTEM, "<TOD> Timelapse holding...")
ENDIF
IF IS_CUTSCENE_SKIP_BUTTON_JUST_PRESSED_WITH_DELAY()
CPRINTLN(DEBUG_SYSTEM, "<TOD> Timelapse skipped by user input.")
DO_SCREEN_FADE_OUT(DEFAULT_FADE_TIME_SHORT)
WHILE NOT IS_SCREEN_FADED_OUT()
HIDE_HUD_AND_RADAR_THIS_FRAME()
HIDE_HUD_COMPONENT_THIS_FRAME(NEW_HUD_AREA_NAME)
WAIT(0)
ENDWHILE
SET_TODS_CUTSCENE_RUNNING(sTimelapse, FALSE)
sTimelapse.iTimelapseCut = iTIMELAPSE_4_end
ENDIF
BREAK
CASE iTIMELAPSE_3_hold
#IF IS_DEBUG_BUILD
DrawLiteralSceneStringInt("iTimelapseCut:", GET_GAME_TIMER()-sTimelapse.iTimelapseCut, iDrawLiteralSceneStringRow+1)
#ENDIF
IF (sTimelapse.iGameTimeHold+1000) > GET_GAME_TIMER()
PRINTLN("near dof: ", GET_CAM_NEAR_DOF(sTimelapse.splineCamera))
PRINTLN("far dof: ", GET_CAM_FAR_DOF(sTimelapse.splineCamera))
PRINTLN("near clip: ", GET_CAM_NEAR_CLIP(sTimelapse.splineCamera))
PRINTLN("far clip: ", GET_CAM_FAR_CLIP(sTimelapse.splineCamera))
PRINTLN("dof strength: ", GET_CAM_DOF_STRENGTH(sTimelapse.splineCamera))
PRINTNL()
sTimelapse.iTimelapseCut = iTIMELAPSE_4_end
CPRINTLN(DEBUG_SYSTEM, "<TOD> Timelapse ending...")
ENDIF
BREAK
CASE iTIMELAPSE_4_end
CASCADE_SHADOWS_INIT_SESSION()
STOP_SOUND(sTimelapse.iSplineStageSound)
RELEASE_AMBIENT_AUDIO_BANK()
sTimelapse.iTimelapseCut = iTIMELAPSE_null
CPRINTLN(DEBUG_SYSTEM, "<TOD> Timelapse ended. Waiting for script to trigger cleanup.")
bDoTimelapse = NOT TRUE
BREAK
CASE iTIMELAPSE_null
bDoTimelapse = NOT TRUE
BREAK
ENDSWITCH
WAIT(0)
ENDWHILE
SET_TODS_CUTSCENE_RUNNING(sTimelapse, FALSE)
sTimelapse.iTimelapseCut = 0
sTimelapse.iTimeSkipStage = 0
ENDIF
WAIT(0)
ENDWHILE
DELETE_WIDGET_GROUP(timelapseWidgetID)
ENDIF
IF bTestDefaultPlayerSwitchState
STORE_DEFAULT_PLAYER_SWITCH_STATE(PLAYER_PED_ID())
enumCharacterList ePed = GET_PLAYER_PED_ENUM(PLAYER_PED_ID())
DEFAULT_PLAYER_SWITCH_STATE_STRUCT sDefaultPlayerSwitchState = g_sDefaultPlayerSwitchState[ePed]
BOOL bStoreDefaultPlayerSwitchState
VECTOR vPlayerCoord = GET_ENTITY_COORDS(PLAYER_PED_ID())
SET_CURRENT_WIDGET_GROUP(widgetID)
WIDGET_GROUP_ID switchstateWidgetID = START_WIDGET_GROUP("bTestDefaultPlayerSwitchState")
ADD_WIDGET_BOOL("bTestDefaultPlayerSwitchState", bTestDefaultPlayerSwitchState)
ADD_WIDGET_BOOL("bStoreDefaultPlayerSwitchState", bStoreDefaultPlayerSwitchState)
STOP_WIDGET_GROUP()
CLEAR_CURRENT_WIDGET_GROUP(widgetID)
SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE(TRUE)
WHILE bTestDefaultPlayerSwitchState
IF bStoreDefaultPlayerSwitchState
vPlayerCoord = GET_ENTITY_COORDS(PLAYER_PED_ID())
STORE_DEFAULT_PLAYER_SWITCH_STATE(PLAYER_PED_ID())
sDefaultPlayerSwitchState = g_sDefaultPlayerSwitchState[ePed]
bStoreDefaultPlayerSwitchState = FALSE
ENDIF
//
DrawDefaultPlayerSwitchState(ePed, "vVehicleCoord_a", sDefaultPlayerSwitchState.vVehicleCoord_a, vPlayerCoord, sDefaultPlayerSwitchState.fVehicleHead_a, sDefaultPlayerSwitchState.fVehicleSpeed_a, 0.5, HUD_COLOUR_BLUE, FALSE)
DrawDefaultPlayerSwitchState(ePed, "vVehicleCoord_b", sDefaultPlayerSwitchState.vVehicleCoord_b, sDefaultPlayerSwitchState.vVehicleCoord_a, sDefaultPlayerSwitchState.fVehicleHead_b, sDefaultPlayerSwitchState.fVehicleSpeed_b, 0.5, HUD_COLOUR_BLUE, FALSE)
DrawDefaultPlayerSwitchState(ePed, "vVehicleCoord_c", sDefaultPlayerSwitchState.vVehicleCoord_c, sDefaultPlayerSwitchState.vVehicleCoord_b, sDefaultPlayerSwitchState.fVehicleHead_c, sDefaultPlayerSwitchState.fVehicleSpeed_c, 0.5, HUD_COLOUR_BLUE, FALSE)
//
DrawDefaultPlayerSwitchState(ePed, "vWalkCoord_a", sDefaultPlayerSwitchState.vWalkCoord_a, vPlayerCoord, sDefaultPlayerSwitchState.fWalkHead_a, -1, 0.1, HUD_COLOUR_GREEN, TRUE)
DrawDefaultPlayerSwitchState(ePed, "vWalkCoord_b", sDefaultPlayerSwitchState.vWalkCoord_b, sDefaultPlayerSwitchState.vWalkCoord_a, sDefaultPlayerSwitchState.fWalkHead_b, -1, 0.1, HUD_COLOUR_GREEN, TRUE)
DrawDefaultPlayerSwitchState(ePed, "vWalkCoord_c", sDefaultPlayerSwitchState.vWalkCoord_c, sDefaultPlayerSwitchState.vWalkCoord_b, sDefaultPlayerSwitchState.fWalkHead_c, -1, 0.1, HUD_COLOUR_GREEN, TRUE)
WAIT(0)
ENDWHILE
DELETE_WIDGET_GROUP(switchstateWidgetID)
ENDIF
IF bDrawSelectorShuit
SELECTOR_SLOTS_ENUM eSelectorChar
REPEAT NUM_OF_PLAYABLE_PEDS eSelectorChar
INT iPedIDNative1 = NATIVE_TO_INT(g_sPlayerPedRequest.sSelectorPeds.pedID[eSelectorChar])
INT iPedIDNative2 = NATIVE_TO_INT(sSceneData.sSelectorPeds.pedID[eSelectorChar])
TEXT_LABEL_63 paramText
paramText = "SELECTOR_"
paramText += GET_PLAYER_PED_STRING(GET_PLAYER_PED_ENUM_FROM_SELECTOR_SLOT(eSelectorChar))
paramText += ": "
paramText += iPedIDNative1
paramText += "/"
paramText += iPedIDNative2
IF (g_sPlayerPedRequest.sSelectorPeds.pedID[eSelectorChar] <> NULL)
STRING InstanceScript = ""
INT InstanceId = 0
InstanceScript = GET_ENTITY_SCRIPT(g_sPlayerPedRequest.sSelectorPeds.pedID[eSelectorChar], InstanceId)
paramText += ":"
paramText += InstanceScript
ENDIF
// //
FLOAT paramXPos = 0.205
FLOAT paramYPos = 0.075 + (0.02 * ENUM_TO_INT(eSelectorChar))
INT theR = 0, theG = 0, theB = 0, theA = 0
IF (g_sPlayerPedRequest.sSelectorPeds.pedID[eSelectorChar] <> NULL)
theR = 255 theG = 255 theB = 255
theA = 255
ELSE
IF IS_PED_THE_CURRENT_PLAYER_PED(GET_PLAYER_PED_ENUM_FROM_SELECTOR_SLOT(eSelectorChar))
theR = 128 theG = 128 theB = 255
ELSE
theR = 255 theG = 128 theB = 128
ENDIF
theA = 128
ENDIF
SET_TEXT_COLOUR(theR, theG, theB, theA)
SET_TEXT_SCALE(0.25, 0.3)
SET_TEXT_WRAP(0.0, 1.0)
SET_TEXT_DROPSHADOW(0, 0, 0, 0, 255)
DISPLAY_TEXT_WITH_LITERAL_STRING(paramXPos, paramYPos, "STRING", paramText)
// //
ENDREPEAT
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()
//Unregister player peds from the automatic doors.
PED_INDEX playerPed = PLAYER_PED_ID()
UNREGISTER_PLAYER_PED_WITH_AUTOMATIC_DOORS(GET_CURRENT_PLAYER_PED_ENUM(), playerPed)
// Remove all references to the player vehicles
INT i
REPEAT NUM_PLAYER_VEHICLE_IDS i
IF DOES_ENTITY_EXIST(g_viCreatedPlayerVehicleIDs[i])
PRINTLN("PLAYER VEHICLE ID GETTING SET TO NULL")
ENDIF
vLastPlayerVehicleCoords[i] = <<0,0,0>>
bLastPlayerVehicleInGarage[i] = FALSE
g_viCreatedPlayerVehicleIDs[i] = NULL
g_eCreatedPlayerVehiclePed[i] = NO_CHARACTER
g_eCreatedPlayerVehicleModel[i] = DUMMY_MODEL_FOR_SCRIPT
ENDREPEAT
TERMINATE_THIS_THREAD()
ENDPROC
///// PURPOSE: Checks if a request has been made to switch the player character
//PROC CHECK_PLAYER_PED_REQUEST()
// IF g_sPlayerPedRequest.eState = PR_STATE_PROCESSING
// eStage = PC_STAGE_SWITCH
// ENDIF
//ENDPROC
/// PURPOSE: Performs the player ped switch using the ped request data
//PROC MAINTAIN_PLAYER_PED_REQUEST()
// //////////////////////////////////////////////////////////////////////////////////////////////////
// /// Process the ped switch
// SWITCH g_sPlayerPedRequest.eState
// CASE PR_STATE_PROCESSING
// IF NOT IS_PED_INJURED(PLAYER_PED_ID())
// SWITCH g_sPlayerPedRequest.eType
//
// //////////////////////////////////////////////////////////////////////////////////////////////////
// /// Player has entered mission blip with the wrong character
// ///
// CASE PR_TYPE_MISSION
// SWITCH g_sPlayerPedRequest.iStage
// CASE 0
// g_sPlayerPedRequest.sSelectorPeds.bAmbient = TRUE
// eSelectorPed = GET_SELECTOR_SLOT_FROM_PLAYER_PED_ENUM(g_sPlayerPedRequest.ePed)
//
// // Make a dummy ped so we can run cam spline to them
// IF CREATE_PLAYER_PED_ON_FOOT(g_sPlayerPedRequest.sSelectorPeds.pedID[eSelectorPed], g_sPlayerPedRequest.ePed, GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_HEADING(PLAYER_PED_ID()))
//
// // Set invisible to avoid any popping issues
// SET_ENTITY_VISIBLE(g_sPlayerPedRequest.sSelectorPeds.pedID[eSelectorPed], FALSE)
//
// MAKE_SELECTOR_PED_SELECTION(g_sPlayerPedRequest.sSelectorPeds, eSelectorPed)
// sSelectorCam.pedTo = g_sPlayerPedRequest.sSelectorPeds.pedID[eSelectorPed]
// g_sPlayerPedRequest.iStage++
// ENDIF
// BREAK
//
// CASE 1
// // Use a long spline so we can delete the current character and dont see the new character pop into place
// IF RUN_CAM_SPLINE_FROM_PLAYER_TO_PED(sSelectorCam, 0.0, 0.0, SELECTOR_CAM_LONG_SPLINE) // Returns FALSE when the camera spline is complete
// IF sSelectorCam.bOKToSwitchPed
// IF NOT sSelectorCam.bPedSwitched
// IF TAKE_CONTROL_OF_SELECTOR_PED(g_sPlayerPedRequest.sSelectorPeds, FALSE)
// sSelectorCam.bPedSwitched = TRUE
// ENDIF
// ENDIF
// ENDIF
// ELSE
// IF DOES_ENTITY_EXIST(g_sPlayerPedRequest.sSelectorPeds.pedID[g_sPlayerPedRequest.sSelectorPeds.ePreviousSelectorPed])
// SET_PED_AS_NO_LONGER_NEEDED(g_sPlayerPedRequest.sSelectorPeds.pedID[g_sPlayerPedRequest.sSelectorPeds.ePreviousSelectorPed])
// ENDIF
// DISABLE_CELLPHONE(FALSE)
// g_sPlayerPedRequest.eState = PR_STATE_COMPLETE
// ENDIF
// BREAK
// ENDSWITCH
// BREAK
//
// //////////////////////////////////////////////////////////////////////////////////////////////////
// /// Player has selected character from ambient hotswap HUD
// ///
// CASE PR_TYPE_AMBIENT
//
// SWITCH g_sPlayerPedRequest.iStage
// CASE 0
// // Fix for bug #107444 - Add a communication delay so the current character
// // cannot contact you straight after you switch to the selected character.
// enumCharacterList eCurrentPed
// eCurrentPed = GET_CURRENT_PLAYER_PED_ENUM()
// IF eCurrentPed <> NO_CHARACTER
// ADD_COMMUNICATION_DELAY_FOR_CHARACTER(eCurrentPed)
// ENDIF
//
// // Set the global communication delay to a short timer when switching
// ADD_GLOBAL_COMMUNICATION_DELAY(6000)
//
// // Setup the scene data
// sSceneData.iStage = 0
// sSceneData.eScene = PR_SCENE_INVALID
// sSceneData.ePed = g_sPlayerPedRequest.ePed
//
// FLOAT fScenePercent
//
// PED_SCENE_STRUCT sPedScene
// PLAYER_TIMETABLE_SCENE_STRUCT sPassedScene
//
// IF NOT IS_CURRENTLY_ON_MISSION_TO_TYPE(MISSION_TYPE_SWITCH)
// AND GET_PLAYER_PED_SCENE_FOR_CURRENT_TIME(sSceneData.ePed, sSceneData.eScene, fScenePercent, sPedScene, sPassedScene)
//
// #IF IS_DEBUG_BUILD
// PRINTSTRING("<player_controller> GET_PLAYER_PED_SCENE_FOR_CURRENT_TIME[\"")
// PRINTSTRING(Get_String_From_Ped_Request_Scene_Enum(sSceneData.eScene))
// PRINTSTRING("\"] fScenePercent:")
// PRINTFLOAT(fScenePercent)
// PRINTSTRING("%")
// PRINTNL()
// #ENDIF
//
// g_sPlayerPedRequest.iStage++
// ELSE
// // Unable to get a suitable scene so bail out
// g_sPlayerPedRequest.eState = PR_STATE_COMPLETE
// ENDIF
// BREAK
// CASE 1
//
// IF PROCESS_PLAYER_PED_SCENE(sSceneData)
// g_sPlayerPedRequest.eState = PR_STATE_COMPLETE
// ENDIF
// BREAK
// ENDSWITCH
// BREAK
// ENDSWITCH
// ENDIF
// BREAK
//
// // Process complete so finish up
// CASE PR_STATE_COMPLETE
//
// //Update the player's air vehicle parachute state after switching based on flowflag. #839147
// IF IS_PLAYER_PLAYING(PLAYER_ID())
// SET_AUTO_GIVE_PARACHUTE_WHEN_ENTER_PLANE(PLAYER_ID(), GET_MISSION_FLOW_FLAG_STATE(FLOWFLAG_AIR_VEHICLE_PARACHUTE_UNLOCKED))
// ENDIF
// IF IS_PLAYER_PLAYING(PLAYER_ID())
// SET_AUTO_GIVE_SCUBA_GEAR_WHEN_EXIT_VEHICLE(PLAYER_ID(), GET_MISSION_FLOW_FLAG_STATE(FLOWFLAG_WATER_VEHICLE_SCUBA_GEAR_UNLOCKED))
// ENDIF
//
// eStage = PC_STAGE_WAIT
// BREAK
// ENDSWITCH
//
//ENDPROC
/// PURPOSE: Checks to see if the player controller should be re-initialised
PROC CHECK_CONTROLLER_RESET()
// Jump back to the initialisation stage
IF NOT HAS_DEFAULT_INFO_BEEN_SET()
eStage = PC_STAGE_INIT
EXIT
ENDIF
ENDPROC
PROC ProcessAmbientSelectorPedQueue()
IF (g_ambientSelectorPedDeleteQueue[iProcessAmbientQueue] = PLAYER_PED_ID())
g_ambientSelectorPedDeleteQueue[iProcessAmbientQueue] = NULL
ENDIF
IF NOT IS_ENTITY_DEAD(g_ambientSelectorPedDeleteQueue[iProcessAmbientQueue])
#IF IS_DEBUG_BUILD
enumCharacterList eCharList = GET_PLAYER_PED_ENUM(g_ambientSelectorPedDeleteQueue[iProcessAmbientQueue])
#ENDIF
IF DOES_ENTITY_BELONG_TO_THIS_SCRIPT(g_ambientSelectorPedDeleteQueue[iProcessAmbientQueue])
IF IS_ENTITY_ON_SCREEN(g_ambientSelectorPedDeleteQueue[iProcessAmbientQueue])
IF NOT IS_ENTITY_DEAD(g_ambientSelectorPedDeleteQueue[iProcessAmbientQueue])
IF (GET_SCRIPT_TASK_STATUS(g_ambientSelectorPedDeleteQueue[iProcessAmbientQueue], SCRIPT_TASK_WANDER_STANDARD) <> PERFORMING_TASK)
AND (GET_SCRIPT_TASK_STATUS(g_ambientSelectorPedDeleteQueue[iProcessAmbientQueue], SCRIPT_TASK_SMART_FLEE_POINT) <> PERFORMING_TASK)
TASK_WANDER_STANDARD(g_ambientSelectorPedDeleteQueue[iProcessAmbientQueue])
#IF IS_DEBUG_BUILD
CPRINTLN(DEBUG_SWITCH, "<player_controller.DeleteQueuedPlayerChars> task player ped \"", GET_PLAYER_PED_STRING(eCharList), "\" to wander...")
#ENDIF
ENDIF
ENDIF
ELSE
DELETE_PED(g_ambientSelectorPedDeleteQueue[iProcessAmbientQueue])
#IF IS_DEBUG_BUILD
CPRINTLN(DEBUG_SWITCH, "<player_controller.DeleteQueuedPlayerChars> delete player ped \"", GET_PLAYER_PED_STRING(eCharList), "\"")
#ENDIF
ENDIF
ELSE
STRING InstanceScript = ""
INT InstanceId = 0
InstanceScript = GET_ENTITY_SCRIPT(g_ambientSelectorPedDeleteQueue[iProcessAmbientQueue], InstanceId)
IF NOT IS_STRING_NULL_OR_EMPTY(InstanceScript)
IF ARE_STRINGS_EQUAL(InstanceScript, "spy_vehicle_system")
EXIT
ENDIF
ENDIF
#IF IS_DEBUG_BUILD
CPRINTLN(DEBUG_SWITCH, "<player_controller.DeleteQueuedPlayerChars> doesnt belong to this script \"", GET_PLAYER_PED_STRING(GET_PLAYER_PED_ENUM(g_ambientSelectorPedDeleteQueue[iProcessAmbientQueue])), "\", belongs to \"", InstanceScript, "\" [", InstanceId, "]")
#ENDIF
IF IS_STRING_NULL_OR_EMPTY(InstanceScript)
SET_ENTITY_AS_MISSION_ENTITY(g_ambientSelectorPedDeleteQueue[iProcessAmbientQueue], TRUE, TRUE)
EXIT
ENDIF
IF ARE_STRINGS_EQUAL(InstanceScript, "player_controller_b")
SET_ENTITY_AS_MISSION_ENTITY(g_ambientSelectorPedDeleteQueue[iProcessAmbientQueue], TRUE, TRUE)
EXIT
ENDIF
IF ARE_STRINGS_EQUAL(InstanceScript, "friends_controller")
SET_ENTITY_AS_MISSION_ENTITY(g_ambientSelectorPedDeleteQueue[iProcessAmbientQueue], TRUE, TRUE)
EXIT
ENDIF
// SET_ENTITY_AS_MISSION_ENTITY(sSceneData.sSelectorPeds.pedID[eAmbientPlayerSelectorChar], TRUE, TRUE)
// CASSERTLN(DEBUG_SWITCH, "SET_ENTITY_AS_MISSION_ENTITY!!!")
ENDIF
ENDIF
iProcessAmbientQueue++
IF iProcessAmbientQueue >= COUNT_OF(g_ambientSelectorPedDeleteQueue)
iProcessAmbientQueue = 0
ENDIF
ENDPROC
FUNC BOOL CheckForPlayerInDestroyedVehicle(enumCharacterList eCharList)
IF (g_sPlayerLastVeh[eCharList].model = DUMMY_MODEL_FOR_SCRIPT)
CPRINTLN(DEBUG_SWITCH, "CheckForPlayerInDestroyedVehicle(", GET_PLAYER_PED_STRING(eCharList), "): model: dummy")
RETURN FALSE
ENDIF
IF (g_sPlayerLastVeh[eCharList].fHealth > 0)
CPRINTLN(DEBUG_SWITCH, "CheckForPlayerInDestroyedVehicle(", GET_PLAYER_PED_STRING(eCharList), "): health: ", g_sPlayerLastVeh[eCharList].fHealth)
RETURN FALSE
ENDIF
IF g_SavedGlobals.sPlayerSceneData.g_ePlayerLastScene[eCharList] = PR_SCENE_DEAD
CPRINTLN(DEBUG_SWITCH, "CheckForPlayerInDestroyedVehicle(", GET_PLAYER_PED_STRING(eCharList), "): already dead")
RETURN FALSE
ENDIF
CPRINTLN(DEBUG_SWITCH, "CheckForPlayerInDestroyedVehicle(", GET_PLAYER_PED_STRING(eCharList), "): vehicle \"", GET_MODEL_NAME_FOR_DEBUG(g_sPlayerLastVeh[eCharList].model), "\" destroyed, player is dead")
CERRORLN(DEBUG_SWITCH, "CheckForPlayerInDestroyedVehicle(", GET_PLAYER_PED_STRING(eCharList), "): vehicle \"", GET_MODEL_NAME_FOR_DEBUG(g_sPlayerLastVeh[eCharList].model), "\" destroyed, player is dead")
g_SavedGlobals.sPlayerSceneData.g_ePlayerLastScene[eCharList] = PR_SCENE_DEAD
g_savedGlobals.sPlayerData.sInfo.sLastTimeActive[eCharList] = GET_CURRENT_TIMEOFDAY()
g_sPlayerLastVeh[eCharList].model = DUMMY_MODEL_FOR_SCRIPT
g_vPlayerVeh[eCharList] = NULL
RETURN TRUE
ENDFUNC
PROC CreateAmbientPlayerChars()
enumCharacterList eCharList = GET_PLAYER_PED_ENUM_FROM_SELECTOR_SLOT(eAmbientPlayerSelectorChar)
IF NOT IS_PED_THE_CURRENT_PLAYER_PED(eCharList)
IF (sSceneData.sSelectorPeds.pedID[eAmbientPlayerSelectorChar] <> g_sPlayerPedRequest.sSelectorPeds.pedID[eAmbientPlayerSelectorChar])
IF DOES_ENTITY_EXIST(sSceneData.sSelectorPeds.pedID[eAmbientPlayerSelectorChar])
IF NOT DOES_ENTITY_EXIST(g_sPlayerPedRequest.sSelectorPeds.pedID[eAmbientPlayerSelectorChar])
//#1308553
g_sPlayerPedRequest.sSelectorPeds.pedID[eAmbientPlayerSelectorChar] = sSceneData.sSelectorPeds.pedID[eAmbientPlayerSelectorChar]
CPRINTLN(DEBUG_SWITCH, "update backwards \"", GET_PLAYER_PED_STRING(eCharList), "\"")
ENDIF
ENDIF
sSceneData.sSelectorPeds.pedID[eAmbientPlayerSelectorChar] = g_sPlayerPedRequest.sSelectorPeds.pedID[eAmbientPlayerSelectorChar]
IF NOT IS_ENTITY_DEAD(sSceneData.sSelectorPeds.pedID[eAmbientPlayerSelectorChar])
SAFE_AMBIENT_STORE_PLAYER_PED_INFO(sSceneData.sSelectorPeds.pedID[eAmbientPlayerSelectorChar])
g_savedGlobals.sPlayerData.sInfo.sLastTimeActive[eCharList] = GET_CURRENT_TIMEOFDAY()
IF IS_PED_IN_ANY_VEHICLE(sSceneData.sSelectorPeds.pedID[eAmbientPlayerSelectorChar])
VEHICLE_INDEX selectorChar_veh = GET_VEHICLE_PED_IS_IN(sSceneData.sSelectorPeds.pedID[eAmbientPlayerSelectorChar])
IF DOES_ENTITY_EXIST(selectorChar_veh)
SET_ENTITY_AS_MISSION_ENTITY(selectorChar_veh, TRUE, TRUE)
STORE_VEH_DATA_FROM_PED(sSceneData.sSelectorPeds.pedID[eAmbientPlayerSelectorChar],
g_sPlayerLastVeh[eCharList],
g_vPlayerLastVehCoord[eCharList],
g_fPlayerLastVehHead[eCharList],
g_ePlayerLastVehState[eCharList],
g_ePlayerLastVehGen[eCharList])
CheckForPlayerInDestroyedVehicle(eCharList)
SET_VEHICLE_AS_NO_LONGER_NEEDED(selectorChar_veh)
#IF IS_DEBUG_BUILD
CPRINTLN(DEBUG_SWITCH, "<CreateAmbientPlayerChars> store player b \"", GET_PLAYER_PED_STRING(eCharList), "\"") //CASSERTLN(DEBUG_SWITCH, "test one - store player b")
#ENDIF
ENDIF
ENDIF
ENDIF
SET_PLAYER_PED_MODEL_AS_NO_LONGER_NEEDED(eCharList)
IF g_sPlayerLastVeh[eCharList].model <> DUMMY_MODEL_FOR_SCRIPT
SET_MODEL_AS_NO_LONGER_NEEDED(g_sPlayerLastVeh[eCharList].model)
ENDIF
#IF IS_DEBUG_BUILD
IF NOT DOES_ENTITY_EXIST(sSceneData.sSelectorPeds.pedID[eAmbientPlayerSelectorChar])
CPRINTLN(DEBUG_SWITCH, "<CreateAmbientPlayerChars> update sSceneData.sSelectorPeds.pedID[\"", GET_PLAYER_PED_STRING(eCharList), "\"] ", "model:", "NULL")
/* */
CPRINTLN(DEBUG_SWITCH, " g_savedGlobals.sPlayerData.sInfo.vLastKnownCoords[\"", GET_PLAYER_PED_STRING(eCharList), "\"]: ", g_savedGlobals.sPlayerData.sInfo.vLastKnownCoords[eCharList])
CPRINTLN(DEBUG_SWITCH, " g_savedGlobals.sPlayerData.sInfo.sLastTimeActive[\"", GET_PLAYER_PED_STRING(eCharList), "\"]: ", Get_String_From_TIMEOFDAY(g_savedGlobals.sPlayerData.sInfo.sLastTimeActive[eCharList]))
/* */
ELSE
CPRINTLN(DEBUG_SWITCH, "<CreateAmbientPlayerChars> update sSceneData.sSelectorPeds.pedID[\"", GET_PLAYER_PED_STRING(eCharList), "\"] ", "model:", GET_MODEL_NAME_FOR_DEBUG(GET_ENTITY_MODEL(sSceneData.sSelectorPeds.pedID[eAmbientPlayerSelectorChar])))
ENDIF
DrawLiteralSceneString(GET_PLAYER_PED_STRING(eCharList), 7+(ENUM_TO_INT(eCharList)*3))
DrawLiteralSceneString("<> ", 9+(ENUM_TO_INT(eCharList)*3))
#ENDIF
EXIT
ENDIF
IF NOT DOES_ENTITY_EXIST(sSceneData.sSelectorPeds.pedID[eAmbientPlayerSelectorChar])
#IF IS_DEBUG_BUILD
DrawLiteralSceneString(GET_PLAYER_PED_STRING(eCharList), 7+(ENUM_TO_INT(eCharList)*3), HUD_COLOUR_GREYLIGHT, 0.25)
DrawLiteralSceneString("NOT DOES_ENTITY_EXIST", 9+(ENUM_TO_INT(eCharList)*3), HUD_COLOUR_GREYLIGHT, 0.25)
#ENDIF
//
enumCreateState eCreateState = eCS_MAX
IF NOT SafeToCreatePlayerAmbientPedAtLastKnownLocation(eCharList, eCreateState)
IF (g_sPlayerPedRequest.sSelectorPeds.pedID[eAmbientPlayerSelectorChar] <> NULL)
g_sPlayerPedRequest.sSelectorPeds.pedID[eAmbientPlayerSelectorChar] = NULL
#IF IS_DEBUG_BUILD
CPRINTLN(DEBUG_SWITCH, "nonexistant peds global pedID[", GET_PLAYER_PED_STRING(eCharList), "] should be NULL")
#ENDIF
ENDIF
ELSE
PED_INDEX playerLastKnownPedID = NULL
IF CREATE_PLAYER_PED_IN_LAST_KNOWN_VEHICLE_AT_LOCATION(playerLastKnownPedID,
eCharList,
g_sPlayerLastVeh[eCharList],
TRUE)
g_sPlayerPedRequest.sSelectorPeds.pedID[eAmbientPlayerSelectorChar] = playerLastKnownPedID
#IF IS_DEBUG_BUILD
CPRINTLN(DEBUG_SWITCH, "<CreateAmbientPlayerChars> create player ped \"", GET_PLAYER_PED_STRING(eCharList), "\" at last coord...")
#ENDIF
PRIVATE_SetDefaultPlayerPedAttributes(g_sPlayerPedRequest.sSelectorPeds)
ENDIF
ENDIF
ELSE
//Is this ambient player chars wait timer at 0?
INT iGameTime = GET_GAME_TIMER()
IF g_iCharWaitTime[eCharList] < iGameTime+1000
#IF IS_DEBUG_BUILD
CPRINTLN(DEBUG_SWITCH, "<CreateAmbientPlayerChars> incrament global communication delay \"", GET_PLAYER_PED_STRING(eCharList), "\"")
#ENDIF
ADD_COMMUNICATION_DELAY_FOR_CHARACTER(eCharList)
ENDIF
IF IS_ENTITY_A_PED(sSceneData.sSelectorPeds.pedID[eAmbientPlayerSelectorChar])
IF NOT IS_ENTITY_DEAD(sSceneData.sSelectorPeds.pedID[eAmbientPlayerSelectorChar])
enumCreateState eDeleteState = eCS_MAX
IF SafeToDeletePlayerAmbientPed(sSceneData.sSelectorPeds.pedID[eAmbientPlayerSelectorChar], eCharList, eAmbientPlayerSelectorChar, eDeleteState)
#IF IS_DEBUG_BUILD
DrawLiteralSceneString(GET_PLAYER_PED_STRING(eCharList), 7+(ENUM_TO_INT(eCharList)*3))
DrawLiteralSceneString("safe to delete", 9+(ENUM_TO_INT(eCharList)*3))
#ENDIF
IF DOES_ENTITY_BELONG_TO_THIS_SCRIPT(sSceneData.sSelectorPeds.pedID[eAmbientPlayerSelectorChar])
SAFE_AMBIENT_STORE_PLAYER_PED_INFO(sSceneData.sSelectorPeds.pedID[eAmbientPlayerSelectorChar])
g_savedGlobals.sPlayerData.sInfo.sLastTimeActive[eCharList] = GET_CURRENT_TIMEOFDAY()
VEHICLE_INDEX selectorChar_veh
IF IS_PED_IN_ANY_VEHICLE(sSceneData.sSelectorPeds.pedID[eAmbientPlayerSelectorChar])
selectorChar_veh = GET_VEHICLE_PED_IS_IN(sSceneData.sSelectorPeds.pedID[eAmbientPlayerSelectorChar])
ELIF DOES_ENTITY_EXIST(g_vPlayerVeh[eCharList])
IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), g_vPlayerVeh[eCharList])
selectorChar_veh = g_vPlayerVeh[eCharList]
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(selectorChar_veh)
SET_ENTITY_AS_MISSION_ENTITY(selectorChar_veh, TRUE, TRUE)
STORE_VEH_DATA_FROM_PED(sSceneData.sSelectorPeds.pedID[eAmbientPlayerSelectorChar],
g_sPlayerLastVeh[eCharList],
g_vPlayerLastVehCoord[eCharList],
g_fPlayerLastVehHead[eCharList],
g_ePlayerLastVehState[eCharList],
g_ePlayerLastVehGen[eCharList])
CheckForPlayerInDestroyedVehicle(eCharList)
SET_ENTITY_COORDS(sSceneData.sSelectorPeds.pedID[eAmbientPlayerSelectorChar], GET_ENTITY_COORDS(sSceneData.sSelectorPeds.pedID[eAmbientPlayerSelectorChar]))
DELETE_VEHICLE(selectorChar_veh)
#IF IS_DEBUG_BUILD
CPRINTLN(DEBUG_SWITCH, "<CreateAmbientPlayerChars> delete player vehicle \"", GET_PLAYER_PED_STRING(eCharList), "\"")
#ENDIF
ENDIF
DELETE_PED(sSceneData.sSelectorPeds.pedID[eAmbientPlayerSelectorChar])
IF DOES_ENTITY_EXIST(g_sPlayerPedRequest.sSelectorPeds.pedID[eAmbientPlayerSelectorChar])
CERRORLN(DEBUG_SWITCH, "<CreateAmbientPlayerChars> global g_sPlayerPedRequest existed after deleting sSceneData??")
DELETE_PED(g_sPlayerPedRequest.sSelectorPeds.pedID[eAmbientPlayerSelectorChar])
ENDIF
#IF IS_DEBUG_BUILD
CPRINTLN(DEBUG_SWITCH, "<CreateAmbientPlayerChars> safe to delete player ped \"", GET_PLAYER_PED_STRING(eCharList), "\"")
#ENDIF
ELSE
STRING InstanceScript = ""
INT InstanceId = 0
InstanceScript = GET_ENTITY_SCRIPT(sSceneData.sSelectorPeds.pedID[eAmbientPlayerSelectorChar], InstanceId)
#IF IS_DEBUG_BUILD
CPRINTLN(DEBUG_SWITCH, "<CreateAmbientPlayerChars> doesnt belong to this script \"", GET_PLAYER_PED_STRING(eCharList), "\", belongs to \"", InstanceScript, "\" [", InstanceId, "]")
#ENDIF
IF IS_STRING_NULL_OR_EMPTY(InstanceScript)
SET_ENTITY_AS_MISSION_ENTITY(sSceneData.sSelectorPeds.pedID[eAmbientPlayerSelectorChar], TRUE, TRUE)
EXIT
ENDIF
IF ARE_STRINGS_EQUAL(InstanceScript, "player_controller_b")
SET_ENTITY_AS_MISSION_ENTITY(sSceneData.sSelectorPeds.pedID[eAmbientPlayerSelectorChar], TRUE, TRUE)
EXIT
ENDIF
IF ARE_STRINGS_EQUAL(InstanceScript, "friends_controller")
EXIT
ENDIF
IF ARE_STRINGS_EQUAL(InstanceScript, "FriendActivity")
OR ARE_STRINGS_EQUAL(InstanceScript, "family_scene_t0")
EXIT
ENDIF
IF ARE_STRINGS_EQUAL(InstanceScript, "mission_triggerer_a")
OR ARE_STRINGS_EQUAL(InstanceScript, "mission_triggerer_b")
OR ARE_STRINGS_EQUAL(InstanceScript, "mission_triggerer_c")
OR ARE_STRINGS_EQUAL(InstanceScript, "mission_triggerer_d")
EXIT
ENDIF
IF ARE_STRINGS_EQUAL(InstanceScript, "selector_example")
EXIT
ENDIF
// SET_ENTITY_AS_MISSION_ENTITY(sSceneData.sSelectorPeds.pedID[eAmbientPlayerSelectorChar], TRUE, TRUE)
CERRORLN(DEBUG_SWITCH, "<CreateAmbientPlayerChars> DON'T set ", GET_MODEL_NAME_FOR_DEBUG(GET_ENTITY_MODEL(sSceneData.sSelectorPeds.pedID[eAmbientPlayerSelectorChar])), " as mission entity[InstanceScript: \"", InstanceScript, "\"]!!!") //#1583178
ENDIF
ELSE
#IF IS_DEBUG_BUILD
TEXT_LABEL_63 tStr1, tStr2
tStr1 = ("not safe to delete \"")
tStr1 += (GET_PLAYER_PED_STRING(eCharList))
tStr1 += ("\" ")
tStr2 = ""
SWITCH eDeleteState
CASE eDS_1_PLAYER_NOT_PLAYING
tStr2 += ("1_PLAYER_NOT_PLAYING")
BREAK
CASE eDS_2_PLAYER_LAST_SCENE_DEAD
tStr2 += ("2_PLAYER_LAST_SCENE_DEAD")
BREAK
CASE eDS_3_CURRENT_SELECTOR_PED
tStr2 += ("3_CURRENT_SELECTOR_PED")
BREAK
CASE eDS_4_NEW_SELECTOR_PED
tStr2 += ("4_NEW_SELECTOR_PED")
BREAK
CASE eDS_5_SWITCH_IN_PROGRESS
tStr2 += ("5_SWITCH_IN_PROGRESS")
BREAK
CASE eDS_6_TOO_CLOSE_TO_DELETE
tStr2 += ("6 too close to delete[")
VECTOR vFriendCharLastKnown, vPlayerCharCurrent
vFriendCharLastKnown = GET_ENTITY_COORDS(sSceneData.sSelectorPeds.pedID[eAmbientPlayerSelectorChar], FALSE)
vPlayerCharCurrent = GET_ENTITY_COORDS(PLAYER_PED_ID())
tStr2 += ROUND(VDIST(vFriendCharLastKnown, vPlayerCharCurrent))
tStr2 += ("/")
tStr2 += ROUND(fCONST_FRIEND_TOO_CLOSE_TO_DELETE)
tStr2 += ("m]")
DrawDebugSceneSphere(vFriendCharLastKnown, fCONST_FRIEND_TOO_CLOSE_TO_DELETE, HUD_COLOUR_PURE_WHITE, 0.15)
BREAK
CASE eDS_7_ON_SCREEN
tStr2 += ("7_ON_SCREEN")
BREAK
// CASE eDS_8_SWITCH_TYPE_MISSION
// tStr2 += ("8_SWITCH_TYPE_MISSION")
// BREAK
CASE eDS_9_SWITCH_STATE_PROCESSING
tStr2 += ("9_SWITCH_STATE_PROCESSING")
BREAK
CASE eDS_10_LEADIN
tStr2 += ("10_LEADIN")
BREAK
CASE eDS_11_DIRECTOR_MODE
tStr2 += ("xx_DIRECTOR_MODE")
BREAK
DEFAULT
tStr2 += ("")
tStr2 += (ENUM_TO_INT(eDeleteState))
tStr2 += ("_unknown")
BREAK
ENDSWITCH
DrawLiteralSceneString(tStr1, 7+(ENUM_TO_INT(eCharList)*3))
DrawLiteralSceneString(tStr2, 9+(ENUM_TO_INT(eCharList)*3))
#ENDIF
IF NOT IS_PLAYER_SWITCH_IN_PROGRESS()
STORE_VEH_DATA_FROM_PED(sSceneData.sSelectorPeds.pedID[eAmbientPlayerSelectorChar],
g_sPlayerLastVeh[eCharList],
g_vPlayerLastVehCoord[eCharList],
g_fPlayerLastVehHead[eCharList],
g_ePlayerLastVehState[eCharList],
g_ePlayerLastVehGen[eCharList])
CheckForPlayerInDestroyedVehicle(eCharList)
ENDIF
IF (sSceneData.sSelectorPeds.pedID[eAmbientPlayerSelectorChar] <> PLAYER_PED_ID())
IF IS_PED_FALLING(sSceneData.sSelectorPeds.pedID[eAmbientPlayerSelectorChar])
AND eDeleteState != eDS_7_ON_SCREEN
AND eDeleteState != eDS_6_TOO_CLOSE_TO_DELETE
SET_ENTITY_COORDS(sSceneData.sSelectorPeds.pedID[eAmbientPlayerSelectorChar], g_savedGlobals.sPlayerData.sInfo.vLastKnownCoords[eAmbientPlayerSelectorChar])
SET_ENTITY_HEADING(sSceneData.sSelectorPeds.pedID[eAmbientPlayerSelectorChar], g_savedGlobals.sPlayerData.sInfo.fLastKnownHead[eAmbientPlayerSelectorChar])
SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(sSceneData.sSelectorPeds.pedID[eAmbientPlayerSelectorChar], TRUE)
CPRINTLN(DEBUG_SWITCH, "reset ", GET_PLAYER_PED_STRING(eCharList), " coords for collision")
ENDIF
ENDIF
ENDIF
ELSE
#IF IS_DEBUG_BUILD
DrawLiteralSceneString(GET_PLAYER_PED_STRING(eCharList), 7+(ENUM_TO_INT(eCharList)*3))
DrawLiteralSceneString("IS_ENTITY_DEAD", 9+(ENUM_TO_INT(eCharList)*3))
#ENDIF
IF (g_SavedGlobals.sPlayerSceneData.g_ePlayerLastScene[eCharList] <> PR_SCENE_DEAD)
g_SavedGlobals.sPlayerSceneData.g_ePlayerLastScene[eCharList] = PR_SCENE_DEAD
SAFE_AMBIENT_STORE_PLAYER_PED_INFO(sSceneData.sSelectorPeds.pedID[eAmbientPlayerSelectorChar])
g_savedGlobals.sPlayerData.sInfo.sLastTimeActive[eCharList] = GET_CURRENT_TIMEOFDAY()
SET_ENTITY_AS_MISSION_ENTITY(sSceneData.sSelectorPeds.pedID[eAmbientPlayerSelectorChar], TRUE, TRUE)
SET_PED_AS_NO_LONGER_NEEDED(sSceneData.sSelectorPeds.pedID[eAmbientPlayerSelectorChar])
sSceneData.sSelectorPeds.pedID[eAmbientPlayerSelectorChar] = NULL
#IF IS_DEBUG_BUILD
CPRINTLN(DEBUG_SWITCH, "set g_SavedGlobals.sPlayerSceneData.g_ePlayerLastScene[", GET_PLAYER_PED_STRING(eCharList), "] to PR_SCENE_DEAD")
#ENDIF
ENDIF
ENDIF
ELSE
#IF IS_DEBUG_BUILD
DrawLiteralSceneString(GET_PLAYER_PED_STRING(eCharList), 7+(ENUM_TO_INT(eCharList)*3))
DrawLiteralSceneString("NOT IS_ENTITY_A_PED", 9+(ENUM_TO_INT(eCharList)*3))
CPRINTLN(DEBUG_SWITCH, "sSceneData.sSelectorPeds.pedID[", GET_PLAYER_PED_STRING(eCharList), "] isn't a PED??? \"", GET_MODEL_NAME_FOR_DEBUG(GET_ENTITY_MODEL(sSceneData.sSelectorPeds.pedID[eAmbientPlayerSelectorChar])), "\"")
#ENDIF
ENDIF
ENDIF
ELSE
#IF IS_DEBUG_BUILD
DrawLiteralSceneString(GET_PLAYER_PED_STRING(eCharList), 7+(ENUM_TO_INT(eCharList)*3), HUD_COLOUR_BLUELIGHT, 0.25)
DrawLiteralSceneString("IS_PED_THE_CURRENT_PLAYER_PED", 9+(ENUM_TO_INT(eCharList)*3), HUD_COLOUR_BLUELIGHT, 0.25)
#ENDIF
IF (g_sPlayerPedRequest.sSelectorPeds.pedID[eAmbientPlayerSelectorChar] <> NULL)
g_sPlayerPedRequest.sSelectorPeds.pedID[eAmbientPlayerSelectorChar] = NULL
#IF IS_DEBUG_BUILD
CPRINTLN(DEBUG_SWITCH, "players global pedID[", GET_PLAYER_PED_STRING(eCharList), "] should be NULL")
#ENDIF
ENDIF
ENDIF
INT iAmbientPlayerSelectorChar = ENUM_TO_INT(eAmbientPlayerSelectorChar)
iAmbientPlayerSelectorChar++
IF iAmbientPlayerSelectorChar >= ENUM_TO_INT(NUM_OF_PLAYABLE_PEDS)
iAmbientPlayerSelectorChar = 0
ENDIF
eAmbientPlayerSelectorChar = INT_TO_ENUM(SELECTOR_SLOTS_ENUM, iAmbientPlayerSelectorChar)
ENDPROC
PROC DeleteAmbientPlayerChars()
enumCharacterList eCharList = GET_PLAYER_PED_ENUM_FROM_SELECTOR_SLOT(eAmbientPlayerSelectorChar)
IF NOT IS_ENTITY_DEAD(sSceneData.sSelectorPeds.pedID[eAmbientPlayerSelectorChar])
IF DOES_ENTITY_BELONG_TO_THIS_SCRIPT(sSceneData.sSelectorPeds.pedID[eAmbientPlayerSelectorChar])
// AND (sSceneData.sSelectorPeds.pedID[eAmbientPlayerSelectorChar] <> FRIEND_A_PED_ID())
IF IS_ENTITY_ON_SCREEN(sSceneData.sSelectorPeds.pedID[eAmbientPlayerSelectorChar])
IF (GET_SCRIPT_TASK_STATUS(sSceneData.sSelectorPeds.pedID[eAmbientPlayerSelectorChar], SCRIPT_TASK_WANDER_STANDARD) <> PERFORMING_TASK)
TASK_WANDER_STANDARD(sSceneData.sSelectorPeds.pedID[eAmbientPlayerSelectorChar])
#IF IS_DEBUG_BUILD
CPRINTLN(DEBUG_SWITCH, "<DeleteAmbientPlayerChars> task player ped \"", GET_PLAYER_PED_STRING(eCharList), "\" to wander...")
#ENDIF
ENDIF
ELSE
SAFE_AMBIENT_STORE_PLAYER_PED_INFO(sSceneData.sSelectorPeds.pedID[eAmbientPlayerSelectorChar])
g_savedGlobals.sPlayerData.sInfo.sLastTimeActive[eCharList] = GET_CURRENT_TIMEOFDAY()
IF IS_PED_IN_ANY_VEHICLE(sSceneData.sSelectorPeds.pedID[eAmbientPlayerSelectorChar])
VEHICLE_INDEX selectorChar_veh = GET_VEHICLE_PED_IS_IN(sSceneData.sSelectorPeds.pedID[eAmbientPlayerSelectorChar])
IF DOES_ENTITY_EXIST(selectorChar_veh)
SET_ENTITY_AS_MISSION_ENTITY(selectorChar_veh, TRUE, TRUE)
STORE_VEH_DATA_FROM_PED(sSceneData.sSelectorPeds.pedID[eAmbientPlayerSelectorChar],
g_sPlayerLastVeh[eCharList],
g_vPlayerLastVehCoord[eCharList],
g_fPlayerLastVehHead[eCharList],
g_ePlayerLastVehState[eCharList],
g_ePlayerLastVehGen[eCharList])
SET_ENTITY_COORDS(sSceneData.sSelectorPeds.pedID[eAmbientPlayerSelectorChar], GET_ENTITY_COORDS(sSceneData.sSelectorPeds.pedID[eAmbientPlayerSelectorChar]))
DELETE_VEHICLE(selectorChar_veh)
#IF IS_DEBUG_BUILD
CPRINTLN(DEBUG_SWITCH, "<DeleteAmbientPlayerChars> delete player vehicle \"", GET_PLAYER_PED_STRING(eCharList), "\"")
#ENDIF
ENDIF
ENDIF
DELETE_PED(sSceneData.sSelectorPeds.pedID[eAmbientPlayerSelectorChar])
IF DOES_ENTITY_EXIST(g_sPlayerPedRequest.sSelectorPeds.pedID[eAmbientPlayerSelectorChar])
CERRORLN(DEBUG_SWITCH, "<DeleteAmbientPlayerChars> global g_sPlayerPedRequest existed after deleting sSceneData??")
DELETE_PED(g_sPlayerPedRequest.sSelectorPeds.pedID[eAmbientPlayerSelectorChar])
ENDIF
#IF IS_DEBUG_BUILD
CPRINTLN(DEBUG_SWITCH, "<DeleteAmbientPlayerChars> delete player ped \"", GET_PLAYER_PED_STRING(eCharList), "\"")
#ENDIF
ENDIF
ENDIF
ENDIF
INT iAmbientPlayerSelectorChar = ENUM_TO_INT(eAmbientPlayerSelectorChar)
iAmbientPlayerSelectorChar++
IF iAmbientPlayerSelectorChar >= ENUM_TO_INT(NUM_OF_PLAYABLE_PEDS)
iAmbientPlayerSelectorChar = 0
ENDIF
eAmbientPlayerSelectorChar = INT_TO_ENUM(SELECTOR_SLOTS_ENUM, iAmbientPlayerSelectorChar)
ENDPROC
/// PURPOSE: Checks to see if any of the player chars have been killed. If they have block switching to them for 6 hours
PROC MONITOR_AMBIENT_PLAYER_CHARS()
ProcessAmbientSelectorPedQueue()
IF IS_PLAYER_PED_SWITCH_IN_PROGRESS()
OR IS_PLAYER_SWITCH_IN_PROGRESS()
EXIT
ENDIF
// don't moniter ambient player characters if a mission is ongoing...
IF IS_CURRENTLY_ON_MISSION_TO_TYPE(MISSION_TYPE_STORY) //NB. Isn't considered on mission while an RE or switch scene is playing.
OR IS_CURRENTLY_ON_MISSION_TO_TYPE(MISSION_TYPE_DIRECTOR)
DeleteAmbientPlayerChars()
EXIT
ENDIF
// don't monitor ambient player characters if in multiplayer...
IF g_bInMultiplayer
DeleteAmbientPlayerChars()
EXIT
ENDIF
CreateAmbientPlayerChars()
ENDPROC
/// PURPOSE: Tracks the players last vehicle saved in a garage.
PROC MONITOR_STORED_PLAYER_VEHICLES()
INT i, j, k
TEXT_LABEL_31 tlGarageName
VEHICLE_INDEX nearbyVehs[5]
SAVEHOUSE_NAME_ENUM eSavehouse, eClosestSavehouse
enumCharacterList ePed = GET_CURRENT_PLAYER_PED_ENUM()
BOOL bResetSpawnCoords
BOOL bInGarage
INT iGarage
IF NOT IS_PLAYER_PED_PLAYABLE(ePed)
EXIT
ENDIF
//////////////////////////////////////////////////////
/// PLAYER GARAGE VEHICLES
///
IF g_savedGlobals.sSocialData.sCarAppOrder[ePed].bOrderPending
AND g_savedGlobals.sSocialData.sCarAppOrder[ePed].bOrderReceivedOnBoot
AND NOT g_savedGlobals.sSocialData.sCarAppOrder[ePed].bOrderForPlayerVehicle
AND NOT IS_PED_INJURED(PLAYER_PED_ID())
i = 0
eClosestSavehouse = g_savedGlobals.sPlayerData.sInfo.eLastVehicleSentToCloudSavehouse[ePed]
WHILE GET_PLAYER_GARAGE_DATA(ePed, i, tlGarageName, eSavehouse)
IF eSavehouse = eClosestSavehouse
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 NOT IS_VEHICLE_IN_TEMP_PLAYER_VEHICLE_ID_LIST(nearbyVehs[k])
AND NOT IS_VEHICLE_IN_TEMP_NPC_VEHICLE_ID_LIST(nearbyVehs[k])
AND g_savedGlobals.sSocialData.sCarAppOrder[ePed].eModel = GET_ENTITY_MODEL(nearbyVehs[k])
//IF SEND_TEXT_MESSAGE_TO_CURRENT_PLAYER(CHAR_LS_CUSTOMS, "SOCIAL_CARAPP1", TXTMSG_LOCKED)
PRINTLN("\nMONITOR_STORED_PLAYER_VEHICLES - Processing car app order immediately on garage vehicle!")
IF NOT g_savedGlobals.sSocialData.sCarAppOrder[ePed].bOrderPaidFor
eAutoOrderModel = g_savedGlobals.sSocialData.sCarAppOrder[ePed].eModel
bSendCarAppAutoProcessEmail = TRUE
bCarAppOrderFree = (NOT g_savedGlobals.sSocialData.bFirstOrderProcessed[ePed] AND ePed = CHAR_FRANKLIN )
IF NOT bCarAppOrderFree
DEBIT_BANK_ACCOUNT(ePed, BAAC_CARMOD_SHOP_01_AP, g_savedGlobals.sSocialData.sCarAppOrder[ePed].iCost)
ELSE
PRINTLN("\nMONITOR_STORED_PLAYER_VEHICLES - App order is on the house!")
ENDIF
g_savedGlobals.sSocialData.sCarAppOrder[ePed].bOrderPaidFor = TRUE
ENDIF
SET_VEHICLE_MODS_FROM_CARAPP_ORDER(nearbyVehs[k], g_savedGlobals.sSocialData.sCarAppOrder[ePed])
SET_CAR_APP_ORDER_HAS_BEEN_PROCESSED(g_savedGlobals.sSocialData.sCarAppOrder[ePed], ePed)
#IF USE_MULTI_NUMBER_PLATE_SETUP_IN_MP
ADD_NUMBER_PLATE_TEXT_TO_PLAYERS_SC_ACCOUNT(g_savedGlobals.sSocialData.sCarAppOrder[ePed].tlPlateText_pending)
#ENDIF
// Re-apply the mod colour so the app knows which group to work with...
INT iCurrentColourGroupP = -1
INT iCurrentColourGroupS = -1
GET_VEHICLE_COLOURS(nearbyVehs[k], iTempCol1, iTempCol2)
GET_VEHICLE_EXTRA_COLOURS(nearbyVehs[k], iTempCol3, iTempCol4)
SWITCH g_savedGlobals.sSocialData.sCarAppOrder[ePed].iColour1Group
CASE 0 iCurrentColourGroupP = ENUM_TO_INT(MCT_METALLIC) BREAK
CASE 1 iCurrentColourGroupP = ENUM_TO_INT(MCT_CLASSIC) BREAK
CASE 2 iCurrentColourGroupP = ENUM_TO_INT(MCT_MATTE) BREAK
CASE 3 iCurrentColourGroupP = ENUM_TO_INT(MCT_METALS) BREAK
CASE 4 iCurrentColourGroupP = ENUM_TO_INT(MCT_CHROME) BREAK
ENDSWITCH
SWITCH g_savedGlobals.sSocialData.sCarAppOrder[ePed].iColour2Group
CASE 0 iCurrentColourGroupS = ENUM_TO_INT(MCT_METALLIC) BREAK
CASE 1 iCurrentColourGroupS = ENUM_TO_INT(MCT_CLASSIC) BREAK
CASE 2 iCurrentColourGroupS = ENUM_TO_INT(MCT_MATTE) BREAK
CASE 3 iCurrentColourGroupS = ENUM_TO_INT(MCT_METALS) BREAK
CASE 4 iCurrentColourGroupS = ENUM_TO_INT(MCT_CHROME) BREAK
ENDSWITCH
IF iCurrentColourGroupP != ENUM_TO_INT(MCT_NONE)
AND iCurrentColourGroupP != ENUM_TO_INT(MCT_PEARLESCENT)
SET_VEHICLE_MOD_COLOR_1(nearbyVehs[k], INT_TO_ENUM(MOD_COLOR_TYPE, iCurrentColourGroupP), 0, 0)
ENDIF
IF iCurrentColourGroupS != ENUM_TO_INT(MCT_NONE)
AND iCurrentColourGroupS != ENUM_TO_INT(MCT_PEARLESCENT)
SET_VEHICLE_MOD_COLOR_2(nearbyVehs[k], INT_TO_ENUM(MOD_COLOR_TYPE, iCurrentColourGroupS), 0)
ENDIF
SET_VEHICLE_COLOURS(nearbyVehs[k], iTempCol1, iTempCol2)
SET_VEHICLE_EXTRA_COLOURS(nearbyVehs[k], iTempCol3, iTempCol4)
//VEHICLE_GEN_NAME_ENUM eVehicleGen
IF IS_VEHICLE_IN_TEMP_PLAYER_VEHICLE_ID_LIST(nearbyVehs[k])
INT iVehicleSlot = SAVED_VEHICLE_SLOT_CAR
IF IS_THIS_MODEL_A_BIKE(GET_ENTITY_MODEL(nearbyVehs[k]))
iVehicleSlot = SAVED_VEHICLE_SLOT_BIKE
ENDIF
UPDATE_PLAYER_PED_SAVED_VEHICLE(ePed, nearbyVehs[k], iVehicleSlot, TRUE)
//ELIF IS_VEHICLE_STORED_VEHGEN_GARAGE_VEHICLE(nearbyVehs[k], eVehicleGen)
// Update the stored garage vehicle
//VEHICLE_SETUP_STRUCT sDefaultVehState
//GET_VEHICLE_SETUP(nearbyVehs[k], sDefaultVehState)
//UPDATE_DYNAMIC_VEHICLE_GEN_DATA(eVehicleGen, sDefaultVehState, <<0,0,0>>, -1.0)
ELSE
// Update the last modded vehicle instead
UPDATE_PLAYER_PED_SAVED_VEHICLE(ePed, nearbyVehs[k], SAVED_VEHICLE_SLOT_MODDED, TRUE)
ENDIF
//ENDIF
k=100 //Bail
ENDIF
ENDREPEAT
i=100 //Bail
ENDIF
i++
ENDWHILE
ENDIF
//////////////////////////////////////////////////////
/// PLAYER CREATED VEHICELS
///
REPEAT NUM_PLAYER_VEHICLE_IDS i
IF g_eCreatedPlayerVehiclePed[i] != NO_CHARACTER
AND g_eCreatedPlayerVehicleModel[i] != DUMMY_MODEL_FOR_SCRIPT
// Apply car app orders instantly if processed on boot.
IF DOES_ENTITY_EXIST(g_viCreatedPlayerVehicleIDs[i])
AND IS_VEHICLE_DRIVEABLE(g_viCreatedPlayerVehicleIDs[i])
// Track vehicles state
vLastPlayerVehicleCoords[i] = GET_ENTITY_COORDS(g_viCreatedPlayerVehicleIDs[i])
fLastPlayerVehicleHeading[i] = GET_ENTITY_HEADING(g_viCreatedPlayerVehicleIDs[i])
bInGarage = FALSE
WHILE NOT bInGarage
AND GET_PLAYER_GARAGE_DATA(g_eCreatedPlayerVehiclePed[i], iGarage, tlGarageName, eSavehouse)
IF IS_VEHICLE_IN_GARAGE_AREA(tlGarageName, g_viCreatedPlayerVehicleIDs[i])
bInGarage = TRUE
// We need to force the z-coord so that the vehicle doesnt appear on the roof when we use
// the SET_VEHICLE_ON_GROUND_PROPERLY command.
UPDATE_VEHICLE_COORDS_FOR_PLAYERS_GARGE(g_eCreatedPlayerVehiclePed[i], iGarage, vLastPlayerVehicleCoords[i])
ENDIF
iGarage++
ENDWHILE
bLastPlayerVehicleInGarage[i] = bInGarage
// Process CarApp
IF g_savedGlobals.sSocialData.sCarAppOrder[ePed].bOrderPending
AND g_savedGlobals.sSocialData.sCarAppOrder[ePed].bOrderReceivedOnBoot
AND g_savedGlobals.sSocialData.sCarAppOrder[ePed].eModel = g_eCreatedPlayerVehicleModel[i]
//IF SEND_TEXT_MESSAGE_TO_CURRENT_PLAYER_WITH_SPECIAL_COMPONENTS(CHAR_LS_CUSTOMS, "SOCIAL_CARAPP1", TXTMSG_LOCKED, GET_FILENAME_FOR_AUDIO_CONVERSATION(GET_DISPLAY_NAME_FROM_VEHICLE_MODEL(g_savedGlobals.sSocialData.sCarAppOrder[ePed].eModel)), -99, "NULL", STRING_COMPONENT)
PRINTLN("\nMONITOR_STORED_PLAYER_VEHICLES - Processing car app order immediately on script vehicle!")
IF NOT g_savedGlobals.sSocialData.sCarAppOrder[ePed].bOrderPaidFor
eAutoOrderModel = g_savedGlobals.sSocialData.sCarAppOrder[ePed].eModel
bSendCarAppAutoProcessEmail = TRUE
bCarAppOrderFree = (NOT g_savedGlobals.sSocialData.bFirstOrderProcessed[ePed] AND ePed = CHAR_FRANKLIN)
IF NOT bCarAppOrderFree
DEBIT_BANK_ACCOUNT(ePed, BAAC_CARMOD_SHOP_01_AP, g_savedGlobals.sSocialData.sCarAppOrder[ePed].iCost)
ELSE
PRINTLN("\nMONITOR_STORED_PLAYER_VEHICLES - App order is on the house!")
ENDIF
g_savedGlobals.sSocialData.sCarAppOrder[ePed].bOrderPaidFor = TRUE
ENDIF
SET_VEHICLE_MODS_FROM_CARAPP_ORDER(g_viCreatedPlayerVehicleIDs[i], g_savedGlobals.sSocialData.sCarAppOrder[ePed])
SET_CAR_APP_ORDER_HAS_BEEN_PROCESSED(g_savedGlobals.sSocialData.sCarAppOrder[ePed], ePed)
#IF USE_MULTI_NUMBER_PLATE_SETUP_IN_MP
ADD_NUMBER_PLATE_TEXT_TO_PLAYERS_SC_ACCOUNT(g_savedGlobals.sSocialData.sCarAppOrder[ePed].tlPlateText_pending)
#ENDIF
// Re-apply the mod colour so the app knows which group to work with...
INT iCurrentColourGroupP = -1
INT iCurrentColourGroupS = -1
GET_VEHICLE_COLOURS(g_viCreatedPlayerVehicleIDs[i], iTempCol1, iTempCol2)
GET_VEHICLE_EXTRA_COLOURS(g_viCreatedPlayerVehicleIDs[i], iTempCol3, iTempCol4)
SWITCH g_savedGlobals.sSocialData.sCarAppOrder[ePed].iColour1Group
CASE 0 iCurrentColourGroupP = ENUM_TO_INT(MCT_METALLIC) BREAK
CASE 1 iCurrentColourGroupP = ENUM_TO_INT(MCT_CLASSIC) BREAK
CASE 2 iCurrentColourGroupP = ENUM_TO_INT(MCT_MATTE) BREAK
CASE 3 iCurrentColourGroupP = ENUM_TO_INT(MCT_METALS) BREAK
CASE 4 iCurrentColourGroupP = ENUM_TO_INT(MCT_CHROME) BREAK
ENDSWITCH
SWITCH g_savedGlobals.sSocialData.sCarAppOrder[ePed].iColour2Group
CASE 0 iCurrentColourGroupS = ENUM_TO_INT(MCT_METALLIC) BREAK
CASE 1 iCurrentColourGroupS = ENUM_TO_INT(MCT_CLASSIC) BREAK
CASE 2 iCurrentColourGroupS = ENUM_TO_INT(MCT_MATTE) BREAK
CASE 3 iCurrentColourGroupS = ENUM_TO_INT(MCT_METALS) BREAK
CASE 4 iCurrentColourGroupS = ENUM_TO_INT(MCT_CHROME) BREAK
ENDSWITCH
IF iCurrentColourGroupP != ENUM_TO_INT(MCT_NONE)
AND iCurrentColourGroupP != ENUM_TO_INT(MCT_PEARLESCENT)
SET_VEHICLE_MOD_COLOR_1(g_viCreatedPlayerVehicleIDs[i], INT_TO_ENUM(MOD_COLOR_TYPE, iCurrentColourGroupP), 0, 0)
ENDIF
IF iCurrentColourGroupS != ENUM_TO_INT(MCT_NONE)
AND iCurrentColourGroupS != ENUM_TO_INT(MCT_PEARLESCENT)
SET_VEHICLE_MOD_COLOR_2(g_viCreatedPlayerVehicleIDs[i], INT_TO_ENUM(MOD_COLOR_TYPE, iCurrentColourGroupS), 0)
ENDIF
SET_VEHICLE_COLOURS(g_viCreatedPlayerVehicleIDs[i], iTempCol1, iTempCol2)
SET_VEHICLE_EXTRA_COLOURS(g_viCreatedPlayerVehicleIDs[i], iTempCol3, iTempCol4)
INT iVehicleSlot = SAVED_VEHICLE_SLOT_CAR
IF IS_THIS_MODEL_A_BIKE(GET_ENTITY_MODEL(g_viCreatedPlayerVehicleIDs[i]))
iVehicleSlot = SAVED_VEHICLE_SLOT_BIKE
ENDIF
UPDATE_PLAYER_PED_SAVED_VEHICLE(ePed, g_viCreatedPlayerVehicleIDs[i], iVehicleSlot, TRUE)
//ENDIF
ENDIF
// Remove reference to destroyed player vehicles
ELIF NOT DOES_ENTITY_EXIST(g_viCreatedPlayerVehicleIDs[i])
OR NOT IS_VEHICLE_DRIVEABLE(g_viCreatedPlayerVehicleIDs[i])
PRINTLN("Removing reference to player vehicleID ", NATIVE_TO_INT(g_viCreatedPlayerVehicleIDs[i]), " in slot ", i)
bResetSpawnCoords = FALSE
// Make sure the vehicle doesnt spawn at the savehouse straight away if it was left at a distance.
eClosestSaveHouse = GET_CLOSEST_SAVEHOUSE(vLastPlayerVehicleCoords[i], g_eCreatedPlayerVehiclePed[i], TRUE)
IF eClosestSaveHouse != NUMBER_OF_SAVEHOUSE_LOCATIONS
AND GET_DISTANCE_BETWEEN_COORDS(vLastPlayerVehicleCoords[i], g_sSavehouses[eClosestSaveHouse].vSpawnCoords) > 200
bResetSpawnCoords = TRUE
IF IS_THIS_MODEL_A_BIKE(g_eCreatedPlayerVehicleModel[i])
g_iCreatedPlayerVehicleCleanupTimer[g_eCreatedPlayerVehiclePed[i]][SAVED_VEHICLE_SLOT_BIKE] = GET_GAME_TIMER()
ELSE
g_iCreatedPlayerVehicleCleanupTimer[g_eCreatedPlayerVehiclePed[i]][SAVED_VEHICLE_SLOT_CAR] = GET_GAME_TIMER()
ENDIF
ENDIF
// Always reset spawn coords for these vehicles.
IF eClosestSaveHouse = SAVEHOUSE_TREVOR_VB
OR eClosestSaveHouse = SAVEHOUSE_TREVOR_SC
bResetSpawnCoords = TRUE
ENDIF
// Reset the default spawn position if we didnt park it in the garage
IF NOT bLastPlayerVehicleInGarage[i]
bResetSpawnCoords = TRUE
ENDIF
IF bResetSpawnCoords
IF IS_THIS_MODEL_A_BIKE(g_eCreatedPlayerVehicleModel[i])
PRINTLN("VEHGEN: Resetting default spawn position for BIKE")
g_savedGlobals.sPlayerData.sInfo.vPlayerVehicleCoords[SAVED_VEHICLE_SLOT_BIKE][g_eCreatedPlayerVehiclePed[i]] = <<0,0,0>>
ELSE
PRINTLN("VEHGEN: Resetting default spawn position for CAR")
g_savedGlobals.sPlayerData.sInfo.vPlayerVehicleCoords[SAVED_VEHICLE_SLOT_CAR][g_eCreatedPlayerVehiclePed[i]] = <<0,0,0>>
ENDIF
IF g_eCreatedPlayerVehiclePed[i] = GET_CURRENT_PLAYER_PED_ENUM()
PRINTLN("[PVB] MONITOR_STORED_PLAYER_VEHICLES - Clearing cached coords as the vehicle position has reset")
g_sVehicleGenNSData.vPlayerVehicleCoords = <<0,0,0>>
g_sVehicleGenNSData.vPlayerVehicleCoordsCached = <<0,0,0>>
ENDIF
ELSE
IF IS_THIS_MODEL_A_BIKE(g_eCreatedPlayerVehicleModel[i])
PRINTLN("VEHGEN: Updating default spawn position for BIKE - ", GET_STRING_FROM_VECTOR(vLastPlayerVehicleCoords[i]))
g_savedGlobals.sPlayerData.sInfo.vPlayerVehicleCoords[SAVED_VEHICLE_SLOT_BIKE][g_eCreatedPlayerVehiclePed[i]] = vLastPlayerVehicleCoords[i]
g_savedGlobals.sPlayerData.sInfo.fPlayerVehicleHeading[SAVED_VEHICLE_SLOT_BIKE][g_eCreatedPlayerVehiclePed[i]] = fLastPlayerVehicleHeading[i]
ELSE
PRINTLN("VEHGEN: Updating default spawn position for CAR - ", GET_STRING_FROM_VECTOR(vLastPlayerVehicleCoords[i]))
g_savedGlobals.sPlayerData.sInfo.vPlayerVehicleCoords[SAVED_VEHICLE_SLOT_CAR][g_eCreatedPlayerVehiclePed[i]] = vLastPlayerVehicleCoords[i]
g_savedGlobals.sPlayerData.sInfo.fPlayerVehicleHeading[SAVED_VEHICLE_SLOT_CAR][g_eCreatedPlayerVehiclePed[i]] = fLastPlayerVehicleHeading[i]
ENDIF
IF g_eCreatedPlayerVehiclePed[i] = GET_CURRENT_PLAYER_PED_ENUM()
PRINTLN("[PVB] MONITOR_STORED_PLAYER_VEHICLES - Clearing cached coords as the vehicle position has changed")
g_sVehicleGenNSData.vPlayerVehicleCoords = <<0,0,0>>
g_sVehicleGenNSData.vPlayerVehicleCoordsCached = <<0,0,0>>
ENDIF
ENDIF
vLastPlayerVehicleCoords[i] = <<0,0,0>>
bLastPlayerVehicleInGarage[i] = FALSE
g_viCreatedPlayerVehicleIDs[i] = NULL
g_eCreatedPlayerVehiclePed[i] = NO_CHARACTER
g_eCreatedPlayerVehicleModel[i] = DUMMY_MODEL_FOR_SCRIPT
ENDIF
ENDIF
ENDREPEAT
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
// Update the global ID for players last vehicle
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
g_vPlayerVeh[ePed] = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
ELSE
bPlayerInCarInGarage = FALSE
ENDIF
IF DOES_ENTITY_EXIST(g_vPlayerVeh[ePed])
AND IS_VEHICLE_DRIVEABLE(g_vPlayerVeh[ePed])
//Do savehouse garage / impound checks
IF NOT g_savedGlobals.sVehicleGenData.bTrackingImpoundVehicle
AND GET_GAME_TIMER() > iTimeNextGarageVehicleCheck
IF IS_VEHICLE_IN_PLAYERS_GARAGE(g_vPlayerVeh[ePed], ePed,TRUE)
bPlayerInCarInGarage = TRUE
ELSE
//Send to impound if just out of the garage
IF bPlayerInCarInGarage
TRACK_VEHICLE_FOR_IMPOUND(g_vPlayerVeh[ePed],ePed)
ENDIF
bPlayerInCarInGarage = FALSE
ENDIF
iTimeNextGarageVehicleCheck = GET_GAME_TIMER() + 1000
ENDIF
// Update cloud vehicle
IF g_vPlayerVeh[ePed] != g_viLastVehicleSentToCloud[ePed]
// Send the vehicle data to the cloud if it is a player vehicle and the model/plate dont match data in globals
IF NOT g_savedGlobals.sSocialData.sCarAppData[ePed].bSendDataToCloud
IF g_savedGlobals.sSocialData.sCarAppData[ePed].eModel != GET_ENTITY_MODEL(g_vPlayerVeh[ePed])
OR NOT ARE_STRINGS_EQUAL(g_savedGlobals.sSocialData.sCarAppData[ePed].tlPlateText, GET_VEHICLE_NUMBER_PLATE_TEXT(g_vPlayerVeh[ePed]))
////////////////////////////////
/// SAVED VEHICLE
IF IS_VEHICLE_IN_TEMP_PLAYER_VEHICLE_ID_LIST(g_vPlayerVeh[ePed])
BOOL bSafeToUpdate = TRUE
// Do not send other player vehicles.
IF ePed != GET_PLAYER_PED_PERSONAL_VEHICLE_BELONGS_TO(g_vPlayerVeh[ePed])
bSafeToUpdate = FALSE
// Do not send bagger until we own it.
ELIF ePed = CHAR_FRANKLIN
AND GET_ENTITY_MODEL(g_vPlayerVeh[ePed]) = BAGGER
AND NOT (g_savedGlobals.sFlow.controls.flagIDs[FLOWFLAG_PLAYER_VEH_F_UNLOCK_BIKE])
bSafeToUpdate = FALSE
// Do not send default vehicle until we mod it.
ELIF NOT g_savedGlobals.sSocialData.bFirstVehicleSentToCloud[ePed]
AND GET_ENTITY_MODEL(g_vPlayerVeh[ePed]) = GET_PLAYER_VEH_MODEL(ePed, VEHICLE_TYPE_CAR)
bSafeToUpdate = FALSE
ENDIF
IF bSafeToUpdate
PRINTLN("MONITOR_STORED_PLAYER_VEHICLES() - Attempting to save player vehicle in Car App globals")
INT iVehicleSlot = SAVED_VEHICLE_SLOT_CAR
IF IS_THIS_MODEL_A_BIKE(GET_ENTITY_MODEL(g_vPlayerVeh[ePed]))
iVehicleSlot = SAVED_VEHICLE_SLOT_BIKE
ENDIF
UPDATE_PLAYER_PED_SAVED_VEHICLE(ePed, g_vPlayerVeh[ePed], iVehicleSlot, TRUE)
g_viLastVehicleSentToCloud[ePed] = g_vPlayerVeh[ePed]
ENDIF
////////////////////////////////
/// GARAGE VEHICLE
ELIF IS_VEHICLE_IN_PLAYERS_GARAGE(g_vPlayerVeh[ePed], ePed, TRUE)
PRINTLN("MONITOR_STORED_PLAYER_VEHICLES() - Attempting to save garage vehicle in Car App globals")
UPDATE_PLAYER_PED_SAVED_VEHICLE(ePed, g_vPlayerVeh[ePed], SAVED_VEHICLE_SLOT_GARAGE, TRUE)
g_viLastVehicleSentToCloud[ePed] = g_vPlayerVeh[ePed]
g_savedGlobals.sPlayerData.sInfo.eLastVehicleSentToCloudSavehouse[ePed] = GET_CLOSEST_SAVEHOUSE(GET_ENTITY_COORDS(g_viLastVehicleSentToCloud[ePed]), ePed, TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
// If we have an instant order we should send the text straight away.
IF g_savedGlobals.sSocialData.sCarAppOrder[ePed].bOrderPending
AND g_savedGlobals.sSocialData.sCarAppOrder[ePed].bOrderReceivedOnBoot
AND NOT g_savedGlobals.sSocialData.sCarAppOrder[ePed].bOrderPaidFor
AND 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)
eAutoOrderModel = g_savedGlobals.sSocialData.sCarAppOrder[ePed].eModel
bSendCarAppAutoProcessEmail = TRUE
bCarAppOrderFree = (NOT g_savedGlobals.sSocialData.bFirstOrderProcessed[ePed] AND ePed = CHAR_FRANKLIN )
IF NOT bCarAppOrderFree
DEBIT_BANK_ACCOUNT(ePed, BAAC_CARMOD_SHOP_01_AP, g_savedGlobals.sSocialData.sCarAppOrder[ePed].iCost)
ELSE
PRINTLN("\nMONITOR_STORED_PLAYER_VEHICLES - App order is on the house!")
ENDIF
g_savedGlobals.sSocialData.sCarAppOrder[ePed].bOrderPaidFor = TRUE
ELIF bSendCarAppAutoProcessEmail
// 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_CARAPP1"
IF bCarAppOrderFree
tlLabel = "SOCIAL_FREE1"
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(eAutoOrderModel)), -99, "NULL", STRING_COMPONENT)
bSendCarAppAutoProcessEmail = FALSE
ENDIF
ELSE
// // Cancel the text unless it's for the first order.
// IF GET_MISSION_COMPLETE_STATE(SP_MISSION_ARMENIAN_1)
// bSendCarAppAutoProcessEmail = FALSE
// ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Prints mission names for available missions for each character, only if their number has changed from the last check.
/// PARAMS:
/// iChar - Char ID (0-2)
/// sName - Name of the mission, use GET_SP_MISSION_NAME_LABEL or GET_RC_MISSION_NAME_LABEL
/// bClearArea - Is the mission waiting on a clear area?
/// bIsRC - Is the mission an RC one?
///
PROC PRINT_AVAILABLE_MISSION(INT iChar, TEXT_LABEL_7 sName, BOOL bLeaveArea = FALSE, BOOL bIsRC = FALSE, BOOL bIsPrep = FALSE)
#IF NOT IS_DEBUG_BUILD
UNUSED_PARAMETER(iCHar)
UNUSED_PARAMETER(sName)
UNUSED_PARAMETER(bLeaveArea)
UNUSED_PARAMETER(bIsRc)
UNUSED_PARAMETER(bIsPrep)
#ENDIF
#IF IS_DEBUG_BUILD
STRING tlName
IF iChar = 0
tlName = "Michael"
ELIF iChar = 1
tlName = "Franklin"
ELIF iChar = 2
tlName = "Trevor"
ENDIF
IF bMissionCountHasChanged[iChar]
IF bIsRC
CDEBUG1LN(debug_ped_comp,tlName,": available RC mission: ",sName)
ELIF bLeaveArea
CDEBUG1LN(debug_ped_comp,tlName,": available mission waiting on LEAVE AREA: ",sName)
ELIF bIsPrep
CDEBUG1LN(debug_ped_comp,tlName,": available vehicle prep for mission: ",sName)
ELSE
CDEBUG1LN(debug_ped_comp,tlName,": available mission: ",sName)
ENDIF
ENDIF
#ENDIF
ENDPROC
/// PURPOSE: Checks to see if there are any missions available for each player character
PROC MONITOR_AVAILABLE_PLAYER_MISSIONS()
IF GET_GAME_TIMER() > iTimeNextPlayerMissionCheck
INT tempLoop = 0
INT arrayPos = 0
INT triggerIndex = 0
//Save the current available missions for debugging
INT iLastMissionCount = g_iAvailablePlayerMissions[iPlayerCharToCheckThisFrame]
//Reset the current mission count for the character we're checking this frame.
g_iAvailablePlayerMissions[iPlayerCharToCheckThisFrame] = 0
g_iQueuedCalls[iPlayerCharToCheckThisFrame] = 0
g_iQueuedTxts[iPlayerCharToCheckThisFrame] = 0
//Check all available missions for the character we're checking this frame.
REPEAT MAX_MISSIONS_AVAILABLE tempLoop
arrayPos = g_availableMissions[tempLoop].index
triggerIndex = g_availableMissions[tempLoop].missionTriggerID
IF NOT (arrayPos = ILLEGAL_ARRAY_POSITION)
IF NOT (triggerIndex = ILLEGAL_ARRAY_POSITION)
//Ignore missions that are currently blocked by their trigger logic.
IF NOT g_TriggerableMissions[triggerIndex].bBlocked
SP_MISSIONS eMission = INT_TO_ENUM(SP_MISSIONS, g_flowUnsaved.coreVars[arrayPos].iValue1)
//Has this mission been flagged to not show up on the switch HUD?
IF NOT IS_BIT_SET(g_sMissionStaticData[eMission].settingsBitset, MF_INDEX_NO_SWITCH_COUNT)
// Get triggerable character bitset for this mission.
INT triggerCharBitset = Get_Mission_Triggerable_Characters_Bitset(eMission)
// Check if the playable characters is allowed to trigger this mission.
IF Is_Mission_Triggerable_By_Character(triggerCharBitset, INT_TO_ENUM(enumCharacterList, iPlayerCharToCheckThisFrame))
//Check if this mission is time critical.
IF triggerIndex != NO_CANDIDATE_ID
g_eFirstAvailablePlayerMission[iPlayerCharToCheckThisFrame] = eMission
g_iAvailablePlayerMissions[iPlayerCharToCheckThisFrame]++
PRINT_AVAILABLE_MISSION(iPlayerCharToCheckThisFrame,GET_SP_MISSION_NAME_LABEL(eMission))
ELSE
//mission probably available, waiting for leave area
g_eFirstAvailablePlayerMission[iPlayerCharToCheckThisFrame] = eMission
g_iAvailablePlayerMissions[iPlayerCharToCheckThisFrame]++
PRINT_AVAILABLE_MISSION(iPlayerCharToCheckThisFrame,GET_SP_MISSION_NAME_LABEL(eMission),TRUE)
ENDIF
ELSE
//Special case ensuring Franklin has Exile2 as an available mission.
IF (INT_TO_ENUM(enumCharacterList, iPlayerCharToCheckThisFrame) = CHAR_FRANKLIN)
IF (eMission = SP_MISSION_EXILE_2)
g_eFirstAvailablePlayerMission[iPlayerCharToCheckThisFrame] = eMission
g_iAvailablePlayerMissions[iPlayerCharToCheckThisFrame]++
PRINT_AVAILABLE_MISSION(iPlayerCharToCheckThisFrame,GET_SP_MISSION_NAME_LABEL(eMission))
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDREPEAT
//Check communication queues for mission triggering or unlocking communications.
REPEAT g_savedGlobals.sCommsControlData.iNoQueuedCalls tempLoop
IF IS_BIT_SET(g_savedGlobals.sCommsControlData.sQueuedCalls[tempLoop].sCommData.iSettings, COMM_BIT_UNLOCKS_MISSION)
OR IS_BIT_SET(g_savedGlobals.sCommsControlData.sQueuedCalls[tempLoop].sCommData.iSettings, COMM_BIT_TRIGGERS_MISSION)
IF IS_BIT_SET(g_savedGlobals.sCommsControlData.sQueuedCalls[tempLoop].sCommData.iPlayerCharBitset, iPlayerCharToCheckThisFrame)
g_iQueuedCalls[iPlayerCharToCheckThisFrame]++
ENDIF
ENDIF
ENDREPEAT
REPEAT g_savedGlobals.sCommsControlData.iNoQueuedTexts tempLoop
IF IS_BIT_SET(g_savedGlobals.sCommsControlData.sQueuedTexts[tempLoop].sCommData.iSettings, COMM_BIT_UNLOCKS_MISSION)
OR IS_BIT_SET(g_savedGlobals.sCommsControlData.sQueuedTexts[tempLoop].sCommData.iSettings, COMM_BIT_TRIGGERS_MISSION)
IF IS_BIT_SET(g_savedGlobals.sCommsControlData.sQueuedTexts[tempLoop].sCommData.iPlayerCharBitset, iPlayerCharToCheckThisFrame)
g_iQueuedTxts[iPlayerCharToCheckThisFrame]++
ENDIF
ENDIF
ENDREPEAT
REPEAT g_savedGlobals.sCommsControlData.iNoQueuedEmails tempLoop
IF IS_BIT_SET(g_savedGlobals.sCommsControlData.sQueuedEmails[tempLoop].sCommData.iSettings, COMM_BIT_UNLOCKS_MISSION)
OR IS_BIT_SET(g_savedGlobals.sCommsControlData.sQueuedEmails[tempLoop].sCommData.iSettings, COMM_BIT_TRIGGERS_MISSION)
IF IS_BIT_SET(g_savedGlobals.sCommsControlData.sQueuedEmails[tempLoop].sCommData.iPlayerCharBitset, iPlayerCharToCheckThisFrame)
g_iQueuedTxts[iPlayerCharToCheckThisFrame]++
ENDIF
ENDIF
ENDREPEAT
//Check for the getaway vehicle missions being available.
IF NOT GET_MISSION_FLOW_FLAG_STATE(FLOWFLAG_MISSION_FBI_4_PREP_3_COMPLETED)
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("FBI4_Prep3Amb")) > 0
g_iAvailablePlayerMissions[iPlayerCharToCheckThisFrame]++
PRINT_AVAILABLE_MISSION(iPlayerCharToCheckThisFrame,GET_SP_MISSION_NAME_LABEL(SP_MISSION_FBI_4_PREP_3),DEFAULT,DEFAULT,TRUE)
ENDIF
ENDIF
IF NOT GET_MISSION_FLOW_FLAG_STATE(FLOWFLAG_HEIST_AGENCY_PREP_2_DONE)
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("agency_prep2Amb")) > 0
IF INT_TO_ENUM(enumCharacterList, iPlayerCharToCheckThisFrame) != CHAR_TREVOR
g_iAvailablePlayerMissions[iPlayerCharToCheckThisFrame]++
PRINT_AVAILABLE_MISSION(iPlayerCharToCheckThisFrame,GET_SP_MISSION_NAME_LABEL(SP_HEIST_AGENCY_2),DEFAULT,DEFAULT,TRUE)
ENDIF
ENDIF
ENDIF
IF NOT GET_MISSION_FLOW_FLAG_STATE(FLOWFLAG_HEIST_FINALE_PREPE_DONE)
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("finale_heist_prepEAmb")) > 0
g_iAvailablePlayerMissions[iPlayerCharToCheckThisFrame]++
PRINT_AVAILABLE_MISSION(iPlayerCharToCheckThisFrame,GET_SP_MISSION_NAME_LABEL(SP_HEIST_FINALE_PREP_D),DEFAULT,DEFAULT,TRUE)
ENDIF
ENDIF
//Check for RC missions that are revealed in the FOW being available.
g_eRC_MissionIDs eRCMissionID
g_structRCMissionsStatic sRCMissionDetails
REPEAT MAX_RC_MISSIONS tempLoop
eRCMissionID = INT_TO_ENUM(g_eRC_MissionIDs, tempLoop)
IF IS_BIT_SET(g_savedGlobals.sRandomChars.savedRC[tempLoop].rcFlags, ENUM_TO_INT(RC_FLAG_ACTIVATED))
AND IS_BIT_SET(g_savedGlobals.sRandomChars.savedRC[tempLoop].rcFlags, ENUM_TO_INT(RC_FLAG_ACTIVATED_IN_FLOW))
AND IS_BIT_SET(g_savedGlobals.sRandomChars.savedRC[tempLoop].rcFlags, ENUM_TO_INT(RC_FLAG_READY_TO_PLAY))
AND NOT IS_BIT_SET(g_savedGlobals.sRandomChars.savedRC[tempLoop].rcFlags, ENUM_TO_INT(RC_FLAG_COMPLETED))
INT iFOWBit = tempLoop
INT iFOWBitset = 0
WHILE iFOWBit > 31
iFOWBit -= 32
iFOWBitset++
ENDWHILE
IF IS_BIT_SET(g_savedGlobals.sRandomChars.g_iVisibleInFOWBitset[iFOWBitset], iFOWBit)
Retrieve_Random_Character_Static_Mission_Details(eRCMissionID, sRCMissionDetails)
IF IS_BIT_SET(sRCMissionDetails.rcPlayableChars, iPlayerCharToCheckThisFrame)
PRINT_AVAILABLE_MISSION(iPlayerCharToCheckThisFrame,GET_RC_MISSION_NAME_LABEL(eRCMissionID),FALSE,TRUE)
g_iAvailablePlayerMissions[iPlayerCharToCheckThisFrame]++
ENDIF
ENDIF
ENDIF
ENDREPEAT
//Check if previous mission count has changed
IF iLastMissionCount != g_iAvailablePlayerMissions[iPlayerCharToCheckThisFrame]
#IF IS_DEBUG_BUILD
bMissionCountHasChanged[iPlayerCharToCheckThisFrame] = TRUE
ELSE
//Reset the bool if it hasn't changed
bMissionCountHasChanged[iPlayerCharToCheckThisFrame] = FALSE
#ENDIF
ENDIF
//Step to the next playable character index for the next frame.
iPlayerCharToCheckThisFrame++
IF iPlayerCharToCheckThisFrame >= NUM_OF_PLAYABLE_PEDS
iPlayerCharToCheckThisFrame = 0
//If we've checked all playable characters wait 2 seconds before checking again.
iTimeNextPlayerMissionCheck = GET_GAME_TIMER() + 2000
ENDIF
ENDIF
BOOL bOnMissionOfAnyType = IS_CURRENTLY_ON_MISSION_OF_ANY_TYPE()
// Check for displaying of various pieces of selector HUD help text.
// No characters to swap to help text.
IF NOT HAS_ONE_TIME_HELP_DISPLAYED(FHM_SELECTOR_NO_SWAP_A)
OR NOT HAS_ONE_TIME_HELP_DISPLAYED(FHM_SELECTOR_NO_SWAP_B)
OR NOT HAS_ONE_TIME_HELP_DISPLAYED(FHM_SELECTOR_NO_SWAP_C)
IF NOT bOnMissionOfAnyType
IF GET_MISSION_COMPLETE_STATE(SP_MISSION_TREVOR_1)
IF GET_MISSION_COMPLETE_STATE(SP_MISSION_TREVOR_3)
//Trevor 3 complete. This help message no longer needed. Flag it as shown.
SET_ONE_TIME_HELP_MESSAGE_DISPLAYED(FHM_SELECTOR_NO_SWAP_A)
SET_ONE_TIME_HELP_MESSAGE_DISPLAYED(FHM_SELECTOR_NO_SWAP_B)
SET_ONE_TIME_HELP_MESSAGE_DISPLAYED(FHM_SELECTOR_NO_SWAP_C)
ELSE
IF IS_SELECTOR_ONSCREEN()
IF iTimeNextSwitchDeniedCheck != -1
IF GET_GAME_TIMER() > iTimeNextSwitchDeniedCheck
SWITCH GET_FLOW_HELP_MESSAGE_STATUS("AM_H_SWTCH4")
CASE FHS_EXPIRED
ADD_HELP_TO_FLOW_QUEUE("AM_H_SWTCH4", FHP_MEDIUM, 0, 1000)
BREAK
CASE FHS_DISPLAYED
IF NOT HAS_ONE_TIME_HELP_DISPLAYED(FHM_SELECTOR_NO_SWAP_A)
SET_ONE_TIME_HELP_MESSAGE_DISPLAYED(FHM_SELECTOR_NO_SWAP_A)
iTimeNextSwitchDeniedCheck = -1
g_txtFlowHelpLastDisplayed = ""
ELIF NOT HAS_ONE_TIME_HELP_DISPLAYED(FHM_SELECTOR_NO_SWAP_B)
SET_ONE_TIME_HELP_MESSAGE_DISPLAYED(FHM_SELECTOR_NO_SWAP_B)
iTimeNextSwitchDeniedCheck = -1
g_txtFlowHelpLastDisplayed = ""
ELIF NOT HAS_ONE_TIME_HELP_DISPLAYED(FHM_SELECTOR_NO_SWAP_C)
SET_ONE_TIME_HELP_MESSAGE_DISPLAYED(FHM_SELECTOR_NO_SWAP_C)
iTimeNextSwitchDeniedCheck = -1
g_txtFlowHelpLastDisplayed = ""
ENDIF
BREAK
ENDSWITCH
ENDIF
ENDIF
ELIF iTimeNextSwitchDeniedCheck = -1
iTimeNextSwitchDeniedCheck = GET_GAME_TIMER() + 15000
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT HAS_ONE_TIME_HELP_DISPLAYED(FHM_SELECTOR_NO_SWAP_EXILE)
IF NOT bOnMissionOfAnyType
IF GET_MISSION_COMPLETE_STATE(SP_MISSION_MARTIN_1)
IF GET_MISSION_COMPLETE_STATE(SP_MISSION_EXILE_1)
//exile 1 complete. This help message no longer needed. Flag it as shown.
SET_ONE_TIME_HELP_MESSAGE_DISPLAYED(FHM_SELECTOR_NO_SWAP_EXILE)
ELSE
IF IS_SELECTOR_ONSCREEN()
IF iTimeNextSwitchDeniedCheck != -1
IF GET_GAME_TIMER() > iTimeNextSwitchDeniedCheck
SWITCH GET_FLOW_HELP_MESSAGE_STATUS("AM_H_SWTCH8")
CASE FHS_EXPIRED
ADD_HELP_TO_FLOW_QUEUE("AM_H_SWTCH8", FHP_MEDIUM, 0, 1000)
BREAK
CASE FHS_DISPLAYED
IF NOT HAS_ONE_TIME_HELP_DISPLAYED(FHM_SELECTOR_NO_SWAP_EXILE)
SET_ONE_TIME_HELP_MESSAGE_DISPLAYED(FHM_SELECTOR_NO_SWAP_EXILE)
iTimeNextSwitchDeniedCheck = -1
g_txtFlowHelpLastDisplayed = ""
ENDIF
BREAK
ENDSWITCH
ENDIF
ENDIF
ELIF iTimeNextSwitchDeniedCheck = -1
iTimeNextSwitchDeniedCheck = GET_GAME_TIMER() + 15000
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
IF NOT bOnMissionOfAnyType
IF IS_PLAYER_PLAYING(PLAYER_ID())
IF GET_PLAYER_WANTED_LEVEL(PLAYER_ID()) > 0
// Player is wanted. Inform them they can't switch while wanted.
IF NOT HAS_ONE_TIME_HELP_DISPLAYED(FHM_SELECTOR_WANTED_SWAP)
IF IS_PLAYER_PED_PLAYABLE(GET_CURRENT_PLAYER_PED_ENUM())
IF GET_MISSION_COMPLETE_STATE(SP_MISSION_ARMENIAN_3)
SWITCH GET_FLOW_HELP_MESSAGE_STATUS("AM_H_SWTCH7")
CASE FHS_EXPIRED
IF IS_SELECTOR_ONSCREEN()
ADD_HELP_TO_FLOW_QUEUE("AM_H_SWTCH7", FHP_MEDIUM, 0, 1000, DEFAULT_HELP_TEXT_TIME ,GET_CURRENT_PLAYER_PED_BIT())
ENDIF
BREAK
CASE FHS_DISPLAYED
SET_ONE_TIME_HELP_MESSAGE_DISPLAYED(FHM_SELECTOR_WANTED_SWAP)
BREAK
ENDSWITCH
ENDIF
ENDIF
ENDIF
ELSE
// First selector mission help text.
IF NOT HAS_ONE_TIME_HELP_DISPLAYED(FHM_SELECTOR_MISSIONS_A)
IF GET_MISSION_COMPLETE_STATE(SP_MISSION_ARMENIAN_3)
BOOL bHasMission = FALSE
INT iCharIndex
REPEAT 3 iCharIndex
IF g_iAvailablePlayerMissions[iCharIndex] > 0
bHasMission = TRUE
ENDIF
ENDREPEAT
IF bHasMission
IF IS_SELECTOR_ONSCREEN()
REMOVE_HELP_FROM_FLOW_QUEUE("AM_H_SWTCH0")
SWITCH GET_FLOW_HELP_MESSAGE_STATUS("AM_H_SWTCH1")
CASE FHS_EXPIRED
ADD_HELP_TO_FLOW_QUEUE("AM_H_SWTCH1", FHP_MEDIUM, 0, 1000, 4000)
CLEAR_FLOW_HELP_MESSAGE_DELAY()
BREAK
CASE FHS_DISPLAYED
SET_ONE_TIME_HELP_MESSAGE_DISPLAYED(FHM_SELECTOR_MISSIONS_A)
BREAK
ENDSWITCH
ENDIF
ENDIF
ENDIF
// Second selector mission help text.
ELIF NOT HAS_ONE_TIME_HELP_DISPLAYED(FHM_SELECTOR_MISSIONS_B)
IF GET_MISSION_COMPLETE_STATE(SP_MISSION_ARMENIAN_3)
BOOL bHasMission = FALSE
INT iCharIndex
REPEAT 3 iCharIndex
IF g_iAvailablePlayerMissions[iCharIndex] > 0
bHasMission = TRUE
ENDIF
ENDREPEAT
IF bHasMission
SWITCH GET_FLOW_HELP_MESSAGE_STATUS("AM_H_SWTCH9")//"AM_H_SWTCH2")
CASE FHS_EXPIRED
ADD_HELP_TO_FLOW_QUEUE("AM_H_SWTCH9", FHP_MEDIUM, 0, 1000)//"AM_H_SWTCH2", FHP_MEDIUM, 0, 1000)
BREAK
CASE FHS_DISPLAYED
SET_ONE_TIME_HELP_MESSAGE_DISPLAYED(FHM_SELECTOR_MISSIONS_B)
BREAK
ENDSWITCH
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
//PRINTLN("g_iAvailablePlayerMissions[",iPlayerCharToCheckThisFrame,"] = ", g_iAvailablePlayerMissions[iPlayerCharToCheckThisFrame]," ")
ENDPROC
FUNC BOOL GET_PLAYER_PED_CUTSCENE_HANDLE(enumCharacterList ePed, BOOL bVehicle, INT iVariation, TEXT_LABEL_31 &tlSceneHandle)
tlSceneHandle = ""
/////////////////////
/// PEDS
IF NOT bVehicle
SWITCH iVariation
CASE 0
SWITCH ePed
CASE CHAR_MICHAEL tlSceneHandle = "Michael" BREAK
CASE CHAR_FRANKLIN tlSceneHandle = "Franklin" BREAK
CASE CHAR_TREVOR tlSceneHandle = "Trevor" BREAK
ENDSWITCH
BREAK
CASE 1
SWITCH ePed
CASE CHAR_MICHAEL tlSceneHandle = "player_zero" BREAK
CASE CHAR_FRANKLIN tlSceneHandle = "player_one" BREAK
CASE CHAR_TREVOR tlSceneHandle = "player_two" BREAK
ENDSWITCH
BREAK
ENDSWITCH
/////////////////////
/// VEHICLES
ELSE
SWITCH iVariation
CASE 0
SWITCH ePed
CASE CHAR_MICHAEL tlSceneHandle = "tailgater" BREAK
CASE CHAR_FRANKLIN tlSceneHandle = "buffalo" BREAK
CASE CHAR_TREVOR tlSceneHandle = "bodhi2" BREAK
ENDSWITCH
BREAK
CASE 1
SWITCH ePed
CASE CHAR_MICHAEL tlSceneHandle = "michaels_car" BREAK
CASE CHAR_FRANKLIN tlSceneHandle = "franklins_car" BREAK
CASE CHAR_TREVOR tlSceneHandle = "trevors_car" BREAK
ENDSWITCH
BREAK
CASE 2
SWITCH ePed
CASE CHAR_MICHAEL tlSceneHandle = "EXL_3_Michaels_car" BREAK
CASE CHAR_FRANKLIN tlSceneHandle = "Franklin_Bike" BREAK
ENDSWITCH
BREAK
ENDSWITCH
ENDIF
RETURN (GET_HASH_KEY(tlSceneHandle) != 0)
ENDFUNC
FUNC BOOL GET_ENTITY_ID_FOR_CUTSCENE_VEHICLE(enumCharacterList ePed, MODEL_NAMES eModel, ENTITY_INDEX &entityID)
TEXT_LABEL_31 tlSceneHandle
INT iHandleVariation
IF eModel != DUMMY_MODEL_FOR_SCRIPT
WHILE GET_PLAYER_PED_CUTSCENE_HANDLE(ePed, TRUE, iHandleVariation, tlSceneHandle)
IF DOES_CUTSCENE_ENTITY_EXIST(tlSceneHandle, eModel)
AND GET_ENTITY_MODEL(GET_ENTITY_INDEX_OF_CUTSCENE_ENTITY(tlSceneHandle, eModel)) = eModel
entityID = GET_ENTITY_INDEX_OF_CUTSCENE_ENTITY(tlSceneHandle, eModel)
RETURN TRUE
ENDIF
iHandleVariation++
ENDWHILE
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE: Checks to see if any player ped or player vehicles exist in a cutscene.
/// This proc will ensure that the correct variations/weapons/tattoos/vehicle states are all up to date with stored data
PROC MONITOR_PLAYER_CUTSCENE_ENTITIES()
INT iPlayerPed
enumCharacterList ePed
ENTITY_INDEX entityID
TEXT_LABEL_31 tlSceneHandle
// Ped data
INT iHandle
PED_INDEX pedID
BOOL bPedDataSet[NUM_OF_PLAYABLE_PEDS]
// Vehicle data
VEHICLE_INDEX vehID
INT iPlateBack
TEXT_LABEL_15 tlPlateText
BOOL bVehDataSet[NUM_OF_PLAYABLE_PEDS]
PED_VEH_DATA_STRUCT sVehData
INT iExtra
INT iVehicleSlot
VEHICLE_CREATE_TYPE_ENUM eVehicleType
//////////////////////////////////////////////////////
/// SET PED VARIATIONS
///
IF CAN_REQUEST_ASSETS_FOR_CUTSCENE_ENTITY()
// Ok to set variations?
IF NOT IS_CUTSCENE_PLAYBACK_FLAG_SET(CUTSCENE_REQUESTED_FROM_WIDGET)
AND g_bSetPlayerClothesInCutscenes
// Go through all player characters
REPEAT NUM_OF_PLAYABLE_PEDS iPlayerPed
ePed = INT_TO_ENUM(enumCharacterList, iPlayerPed)
IF NOT bCutscenePed_VarsSet[iPlayerPed]
PRINTLN("MONITOR_PLAYER_CUTSCENE_ENTITIES() - Attempting to set variations for ", GET_PLAYER_PED_STRING(ePed))
iHandle = 0
WHILE iHandle < 2 AND NOT bCutscenePed_VarsSet[iPlayerPed]
IF GET_PLAYER_PED_CUTSCENE_HANDLE(ePed, FALSE, iHandle, tlSceneHandle)
SET_CURRENT_PLAYER_PED_CUTSCENE_VARIATIONS(ePed, tlSceneHandle)
bCutscenePed_VarsSet[iPlayerPed] = TRUE
ENDIF
iHandle++
ENDWHILE
bCutscenePed_VarsSet[iPlayerPed] = TRUE
ENDIF
ENDREPEAT
ENDIF
ELSE
// Reset all player character set flags
REPEAT NUM_OF_PLAYABLE_PEDS iPlayerPed
bCutscenePed_VarsSet[iPlayerPed] = FALSE
ENDREPEAT
ENDIF
//////////////////////////////////////////////////////
/// SET PED AND VEH DATA
///
REPEAT NUM_OF_PLAYABLE_PEDS iPlayerPed
IF IS_CUTSCENE_ACTIVE()
ePed = INT_TO_ENUM(enumCharacterList, iPlayerPed)
///////////////////////////////////////////////
/// PEDS
///
pedID = NULL
entityID = NULL
iHandle = 0
WHILE iHandle < 2
AND NOT DOES_ENTITY_EXIST(entityID)
IF GET_PLAYER_PED_CUTSCENE_HANDLE(ePed, FALSE, iHandle, tlSceneHandle)
IF DOES_CUTSCENE_ENTITY_EXIST(tlSceneHandle, GET_PLAYER_PED_MODEL(ePed))
entityID = GET_ENTITY_INDEX_OF_CUTSCENE_ENTITY(tlSceneHandle, GET_PLAYER_PED_MODEL(ePed))
ENDIF
ENDIF
iHandle++
ENDWHILE
IF DOES_ENTITY_EXIST(entityID)
IF IS_ENTITY_A_PED(entityID)
pedID = GET_PED_INDEX_FROM_ENTITY_INDEX(entityID)
IF NOT IS_PED_INJURED(pedID)
IF NOT bCutscenePed_DataSet[iPlayerPed]
// Only set data on fresh cutscene peds
IF NOT IS_PED_IN_TEMP_PLAYER_PED_ID_LIST(pedID)
AND pedID != PLAYER_PED_ID()
#IF IS_DEBUG_BUILD
PRINTLN("\n\nMONITOR_PLAYER_CUTSCENE_ENTITIES() Setting player data for ", GET_PLAYER_PED_STRING(ePed), " ped")
#ENDIF
IF g_bSetPlayerWeaponsInCutscenes
RESTORE_PLAYER_PED_WEAPONS(pedID)
ENDIF
RESTORE_PLAYER_PED_ARMOUR(pedID)
RESTORE_PLAYER_PED_TATTOOS(pedID)
// Store in temp list so we don't set the data again
STORE_TEMP_PLAYER_PED_ID(pedID)
ELSE
#IF IS_DEBUG_BUILD
PRINTLN("\n\nMONITOR_PLAYER_CUTSCENE_ENTITIES() Player data already set for ", GET_PLAYER_PED_STRING(ePed), " ped")
#ENDIF
ENDIF
bCutscenePed_DataSet[iPlayerPed] = TRUE
ENDIF
bPedDataSet[iPlayerPed] = TRUE
ENDIF
ENDIF
ENDIF
///////////////////////////////////////////////
/// VEHICLES
///
vehID = NULL
entityID = NULL
iVehicleSlot = -1
eVehicleType = VEHICLE_TYPE_DEFAULT
// Stored CAR data
IF GET_ENTITY_ID_FOR_CUTSCENE_VEHICLE(ePed, g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_CAR][ePed].model, entityID)
iVehicleSlot = SAVED_VEHICLE_SLOT_CAR
// Stored BIKE data
ELIF GET_ENTITY_ID_FOR_CUTSCENE_VEHICLE(ePed, g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_BIKE][ePed].model, entityID)
iVehicleSlot = SAVED_VEHICLE_SLOT_BIKE
// Default CAR data
ELIF GET_ENTITY_ID_FOR_CUTSCENE_VEHICLE(ePed, GET_PLAYER_VEH_MODEL(ePed, VEHICLE_TYPE_CAR), entityID)
eVehicleType = VEHICLE_TYPE_CAR
// Default BIKE data
ELIF GET_ENTITY_ID_FOR_CUTSCENE_VEHICLE(ePed, GET_PLAYER_VEH_MODEL(ePed, VEHICLE_TYPE_BIKE), entityID)
eVehicleType = VEHICLE_TYPE_BIKE
ENDIF
IF DOES_ENTITY_EXIST(entityID)
IF IS_ENTITY_A_VEHICLE(entityID)
vehID = GET_VEHICLE_INDEX_FROM_ENTITY_INDEX(entityID)
ENDIF
ENDIF
IF DOES_ENTITY_EXIST(vehID)
AND IS_VEHICLE_DRIVEABLE(vehID)
IF NOT bCutsceneVeh_DataSet[iPlayerPed]
// Only set data on fresh cutscene vehicle
IF NOT IS_VEHICLE_IN_TEMP_PLAYER_VEHICLE_ID_LIST(vehID)
// Default data
IF iVehicleSlot = -1
#IF IS_DEBUG_BUILD
PRINTLN("\n\nMONITOR_PLAYER_CUTSCENE_ENTITIES() Setting default vehicle data for ", GET_PLAYER_PED_STRING(ePed))
#ENDIF
// Grab the vehicle data for the specified ped
GET_PLAYER_VEH_DATA(ePed, sVehData, eVehicleType)
PRINTLN("...plate = ", sVehData.tlNumberPlate)
PRINTLN("...type = ", ENUM_TO_INT(sVehData.eType))
PRINTLN("...model = ", GET_MODEL_NAME_FOR_DEBUG(sVehData.model))
IF sVehData.model = GET_ENTITY_MODEL(vehID)
SET_VEH_DATA_FROM_STRUCT(vehID, sVehData)
SET_VEHICLE_NOT_STEALABLE_AMBIENTLY(vehID, FALSE)
SET_VEHICLE_CAN_SAVE_IN_GARAGE(vehID, FALSE)
SET_VEHICLE_HAS_STRONG_AXLES(vehID, TRUE)
// Attach Mr Raspberry Jam to Trevors truck
IF ePed = CHAR_TREVOR
IF GET_ENTITY_MODEL(vehID) = BODHI2
TURN_ON_MR_RASPBERRY_JAM(vehID)
ENDIF
ENDIF
// Store in temp list so we don't set the data again
STORE_TEMP_PLAYER_VEHICLE_ID(vehID, ePed)
ENDIF
// Stored data
ELSE
#IF IS_DEBUG_BUILD
PRINTLN("\n\nMONITOR_PLAYER_CUTSCENE_ENTITIES() Setting stored vehicle data for ", GET_PLAYER_PED_STRING(ePed))
#ENDIF
SET_VEHICLE_NOT_STEALABLE_AMBIENTLY(vehID, FALSE)
SET_VEHICLE_CAN_SAVE_IN_GARAGE(vehID, FALSE)
SET_VEHICLE_HAS_STRONG_AXLES(vehID, TRUE)
// Colours
SET_VEHICLE_COLOURS(vehID, g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].iColour1, g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].iColour2)
SET_VEHICLE_EXTRA_COLOURS(vehID, g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].iColourExtra1, g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].iColourExtra2)
// Extras
REPEAT NUMBER_OF_VEHICLE_EXTRAS iExtra
SET_VEHICLE_EXTRA(vehID, iExtra+1, (NOT g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].bExtraOn[iExtra]))
ENDREPEAT
// Number plate
// Bug #437236 - Set all license plates for all profiles in SP and MP to have the same text when reading from the cloud data.
IF GET_CAR_APP_NUMBER_PLATE(tlPlateText, iPlateBack)
SET_VEHICLE_NUMBER_PLATE_TEXT(vehID, tlPlateText)
SET_VEHICLE_NUMBER_PLATE_TEXT_INDEX(vehID, iPlateBack)
ELSE
SET_VEHICLE_NUMBER_PLATE_TEXT(vehID, g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].tlNumberPlate)
IF g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].iPlateBack >= 0
AND g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].iPlateBack < GET_NUMBER_OF_VEHICLE_NUMBER_PLATES()
SET_VEHICLE_NUMBER_PLATE_TEXT_INDEX(vehID, g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].iPlateBack)
ENDIF
ENDIF
// Tyre smoke
SET_VEHICLE_TYRE_SMOKE_COLOR(vehID, g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].iTyreR, g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].iTyreG, g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].iTyreB)
// Window tint
SET_VEHICLE_WINDOW_TINT(vehID, g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].iWindowTintColour)
// Neon lights
SET_VEHICLE_NEON_COLOUR(vehID, g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].iNeonR, g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].iNeonG, g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].iNeonB)
SET_VEHICLE_NEON_ENABLED(vehID, NEON_FRONT, IS_BIT_SET(g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].iFlags, VEHICLE_SETUP_FLAG_NEON_FRONT))
SET_VEHICLE_NEON_ENABLED(vehID, NEON_BACK, IS_BIT_SET(g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].iFlags, VEHICLE_SETUP_FLAG_NEON_BACK))
SET_VEHICLE_NEON_ENABLED(vehID, NEON_LEFT, IS_BIT_SET(g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].iFlags, VEHICLE_SETUP_FLAG_NEON_LEFT))
SET_VEHICLE_NEON_ENABLED(vehID, NEON_RIGHT, IS_BIT_SET(g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].iFlags, VEHICLE_SETUP_FLAG_NEON_RIGHT))
// Livery
IF GET_VEHICLE_LIVERY_COUNT(vehID) > 1
AND g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].iLivery >= 0
SET_VEHICLE_LIVERY(vehID, g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].iLivery)
ENDIF
// Wheel type
IF g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].iWheelType > -1
IF NOT IS_THIS_MODEL_A_BICYCLE(GET_ENTITY_MODEL(vehID))
IF IS_THIS_MODEL_A_BIKE(GET_ENTITY_MODEL(vehID))
IF (INT_TO_ENUM(MOD_WHEEL_TYPE, g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].iWheelType) = MWT_BIKE)
SET_VEHICLE_WHEEL_TYPE(vehID, INT_TO_ENUM(MOD_WHEEL_TYPE, g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].iWheelType))
ENDIF
ELSE
SET_VEHICLE_WHEEL_TYPE(vehID, INT_TO_ENUM(MOD_WHEEL_TYPE, g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].iWheelType))
ENDIF
ENDIF
ENDIF
// Mods
SET_VEHICLE_MOD_DATA(vehID, g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].iModIndex, g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].iModVariation)
// Attach Mr Raspberry Jam to Trevors truck
IF ePed = CHAR_TREVOR
IF GET_ENTITY_MODEL(vehID) = BODHI2
TURN_ON_MR_RASPBERRY_JAM(vehID)
ENDIF
ENDIF
// Store in temp list so we don't set the data again
STORE_TEMP_PLAYER_VEHICLE_ID(vehID, ePed)
ENDIF
ELSE
#IF IS_DEBUG_BUILD
PRINTLN("\n\nMONITOR_PLAYER_CUTSCENE_ENTITIES() Player data already set for ", GET_PLAYER_PED_STRING(ePed), " vehicle")
#ENDIF
ENDIF
bCutsceneVeh_DataSet[iPlayerPed] = TRUE
ENDIF
bVehDataSet[iPlayerPed] = TRUE
ENDIF
ENDIF
IF NOT bPedDataSet[iPlayerPed]
bCutscenePed_DataSet[iPlayerPed] = FALSE
ENDIF
IF NOT bVehDataSet[iPlayerPed]
bCutsceneVeh_DataSet[iPlayerPed] = FALSE
ENDIF
ENDREPEAT
ENDPROC
/// PURPOSE: This proc gets called when the player controller script starts up.
/// One of the main tasks is to set the player as one of the main chracters.
PROC INITIALISE_PLAYER_PED_STATE()
// Make sure all the defaults have been set up
IF NOT HAS_DEFAULT_INFO_BEEN_SET()
SETUP_DEFAULT_PLAYER_INFO()
//Setup default relationship groups.
SETUP_DEFAULT_PLAYER_RELATIONSHIPS()
// Ensure we update cutscene data
SET_PLAYER_PED_DATA_IN_CUTSCENES(TRUE, TRUE)
// Set random player character on startup
#IF IS_DEBUG_BUILD
IF NOT g_bRandomPlayerCharacterSet
AND NOT g_bMagDemoActive
SELECTOR_SLOTS_ENUM eCharacterSelection = SELECTOR_PED_MICHAEL
//Allow randomised start character to be overriden from the command line. -BenR
BOOL bUseRandom = TRUE
IF g_eDebugForceStartingCharacter != NO_CHARACTER
IF IS_PLAYER_PED_PLAYABLE(g_eDebugForceStartingCharacter)
bUseRandom = FALSE
eCharacterSelection = GET_SELECTOR_SLOT_FROM_PLAYER_PED_ENUM(g_eDebugForceStartingCharacter)
PRINTLN("Starting character set to ", GET_CHARSHEET_DISPLAY_STRING_FROM_CHARSHEET(GET_PLAYER_PED_ENUM_FROM_SELECTOR_SLOT(eCharacterSelection)), " by custom_config script.")
ELSE
SCRIPT_ASSERT("Starting character defined in custom_config.sc is not playable. Using randomised starting char instead.")
ENDIF
ENDIF
IF bUseRandom
eCharacterSelection = INT_TO_ENUM(SELECTOR_SLOTS_ENUM, GET_RANDOM_INT_IN_RANGE(0, 3))
PRINTLN("Starting character randomised as ", GET_CHARSHEET_DISPLAY_STRING_FROM_CHARSHEET(GET_PLAYER_PED_ENUM_FROM_SELECTOR_SLOT(eCharacterSelection)), ".")
ENDIF
WHILE NOT SET_CURRENT_SELECTOR_PED(eCharacterSelection)
WAIT(0)
ENDWHILE
g_bRandomPlayerCharacterSet = TRUE
// Get a random outfit set
bSetRandomOutfitOnStartup = TRUE
ENDIF
// Reset last known ped info - for a clean slate when switching/creating ambient player peds
ResetLastKnownPedInfo(g_savedGlobals.sPlayerData.sInfo, SP_MISSION_NONE)
#ENDIF
// Max out all special abilities when not running the actual flow
#IF IS_DEBUG_BUILD
IF NOT g_savedGlobals.sFlow.isGameflowActive
OR NOT IS_BIT_SET(g_savedGlobals.sFlow.strandSavedVars[STRAND_PROLOGUE].savedBitflags, SAVED_BITS_STRAND_ACTIVATED)
g_savedGlobals.sPlayerData.sInfo.bSpecialAbilityUnlocked[CHAR_MICHAEL] = TRUE
g_savedGlobals.sPlayerData.sInfo.bSpecialAbilityUnlocked[CHAR_FRANKLIN] = TRUE
g_savedGlobals.sPlayerData.sInfo.bSpecialAbilityUnlocked[CHAR_TREVOR] = TRUE
// Override the stat value
STAT_SET_INT(SP0_SPECIAL_ABILITY, 100)
STAT_SET_INT(SP1_SPECIAL_ABILITY, 100)
STAT_SET_INT(SP2_SPECIAL_ABILITY, 100)
// Unable to override current character so fill on ped
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
SPECIAL_ABILITY_FILL_METER(PLAYER_ID(), TRUE)
ENDIF
ENDIF
#ENDIF
ENDIF
#IF IS_DEBUG_BUILD
PRINTSTRING("\nPlayer controller - initial player ped state [ePed: ")
PRINTSTRING(GET_CURRENT_PLAYER_PED_STRING())
PRINTSTRING(", eState: ")
PRINTINT(ENUM_TO_INT(g_sPlayerPedRequest.eState))
PRINTSTRING(", in progress: ")
PRINTBOOL(IS_PLAYER_SWITCH_IN_PROGRESS())
PRINTSTRING("]")
PRINTNL()
#ENDIF
// If we are in the middle of switching then jump straight to the
// switch stage - this is most likely to happen when returning
// from MP
IF IS_PLAYER_PED_SWITCH_IN_PROGRESS()
OR IS_PLAYER_SWITCH_IN_PROGRESS()
PRINTSTRING("\nPlayer controller - returning from MP")PRINTNL()
//
// // Fix for bug #170990 - Removing player control so we cannot activate sp script with invalid character
// SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
eStage = PC_STAGE_WAIT
ELSE
// If we are not a valid player character then make a request to be one.
IF NOT IS_PLAYER_PED_PLAYABLE(GET_CURRENT_PLAYER_PED_ENUM())
PRINTSTRING("\nPlayer controller - invalid character, attempting to make a request")PRINTNL()
// Fix for bug #170990 - Removing player control so we cannot activate sp script with invalid character
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE)
// Attempt to set the last known player ped
enumCharacterList ePed = GET_LAST_KNOWN_PLAYER_PED_ENUM()
IF IS_PLAYER_PED_PLAYABLE(ePed)
MAKE_PLAYER_PED_SWITCH_REQUEST(ePed) //, PR_TYPE_AMBIENT)
// Unable to get the last known player ped so try and get a ped that has been introduced.
ELIF IS_SELECTOR_PED_AVAILABLE_IN_FLOW(SELECTOR_PED_MICHAEL) AND IS_SELECTOR_PED_INTRODUCED_IN_FLOW(SELECTOR_PED_MICHAEL)
MAKE_PLAYER_PED_SWITCH_REQUEST(CHAR_MICHAEL) //, PR_TYPE_AMBIENT)
ELIF IS_SELECTOR_PED_AVAILABLE_IN_FLOW(SELECTOR_PED_FRANKLIN) AND IS_SELECTOR_PED_INTRODUCED_IN_FLOW(SELECTOR_PED_FRANKLIN)
MAKE_PLAYER_PED_SWITCH_REQUEST(CHAR_FRANKLIN) //, PR_TYPE_AMBIENT)
ELIF IS_SELECTOR_PED_AVAILABLE_IN_FLOW(SELECTOR_PED_TREVOR) AND IS_SELECTOR_PED_INTRODUCED_IN_FLOW(SELECTOR_PED_TREVOR)
MAKE_PLAYER_PED_SWITCH_REQUEST(CHAR_TREVOR) //, PR_TYPE_AMBIENT)
ELSE
// Unable to find any suitable character so just select Michael.
PRINTSTRING("\nPlayer controller - no suitable characters available, making a request for Michael")PRINTNL()
MAKE_PLAYER_PED_SWITCH_REQUEST(CHAR_MICHAEL) //, PR_TYPE_AMBIENT)
ENDIF
// Valid player character so set default info
ELSE
IF g_bPlayerSetupByQuickSave = FALSE
PED_INDEX pedID = PLAYER_PED_ID()
RESTORE_PLAYER_PED_WEAPONS(pedID)
RESTORE_PLAYER_PED_ARMOUR(pedID)
RESTORE_PLAYER_PED_TATTOOS(pedID)
RESTORE_PLAYER_PED_VARIATIONS(pedID)
SET_PED_CAN_LOSE_PROPS_ON_DAMAGE(pedID, FALSE)
ELSE
CPRINTLN(DEBUG_PED_COMP,"Player controller skipping variations setup. Already done for loading a quicksave.")
ENDIF
g_bPlayerSetupByQuickSave = FALSE
ENDIF
// Jump to the wait stage so we can process any requestst
eStage = PC_STAGE_WAIT
ENDIF
// Re-instate special ability
INT i
REPEAT NUM_OF_PLAYABLE_PEDS i
IF g_savedGlobals.sPlayerData.sInfo.bSpecialAbilityUnlocked[i]
SPECIAL_ABILITY_UNLOCK(GET_PLAYER_PED_MODEL(INT_TO_ENUM(enumCharacterList, i)))
ELSE
SPECIAL_ABILITY_LOCK(GET_PLAYER_PED_MODEL(INT_TO_ENUM(enumCharacterList, i)))
ENDIF
ENDREPEAT
// Refresh the last stored clothes struct to match saved globals
g_sLastStoredPlayerPedClothes[CHAR_MICHAEL] = g_savedGlobals.sPlayerData.sInfo.sVariations[CHAR_MICHAEL]
g_sLastStoredPlayerPedClothes[CHAR_FRANKLIN] = g_savedGlobals.sPlayerData.sInfo.sVariations[CHAR_FRANKLIN]
g_sLastStoredPlayerPedClothes[CHAR_TREVOR] = g_savedGlobals.sPlayerData.sInfo.sVariations[CHAR_TREVOR]
// Set the front end player blip name
UPDATE_PLAYER_PED_BLIP_NAME()
// Set the correct timecycle modifier
UPDATE_PLAYER_PED_TIMECYCLE_MODIFIER()
// Update the last known player info to stats
UPDATE_PLAYER_PED_VARIATION_STATS()
// Register this player with their automatic doors.
PED_INDEX playerPed = PLAYER_PED_ID()
REGISTER_PLAYER_PED_WITH_AUTOMATIC_DOORS(GET_CURRENT_PLAYER_PED_ENUM(), playerPed)
// // Check for respawning Player away from mission blips at safehouse #939375
// IF SHOULD_PROCESS_DESCENT_SWITCH_ON_LOAD()
//
// // Setup the scene data
// sSceneData.iStage = 0
// sSceneData.eScene = PR_SCENE_INVALID
// sSceneData.ePed = GET_CURRENT_PLAYER_PED_ENUM() //g_sPlayerPedRequest.ePed
//
// PED_SCENE_STRUCT sPedScene
// PLAYER_TIMETABLE_SCENE_STRUCT sPassedScene
//
// FLOAT fScenePercent
// SWITCH sSceneData.ePed
// CASE CHAR_MICHAEL
// GetMichaelSceneForCurrentTime(sSceneData.eScene, fScenePercent, sPedScene, sPassedScene)
// BREAK
//
// CASE CHAR_FRANKLIN
// GetFranklinSceneForCurrentTime(sSceneData.eScene, fScenePercent, sPedScene, sPassedScene)
// BREAK
//
// CASE CHAR_TREVOR
// GetTrevorSceneForCurrentTime(sSceneData.eScene, fScenePercent, sPedScene, sPassedScene)
// BREAK
// ENDSWITCH
//
// #IF IS_DEBUG_BUILD
// PRINTSTRING("<player_controller> GET_PLAYER_PED_SCENE_FOR_CURRENT_TIME[\"")
// PRINTSTRING(Get_String_From_Ped_Request_Scene_Enum(sSceneData.eScene))
// PRINTSTRING("\"] fScenePercent:")
// PRINTFLOAT(fScenePercent)
// PRINTSTRING("%")
//
// PRINTSTRING(" - perform post-load switch (url:bugstar:939375)")
// PRINTNL()
// #ENDIF
//
// WHILE NOT PROCESS_PLAYER_PED_SCENE(sSceneData, ENUM_TO_INT(SWITCH_FLAG_DESCENT_ONLY))
//
// #IF IS_DEBUG_BUILD
// PRINTSTRING("<player_controller> PROCESS_PLAYER_PED_SCENE[\"")
// PRINTSTRING(Get_String_From_Ped_Request_Scene_Enum(sSceneData.eScene))
// PRINTSTRING("\"]")
// PRINTNL()
// #ENDIF
//
// WAIT(0)
// ENDWHILE
//
// ELSE
// #IF IS_DEBUG_BUILD
// PRINTSTRING("<player_controller> SHOULD_PROCESS_DESCENT_SWITCH_ON_LOAD()")
//
// PRINTSTRING(" - perform post-load switch (url:bugstar:939375)")
// PRINTNL()
// #ENDIF
// ENDIF
ENDPROC
PROC MONITOR_PLAYER_WANTED_RELATIONSHIPS()
SWITCH GET_CURRENT_PLAYER_PED_ENUM()
CASE CHAR_FRANKLIN
IF NOT bWantedRelationshipsSet
IF IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(), 0)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_HATE, RELGROUPHASH_AMBIENT_GANG_FAMILY, RELGROUPHASH_COP)
bWantedRelationshipsSet = TRUE
ENDIF
ELSE
IF NOT IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(), 0)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_NONE, RELGROUPHASH_AMBIENT_GANG_FAMILY, RELGROUPHASH_COP)
bWantedRelationshipsSet = FALSE
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDPROC
//// PURPOSE: Handle vehicle recording for end of martin1.
PROC HANDLE_END_OF_MISSION_MARTIN_1()
// Bail checks
IF iMartin1Stage > 0
IF IS_PED_INJURED(PLAYER_PED_ID())
OR NOT g_bHandleEndOfMission_Martin1
iMartin1Stage = 99
PRINTLN("HANDLE_END_OF_MISSION_MARTIN_1 - bail.")
ENDIF
ENDIF
SWITCH iMartin1Stage
CASE 0
// Wait for mission script to set flag
IF g_bHandleEndOfMission_Martin1
iMartin1Stage++
PRINTLN("HANDLE_END_OF_MISSION_MARTIN_1 - waiting for cutscene to end.")
ENDIF
BREAK
CASE 1
REQUEST_VEHICLE_RECORDING(000, "END_MARTIN_1") bMartin1RecordingRequested = TRUE
IF NOT IS_CUTSCENE_PLAYING()
AND GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("Martin1")) = 0
IF HAS_VEHICLE_RECORDING_BEEN_LOADED(000, "END_MARTIN_1")
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
viMartin1Veh = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
ENDIF
IF DOES_ENTITY_EXIST(viMartin1Veh)
AND IS_VEHICLE_DRIVEABLE(viMartin1Veh)
START_PLAYBACK_RECORDED_VEHICLE(viMartin1Veh, 000, "END_MARTIN_1")
iMartin1Stage++
PRINTLN("HANDLE_END_OF_MISSION_MARTIN_1 - starting playback.")
ELSE
iMartin1Stage = 99
PRINTLN("HANDLE_END_OF_MISSION_MARTIN_1 - couldnt find vehicle.")
ENDIF
ELSE
PRINTLN("HANDLE_END_OF_MISSION_MARTIN_1 - waiting for carrec to load.")
ENDIF
ENDIF
BREAK
CASE 2
IF NOT DOES_ENTITY_EXIST(viMartin1Veh)
iMartin1Stage++
PRINTLN("HANDLE_END_OF_MISSION_MARTIN_1 - vehicle dead.")
ELIF NOT IS_VEHICLE_DRIVEABLE(viMartin1Veh)
iMartin1Stage++
PRINTLN("HANDLE_END_OF_MISSION_MARTIN_1 - vehicle fucked.")
ELIF NOT IS_PLAYBACK_GOING_ON_FOR_VEHICLE(viMartin1Veh)
iMartin1Stage++
PRINTLN("HANDLE_END_OF_MISSION_MARTIN_1 - playback complete.")
ELSE
PRINTLN("HANDLE_END_OF_MISSION_MARTIN_1 - playback ongoing.")
ENDIF
BREAK
CASE 3
PRINTLN("HANDLE_END_OF_MISSION_MARTIN_1 - finished.")
IF bMartin1RecordingRequested
REMOVE_VEHICLE_RECORDING(000, "END_MARTIN_1")
ENDIF
viMartin1Veh = NULL
iMartin1Stage = 0
g_bHandleEndOfMission_Martin1 = FALSE
BREAK
// Bail
CASE 99
IF bMartin1RecordingRequested
REMOVE_VEHICLE_RECORDING(000, "END_MARTIN_1")
ENDIF
viMartin1Veh = NULL
iMartin1Stage = 0
g_bHandleEndOfMission_Martin1 = FALSE
BREAK
ENDSWITCH
ENDPROC
INT iFrameAutodoorIndexDockWorker = 0
/// PURPOSE: Ensures Trevor is allowed into docks if he's in dock worker uniform.
PROC CHECK_FOR_TREVOR_AS_DOCK_WORKER_FOR_AUTODOORS()
AUTOMATIC_DOOR_ENUM doorEnumLimit = AUTODOOR_DOCKS_BACK_GATE_OUT
IF TIMERB() > 250
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR
IF g_bDocksBackGatesIgnoreTrevorsUniform
doorEnumLimit = AUTODOOR_DOCKS_FRONT_GATE_OUT
ENDIF
IF GET_MISSION_FLAG()
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("docks_setup")) > 0 // Added for 468042 - Will only unlock front dock gates for Trevor in uniform while on docks_setup
doorEnumLimit = AUTODOOR_DOCKS_FRONT_GATE_OUT
ENDIF
ENDIF
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
IF VDIST2(g_sAutoDoorData[iFrameAutodoorIndexDockWorker].coords, GET_ENTITY_COORDS(PLAYER_PED_ID())) < g_sAutoDoorData[iFrameAutodoorIndexDockWorker].checkRange
IF IS_PED_REGISTERED_TO_ACTIVATE_AUTOMATIC_DOOR(INT_TO_ENUM(AUTOMATIC_DOOR_ENUM, iFrameAutodoorIndexDockWorker), PLAYER_PED_ID())
IF NOT IS_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P2_DOCK_WORKER)
CPRINTLN(DEBUG_DOOR, "Trevor is NOT in dock outfit, Unregistered for dock door ", GET_AUTOMATIC_DOOR_DEBUG_STRING_FROM_INDEX(iFrameAutodoorIndexDockWorker), ".")
UNREGISTER_PED_TO_ACTIVATE_AUTOMATIC_DOOR(INT_TO_ENUM(AUTOMATIC_DOOR_ENUM, iFrameAutodoorIndexDockWorker), PLAYER_PED_ID())
ENDIF
ELSE
IF IS_PED_COMP_ITEM_CURRENT_SP(PLAYER_PED_ID(), COMP_TYPE_OUTFIT, OUTFIT_P2_DOCK_WORKER)
CPRINTLN(DEBUG_DOOR, "Trevor is in dock outfit, registered for dock door ", GET_AUTOMATIC_DOOR_DEBUG_STRING_FROM_INDEX(iFrameAutodoorIndexDockWorker), ".")
REGISTER_PED_TO_ACTIVATE_AUTOMATIC_DOOR(INT_TO_ENUM(AUTOMATIC_DOOR_ENUM, iFrameAutodoorIndexDockWorker), PLAYER_PED_ID())
ENDIF
ENDIF
ENDIF
iFrameAutodoorIndexDockWorker++
IF iFrameAutodoorIndexDockWorker > ENUM_TO_INT(doorEnumLimit)
iFrameAutodoorIndexDockWorker = ENUM_TO_INT(AUTODOOR_DOCKS_FRONT_GATE_IN)
ENDIF
ENDIF
ENDIF
SETTIMERB(0)
ENDIF
ENDPROC
FUNC STRING GET_LABEL_FROM_STRING(STRING sLabel)
RETURN sLabel
ENDFUNC
PROC SETUP_CONTENT_CHANGE_WITH_COUNTER(INT &iCounter, STRING sLabel)
iCounter++
tlContentLabel = GET_LABEL_FROM_STRING(sLabel)
bDisplayContentFeedMessage = TRUE
ENDPROC
PROC SETUP_CONTENT_CHANGE_WITH_BIT_FLAG(INT &iBitset, INT iBit, STRING sLabel)
SET_BIT(iBitset, iBit)
tlContentLabel = GET_LABEL_FROM_STRING(sLabel)
bDisplayContentFeedMessage = TRUE
ENDPROC
PROC UPDATE_CONTENT_STATE_TATTOOS(BOOL bUnlocked)
SET_PLAYER_PED_TATTOO_UNLOCKED(CHAR_MICHAEL, TATTOO_SP_MICHAEL_12, bUnlocked)
SET_PLAYER_PED_TATTOO_UNLOCKED(CHAR_TREVOR, TATTOO_SP_TREVOR_6, bUnlocked)
SET_PLAYER_PED_TATTOO_UNLOCKED(CHAR_FRANKLIN, TATTOO_SP_FRANKLIN_1, bUnlocked)
ENDPROC
PROC UPDATE_CONTENT_STATE_CLOTHES(BOOL bUnlocked)
SET_PED_COMP_ITEM_DETAILS_SP(GET_PLAYER_PED_MODEL(CHAR_MICHAEL), COMP_TYPE_TORSO, TORSO_P0_HEAVY_JACKET, bUnlocked, bUnlocked, bUnlocked)
SET_PED_COMP_ITEM_DETAILS_SP(GET_PLAYER_PED_MODEL(CHAR_MICHAEL), COMP_TYPE_TORSO, TORSO_P0_GREY_SUIT_03, bUnlocked, bUnlocked, bUnlocked)
SET_PED_COMP_ITEM_DETAILS_SP(GET_PLAYER_PED_MODEL(CHAR_MICHAEL), COMP_TYPE_LEGS, LEGS_P0_GREY_SUIT_3, bUnlocked, bUnlocked, bUnlocked)
SET_PED_COMP_ITEM_DETAILS_SP(GET_PLAYER_PED_MODEL(CHAR_MICHAEL), COMP_TYPE_OUTFIT, OUTFIT_P0_BLACK_SUIT, bUnlocked, bUnlocked, bUnlocked)
SET_PED_COMP_ITEM_DETAILS_SP(GET_PLAYER_PED_MODEL(CHAR_TREVOR), COMP_TYPE_TORSO, TORSO_P2_DENIM_JACKET, bUnlocked, bUnlocked, bUnlocked)
SET_PED_COMP_ITEM_DETAILS_SP(GET_PLAYER_PED_MODEL(CHAR_TREVOR), COMP_TYPE_TORSO, TORSO_P2_BOWLING_SHIRT_4, bUnlocked, bUnlocked, bUnlocked)
SET_PED_COMP_ITEM_DETAILS_SP(GET_PLAYER_PED_MODEL(CHAR_TREVOR), COMP_TYPE_OUTFIT, OUTFIT_P2_DENIM, bUnlocked, bUnlocked, bUnlocked)
SET_PED_COMP_ITEM_DETAILS_SP(GET_PLAYER_PED_MODEL(CHAR_FRANKLIN), COMP_TYPE_TORSO, TORSO_P1_HOODIE_10, bUnlocked, bUnlocked, bUnlocked)
SET_PED_COMP_ITEM_DETAILS_SP(GET_PLAYER_PED_MODEL(CHAR_FRANKLIN), COMP_TYPE_TORSO, TORSO_P1_HOODIE_12, bUnlocked, bUnlocked, bUnlocked)
SET_PED_COMP_ITEM_DETAILS_SP(GET_PLAYER_PED_MODEL(CHAR_FRANKLIN), COMP_TYPE_OUTFIT, OUTFIT_P1_HOODIE_AND_SWEATS, bUnlocked, bUnlocked, bUnlocked)
ENDPROC
PROC DO_INITIAL_CONTENT_CHECKS()
#IF IS_JAPANESE_BUILD
IF IS_BIT_SET(g_savedGlobals.sShopData.iContentChecks_Game, NCU_SPECIAL_EDITION)
IF NOT IS_JAPANESE_SPECIAL_EDITION_GAME()
CPRINTLN(DEBUG_PED_COMP, "DO_INITIAL_CONTENT_CHECKS: Removing Japanese Special Edition content")
CLEAR_BIT(g_savedGlobals.sShopData.iContentChecks_Game, NCU_SPECIAL_EDITION)
ENDIF
ENDIF
#ENDIF
#IF NOT IS_JAPANESE_BUILD
// Remove shared SE/CE edition content if no longer available
IF IS_BIT_SET(g_savedGlobals.sShopData.iContentChecks_Game, NCU_SPECIAL_EDITION)
OR IS_BIT_SET(g_savedGlobals.sShopData.iContentChecks_Game, NCU_COLLECTORS_EDITION)
IF NOT IS_SPECIAL_EDITION_GAME()
AND NOT IS_COLLECTORS_EDITION_GAME()
CPRINTLN(DEBUG_PED_COMP, "DO_INITIAL_CONTENT_CHECKS: Removing Special and Collectors Edition content")
CLEAR_BIT(g_savedGlobals.sShopData.iContentChecks_Game, NCU_SPECIAL_EDITION)
CLEAR_BIT(g_savedGlobals.sShopData.iContentChecks_Game, NCU_COLLECTORS_EDITION)
// Lock tattoos
UPDATE_CONTENT_STATE_TATTOOS(FALSE)
// Lock clothes
UPDATE_CONTENT_STATE_CLOTHES(FALSE)
ENDIF
ENDIF
#ENDIF
ENDPROC
FUNC BOOL SHOULD_PROCESS_NEW_CONTENT_CHECK()
#IF IS_DEBUG_BUILD
BOOL bPrintDebugInfo = FALSE
IF GET_COMMANDLINE_PARAM_EXISTS("sc_printPlayerControllerLogs")
bPrintDebugInfo = TRUE
ENDIF
#ENDIF
IF IS_PED_INJURED(PLAYER_PED_ID())
#IF IS_DEBUG_BUILD
IF bPrintDebugInfo
CDEBUG3LN(DEBUG_AMBIENT, "DO_NEW_CONTENT_CHECKS// SHOULD_PROCESS_NEW_CONTENT_CHECK IS_PED_INJURED(PLAYER_PED_ID()) TRUE")
ENDIF
#ENDIF
RETURN FALSE
ENDIF
IF IS_PLAYER_SWITCH_IN_PROGRESS()
#IF IS_DEBUG_BUILD
IF bPrintDebugInfo
CDEBUG3LN(DEBUG_AMBIENT, "DO_NEW_CONTENT_CHECKS// SHOULD_PROCESS_NEW_CONTENT_CHECK IS_PLAYER_SWITCH_IN_PROGRESS( TRUE)")
ENDIF
#ENDIF
RETURN FALSE
ENDIF
IF IS_PLAYER_PED_SWITCH_IN_PROGRESS()
#IF IS_DEBUG_BUILD
IF bPrintDebugInfo
CDEBUG3LN(DEBUG_AMBIENT, "DO_NEW_CONTENT_CHECKS// SHOULD_PROCESS_NEW_CONTENT_CHECK IS_PLAYER_PED_SWITCH_IN_PROGRESS() TRUE")
ENDIF
#ENDIF
RETURN FALSE
ENDIF
IF IS_CUTSCENE_PLAYING()
#IF IS_DEBUG_BUILD
IF bPrintDebugInfo
CDEBUG3LN(DEBUG_AMBIENT, "DO_NEW_CONTENT_CHECKS// SHOULD_PROCESS_NEW_CONTENT_CHECK IS_CUTSCENE_PLAYING() true")
ENDIF
#ENDIF
RETURN FALSE
ENDIF
IF NOT IS_PLAYER_CONTROL_ON(PLAYER_ID())
#IF IS_DEBUG_BUILD
IF bPrintDebugInfo
CDEBUG3LN(DEBUG_AMBIENT, "DO_NEW_CONTENT_CHECKS// SHOULD_PROCESS_NEW_CONTENT_CHECK IS_PLAYER_CONTROL_ON(PLAYER_ID()) false")
ENDIF
#ENDIF
RETURN FALSE
ENDIF
IF g_bScriptsSetSafeForCutscene
#IF IS_DEBUG_BUILD
IF bPrintDebugInfo
CDEBUG3LN(DEBUG_AMBIENT, "DO_NEW_CONTENT_CHECKS// SHOULD_PROCESS_NEW_CONTENT_CHECK g_bScriptsSetSafeForCutscene")
ENDIF
#ENDIF
RETURN FALSE
ENDIF
IF iContentCheckStage > iMAX_LAST_ITEMS // last item
#IF IS_DEBUG_BUILD
IF bPrintDebugInfo
CDEBUG3LN(DEBUG_AMBIENT, "DO_NEW_CONTENT_CHECKS// SHOULD_PROCESS_NEW_CONTENT_CHECK iContentCheckStage > iMAX_LAST_ITEMS")
ENDIF
#ENDIF
RETURN FALSE
ENDIF
IF IS_SCREEN_FADING_OUT()
OR IS_SCREEN_FADED_OUT() // #1382357
#IF IS_DEBUG_BUILD
IF bPrintDebugInfo
CDEBUG3LN(DEBUG_AMBIENT, "DO_NEW_CONTENT_CHECKS// SHOULD_PROCESS_NEW_CONTENT_CHECK IS_SCREEN_FADING_OUT() true")
ENDIF
#ENDIF
RETURN FALSE
ENDIF
IF IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_STORY) // #1382357
#IF IS_DEBUG_BUILD
IF bPrintDebugInfo
CDEBUG3LN(DEBUG_AMBIENT, "DO_NEW_CONTENT_CHECKS// SHOULD_PROCESS_NEW_CONTENT_CHECK IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_STORY) true")
ENDIF
#ENDIF
RETURN FALSE
ENDIF
IF IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_STORY_FRIENDS) // #1382357
#IF IS_DEBUG_BUILD
IF bPrintDebugInfo
CDEBUG3LN(DEBUG_AMBIENT, "DO_NEW_CONTENT_CHECKS// SHOULD_PROCESS_NEW_CONTENT_CHECK IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_STORY_FRIENDS) true")
ENDIF
#ENDIF
RETURN FALSE
ENDIF
IF IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_RANDOM_CHAR) // #1382357
#IF IS_DEBUG_BUILD
IF bPrintDebugInfo
CDEBUG3LN(DEBUG_AMBIENT, "DO_NEW_CONTENT_CHECKS// SHOULD_PROCESS_NEW_CONTENT_CHECK IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_RANDOM_CHAR) true")
ENDIF
#ENDIF
RETURN FALSE
ENDIF
IF IS_REPEAT_PLAY_ACTIVE()
#IF IS_DEBUG_BUILD
IF bPrintDebugInfo
CDEBUG3LN(DEBUG_AMBIENT, "DO_NEW_CONTENT_CHECKS// SHOULD_PROCESS_NEW_CONTENT_CHECK IS_REPEAT_PLAY_ACTIVE() true")
ENDIF
#ENDIF
RETURN FALSE
ENDIF
IF IS_INTERIOR_SCENE()
#IF IS_DEBUG_BUILD
IF bPrintDebugInfo
CDEBUG3LN(DEBUG_AMBIENT, "DO_NEW_CONTENT_CHECKS// SHOULD_PROCESS_NEW_CONTENT_CHECK IS_INTERIOR_SCENE() true")
ENDIF
#ENDIF
RETURN FALSE
ENDIF
IF IS_BROWSER_OPEN()
#IF IS_DEBUG_BUILD
IF bPrintDebugInfo
CDEBUG3LN(DEBUG_AMBIENT, "DO_NEW_CONTENT_CHECKS// SHOULD_PROCESS_NEW_CONTENT_CHECK IS_BROWSER_OPEN true")
ENDIF
#ENDIF
RETURN FALSE
ENDIF
IF NOT IS_SKYSWOOP_AT_GROUND()
#IF IS_DEBUG_BUILD
IF bPrintDebugInfo
CDEBUG3LN(DEBUG_AMBIENT, "DO_NEW_CONTENT_CHECKS// SHOULD_PROCESS_NEW_CONTENT_CHECK IS_SKYSWOOP_AT_GROUND false")
ENDIF
#ENDIF
RETURN FALSE
ENDIF
RETURN TRUE
ENDFUNC
PROC DO_NEW_CONTENT_CHECKS()
//Display DLC removed warning screen (platform specific).
IF bDisplayContentRemovedWarning
IF IS_PS3_VERSION() OR IS_PLAYSTATION_PLATFORM()
SET_WARNING_MESSAGE("CONT_REM_PS", FE_WARNING_CONTINUE)
ELIF IS_XBOX360_VERSION() OR IS_XBOX_PLATFORM()
SET_WARNING_MESSAGE("CONT_REM_XB", FE_WARNING_CONTINUE)
ELSE
SET_WARNING_MESSAGE("CONT_REM_PC", FE_WARNING_CONTINUE)
ENDIF
IF IS_AUTOSAVE_REQUEST_IN_PROGRESS()
CLEAR_AUTOSAVE_REQUESTS()
ENDIF
IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_ACCEPT)
bDisplayContentRemovedWarning = FALSE
ENDIF
ENDIF
#IF IS_DEBUG_BUILD
#IF SCRIPT_PROFILER_ACTIVE
ADD_SCRIPT_PROFILE_MARKER("DO_NEW_CONTENT_CHECKS 1")
#ENDIF
IF GET_COMMANDLINE_PARAM_EXISTS("sc_printPlayerControllerLogs")
CDEBUG3LN(DEBUG_AMBIENT, "DO_NEW_CONTENT_CHECKS/iContentCheckTimer: ", GET_GAME_TIMER()-iContentCheckTimer, "s, iContentCheckStage: ", iContentCheckStage)
ENDIF
#ENDIF
IF NOT NETWORK_IS_GAME_IN_PROGRESS()
AND (GET_GAME_TIMER() - iContentCheckTimer) > 10000
//B* 2352887: Don't do new content checks when in Director or Animal Mode
AND NOT IS_DIRECTOR_MODE_RUNNING(TRUE)
AND NOT IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_ANIMAL)
// Make sure we can display to the feed
IF NOT SHOULD_PROCESS_NEW_CONTENT_CHECK()
iContentCheckStage = iCONTENT_CHECK_12_NEXT_GEN_PREORDER
iContentCheckTimer = GET_GAME_TIMER()
iCacheShopData = 0
ELSE
INT iDLCClothes, iDLCItem, iDLCTops, iDLCHairdo, iPed
scrShopPedComponent componentItem
SWITCH iContentCheckStage
CASE iCONTENT_CHECK_0_SPECIAL_EDITION // Special Edition
IF NOT IS_BIT_SET(g_savedGlobals.sShopData.iContentChecks_Game, NCU_SPECIAL_EDITION)
IF IS_SPECIAL_EDITION_GAME()
CPRINTLN(DEBUG_AMBIENT, "DO_NEW_CONTENT_CHECKS: Unlocking Special Edition")
SET_BIT(g_savedGlobals.sShopData.iContentChecks_Game, NCU_SPECIAL_EDITION) // No longer calling SETUP_CONTENT_CHANGE_WITH_BIT_FLAG.
// Just set the bit so we don't load the text label with
// a message we don't want to display.
// Unlock tattoos
UPDATE_CONTENT_STATE_TATTOOS(TRUE)
// Unlock clothes
UPDATE_CONTENT_STATE_CLOTHES(TRUE)
ENDIF
ENDIF
#IF IS_DEBUG_BUILD
#IF SCRIPT_PROFILER_ACTIVE
ADD_SCRIPT_PROFILE_MARKER("DO_NEW_CONTENT_CHECKS SWITCH iContentCheckStage iCONTENT_CHECK_0_SPECIAL_EDITION")
#ENDIF
#ENDIF
BREAK
CASE iCONTENT_CHECK_1_COLLECTORS_EDITION // Collectors Edition
IF NOT IS_BIT_SET(g_savedGlobals.sShopData.iContentChecks_Game, NCU_COLLECTORS_EDITION)
IF IS_COLLECTORS_EDITION_GAME()
CPRINTLN(DEBUG_AMBIENT, "DO_NEW_CONTENT_CHECKS: Unlocking Collectors edition")
SET_BIT(g_savedGlobals.sShopData.iContentChecks_Game, NCU_COLLECTORS_EDITION) // In NG no longer calling SETUP_CONTENT_CHANGE_WITH_BIT_FLAG.
// Just set the bit so we don't load the text label with
// a message we don't want to display.
// Unlock tattoos
UPDATE_CONTENT_STATE_TATTOOS(TRUE)
// Unlock clothes
UPDATE_CONTENT_STATE_CLOTHES(TRUE)
ENDIF
ENDIF
#IF IS_DEBUG_BUILD
#IF SCRIPT_PROFILER_ACTIVE
ADD_SCRIPT_PROFILE_MARKER("DO_NEW_CONTENT_CHECKS SWITCH iContentCheckStage iCONTENT_CHECK_1_COLLECTORS_EDITION")
#ENDIF
#ENDIF
BREAK
CASE iCONTENT_CHECK_2_SOCIAL_CLUB // Social Club
IF NOT IS_BIT_SET(g_savedGlobals.sShopData.iContentChecks_Game, NCU_SOCIAL_CLUB)
CDEBUG3LN(DEBUG_AMBIENT, "DO_NEW_CONTENT_CHECKS//SocialClub - NETWORK_HAS_SOCIAL_CLUB_ACCOUNT():", NETWORK_HAS_SOCIAL_CLUB_ACCOUNT(),
", NETWORK_IS_SIGNED_ONLINE():", NETWORK_IS_SIGNED_ONLINE(),
", IS_PS3_VERSION():", IS_PS3_VERSION(),
", IS_PLAYSTATION_PLATFORM():", IS_PLAYSTATION_PLATFORM(),
", IS_GAME_LINKED_TO_SOCIAL_CLUB(FALSE, TRUE):", IS_GAME_LINKED_TO_SOCIAL_CLUB(FALSE, TRUE))
IF IS_GAME_LINKED_TO_SOCIAL_CLUB(FALSE, TRUE)
// Fix for 1647136 - Social club content not unlocks for silver accounts.
OR (NETWORK_HAS_SOCIAL_CLUB_ACCOUNT() AND NETWORK_IS_SIGNED_ONLINE() AND NOT IS_PS3_VERSION() AND NOT IS_PLAYSTATION_PLATFORM())
SETUP_CONTENT_CHANGE_WITH_BIT_FLAG(g_savedGlobals.sShopData.iContentChecks_Game, NCU_SOCIAL_CLUB, "CONTENT_NEW_SC")
// Unlock hairdos
SET_PED_COMP_ITEM_DETAILS_SP(GET_PLAYER_PED_MODEL(CHAR_MICHAEL), COMP_TYPE_HAIR, HAIR_P0_1_0, TRUE, TRUE)
SET_PED_COMP_ITEM_DETAILS_SP(GET_PLAYER_PED_MODEL(CHAR_FRANKLIN), COMP_TYPE_HAIR, HAIR_P1_2_0, TRUE, TRUE)
SET_PED_COMP_ITEM_DETAILS_SP(GET_PLAYER_PED_MODEL(CHAR_TREVOR), COMP_TYPE_HAIR, HAIR_P2_CURLS, TRUE, TRUE)
// Unlock beards
SET_PED_COMP_ITEM_DETAILS_SP(GET_PLAYER_PED_MODEL(CHAR_MICHAEL), COMP_TYPE_BERD, BERD_P0_4_0, TRUE, TRUE)
SET_PED_COMP_ITEM_DETAILS_SP(GET_PLAYER_PED_MODEL(CHAR_FRANKLIN), COMP_TYPE_BERD, BERD_P1_1_0, TRUE, TRUE)
SET_PED_COMP_ITEM_DETAILS_SP(GET_PLAYER_PED_MODEL(CHAR_TREVOR), COMP_TYPE_BERD, BERD_P2_4_0, TRUE, TRUE)
ENDIF
ELSE
CDEBUG3LN(DEBUG_AMBIENT, "DO_NEW_CONTENT_CHECKS//SocialClub - IS_BIT_SET(g_savedGlobals.sShopData.iContentChecks_Game, NCU_SOCIAL_CLUB)")
ENDIF
#IF IS_DEBUG_BUILD
#IF SCRIPT_PROFILER_ACTIVE
ADD_SCRIPT_PROFILE_MARKER("DO_NEW_CONTENT_CHECKS SWITCH iContentCheckStage iCONTENT_CHECK_2_SOCIAL_CLUB")
#ENDIF
#ENDIF
BREAK
CASE iCONTENT_CHECK_3_BLIMP // Blimp
IF NOT IS_BIT_SET(g_savedGlobals.sShopData.iContentChecks_Game, NCU_BLIMP)
IF IS_PREORDER_GAME()
OR IS_COLLECTORS_EDITION_GAME()
OR IS_SPECIAL_EDITION_GAME()
OR IS_JAPANESE_SPECIAL_EDITION_GAME()
OR IS_LAST_GEN_PLAYER()
IF NOT IS_SCENARIO_GROUP_ENABLED("BLIMP")
CPRINTLN(DEBUG_INIT, "shop_controller.sc - preorder, CE or SE game - enable Scenario Group \"BLIMP\".")
SET_SCENARIO_GROUP_ENABLED("BLIMP", TRUE)
ENDIF
SET_BIT(g_savedGlobals.sShopData.iContentChecks_Game, NCU_BLIMP) // In NG no longer calling SETUP_CONTENT_CHANGE_WITH_BIT_FLAG.
// Just set the bit so we don't load the text label with
// a message we don't want to display.
ENDIF
ENDIF
#IF IS_DEBUG_BUILD
#IF SCRIPT_PROFILER_ACTIVE
ADD_SCRIPT_PROFILE_MARKER("DO_NEW_CONTENT_CHECKS SWITCH iContentCheckStage iCONTENT_CHECK_3_BLIMP")
#ENDIF
#ENDIF
BREAK
CASE iCONTENT_CHECK_4_WEAPONS // Weapons
IF NOT IS_BIT_SET(iCacheShopData, CACHE_SHOP_WEAPON_DATA_BS)
INT iDLCWeapons
INT iWeaponCount, iWeapon
scrShopWeaponData weaponData
WEAPON_TYPE eWeaponType
iDLCWeapons = 0
iWeaponCount = GET_NUM_DLC_WEAPONS()
REPEAT iWeaponCount iWeapon
IF GET_DLC_WEAPON_DATA(iWeapon, weaponData)
IF NOT IS_CONTENT_ITEM_LOCKED(weaponData.m_lockHash)
AND NOT IS_DLC_WEAPON_LOCKED_BY_SCRIPT(INT_TO_ENUM(WEAPON_TYPE, weaponData.m_nameHash))
eWeaponType = INT_TO_ENUM(WEAPON_TYPE, weaponData.m_nameHash)
IF eWeaponType != WEAPONTYPE_HAMMER // Part of the collectors edition content update
AND eWeaponType != WEAPONTYPE_DLC_PISTOL50 // Part of the collectors edition content update
AND eWeaponType != WEAPONTYPE_DLC_BULLPUPSHOTGUN // Part of the collectors edition content update
AND eWeaponType != WEAPONTYPE_DLC_ASSAULTSMG // Part of the social club content update
iDLCWeapons++
ENDIF
ENDIF
ENDIF
ENDREPEAT
IF iDLCWeapons != g_savedGlobals.sShopData.iContentChecks_Weapons
// NOTE !!!!
// - This block of script runs in startup.sc too
// NOTE !!!!
PED_WEAPONS_STRUCT sTempPedWeapons
PATCH_DLC_WEAPON_LAYOUT(sTempPedWeapons, weaponData)
IF iDLCWeapons > g_savedGlobals.sShopData.iContentChecks_Weapons
IF (iDLCWeapons - g_savedGlobals.sShopData.iContentChecks_Weapons) = 1
IF NOT NETWORK_IS_GAME_IN_PROGRESS()
tlContentLabel = "CONTENT_NEW_W0"
ELSE
tlContentLabel = "CONTENT_NEW_WM0"
ENDIF
ELSE
IF NOT NETWORK_IS_GAME_IN_PROGRESS()
tlContentLabel = "CONTENT_NEW_W1"
ELSE
tlContentLabel = "CONTENT_NEW_WM1"
ENDIF
ENDIF
ENDIF
g_savedGlobals.sShopData.iContentChecks_Weapons = iDLCWeapons
#IF IS_NEXTGEN_BUILD
bDisplayContentFeedMessage = TRUE
IF IS_PC_VERSION()
bDisplayContentFeedMessage = FALSE
ENDIF
#ENDIF
ELIF iDLCWeapons < g_savedGlobals.sShopData.iContentChecks_Weapons
g_savedGlobals.sShopData.iContentChecks_Weapons = iDLCWeapons
bDisplayContentRemovedWarning = TRUE
ENDIF
#IF IS_DEBUG_BUILD
#IF SCRIPT_PROFILER_ACTIVE
ADD_SCRIPT_PROFILE_MARKER("DO_NEW_CONTENT_CHECKS SWITCH iContentCheckStage iCONTENT_CHECK_4_WEAPONS")
#ENDIF
#ENDIF
SET_BIT(iCacheShopData, CACHE_SHOP_WEAPON_DATA_BS)
PRINTLN("DO_NEW_CONTENT_CHECKS CACHE_SHOP_WEAPON_DATA_BS TRUE")
ENDIF
BREAK
CASE iCONTENT_CHECK_5_VEHICLES // Vehicles
IF NOT IS_BIT_SET(iCacheShopData, CACHE_SHOP_VEHICLE_DATA_BS)
INT iDLCGarageVehicles, iDLCHangarVehicles, iDLCMarinaVehicles, iDLCHeliVehicles
INT iVeh
scrShopVehicleData vehicleData
iDLCGarageVehicles = 0
iDLCHangarVehicles = 0
iDLCMarinaVehicles = 0
iDLCHeliVehicles = 0
REPEAT GET_NUM_DLC_VEHICLES() iVeh
IF GET_DLC_VEHICLE_DATA(iVeh, vehicleData)
IF INT_TO_ENUM(MODEL_NAMES, vehicleData.m_nameHash) != HOTKNIFE // Part of the collectors edition content update
AND INT_TO_ENUM(MODEL_NAMES, vehicleData.m_nameHash) != CARBONRS // Part of the collectors edition content update
AND INT_TO_ENUM(MODEL_NAMES, vehicleData.m_nameHash) != ELEGY2 // Part of the social club content update
IF NOT IS_CONTENT_ITEM_LOCKED(vehicleData.m_lockHash)
AND NOT IS_DLC_VEHICLE_LOCKED_BY_SCRIPT(INT_TO_ENUM(MODEL_NAMES, vehicleData.m_nameHash))
VEHICLE_STORAGE_TYPE eVehStorageType
eVehStorageType = GET_VEHICLE_STORAGE_TYPE(GET_WEBSITE_BUYABLE_VEHICLE_FROM_MODEL(INT_TO_ENUM(MODEL_NAMES, vehicleData.m_nameHash)))
SWITCH eVehStorageType
CASE VST_GARAGE iDLCGarageVehicles++ BREAK
CASE VST_HANGAR iDLCHangarVehicles++ BREAK
CASE VST_MARINA iDLCMarinaVehicles++ BREAK
CASE VST_HELI iDLCHeliVehicles++ BREAK
ENDSWITCH
ENDIF
ENDIF
ENDIF
ENDREPEAT
INT iContentChecks_HangarVehicles, iContentChecks_MarinaVehicles, iContentChecks_HeliVehicles
STAT_GET_INT(CONTENT_HANGER_VEH, iContentChecks_HangarVehicles)
STAT_GET_INT(CONTENT_MARINA_VEH, iContentChecks_MarinaVehicles)
STAT_GET_INT(CONTENT_HELI_VEH, iContentChecks_HeliVehicles)
#IF IS_DEBUG_BUILD
CDEBUG3LN(DEBUG_AMBIENT, "DO_NEW_CONTENT_CHECKS//Vehicles - GarageVehs: ", iDLCGarageVehicles, ", SavedTotal: ", g_savedGlobals.sShopData.iContentChecks_Vehicles)
CDEBUG3LN(DEBUG_AMBIENT, " HangarVehs: ", iDLCHangarVehicles, ", SavedTotal: ", iContentChecks_HangarVehicles)
CDEBUG3LN(DEBUG_AMBIENT, " MarinaVehicles: ", iDLCMarinaVehicles, ", SavedTotal: ", iContentChecks_MarinaVehicles)
CDEBUG3LN(DEBUG_AMBIENT, " HeliVehicles: ", iDLCHeliVehicles, ", SavedTotal: ", iContentChecks_HeliVehicles)
#ENDIF
IF iContentChecks_HangarVehicles < 0
OR iContentChecks_MarinaVehicles < 0
OR iContentChecks_HeliVehicles < 0
STAT_SET_INT(CONTENT_HANGER_VEH, iDLCHangarVehicles) iContentChecks_HangarVehicles = iDLCHangarVehicles
STAT_SET_INT(CONTENT_MARINA_VEH, iDLCMarinaVehicles) iContentChecks_MarinaVehicles = iDLCMarinaVehicles
STAT_SET_INT(CONTENT_HELI_VEH, iDLCHeliVehicles) iContentChecks_HeliVehicles = iDLCHeliVehicles
g_savedGlobals.sShopData.iContentChecks_Vehicles = iDLCGarageVehicles - (iDLCHangarVehicles+iDLCMarinaVehicles+iDLCHeliVehicles)
CPRINTLN(DEBUG_AMBIENT, "DO_NEW_CONTENT_CHECKS//Vehicles - unininitialised, update garage: ", g_savedGlobals.sShopData.iContentChecks_Vehicles, ", hangar: ", iContentChecks_HangarVehicles, ", marina: ", iContentChecks_MarinaVehicles, ", heli: ", iContentChecks_HeliVehicles)
MAKE_AUTOSAVE_REQUEST()
ENDIF
IF (iDLCGarageVehicles+iDLCHangarVehicles+iDLCMarinaVehicles+iDLCHeliVehicles) > g_savedGlobals.sShopData.iContentChecks_Vehicles+iContentChecks_HangarVehicles+iContentChecks_MarinaVehicles+iContentChecks_HeliVehicles
IF ((iDLCGarageVehicles+iDLCHangarVehicles+iDLCMarinaVehicles+iDLCHeliVehicles) - g_savedGlobals.sShopData.iContentChecks_Vehicles+iContentChecks_HangarVehicles+iContentChecks_MarinaVehicles+iContentChecks_HeliVehicles) = 1
IF NOT NETWORK_IS_GAME_IN_PROGRESS()
IF iDLCGarageVehicles = 1
tlContentLabel = "CONT_NEW_V" //A new vehicle has been added to your Garage property.
ELIF iDLCHangarVehicles = 1
tlContentLabel = "CONT_NEW_VH" //A new vehicle has been added to your Hangar property.
ELIF iDLCMarinaVehicles = 1
tlContentLabel = "CONT_NEW_VM" //A new vehicle has been added to your Marina property.
ELIF iDLCHeliVehicles = 1
tlContentLabel = "CONT_NEW_VC" //A new vehicle has been added to your Helipad property.
ELSE
SCRIPT_ASSERT("invalid vehicle content check!!!")
tlContentLabel = "CONT_NEW_V" //A new vehicle has been added to your Garage property.
ENDIF
ELSE
tlContentLabel = "CONTENT_NEW_VW1" //A new vehicle has been added for purchase from the Travel and Transport websites.
ENDIF
ELSE
IF NOT NETWORK_IS_GAME_IN_PROGRESS()
tlContentLabel = "CONT_NEW_V"
IF (iDLCGarageVehicles) > g_savedGlobals.sShopData.iContentChecks_Vehicles
tlContentLabel += "G"
ENDIF
IF (iDLCHangarVehicles) > iContentChecks_HangarVehicles
tlContentLabel += "H"
ENDIF
IF (iDLCMarinaVehicles) > iContentChecks_MarinaVehicles
tlContentLabel += "M"
ENDIF
IF (iDLCHeliVehicles) > iContentChecks_HeliVehicles
tlContentLabel += "C"
ENDIF
tlContentLabel += "1"
ELSE
tlContentLabel = "CONTENT_NEW_VW2" //New vehicles have been added for purchase from the Travel and Transport websites.
ENDIF
ENDIF
CPRINTLN(DEBUG_AMBIENT, "DO_NEW_CONTENT_CHECKS//Vehicles - tlContentLabel: \"", tlContentLabel, "\"")
g_savedGlobals.sShopData.iContentChecks_Vehicles = iDLCGarageVehicles
STAT_SET_INT(CONTENT_HANGER_VEH, iDLCHangarVehicles)
STAT_SET_INT(CONTENT_MARINA_VEH, iDLCMarinaVehicles)
STAT_SET_INT(CONTENT_HELI_VEH, iDLCHeliVehicles)
//Fix for 2819142: Disabling vehicle content checks.
bDisplayContentFeedMessage = FALSE
MAKE_AUTOSAVE_REQUEST()
ELIF (iDLCGarageVehicles+iDLCHangarVehicles+iDLCMarinaVehicles+iDLCHeliVehicles) < g_savedGlobals.sShopData.iContentChecks_Vehicles+iContentChecks_HangarVehicles+iContentChecks_MarinaVehicles+iContentChecks_HeliVehicles
CPRINTLN(DEBUG_AMBIENT, "DO_NEW_CONTENT_CHECKS//Vehicles - tlContentLabel: not used")
g_savedGlobals.sShopData.iContentChecks_Vehicles = iDLCGarageVehicles
STAT_SET_INT(CONTENT_HANGER_VEH, iDLCHangarVehicles)
STAT_SET_INT(CONTENT_MARINA_VEH, iDLCMarinaVehicles)
STAT_SET_INT(CONTENT_HELI_VEH, iDLCHeliVehicles)
MAKE_AUTOSAVE_REQUEST()
ELSE
CDEBUG3LN(DEBUG_AMBIENT, "DO_NEW_CONTENT_CHECKS//Vehicles - saved and current stats are equal")
ENDIF
#IF IS_DEBUG_BUILD
#IF SCRIPT_PROFILER_ACTIVE
ADD_SCRIPT_PROFILE_MARKER("DO_NEW_CONTENT_CHECKS SWITCH iContentCheckStage iCONTENT_CHECK_5_VEHICLES")
#ENDIF
#ENDIF
SET_BIT(iCacheShopData, CACHE_SHOP_VEHICLE_DATA_BS)
PRINTLN("DO_NEW_CONTENT_CHECKS CACHE_SHOP_VEHICLE_DATA_BS TRUE")
ENDIF
BREAK
CASE iCONTENT_CHECK_6_CLOTHES // Clothes
IF NOT IS_BIT_SET(iCacheShopData, CACHE_SHOP_CLOTHES_DATA_BS)
INIT_SHOP_PED_COMPONENT(componentItem)
iDLCTops = 0
iDLCItem = 0
iPed = ENUM_TO_INT(GET_CURRENT_PLAYER_PED_ENUM())
iDLCClothes = SETUP_SHOP_PED_APPAREL_QUERY(iPed, 0, 11, ENUM_TO_INT(SHOP_PED_COMPONENT))
REPEAT iDLCClothes iDLCItem
GET_SHOP_PED_QUERY_COMPONENT(iDLCItem, componentItem)
IF NOT IS_CONTENT_ITEM_LOCKED(componentItem.m_lockHash)
IF componentItem.m_eCompType = ENUM_TO_INT(PED_COMP_TORSO)
iDLCTops++
ENDIF
ENDIF
ENDREPEAT
IF iDLCTops > g_savedGlobals.sShopData.iContentChecks_Clothes
g_savedGlobals.sShopData.iContentChecks_Clothes = iDLCTops
tlContentLabel = "CONTENT_NEW_C"
#IF IS_NEXTGEN_BUILD
bDisplayContentFeedMessage = TRUE
#ENDIF
ENDIF
#IF IS_DEBUG_BUILD
#IF SCRIPT_PROFILER_ACTIVE
ADD_SCRIPT_PROFILE_MARKER("DO_NEW_CONTENT_CHECKS SWITCH iContentCheckStage iCONTENT_CHECK_6_CLOTHES")
#ENDIF
#ENDIF
SET_BIT(iCacheShopData, CACHE_SHOP_CLOTHES_DATA_BS)
PRINTLN("DO_NEW_CONTENT_CHECKS CACHE_SHOP_CLOTHES_DATA_BS TRUE")
ENDIF
BREAK
CASE iCONTENT_CHECK_7_HAIRDOS // Hairdos
IF NOT IS_BIT_SET(iCacheShopData, CACHE_SHOP_HAIRD_DATA_BS)
INIT_SHOP_PED_COMPONENT(componentItem)
iDLCHairdo = 0
iDLCItem = 0
iPed = ENUM_TO_INT(GET_CURRENT_PLAYER_PED_ENUM())
iDLCClothes = SETUP_SHOP_PED_APPAREL_QUERY(iPed, 0, 11, ENUM_TO_INT(SHOP_PED_COMPONENT))
REPEAT iDLCClothes iDLCItem
GET_SHOP_PED_QUERY_COMPONENT(iDLCItem, componentItem)
IF NOT IS_CONTENT_ITEM_LOCKED(componentItem.m_lockHash)
IF componentItem.m_eCompType = ENUM_TO_INT(PED_COMP_HAIR)
iDLCHairdo++
ENDIF
ENDIF
ENDREPEAT
IF iDLCHairdo > g_savedGlobals.sShopData.iContentChecks_Hairdos
g_savedGlobals.sShopData.iContentChecks_Hairdos = iDLCHairdo
tlContentLabel = "CONTENT_NEW_H"
#IF IS_NEXTGEN_BUILD
bDisplayContentFeedMessage = TRUE
#ENDIF
ENDIF
#IF IS_DEBUG_BUILD
#IF SCRIPT_PROFILER_ACTIVE
ADD_SCRIPT_PROFILE_MARKER("DO_NEW_CONTENT_CHECKS SWITCH iContentCheckStage iCONTENT_CHECK_7_HAIRDOS")
#ENDIF
#ENDIF
SET_BIT(iCacheShopData, CACHE_SHOP_HAIRD_DATA_BS)
PRINTLN("DO_NEW_CONTENT_CHECKS CACHE_SHOP_HAIRD_DATA_BS TRUE")
ENDIF
BREAK
CASE iCONTENT_CHECK_8_TATTOOS // Tattoos
IF NOT IS_BIT_SET(iCacheShopData, CACHE_SHOP_TATTOO_DATA_BS)
SWITCH GET_CURRENT_PLAYER_PED_ENUM()
CASE CHAR_MICHAEL
// Test
IF NOT IS_BIT_SET(g_savedGlobals.sShopData.iContentChecks_Tattoos, 0)
TATTOO_DATA_STRUCT sTattooData
IF GET_TATTOO_DATA(sTattooData, TATTOO_SP_MICHAEL_DLC, TATTOO_SP_MICHAEL, PLAYER_PED_ID())
SETUP_CONTENT_CHANGE_WITH_BIT_FLAG(g_savedGlobals.sShopData.iContentChecks_Tattoos, 0, "CONTENT_NEW_T")
ENDIF
ENDIF
BREAK
CASE CHAR_FRANKLIN
// Test
IF NOT IS_BIT_SET(g_savedGlobals.sShopData.iContentChecks_Tattoos, 1)
TATTOO_DATA_STRUCT sTattooData
IF GET_TATTOO_DATA(sTattooData, TATTOO_SP_FRANKLIN_DLC, TATTOO_SP_FRANKLIN, PLAYER_PED_ID())
SETUP_CONTENT_CHANGE_WITH_BIT_FLAG(g_savedGlobals.sShopData.iContentChecks_Tattoos, 1, "CONTENT_NEW_T")
ENDIF
ENDIF
BREAK
CASE CHAR_TREVOR
// Test
IF NOT IS_BIT_SET(g_savedGlobals.sShopData.iContentChecks_Tattoos, 2)
TATTOO_DATA_STRUCT sTattooData
IF GET_TATTOO_DATA(sTattooData, TATTOO_SP_TREVOR_DLC, TATTOO_SP_TREVOR, PLAYER_PED_ID())
SETUP_CONTENT_CHANGE_WITH_BIT_FLAG(g_savedGlobals.sShopData.iContentChecks_Tattoos, 2, "CONTENT_NEW_T")
ENDIF
ENDIF
BREAK
ENDSWITCH
#IF IS_DEBUG_BUILD
#IF SCRIPT_PROFILER_ACTIVE
ADD_SCRIPT_PROFILE_MARKER("DO_NEW_CONTENT_CHECKS SWITCH iContentCheckStage iCONTENT_CHECK_8_TATTOOS")
#ENDIF
#ENDIF
SET_BIT(iCacheShopData, CACHE_SHOP_TATTOO_DATA_BS)
PRINTLN("DO_NEW_CONTENT_CHECKS CACHE_SHOP_TATTOO_DATA_BS TRUE")
ENDIF
BREAK
CASE iCONTENT_CHECK_9_STUNT_PLANES // Stunt Planes minigame
IF NOT GET_MISSION_FLOW_BITSET_BIT_STATE(FLOWBITSET_MINIGAME_ACTIVE, ENUM_TO_INT(MINIGAME_STUNT_PLANES))
IF IS_SPECIAL_EDITION_GAME()
OR IS_COLLECTORS_EDITION_GAME()
OR IS_JAPANESE_SPECIAL_EDITION_GAME()
IF GET_MISSION_COMPLETE_STATE(SP_MISSION_ARMENIAN_1)
Execute_Code_ID(CID_ACTIVATE_MINIGAME_STUNT_PLANES)
ENDIF
ENDIF
ENDIF
#IF IS_DEBUG_BUILD
#IF SCRIPT_PROFILER_ACTIVE
ADD_SCRIPT_PROFILE_MARKER("DO_NEW_CONTENT_CHECKS SWITCH iContentCheckStage iCONTENT_CHECK_9_STUNT_PLANES")
#ENDIF
#ENDIF
BREAK
CASE iCONTENT_CHECK_10_JAPANESE_SE // Japanese Special Edition
#IF IS_JAPANESE_BUILD
IF IS_JAPANESE_SPECIAL_EDITION_GAME()
//Display the special edition content unlock.
IF NOT IS_BIT_SET(g_savedGlobals.sShopData.iContentChecks_Game, NCU_SPECIAL_EDITION)
CPRINTLN(DEBUG_AMBIENT, "DO_NEW_CONTENT_CHECKS: Unlocking Special Edition")
SETUP_CONTENT_CHANGE_WITH_BIT_FLAG(g_savedGlobals.sShopData.iContentChecks_Game, NCU_SPECIAL_EDITION, "CONTENT_NEW_SE")
ENDIF
ENDIF
#ENDIF
#IF IS_DEBUG_BUILD
#IF SCRIPT_PROFILER_ACTIVE
ADD_SCRIPT_PROFILE_MARKER("DO_NEW_CONTENT_CHECKS SWITCH iContentCheckStage iCONTENT_CHECK_10_JAPANESE_SE")
#ENDIF
#ENDIF
BREAK
CASE iCONTENT_CHECK_12_NEXT_GEN_PREORDER // Next Gen Preorder
IF NOT IS_BIT_SET(g_savedGlobals.sShopData.iContentChecks_Game, NCU_NG_PREORDER)
IF IS_NEXT_GEN_PREORDER_GAME()
SETUP_CONTENT_CHANGE_WITH_BIT_FLAG(g_savedGlobals.sShopData.iContentChecks_Game, NCU_NG_PREORDER, "CONT_NG_PREOR")
Execute_Code_ID(CID_GIVE_NG_PREORDER_REWARD, 0)
iContentCheckTimer = GET_GAME_TIMER()
ENDIF
ENDIF
#IF IS_DEBUG_BUILD
#IF SCRIPT_PROFILER_ACTIVE
ADD_SCRIPT_PROFILE_MARKER("DO_NEW_CONTENT_CHECKS SWITCH iContentCheckStage iCONTENT_CHECK_12_NEXT_GEN_PREORDER")
#ENDIF
#ENDIF
BREAK
CASE iCONTENT_CHECK_13_CG_TO_NG // Current Gen to Next Gen player.
IF NOT IS_BIT_SET(g_savedGlobals.sShopData.iContentChecks_Game, NCU_CG_TO_NG)
IF IS_LAST_GEN_PLAYER()
// url:bugstar:7163505 - Gen9 - Players receive a ticker feed message about exclusive content for returning players although all CG to NG content will soon be unlocked by default for all Gen9 players.
//SETUP_CONTENT_CHANGE_WITH_BIT_FLAG(g_savedGlobals.sShopData.iContentChecks_Game, NCU_CG_TO_NG, "CONT_CG_TO_NG")
ENDIF
ENDIF
#IF IS_DEBUG_BUILD
#IF SCRIPT_PROFILER_ACTIVE
ADD_SCRIPT_PROFILE_MARKER("DO_NEW_CONTENT_CHECKS SWITCH iContentCheckStage iCONTENT_CHECK_13_CG_TO_NG")
#ENDIF
#ENDIF
BREAK
CASE iCONTENT_CHECK_14_HEISTS
IF NOT IS_BIT_SET(g_savedGlobals.sShopData.iContentChecks_Game, NCU_HEISTS)
IF IS_MP_HEIST_PACK_PRESENT()
SETUP_CONTENT_CHANGE_WITH_BIT_FLAG(g_savedGlobals.sShopData.iContentChecks_Game, NCU_HEISTS, "CONT_HEISTS")
ENDIF
ENDIF
#IF IS_DEBUG_BUILD
#IF SCRIPT_PROFILER_ACTIVE
ADD_SCRIPT_PROFILE_MARKER("DO_NEW_CONTENT_CHECKS SWITCH iContentCheckStage iCONTENT_CHECK_14_HEISTS")
#ENDIF
#ENDIF
BREAK
CASE iCONTENT_CHECK_CASH_GIFT
#IF IS_DEBUG_BUILD
IF g_b_IsFakePCGiftsWidgetActive = TRUE
BREAK
ENDIF
#ENDIF
IF g_i_SCAdminCashGiftScreenType > 0
BREAK
ENDIF
IF g_b_skipCashGiftMessage = FALSE
IF g_b_DoneScFeedCashGiftMessage = FALSE
PRINTLN("[GIFTTOOL] iCONTENT_CHECK_CASH_GIFT g_i_DoCashGiftMessageAmount = ", g_i_DoCashGiftMessageAmount)
PRINTLN("[GIFTTOOL] iCONTENT_CHECK_CASH_GIFT g_i_DoCashGiftACTUALAmount = ", g_i_DoCashGiftACTUALAmount)
IF g_i_DoCashGiftMessageAmount = 99 //Crazy Numbers
//Rockstar Game Services have corrected your GTA Dollars by $~1~.
tlContentLabel = "HUD_1_CASHGIFT"
iContentCheckStage = NCU_SOCIAL_CLUB
iContentTickerINT = g_i_DoCashGiftACTUALAmount
bDisplayContentFeedMessage = TRUE
g_b_skipCashGiftMessage = FALSE
PRINTLN("[GIFTTOOL] iCONTENT_CHECK_CASH_GIFT g_i_DoCashGiftMessageAmount = 99 reset everything")
g_b_DoneScFeedCashGiftMessage = TRUE
ELIF g_i_DoCashGiftMessageAmount = -99
//Rockstar Game Services have corrected your GTA Dollars.
tlContentLabel = "HUD_2_CASHGIFT"
iContentCheckStage = NCU_SOCIAL_CLUB
bDisplayContentFeedMessage = TRUE
g_b_skipCashGiftMessage = FALSE
PRINTLN("[GIFTTOOL] iCONTENT_CHECK_CASH_GIFT g_i_DoCashGiftACTUALAmount = -99 Display non numbered message")
g_b_DoneScFeedCashGiftMessage = TRUE
ELIF g_i_DoCashGiftMessageAmount > 0
//Rockstar Game Services have corrected your GTA Dollars by $~1~.
tlContentLabel = "HUD_1_CASHGIFT"
iContentCheckStage = NCU_SOCIAL_CLUB
iContentTickerINT = g_i_DoCashGiftACTUALAmount
bDisplayContentFeedMessage = TRUE
g_b_skipCashGiftMessage = FALSE
PRINTLN("[GIFTTOOL] iCONTENT_CHECK_CASH_GIFT g_i_DoCashGiftMessageAmount > 0 reset everything")
g_b_DoneScFeedCashGiftMessage = TRUE
ELIF g_i_DoCashGiftMessageAmount < 0
//Rockstar Game Services have corrected your GTA Dollars by -$~1~.
tlContentLabel = "HUD_1_CASHGIFTN"
iContentCheckStage = NCU_SOCIAL_CLUB
iContentTickerINT = g_i_DoCashGiftACTUALAmount
IF iContentTickerINT < 0
iContentTickerINT *= -1
ENDIF
bDisplayContentFeedMessage = TRUE
g_b_skipCashGiftMessage = FALSE
PRINTLN("[GIFTTOOL] iCONTENT_CHECK_CASH_GIFT g_i_DoCashGiftMessageAmount < 0 reset everything")
g_b_DoneScFeedCashGiftMessage = TRUE
ENDIF
ENDIF
ELSE
PRINTLN("[GIFTTOOL] iCONTENT_CHECK_CASH_GIFT g_b_skipCashGiftMessage = TRUE reset everything")
g_b_skipCashGiftMessage = FALSE
g_i_DoCashGiftMessageAmount = 0
g_i_DoCashGiftACTUALAmount = 0
ENDIF
#IF IS_DEBUG_BUILD
#IF SCRIPT_PROFILER_ACTIVE
ADD_SCRIPT_PROFILE_MARKER("DO_NEW_CONTENT_CHECKS SWITCH iContentCheckStage iCONTENT_CHECK_CASH_GIFT")
#ENDIF
#ENDIF
BREAK
CASE iMAX_LAST_ITEMS
iContentCheckStage = iCONTENT_CHECK_0_SPECIAL_EDITION
#IF IS_DEBUG_BUILD
#IF SCRIPT_PROFILER_ACTIVE
ADD_SCRIPT_PROFILE_MARKER("DO_NEW_CONTENT_CHECKS SWITCH iContentCheckStage iMAX_LAST_ITEMS")
#ENDIF
#ENDIF
EXIT
BREAK
ENDSWITCH
IF bDisplayContentFeedMessage
IF (iContentCheckStage = NCU_SOCIAL_CLUB)
// BEGIN_TEXT_COMMAND_THEFEED_POST("MARSTON_TICK") //Social Club ~n~~a~
// ADD_TEXT_COMPONENT_SUBSTRING_TEXT_LABEL(tlContentLabel)
// END_TEXT_COMMAND_THEFEED_POST_MESSAGETEXT("CHAR_SOCIAL_CLUB", "CHAR_SOCIAL_CLUB", FALSE, TEXT_ICON_BLANK, "")
IF iContentTickerINT = 0
BEGIN_TEXT_COMMAND_THEFEED_POST(tlContentLabel)
END_TEXT_COMMAND_THEFEED_POST_MESSAGETEXT("CHAR_SOCIAL_CLUB", "CHAR_SOCIAL_CLUB", FALSE, TEXT_ICON_BLANK, "CONTENT_TICK")
ELSE
BEGIN_TEXT_COMMAND_THEFEED_POST(tlContentLabel)
ADD_TEXT_COMPONENT_INTEGER(iContentTickerINT)
END_TEXT_COMMAND_THEFEED_POST_MESSAGETEXT("CHAR_SOCIAL_CLUB", "CHAR_SOCIAL_CLUB", FALSE, TEXT_ICON_BLANK, "CONTENT_TICK")
ENDIF
ELSE
BEGIN_TEXT_COMMAND_THEFEED_POST(tlContentLabel)
END_TEXT_COMMAND_THEFEED_POST_TICKER(FALSE)
ENDIF
bDisplayContentFeedMessage = FALSE
#IF IS_DEBUG_BUILD
#IF SCRIPT_PROFILER_ACTIVE
ADD_SCRIPT_PROFILE_MARKER("DO_NEW_CONTENT_CHECKS SWITCH 2")
#ENDIF
#ENDIF
ENDIF
iContentCheckStage++
ENDIF
ENDIF
ENDPROC
SCRIPT
PRINTSTRING("\nStarting player controller")PRINTNL()
// This script needs to cleanup only when the game moves from SP to MP
IF (HAS_FORCE_CLEANUP_OCCURRED(FORCE_CLEANUP_FLAG_SP_TO_MP))
PRINTSTRING("...player_controller.sc has been forced to cleanup (SP to MP)")
PRINTNL()
Script_Cleanup()
ENDIF
// Setup some debug widgets
#IF IS_DEBUG_BUILD
SETUP_PLAYER_CONTROL_DEBUG_WIDGETS()
#ENDIF
DO_INITIAL_CONTENT_CHECKS()
#IF FEATURE_SP_DLC_BEAST_SECRET
#IF NOT FEATURE_SP_DLC_BEAST_SECRET_DEBUG
Reset_Beast_Hunt_Variables(sBeastHuntVars)
//No longer creating Beast Hunt widgets here, this is managed by Update_Widgets
#ENDIF
#ENDIF
WHILE (TRUE)
#IF IS_DEBUG_BUILD
MAINTAIN_PLAYER_CONTROL_DEBUG_WIDGETS()
#IF SCRIPT_PROFILER_ACTIVE
SCRIPT_PROFILER_START_OF_FRAME()
#ENDIF
#ENDIF
// This MUST be called each frame.
SWITCH eStage
// Set any defaults and make sure we are a valid character
CASE PC_STAGE_INIT
INITIALISE_PLAYER_PED_STATE()
BREAK
// The main control logic takes place here
CASE PC_STAGE_WAIT
// CHECK_PLAYER_PED_REQUEST()
MONITOR_PLAYER_CUTSCENE_ENTITIES()
IF NOT g_bMagDemoActive
MONITOR_AMBIENT_PLAYER_CHARS()
MONITOR_STORED_PLAYER_VEHICLES()
MONITOR_AVAILABLE_PLAYER_MISSIONS()
MONITOR_PLAYER_WANTED_RELATIONSHIPS()
ENDIF
// Moved this block of calls to the wait stage as we were hitting
// the instruction limit per frame assert.
BREAK
// // Switching to another ped
// CASE PC_STAGE_SWITCH
// MAINTAIN_PLAYER_PED_REQUEST()
// BREAK
//
// CASE PC_STAGE_END
// // Perform any cleanup routines here
// // - Save player data
// BREAK
ENDSWITCH
#IF IS_DEBUG_BUILD
#IF SCRIPT_PROFILER_ACTIVE
ADD_SCRIPT_PROFILE_MARKER("SWITCH eStage")
#ENDIF
#ENDIF
//Purposefully "hidden" in amongst this script. We want it to be hard
//for hackers to spot these scripts in decompiled output. -BenR
#IF FEATURE_SP_DLC_BEAST_SECRET
#IF NOT FEATURE_SP_DLC_BEAST_SECRET_DEBUG
Maintain_Beast_Hunt(sBeastHuntVars)
#IF IS_DEBUG_BUILD
#IF SCRIPT_PROFILER_ACTIVE
ADD_SCRIPT_PROFILE_MARKER("Maintain_Beast_Hunt")
#ENDIF
Update_Beast_Hunt_Widgets(sBeastHuntVars, widgetID)
#IF SCRIPT_PROFILER_ACTIVE
ADD_SCRIPT_PROFILE_MARKER("Update_Beast_Hunt_Widgets")
#ENDIF
#ENDIF
#ENDIF
#ENDIF
HANDLE_END_OF_MISSION_MARTIN_1()
#IF IS_DEBUG_BUILD
#IF SCRIPT_PROFILER_ACTIVE
ADD_SCRIPT_PROFILE_MARKER("HANDLE_END_OF_MISSION_MARTIN_1")
#ENDIF
#ENDIF
CHECK_FOR_TREVOR_AS_DOCK_WORKER_FOR_AUTODOORS()
#IF IS_DEBUG_BUILD
#IF SCRIPT_PROFILER_ACTIVE
ADD_SCRIPT_PROFILE_MARKER("CHECK_FOR_TREVOR_AS_DOCK_WORKER_FOR_AUTODOORS")
#ENDIF
#ENDIF
DO_NEW_CONTENT_CHECKS()
#IF IS_DEBUG_BUILD
#IF SCRIPT_PROFILER_ACTIVE
ADD_SCRIPT_PROFILE_MARKER("DO_NEW_CONTENT_CHECKS")
#ENDIF
#ENDIF
CHECK_CONTROLLER_RESET()
#IF IS_DEBUG_BUILD
#IF SCRIPT_PROFILER_ACTIVE
ADD_SCRIPT_PROFILE_MARKER("CHECK_CONTROLLER_RESET")
#ENDIF
#ENDIF
// See if we need to set up the defaul clothes info
IF g_savedGlobals.sPlayerData.sInfo.bDefaultClothesInfoSet = FALSE
SETUP_DEFAULT_PLAYER_CLOTHES_INFO()
ENDIF
#IF IS_DEBUG_BUILD
#IF SCRIPT_PROFILER_ACTIVE
SCRIPT_PROFILER_END_OF_FRAME()
#ENDIF
#ENDIF
WAIT(0)
ENDWHILE
ENDSCRIPT