Files
gtav-src/script/dev_ng/singleplayer/include/public/player_ped_public.sch
T
2025-09-29 00:52:08 +02:00

14943 lines
632 KiB
Scheme
Executable File

//////////////////////////////////////////////////////////////////////////////////////////
// //
// SCRIPT NAME : player_ped_public.sc //
// AUTHOR : Kenneth Ross //
// DESCRIPTION : Handles all the player character related procs. //
// //
//////////////////////////////////////////////////////////////////////////////////////////
USING "rage_builtins.sch"
USING "globals.sch"
USING "script_clock.sch"
USING "script_DEBUG.sch"
USING "script_network.sch"
USING "commands_clock.sch"
USING "commands_streaming.sch"
USING "commands_cutscene.sch"
USING "player_ped_data.sch"
USING "tattoo_private.sch"
USING "automatic_door_public.sch"
USING "vehicle_public.sch"
USING "flow_help_public.sch"
USING "player_scene_post_mission.sch"
USING "social_public.sch"
USING "candidate_public.sch"
USING "net_player_headshots.sch"
USING "mission_repeat_public.sch"
#if USE_CLF_DLC
USING "static_mission_data_helpCLF.sch"
#endif
#if USE_NRM_DLC
USING "static_mission_data_helpNRM.sch"
#endif
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// WARDROBE DATA ///
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
FUNC VECTOR GET_PLAYER_PED_WARDROBE_COORDS(PLAYER_WARDROBE_ENUM eWardrobe)
SWITCH eWardrobe
CASE PW_MICHAEL_MANSION RETURN <<-811.8961, 175.2218, 76.7308>> BREAK
CASE PW_MICHAEL_COUNTRYSIDE RETURN << 1969.4883, 3815.0303, 33.4337 >> BREAK
CASE PW_TREVOR_COUNTRYSIDE RETURN << 1969.4883, 3815.0303, 33.4337 >> BREAK
CASE PW_TREVOR_CITY RETURN << -1150.4913, -1513.3470, 10.6394 >> BREAK
CASE PW_TREVOR_STRIPCLUB RETURN <<105.3011, -1303.3383, 27.7688>> BREAK
CASE PW_FRANKLIN_AUNTS RETURN << -17.9973, -1438.9110, 31.1065 >> BREAK
CASE PW_FRANKLIN_HILLS RETURN << 9.0157, 528.7267, 170.6221 >> BREAK
//B*1550550 this is now set for all freemode its only used for the low end to check if the player is facing the wardrobe.
CASE PW_FREEMODE RETURN <<259.791, -1004.398, -100.004>> BREAK
ENDSWITCH
RETURN <<0,0,0>>
ENDFUNC
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// PLAYER PED DATA ///
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#IF IS_DEBUG_BUILD
/// PURPOSE: Gets the STRING value of the specified ped - debug use.
FUNC STRING GET_PLAYER_PED_STRING(enumCharacterList ePed)
SWITCH ePed
CASE CHAR_MICHAEL RETURN "CHAR_MICHAEL" BREAK
CASE CHAR_TREVOR RETURN "CHAR_TREVOR" BREAK
CASE CHAR_FRANKLIN RETURN "CHAR_FRANKLIN" BREAK
CASE CHAR_LESTER RETURN "CHAR_LESTER" BREAK
CASE CHAR_ALL_PLAYERS_CONF RETURN "CHAR_ALL_PLAYERS_CONF" BREAK
CASE CHAR_FRANK_TREV_CONF RETURN "CHAR_FRANK_TREV_CONF" BREAK
CASE CHAR_MIKE_FRANK_CONF RETURN "CHAR_MIKE_FRANK_CONF" BREAK
CASE CHAR_MIKE_TREV_CONF RETURN "CHAR_MIKE_TREV_CONF" BREAK
CASE CHAR_STEVE_MIKE_CONF RETURN "CHAR_STEVE_MIKE_CONF" BREAK
CASE CHAR_STEVE_TREV_CONF RETURN "CHAR_STEVE_TREV_CONF" BREAK
CASE CHAR_JIMMY RETURN "CHAR_JIMMY" BREAK
CASE CHAR_TRACEY RETURN "CHAR_TRACEY" BREAK
CASE CHAR_AMANDA RETURN "CHAR_AMANDA" BREAK
CASE CHAR_SIMEON RETURN "CHAR_SIMEON" BREAK
CASE CHAR_LAMAR RETURN "CHAR_LAMAR" BREAK
CASE CHAR_RON RETURN "CHAR_RON" BREAK
CASE CHAR_CHENG RETURN "CHAR_CHENG" BREAK
CASE CHAR_STEVE RETURN "CHAR_STEVE" BREAK
CASE CHAR_WADE RETURN "CHAR_WADE" BREAK
CASE CHAR_TENNIS_COACH RETURN "CHAR_TENNIS_COACH" BREAK
CASE CHAR_SOLOMON RETURN "CHAR_SOLOMON" BREAK
CASE CHAR_LAZLOW RETURN "CHAR_LAZLOW" BREAK
CASE CHAR_ESTATE_AGENT RETURN "CHAR_ESTATE_AGENT" BREAK
CASE CHAR_DEVIN RETURN "CHAR_DEVIN" BREAK
CASE CHAR_DAVE RETURN "CHAR_DAVE" BREAK
CASE CHAR_MARTIN RETURN "CHAR_MARTIN" BREAK
CASE CHAR_FLOYD RETURN "CHAR_FLOYD" BREAK
CASE CHAR_BARRY RETURN "CHAR_BARRY" BREAK
CASE CHAR_BEVERLY RETURN "CHAR_BEVERLY" BREAK
CASE CHAR_CRIS RETURN "CHAR_CRIS" BREAK
CASE CHAR_DOM RETURN "CHAR_DOM" BREAK
CASE CHAR_HAO RETURN "CHAR_HAO" BREAK
CASE CHAR_HUNTER RETURN "CHAR_HUNTER" BREAK
CASE CHAR_JIMMY_BOSTON RETURN "CHAR_JIMMY_BOSTON" BREAK
CASE CHAR_JOE RETURN "CHAR_JOE" BREAK
CASE CHAR_JOSEF RETURN "CHAR_JOSEF" BREAK
CASE CHAR_JOSH RETURN "CHAR_JOSH" BREAK
CASE CHAR_MANUEL RETURN "CHAR_MANUEL" BREAK
CASE CHAR_MARNIE RETURN "CHAR_MARNIE" BREAK
CASE CHAR_MARY_ANN RETURN "CHAR_MARY_ANN" BREAK
CASE CHAR_MAUDE RETURN "CHAR_MAUDE" BREAK
CASE CHAR_MRS_THORNHILL RETURN "CHAR_MRS_THORNHILL" BREAK
CASE CHAR_NIGEL RETURN "CHAR_NIGEL" BREAK
CASE CHAR_SASQUATCH RETURN "CHAR_SASQUATCH" BREAK
CASE CHAR_ONEIL RETURN "CHAR_ONEIL" BREAK
CASE CHAR_STRIPPER_JULIET RETURN "CHAR_STRIPPER_JULIET" BREAK
CASE CHAR_STRIPPER_NIKKI RETURN "CHAR_STRIPPER_NIKKI" BREAK
CASE CHAR_STRIPPER_CHASTITY RETURN "CHAR_STRIPPER_CHASTITY" BREAK
CASE CHAR_STRIPPER_CHEETAH RETURN "CHAR_STRIPPER_CHEETAH" BREAK
CASE CHAR_STRIPPER_SAPPHIRE RETURN "CHAR_STRIPPER_SAPPHIRE" BREAK
CASE CHAR_STRIPPER_INFERNUS RETURN "CHAR_STRIPPER_INFERNUS" BREAK
CASE CHAR_STRIPPER_FUFU RETURN "CHAR_STRIPPER_FUFU" BREAK
CASE CHAR_STRIPPER_PEACH RETURN "CHAR_STRIPPER_PEACH" BREAK
CASE CHAR_DETONATEBOMB RETURN "CHAR_DETONATEBOMB" BREAK
CASE CHAR_CALL911 RETURN "CHAR_CALL911" BREAK
CASE CHAR_CASTRO RETURN "CHAR_CASTRO" BREAK
CASE CHAR_ARTHUR RETURN "CHAR_ARTHUR" BREAK
CASE CHAR_DOMESTIC_GIRL RETURN "CHAR_DOMESTIC_GIRL" BREAK
CASE CHAR_HITCHER_GIRL RETURN "CHAR_HITCHER_GIRL" BREAK
CASE CHAR_SOCIAL_CLUB RETURN "CHAR_SOCIAL_CLUB" BREAK
CASE CHAR_MECHANIC RETURN "CHAR_MECHANIC" BREAK
CASE CHAR_MULTIPLAYER RETURN "CHAR_MULTIPLAYER" BREAK
CASE NO_CHARACTER RETURN "NO_CHARACTER" BREAK
ENDSWITCH
RETURN "PED_STRING_MISSING"
ENDFUNC
#ENDIF
/// PURPOSE: Returns TRUE if the specified ped enum is one of the playable characters.
FUNC BOOL IS_PLAYER_PED_PLAYABLE(enumCharacterList ePed)
RETURN (ENUM_TO_INT(ePed) < NUM_OF_PLAYABLE_PEDS)
ENDFUNC
/// PURPOSE: Returns TRUE if the specified ped enum is one of the playable characters.
FUNC BOOL IS_PLAYER_MODEL_PLAYABLE(MODEL_NAMES eModel)
IF eModel = PLAYER_ZERO
OR eModel = PLAYER_ONE
OR eModel = PLAYER_TWO
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE: Returns the model enum for the specified player character
FUNC MODEL_NAMES GET_PLAYER_PED_MODELCLF(enumCharacterList ePed)
IF IS_PLAYER_PED_PLAYABLE(ePed)
RETURN g_savedGlobalsClifford.sCharSheetData.g_CharacterSheet[ePed].game_model
ELSE
IF ePed <> NO_CHARACTER
#IF IS_DEBUG_BUILD
SCRIPT_ASSERT("GET_PLAYER_PED_MODELCLF - Ped is not a player character.")
PRINTSTRING("\nGET_PLAYER_PED_MODELCLF - Ped is not a player character.")PRINTNL()
#ENDIF
ENDIF
ENDIF
RETURN DUMMY_MODEL_FOR_SCRIPT
ENDFUNC
/// PURPOSE: Returns the model enum for the specified player character
FUNC MODEL_NAMES GET_PLAYER_PED_MODELNRM(enumCharacterList ePed)
IF IS_PLAYER_PED_PLAYABLE(ePed)
RETURN g_savedGlobalsnorman.sCharSheetData.g_CharacterSheet[ePed].game_model
ELSE
IF ePed <> NO_CHARACTER
#IF IS_DEBUG_BUILD
SCRIPT_ASSERT("GET_PLAYER_PED_MODELNRM - Ped is not a player character.")
PRINTSTRING("\GET_PLAYER_PED_MODELNRM - Ped is not a player character.")PRINTNL()
#ENDIF
ENDIF
ENDIF
RETURN DUMMY_MODEL_FOR_SCRIPT
ENDFUNC
/// PURPOSE: Returns the model enum for the specified player character
FUNC MODEL_NAMES GET_PLAYER_PED_MODEL(enumCharacterList ePed)
#if USE_CLF_DLC
if g_bLoadedClifford
RETURN GET_PLAYER_PED_MODELCLF(eped)
endif
#endif
#if USE_NRM_DLC
if g_bLoadedNorman
RETURN GET_PLAYER_PED_MODELNRM(eped)
endif
#endif
IF IS_PLAYER_PED_PLAYABLE(ePed)
RETURN GLOBAL_CHARACTER_SHEET_GET_GAME_MODEL(ePed)
ELSE
IF ePed <> NO_CHARACTER
#IF IS_DEBUG_BUILD
SCRIPT_ASSERT("GET_PLAYER_PED_MODEL - Ped is not a player character.")
PRINTSTRING("\nGET_PLAYER_PED_MODEL - Ped is not a player character.")PRINTNL()
#ENDIF
ENDIF
ENDIF
RETURN DUMMY_MODEL_FOR_SCRIPT
ENDFUNC
/// PURPOSE: Returns the player ped enum based on the specified peds model
FUNC enumCharacterList GET_PLAYER_PED_ENUMCLF(PED_INDEX ped)
IF DOES_ENTITY_EXIST(ped)
INT i
MODEL_NAMES ePedModel = GET_ENTITY_MODEL(ped)
FOR i = 0 TO NUM_OF_PLAYABLE_PEDS-1
IF GET_PLAYER_PED_MODELCLF(INT_TO_ENUM(enumCharacterList, i)) = ePedModel
RETURN (INT_TO_ENUM(enumCharacterList, i))
ENDIF
ENDFOR
ENDIF
RETURN NO_CHARACTER
ENDFUNC
FUNC enumCharacterList GET_PLAYER_PED_ENUMNRM(PED_INDEX ped)
IF DOES_ENTITY_EXIST(ped)
INT i
MODEL_NAMES ePedModel = GET_ENTITY_MODEL(ped)
FOR i = 0 TO NUM_OF_PLAYABLE_PEDS-1
IF GET_PLAYER_PED_MODELNRM(INT_TO_ENUM(enumCharacterList, i)) = ePedModel
RETURN (INT_TO_ENUM(enumCharacterList, i))
ENDIF
ENDFOR
ENDIF
RETURN NO_CHARACTER
ENDFUNC
FUNC enumCharacterList GET_PLAYER_PED_ENUM(PED_INDEX ped)
#if USE_CLF_DLC
if g_bLoadedClifford
return GET_PLAYER_PED_ENUMCLF(ped)
endif
#endif
#if USE_NRM_DLC
if g_bLoadedNorman
return GET_PLAYER_PED_ENUMNRM(ped)
endif
#endif
IF DOES_ENTITY_EXIST(ped)
INT i
MODEL_NAMES ePedModel = GET_ENTITY_MODEL(ped)
FOR i = 0 TO NUM_OF_PLAYABLE_PEDS-1
IF GET_PLAYER_PED_MODEL(INT_TO_ENUM(enumCharacterList, i)) = ePedModel
RETURN (INT_TO_ENUM(enumCharacterList, i))
ENDIF
ENDFOR
ENDIF
RETURN NO_CHARACTER
ENDFUNC
/// PURPOSE:
/// Returns the info needed to store this current variation.
/// If this item shouldn't be stored, it returns the info for blank version.
/// e.g. Parachute should be ignored, so we return the info for "no special component"
/// PARAMS:
/// mPed - the ped we are storing variations for
/// ePedComponent - component we are storing
/// iDrawable - where to store the drawable info
/// iTexture - where to store the texture info
/// iPalette - where to store the palette info
PROC GET_VARIATION_TO_STORE(PED_INDEX mPed, PED_COMPONENT ePedComponent, INT &iDrawable, INT &iTexture, INT &iPalette, COMPONENT_BLOCK_FLAGS eCompBlocks = CBF_DEFAULT, enumCharacterList ePedOverride = NO_CHARACTER)
enumCharacterList eChar = GET_PLAYER_PED_ENUM(mPed)
// get current item info- will overwrite if this item needs to be ignored
IF mPed != NULL // skip over when null, used for cutscene variation setup (Kenneth)
iDrawable = GET_PED_DRAWABLE_VARIATION(mPed, ePedComponent)
iTexture = GET_PED_TEXTURE_VARIATION(mPed, ePedComponent)
iPalette = GET_PED_PALETTE_VARIATION(mPed, ePedComponent)
ELSE
eChar = ePedOverride
ENDIF
IF eCompBlocks = CBF_NONE
EXIT
ENDIF
SWITCH eChar
CASE CHAR_MICHAEL
IF ePedComponent = PED_COMP_SPECIAL
// Parachute- return No Special
IF (eCompBlocks & CBF_DEFAULT) != CBF_NONE
OR (eCompBlocks & CBF_ALL) != CBF_NONE
OR (eCompBlocks & CBF_PARACHUTES) != CBF_NONE
IF iDrawable = 15
CPRINTLN(DEBUG_PED_COMP, "Parachute equipped: storing No Special instead.")
iDrawable = 0
iTexture = 0
ENDIF
ENDIF
// Scuba tank - return No Special
IF (eCompBlocks & CBF_ALL) != CBF_NONE
OR (eCompBlocks & CBF_SCUBA) != CBF_NONE
IF iDrawable = 3
OR iDrawable = 22
CPRINTLN(DEBUG_PED_COMP, "Scuba tank: storing No Special instead.")
iDrawable = 0
iTexture = 0
ENDIF
ENDIF
ELIF ePedComponent = PED_COMP_SPECIAL2
// Parachute- return No Special
IF (eCompBlocks & CBF_DEFAULT) != CBF_NONE
OR (eCompBlocks & CBF_ALL) != CBF_NONE
OR (eCompBlocks & CBF_PARACHUTES) != CBF_NONE
IF iDrawable = 5
CPRINTLN(DEBUG_PED_COMP, "Parachute equipped: storing No Special2 instead.")
iDrawable = 0
iTexture = 0
ENDIF
ENDIF
// Masks - return No Special 2
IF (eCompBlocks & CBF_ALL) != CBF_NONE
OR (eCompBlocks & CBF_MASKS) != CBF_NONE
IF iDrawable = 8
CPRINTLN(DEBUG_PED_COMP, "Mask equipped: storing No Special2 instead.")
iDrawable = 0
iTexture = 0
ENDIF
ENDIF
ENDIF
BREAK
CASE CHAR_FRANKLIN
IF ePedComponent = PED_COMP_SPECIAL
// Parachute- return No Special
IF (eCompBlocks & CBF_DEFAULT) != CBF_NONE
OR (eCompBlocks & CBF_ALL) != CBF_NONE
OR (eCompBlocks & CBF_PARACHUTES) != CBF_NONE
IF iDrawable = 1
OR iDrawable = 10
CPRINTLN(DEBUG_PED_COMP, "Parachute equipped: storing No Special instead.")
iDrawable = 14
iTexture = 0
ENDIF
ENDIF
// Scuba tank - return No Special
IF (eCompBlocks & CBF_ALL) != CBF_NONE
OR (eCompBlocks & CBF_SCUBA) != CBF_NONE
IF iDrawable = 19
CPRINTLN(DEBUG_PED_COMP, "Scuba tank: storing No Special instead.")
iDrawable = 14
iTexture = 0
ENDIF
ENDIF
ELIF ePedComponent = PED_COMP_SPECIAL2
// Masks - return No Special 2
IF (eCompBlocks & CBF_ALL) != CBF_NONE
OR (eCompBlocks & CBF_MASKS) != CBF_NONE
IF iDrawable = 5
CPRINTLN(DEBUG_PED_COMP, "Mask equipped: storing No Special2 instead.")
iDrawable = 0
iTexture = 0
ENDIF
ENDIF
ENDIF
BREAK
CASE CHAR_TREVOR
IF ePedComponent = PED_COMP_SPECIAL
// Parachute- return No Special
IF (eCompBlocks & CBF_DEFAULT) != CBF_NONE
OR (eCompBlocks & CBF_ALL) != CBF_NONE
OR (eCompBlocks & CBF_PARACHUTES) != CBF_NONE
IF iDrawable = 3
CPRINTLN(DEBUG_PED_COMP, "Parachute equipped: storing No Special instead.")
iDrawable = 14
iTexture = 0
ENDIF
ENDIF
ELIF ePedComponent = PED_COMP_SPECIAL2
// Masks - return No Special 2
IF iDrawable >= 5 AND iDrawable <= 7
IF (eCompBlocks & CBF_ALL) != CBF_NONE
OR (eCompBlocks & CBF_MASKS) != CBF_NONE
CPRINTLN(DEBUG_PED_COMP, "Mask equipped: storing No Special instead.")
iDrawable = 0
iTexture = 0
ENDIF
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDPROC
/// PURPOSE:
/// Returns the info needed to store this current prop variation.
/// If this item shouldn't be stored, it returns the info for blank version.
/// e.g. Parachute should be ignored, so we return the info for "no special component"
/// PARAMS:
/// mPed - the ped we are storing variations for
/// ePropPos - prop type we are storing
/// iIndex - where to store the index info
/// iTexture - where to store the texture info
PROC GET_PROP_VARIATION_TO_STORE(PED_INDEX mPed, PED_PROP_POSITION ePropPos, INT &iIndex, INT &iTexture, COMPONENT_BLOCK_FLAGS eCompBlocks = CBF_DEFAULT, enumCharacterList ePedOverride = NO_CHARACTER)
enumCharacterList eChar = GET_PLAYER_PED_ENUM(mPed)
// get current item info- will overwrite if this item needs to be ignored
IF mPed != NULL // skip over when null, used for cutscene variation setup (Kenneth)
iIndex = GET_PED_PROP_INDEX(mPed, ePropPos)
iTexture = GET_PED_PROP_TEXTURE_INDEX(mPed, ePropPos)
ELSE
eChar = ePedOverride
ENDIF
IF eCompBlocks = CBF_NONE
EXIT
ENDIF
// We dont store helmets so if we have one on, revert to the stored head prop.
IF ePropPos = ANCHOR_HEAD
IF (eCompBlocks & CBF_DEFAULT) != CBF_NONE
OR (eCompBlocks & CBF_ALL) != CBF_NONE
OR (eCompBlocks & CBF_HELMETS) != CBF_NONE
IF mPed != NULL // skip over when null, used for cutscene variation setup (Kenneth)
IF IS_PED_WEARING_HELMET(mPed)
AND GET_PED_HELMET_STORED_HAT_PROP_INDEX(mPed) != -1
CPRINTLN(DEBUG_PED_COMP, "Code have a stored hat so using this instead.")
iIndex = GET_PED_HELMET_STORED_HAT_PROP_INDEX(mPed)
iTexture = GET_PED_HELMET_STORED_HAT_TEX_INDEX(mPed)
ENDIF
ENDIF
ENDIF
ENDIF
SWITCH eChar
CASE CHAR_MICHAEL
IF ePropPos = ANCHOR_HEAD
// Cycling Helmet- return No Head Prop
IF iIndex = 7
IF (eCompBlocks & CBF_DEFAULT) != CBF_NONE
OR (eCompBlocks & CBF_ALL) != CBF_NONE
OR (eCompBlocks & CBF_HELMETS) != CBF_NONE
CPRINTLN(DEBUG_PED_COMP, "Cycling Helmet equipped: storing No head prop instead.")
iIndex = -1
iTexture = -1
ENDIF
// Motorbike Helmet- return No Head Prop
ELIF iIndex = 11
IF (eCompBlocks & CBF_DEFAULT) != CBF_NONE
OR (eCompBlocks & CBF_ALL) != CBF_NONE
OR (eCompBlocks & CBF_HELMETS) != CBF_NONE
CPRINTLN(DEBUG_PED_COMP, "Motorbike Helmet equipped: storing No head prop instead.")
iIndex = -1
iTexture = -1
ENDIF
// Helicopter Headset- return No Head Prop
ELIF iIndex = 21
IF (eCompBlocks & CBF_DEFAULT) != CBF_NONE
OR (eCompBlocks & CBF_ALL) != CBF_NONE
OR (eCompBlocks & CBF_HEADSETS) != CBF_NONE
CPRINTLN(DEBUG_PED_COMP, "Helicopter Headset equipped: storing No head prop instead.")
iIndex = -1
iTexture = -1
ENDIF
// Moto-X helmet- return No Head Prop
ELIF iIndex = 23
IF (eCompBlocks & CBF_DEFAULT) != CBF_NONE
OR (eCompBlocks & CBF_ALL) != CBF_NONE
OR (eCompBlocks & CBF_HELMETS) != CBF_NONE
CPRINTLN(DEBUG_PED_COMP, "Moto-X helmet equipped: storing No head prop instead.")
iIndex = -1
iTexture = -1
ENDIF
// Flight cap
ELIF iIndex = 27
IF (eCompBlocks & CBF_DEFAULT) != CBF_NONE
OR (eCompBlocks & CBF_ALL) != CBF_NONE
OR (eCompBlocks & CBF_HELMETS) != CBF_NONE
CPRINTLN(DEBUG_PED_COMP, "Flight cap equipped: storing No head prop instead.")
iIndex = -1
iTexture = -1
ENDIF
// Fighter jet helmet
ELIF iIndex = 28
IF (eCompBlocks & CBF_DEFAULT) != CBF_NONE
OR (eCompBlocks & CBF_ALL) != CBF_NONE
OR (eCompBlocks & CBF_HELMETS) != CBF_NONE
CPRINTLN(DEBUG_PED_COMP, "Fighter jet helmet equipped: storing No head prop instead.")
iIndex = -1
iTexture = -1
ENDIF
// Masks - return No Head Prop
ELIF iIndex >= 14 AND iIndex <= 20
IF (eCompBlocks & CBF_ALL) != CBF_NONE
OR (eCompBlocks & CBF_MASKS) != CBF_NONE
CPRINTLN(DEBUG_PED_COMP, "Mask equipped: storing No head prop instead.")
iIndex = -1
iTexture = -1
ENDIF
ENDIF
ELIF ePropPos = ANCHOR_EYES
// Scuba mask- return No Eye Prop
IF iIndex = 1
IF (eCompBlocks & CBF_ALL) != CBF_NONE
OR (eCompBlocks & CBF_SCUBA) != CBF_NONE
CPRINTLN(DEBUG_PED_COMP, "Scuba Mask equipped: storing No eye prop instead.")
iIndex = -1
iTexture = -1
ENDIF
ENDIF
ENDIF
BREAK
CASE CHAR_FRANKLIN
IF ePropPos = ANCHOR_HEAD
// Cycling Helmet- return No Head Prop
IF iIndex = 2
IF (eCompBlocks & CBF_DEFAULT) != CBF_NONE
OR (eCompBlocks & CBF_ALL) != CBF_NONE
OR (eCompBlocks & CBF_HELMETS) != CBF_NONE
CPRINTLN(DEBUG_PED_COMP, "Cycling Helmet equipped: storing No head prop instead.")
iIndex = -1
iTexture = -1
ENDIF
// Helicopter headset- return No Head Prop
ELIF iIndex = 4
IF (eCompBlocks & CBF_DEFAULT) != CBF_NONE
OR (eCompBlocks & CBF_ALL) != CBF_NONE
OR (eCompBlocks & CBF_HEADSETS) != CBF_NONE
CPRINTLN(DEBUG_PED_COMP, "Helicopter Headset: storing No head prop instead.")
iIndex = -1
iTexture = -1
ENDIF
// Motorbike Helmet- return No Head Prop
ELIF iIndex = 6
IF (eCompBlocks & CBF_DEFAULT) != CBF_NONE
OR (eCompBlocks & CBF_ALL) != CBF_NONE
OR (eCompBlocks & CBF_HELMETS) != CBF_NONE
CPRINTLN(DEBUG_PED_COMP, "Motorbike Helmet equipped: storing No head prop instead.")
iIndex = -1
iTexture = -1
ENDIF
// Moto X Helmet- return No Head Prop
ELIF iIndex = 17
IF (eCompBlocks & CBF_DEFAULT) != CBF_NONE
OR (eCompBlocks & CBF_ALL) != CBF_NONE
OR (eCompBlocks & CBF_HELMETS) != CBF_NONE
CPRINTLN(DEBUG_PED_COMP, "Moto X Helmet equipped: storing No head prop instead.")
iIndex = -1
iTexture = -1
ENDIF
// Flight cap
ELIF iIndex = 20
IF (eCompBlocks & CBF_DEFAULT) != CBF_NONE
OR (eCompBlocks & CBF_ALL) != CBF_NONE
OR (eCompBlocks & CBF_HELMETS) != CBF_NONE
CPRINTLN(DEBUG_PED_COMP, "Flight cap equipped: storing No head prop instead.")
iIndex = -1
iTexture = -1
ENDIF
// Fighter jet helmet
ELIF iIndex = 21
IF (eCompBlocks & CBF_DEFAULT) != CBF_NONE
OR (eCompBlocks & CBF_ALL) != CBF_NONE
OR (eCompBlocks & CBF_HELMETS) != CBF_NONE
CPRINTLN(DEBUG_PED_COMP, "Fighter jet helmet equipped: storing No head prop instead.")
iIndex = -1
iTexture = -1
ENDIF
// Masks - return No Head Prop
ELIF iIndex >= 8 AND iIndex <= 14
IF (eCompBlocks & CBF_ALL) != CBF_NONE
OR (eCompBlocks & CBF_MASKS) != CBF_NONE
CPRINTLN(DEBUG_PED_COMP, "Mask equipped: storing No head prop instead.")
iIndex = -1
iTexture = -1
ENDIF
ENDIF
ENDIF
BREAK
CASE CHAR_TREVOR
IF ePropPos = ANCHOR_HEAD
// Motorbike Helmet - return No Head Prop
IF iIndex = 9
IF (eCompBlocks & CBF_DEFAULT) != CBF_NONE
OR (eCompBlocks & CBF_ALL) != CBF_NONE
OR (eCompBlocks & CBF_HELMETS) != CBF_NONE
CPRINTLN(DEBUG_PED_COMP, "Motorbike Helmet equipped: storing No head prop instead.")
iIndex = -1
iTexture = -1
ENDIF
// Motorbike Helmet (Army Style)- return No Head Prop
ELIF iIndex = 11
IF (eCompBlocks & CBF_DEFAULT) != CBF_NONE
OR (eCompBlocks & CBF_ALL) != CBF_NONE
OR (eCompBlocks & CBF_HELMETS) != CBF_NONE
CPRINTLN(DEBUG_PED_COMP, "Motorbike Helmet equipped (Army Style): storing No head prop instead.")
iIndex = -1
iTexture = -1
ENDIF
// Helicopter Headset- return No Head Prop
ELIF iIndex = 12
IF (eCompBlocks & CBF_DEFAULT) != CBF_NONE
OR (eCompBlocks & CBF_ALL) != CBF_NONE
OR (eCompBlocks & CBF_HELMETS) != CBF_NONE
CPRINTLN(DEBUG_PED_COMP, "Helicopter Headset equipped: storing No head prop instead.")
iIndex = -1
iTexture = -1
ENDIF
// Flight cap
ELIF iIndex = 21
IF (eCompBlocks & CBF_DEFAULT) != CBF_NONE
OR (eCompBlocks & CBF_ALL) != CBF_NONE
OR (eCompBlocks & CBF_HELMETS) != CBF_NONE
CPRINTLN(DEBUG_PED_COMP, "Flight cap equipped: storing No head prop instead.")
iIndex = -1
iTexture = -1
ENDIF
// Moto X Helmet- return No Head Prop
ELIF iIndex = 23
IF (eCompBlocks & CBF_DEFAULT) != CBF_NONE
OR (eCompBlocks & CBF_ALL) != CBF_NONE
OR (eCompBlocks & CBF_HELMETS) != CBF_NONE
CPRINTLN(DEBUG_PED_COMP, "Moto X Helmet equipped: storing No head prop instead.")
iIndex = -1
iTexture = -1
ENDIF
// Fighter jet helmet
ELIF iIndex = 27
IF (eCompBlocks & CBF_DEFAULT) != CBF_NONE
OR (eCompBlocks & CBF_ALL) != CBF_NONE
OR (eCompBlocks & CBF_HELMETS) != CBF_NONE
CPRINTLN(DEBUG_PED_COMP, "Fighter jet helmet equipped: storing No head prop instead.")
iIndex = -1
iTexture = -1
ENDIF
// Masks - return No Head Prop
ELIF (iIndex >= 14 AND iIndex <= 20) OR iIndex = 2
IF (eCompBlocks & CBF_ALL) != CBF_NONE
OR (eCompBlocks & CBF_MASKS) != CBF_NONE
CPRINTLN(DEBUG_PED_COMP, "Mask equipped: storing No head prop instead.")
iIndex = -1
iTexture = -1
ENDIF
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDPROC
/// PURPOSE: Fills the struct with the peds component variations and props
PROC GET_PED_VARIATIONS(PED_INDEX pedID, PED_VARIATION_STRUCT &sVariations, COMPONENT_BLOCK_FLAGS eCompBlocks = CBF_DEFAULT, INT iSlot = -1)
IF NOT IS_PED_INJURED(pedID)
enumCharacterList eChar = GET_PLAYER_PED_ENUM(pedID)
CPRINTLN(DEBUG_PED_COMP, "GET_PED_VARIATIONS for ", eChar)
INT i
REPEAT NUM_PED_COMPONENTS i
GET_VARIATION_TO_STORE(pedID, INT_TO_ENUM(PED_COMPONENT, i), sVariations.iDrawableVariation[i], sVariations.iTextureVariation[i], sVariations.iPaletteVariation[i], eCompBlocks)
//CPRINTLN(DEBUG_PED_COMP, GET_COMP_VARIATION_TYPE_STRING(INT_TO_ENUM(PED_COMPONENT, i)), "...component variation [",sVariations.iDrawableVariation[i], ",", sVariations.iTextureVariation[i], "]")
ENDREPEAT
REPEAT NUM_PLAYER_PED_PROPS i
GET_PROP_VARIATION_TO_STORE(pedID, INT_TO_ENUM(PED_PROP_POSITION, i), sVariations.iPropIndex[i], sVariations.iPropTexture[i], eCompBlocks)
//CPRINTLN(DEBUG_PED_COMP,"...prop [", sVariations.iPropIndex[i], ",", sVariations.iPropTexture[i], "]")
ENDREPEAT
IF IS_PLAYER_PED_PLAYABLE(eChar)
#if USE_CLF_DLC
sVariations.eStoredHairstyle = g_savedGlobalsClifford.sPlayerData.sInfo.sVariations[eChar].eStoredHairstyle
sVariations.eItemThatForcedHairChange = g_savedGlobalsClifford.sPlayerData.sInfo.sVariations[eChar].eItemThatForcedHairChange
sVariations.eTypeThatForcedHairChange = g_savedGlobalsClifford.sPlayerData.sInfo.sVariations[eChar].eTypeThatForcedHairChange
CPRINTLN(DEBUG_PED_COMP, "<clf>GET_PED_VARIATIONS storing mask info for ", eChar)
CPRINTLN(DEBUG_PED_COMP, "<clf>eStoredHairstyle = ", g_savedGlobalsClifford.sPlayerData.sInfo.sVariations[eChar].eStoredHairstyle, " eItemThatForcedHairChange= ", g_savedGlobalsClifford.sPlayerData.sInfo.sVariations[eChar].eItemThatForcedHairChange, " eTypeThatForcedHairChange = ", GET_PED_COMP_TYPE_STRING(g_savedGlobalsClifford.sPlayerData.sInfo.sVariations[eChar].eTypeThatForcedHairChange))
sVariations.eStoredBeard = g_savedGlobalsClifford.sPlayerData.sInfo.sVariations[eChar].eStoredBeard
sVariations.eItemThatForcedBeardChange = g_savedGlobalsClifford.sPlayerData.sInfo.sVariations[eChar].eItemThatForcedBeardChange
sVariations.eTypeThatForcedBeardChange = g_savedGlobalsClifford.sPlayerData.sInfo.sVariations[eChar].eTypeThatForcedBeardChange
CPRINTLN(DEBUG_PED_COMP, "<clf>GET_PED_VARIATIONS storing Beard info for ", eChar)
CPRINTLN(DEBUG_PED_COMP, "<clf>eStoredBeard = ", g_savedGlobalsClifford.sPlayerData.sInfo.sVariations[eChar].eStoredBeard, " eItemThatForcedBeardChange= ", g_savedGlobalsClifford.sPlayerData.sInfo.sVariations[eChar].eItemThatForcedBeardChange, " eTypeThatForcedBeardChange = ", g_savedGlobalsClifford.sPlayerData.sInfo.sVariations[eChar].eTypeThatForcedBeardChange)
#endif
#if USE_NRM_DLC
sVariations.eStoredHairstyle = g_savedGlobalsnorman.sPlayerData.sInfo.sVariations[eChar].eStoredHairstyle
sVariations.eItemThatForcedHairChange = g_savedGlobalsnorman.sPlayerData.sInfo.sVariations[eChar].eItemThatForcedHairChange
sVariations.eTypeThatForcedHairChange = g_savedGlobalsnorman.sPlayerData.sInfo.sVariations[eChar].eTypeThatForcedHairChange
CPRINTLN(DEBUG_PED_COMP, "<clf>GET_PED_VARIATIONS storing mask info for ", eChar)
CPRINTLN(DEBUG_PED_COMP, "<clf>eStoredHairstyle = ", g_savedGlobalsnorman.sPlayerData.sInfo.sVariations[eChar].eStoredHairstyle, " eItemThatForcedHairChange= ", g_savedGlobalsnorman.sPlayerData.sInfo.sVariations[eChar].eItemThatForcedHairChange, " eTypeThatForcedHairChange = ", GET_PED_COMP_TYPE_STRING(g_savedGlobalsnorman.sPlayerData.sInfo.sVariations[eChar].eTypeThatForcedHairChange))
sVariations.eStoredBeard = g_savedGlobalsnorman.sPlayerData.sInfo.sVariations[eChar].eStoredBeard
sVariations.eItemThatForcedBeardChange = g_savedGlobalsnorman.sPlayerData.sInfo.sVariations[eChar].eItemThatForcedBeardChange
sVariations.eTypeThatForcedBeardChange = g_savedGlobalsnorman.sPlayerData.sInfo.sVariations[eChar].eTypeThatForcedBeardChange
CPRINTLN(DEBUG_PED_COMP, "<clf>GET_PED_VARIATIONS storing Beard info for ", eChar)
CPRINTLN(DEBUG_PED_COMP, "<clf>eStoredBeard = ", g_savedGlobalsnorman.sPlayerData.sInfo.sVariations[eChar].eStoredBeard, " eItemThatForcedBeardChange= ", g_savedGlobalsnorman.sPlayerData.sInfo.sVariations[eChar].eItemThatForcedBeardChange, " eTypeThatForcedBeardChange = ", g_savedGlobalsnorman.sPlayerData.sInfo.sVariations[eChar].eTypeThatForcedBeardChange)
#endif
#if not USE_CLF_DLC
#if not USE_NRM_DLC
sVariations.eStoredHairstyle = g_savedGlobals.sPlayerData.sInfo.sVariations[eChar].eStoredHairstyle
sVariations.eItemThatForcedHairChange = g_savedGlobals.sPlayerData.sInfo.sVariations[eChar].eItemThatForcedHairChange
sVariations.eTypeThatForcedHairChange = g_savedGlobals.sPlayerData.sInfo.sVariations[eChar].eTypeThatForcedHairChange
CPRINTLN(DEBUG_PED_COMP, "GET_PED_VARIATIONS storing mask info for ", eChar)
CPRINTLN(DEBUG_PED_COMP, "eStoredHairstyle = ", g_savedGlobals.sPlayerData.sInfo.sVariations[eChar].eStoredHairstyle, " eItemThatForcedHairChange= ", g_savedGlobals.sPlayerData.sInfo.sVariations[eChar].eItemThatForcedHairChange, " eTypeThatForcedHairChange = ", GET_PED_COMP_TYPE_STRING(g_savedGlobals.sPlayerData.sInfo.sVariations[eChar].eTypeThatForcedHairChange))
sVariations.eStoredBeard = g_savedGlobals.sPlayerData.sInfo.sVariations[eChar].eStoredBeard
sVariations.eItemThatForcedBeardChange = g_savedGlobals.sPlayerData.sInfo.sVariations[eChar].eItemThatForcedBeardChange
sVariations.eTypeThatForcedBeardChange = g_savedGlobals.sPlayerData.sInfo.sVariations[eChar].eTypeThatForcedBeardChange
CPRINTLN(DEBUG_PED_COMP, "GET_PED_VARIATIONS storing Beard info for ", eChar)
CPRINTLN(DEBUG_PED_COMP, "eStoredBeard = ", g_savedGlobals.sPlayerData.sInfo.sVariations[eChar].eStoredBeard, " eItemThatForcedBeardChange= ", g_savedGlobals.sPlayerData.sInfo.sVariations[eChar].eItemThatForcedBeardChange, " eTypeThatForcedBeardChange = ", g_savedGlobals.sPlayerData.sInfo.sVariations[eChar].eTypeThatForcedBeardChange)
#endif
#endif
ELIF NETWORK_IS_GAME_IN_PROGRESS()
#IF USE_TU_CHANGES
AND GET_ENTITY_MODEL(pedID) = GET_ENTITY_MODEL(PLAYER_PED_ID())
#ENDIF
#IF NOT USE_TU_CHANGES
AND pedID = PLAYER_PED_ID()
#ENDIF
IF GET_MP_BOOL_CHARACTER_STAT(MP_STAT_USING_HAIR_SA_STAT, iSlot)
sVariations.eStoredHairstyle = INT_TO_ENUM(PED_COMP_NAME_ENUM, GET_MP_INT_CHARACTER_STAT(MP_STAT_CHAR_FM_STORED_HAIRDO_SA, iSlot))
ELSE
sVariations.eStoredHairstyle = INT_TO_ENUM(PED_COMP_NAME_ENUM, GET_MP_INT_CHARACTER_STAT(MP_STAT_CHAR_FM_STORED_HAIRDO, iSlot))
ENDIF
sVariations.eItemThatForcedHairChange = INT_TO_ENUM(PED_COMP_NAME_ENUM, GET_MP_INT_CHARACTER_STAT(MP_STAT_CHAR_FM_FORCED_HAIR_ITEM, iSlot))
sVariations.eTypeThatForcedHairChange = INT_TO_ENUM(PED_COMP_TYPE_ENUM, GET_MP_INT_CHARACTER_STAT(MP_STAT_CHAR_FM_FORCED_HAIR_TYPE, iSlot))
CPRINTLN(DEBUG_PED_COMP, "GET_PED_VARIATIONS storing mask info for ", eChar)
// CPRINTLN(DEBUG_PED_COMP, "eStoredHairstyle = ", g_savedMPGlobalsNew.g_savedMPGlobals[GET_SAVE_GAME_ARRAY_SLOT()].MpSavedGeneral.eStoredHairstyle, " eItemThatForcedHairChange= ", g_savedMPGlobalsNew.g_savedMPGlobals[GET_SAVE_GAME_ARRAY_SLOT()].MpSavedGeneral.eItemThatForcedHairChange, " eTypeThatForcedHairChange = ", GET_PED_COMP_TYPE_STRING(g_savedMPGlobalsNew.g_savedMPGlobals[GET_SAVE_GAME_ARRAY_SLOT()].MpSavedGeneral.eTypeThatForcedHairChange))
ENDIF
#IF NOT USE_SP_DLC
#IF USE_TU_CHANGES
IF NETWORK_IS_GAME_IN_PROGRESS()
AND pedID = PLAYER_PED_ID()
CPRINTLN(DEBUG_PED_COMP, "GET_PED_VARIATIONS restore hair stuff for ", "Called by...", GET_THIS_SCRIPT_NAME())
IF GET_MP_BOOL_CHARACTER_STAT(MP_STAT_USING_HAIR_SA_STAT, iSlot)
sVariations.eStoredHairstyle = INT_TO_ENUM(PED_COMP_NAME_ENUM, GET_MP_INT_CHARACTER_STAT(MP_STAT_CHAR_FM_STORED_HAIRDO_SA, iSlot))
ELSE
sVariations.eStoredHairstyle = INT_TO_ENUM(PED_COMP_NAME_ENUM, GET_MP_INT_CHARACTER_STAT(MP_STAT_CHAR_FM_STORED_HAIRDO, iSlot))
ENDIF
ENDIF
#ENDIF
#ENDIF
ENDIF
ENDPROC
/// PURPOSE: Sets the peds component variations and props
PROC SET_PED_VARIATIONS(PED_INDEX pedID, PED_VARIATION_STRUCT &sVariations, BOOL bBypassMPBerdCheck = FALSE, BOOL bBypassMPHeadPropCheck = FALSE, BOOL bValidateVariations = TRUE, BOOL bIgnoreDeadCheck = FALSE)
CPRINTLN(DEBUG_PED_COMP, "SET_PED_VARIATIONS called...")
IF NOT IS_PED_INJURED(pedID)
OR bIgnoreDeadCheck
enumCharacterList eChar = GET_PLAYER_PED_ENUM(pedID)
MODEL_NAMES ePedModel = GET_ENTITY_MODEL(pedID)
PED_COMP_NAME_ENUM eReturnItem
CPRINTLN(DEBUG_PED_COMP, "SET_PED_VARIATIONS for ", eChar, " called by...", GET_THIS_SCRIPT_NAME())
INT i
REPEAT NUM_PED_COMPONENTS i
// Within the new character creator we do not want BERD's applied
IF i != ENUM_TO_INT(PED_COMP_BERD)
OR (i = ENUM_TO_INT(PED_COMP_BERD) AND NOT bBypassMPBerdCheck)
IF bValidateVariations
IF (sVariations.iDrawableVariation[i] != 0)
AND (sVariations.iDrawableVariation[i] >= GET_NUMBER_OF_PED_DRAWABLE_VARIATIONS(pedID, INT_TO_ENUM(PED_COMPONENT, i)))
CPRINTLN(DEBUG_PED_COMP, "SET_PED_VARIATIONS, invalid drawable for component ", i, ". Stored=", sVariations.iDrawableVariation[i], ", Max=", GET_NUMBER_OF_PED_DRAWABLE_VARIATIONS(pedID, INT_TO_ENUM(PED_COMPONENT, i)))
sVariations.iDrawableVariation[i] = 0
ENDIF
IF (sVariations.iTextureVariation[i] != 0)
AND (sVariations.iTextureVariation[i] >= GET_NUMBER_OF_PED_TEXTURE_VARIATIONS(pedID, INT_TO_ENUM(PED_COMPONENT, i), sVariations.iDrawableVariation[i]))
CPRINTLN(DEBUG_PED_COMP, "SET_PED_VARIATIONS, invalid texture for component ", i, ". Stored=", sVariations.iTextureVariation[i], ", Max=", GET_NUMBER_OF_PED_TEXTURE_VARIATIONS(pedID, INT_TO_ENUM(PED_COMPONENT, i), sVariations.iDrawableVariation[i]))
sVariations.iTextureVariation[i] = 0
ENDIF
ENDIF
SET_PED_COMPONENT_VARIATION(pedID, INT_TO_ENUM(PED_COMPONENT, i), sVariations.iDrawableVariation[i], sVariations.iTextureVariation[i], sVariations.iPaletteVariation[i])
#IF IS_DEBUG_BUILD
ELSE
CPRINTLN(DEBUG_PED_COMP, "SET_PED_VARIATIONS, skipping component: ", i)
#ENDIF
ENDIF
//CPRINTLN(DEBUG_PED_COMP, GET_COMP_VARIATION_TYPE_STRING(INT_TO_ENUM(PED_COMPONENT, i)), "...component variation [",sVariations.iDrawableVariation[i], ",", sVariations.iTextureVariation[i], "]")
ENDREPEAT
REPEAT NUM_PLAYER_PED_PROPS i
IF bValidateVariations
IF sVariations.iPropIndex[i] != -1
AND sVariations.iPropIndex[i] != 255
IF (sVariations.iPropIndex[i] >= GET_NUMBER_OF_PED_PROP_DRAWABLE_VARIATIONS(pedID, INT_TO_ENUM(PED_PROP_POSITION, i)))
CPRINTLN(DEBUG_PED_COMP, "SET_PED_VARIATIONS, invalid drawable for prop ", i, ". Stored=", sVariations.iPropIndex[i], ", Max=", GET_NUMBER_OF_PED_PROP_DRAWABLE_VARIATIONS(pedID, INT_TO_ENUM(PED_PROP_POSITION, i)))
sVariations.iPropIndex[i] = -1
ELIF (sVariations.iPropTexture[i] >= GET_NUMBER_OF_PED_PROP_TEXTURE_VARIATIONS(pedID, INT_TO_ENUM(PED_PROP_POSITION, i), sVariations.iPropIndex[i]))
CPRINTLN(DEBUG_PED_COMP, "SET_PED_VARIATIONS, invalid texture for prop ", i, ". Stored=", sVariations.iPropTexture[i], ", Max=", GET_NUMBER_OF_PED_PROP_TEXTURE_VARIATIONS(pedID, INT_TO_ENUM(PED_PROP_POSITION, i), sVariations.iPropIndex[i]))
sVariations.iPropTexture[i] = 0
ENDIF
ENDIF
ENDIF
IF sVariations.iPropIndex[i] != -1
AND sVariations.iPropIndex[i] != 255
//PRINTSTRING("...prop [")PRINTINT(sVariations.iPropIndex[i])PRINTSTRING(",")PRINTINT(sVariations.iPropTexture[i])PRINTSTRING("]")PRINTNL()
SET_PED_PROP_INDEX(pedID, INT_TO_ENUM(PED_PROP_POSITION, i), sVariations.iPropIndex[i], sVariations.iPropTexture[i])
ELSE
CLEAR_PED_PROP(pedID, INT_TO_ENUM(PED_PROP_POSITION, i))
ENDIF
ENDREPEAT
IF IS_PLAYER_PED_PLAYABLE(eChar)
#if USE_CLF_DLC
CPRINTLN(DEBUG_PED_COMP, "<clf>SET_PED_VARIATIONS restore hair stuff for ", eChar, " Called by...", GET_THIS_SCRIPT_NAME())
g_savedGlobalsClifford.sPlayerData.sInfo.sVariations[eChar].eStoredHairstyle = sVariations.eStoredHairstyle
g_savedGlobalsClifford.sPlayerData.sInfo.sVariations[eChar].eItemThatForcedHairChange = sVariations.eItemThatForcedHairChange
g_savedGlobalsClifford.sPlayerData.sInfo.sVariations[eChar].eTypeThatForcedHairChange = sVariations.eTypeThatForcedHairChange
CPRINTLN(DEBUG_PED_COMP, "<clf>.eStoredHairstyle = ", g_savedGlobalsClifford.sPlayerData.sInfo.sVariations[eChar].eStoredHairstyle, " eItemThatForcedHairChange= ", g_savedGlobalsClifford.sPlayerData.sInfo.sVariations[eChar].eItemThatForcedHairChange, " eTypeThatForcedHairChange = ", GET_PED_COMP_TYPE_STRING(g_savedGlobalsClifford.sPlayerData.sInfo.sVariations[eChar].eTypeThatForcedHairChange))
IF IS_SAFE_TO_RESTORE_SAVED_HAIR(pedID, ePedModel, eReturnItem)
SET_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_HAIR, eReturnItem, FALSE)
ENDIF
CPRINTLN(DEBUG_PED_COMP, "<clf>SET_PED_VARIATIONS restore Beard stuff for ", eChar, " Called by...", GET_THIS_SCRIPT_NAME())
g_savedGlobalsClifford.sPlayerData.sInfo.sVariations[eChar].eStoredBeard = sVariations.eStoredBeard
g_savedGlobalsClifford.sPlayerData.sInfo.sVariations[eChar].eItemThatForcedBeardChange = sVariations.eItemThatForcedBeardChange
g_savedGlobalsClifford.sPlayerData.sInfo.sVariations[eChar].eTypeThatForcedBeardChange = sVariations.eTypeThatForcedBeardChange
CPRINTLN(DEBUG_PED_COMP, "<clf>.eStoredBeard = ", g_savedGlobalsClifford.sPlayerData.sInfo.sVariations[eChar].eStoredBeard, " eItemThatForcedBeardChange= ", g_savedGlobalsClifford.sPlayerData.sInfo.sVariations[eChar].eItemThatForcedBeardChange, " eTypeThatForcedBeardChange = ", GET_PED_COMP_TYPE_STRING(g_savedGlobalsClifford.sPlayerData.sInfo.sVariations[eChar].eTypeThatForcedBeardChange))
UNUSED_PARAMETER(bBypassMPBerdCheck)
UNUSED_PARAMETER(bBypassMPHeadPropCheck)
#endif
#if USE_NRM_DLC
CPRINTLN(DEBUG_PED_COMP, "<clf>SET_PED_VARIATIONS restore hair stuff for ", eChar, " Called by...", GET_THIS_SCRIPT_NAME())
g_savedGlobalsnorman.sPlayerData.sInfo.sVariations[eChar].eStoredHairstyle = sVariations.eStoredHairstyle
g_savedGlobalsnorman.sPlayerData.sInfo.sVariations[eChar].eItemThatForcedHairChange = sVariations.eItemThatForcedHairChange
g_savedGlobalsnorman.sPlayerData.sInfo.sVariations[eChar].eTypeThatForcedHairChange = sVariations.eTypeThatForcedHairChange
CPRINTLN(DEBUG_PED_COMP, "<clf>.eStoredHairstyle = ", g_savedGlobalsnorman.sPlayerData.sInfo.sVariations[eChar].eStoredHairstyle, " eItemThatForcedHairChange= ", g_savedGlobalsnorman.sPlayerData.sInfo.sVariations[eChar].eItemThatForcedHairChange, " eTypeThatForcedHairChange = ", GET_PED_COMP_TYPE_STRING(g_savedGlobalsnorman.sPlayerData.sInfo.sVariations[eChar].eTypeThatForcedHairChange))
IF IS_SAFE_TO_RESTORE_SAVED_HAIR(pedID, ePedModel, eReturnItem)
SET_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_HAIR, eReturnItem, FALSE)
ENDIF
CPRINTLN(DEBUG_PED_COMP, "<clf>SET_PED_VARIATIONS restore Beard stuff for ", eChar, " Called by...", GET_THIS_SCRIPT_NAME())
g_savedGlobalsnorman.sPlayerData.sInfo.sVariations[eChar].eStoredBeard = sVariations.eStoredBeard
g_savedGlobalsnorman.sPlayerData.sInfo.sVariations[eChar].eItemThatForcedBeardChange = sVariations.eItemThatForcedBeardChange
g_savedGlobalsnorman.sPlayerData.sInfo.sVariations[eChar].eTypeThatForcedBeardChange = sVariations.eTypeThatForcedBeardChange
CPRINTLN(DEBUG_PED_COMP, "<clf>.eStoredBeard = ", g_savedGlobalsnorman.sPlayerData.sInfo.sVariations[eChar].eStoredBeard, " eItemThatForcedBeardChange= ", g_savedGlobalsnorman.sPlayerData.sInfo.sVariations[eChar].eItemThatForcedBeardChange, " eTypeThatForcedBeardChange = ", GET_PED_COMP_TYPE_STRING(g_savedGlobalsnorman.sPlayerData.sInfo.sVariations[eChar].eTypeThatForcedBeardChange))
UNUSED_PARAMETER(bBypassMPBerdCheck)
UNUSED_PARAMETER(bBypassMPHeadPropCheck)
#endif
#if not USE_CLF_DLC
#if not USE_NRM_DLC
CPRINTLN(DEBUG_PED_COMP, "SET_PED_VARIATIONS restore hair stuff for ", eChar, " Called by...", GET_THIS_SCRIPT_NAME())
g_savedGlobals.sPlayerData.sInfo.sVariations[eChar].eStoredHairstyle = sVariations.eStoredHairstyle
g_savedGlobals.sPlayerData.sInfo.sVariations[eChar].eItemThatForcedHairChange = sVariations.eItemThatForcedHairChange
g_savedGlobals.sPlayerData.sInfo.sVariations[eChar].eTypeThatForcedHairChange = sVariations.eTypeThatForcedHairChange
CPRINTLN(DEBUG_PED_COMP, ".eStoredHairstyle = ", g_savedGlobals.sPlayerData.sInfo.sVariations[eChar].eStoredHairstyle, " eItemThatForcedHairChange= ", g_savedGlobals.sPlayerData.sInfo.sVariations[eChar].eItemThatForcedHairChange, " eTypeThatForcedHairChange = ", GET_PED_COMP_TYPE_STRING(g_savedGlobals.sPlayerData.sInfo.sVariations[eChar].eTypeThatForcedHairChange))
IF IS_SAFE_TO_RESTORE_SAVED_HAIR(pedID, ePedModel, eReturnItem)
SET_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_HAIR, eReturnItem, FALSE)
ENDIF
CPRINTLN(DEBUG_PED_COMP, "SET_PED_VARIATIONS restore Beard stuff for ", eChar, " Called by...", GET_THIS_SCRIPT_NAME())
g_savedGlobals.sPlayerData.sInfo.sVariations[eChar].eStoredBeard = sVariations.eStoredBeard
g_savedGlobals.sPlayerData.sInfo.sVariations[eChar].eItemThatForcedBeardChange = sVariations.eItemThatForcedBeardChange
g_savedGlobals.sPlayerData.sInfo.sVariations[eChar].eTypeThatForcedBeardChange = sVariations.eTypeThatForcedBeardChange
CPRINTLN(DEBUG_PED_COMP, ".eStoredBeard = ", g_savedGlobals.sPlayerData.sInfo.sVariations[eChar].eStoredBeard, " eItemThatForcedBeardChange= ", g_savedGlobals.sPlayerData.sInfo.sVariations[eChar].eItemThatForcedBeardChange, " eTypeThatForcedBeardChange = ", GET_PED_COMP_TYPE_STRING(g_savedGlobals.sPlayerData.sInfo.sVariations[eChar].eTypeThatForcedBeardChange))
#endif
#endif
IF IS_SAFE_TO_RESTORE_SAVED_BEARD(pedID, ePedModel, eReturnItem)
SET_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_BERD, eReturnItem, FALSE)
ENDIF
#IF NOT USE_SP_DLC
ELIF NETWORK_IS_GAME_IN_PROGRESS()
#IF USE_TU_CHANGES
AND GET_ENTITY_MODEL(pedID) = GET_ENTITY_MODEL(PLAYER_PED_ID())
#ENDIF
#IF NOT USE_TU_CHANGES
AND pedID = PLAYER_PED_ID()
#ENDIF
BOOL bBlockTorsoDecals = SHOULD_TORSO_DECALS_BE_BLOCKED_FOR_OUTFIT(pedID)
// #IF USE_TU_CHANGES
// CPRINTLN(DEBUG_PED_COMP, "SET_PED_VARIATIONS restore berd stuff for ", eChar, " Called by...", GET_THIS_SCRIPT_NAME())
// // additional berd checks are required for masks that shrink heads use ped comp system
// PED_COMP_NAME_ENUM eBerdItem
// eBerdItem = GET_PED_COMP_ITEM_FROM_VARIATIONS(pedID, sVariations.iDrawableVariation[PED_COMP_BERD], sVariations.iTextureVariation[PED_COMP_BERD], COMP_TYPE_BERD)
// SET_PED_COMP_ITEM_CURRENT_MP(pedID, COMP_TYPE_BERD, eBerdItem, FALSE)
// #ENDIF
CPRINTLN(DEBUG_PED_COMP, "SET_PED_VARIATIONS restore hair stuff for ", eChar, " Called by...", GET_THIS_SCRIPT_NAME())
SET_MP_INT_CHARACTER_STAT(MP_STAT_CHAR_FM_FORCED_HAIR_ITEM, ENUM_TO_INT(sVariations.eItemThatForcedHairChange), g_iPedComponentSlot)
SET_MP_INT_CHARACTER_STAT(MP_STAT_CHAR_FM_FORCED_HAIR_TYPE, ENUM_TO_INT(sVariations.eTypeThatForcedHairChange), g_iPedComponentSlot)
// equip the hair item via ped comp system so we get the correct hair overlay
#IF USE_TU_CHANGES
PED_COMP_NAME_ENUM eHairItem = GET_PED_COMP_ITEM_FROM_VARIATIONS(pedID, sVariations.iDrawableVariation[PED_COMP_HAIR], sVariations.iTextureVariation[PED_COMP_HAIR], COMP_TYPE_HAIR)
IF (eHairItem != DUMMY_PED_COMP)
PED_COMP_NAME_ENUM eGRHairItem = DUMMY_PED_COMP
IF (ePedModel = MP_M_FREEMODE_01)
eGRHairItem = GET_MALE_HAIR(eHairItem)
ELIF (ePedModel = MP_F_FREEMODE_01)
eGRHairItem = GET_FEMALE_HAIR(eHairItem)
ENDIF
IF (eGRHairItem != DUMMY_PED_COMP)
AND (eHairItem != eGRHairItem)
CPRINTLN(DEBUG_PED_COMP,"SET_PED_VARIATIONS gr_hair: replacing hair enum ", eHairItem, " with gunrunning hair enum ", eGRHairItem)
eHairItem = eGRHairItem
ENDIF
ENDIF
SET_PED_COMP_ITEM_CURRENT_MP(pedID, COMP_TYPE_HAIR, eHairItem, FALSE,
DEFAULT, //INT iPaletteOverride = -1,
DEFAULT, //BOOL bUseGlobalOutfitData = FALSE,
DEFAULT, //BOOL bPreviewing = FALSE,
DEFAULT, //BOOL bReEquipAccessories = FALSE,
DEFAULT, //INT iHairTint1 = -1,
DEFAULT, //INT iHairTint2 = -1,
g_iPedComponentSlot, //INT iSlot = -1,
bBlockTorsoDecals) //BOOL bBlockTorsoDecals)
#ENDIF
CPRINTLN(DEBUG_PED_COMP, "SET_PED_VARIATIONS restore beard stuff for ", eChar, " Called by...", GET_THIS_SCRIPT_NAME())
//SET_MP_INT_CHARACTER_STAT(MP_STAT_CHAR_FM_STORED_beardDO, ENUM_TO_INT(sVariations.eStoredbeardstyle), g_iPedComponentSlot)
//SET_MP_INT_CHARACTER_STAT(MP_STAT_CHAR_FM_STORED_beardDO_SA, ENUM_TO_INT(sVariations.eStoredbeardstyle), g_iPedComponentSlot)
//SET_MP_INT_CHARACTER_STAT(MP_STAT_CHAR_FM_FORCED_beard_ITEM, ENUM_TO_INT(sVariations.eItemThatForcedbeardChange), g_iPedComponentSlot)
//SET_MP_INT_CHARACTER_STAT(MP_STAT_CHAR_FM_FORCED_beard_TYPE, ENUM_TO_INT(sVariations.eTypeThatForcedbeardChange), g_iPedComponentSlot)
//SET_MP_BOOL_CHARACTER_STAT(MP_STAT_USING_beard_SA_STAT, TRUE)
// CPRINTLN(DEBUG_PED_COMP, ".eStoredbeardstyle = ", g_savedMPGlobalsNew.g_savedMPGlobals[GET_SAVE_GAME_ARRAY_SLOT()].MpSavedGeneral.eStoredbeardstyle, " eItemThatForcedbeardChange= ", g_savedMPGlobalsNew.g_savedMPGlobals[GET_SAVE_GAME_ARRAY_SLOT()].MpSavedGeneral.eItemThatForcedbeardChange, " eTypeThatForcedbeardChange = ", GET_PED_COMP_TYPE_STRING(g_savedMPGlobalsNew.g_savedMPGlobals[GET_SAVE_GAME_ARRAY_SLOT()].MpSavedGeneral.eTypeThatForcedbeardChange))
// equip the beard item via ped comp system so we get the correct beard controlled head size/overlays
IF NOT bBypassMPBerdCheck
#IF USE_TU_CHANGES
PED_COMP_NAME_ENUM eBeardItem = GET_PED_COMP_ITEM_FROM_VARIATIONS(pedID, sVariations.iDrawableVariation[PED_COMP_BERD], sVariations.iTextureVariation[PED_COMP_BERD], COMP_TYPE_BERD)
SET_PED_COMP_ITEM_CURRENT_MP(pedID, COMP_TYPE_BERD, eBeardItem, FALSE,
DEFAULT, //INT iPaletteOverride = -1,
DEFAULT, //BOOL bUseGlobalOutfitData = FALSE,
DEFAULT, //BOOL bPreviewing = FALSE,
DEFAULT, //BOOL bReEquipAccessories = FALSE,
DEFAULT, //INT iHairTint1 = -1,
DEFAULT, //INT iHairTint2 = -1,
g_iPedComponentSlot, //INT iSlot = -1,
bBlockTorsoDecals) //BOOL bBlockTorsoDecals)
#ENDIF
ENDIF
// equip the Helmet item via ped comp system so we get the correct Helmet controlled visor
IF NOT bBypassMPHeadPropCheck
#IF USE_TU_CHANGES
PED_COMP_NAME_ENUM eHelmetItem = GET_PROP_ITEM_FROM_VARIATIONS(pedID, sVariations.iPropIndex[ANCHOR_HEAD], sVariations.iPropTexture[ANCHOR_HEAD], ANCHOR_HEAD)
SET_PED_COMP_ITEM_CURRENT_MP(pedID, COMP_TYPE_PROPS, eHelmetItem, FALSE,
DEFAULT, //INT iPaletteOverride = -1,
DEFAULT, //BOOL bUseGlobalOutfitData = FALSE,
DEFAULT, //BOOL bPreviewing = FALSE,
DEFAULT, //BOOL bReEquipAccessories = FALSE,
DEFAULT, //INT iHairTint1 = -1,
DEFAULT, //INT iHairTint2 = -1,
g_iPedComponentSlot, //INT iSlot = -1,
bBlockTorsoDecals) //BOOL bBlockTorsoDecals)
#ENDIF
ENDIF
#ENDIF
ENDIF
// always have to apply to for player ped. We always have to record players hair, other wise we are recording wrong data KW
#IF NOT USE_SP_DLC
#IF USE_TU_CHANGES
IF NETWORK_IS_GAME_IN_PROGRESS()
AND pedID = PLAYER_PED_ID()
CPRINTLN(DEBUG_PED_COMP, "SET_PED_VARIATIONS 2 restore hair stuff for ", eChar, " Called by...", GET_THIS_SCRIPT_NAME())
PED_COMP_NAME_ENUM eStoredHairstyle = sVariations.eStoredHairstyle
IF ePedModel = MP_M_FREEMODE_01
eStoredHairstyle = GET_MALE_HAIR(eStoredHairstyle)
ELSE
eStoredHairstyle = GET_FEMALE_HAIR(eStoredHairstyle)
ENDIF
SET_MP_INT_CHARACTER_STAT(MP_STAT_CHAR_FM_STORED_HAIRDO, ENUM_TO_INT(eStoredHairstyle), g_iPedComponentSlot)
SET_MP_INT_CHARACTER_STAT(MP_STAT_CHAR_FM_STORED_HAIRDO_SA, ENUM_TO_INT(eStoredHairstyle), g_iPedComponentSlot)
SET_MP_BOOL_CHARACTER_STAT(MP_STAT_USING_HAIR_SA_STAT, TRUE)
ENDIF
#ENDIF
#ENDIF
// Pogo glasses need to be tied to the pogo mask.
IF ePedModel = MP_M_FREEMODE_01
OR ePedModel = MP_F_FREEMODE_01
INT iDLCBerdHash = GET_HASH_NAME_FOR_COMPONENT(NATIVE_TO_INT(pedID), ENUM_TO_INT(PED_COMP_BERD), GET_PED_DRAWABLE_VARIATION(pedID, PED_COMP_BERD), GET_PED_TEXTURE_VARIATION(pedID, PED_COMP_BERD))
INT iDLCEyesHash = GET_HASH_NAME_FOR_PROP(NATIVE_TO_INT(pedID), ENUM_TO_INT(ANCHOR_EYES), GET_PED_PROP_INDEX(pedID, ANCHOR_EYES), GET_PED_PROP_TEXTURE_INDEX(pedID, ANCHOR_EYES))
IF iDLCBerdHash = HASH("DLC_MP_ARENA_M_BERD_13_0")
OR iDLCBerdHash = HASH("DLC_MP_ARENA_F_BERD_13_0")
// Force glasses on
IF NOT DOES_SHOP_PED_APPAREL_HAVE_RESTRICTION_TAG(iDLCEyesHash, DLC_RESTRICTION_TAG_ARENA_DRAW_0, ENUM_TO_INT(SHOP_PED_PROP))
scrShopPedProp propItem
INIT_SHOP_PED_PROP(propItem)
IF iDLCBerdHash = HASH("DLC_MP_ARENA_M_BERD_13_0")
GET_SHOP_PED_QUERY_PROP(HASH("DLC_MP_ARENA_M_PEYES_0_0"), propItem)
ELSE
GET_SHOP_PED_QUERY_PROP(HASH("DLC_MP_ARENA_F_PEYES_0_0"), propItem)
ENDIF
SET_PED_PROP_INDEX(pedID, ANCHOR_EYES, propItem.m_propIndex, propItem.m_textureIndex)
CPRINTLN(DEBUG_PED_COMP, "SET_PED_VARIATIONS - Forcing pogo glasses on")
ENDIF
ELSE
// Force glasses off
IF DOES_SHOP_PED_APPAREL_HAVE_RESTRICTION_TAG(iDLCEyesHash, DLC_RESTRICTION_TAG_ARENA_DRAW_0, ENUM_TO_INT(SHOP_PED_PROP))
CLEAR_PED_PROP(pedID, ANCHOR_EYES)
CPRINTLN(DEBUG_PED_COMP, "SET_PED_VARIATIONS - Forcing pogo glasses off")
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE: Returns the vehicle model enum for the specified player character
FUNC MODEL_NAMES GET_PLAYER_VEH_MODEL(enumCharacterList ePed, VEHICLE_CREATE_TYPE_ENUM eTypePreference = VEHICLE_TYPE_DEFAULT)
IF IS_PLAYER_PED_PLAYABLE(ePed)
PED_VEH_DATA_STRUCT sData
GET_PLAYER_VEH_DATA(ePed, sData, eTypePreference)
RETURN sData.model
ELSE
IF ePed <> NO_CHARACTER
#IF IS_DEBUG_BUILD
SCRIPT_ASSERT("GET_PLAYER_VEH_MODEL - Ped is not a player character.")
PRINTSTRING("\nGET_PLAYER_VEH_MODEL - Ped is not a player character.")PRINTNL()
#ENDIF
ENDIF
ENDIF
RETURN DUMMY_MODEL_FOR_SCRIPT
ENDFUNC
/// PURPOSE: Makes a request for the appropriate player ped model
PROC REQUEST_PLAYER_PED_MODELCLF(enumCharacterList ePed)
IF IS_PLAYER_PED_PLAYABLE(ePed)
REQUEST_MODEL(GET_PLAYER_PED_MODELCLF(ePed))
ELSE
IF ePed <> NO_CHARACTER
#IF IS_DEBUG_BUILD
SCRIPT_ASSERT("REQUEST_PLAYER_PED_MODEL CLF - Ped is not a player character.")
PRINTSTRING("\nREQUEST_PLAYER_PED_MODEL CLF - Ped is not a player character.")PRINTNL()
#ENDIF
ENDIF
ENDIF
ENDPROC
PROC REQUEST_PLAYER_PED_MODELNRM(enumCharacterList ePed)
IF IS_PLAYER_PED_PLAYABLE(ePed)
REQUEST_MODEL(GET_PLAYER_PED_MODELNRM(ePed))
ELSE
IF ePed <> NO_CHARACTER
#IF IS_DEBUG_BUILD
SCRIPT_ASSERT("REQUEST_PLAYER_PED_MODEL NRM - Ped is not a player character.")
PRINTSTRING("\nREQUEST_PLAYER_PED_MODEL NRM - Ped is not a player character.")PRINTNL()
#ENDIF
ENDIF
ENDIF
ENDPROC
PROC REQUEST_PLAYER_PED_MODEL(enumCharacterList ePed)
#if USE_CLF_DLC
if g_bLoadedClifford
REQUEST_PLAYER_PED_MODELCLF(ePed)
EXIT
endif
#endif
#if USE_NRM_DLC
if g_bLoadedNorman
REQUEST_PLAYER_PED_MODELNRM(ePed)
EXIT
endif
#endif
IF IS_PLAYER_PED_PLAYABLE(ePed)
REQUEST_MODEL(GET_PLAYER_PED_MODEL(ePed))
ELSE
IF ePed <> NO_CHARACTER
#IF IS_DEBUG_BUILD
SCRIPT_ASSERT("REQUEST_PLAYER_PED_MODEL - Ped is not a player character.")
PRINTSTRING("\nREQUEST_PLAYER_PED_MODEL - Ped is not a player character.")PRINTNL()
#ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE: Checks to see if the model for the specified ped has been loaded
FUNC BOOL HAS_PLAYER_PED_MODEL_LOADEDCLF(enumCharacterList ePed)
IF IS_PLAYER_PED_PLAYABLE(ePed)
RETURN HAS_MODEL_LOADED(GET_PLAYER_PED_MODELCLF(ePed))
ELSE
IF ePed <> NO_CHARACTER
#IF IS_DEBUG_BUILD
SCRIPT_ASSERT("HAS_PLAYER_PED_MODEL_LOADED - Ped is not a player character.")
PRINTSTRING("\nHAS_PLAYER_PED_MODEL_LOADED - Ped is not a player character.")PRINTNL()
#ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL HAS_PLAYER_PED_MODEL_LOADEDNRM(enumCharacterList ePed)
IF IS_PLAYER_PED_PLAYABLE(ePed)
RETURN HAS_MODEL_LOADED(GET_PLAYER_PED_MODELNRM(ePed))
ELSE
IF ePed <> NO_CHARACTER
#IF IS_DEBUG_BUILD
SCRIPT_ASSERT("HAS_PLAYER_PED_MODEL_LOADED - Ped is not a player character.")
PRINTSTRING("\nHAS_PLAYER_PED_MODEL_LOADED - Ped is not a player character.")PRINTNL()
#ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL HAS_PLAYER_PED_MODEL_LOADED(enumCharacterList ePed)
#if USE_CLF_DLC
if g_bLoadedClifford
return HAS_PLAYER_PED_MODEL_LOADEDCLF(ePed)
endif
#endif
#if USE_NRM_DLC
if g_bLoadedNorman
return HAS_PLAYER_PED_MODEL_LOADEDNRM(ePed)
endif
#endif
IF IS_PLAYER_PED_PLAYABLE(ePed)
RETURN HAS_MODEL_LOADED(GET_PLAYER_PED_MODEL(ePed))
ELSE
IF ePed <> NO_CHARACTER
#IF IS_DEBUG_BUILD
SCRIPT_ASSERT("HAS_PLAYER_PED_MODEL_LOADED - Ped is not a player character.")
PRINTSTRING("\nHAS_PLAYER_PED_MODEL_LOADED - Ped is not a player character.")PRINTNL()
#ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE: Marks the specified player peds model as no longer needed
PROC SET_PLAYER_PED_MODEL_AS_NO_LONGER_NEEDEDCLF(enumCharacterList ePed)
IF IS_PLAYER_PED_PLAYABLE(ePed)
SET_MODEL_AS_NO_LONGER_NEEDED(GET_PLAYER_PED_MODELCLF(ePed))
ELSE
IF ePed <> NO_CHARACTER
#IF IS_DEBUG_BUILD
SCRIPT_ASSERT("SET_PLAYER_PED_MODEL_AS_NO_LONGER_NEEDED CLF- Ped is not a player character.")
PRINTSTRING("\nSET_PLAYER_PED_MODEL_AS_NO_LONGER_NEEDED CLF- Ped is not a player character.")PRINTNL()
#ENDIF
ENDIF
ENDIF
ENDPROC
PROC SET_PLAYER_PED_MODEL_AS_NO_LONGER_NEEDEDNRM(enumCharacterList ePed)
IF IS_PLAYER_PED_PLAYABLE(ePed)
SET_MODEL_AS_NO_LONGER_NEEDED(GET_PLAYER_PED_MODELNRM(ePed))
ELSE
IF ePed <> NO_CHARACTER
#IF IS_DEBUG_BUILD
SCRIPT_ASSERT("SET_PLAYER_PED_MODEL_AS_NO_LONGER_NEEDED NRM - Ped is not a player character.")
PRINTSTRING("\nSET_PLAYER_PED_MODEL_AS_NO_LONGER_NEEDED NRM - Ped is not a player character.")PRINTNL()
#ENDIF
ENDIF
ENDIF
ENDPROC
PROC SET_PLAYER_PED_MODEL_AS_NO_LONGER_NEEDED(enumCharacterList ePed)
#if USE_CLF_DLC
if g_bLoadedClifford
SET_PLAYER_PED_MODEL_AS_NO_LONGER_NEEDEDCLF(ePed)
EXIT
endif
#endif
#if USE_NRM_DLC
if g_bLoadedNorman
SET_PLAYER_PED_MODEL_AS_NO_LONGER_NEEDEDNRM(ePed)
EXIT
endif
#endif
IF IS_PLAYER_PED_PLAYABLE(ePed)
SET_MODEL_AS_NO_LONGER_NEEDED(GET_PLAYER_PED_MODEL(ePed))
ELSE
IF ePed <> NO_CHARACTER
#IF IS_DEBUG_BUILD
SCRIPT_ASSERT("SET_PLAYER_PED_MODEL_AS_NO_LONGER_NEEDED - Ped is not a player character.")
PRINTSTRING("\nSET_PLAYER_PED_MODEL_AS_NO_LONGER_NEEDED - Ped is not a player character.")PRINTNL()
#ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE: Makes a request for the appropriate player vehicle model
PROC REQUEST_PLAYER_VEH_MODEL(enumCharacterList ePed, VEHICLE_CREATE_TYPE_ENUM eTypePreference = VEHICLE_TYPE_DEFAULT)
IF IS_PLAYER_PED_PLAYABLE(ePed)
REQUEST_MODEL(GET_PLAYER_VEH_MODEL(ePed, eTypePreference))
ELSE
IF ePed <> NO_CHARACTER
#IF IS_DEBUG_BUILD
SCRIPT_ASSERT("REQUEST_PLAYER_VEH_MODEL - Ped is not a player character.")
PRINTSTRING("\nREQUEST_PLAYER_VEH_MODEL - Ped is not a player character.")PRINTNL()
#ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE: Checks to see if the model for the specified ped vehicle has been loaded
FUNC BOOL HAS_PLAYER_VEH_MODEL_LOADED(enumCharacterList ePed, VEHICLE_CREATE_TYPE_ENUM eTypePreference = VEHICLE_TYPE_DEFAULT)
IF IS_PLAYER_PED_PLAYABLE(ePed)
RETURN HAS_MODEL_LOADED(GET_PLAYER_VEH_MODEL(ePed, eTypePreference))
ELSE
IF ePed <> NO_CHARACTER
#IF IS_DEBUG_BUILD
SCRIPT_ASSERT("HAS_PLAYER_VEH_MODEL_LOADED - Ped is not a player character.")
PRINTSTRING("\nHAS_PLAYER_VEH_MODEL_LOADED - Ped is not a player character.")PRINTNL()
#ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE: Marks the specified player vehicle model as no longer needed
PROC SET_PLAYER_VEH_MODEL_AS_NO_LONGER_NEEDED(enumCharacterList ePed, VEHICLE_CREATE_TYPE_ENUM eTypePreference = VEHICLE_TYPE_DEFAULT)
IF IS_PLAYER_PED_PLAYABLE(ePed)
SET_MODEL_AS_NO_LONGER_NEEDED(GET_PLAYER_VEH_MODEL(ePed, eTypePreference))
ELSE
IF ePed <> NO_CHARACTER
#IF IS_DEBUG_BUILD
SCRIPT_ASSERT("SET_PLAYER_VEH_MODEL_AS_NO_LONGER_NEEDED - Ped is not a player character.")
PRINTSTRING("\nSET_PLAYER_VEH_MODEL_AS_NO_LONGER_NEEDED - Ped is not a player character.")PRINTNL()
#ENDIF
ENDIF
ENDIF
ENDPROC
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// STORY PED DATA ///
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// PURPOSE: Returns the model enum for the specified story character
FUNC MODEL_NAMES GET_NPC_PED_MODEL(enumCharacterList ePed)
IF NOT IS_PLAYER_PED_PLAYABLE(ePed)
#if USE_CLF_DLC
RETURN g_savedGlobalsClifford.sCharSheetData.g_CharacterSheet[ePed].game_model
#endif
#if USE_NRM_DLC
RETURN g_savedGlobalsnorman.sCharSheetData.g_CharacterSheet[ePed].game_model
#endif
#if not USE_CLF_DLC
#if not USE_NRM_DLC
RETURN GLOBAL_CHARACTER_SHEET_GET_GAME_MODEL(ePed)
#endif
#endif
ELSE
IF ePed <> NO_CHARACTER
#IF IS_DEBUG_BUILD
SCRIPT_ASSERT("GET_NPC_PED_MODEL - Ped is not a story character.")
PRINTSTRING("\nGET_NPC_PED_MODEL - Ped is not a story character.")PRINTNL()
#ENDIF
ENDIF
ENDIF
RETURN DUMMY_MODEL_FOR_SCRIPT
ENDFUNC
/// PURPOSE: Returns the vehicle model enum for the specified story character
FUNC MODEL_NAMES GET_NPC_VEH_MODEL(enumCharacterList ePed, VEHICLE_CREATE_TYPE_ENUM eTypePreference = VEHICLE_TYPE_DEFAULT)
IF NOT IS_PLAYER_PED_PLAYABLE(ePed)
PED_VEH_DATA_STRUCT sData
GET_NPC_VEH_DATA(ePed, sData, eTypePreference)
RETURN sData.model
ELSE
IF ePed <> NO_CHARACTER
#IF IS_DEBUG_BUILD
SCRIPT_ASSERT("GET_NPC_VEH_MODEL - Ped is not a story character.")
PRINTSTRING("\nGET_NPC_VEH_MODEL - Ped is not a story character.")PRINTNL()
#ENDIF
ENDIF
ENDIF
RETURN DUMMY_MODEL_FOR_SCRIPT
ENDFUNC
/// PURPOSE: Makes a request for the appropriate story ped model
PROC REQUEST_NPC_PED_MODEL(enumCharacterList ePed)
IF NOT IS_PLAYER_PED_PLAYABLE(ePed)
REQUEST_MODEL(GET_NPC_PED_MODEL(ePed))
ELSE
IF ePed <> NO_CHARACTER
#IF IS_DEBUG_BUILD
SCRIPT_ASSERT("REQUEST_NPC_PED_MODEL - Ped is not a story character.")
PRINTSTRING("\nREQUEST_NPC_PED_MODEL - Ped is not a story character.")PRINTNL()
#ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE: Checks to see if the model for the specified ped has been loaded
FUNC BOOL HAS_NPC_PED_MODEL_LOADED(enumCharacterList ePed)
IF NOT IS_PLAYER_PED_PLAYABLE(ePed)
RETURN HAS_MODEL_LOADED(GET_NPC_PED_MODEL(ePed))
ELSE
IF ePed <> NO_CHARACTER
#IF IS_DEBUG_BUILD
SCRIPT_ASSERT("HAS_NPC_PED_MODEL_LOADED - Ped is not a story character.")
PRINTSTRING("\nHAS_NPC_PED_MODEL_LOADED - Ped is not a story character.")PRINTNL()
#ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE: Marks the specified story peds model as no longer needed
PROC SET_NPC_PED_MODEL_AS_NO_LONGER_NEEDED(enumCharacterList ePed)
IF NOT IS_PLAYER_PED_PLAYABLE(ePed)
SET_MODEL_AS_NO_LONGER_NEEDED(GET_NPC_PED_MODEL(ePed))
ELSE
IF ePed <> NO_CHARACTER
#IF IS_DEBUG_BUILD
SCRIPT_ASSERT("SET_NPC_PED_MODEL_AS_NO_LONGER_NEEDED - Ped is not a story character.")
PRINTSTRING("\nSET_NPC_PED_MODEL_AS_NO_LONGER_NEEDED - Ped is not a story character.")PRINTNL()
#ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE: Returns the story ped enum based on the specified peds model
FUNC enumCharacterList GET_NPC_PED_ENUM(PED_INDEX ped)
IF DOES_ENTITY_EXIST(ped)
INT i
MODEL_NAMES ePedModel = GET_ENTITY_MODEL(ped)
INT iMaxCharacter = ENUM_TO_INT(GLOBAL_CHARACTER_SHEET_GET_MAX_CHARACTERS_FOR_GAMEMODE()) - 1
FOR i = NUM_OF_PLAYABLE_PEDS TO iMaxCharacter
IF GET_NPC_PED_MODEL(INT_TO_ENUM(enumCharacterList, i)) = ePedModel
RETURN (INT_TO_ENUM(enumCharacterList, i))
ENDIF
ENDFOR
ENDIF
RETURN NO_CHARACTER
ENDFUNC
/// PURPOSE: Makes a request for the appropriate story peds vehicle model
PROC REQUEST_NPC_VEH_MODEL(enumCharacterList ePed, VEHICLE_CREATE_TYPE_ENUM eTypePreference = VEHICLE_TYPE_DEFAULT)
IF NOT IS_PLAYER_PED_PLAYABLE(ePed)
REQUEST_MODEL(GET_NPC_VEH_MODEL(ePed, eTypePreference))
ELSE
IF ePed <> NO_CHARACTER
#IF IS_DEBUG_BUILD
SCRIPT_ASSERT("REQUEST_NPC_VEH_MODEL - Ped is not a story character.")
PRINTSTRING("\nREQUEST_NPC_VEH_MODEL - Ped is not a story character.")PRINTNL()
#ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE: Checks to see if the model for the specified story peds vehicle has been loaded
FUNC BOOL HAS_NPC_VEH_MODEL_LOADED(enumCharacterList ePed, VEHICLE_CREATE_TYPE_ENUM eTypePreference = VEHICLE_TYPE_DEFAULT)
IF NOT IS_PLAYER_PED_PLAYABLE(ePed)
RETURN HAS_MODEL_LOADED(GET_NPC_VEH_MODEL(ePed, eTypePreference))
ELSE
IF ePed <> NO_CHARACTER
#IF IS_DEBUG_BUILD
SCRIPT_ASSERT("HAS_NPC_VEH_MODEL_LOADED - Ped is not a story character.")
PRINTSTRING("\nHAS_NPC_VEH_MODEL_LOADED - Ped is not a story character.")PRINTNL()
#ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE: Marks the specified story peds vehicle model as no longer needed
PROC SET_NPC_VEH_MODEL_AS_NO_LONGER_NEEDED(enumCharacterList ePed, VEHICLE_CREATE_TYPE_ENUM eTypePreference = VEHICLE_TYPE_DEFAULT)
IF NOT IS_PLAYER_PED_PLAYABLE(ePed)
SET_MODEL_AS_NO_LONGER_NEEDED(GET_NPC_VEH_MODEL(ePed, eTypePreference))
ELSE
IF ePed <> NO_CHARACTER
#IF IS_DEBUG_BUILD
SCRIPT_ASSERT("SET_NPC_VEH_MODEL_AS_NO_LONGER_NEEDED - Ped is not a story character.")
PRINTSTRING("\nSET_NPC_VEH_MODEL_AS_NO_LONGER_NEEDED - Ped is not a story character.")PRINTNL()
#ENDIF
ENDIF
ENDIF
ENDPROC
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// PED CHECKS ///
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// PURPOSE: Returns true if the player is using the clothes shop or wardrobe to change clothes.
FUNC BOOL IS_PLAYER_CHANGING_CLOTHES()
RETURN g_bPlayerIsChangingClothes
ENDFUNC
/// PURPOSE: Updates the global which states if the player is currently changing their clothes
PROC SET_PLAYER_IS_CHANGING_CLOTHES(BOOL bChangingClothes)
PRINTLN("SET_PLAYER_IS_CHANGING_CLOTHES(", bChangingClothes, ") called by ", GET_THIS_SCRIPT_NAME())
IF NOT bChangingClothes AND g_bPlayerIsChangingClothes
PRINTLN("...telling mission triggerer to refresh any lead-in scenes at trigger locations.")
g_bCleanupTriggerScene = TRUE
IF NETWORK_IS_GAME_IN_PROGRESS()
Start_Export_Player_Headshot_Timer()
ENDIF
ENDIF
g_bPlayerIsChangingClothes = bChangingClothes
ENDPROC
PROC SET_PLAYER_HAS_JUST_CHANGED_CLOTHES()
enumCharacterList ePed = GET_PLAYER_PED_ENUM(PLAYER_PED_ID())
IF IS_PLAYER_PED_PLAYABLE(ePed)
#if USE_CLF_DLC
g_savedGlobalsClifford.sPlayerData.sInfo.sLastTimeWeChangedClothes[ePed] = GET_CURRENT_TIMEOFDAY()
TEXT_LABEL_63 tLastChangedOutfits
#IF IS_DEBUG_BUILD
tLastChangedOutfits = TIMEOFDAY_TO_TEXT_LABEL(g_savedGlobalsClifford.sPlayerData.sInfo.sLastTimeWeChangedClothes[ePed])
#ENDIF
#endif
#if USE_NRM_DLC
g_savedGlobalsnorman.sPlayerData.sInfo.sLastTimeWeChangedClothes[ePed] = GET_CURRENT_TIMEOFDAY()
TEXT_LABEL_63 tLastChangedOutfits
#IF IS_DEBUG_BUILD
tLastChangedOutfits = TIMEOFDAY_TO_TEXT_LABEL(g_savedGlobalsnorman.sPlayerData.sInfo.sLastTimeWeChangedClothes[ePed])
#ENDIF
#endif
#if not USE_CLF_DLC
#if not USE_NRM_DLC
g_savedGlobals.sPlayerData.sInfo.sLastTimeWeChangedClothes[ePed] = GET_CURRENT_TIMEOFDAY()
TEXT_LABEL_63 tLastChangedOutfits
#IF IS_DEBUG_BUILD
tLastChangedOutfits = TIMEOFDAY_TO_TEXT_LABEL(g_savedGlobals.sPlayerData.sInfo.sLastTimeWeChangedClothes[ePed])
#ENDIF
#endif
#endif
PRINTLN("g_sLastTimeWeChangedClothes[", GET_PLAYER_PED_STRING(ePed), "] set to ", tLastChangedOutfits)
ELSE
PRINTLN("g_sLastTimeWeChangedClothes[", GET_PLAYER_PED_STRING(ePed), "] invalid.")
ENDIF
ENDPROC
FUNC TIMEOFDAY GET_TIME_PLAYER_PED_LAST_CHANGED_CLOTHES(enumCharacterList ePed)
IF IS_PLAYER_PED_PLAYABLE(ePed)
#if USE_CLF_DLC
RETURN g_savedGlobalsClifford.sPlayerData.sInfo.sLastTimeWeChangedClothes[ePed]
#endif
#if USE_NRM_DLC
RETURN g_savedGlobalsnorman.sPlayerData.sInfo.sLastTimeWeChangedClothes[ePed]
#endif
#if not USE_CLF_DLC
#if not USE_NRM_DLC
RETURN g_savedGlobals.sPlayerData.sInfo.sLastTimeWeChangedClothes[ePed]
#endif
#endif
ENDIF
RETURN INVALID_TIMEOFDAY
ENDFUNC
CONST_INT iCONST_RealtimeHoursToWaitToChangeClothes 10
FUNC BOOL HAVE_REALTIME_HOURS_PASSED_SINCE_PED_LAST_CHANGED_CLOTHES(enumCharacterList ePed, INT iRealtimeHoursToWaitToChangeClothes = iCONST_RealtimeHoursToWaitToChangeClothes)
IF iRealtimeHoursToWaitToChangeClothes > 0
TIMEOFDAY sLastChangedOutfits = GET_TIME_PLAYER_PED_LAST_CHANGED_CLOTHES(ePed)
IF Is_TIMEOFDAY_Valid(sLastChangedOutfits)
#IF IS_DEBUG_BUILD
TEXT_LABEL_63 tLastChangedOutfits = TIMEOFDAY_TO_TEXT_LABEL(sLastChangedOutfits)
INT iSeconds, iMinutes, iHours, iDays, iMonths, iYears
GET_DIFFERENCE_BETWEEN_NOW_AND_TIMEOFDAY(sLastChangedOutfits, iSeconds, iMinutes, iHours, iDays, iMonths, iYears)
#ENDIF
INT iGameHoursToWaitToChangeClothes = iRealtimeHoursToWaitToChangeClothes * 30
IF NOT HasNumOfHoursPassedSincePedTimeStruct(sLastChangedOutfits, iGameHoursToWaitToChangeClothes)
#IF IS_DEBUG_BUILD
CPRINTLN(DEBUG_PED_COMP,"dont change outfits - not enough time has passed since [",
GET_PLAYER_PED_STRING(ePed),
"] clothes changed [", tLastChangedOutfits, ", ",
iMinutes, "m ", iHours, "h ",
iDays, "d ", iMonths+(iYears*12), "m / ",
iGameHoursToWaitToChangeClothes, "gamehrs]")
#ENDIF
RETURN FALSE
ELSE
#IF IS_DEBUG_BUILD
CPRINTLN(DEBUG_PED_COMP, "allow change outfits - g_iLastTimeWeChangedClothes[",
GET_PLAYER_PED_STRING(ePed), "] enough time has passed [",
tLastChangedOutfits, ", ",
iMinutes, "m ", iHours, "h ",
iDays, "d ", iMonths+(iYears*12), "m / ",
iGameHoursToWaitToChangeClothes, "gamehrs]")
#ENDIF
ENDIF
ELSE
CPRINTLN(DEBUG_PED_COMP, "allow change outfits - g_iLastTimeWeChangedClothes[", GET_PLAYER_PED_STRING(ePed), "] is null")
ENDIF
ELSE
CPRINTLN(DEBUG_PED_COMP, "allow change outfits - bypass hour check")
ENDIF
RETURN TRUE
ENDFUNC
PROC SET_PLAYER_HAS_JUST_CHANGED_HAIRDO()
enumCharacterList ePed = GET_PLAYER_PED_ENUM(PLAYER_PED_ID())
IF IS_PLAYER_PED_PLAYABLE(ePed)
#if USE_CLF_DLC
g_savedGlobalsClifford.sPlayerData.sInfo.iLastTimeWeChangedHairdo[ePed] = GET_GAME_TIMER()
PRINTLN("<CLF>g_iLastTimeWeChangedHairdo[", GET_PLAYER_PED_STRING(ePed), "] set to ", g_savedGlobalsClifford.sPlayerData.sInfo.iLastTimeWeChangedHairdo[ePed])
#endif
#if USE_NRM_DLC
g_savedGlobalsnorman.sPlayerData.sInfo.iLastTimeWeChangedHairdo[ePed] = GET_GAME_TIMER()
PRINTLN("<NRM>g_iLastTimeWeChangedHairdo[", GET_PLAYER_PED_STRING(ePed), "] set to ", g_savedGlobalsnorman.sPlayerData.sInfo.iLastTimeWeChangedHairdo[ePed])
#endif
#if not USE_CLF_DLC
#if not use_NRM_DLC
g_savedGlobals.sPlayerData.sInfo.iLastTimeWeChangedHairdo[ePed] = GET_GAME_TIMER()
PRINTLN("g_iLastTimeWeChangedHairdo[", GET_PLAYER_PED_STRING(ePed), "] set to ", g_savedGlobals.sPlayerData.sInfo.iLastTimeWeChangedHairdo[ePed])
#endif
#endif
ELSE
PRINTLN("g_iLastTimeWeChangedHairdo[", GET_PLAYER_PED_STRING(ePed), "] invalid.")
ENDIF
ENDPROC
FUNC INT GET_TIME_PLAYER_PED_LAST_CHANGED_HAIRDO(enumCharacterList ePed)
IF IS_PLAYER_PED_PLAYABLE(ePed)
#if USE_CLF_DLC
RETURN g_savedGlobalsClifford.sPlayerData.sInfo.iLastTimeWeChangedHairdo[ePed]
#endif
#if USE_NRM_DLC
RETURN g_savedGlobalsnorman.sPlayerData.sInfo.iLastTimeWeChangedHairdo[ePed]
#endif
#if not USE_CLF_DLC
#if not use_NRM_DLC
RETURN g_savedGlobals.sPlayerData.sInfo.iLastTimeWeChangedHairdo[ePed]
#endif
#endif
ENDIF
RETURN -1
ENDFUNC
PROC SET_PLAYER_HAS_JUST_GOT_TATTOO()
enumCharacterList ePed = GET_PLAYER_PED_ENUM(PLAYER_PED_ID())
IF IS_PLAYER_PED_PLAYABLE(ePed)
#if USE_CLF_DLC
g_savedGlobalsClifford.sPlayerData.sInfo.iLastTimeWeGotTattoo[ePed] = GET_GAME_TIMER()
PRINTLN("<CLF>g_iLastTimeWeGotTattoo[", GET_PLAYER_PED_STRING(ePed), "] set to ", g_savedGlobalsClifford.sPlayerData.sInfo.iLastTimeWeGotTattoo[ePed])
#endif
#if USE_NRM_DLC
g_savedGlobalsnorman.sPlayerData.sInfo.iLastTimeWeGotTattoo[ePed] = GET_GAME_TIMER()
PRINTLN("<NRM>g_iLastTimeWeGotTattoo[", GET_PLAYER_PED_STRING(ePed), "] set to ", g_savedGlobalsnorman.sPlayerData.sInfo.iLastTimeWeGotTattoo[ePed])
#endif
#if not USE_CLF_DLC
#if not USE_NRM_DLC
g_savedGlobals.sPlayerData.sInfo.iLastTimeWeGotTattoo[ePed] = GET_GAME_TIMER()
PRINTLN("g_iLastTimeWeGotTattoo[", GET_PLAYER_PED_STRING(ePed), "] set to ", g_savedGlobals.sPlayerData.sInfo.iLastTimeWeGotTattoo[ePed])
#endif
#endif
ELSE
PRINTLN("g_iLastTimeWeGotTattoo[", GET_PLAYER_PED_STRING(ePed), "] invalid.")
ENDIF
ENDPROC
FUNC INT GET_TIME_PLAYER_PED_LAST_GOT_TATTOO(enumCharacterList ePed)
IF IS_PLAYER_PED_PLAYABLE(ePed)
#if USE_CLF_DLC
RETURN g_savedGlobalsClifford.sPlayerData.sInfo.iLastTimeWeGotTattoo[ePed]
#endif
#if USE_NRM_DLC
RETURN g_savedGlobalsnorman.sPlayerData.sInfo.iLastTimeWeGotTattoo[ePed]
#endif
#if not USE_CLF_DLC
#if not USE_NRM_DLC
RETURN g_savedGlobals.sPlayerData.sInfo.iLastTimeWeGotTattoo[ePed]
#endif
#endif
ENDIF
RETURN -1
ENDFUNC
/// PURPOSE: Returns TRUE if the default ped info has been set for each player character
FUNC BOOL HAS_DEFAULT_INFO_BEEN_SET()
#if USE_CLF_DLC
RETURN g_savedGlobalsClifford.sPlayerData.sInfo.bDefaultInfoSet
#endif
#if USE_NRM_DLC
RETURN g_savedGlobalsnorman.sPlayerData.sInfo.bDefaultInfoSet
#endif
#if not USE_CLF_DLC
#if not USE_NRM_DLC
RETURN g_savedGlobals.sPlayerData.sInfo.bDefaultInfoSet
#endif
#endif
ENDFUNC
/// PURPOSE: Sets the global flag that states if a player character is currently available
PROC SET_PLAYER_PED_AVAILABLE(enumCharacterList ePed, BOOL bAvailable)
IF IS_PLAYER_PED_PLAYABLE(ePed)
#if USE_CLF_DLC
g_savedGlobalsClifford.sPlayerData.sInfo.bPedAvailable[ePed] = bAvailable
#endif
#if USE_NRM_DLC
g_savedGlobalsnorman.sPlayerData.sInfo.bPedAvailable[ePed] = bAvailable
#endif
#if not USE_CLF_DLC
#if not USE_NRM_DLC
g_SavedGlobals.sPlayerData.sInfo.bPedAvailable[ePed] = bAvailable
#endif
#endif
ENDIF
ENDPROC
/// PURPOSE: Returns TRUE if the specified player is available at this point in the game
FUNC BOOL IS_PLAYER_PED_AVAILABLE(enumCharacterList ePed)
IF IS_PLAYER_PED_PLAYABLE(ePed)
#if USE_CLF_DLC
IF g_savedGlobalsClifford.sFlow.isGameflowActive
OR IS_REPEAT_PLAY_ACTIVE() // this is also needed for repeat play
RETURN g_savedGlobalsClifford.sPlayerData.sInfo.bPedAvailable[ePed]
ELSE
RETURN TRUE
ENDIF
#endif
#if USE_NRM_DLC
IF g_savedGlobalsnorman.sFlow.isGameflowActive
OR IS_REPEAT_PLAY_ACTIVE() // this is also needed for repeat play
RETURN g_savedGlobalsnorman.sPlayerData.sInfo.bPedAvailable[ePed]
ELSE
RETURN TRUE
ENDIF
#endif
#if not USE_CLF_DLC
#if not USE_NRM_DLC
IF g_savedGlobals.sFlow.isGameflowActive
OR g_bMagDemoActive
OR IS_REPEAT_PLAY_ACTIVE() // this is also needed for repeat play
RETURN g_SavedGlobals.sPlayerData.sInfo.bPedAvailable[ePed]
ELSE
RETURN TRUE
ENDIF
#endif
#endif
ELSE
RETURN FALSE
ENDIF
ENDFUNC
/// PURPOSE: Sets the current ped global enum based on the player model
/// NOTE: If this proc gets called too many times per frame then perhaps we should consider another method...
PROC UPDATE_CURRENT_PLAYER_PED_ENUMCLF()
IF DOES_ENTITY_EXIST(PLAYER_PED_ID())
IF GET_PLAYER_PED_MODELCLF(g_savedGlobalsClifford.sPlayerData.sInfo.eCurrentPed) <> GET_ENTITY_MODEL(PLAYER_PED_ID())
enumCharacterList ePed = GET_PLAYER_PED_ENUMCLF(PLAYER_PED_ID())
IF IS_PLAYER_PED_PLAYABLE(ePed)
// Keep track of the previous player ped
IF g_savedGlobalsClifford.sPlayerData.sInfo.eCurrentPed <> ePed
AND IS_PLAYER_PED_PLAYABLE(g_savedGlobalsClifford.sPlayerData.sInfo.eCurrentPed)
g_savedGlobalsClifford.sPlayerData.sInfo.ePreviousPed = g_savedGlobalsClifford.sPlayerData.sInfo.eCurrentPed
ENDIF
g_savedGlobalsClifford.sPlayerData.sInfo.eLastKnownPed = ePed
g_savedGlobalsClifford.sPlayerData.sInfo.eCurrentPed = ePed
EXIT
ENDIF
ELSE
g_savedGlobalsClifford.sPlayerData.sInfo.eLastKnownPed = g_savedGlobalsClifford.sPlayerData.sInfo.eCurrentPed
EXIT
ENDIF
ENDIF
// Ped model not player ped
g_savedGlobalsClifford.sPlayerData.sInfo.eCurrentPed = NO_CHARACTER
ENDPROC
PROC UPDATE_CURRENT_PLAYER_PED_ENUMNRM()
IF DOES_ENTITY_EXIST(PLAYER_PED_ID())
IF GET_PLAYER_PED_MODELNRM(g_savedGlobalsnorman.sPlayerData.sInfo.eCurrentPed) <> GET_ENTITY_MODEL(PLAYER_PED_ID())
enumCharacterList ePed = GET_PLAYER_PED_ENUMNRM(PLAYER_PED_ID())
IF IS_PLAYER_PED_PLAYABLE(ePed)
// Keep track of the previous player ped
IF g_savedGlobalsnorman.sPlayerData.sInfo.eCurrentPed <> ePed
AND IS_PLAYER_PED_PLAYABLE(g_savedGlobalsnorman.sPlayerData.sInfo.eCurrentPed)
g_savedGlobalsnorman.sPlayerData.sInfo.ePreviousPed = g_savedGlobalsnorman.sPlayerData.sInfo.eCurrentPed
ENDIF
g_savedGlobalsnorman.sPlayerData.sInfo.eLastKnownPed = ePed
g_savedGlobalsnorman.sPlayerData.sInfo.eCurrentPed = ePed
EXIT
ENDIF
ELSE
g_savedGlobalsnorman.sPlayerData.sInfo.eLastKnownPed = g_savedGlobalsnorman.sPlayerData.sInfo.eCurrentPed
EXIT
ENDIF
ENDIF
// Ped model not player ped
g_savedGlobalsnorman.sPlayerData.sInfo.eCurrentPed = NO_CHARACTER
ENDPROC
PROC UPDATE_CURRENT_PLAYER_PED_ENUM()
#if USE_CLF_DLC
if g_bLoadedClifford
UPDATE_CURRENT_PLAYER_PED_ENUMCLF()
EXIT
endif
#endif
#if USE_NRM_DLC
if g_bLoadedNorman
UPDATE_CURRENT_PLAYER_PED_ENUMNRM()
EXIT
endif
#endif
IF DOES_ENTITY_EXIST(PLAYER_PED_ID())
IF GET_PLAYER_PED_MODEL(g_savedGlobals.sPlayerData.sInfo.eCurrentPed) <> GET_ENTITY_MODEL(PLAYER_PED_ID())
enumCharacterList ePed = GET_PLAYER_PED_ENUM(PLAYER_PED_ID())
IF IS_PLAYER_PED_PLAYABLE(ePed)
#IF FEATURE_SP_DLC_DIRECTOR_MODE
AND (NOT IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_DIRECTOR) OR g_bDirectorForceSaveData)
#ENDIF
// Keep track of the previous player ped
IF g_savedGlobals.sPlayerData.sInfo.eCurrentPed <> ePed
AND IS_PLAYER_PED_PLAYABLE(g_savedGlobals.sPlayerData.sInfo.eCurrentPed)
g_savedGlobals.sPlayerData.sInfo.ePreviousPed = g_savedGlobals.sPlayerData.sInfo.eCurrentPed
ENDIF
g_savedGlobals.sPlayerData.sInfo.eLastKnownPed = ePed
g_savedGlobals.sPlayerData.sInfo.eCurrentPed = ePed
EXIT
ENDIF
ELSE
IF g_savedGlobals.sPlayerData.sInfo.eCurrentPed <> NO_CHARACTER
g_savedGlobals.sPlayerData.sInfo.eLastKnownPed = g_savedGlobals.sPlayerData.sInfo.eCurrentPed
ENDIF
EXIT
ENDIF
ENDIF
// Ped model not player ped
g_savedGlobals.sPlayerData.sInfo.eCurrentPed = NO_CHARACTER
ENDPROC
/// PURPOSE: Sets the front end blip name for the current player
PROC UPDATE_PLAYER_PED_BLIP_NAME()
UPDATE_CURRENT_PLAYER_PED_ENUM()
BLIP_INDEX playerBlip = GET_MAIN_PLAYER_BLIP_ID()
IF DOES_BLIP_EXIST(playerBlip)
#if USE_CLF_DLC
IF g_savedGlobalsClifford.sPlayerData.sInfo.eCurrentPed = CHAR_MICHAEL
PRINTLN("UPDATE_PLAYER_PED_BLIP_NAME - setting blip name to BLIP_MICHAEL")
SET_BLIP_NAME_FROM_TEXT_FILE(playerBlip, "BLIP_MICHAEL")
ELIF g_savedGlobalsClifford.sPlayerData.sInfo.eCurrentPed = CHAR_FRANKLIN
PRINTLN("UPDATE_PLAYER_PED_BLIP_NAME - setting blip name to BLIP_FRANKLIN")
SET_BLIP_NAME_FROM_TEXT_FILE(playerBlip, "BLIP_FRANKLIN")
ELIF g_savedGlobalsClifford.sPlayerData.sInfo.eCurrentPed = CHAR_TREVOR
PRINTLN("UPDATE_PLAYER_PED_BLIP_NAME - setting blip name to BLIP_TREV")
SET_BLIP_NAME_FROM_TEXT_FILE(playerBlip, "BLIP_TREV")
ELSE
PRINTLN("UPDATE_PLAYER_PED_BLIP_NAME - setting blip name to BLIP_PLAYER")
SET_BLIP_NAME_FROM_TEXT_FILE(playerBlip, "BLIP_PLAYER")
ENDIF
#endif
#if USE_NRM_DLC
IF g_savedGlobalsnorman.sPlayerData.sInfo.eCurrentPed = CHAR_MICHAEL
PRINTLN("UPDATE_PLAYER_PED_BLIP_NAME - setting blip name to BLIP_MICHAEL")
SET_BLIP_NAME_FROM_TEXT_FILE(playerBlip, "BLIP_MICHAEL")
ELIF g_savedGlobalsnorman.sPlayerData.sInfo.eCurrentPed = CHAR_NRM_JIMMY
PRINTLN("UPDATE_PLAYER_PED_BLIP_NAME - setting blip name to BLIP_FRANKLIN")
SET_BLIP_NAME_FROM_TEXT_FILE(playerBlip, "BLIP_FRANKLIN")
ELIF g_savedGlobalsnorman.sPlayerData.sInfo.eCurrentPed = CHAR_NRM_TRACEY
PRINTLN("UPDATE_PLAYER_PED_BLIP_NAME - setting blip name to BLIP_TREV")
SET_BLIP_NAME_FROM_TEXT_FILE(playerBlip, "BLIP_TREV")
ELSE
PRINTLN("UPDATE_PLAYER_PED_BLIP_NAME - setting blip name to BLIP_PLAYER")
SET_BLIP_NAME_FROM_TEXT_FILE(playerBlip, "BLIP_PLAYER")
ENDIF
#endif
#if not USE_CLF_DLC
#if not USE_NRM_DLC
enumCharacterList eCurrentChar = g_savedGlobals.sPlayerData.sInfo.eCurrentPed
//B* 2218640: For Director mode, consider the last player ped
IF IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_DIRECTOR)
eCurrentChar = GET_PLAYER_PED_ENUM(PLAYER_PED_ID())
ENDIF
IF eCurrentChar = CHAR_MICHAEL
PRINTLN("UPDATE_PLAYER_PED_BLIP_NAME - setting blip name to BLIP_MICHAEL")
SET_BLIP_NAME_FROM_TEXT_FILE(playerBlip, "BLIP_MICHAEL")
ELIF eCurrentChar = CHAR_FRANKLIN
PRINTLN("UPDATE_PLAYER_PED_BLIP_NAME - setting blip name to BLIP_FRANKLIN")
SET_BLIP_NAME_FROM_TEXT_FILE(playerBlip, "BLIP_FRANKLIN")
ELIF eCurrentChar = CHAR_TREVOR
PRINTLN("UPDATE_PLAYER_PED_BLIP_NAME - setting blip name to BLIP_TREV")
SET_BLIP_NAME_FROM_TEXT_FILE(playerBlip, "BLIP_TREV")
ELSE
PRINTLN("UPDATE_PLAYER_PED_BLIP_NAME - setting blip name to BLIP_PLAYER")
SET_BLIP_NAME_FROM_TEXT_FILE(playerBlip, "BLIP_PLAYER")
ENDIF
#endif
#endif
ELSE
PRINTLN("UPDATE_PLAYER_PED_BLIP_NAME - failed to set blip name")
#IF IS_DEBUG_BUILD
SCRIPT_ASSERT("UPDATE_PLAYER_PED_BLIP_NAME: GET_MAIN_PLAYER_BLIP_ID() returned invalud blip ID. Tell Kenneth R.")
#ENDIF
ENDIF
ENDPROC
PROC UPDATE_TREVOR_BIKE_GANG_STATUS(enumCharacterList ePed)
//RELATIONSHIP_TYPE OldRel = GET_RELATIONSHIP_BETWEEN_GROUPS(RELGROUPHASH_PLAYER, RELGROUPHASH_AMBIENT_GANG_LOST)
IF ePed = CHAR_TREVOR
IF NOT IS_CURRENTLY_ON_MISSION_TO_TYPE()
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_HATE, RELGROUPHASH_PLAYER, RELGROUPHASH_AMBIENT_GANG_LOST)
ELSE
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_DISLIKE, RELGROUPHASH_PLAYER, RELGROUPHASH_AMBIENT_GANG_LOST)
ENDIF
ELSE
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_IGNORE, RELGROUPHASH_PLAYER, RELGROUPHASH_AMBIENT_GANG_LOST)
ENDIF
ENDPROC
/// PURPOSE: Configures any ambient relationships that differ between playable characters.
PROC UPDATE_PLAYER_CHARACTER_RELATIONSHIPS(enumCharacterList ePlayerChar)
SWITCH ePlayerChar
CASE CHAR_MICHAEL
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_NONE, RELGROUPHASH_AMBIENT_GANG_FAMILY, RELGROUPHASH_PLAYER)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_IGNORE, RELGROUPHASH_PLAYER, RELGROUPHASH_AMBIENT_GANG_LOST)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_NONE, RELGROUPHASH_AMBIENT_GANG_LOST, RELGROUPHASH_PLAYER)
//Jimmy, Tracey, Amanda, Maid, Gardener
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE, RELGROUPHASH_FAMILY_M, RELGROUPHASH_PLAYER)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE, RELGROUPHASH_PLAYER, RELGROUPHASH_FAMILY_M)
//Denise, Lamar Stretch
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE, RELGROUPHASH_FAMILY_F, RELGROUPHASH_PLAYER)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE, RELGROUPHASH_PLAYER, RELGROUPHASH_FAMILY_F)
//Ron, Patricia, Floyd
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE, RELGROUPHASH_FAMILY_T, RELGROUPHASH_PLAYER)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE, RELGROUPHASH_PLAYER, RELGROUPHASH_FAMILY_T)
BREAK
CASE CHAR_FRANKLIN
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE, RELGROUPHASH_AMBIENT_GANG_FAMILY, RELGROUPHASH_PLAYER)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_IGNORE, RELGROUPHASH_PLAYER, RELGROUPHASH_AMBIENT_GANG_LOST)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_NONE, RELGROUPHASH_AMBIENT_GANG_LOST, RELGROUPHASH_PLAYER)
//Jimmy, Tracey, Amanda, Maid, Gardener
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE, RELGROUPHASH_FAMILY_M, RELGROUPHASH_PLAYER)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE, RELGROUPHASH_PLAYER, RELGROUPHASH_FAMILY_M)
//Denise, Lamar Stretch
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE, RELGROUPHASH_FAMILY_F, RELGROUPHASH_PLAYER)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE, RELGROUPHASH_PLAYER, RELGROUPHASH_FAMILY_F)
//Ron, Patricia, Floyd
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE, RELGROUPHASH_FAMILY_T, RELGROUPHASH_PLAYER)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE, RELGROUPHASH_PLAYER, RELGROUPHASH_FAMILY_T)
BREAK
CASE CHAR_TREVOR
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_NONE, RELGROUPHASH_AMBIENT_GANG_FAMILY, RELGROUPHASH_PLAYER)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_HATE, RELGROUPHASH_PLAYER, RELGROUPHASH_AMBIENT_GANG_LOST)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_HATE, RELGROUPHASH_AMBIENT_GANG_LOST, RELGROUPHASH_PLAYER)
//Jimmy, Tracey, Amanda, Maid, Gardener
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE, RELGROUPHASH_FAMILY_M, RELGROUPHASH_PLAYER)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE, RELGROUPHASH_PLAYER, RELGROUPHASH_FAMILY_M)
//Denise, Lamar Stretch
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE, RELGROUPHASH_FAMILY_F, RELGROUPHASH_PLAYER)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE, RELGROUPHASH_PLAYER, RELGROUPHASH_FAMILY_F)
//Ron, Patricia, Floyd
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE, RELGROUPHASH_FAMILY_T, RELGROUPHASH_PLAYER)
SET_RELATIONSHIP_BETWEEN_GROUPS(ACQUAINTANCE_TYPE_PED_LIKE, RELGROUPHASH_PLAYER, RELGROUPHASH_FAMILY_T)
BREAK
DEFAULT
SCRIPT_ASSERT("SETUP_CHARACTER_SPECIFIC_PLAYER_RELATIONSHIPS: Player char enum was not a playable character!")
BREAK
ENDSWITCH
ENDPROC
/// PURPOSE: Returns the name of the player characters timecycle modifier
FUNC STRING GET_PLAYER_PED_TIMECYCLE_MODIFIER(enumCharacterList ePed)
ePed = ePed
RETURN "" //#1570413
// ## // ## // ## //
// IF ePed = CHAR_MICHAEL
// RETURN "micheal"
// ELIF ePed = CHAR_FRANKLIN
// RETURN "micheal" // Asked to use Michaels for now
// //RETURN "franklin"
// ELIF ePed = CHAR_TREVOR
// RETURN "micheal" // Asked to use Michaels for now
// //RETURN "trevor"
// ENDIF
//
// RETURN ""
ENDFUNC
PROC UPDATE_PLAYER_PED_TIMECYCLE_MODIFIER()
IF g_bUseCharacterFilters
UPDATE_CURRENT_PLAYER_PED_ENUM()
#if USE_CLF_DLC
SET_NEXT_PLAYER_TCMODIFIER(GET_PLAYER_PED_TIMECYCLE_MODIFIER(g_savedGlobalsClifford.sPlayerData.sInfo.eCurrentPed))
#endif
#if USE_NRM_DLC
SET_NEXT_PLAYER_TCMODIFIER(GET_PLAYER_PED_TIMECYCLE_MODIFIER(g_savedGlobalsnorman.sPlayerData.sInfo.eCurrentPed))
#endif
#if not USE_CLF_DLC
#if not USE_NRM_DLC
SET_NEXT_PLAYER_TCMODIFIER(GET_PLAYER_PED_TIMECYCLE_MODIFIER(g_savedGlobals.sPlayerData.sInfo.eCurrentPed))
#endif
#endif
ELSE
SET_NEXT_PLAYER_TCMODIFIER("")
ENDIF
ENDPROC
/// PURPOSE: Returns TRUE if the specified ped enum matches the current player ped enum
FUNC BOOL IS_PED_THE_CURRENT_PLAYER_PED(enumCharacterList ePed)
#if USE_CLF_DLC
if g_bLoadedClifford
UPDATE_CURRENT_PLAYER_PED_ENUMCLF()
RETURN (ePed = g_savedGlobalsClifford.sPlayerData.sInfo.eCurrentPed)
endif
#endif
#if USE_NRM_DLC
if g_bLoadedNorman
UPDATE_CURRENT_PLAYER_PED_ENUMNRM()
RETURN (ePed = g_savedGlobalsnorman.sPlayerData.sInfo.eCurrentPed)
endif
#endif
UPDATE_CURRENT_PLAYER_PED_ENUM()
RETURN (ePed = g_savedGlobals.sPlayerData.sInfo.eCurrentPed)
ENDFUNC
/// PURPOSE: Gets the ENUM value of the current ped in control
FUNC enumCharacterList GET_CURRENT_PLAYER_PED_ENUMCLF()
UPDATE_CURRENT_PLAYER_PED_ENUMCLF()
RETURN g_savedGlobalsClifford.sPlayerData.sInfo.eCurrentPed
ENDFUNC
FUNC enumCharacterList GET_CURRENT_PLAYER_PED_ENUMNRM()
UPDATE_CURRENT_PLAYER_PED_ENUMNRM()
RETURN g_savedGlobalsnorman.sPlayerData.sInfo.eCurrentPed
ENDFUNC
FUNC enumCharacterList GET_CURRENT_PLAYER_PED_ENUM()
#if USE_CLF_DLC
if g_bLoadedClifford
return GET_CURRENT_PLAYER_PED_ENUMCLF()
endif
#endif
#if USE_NRM_DLC
if g_bLoadedNorman
return GET_CURRENT_PLAYER_PED_ENUMNRM()
endif
#endif
UPDATE_CURRENT_PLAYER_PED_ENUM()
RETURN g_savedGlobals.sPlayerData.sInfo.eCurrentPed
ENDFUNC
/// PURPOSE: Gets the ENUM value of the last know player ped in control
FUNC enumCharacterList GET_LAST_KNOWN_PLAYER_PED_ENUM()
#if USE_CLF_DLC
RETURN g_savedGlobalsClifford.sPlayerData.sInfo.eLastKnownPed
#endif
#if USE_NRM_DLC
RETURN g_savedGlobalsnorman.sPlayerData.sInfo.eLastKnownPed
#endif
#if not USE_CLF_DLC
#if not USE_NRM_DLC
RETURN g_savedGlobals.sPlayerData.sInfo.eLastKnownPed
#endif
#endif
ENDFUNC
/// PURPOSE: Gets the ENUM value of the previous player ped in control
FUNC enumCharacterList GET_PREVIOUS_PLAYER_PED_ENUM()
#if USE_CLF_DLC
UPDATE_CURRENT_PLAYER_PED_ENUMCLF()
RETURN g_savedGlobalsClifford.sPlayerData.sInfo.ePreviousPed
#endif
#if USE_NRM_DLC
UPDATE_CURRENT_PLAYER_PED_ENUMNRM()
RETURN g_savedGlobalsnorman.sPlayerData.sInfo.ePreviousPed
#endif
#if not USE_CLF_DLC
#if not USE_NRM_DLC
UPDATE_CURRENT_PLAYER_PED_ENUM()
RETURN g_savedGlobals.sPlayerData.sInfo.ePreviousPed
#endif
#endif
ENDFUNC
/// PURPOSE: Gets the INT value of the current ped in control
FUNC INT GET_CURRENT_PLAYER_PED_INT()
UPDATE_CURRENT_PLAYER_PED_ENUM()
#if USE_CLF_DLC
RETURN ENUM_TO_INT(g_savedGlobalsClifford.sPlayerData.sInfo.eCurrentPed)
#endif
#if USE_NRM_DLC
RETURN ENUM_TO_INT(g_savedGlobalsnorman.sPlayerData.sInfo.eCurrentPed)
#endif
#if not USE_CLF_DLC
#if not USE_NRM_DLC
RETURN ENUM_TO_INT(g_savedGlobals.sPlayerData.sInfo.eCurrentPed)
#endif
#endif
ENDFUNC
/// PURPOSE: Get a constant int value that represents the bitset BIT for the current ped in control.
FUNC INT GET_CURRENT_PLAYER_PED_BIT()
UPDATE_CURRENT_PLAYER_PED_ENUM()
#if USE_CLF_DLC
SWITCH g_savedGlobalsClifford.sPlayerData.sInfo.eCurrentPed
CASE CHAR_MICHAEL
RETURN BIT_MICHAEL
BREAK
CASE CHAR_FRANKLIN
RETURN BIT_FRANKLIN
BREAK
CASE CHAR_TREVOR
RETURN BIT_TREVOR
BREAK
ENDSWITCH
#endif
#if USE_NRM_DLC
SWITCH g_savedGlobalsnorman.sPlayerData.sInfo.eCurrentPed
CASE CHAR_MICHAEL
RETURN BIT_MICHAEL
BREAK
CASE CHAR_FRANKLIN
RETURN BIT_FRANKLIN
BREAK
CASE CHAR_TREVOR
RETURN BIT_TREVOR
BREAK
ENDSWITCH
#endif
#if not USE_CLF_DLC
#if not USE_NRM_DLC
SWITCH g_savedGlobals.sPlayerData.sInfo.eCurrentPed
CASE CHAR_MICHAEL
RETURN BIT_MICHAEL
BREAK
CASE CHAR_FRANKLIN
RETURN BIT_FRANKLIN
BREAK
CASE CHAR_TREVOR
RETURN BIT_TREVOR
BREAK
ENDSWITCH
#endif
#endif
SCRIPT_ASSERT("GET_CURRENT_PLAYER_PED_BIT: Invalid current player ped ENUM. Could not return a valid bit")
RETURN BIT_NOBODY
ENDFUNC
FUNC INT GET_PLAYER_PED_BIT(enumCharacterList ePlayerEnum)
SWITCH ePlayerEnum
CASE CHAR_MICHAEL
RETURN BIT_MICHAEL
BREAK
CASE CHAR_FRANKLIN
RETURN BIT_FRANKLIN
BREAK
CASE CHAR_TREVOR
RETURN BIT_TREVOR
BREAK
ENDSWITCH
SCRIPT_ASSERT("GET_PLAYER_PED_BIT: Enum passed was not for a valid player charcter. Could not return a valid result.")
RETURN BIT_NOBODY
ENDFUNC
#IF IS_DEBUG_BUILD
/// PURPOSE: Gets the STRING value of the current ped in control
FUNC STRING GET_CURRENT_PLAYER_PED_STRING()
UPDATE_CURRENT_PLAYER_PED_ENUM()
#if USE_CLF_DLC
RETURN GET_PLAYER_PED_STRING(g_savedGlobalsClifford.sPlayerData.sInfo.eCurrentPed)
#endif
#if USE_NRM_DLC
RETURN GET_PLAYER_PED_STRING(g_savedGlobalsnorman.sPlayerData.sInfo.eCurrentPed)
#endif
#if not USE_CLF_DLC
#if not USE_NRM_DLC
RETURN GET_PLAYER_PED_STRING(g_savedGlobals.sPlayerData.sInfo.eCurrentPed)
#endif
#endif
ENDFUNC
PROC PRINT_PED_VARIATIONS(PED_INDEX ped)
IF NOT IS_PED_INJURED(ped)
PRINTLN("VARIATIONS for ", GET_PLAYER_PED_STRING(GET_PLAYER_PED_ENUM(ped)))
PRINTLN("...PED_COMP_HEAD [", GET_PED_DRAWABLE_VARIATION(ped, PED_COMP_HEAD), ",", GET_PED_TEXTURE_VARIATION(ped, PED_COMP_HEAD), "]")
PRINTLN("...PED_COMP_BERD [", GET_PED_DRAWABLE_VARIATION(ped, PED_COMP_BERD), ",", GET_PED_TEXTURE_VARIATION(ped, PED_COMP_BERD), "]")
PRINTLN("...PED_COMP_HAIR [", GET_PED_DRAWABLE_VARIATION(ped, PED_COMP_HAIR), ",", GET_PED_TEXTURE_VARIATION(ped, PED_COMP_HAIR), "]")
PRINTLN("...PED_COMP_TORSO [", GET_PED_DRAWABLE_VARIATION(ped, PED_COMP_TORSO), ",", GET_PED_TEXTURE_VARIATION(ped, PED_COMP_TORSO), "]")
PRINTLN("...PED_COMP_LEG [", GET_PED_DRAWABLE_VARIATION(ped, PED_COMP_LEG), ",", GET_PED_TEXTURE_VARIATION(ped, PED_COMP_LEG), "]")
PRINTLN("...PED_COMP_HAND [", GET_PED_DRAWABLE_VARIATION(ped, PED_COMP_HAND), ",", GET_PED_TEXTURE_VARIATION(ped, PED_COMP_HAND), "]")
PRINTLN("...PED_COMP_FEET [", GET_PED_DRAWABLE_VARIATION(ped, PED_COMP_FEET), ",", GET_PED_TEXTURE_VARIATION(ped, PED_COMP_FEET), "]")
PRINTLN("...PED_COMP_TEETH [", GET_PED_DRAWABLE_VARIATION(ped, PED_COMP_TEETH), ",", GET_PED_TEXTURE_VARIATION(ped, PED_COMP_TEETH), "]")
PRINTLN("...PED_COMP_SPECIAL [", GET_PED_DRAWABLE_VARIATION(ped, PED_COMP_SPECIAL), ",", GET_PED_TEXTURE_VARIATION(ped, PED_COMP_SPECIAL), "]")
PRINTLN("...PED_COMP_SPECIAL2 [", GET_PED_DRAWABLE_VARIATION(ped, PED_COMP_SPECIAL2), ",", GET_PED_TEXTURE_VARIATION(ped, PED_COMP_SPECIAL2), "]")
PRINTLN("...PED_COMP_DECL [", GET_PED_DRAWABLE_VARIATION(ped, PED_COMP_DECL), ",", GET_PED_TEXTURE_VARIATION(ped, PED_COMP_DECL), "]")
PRINTLN("...PED_COMP_JBIB [", GET_PED_DRAWABLE_VARIATION(ped, PED_COMP_JBIB), ",", GET_PED_TEXTURE_VARIATION(ped, PED_COMP_JBIB), "]")
PRINTNL()
PRINTLN("...ANCHOR_HEAD [", GET_PED_PROP_INDEX(ped, ANCHOR_HEAD), ",", GET_PED_PROP_TEXTURE_INDEX(ped, ANCHOR_HEAD), "]")
PRINTLN("...ANCHOR_EYES [", GET_PED_PROP_INDEX(ped, ANCHOR_EYES), ",", GET_PED_PROP_TEXTURE_INDEX(ped, ANCHOR_EYES), "]")
PRINTLN("...ANCHOR_EARS [", GET_PED_PROP_INDEX(ped, ANCHOR_EARS), ",", GET_PED_PROP_TEXTURE_INDEX(ped, ANCHOR_EARS), "]")
PRINTLN("...ANCHOR_MOUTH [", GET_PED_PROP_INDEX(ped, ANCHOR_MOUTH), ",", GET_PED_PROP_TEXTURE_INDEX(ped, ANCHOR_MOUTH), "]")
PRINTLN("...ANCHOR_LEFT_HAND [", GET_PED_PROP_INDEX(ped, ANCHOR_LEFT_HAND), ",", GET_PED_PROP_TEXTURE_INDEX(ped, ANCHOR_LEFT_HAND), "]")
PRINTLN("...ANCHOR_RIGHT_HAND [", GET_PED_PROP_INDEX(ped, ANCHOR_RIGHT_HAND), ",", GET_PED_PROP_TEXTURE_INDEX(ped, ANCHOR_RIGHT_HAND), "]")
PRINTLN("...ANCHOR_LEFT_WRIST [", GET_PED_PROP_INDEX(ped, ANCHOR_LEFT_WRIST), ",", GET_PED_PROP_TEXTURE_INDEX(ped, ANCHOR_LEFT_WRIST), "]")
PRINTLN("...ANCHOR_RIGHT_WRIST[", GET_PED_PROP_INDEX(ped, ANCHOR_RIGHT_WRIST), ",", GET_PED_PROP_TEXTURE_INDEX(ped, ANCHOR_RIGHT_WRIST), "]")
PRINTLN("...ANCHOR_HIP [", GET_PED_PROP_INDEX(ped, ANCHOR_HIP), ",", GET_PED_PROP_TEXTURE_INDEX(ped, ANCHOR_HIP), "]")
PRINTNL()
PRINTNL()
ENDIF
ENDPROC
#ENDIF
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// PED REQUEST FUNCTIONS ///
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// PURPOSE: Returns TRUE if a request to switch the player character is currently in progress
FUNC BOOL IS_PLAYER_PED_SWITCH_IN_PROGRESS()
IF NOT NETWORK_IS_GAME_IN_PROGRESS()
RETURN (g_sPlayerPedRequest.eState = PR_STATE_PROCESSING)
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE: Cancel a request that has just been made and is still in the init stage
PROC CANCEL_PLAYER_PED_SWITCH_REQUEST()
IF (g_sPlayerPedRequest.eState = PR_STATE_PROCESSING)
AND (g_sPlayerPedRequest.iStage = 0)
g_sPlayerPedRequest.eState = PR_STATE_WAITING
#IF IS_DEBUG_BUILD
PRINTLN("CANCEL_PLAYER_PED_SWITCH_REQUEST(), ", GET_THIS_SCRIPT_NAME())
#ENDIF
ENDIF
ENDPROC
/// PURPOSE: Make a request to change the current player character
FUNC BOOL MAKE_PLAYER_PED_SWITCH_REQUEST(enumCharacterList ePed, BOOL MakePedInvincible = TRUE ) //, PED_REQUEST_TYPE_ENUM eType)
IF NOT IS_PLAYER_PED_SWITCH_IN_PROGRESS()
AND IS_PLAYER_PED_PLAYABLE(ePed)
IF NOT IS_PED_THE_CURRENT_PLAYER_PED(ePed)
OR NETWORK_IS_GAME_IN_PROGRESS()
g_sPlayerPedRequest.ePed = ePed
// g_sPlayerPedRequest.eType = eType
g_sPlayerPedRequest.iStage = 0
g_sPlayerPedRequest.eState = PR_STATE_PROCESSING
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
IF MakePedInvincible
SET_PLAYER_INVINCIBLE(PLAYER_ID(), TRUE)
ENDIF
CLEAR_AREA_OF_PROJECTILES(GET_ENTITY_COORDS(PLAYER_PED_ID()), 5.0)
ENDIF
#IF IS_DEBUG_BUILD
PRINTLN("MAKE_PLAYER_PED_SWITCH_REQUEST(", GET_PLAYER_PED_STRING(ePed), "), ", GET_THIS_SCRIPT_NAME())
#ENDIF
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE: Make a request to change the current player character when MP fails
/// NOTE: This shoul donly be called when in MP or when kicked out of MP.
FUNC BOOL MAKE_PLAYER_PED_SWITCH_REQUEST_FROM_MP_KICK(enumCharacterList ePed) //, PED_REQUEST_TYPE_ENUM eType)
IF NOT IS_PLAYER_PED_SWITCH_IN_PROGRESS()
AND IS_PLAYER_PED_PLAYABLE(ePed)
g_sPlayerPedRequest.ePed = ePed
// g_sPlayerPedRequest.eType = eType
g_sPlayerPedRequest.iStage = 0
g_sPlayerPedRequest.eState = PR_STATE_PROCESSING
#IF IS_DEBUG_BUILD
PRINTLN("MAKE_PLAYER_PED_SWITCH_REQUEST_FROM_MP_KICK(", GET_PLAYER_PED_STRING(ePed), "), ", GET_THIS_SCRIPT_NAME())
#ENDIF
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL WILL_PLAYER_PED_SWITCH_HAPPEN(enumCharacterList ePed)
IF NOT IS_PLAYER_PED_SWITCH_IN_PROGRESS()
AND NOT IS_PLAYER_PED_PLAYABLE(ePed)
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// SAVED PED DATA ///
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#IF IS_DEBUG_BUILD
USING "player_ped_debug.sch" //for SaveNewGameToSwitchLog()
#ENDIF
/// PURPOSE: Used to store the players ped ID so the player controller can query ped state during cutscenes
PROC STORE_TEMP_PLAYER_PED_ID(PED_INDEX pedID)
IF IS_PED_INJURED(pedID)
EXIT
ENDIF
PRINTLN("STORE_TEMP_PLAYER_PED_ID()")
PRINTLN("...pedID = ", NATIVE_TO_INT(pedID))
#IF IS_DEBUG_BUILD
PRINTLN("...model = ", GET_MODEL_NAME_FOR_DEBUG(GET_ENTITY_MODEL(pedID)))
#ENDIF
INT i
REPEAT NUM_PLAYER_PED_IDS i
// Dont store if it's already in the list
IF DOES_ENTITY_EXIST(g_piCreatedPlayerPedIDs[i])
AND g_piCreatedPlayerPedIDs[i] = pedID
PRINTLN("...slot = ", i)
EXIT
ENDIF
ENDREPEAT
REPEAT NUM_PLAYER_PED_IDS i
IF NOT DOES_ENTITY_EXIST(g_piCreatedPlayerPedIDs[i])
g_piCreatedPlayerPedIDs[i] = pedID
PRINTLN("...slot = ", i)
EXIT
ENDIF
ENDREPEAT
#IF IS_DEBUG_BUILD
SCRIPT_ASSERT("More than 9 player peds exist! Tell Kenneth R.")
#ENDIF
PRINTLN("More than 9 player peds exist, unable to store temp ped ID")
ENDPROC
FUNC INT GET_NUMBER_OF_SCRIPT_CREATED_PLAYER_VEHICLES(enumCharacterList ePed, MODEL_NAMES eModelCheck = DUMMY_MODEL_FOR_SCRIPT)
INT iCount = 0
INT iVeh
REPEAT NUM_PLAYER_VEHICLE_IDS iVeh
IF DOES_ENTITY_EXIST(g_viCreatedPlayerVehicleIDs[iVeh])
AND IS_VEHICLE_DRIVEABLE(g_viCreatedPlayerVehicleIDs[iVeh])
IF g_eCreatedPlayerVehiclePed[iVeh] = ePed
IF eModelCheck = DUMMY_MODEL_FOR_SCRIPT
OR eModelCheck = GET_ENTITY_MODEL(g_viCreatedPlayerVehicleIDs[iVeh])
iCount++
ENDIF
ENDIF
ENDIF
ENDREPEAT
RETURN iCount
ENDFUNC
/// PURPOSE: Used to store the players vehicle ID so the vehicle gen controller can query vehicle state
PROC STORE_TEMP_PLAYER_VEHICLE_ID(VEHICLE_INDEX vehID, enumCharacterList ePed)
INT i
REPEAT NUM_PLAYER_VEHICLE_IDS i
IF NOT DOES_ENTITY_EXIST(g_viCreatedPlayerVehicleIDs[i])
g_viCreatedPlayerVehicleIDs[i] = vehID
g_eCreatedPlayerVehiclePed[i] = ePed
g_eCreatedPlayerVehicleModel[i] = GET_ENTITY_MODEL(vehID)
IF IS_THIS_MODEL_A_CAR(g_eCreatedPlayerVehicleModel[i])
g_iCreatedPlayerVehicleCleanupTimer[ePed][SAVED_VEHICLE_SLOT_CAR] = -1
ELSE
g_iCreatedPlayerVehicleCleanupTimer[ePed][SAVED_VEHICLE_SLOT_BIKE] = -1
ENDIF
PRINTLN("Storing temp player vehicleID ", NATIVE_TO_INT(vehID), " in slot ", i)
i = NUM_PLAYER_VEHICLE_IDS // Bail out of repeat
ENDIF
IF i = NUM_PLAYER_VEHICLE_IDS-1
#IF IS_DEBUG_BUILD
SCRIPT_ASSERT("More than 9 player vehicles exist! Tell Kenneth R.")
#ENDIF
PRINTLN("More than 9 player vehicles exist, unable to store temp vehicle ID")
ENDIF
ENDREPEAT
ENDPROC
/// PURPOSE: Used to delete all vehicles that have been created through the player ped procs.
/// NOTE: Use ePed = NO_CHARACTER to delete all characters vehicles
PROC DELETE_ALL_SCRIPT_CREATED_PLAYER_VEHICLES(enumCharacterList ePed = NO_CHARACTER, VEHICLE_CREATE_TYPE_ENUM eVehicleType = VEHICLE_TYPE_DEFAULT)
INT i
REPEAT NUM_PLAYER_VEHICLE_IDS i
IF DOES_ENTITY_EXIST(g_viCreatedPlayerVehicleIDs[i])
IF ePed = NO_CHARACTER
OR g_eCreatedPlayerVehiclePed[i] = ePed
IF eVehicleType = VEHICLE_TYPE_DEFAULT
OR GET_ENTITY_MODEL(g_viCreatedPlayerVehicleIDs[i]) = GET_PLAYER_VEH_MODEL(ePed, eVehicleType)
#IF USE_TU_CHANGES
IF NOT IS_PED_IN_VEHICLE(PLAYER_PED_ID(), g_viCreatedPlayerVehicleIDs[i])
#ENDIF
PRINTLN("Deleting player vehicleID ", NATIVE_TO_INT(g_viCreatedPlayerVehicleIDs[i]), " in slot ", i)
SET_ENTITY_AS_MISSION_ENTITY(g_viCreatedPlayerVehicleIDs[i], FALSE, TRUE)
DELETE_VEHICLE(g_viCreatedPlayerVehicleIDs[i])
g_eCreatedPlayerVehiclePed[i] = NO_CHARACTER
#IF USE_TU_CHANGES
ELSE
//SCRIPT_ASSERT("ignorable - ")
ENDIF
#ENDIF
ENDIF
ENDIF
ENDIF
ENDREPEAT
ENDPROC
/// PURPOSE: Returns TRUE if we have made a copy of the ped index for player character
FUNC BOOL IS_PED_IN_TEMP_PLAYER_PED_ID_LIST(PED_INDEX pedID)
IF DOES_ENTITY_EXIST(pedID)
AND NOT IS_PED_INJURED(pedID)
INT iPed
REPEAT NUM_PLAYER_PED_IDS iPed
IF DOES_ENTITY_EXIST(g_piCreatedPlayerPedIDs[iPed])
AND NOT IS_PED_INJURED(g_piCreatedPlayerPedIDs[iPed])
IF g_piCreatedPlayerPedIDs[iPed] = pedID
AND GET_ENTITY_MODEL(g_piCreatedPlayerPedIDs[iPed]) = GET_ENTITY_MODEL(pedID)
RETURN TRUE
ENDIF
ENDIF
ENDREPEAT
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE: Used to store the npc vehicle ID so the vehicle gen controller can query vehicle state
PROC STORE_TEMP_NPC_VEHICLE_ID(VEHICLE_INDEX vehID)
INT i
REPEAT NUM_NPC_VEHICLE_IDS i
IF NOT DOES_ENTITY_EXIST(g_viCreatedNPCVehicleIDs[i])
g_viCreatedNPCVehicleIDs[i] = vehID
PRINTLN("Storing temp npc vehicleID ", NATIVE_TO_INT(vehID), " in slot ", i)
i = NUM_NPC_VEHICLE_IDS // Bail out of repeat
ENDIF
IF i = NUM_NPC_VEHICLE_IDS-1
#IF IS_DEBUG_BUILD
SCRIPT_ASSERT("More than 3 npc vehicles exist! Tell Kenneth R.")
#ENDIF
PRINTLN("More than 3 npc vehicles exist, unable to store temp vehicle ID")
ENDIF
ENDREPEAT
ENDPROC
/// PURPOSE: Returns TRUE if the specified vehicle is one of the player character vehicles
/// NOTE: Set ePed = NO_CHARACTER to check all player characters vehicles
FUNC BOOL IS_VEHICLE_A_PLAYER_PERSONAL_VEHICLE(VEHICLE_INDEX vehID, enumCharacterList ePed = NO_CHARACTER, VEHICLE_CREATE_TYPE_ENUM eVehicleType = VEHICLE_TYPE_DEFAULT)
IF NOT DOES_ENTITY_EXIST(vehID)
RETURN FALSE
ENDIF
IF NOT IS_VEHICLE_DRIVEABLE(vehID)
RETURN FALSE
ENDIF
INT iVeh
REPEAT NUM_PLAYER_VEHICLE_IDS iVeh
IF DOES_ENTITY_EXIST(g_viCreatedPlayerVehicleIDs[iVeh])
IF g_viCreatedPlayerVehicleIDs[iVeh] = vehID
IF ePed = NO_CHARACTER
OR ePed = g_eCreatedPlayerVehiclePed[iVeh]
IF eVehicleType = VEHICLE_TYPE_DEFAULT
OR GET_ENTITY_MODEL(vehID) = GET_PLAYER_VEH_MODEL(ePed, eVehicleType)
RETURN TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDREPEAT
RETURN FALSE
ENDFUNC
/// PURPOSE: Returns TRUE if the vehicle data in the setup struct matches the player vehicle data
/// NOTE: This compares vehicle model and number plate.
FUNC BOOL DOES_VEH_SETUP_STRUCT_MATCH_PLAYER_VEHICLE(enumCharacterList ePed, VEHICLE_SETUP_STRUCT &sVehDataToCompare)
IF NOT IS_PLAYER_PED_PLAYABLE(ePed)
RETURN FALSE
ENDIF
#if USE_CLF_DLC
// Check stored CAR data
IF g_savedGlobalsClifford.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_CAR][ePed].model != DUMMY_MODEL_FOR_SCRIPT
IF g_savedGlobalsClifford.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_CAR][ePed].model = sVehDataToCompare.eModel
AND GET_HASH_KEY(g_savedGlobalsClifford.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_CAR][ePed].tlNumberPlate) = GET_HASH_KEY(sVehDataToCompare.tlPlateText)
RETURN TRUE
ENDIF
ENDIF
// Check stored BIKE data
IF g_savedGlobalsClifford.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_BIKE][ePed].model != DUMMY_MODEL_FOR_SCRIPT
IF g_savedGlobalsClifford.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_BIKE][ePed].model = sVehDataToCompare.eModel
AND GET_HASH_KEY(g_savedGlobalsClifford.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_BIKE][ePed].tlNumberPlate) = GET_HASH_KEY(sVehDataToCompare.tlPlateText)
RETURN TRUE
ENDIF
ENDIF
#endif
#if USE_NRM_DLC
// Check stored CAR data
IF g_savedGlobalsnorman.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_CAR][ePed].model != DUMMY_MODEL_FOR_SCRIPT
IF g_savedGlobalsnorman.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_CAR][ePed].model = sVehDataToCompare.eModel
AND GET_HASH_KEY(g_savedGlobalsnorman.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_CAR][ePed].tlNumberPlate) = GET_HASH_KEY(sVehDataToCompare.tlPlateText)
RETURN TRUE
ENDIF
ENDIF
// Check stored BIKE data
IF g_savedGlobalsnorman.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_BIKE][ePed].model != DUMMY_MODEL_FOR_SCRIPT
IF g_savedGlobalsnorman.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_BIKE][ePed].model = sVehDataToCompare.eModel
AND GET_HASH_KEY(g_savedGlobalsnorman.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_BIKE][ePed].tlNumberPlate) = GET_HASH_KEY(sVehDataToCompare.tlPlateText)
RETURN TRUE
ENDIF
ENDIF
#endif
#if not USE_CLF_DLC
#if not USE_NRM_DLC
// Check stored CAR data
IF g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_CAR][ePed].model != DUMMY_MODEL_FOR_SCRIPT
IF g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_CAR][ePed].model = sVehDataToCompare.eModel
AND GET_HASH_KEY(g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_CAR][ePed].tlNumberPlate) = GET_HASH_KEY(sVehDataToCompare.tlPlateText)
RETURN TRUE
ENDIF
ENDIF
// Check stored BIKE data
IF g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_BIKE][ePed].model != DUMMY_MODEL_FOR_SCRIPT
IF g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_BIKE][ePed].model = sVehDataToCompare.eModel
AND GET_HASH_KEY(g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_BIKE][ePed].tlNumberPlate) = GET_HASH_KEY(sVehDataToCompare.tlPlateText)
RETURN TRUE
ENDIF
ENDIF
#endif
#endif
// Check the default data
// Grab the vehicle data for the specified ped
PED_VEH_DATA_STRUCT sVehData
GET_PLAYER_VEH_DATA(ePed, sVehData, VEHICLE_TYPE_CAR)
IF sVehData.model != DUMMY_MODEL_FOR_SCRIPT
IF sVehData.model = sVehDataToCompare.eModel
AND GET_HASH_KEY(sVehData.tlNumberPlate) = GET_HASH_KEY(sVehDataToCompare.tlPlateText)
RETURN TRUE
ENDIF
ENDIF
GET_PLAYER_VEH_DATA(ePed, sVehData, VEHICLE_TYPE_BIKE)
IF sVehData.model != DUMMY_MODEL_FOR_SCRIPT
IF sVehData.model = sVehDataToCompare.eModel
AND GET_HASH_KEY(sVehData.tlNumberPlate) = GET_HASH_KEY(sVehDataToCompare.tlPlateText)
RETURN TRUE
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE: Returns TRUE if the specified player vehicle type is in the area.
/// NOTE: This compares vehicle model and number plate.
/// Set fRadius to -1 to check entire map.
FUNC BOOL IS_PLAYER_VEHICLE_IN_AREA(enumCharacterList ePed, VEHICLE_CREATE_TYPE_ENUM eVehicleType, VECTOR vCoord, FLOAT fRadius)
IF NOT IS_PLAYER_PED_PLAYABLE(ePed)
RETURN FALSE
ENDIF
INT iVeh
PED_VEH_DATA_STRUCT sTempVehData
MODEL_NAMES eModel = DUMMY_MODEL_FOR_SCRIPT
GET_PLAYER_VEH_DATA(ePed, sTempVehData, eVehicleType)
eModel = sTempVehData.model
IF eModel != DUMMY_MODEL_FOR_SCRIPT
// Repeat through g_viCreatedPlayerVehicleIDs[], checking if driveable and has same number plate and then within range.
REPEAT NUM_PLAYER_VEHICLE_IDS iVeh
IF DOES_ENTITY_EXIST(g_viCreatedPlayerVehicleIDs[iVeh])
AND IS_VEHICLE_DRIVEABLE(g_viCreatedPlayerVehicleIDs[iVeh])
IF GET_ENTITY_MODEL(g_viCreatedPlayerVehicleIDs[iVeh]) = eModel
AND g_eCreatedPlayerVehiclePed[iVeh] = ePed
IF fRadius = -1
OR GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(g_viCreatedPlayerVehicleIDs[iVeh], FALSE), vCoord) <= fRadius
RETURN TRUE
ENDIF
ENDIF
ENDIF
ENDREPEAT
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE: Returns TRUE if the specified player is in one of their player created vehicles
FUNC BOOL IS_PLAYER_PED_IN_PERSONAL_VEHICLE(PED_INDEX pedID)
IF IS_PED_INJURED(pedID)
RETURN FALSE
ENDIF
IF NOT IS_PED_IN_ANY_VEHICLE(pedID)
RETURN FALSE
ENDIF
enumCharacterList ePed = GET_PLAYER_PED_ENUM(pedID)
IF NOT IS_PLAYER_PED_PLAYABLE(ePed)
RETURN FALSE
ENDIF
// Repeat through g_viCreatedPlayerVehicleIDs[], checking if driveable and has same number plate
INT iVeh
REPEAT NUM_PLAYER_VEHICLE_IDS iVeh
IF DOES_ENTITY_EXIST(g_viCreatedPlayerVehicleIDs[iVeh])
IF IS_VEHICLE_DRIVEABLE(g_viCreatedPlayerVehicleIDs[iVeh])
IF IS_PED_IN_VEHICLE(pedID, g_viCreatedPlayerVehicleIDs[iVeh])
RETURN TRUE
ENDIF
ENDIF
ENDIF
ENDREPEAT
RETURN FALSE
ENDFUNC
PROC Initialise_PlayerSceneData_Global_Variables_On_StartupCLF()
PRINTLN("<", GET_THIS_SCRIPT_NAME(), "> Initialise_PlayerSceneData_Global_Variables_On_Startup()")
INT iPeds
REPEAT NUM_OF_PLAYABLE_PEDS iPeds
g_savedGlobalsClifford.sPlayerSceneData.g_ePlayerLastScene[iPeds] = PR_SCENE_INVALID
INT iQueue
REPEAT g_iCOUNT_OF_LAST_SCENE_QUEUE iQueue
g_savedGlobalsClifford.sPlayerSceneData.g_eLastSceneQueue[iPeds][iQueue] = PR_SCENE_INVALID
ENDREPEAT
ENDREPEAT
g_savedGlobalsClifford.sPlayerSceneData.g_iSeenOneOffSceneBit = 0
#IF IS_DEBUG_BUILD
SaveNewGameToSwitchLog()
#ENDIF
ENDPROC
PROC Initialise_PlayerSceneData_Global_Variables_On_StartupNRM()
PRINTLN("<", GET_THIS_SCRIPT_NAME(), "> Initialise_PlayerSceneData_Global_Variables_On_Startup()")
INT iPeds
REPEAT NUM_OF_PLAYABLE_PEDS iPeds
g_savedGlobalsnorman.sPlayerSceneData.g_ePlayerLastScene[iPeds] = PR_SCENE_INVALID
INT iQueue
REPEAT g_iCOUNT_OF_LAST_SCENE_QUEUE iQueue
g_savedGlobalsnorman.sPlayerSceneData.g_eLastSceneQueue[iPeds][iQueue] = PR_SCENE_INVALID
ENDREPEAT
ENDREPEAT
g_savedGlobalsnorman.sPlayerSceneData.g_iSeenOneOffSceneBit = 0
#IF IS_DEBUG_BUILD
SaveNewGameToSwitchLog()
#ENDIF
ENDPROC
PROC Initialise_PlayerSceneData_Global_Variables_On_Startup()
#if USE_CLF_DLC
if g_bLoadedClifford
Initialise_PlayerSceneData_Global_Variables_On_StartupCLF()
EXIT
endif
#endif
#if USE_NRM_DLC
if g_bLoadedNorman
Initialise_PlayerSceneData_Global_Variables_On_StartupNRM()
EXIT
endif
#endif
PRINTLN("<", GET_THIS_SCRIPT_NAME(), "> Initialise_PlayerSceneData_Global_Variables_On_Startup()")
INT iPeds
REPEAT NUM_OF_PLAYABLE_PEDS iPeds
g_SavedGlobals.sPlayerSceneData.g_ePlayerLastScene[iPeds] = PR_SCENE_INVALID
INT iQueue
REPEAT g_iCOUNT_OF_LAST_SCENE_QUEUE iQueue
g_SavedGlobals.sPlayerSceneData.g_eLastSceneQueue[iPeds][iQueue] = PR_SCENE_INVALID
ENDREPEAT
ENDREPEAT
g_SavedGlobals.sPlayerSceneData.g_iSeenOneOffSceneBit = 0
#IF IS_DEBUG_BUILD
SaveNewGameToSwitchLog()
#ENDIF
ENDPROC
///////////////////////////////////////////////////////////////////////////////////////////////////
///
/// SHOP ITEM STATS - WEAPON COMPONENTS UNLOCKED
///
FUNC INT GET_PLAYER_PED_WEAPON_COMP_UNLOCKED_BITSET(enumCharacterList ePed, WEAPON_TYPE eWeapon, WEAPONCOMPONENT_TYPE eComponent)
INT iStatData
INT iIndex = GET_WEAPON_ADDON_INDEX_FROM_WEAPONS(eComponent, eWeapon)
INT iBitset = GET_WEAPON_ADDON_BITSET(iIndex)
SWITCH iBitset
CASE 0
SWITCH ePed
CASE CHAR_MICHAEL STAT_GET_INT(SP0_WEAP_ADDON_UNLOCK_0, iStatData) BREAK
CASE CHAR_FRANKLIN STAT_GET_INT(SP1_WEAP_ADDON_UNLOCK_0, iStatData) BREAK
CASE CHAR_TREVOR STAT_GET_INT(SP2_WEAP_ADDON_UNLOCK_0, iStatData) BREAK
ENDSWITCH
BREAK
CASE 1
SWITCH ePed
CASE CHAR_MICHAEL STAT_GET_INT(SP0_WEAP_ADDON_UNLOCK_1, iStatData) BREAK
CASE CHAR_FRANKLIN STAT_GET_INT(SP1_WEAP_ADDON_UNLOCK_1, iStatData) BREAK
CASE CHAR_TREVOR STAT_GET_INT(SP2_WEAP_ADDON_UNLOCK_1, iStatData) BREAK
ENDSWITCH
BREAK
CASE 2
SWITCH ePed
CASE CHAR_MICHAEL STAT_GET_INT(SP0_WEAP_ADDON_UNLOCK_2, iStatData) BREAK
CASE CHAR_FRANKLIN STAT_GET_INT(SP1_WEAP_ADDON_UNLOCK_2, iStatData) BREAK
CASE CHAR_TREVOR STAT_GET_INT(SP2_WEAP_ADDON_UNLOCK_2, iStatData) BREAK
ENDSWITCH
BREAK
CASE 3
SWITCH ePed
CASE CHAR_MICHAEL STAT_GET_INT(SP0_WEAP_ADDON_UNLOCK_3, iStatData) BREAK
CASE CHAR_FRANKLIN STAT_GET_INT(SP1_WEAP_ADDON_UNLOCK_3, iStatData) BREAK
CASE CHAR_TREVOR STAT_GET_INT(SP2_WEAP_ADDON_UNLOCK_3, iStatData) BREAK
ENDSWITCH
BREAK
#IF USE_TU_CHANGES
CASE 4
SWITCH ePed
CASE CHAR_MICHAEL STAT_GET_INT(SP0_WEAP_ADDON_UNLOCK_4, iStatData) BREAK
CASE CHAR_FRANKLIN STAT_GET_INT(SP1_WEAP_ADDON_UNLOCK_4, iStatData) BREAK
CASE CHAR_TREVOR STAT_GET_INT(SP2_WEAP_ADDON_UNLOCK_4, iStatData) BREAK
ENDSWITCH
BREAK
CASE 5
SWITCH ePed
CASE CHAR_MICHAEL STAT_GET_INT(SP0_WEAP_ADDON_UNLOCK_5, iStatData) BREAK
CASE CHAR_FRANKLIN STAT_GET_INT(SP1_WEAP_ADDON_UNLOCK_5, iStatData) BREAK
CASE CHAR_TREVOR STAT_GET_INT(SP2_WEAP_ADDON_UNLOCK_5, iStatData) BREAK
ENDSWITCH
BREAK
CASE 6
SWITCH ePed
CASE CHAR_MICHAEL STAT_GET_INT(SP0_WEAP_ADDON_UNLOCK_6, iStatData) BREAK
CASE CHAR_FRANKLIN STAT_GET_INT(SP1_WEAP_ADDON_UNLOCK_6, iStatData) BREAK
CASE CHAR_TREVOR STAT_GET_INT(SP2_WEAP_ADDON_UNLOCK_6, iStatData) BREAK
ENDSWITCH
BREAK
#ENDIF
DEFAULT
#IF IS_DEBUG_BUILD
SCRIPT_ASSERT("GET_PLAYER_PED_WEAPON_COMP_UNLOCKED_BITSET - ran out of stats. Tell Kenneth R.")
#ENDIF
BREAK
ENDSWITCH
RETURN (iStatData)
ENDFUNC
PROC SET_PLAYER_PED_WEAPON_COMP_UNLOCKED_BITSET(enumCharacterList ePed, WEAPON_TYPE eWeapon, WEAPONCOMPONENT_TYPE eComponent, INT iStatData)
INT iIndex = GET_WEAPON_ADDON_INDEX_FROM_WEAPONS(eComponent, eWeapon)
INT iBitset = GET_WEAPON_ADDON_BITSET(iIndex)
SWITCH iBitset
CASE 0
SWITCH ePed
CASE CHAR_MICHAEL STAT_SET_INT(SP0_WEAP_ADDON_UNLOCK_0, iStatData) BREAK
CASE CHAR_FRANKLIN STAT_SET_INT(SP1_WEAP_ADDON_UNLOCK_0, iStatData) BREAK
CASE CHAR_TREVOR STAT_SET_INT(SP2_WEAP_ADDON_UNLOCK_0, iStatData) BREAK
ENDSWITCH
BREAK
CASE 1
SWITCH ePed
CASE CHAR_MICHAEL STAT_SET_INT(SP0_WEAP_ADDON_UNLOCK_1, iStatData) BREAK
CASE CHAR_FRANKLIN STAT_SET_INT(SP1_WEAP_ADDON_UNLOCK_1, iStatData) BREAK
CASE CHAR_TREVOR STAT_SET_INT(SP2_WEAP_ADDON_UNLOCK_1, iStatData) BREAK
ENDSWITCH
BREAK
CASE 2
SWITCH ePed
CASE CHAR_MICHAEL STAT_SET_INT(SP0_WEAP_ADDON_UNLOCK_2, iStatData) BREAK
CASE CHAR_FRANKLIN STAT_SET_INT(SP1_WEAP_ADDON_UNLOCK_2, iStatData) BREAK
CASE CHAR_TREVOR STAT_SET_INT(SP2_WEAP_ADDON_UNLOCK_2, iStatData) BREAK
ENDSWITCH
BREAK
CASE 3
SWITCH ePed
CASE CHAR_MICHAEL STAT_SET_INT(SP0_WEAP_ADDON_UNLOCK_3, iStatData) BREAK
CASE CHAR_FRANKLIN STAT_SET_INT(SP1_WEAP_ADDON_UNLOCK_3, iStatData) BREAK
CASE CHAR_TREVOR STAT_SET_INT(SP2_WEAP_ADDON_UNLOCK_3, iStatData) BREAK
ENDSWITCH
BREAK
#IF USE_TU_CHANGES
CASE 4
SWITCH ePed
CASE CHAR_MICHAEL STAT_SET_INT(SP0_WEAP_ADDON_UNLOCK_4, iStatData) BREAK
CASE CHAR_FRANKLIN STAT_SET_INT(SP1_WEAP_ADDON_UNLOCK_4, iStatData) BREAK
CASE CHAR_TREVOR STAT_SET_INT(SP2_WEAP_ADDON_UNLOCK_4, iStatData) BREAK
ENDSWITCH
BREAK
CASE 5
SWITCH ePed
CASE CHAR_MICHAEL STAT_SET_INT(SP0_WEAP_ADDON_UNLOCK_5, iStatData) BREAK
CASE CHAR_FRANKLIN STAT_SET_INT(SP1_WEAP_ADDON_UNLOCK_5, iStatData) BREAK
CASE CHAR_TREVOR STAT_SET_INT(SP2_WEAP_ADDON_UNLOCK_5, iStatData) BREAK
ENDSWITCH
BREAK
CASE 6
SWITCH ePed
CASE CHAR_MICHAEL STAT_SET_INT(SP0_WEAP_ADDON_UNLOCK_6, iStatData) BREAK
CASE CHAR_FRANKLIN STAT_SET_INT(SP1_WEAP_ADDON_UNLOCK_6, iStatData) BREAK
CASE CHAR_TREVOR STAT_SET_INT(SP2_WEAP_ADDON_UNLOCK_6, iStatData) BREAK
ENDSWITCH
BREAK
#ENDIF
DEFAULT
#IF IS_DEBUG_BUILD
SCRIPT_ASSERT("SET_PLAYER_PED_WEAPON_COMP_UNLOCKED_BITSET - ran out of stats. Tell Kenneth R.")
#ENDIF
BREAK
ENDSWITCH
ENDPROC
PROC SET_PLAYER_PED_WEAPON_COMP_UNLOCKED(enumCharacterList ePed, WEAPON_TYPE eWeapon, WEAPONCOMPONENT_TYPE eComponent, BOOL bState = TRUE)
IF IS_PLAYER_PED_PLAYABLE(ePed)
INT iStatData = GET_PLAYER_PED_WEAPON_COMP_UNLOCKED_BITSET(ePed, eWeapon, eComponent)
INT iIndex = GET_WEAPON_ADDON_INDEX_FROM_WEAPONS(eComponent, eWeapon)
INT iBit = GET_WEAPON_ADDON_INDEX_BITSET(iIndex)
IF bState
SET_BIT(iStatData, iBit)
ELSE
CLEAR_BIT(iStatData, iBit)
ENDIF
SET_PLAYER_PED_WEAPON_COMP_UNLOCKED_BITSET(ePed, eWeapon, eComponent, iStatData)
ENDIF
ENDPROC
FUNC BOOL IS_PLAYER_PED_WEAPON_COMP_UNLOCKED(enumCharacterList ePed, WEAPON_TYPE eWeapon, WEAPONCOMPONENT_TYPE eComponent)
IF IS_PLAYER_PED_PLAYABLE(ePed)
// All dlc and special weapons/components are unlocked by default
IF IS_WEAPON_UNLOCKED_BY_DEFAULT(eWeapon)
RETURN TRUE
ENDIF
INT iStatData = GET_PLAYER_PED_WEAPON_COMP_UNLOCKED_BITSET(ePed, eWeapon, eComponent)
INT iIndex = GET_WEAPON_ADDON_INDEX_FROM_WEAPONS(eComponent, eWeapon)
INT iBit = GET_WEAPON_ADDON_INDEX_BITSET(iIndex)
RETURN (IS_BIT_SET(iStatData, iBit))
ENDIF
RETURN FALSE
ENDFUNC
PROC SET_ALL_PLAYER_PED_WEAPON_COMPS_UNLOCKED_FOR_WEAPON(enumCharacterList ePed, WEAPON_TYPE eWeapon)
INT iWeaponComp = 0
WEAPONCOMPONENT_TYPE eWeaponComp = GET_PLAYER_PED_WEAPON_COMP_FROM_INT(eWeapon, iWeaponComp)
WHILE eWeaponComp != WEAPONCOMPONENT_INVALID
SET_PLAYER_PED_WEAPON_COMP_UNLOCKED(ePed, eWeapon, eWeaponComp, TRUE)
iWeaponComp++
eWeaponComp = GET_PLAYER_PED_WEAPON_COMP_FROM_INT(eWeapon, iWeaponComp)
ENDWHILE
ENDPROC
///////////////////////////////////////////////////////////////////////////////////////////////////
///
/// SHOP ITEM STATS - WEAPON COMPONENTS VIEWED
///
FUNC INT GET_PLAYER_PED_WEAPON_COMP_VIEWED_BITSET(enumCharacterList ePed, WEAPON_TYPE eWeapon, WEAPONCOMPONENT_TYPE eComponent)
INT iStatData
INT iIndex = GET_WEAPON_ADDON_INDEX_FROM_WEAPONS(eComponent, eWeapon)
INT iBitset = GET_WEAPON_ADDON_BITSET(iIndex)
SWITCH iBitset
CASE 0
SWITCH ePed
CASE CHAR_MICHAEL STAT_GET_INT(SP0_WEAP_ADDON_VIEW_0, iStatData) BREAK
CASE CHAR_FRANKLIN STAT_GET_INT(SP1_WEAP_ADDON_VIEW_0, iStatData) BREAK
CASE CHAR_TREVOR STAT_GET_INT(SP2_WEAP_ADDON_VIEW_0, iStatData) BREAK
ENDSWITCH
BREAK
CASE 1
SWITCH ePed
CASE CHAR_MICHAEL STAT_GET_INT(SP0_WEAP_ADDON_VIEW_1, iStatData) BREAK
CASE CHAR_FRANKLIN STAT_GET_INT(SP1_WEAP_ADDON_VIEW_1, iStatData) BREAK
CASE CHAR_TREVOR STAT_GET_INT(SP2_WEAP_ADDON_VIEW_1, iStatData) BREAK
ENDSWITCH
BREAK
CASE 2
SWITCH ePed
CASE CHAR_MICHAEL STAT_GET_INT(SP0_WEAP_ADDON_VIEW_2, iStatData) BREAK
CASE CHAR_FRANKLIN STAT_GET_INT(SP1_WEAP_ADDON_VIEW_2, iStatData) BREAK
CASE CHAR_TREVOR STAT_GET_INT(SP2_WEAP_ADDON_VIEW_2, iStatData) BREAK
ENDSWITCH
BREAK
CASE 3
SWITCH ePed
CASE CHAR_MICHAEL STAT_GET_INT(SP0_WEAP_ADDON_VIEW_3, iStatData) BREAK
CASE CHAR_FRANKLIN STAT_GET_INT(SP1_WEAP_ADDON_VIEW_3, iStatData) BREAK
CASE CHAR_TREVOR STAT_GET_INT(SP2_WEAP_ADDON_VIEW_3, iStatData) BREAK
ENDSWITCH
BREAK
#IF USE_TU_CHANGES
CASE 4
SWITCH ePed
CASE CHAR_MICHAEL STAT_GET_INT(SP0_WEAP_ADDON_VIEW_4, iStatData) BREAK
CASE CHAR_FRANKLIN STAT_GET_INT(SP1_WEAP_ADDON_VIEW_4, iStatData) BREAK
CASE CHAR_TREVOR STAT_GET_INT(SP2_WEAP_ADDON_VIEW_4, iStatData) BREAK
ENDSWITCH
BREAK
CASE 5
SWITCH ePed
CASE CHAR_MICHAEL STAT_GET_INT(SP0_WEAP_ADDON_VIEW_5, iStatData) BREAK
CASE CHAR_FRANKLIN STAT_GET_INT(SP1_WEAP_ADDON_VIEW_5, iStatData) BREAK
CASE CHAR_TREVOR STAT_GET_INT(SP2_WEAP_ADDON_VIEW_5, iStatData) BREAK
ENDSWITCH
BREAK
CASE 6
SWITCH ePed
CASE CHAR_MICHAEL STAT_GET_INT(SP0_WEAP_ADDON_VIEW_6, iStatData) BREAK
CASE CHAR_FRANKLIN STAT_GET_INT(SP1_WEAP_ADDON_VIEW_6, iStatData) BREAK
CASE CHAR_TREVOR STAT_GET_INT(SP2_WEAP_ADDON_VIEW_6, iStatData) BREAK
ENDSWITCH
BREAK
#ENDIF
DEFAULT
#IF IS_DEBUG_BUILD
SCRIPT_ASSERT("GET_PLAYER_PED_WEAPON_COMP_VIEWED_BITSET - ran out of stats. Tell Kenneth R.")
#ENDIF
BREAK
ENDSWITCH
RETURN (iStatData)
ENDFUNC
PROC SET_PLAYER_PED_WEAPON_COMP_VIEWED_BITSET(enumCharacterList ePed, WEAPON_TYPE eWeapon, WEAPONCOMPONENT_TYPE eComponent, INT iStatData)
INT iIndex = GET_WEAPON_ADDON_INDEX_FROM_WEAPONS(eComponent, eWeapon)
INT iBitset = GET_WEAPON_ADDON_BITSET(iIndex)
SWITCH iBitset
CASE 0
SWITCH ePed
CASE CHAR_MICHAEL STAT_SET_INT(SP0_WEAP_ADDON_VIEW_0, iStatData) BREAK
CASE CHAR_FRANKLIN STAT_SET_INT(SP1_WEAP_ADDON_VIEW_0, iStatData) BREAK
CASE CHAR_TREVOR STAT_SET_INT(SP2_WEAP_ADDON_VIEW_0, iStatData) BREAK
ENDSWITCH
BREAK
CASE 1
SWITCH ePed
CASE CHAR_MICHAEL STAT_SET_INT(SP0_WEAP_ADDON_VIEW_1, iStatData) BREAK
CASE CHAR_FRANKLIN STAT_SET_INT(SP1_WEAP_ADDON_VIEW_1, iStatData) BREAK
CASE CHAR_TREVOR STAT_SET_INT(SP2_WEAP_ADDON_VIEW_1, iStatData) BREAK
ENDSWITCH
BREAK
CASE 2
SWITCH ePed
CASE CHAR_MICHAEL STAT_SET_INT(SP0_WEAP_ADDON_VIEW_2, iStatData) BREAK
CASE CHAR_FRANKLIN STAT_SET_INT(SP1_WEAP_ADDON_VIEW_2, iStatData) BREAK
CASE CHAR_TREVOR STAT_SET_INT(SP2_WEAP_ADDON_VIEW_2, iStatData) BREAK
ENDSWITCH
BREAK
CASE 3
SWITCH ePed
CASE CHAR_MICHAEL STAT_SET_INT(SP0_WEAP_ADDON_VIEW_3, iStatData) BREAK
CASE CHAR_FRANKLIN STAT_SET_INT(SP1_WEAP_ADDON_VIEW_3, iStatData) BREAK
CASE CHAR_TREVOR STAT_SET_INT(SP2_WEAP_ADDON_VIEW_3, iStatData) BREAK
ENDSWITCH
BREAK
#IF USE_TU_CHANGES
CASE 4
SWITCH ePed
CASE CHAR_MICHAEL STAT_SET_INT(SP0_WEAP_ADDON_VIEW_4, iStatData) BREAK
CASE CHAR_FRANKLIN STAT_SET_INT(SP1_WEAP_ADDON_VIEW_4, iStatData) BREAK
CASE CHAR_TREVOR STAT_SET_INT(SP2_WEAP_ADDON_VIEW_4, iStatData) BREAK
ENDSWITCH
BREAK
CASE 5
SWITCH ePed
CASE CHAR_MICHAEL STAT_SET_INT(SP0_WEAP_ADDON_VIEW_5, iStatData) BREAK
CASE CHAR_FRANKLIN STAT_SET_INT(SP1_WEAP_ADDON_VIEW_5, iStatData) BREAK
CASE CHAR_TREVOR STAT_SET_INT(SP2_WEAP_ADDON_VIEW_5, iStatData) BREAK
ENDSWITCH
BREAK
CASE 6
SWITCH ePed
CASE CHAR_MICHAEL STAT_SET_INT(SP0_WEAP_ADDON_VIEW_6, iStatData) BREAK
CASE CHAR_FRANKLIN STAT_SET_INT(SP1_WEAP_ADDON_VIEW_6, iStatData) BREAK
CASE CHAR_TREVOR STAT_SET_INT(SP2_WEAP_ADDON_VIEW_6, iStatData) BREAK
ENDSWITCH
BREAK
#ENDIF
DEFAULT
#IF IS_DEBUG_BUILD
SCRIPT_ASSERT("SET_PLAYER_PED_WEAPON_COMP_VIEWED_BITSET - ran out of stats. Tell Kenneth R.")
#ENDIF
BREAK
ENDSWITCH
ENDPROC
PROC SET_PLAYER_PED_WEAPON_COMP_VIEWED(enumCharacterList ePed, WEAPON_TYPE eWeapon, WEAPONCOMPONENT_TYPE eComponent, BOOL bState = TRUE)
IF IS_PLAYER_PED_PLAYABLE(ePed)
INT iStatData = GET_PLAYER_PED_WEAPON_COMP_VIEWED_BITSET(ePed, eWeapon, eComponent)
INT iIndex = GET_WEAPON_ADDON_INDEX_FROM_WEAPONS(eComponent, eWeapon)
INT iBit = GET_WEAPON_ADDON_INDEX_BITSET(iIndex)
IF bState
SET_BIT(iStatData, iBit)
ELSE
CLEAR_BIT(iStatData, iBit)
ENDIF
SET_PLAYER_PED_WEAPON_COMP_VIEWED_BITSET(ePed, eWeapon, eComponent, iStatData)
ENDIF
ENDPROC
FUNC BOOL IS_PLAYER_PED_WEAPON_COMP_VIEWED(enumCharacterList ePed, WEAPON_TYPE eWeapon, WEAPONCOMPONENT_TYPE eComponent)
IF IS_PLAYER_PED_PLAYABLE(ePed)
INT iStatData = GET_PLAYER_PED_WEAPON_COMP_VIEWED_BITSET(ePed, eWeapon, eComponent)
INT iIndex = GET_WEAPON_ADDON_INDEX_FROM_WEAPONS(eComponent, eWeapon)
INT iBit = GET_WEAPON_ADDON_INDEX_BITSET(iIndex)
RETURN (IS_BIT_SET(iStatData, iBit))
ENDIF
RETURN FALSE
ENDFUNC
///////////////////////////////////////////////////////////////////////////////////////////////////
///
/// SHOP ITEM STATS - WEAPON COMPONENTS PURCHASED
///
FUNC INT GET_PLAYER_PED_WEAPON_COMP_PURCHASED_BITSET(enumCharacterList ePed, WEAPON_TYPE eWeapon, WEAPONCOMPONENT_TYPE eComponent)
INT iStatData
INT iIndex = GET_WEAPON_ADDON_INDEX_FROM_WEAPONS(eComponent, eWeapon)
INT iBitset = GET_WEAPON_ADDON_BITSET(iIndex)
SWITCH iBitset
CASE 0
SWITCH ePed
CASE CHAR_MICHAEL STAT_GET_INT(SP0_WEAP_ADDON_PURCH_0, iStatData) BREAK
CASE CHAR_FRANKLIN STAT_GET_INT(SP1_WEAP_ADDON_PURCH_0, iStatData) BREAK
CASE CHAR_TREVOR STAT_GET_INT(SP2_WEAP_ADDON_PURCH_0, iStatData) BREAK
ENDSWITCH
BREAK
CASE 1
SWITCH ePed
CASE CHAR_MICHAEL STAT_GET_INT(SP0_WEAP_ADDON_PURCH_1, iStatData) BREAK
CASE CHAR_FRANKLIN STAT_GET_INT(SP1_WEAP_ADDON_PURCH_1, iStatData) BREAK
CASE CHAR_TREVOR STAT_GET_INT(SP2_WEAP_ADDON_PURCH_1, iStatData) BREAK
ENDSWITCH
BREAK
CASE 2
SWITCH ePed
CASE CHAR_MICHAEL STAT_GET_INT(SP0_WEAP_ADDON_PURCH_2, iStatData) BREAK
CASE CHAR_FRANKLIN STAT_GET_INT(SP1_WEAP_ADDON_PURCH_2, iStatData) BREAK
CASE CHAR_TREVOR STAT_GET_INT(SP2_WEAP_ADDON_PURCH_2, iStatData) BREAK
ENDSWITCH
BREAK
CASE 3
SWITCH ePed
CASE CHAR_MICHAEL STAT_GET_INT(SP0_WEAP_ADDON_PURCH_3, iStatData) BREAK
CASE CHAR_FRANKLIN STAT_GET_INT(SP1_WEAP_ADDON_PURCH_3, iStatData) BREAK
CASE CHAR_TREVOR STAT_GET_INT(SP2_WEAP_ADDON_PURCH_3, iStatData) BREAK
ENDSWITCH
BREAK
#IF USE_TU_CHANGES
CASE 4
SWITCH ePed
CASE CHAR_MICHAEL STAT_GET_INT(SP0_WEAP_ADDON_PURCH_4, iStatData) BREAK
CASE CHAR_FRANKLIN STAT_GET_INT(SP1_WEAP_ADDON_PURCH_4, iStatData) BREAK
CASE CHAR_TREVOR STAT_GET_INT(SP2_WEAP_ADDON_PURCH_4, iStatData) BREAK
ENDSWITCH
BREAK
CASE 5
SWITCH ePed
CASE CHAR_MICHAEL STAT_GET_INT(SP0_WEAP_ADDON_PURCH_5, iStatData) BREAK
CASE CHAR_FRANKLIN STAT_GET_INT(SP1_WEAP_ADDON_PURCH_5, iStatData) BREAK
CASE CHAR_TREVOR STAT_GET_INT(SP2_WEAP_ADDON_PURCH_5, iStatData) BREAK
ENDSWITCH
BREAK
CASE 6
SWITCH ePed
CASE CHAR_MICHAEL STAT_GET_INT(SP0_WEAP_ADDON_PURCH_6, iStatData) BREAK
CASE CHAR_FRANKLIN STAT_GET_INT(SP1_WEAP_ADDON_PURCH_6, iStatData) BREAK
CASE CHAR_TREVOR STAT_GET_INT(SP2_WEAP_ADDON_PURCH_6, iStatData) BREAK
ENDSWITCH
BREAK
#ENDIF
DEFAULT
#IF IS_DEBUG_BUILD
SCRIPT_ASSERT("GET_PLAYER_PED_WEAPON_COMP_PURCHASED_BITSET - ran out of stats. Tell Kenneth R.")
#ENDIF
BREAK
ENDSWITCH
RETURN (iStatData)
ENDFUNC
PROC SET_PLAYER_PED_WEAPON_COMP_PURCHASED_BITSET(enumCharacterList ePed, WEAPON_TYPE eWeapon, WEAPONCOMPONENT_TYPE eComponent, INT iStatData)
INT iIndex = GET_WEAPON_ADDON_INDEX_FROM_WEAPONS(eComponent, eWeapon)
INT iBitset = GET_WEAPON_ADDON_BITSET(iIndex)
SWITCH iBitset
CASE 0
SWITCH ePed
CASE CHAR_MICHAEL STAT_SET_INT(SP0_WEAP_ADDON_PURCH_0, iStatData) BREAK
CASE CHAR_FRANKLIN STAT_SET_INT(SP1_WEAP_ADDON_PURCH_0, iStatData) BREAK
CASE CHAR_TREVOR STAT_SET_INT(SP2_WEAP_ADDON_PURCH_0, iStatData) BREAK
ENDSWITCH
BREAK
CASE 1
SWITCH ePed
CASE CHAR_MICHAEL STAT_SET_INT(SP0_WEAP_ADDON_PURCH_1, iStatData) BREAK
CASE CHAR_FRANKLIN STAT_SET_INT(SP1_WEAP_ADDON_PURCH_1, iStatData) BREAK
CASE CHAR_TREVOR STAT_SET_INT(SP2_WEAP_ADDON_PURCH_1, iStatData) BREAK
ENDSWITCH
BREAK
CASE 2
SWITCH ePed
CASE CHAR_MICHAEL STAT_SET_INT(SP0_WEAP_ADDON_PURCH_2, iStatData) BREAK
CASE CHAR_FRANKLIN STAT_SET_INT(SP1_WEAP_ADDON_PURCH_2, iStatData) BREAK
CASE CHAR_TREVOR STAT_SET_INT(SP2_WEAP_ADDON_PURCH_2, iStatData) BREAK
ENDSWITCH
BREAK
CASE 3
SWITCH ePed
CASE CHAR_MICHAEL STAT_SET_INT(SP0_WEAP_ADDON_PURCH_3, iStatData) BREAK
CASE CHAR_FRANKLIN STAT_SET_INT(SP1_WEAP_ADDON_PURCH_3, iStatData) BREAK
CASE CHAR_TREVOR STAT_SET_INT(SP2_WEAP_ADDON_PURCH_3, iStatData) BREAK
ENDSWITCH
BREAK
#IF USE_TU_CHANGES
CASE 4
SWITCH ePed
CASE CHAR_MICHAEL STAT_SET_INT(SP0_WEAP_ADDON_PURCH_4, iStatData) BREAK
CASE CHAR_FRANKLIN STAT_SET_INT(SP1_WEAP_ADDON_PURCH_4, iStatData) BREAK
CASE CHAR_TREVOR STAT_SET_INT(SP2_WEAP_ADDON_PURCH_4, iStatData) BREAK
ENDSWITCH
BREAK
CASE 5
SWITCH ePed
CASE CHAR_MICHAEL STAT_SET_INT(SP0_WEAP_ADDON_PURCH_5, iStatData) BREAK
CASE CHAR_FRANKLIN STAT_SET_INT(SP1_WEAP_ADDON_PURCH_5, iStatData) BREAK
CASE CHAR_TREVOR STAT_SET_INT(SP2_WEAP_ADDON_PURCH_5, iStatData) BREAK
ENDSWITCH
BREAK
CASE 6
SWITCH ePed
CASE CHAR_MICHAEL STAT_SET_INT(SP0_WEAP_ADDON_PURCH_6, iStatData) BREAK
CASE CHAR_FRANKLIN STAT_SET_INT(SP1_WEAP_ADDON_PURCH_6, iStatData) BREAK
CASE CHAR_TREVOR STAT_SET_INT(SP2_WEAP_ADDON_PURCH_6, iStatData) BREAK
ENDSWITCH
BREAK
#ENDIF
DEFAULT
#IF IS_DEBUG_BUILD
SCRIPT_ASSERT("SET_PLAYER_PED_WEAPON_COMP_PURCHASED_BITSET - ran out of stats. Tell Kenneth R.")
#ENDIF
BREAK
ENDSWITCH
ENDPROC
PROC SET_PLAYER_PED_WEAPON_COMP_PURCHASED(enumCharacterList ePed, WEAPON_TYPE eWeapon, WEAPONCOMPONENT_TYPE eComponent, BOOL bState = TRUE)
IF IS_PLAYER_PED_PLAYABLE(ePed)
INT iStatData = GET_PLAYER_PED_WEAPON_COMP_PURCHASED_BITSET(ePed, eWeapon, eComponent)
INT iIndex = GET_WEAPON_ADDON_INDEX_FROM_WEAPONS(eComponent, eWeapon)
INT iBit = GET_WEAPON_ADDON_INDEX_BITSET(iIndex)
IF bState
SET_BIT(iStatData, iBit)
ELSE
CLEAR_BIT(iStatData, iBit)
ENDIF
SET_PLAYER_PED_WEAPON_COMP_PURCHASED_BITSET(ePed, eWeapon, eComponent, iStatData)
ENDIF
ENDPROC
FUNC BOOL IS_PLAYER_PED_WEAPON_COMP_PURCHASED(enumCharacterList ePed, WEAPON_TYPE eWeapon, WEAPONCOMPONENT_TYPE eComponent)
IF IS_PLAYER_PED_PLAYABLE(ePed)
INT iStatData = GET_PLAYER_PED_WEAPON_COMP_PURCHASED_BITSET(ePed, eWeapon, eComponent)
INT iIndex = GET_WEAPON_ADDON_INDEX_FROM_WEAPONS(eComponent, eWeapon)
INT iBit = GET_WEAPON_ADDON_INDEX_BITSET(iIndex)
RETURN (IS_BIT_SET(iStatData, iBit))
ENDIF
RETURN FALSE
ENDFUNC
///////////////////////////////////////////////////////////////////////////////////////////////////
///
/// SHOP ITEM STATS - WEAPONS UNLOCKED
///
FUNC INT GET_PLAYER_PED_WEAPON_UNLOCKED_BITSET(enumCharacterList ePed, WEAPON_TYPE eWeapon)
INT iStatData
INT iIndex = GET_WEAPON_INDEX_FROM_WEAPON_TYPE(eWeapon)
INT iBitset = GET_WEAPON_BITSET(iIndex)
SWITCH iBitset
CASE 0
SWITCH ePed
CASE CHAR_MICHAEL STAT_GET_INT(SP0_WEAP_UNLOCK_0, iStatData) BREAK
CASE CHAR_FRANKLIN STAT_GET_INT(SP1_WEAP_UNLOCK_0, iStatData) BREAK
CASE CHAR_TREVOR STAT_GET_INT(SP2_WEAP_UNLOCK_0, iStatData) BREAK
ENDSWITCH
BREAK
CASE 1
SWITCH ePed
CASE CHAR_MICHAEL STAT_GET_INT(SP0_WEAP_UNLOCK_1, iStatData) BREAK
CASE CHAR_FRANKLIN STAT_GET_INT(SP1_WEAP_UNLOCK_1, iStatData) BREAK
CASE CHAR_TREVOR STAT_GET_INT(SP2_WEAP_UNLOCK_1, iStatData) BREAK
ENDSWITCH
BREAK
CASE 2
SWITCH ePed
CASE CHAR_MICHAEL STAT_GET_INT(SP0_WEAP_UNLOCK_2, iStatData) BREAK
CASE CHAR_FRANKLIN STAT_GET_INT(SP1_WEAP_UNLOCK_2, iStatData) BREAK
CASE CHAR_TREVOR STAT_GET_INT(SP2_WEAP_UNLOCK_2, iStatData) BREAK
ENDSWITCH
BREAK
DEFAULT
#IF IS_DEBUG_BUILD
SCRIPT_ASSERT("GET_PLAYER_PED_WEAPON_UNLOCKED_BITSET - ran out of stats. Tell Kenneth R.")
#ENDIF
BREAK
ENDSWITCH
RETURN (iStatData)
ENDFUNC
PROC SET_PLAYER_PED_WEAPON_UNLOCKED_BITSET(enumCharacterList ePed, WEAPON_TYPE eWeapon, INT iStatData)
INT iIndex = GET_WEAPON_INDEX_FROM_WEAPON_TYPE(eWeapon)
INT iBitset = GET_WEAPON_BITSET(iIndex)
SWITCH iBitset
CASE 0
SWITCH ePed
CASE CHAR_MICHAEL STAT_SET_INT(SP0_WEAP_UNLOCK_0, iStatData) BREAK
CASE CHAR_FRANKLIN STAT_SET_INT(SP1_WEAP_UNLOCK_0, iStatData) BREAK
CASE CHAR_TREVOR STAT_SET_INT(SP2_WEAP_UNLOCK_0, iStatData) BREAK
ENDSWITCH
BREAK
CASE 1
SWITCH ePed
CASE CHAR_MICHAEL STAT_SET_INT(SP0_WEAP_UNLOCK_1, iStatData) BREAK
CASE CHAR_FRANKLIN STAT_SET_INT(SP1_WEAP_UNLOCK_1, iStatData) BREAK
CASE CHAR_TREVOR STAT_SET_INT(SP2_WEAP_UNLOCK_1, iStatData) BREAK
ENDSWITCH
BREAK
CASE 2
SWITCH ePed
CASE CHAR_MICHAEL STAT_SET_INT(SP0_WEAP_UNLOCK_2, iStatData) BREAK
CASE CHAR_FRANKLIN STAT_SET_INT(SP1_WEAP_UNLOCK_2, iStatData) BREAK
CASE CHAR_TREVOR STAT_SET_INT(SP2_WEAP_UNLOCK_2, iStatData) BREAK
ENDSWITCH
BREAK
DEFAULT
#IF IS_DEBUG_BUILD
SCRIPT_ASSERT("SET_PLAYER_PED_WEAPON_UNLOCKED_BITSET - ran out of stats. Tell Kenneth R.")
#ENDIF
BREAK
ENDSWITCH
ENDPROC
PROC SET_PLAYER_PED_WEAPON_UNLOCKED(enumCharacterList ePed, WEAPON_TYPE eWeapon, BOOL bState = TRUE, BOOL bUnlockAllComponents = TRUE)
IF IS_PLAYER_PED_PLAYABLE(ePed)
INT iStatData = GET_PLAYER_PED_WEAPON_UNLOCKED_BITSET(ePed, eWeapon)
INT iIndex = GET_WEAPON_INDEX_FROM_WEAPON_TYPE(eWeapon)
INT iBit = GET_WEAPON_INDEX_BITSET(iIndex)
IF bState
SET_BIT(iStatData, iBit)
ELSE
CLEAR_BIT(iStatData, iBit)
ENDIF
SET_PLAYER_PED_WEAPON_UNLOCKED_BITSET(ePed, eWeapon, iStatData)
IF bUnlockAllComponents
SET_ALL_PLAYER_PED_WEAPON_COMPS_UNLOCKED_FOR_WEAPON(ePed, eWeapon)
ENDIF
ENDIF
ENDPROC
FUNC BOOL IS_PLAYER_PED_WEAPON_UNLOCKED(enumCharacterList ePed, WEAPON_TYPE eWeapon)
IF IS_PLAYER_PED_PLAYABLE(ePed)
// All dlc and special weapons/components are unlocked by default
IF IS_WEAPON_UNLOCKED_BY_DEFAULT(eWeapon)
RETURN TRUE
ENDIF
INT iStatData = GET_PLAYER_PED_WEAPON_UNLOCKED_BITSET(ePed, eWeapon)
INT iIndex = GET_WEAPON_INDEX_FROM_WEAPON_TYPE(eWeapon)
INT iBit = GET_WEAPON_INDEX_BITSET(iIndex)
RETURN (IS_BIT_SET(iStatData, iBit))
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL IS_DLC_WEAPON_UNLOCKED_FOR_SHOPS(WEAPON_TYPE eWeapon)
// DLC weapons now unlock in flow for NG game.
SWITCH eWeapon
CASE WEAPONTYPE_DLC_ASSAULTSMG
RETURN g_savedGlobals.sFlow.missionSavedData[SP_MISSION_ARMENIAN_1].completed
BREAK
CASE WEAPONTYPE_DLC_HATCHET
IF IS_LAST_GEN_PLAYER()
RETURN (g_savedGlobals.sFlow.missionSavedData[SP_MISSION_TREVOR_1].completed)
ELSE
RETURN FALSE
ENDIF
BREAK
CASE WEAPONTYPE_DLC_RAILGUN
IF IS_LAST_GEN_PLAYER()
RETURN (g_savedGlobals.sFlow.missionSavedData[SP_MISSION_EXILE_1].completed)
ELSE
RETURN FALSE
ENDIF
BREAK
CASE WEAPONTYPE_DLC_BOTTLE
CASE WEAPONTYPE_HAMMER
RETURN (g_savedGlobals.sFlow.missionSavedData[SP_MISSION_ARMENIAN_2].completed)
BREAK
CASE WEAPONTYPE_DLC_SNSPISTOL
RETURN (g_savedGlobals.sFlow.missionSavedData[SP_MISSION_ARMENIAN_2].completed OR g_savedGlobals.sFlow.missionSavedData[SP_MISSION_LAMAR].completed OR g_savedGlobals.sFlow.missionSavedData[SP_MISSION_FAMILY_3].completed)
BREAK
CASE WEAPONTYPE_DLC_SPECIALCARBINE
RETURN (g_savedGlobals.sFlow.missionSavedData[SP_HEIST_JEWELRY_2].completed)
BREAK
CASE WEAPONTYPE_DLC_DAGGER
CASE WEAPONTYPE_DLC_VINTAGEPISTOL
RETURN (g_savedGlobals.sFlow.missionSavedData[SP_MISSION_TREVOR_1].completed)
BREAK
CASE WEAPONTYPE_DLC_HEAVYPISTOL
RETURN (g_savedGlobals.sFlow.missionSavedData[SP_MISSION_FBI_1].completed)
BREAK
CASE WEAPONTYPE_DLC_BULLPUPSHOTGUN
RETURN (g_savedGlobals.sFlow.missionSavedData[SP_HEIST_DOCKS_2A].completed OR g_savedGlobals.sFlow.missionSavedData[SP_MISSION_FBI_4].completed)
BREAK
CASE WEAPONTYPE_DLC_MUSKET
RETURN (g_savedGlobals.sFlow.missionSavedData[SP_MISSION_SOLOMON_1].completed)
BREAK
CASE WEAPONTYPE_DLC_GUSENBERG
RETURN (g_savedGlobals.sFlow.missionSavedData[SP_MISSION_FINALE_CREDITS].completed)
BREAK
CASE WEAPONTYPE_DLC_PISTOL50
RETURN (g_savedGlobals.sFlow.missionSavedData[SP_MISSION_FBI_5].completed)
BREAK
CASE WEAPONTYPE_DLC_BULLPUPRIFLE
RETURN (g_savedGlobals.sFlow.missionSavedData[SP_HEIST_FINALE_2A].completed OR g_savedGlobals.sFlow.missionSavedData[SP_HEIST_FINALE_2B].completed)
BREAK
CASE WEAPONTYPE_DLC_MARKSMANRIFLE
RETURN (g_savedGlobals.sFlow.missionSavedData[SP_HEIST_RURAL_2].completed)
BREAK
CASE WEAPONTYPE_DLC_HEAVYSHOTGUN
RETURN (g_savedGlobals.sFlow.missionSavedData[SP_MISSION_FBI_5].completed)
BREAK
CASE WEAPONTYPE_DLC_FIREWORK
RETURN (g_savedGlobals.sFlow.missionSavedData[SP_MISSION_FINALE_CREDITS].completed)
BREAK
CASE WEAPONTYPE_DLC_PROXMINE
RETURN (g_savedGlobals.sFlow.missionSavedData[SP_MISSION_TREVOR_3].completed)
BREAK
CASE WEAPONTYPE_DLC_HOMINGLAUNCHER
RETURN (g_savedGlobals.sFlow.missionSavedData[SP_MISSION_EXILE_1].completed)
BREAK
ENDSWITCH
//Not a DLC weapon, return TRUE by default
RETURN TRUE
ENDFUNC
///////////////////////////////////////////////////////////////////////////////////////////////////
///
/// SHOP ITEM STATS - WEAPONS VIEWED
///
FUNC INT GET_PLAYER_PED_WEAPON_VIEWED_BITSET(enumCharacterList ePed, WEAPON_TYPE eWeapon)
INT iStatData
INT iIndex = GET_WEAPON_INDEX_FROM_WEAPON_TYPE(eWeapon)
INT iBitset = GET_WEAPON_BITSET(iIndex)
SWITCH iBitset
CASE 0
SWITCH ePed
CASE CHAR_MICHAEL STAT_GET_INT(SP0_WEAP_VIEW_0, iStatData) BREAK
CASE CHAR_FRANKLIN STAT_GET_INT(SP1_WEAP_VIEW_0, iStatData) BREAK
CASE CHAR_TREVOR STAT_GET_INT(SP2_WEAP_VIEW_0, iStatData) BREAK
ENDSWITCH
BREAK
CASE 1
SWITCH ePed
CASE CHAR_MICHAEL STAT_GET_INT(SP0_WEAP_VIEW_1, iStatData) BREAK
CASE CHAR_FRANKLIN STAT_GET_INT(SP1_WEAP_VIEW_1, iStatData) BREAK
CASE CHAR_TREVOR STAT_GET_INT(SP2_WEAP_VIEW_1, iStatData) BREAK
ENDSWITCH
BREAK
CASE 2
SWITCH ePed
CASE CHAR_MICHAEL STAT_GET_INT(SP0_WEAP_VIEW_2, iStatData) BREAK
CASE CHAR_FRANKLIN STAT_GET_INT(SP1_WEAP_VIEW_2, iStatData) BREAK
CASE CHAR_TREVOR STAT_GET_INT(SP2_WEAP_VIEW_2, iStatData) BREAK
ENDSWITCH
BREAK
DEFAULT
#IF IS_DEBUG_BUILD
SCRIPT_ASSERT("GET_PLAYER_PED_WEAPON_VIEWED_BITSET - ran out of stats. Tell Kenneth R.")
#ENDIF
BREAK
ENDSWITCH
RETURN (iStatData)
ENDFUNC
PROC SET_PLAYER_PED_WEAPON_VIEWED_BITSET(enumCharacterList ePed, WEAPON_TYPE eWeapon, INT iStatData)
INT iIndex = GET_WEAPON_INDEX_FROM_WEAPON_TYPE(eWeapon)
INT iBitset = GET_WEAPON_BITSET(iIndex)
SWITCH iBitset
CASE 0
SWITCH ePed
CASE CHAR_MICHAEL STAT_SET_INT(SP0_WEAP_VIEW_0, iStatData) BREAK
CASE CHAR_FRANKLIN STAT_SET_INT(SP1_WEAP_VIEW_0, iStatData) BREAK
CASE CHAR_TREVOR STAT_SET_INT(SP2_WEAP_VIEW_0, iStatData) BREAK
ENDSWITCH
BREAK
CASE 1
SWITCH ePed
CASE CHAR_MICHAEL STAT_SET_INT(SP0_WEAP_VIEW_1, iStatData) BREAK
CASE CHAR_FRANKLIN STAT_SET_INT(SP1_WEAP_VIEW_1, iStatData) BREAK
CASE CHAR_TREVOR STAT_SET_INT(SP2_WEAP_VIEW_1, iStatData) BREAK
ENDSWITCH
BREAK
CASE 2
SWITCH ePed
CASE CHAR_MICHAEL STAT_SET_INT(SP0_WEAP_VIEW_2, iStatData) BREAK
CASE CHAR_FRANKLIN STAT_SET_INT(SP1_WEAP_VIEW_2, iStatData) BREAK
CASE CHAR_TREVOR STAT_SET_INT(SP2_WEAP_VIEW_2, iStatData) BREAK
ENDSWITCH
BREAK
DEFAULT
#IF IS_DEBUG_BUILD
SCRIPT_ASSERT("SET_PLAYER_PED_WEAPON_VIEWED_BITSET - ran out of stats. Tell Kenneth R.")
#ENDIF
BREAK
ENDSWITCH
ENDPROC
PROC SET_PLAYER_PED_WEAPON_VIEWED(enumCharacterList ePed, WEAPON_TYPE eWeapon, BOOL bState = TRUE)
IF IS_PLAYER_PED_PLAYABLE(ePed)
INT iStatData = GET_PLAYER_PED_WEAPON_VIEWED_BITSET(ePed, eWeapon)
INT iIndex = GET_WEAPON_INDEX_FROM_WEAPON_TYPE(eWeapon)
INT iBit = GET_WEAPON_INDEX_BITSET(iIndex)
IF bState
SET_BIT(iStatData, iBit)
ELSE
CLEAR_BIT(iStatData, iBit)
ENDIF
SET_PLAYER_PED_WEAPON_VIEWED_BITSET(ePed, eWeapon, iStatData)
ENDIF
ENDPROC
FUNC BOOL IS_PLAYER_PED_WEAPON_VIEWED(enumCharacterList ePed, WEAPON_TYPE eWeapon)
IF IS_PLAYER_PED_PLAYABLE(ePed)
INT iStatData = GET_PLAYER_PED_WEAPON_VIEWED_BITSET(ePed, eWeapon)
INT iIndex = GET_WEAPON_INDEX_FROM_WEAPON_TYPE(eWeapon)
INT iBit = GET_WEAPON_INDEX_BITSET(iIndex)
RETURN (IS_BIT_SET(iStatData, iBit))
ENDIF
RETURN FALSE
ENDFUNC
///////////////////////////////////////////////////////////////////////////////////////////////////
///
/// SHOP ITEM STATS - WEAPONS PURCHASED
///
FUNC INT GET_PLAYER_PED_WEAPON_PURCHASED_BITSET(enumCharacterList ePed, WEAPON_TYPE eWeapon)
INT iStatData
INT iIndex = GET_WEAPON_INDEX_FROM_WEAPON_TYPE(eWeapon)
INT iBitset = GET_WEAPON_BITSET(iIndex)
SWITCH iBitset
CASE 0
SWITCH ePed
CASE CHAR_MICHAEL STAT_GET_INT(SP0_WEAP_PURCH_0, iStatData) BREAK
CASE CHAR_FRANKLIN STAT_GET_INT(SP1_WEAP_PURCH_0, iStatData) BREAK
CASE CHAR_TREVOR STAT_GET_INT(SP2_WEAP_PURCH_0, iStatData) BREAK
ENDSWITCH
BREAK
CASE 1
SWITCH ePed
CASE CHAR_MICHAEL STAT_GET_INT(SP0_WEAP_PURCH_1, iStatData) BREAK
CASE CHAR_FRANKLIN STAT_GET_INT(SP1_WEAP_PURCH_1, iStatData) BREAK
CASE CHAR_TREVOR STAT_GET_INT(SP2_WEAP_PURCH_1, iStatData) BREAK
ENDSWITCH
BREAK
CASE 2
SWITCH ePed
CASE CHAR_MICHAEL STAT_GET_INT(SP0_WEAP_PURCH_2, iStatData) BREAK
CASE CHAR_FRANKLIN STAT_GET_INT(SP1_WEAP_PURCH_2, iStatData) BREAK
CASE CHAR_TREVOR STAT_GET_INT(SP2_WEAP_PURCH_2, iStatData) BREAK
ENDSWITCH
BREAK
DEFAULT
#IF IS_DEBUG_BUILD
SCRIPT_ASSERT("GET_PLAYER_PED_WEAPON_PURCHASED_BITSET - ran out of stats. Tell Kenneth R.")
#ENDIF
BREAK
ENDSWITCH
RETURN (iStatData)
ENDFUNC
PROC SET_PLAYER_PED_WEAPON_PURCHASED_BITSET(enumCharacterList ePed, WEAPON_TYPE eWeapon, INT iStatData)
INT iIndex = GET_WEAPON_INDEX_FROM_WEAPON_TYPE(eWeapon)
INT iBitset = GET_WEAPON_BITSET(iIndex)
SWITCH iBitset
CASE 0
SWITCH ePed
CASE CHAR_MICHAEL STAT_SET_INT(SP0_WEAP_PURCH_0, iStatData) BREAK
CASE CHAR_FRANKLIN STAT_SET_INT(SP1_WEAP_PURCH_0, iStatData) BREAK
CASE CHAR_TREVOR STAT_SET_INT(SP2_WEAP_PURCH_0, iStatData) BREAK
ENDSWITCH
BREAK
CASE 1
SWITCH ePed
CASE CHAR_MICHAEL STAT_SET_INT(SP0_WEAP_PURCH_1, iStatData) BREAK
CASE CHAR_FRANKLIN STAT_SET_INT(SP1_WEAP_PURCH_1, iStatData) BREAK
CASE CHAR_TREVOR STAT_SET_INT(SP2_WEAP_PURCH_1, iStatData) BREAK
ENDSWITCH
BREAK
CASE 2
SWITCH ePed
CASE CHAR_MICHAEL STAT_SET_INT(SP0_WEAP_PURCH_2, iStatData) BREAK
CASE CHAR_FRANKLIN STAT_SET_INT(SP1_WEAP_PURCH_2, iStatData) BREAK
CASE CHAR_TREVOR STAT_SET_INT(SP2_WEAP_PURCH_2, iStatData) BREAK
ENDSWITCH
BREAK
DEFAULT
#IF IS_DEBUG_BUILD
SCRIPT_ASSERT("SET_PLAYER_PED_WEAPON_PURCHASED_BITSET - ran out of stats. Tell Kenneth R.")
#ENDIF
BREAK
ENDSWITCH
ENDPROC
PROC SET_PLAYER_PED_WEAPON_PURCHASED(enumCharacterList ePed, WEAPON_TYPE eWeapon, BOOL bState = TRUE)
IF IS_PLAYER_PED_PLAYABLE(ePed)
INT iStatData = GET_PLAYER_PED_WEAPON_PURCHASED_BITSET(ePed, eWeapon)
INT iIndex = GET_WEAPON_INDEX_FROM_WEAPON_TYPE(eWeapon)
INT iBit = GET_WEAPON_INDEX_BITSET(iIndex)
IF bState
SET_BIT(iStatData, iBit)
ELSE
CLEAR_BIT(iStatData, iBit)
ENDIF
SET_PLAYER_PED_WEAPON_PURCHASED_BITSET(ePed, eWeapon, iStatData)
ENDIF
ENDPROC
FUNC BOOL IS_PLAYER_PED_WEAPON_PURCHASED(enumCharacterList ePed, WEAPON_TYPE eWeapon)
IF IS_PLAYER_PED_PLAYABLE(ePed)
INT iStatData = GET_PLAYER_PED_WEAPON_PURCHASED_BITSET(ePed, eWeapon)
INT iIndex = GET_WEAPON_INDEX_FROM_WEAPON_TYPE(eWeapon)
INT iBit = GET_WEAPON_INDEX_BITSET(iIndex)
RETURN (IS_BIT_SET(iStatData, iBit))
ENDIF
RETURN FALSE
ENDFUNC
///////////////////////////////////////////////////////////////////////////////////////////////////
///
/// SHOP ITEM STATS - PLAYER KIT PURCHASED
///
FUNC INT GET_PLAYER_PED_PLAYERKIT_PURCHASED_BITSET(enumCharacterList ePed, PLAYERKIT ePlyrKit)
INT iStatData
INT iIndex = GET_KIT_INDEX_FROM_PLAYERKIT_TYPE(ePlyrKit)
INT iBitset = GET_KIT_BITSET(iIndex)
SWITCH iBitset
CASE 0
SWITCH ePed
CASE CHAR_MICHAEL STAT_GET_INT(SP0_WEAP_TINT_PURCH_0, iStatData) BREAK
CASE CHAR_FRANKLIN STAT_GET_INT(SP1_WEAP_TINT_PURCH_0, iStatData) BREAK
CASE CHAR_TREVOR STAT_GET_INT(SP2_WEAP_TINT_PURCH_0, iStatData) BREAK
ENDSWITCH
BREAK
CASE 1
SWITCH ePed
CASE CHAR_MICHAEL STAT_GET_INT(SP0_WEAP_TINT_PURCH_1, iStatData) BREAK
CASE CHAR_FRANKLIN STAT_GET_INT(SP1_WEAP_TINT_PURCH_1, iStatData) BREAK
CASE CHAR_TREVOR STAT_GET_INT(SP2_WEAP_TINT_PURCH_1, iStatData) BREAK
ENDSWITCH
BREAK
CASE 2
SWITCH ePed
CASE CHAR_MICHAEL STAT_GET_INT(SP0_WEAP_TINT_PURCH_2, iStatData) BREAK
CASE CHAR_FRANKLIN STAT_GET_INT(SP1_WEAP_TINT_PURCH_2, iStatData) BREAK
CASE CHAR_TREVOR STAT_GET_INT(SP2_WEAP_TINT_PURCH_2, iStatData) BREAK
ENDSWITCH
BREAK
CASE 3
SWITCH ePed
CASE CHAR_MICHAEL STAT_GET_INT(SP0_WEAP_TINT_PURCH_3, iStatData) BREAK
CASE CHAR_FRANKLIN STAT_GET_INT(SP1_WEAP_TINT_PURCH_3, iStatData) BREAK
CASE CHAR_TREVOR STAT_GET_INT(SP2_WEAP_TINT_PURCH_3, iStatData) BREAK
ENDSWITCH
BREAK
CASE 4
SWITCH ePed
CASE CHAR_MICHAEL STAT_GET_INT(SP0_WEAP_TINT_PURCH_4, iStatData) BREAK
CASE CHAR_FRANKLIN STAT_GET_INT(SP1_WEAP_TINT_PURCH_4, iStatData) BREAK
CASE CHAR_TREVOR STAT_GET_INT(SP2_WEAP_TINT_PURCH_4, iStatData) BREAK
ENDSWITCH
BREAK
CASE 5
SWITCH ePed
CASE CHAR_MICHAEL STAT_GET_INT(SP0_WEAP_TINT_PURCH_5, iStatData) BREAK
CASE CHAR_FRANKLIN STAT_GET_INT(SP1_WEAP_TINT_PURCH_5, iStatData) BREAK
CASE CHAR_TREVOR STAT_GET_INT(SP2_WEAP_TINT_PURCH_5, iStatData) BREAK
ENDSWITCH
BREAK
CASE 6
SWITCH ePed
CASE CHAR_MICHAEL STAT_GET_INT(SP0_WEAP_TINT_PURCH_6, iStatData) BREAK
CASE CHAR_FRANKLIN STAT_GET_INT(SP1_WEAP_TINT_PURCH_6, iStatData) BREAK
CASE CHAR_TREVOR STAT_GET_INT(SP2_WEAP_TINT_PURCH_6, iStatData) BREAK
ENDSWITCH
BREAK
CASE 7
SWITCH ePed
CASE CHAR_MICHAEL STAT_GET_INT(SP0_WEAP_TINT_PURCH_7, iStatData) BREAK
CASE CHAR_FRANKLIN STAT_GET_INT(SP1_WEAP_TINT_PURCH_7, iStatData) BREAK
CASE CHAR_TREVOR STAT_GET_INT(SP2_WEAP_TINT_PURCH_7, iStatData) BREAK
ENDSWITCH
BREAK
#IF USE_TU_CHANGES
CASE 8
SWITCH ePed
CASE CHAR_MICHAEL STAT_GET_INT(SP0_WEAP_TINT_PURCH_8, iStatData) BREAK
CASE CHAR_FRANKLIN STAT_GET_INT(SP1_WEAP_TINT_PURCH_8, iStatData) BREAK
CASE CHAR_TREVOR STAT_GET_INT(SP2_WEAP_TINT_PURCH_8, iStatData) BREAK
ENDSWITCH
BREAK
CASE 9
SWITCH ePed
CASE CHAR_MICHAEL STAT_GET_INT(SP0_WEAP_TINT_PURCH_9, iStatData) BREAK
CASE CHAR_FRANKLIN STAT_GET_INT(SP1_WEAP_TINT_PURCH_9, iStatData) BREAK
CASE CHAR_TREVOR STAT_GET_INT(SP2_WEAP_TINT_PURCH_9, iStatData) BREAK
ENDSWITCH
BREAK
CASE 10
SWITCH ePed
CASE CHAR_MICHAEL STAT_GET_INT(SP0_WEAP_TINT_PURCH_10, iStatData) BREAK
CASE CHAR_FRANKLIN STAT_GET_INT(SP1_WEAP_TINT_PURCH_10, iStatData) BREAK
CASE CHAR_TREVOR STAT_GET_INT(SP2_WEAP_TINT_PURCH_10, iStatData) BREAK
ENDSWITCH
BREAK
CASE 11
SWITCH ePed
CASE CHAR_MICHAEL STAT_GET_INT(SP0_WEAP_TINT_PURCH_11, iStatData) BREAK
CASE CHAR_FRANKLIN STAT_GET_INT(SP1_WEAP_TINT_PURCH_11, iStatData) BREAK
CASE CHAR_TREVOR STAT_GET_INT(SP2_WEAP_TINT_PURCH_11, iStatData) BREAK
ENDSWITCH
BREAK
CASE 12
SWITCH ePed
CASE CHAR_MICHAEL STAT_GET_INT(SP0_WEAP_TINT_PURCH_12, iStatData) BREAK
CASE CHAR_FRANKLIN STAT_GET_INT(SP1_WEAP_TINT_PURCH_12, iStatData) BREAK
CASE CHAR_TREVOR STAT_GET_INT(SP2_WEAP_TINT_PURCH_12, iStatData) BREAK
ENDSWITCH
BREAK
#ENDIF
DEFAULT
#IF IS_DEBUG_BUILD
CASSERTLN(DEBUG_PED_COMP, "GET_PLAYER_PED_PLAYERKIT_PURCHASED_BITSET - ran out of stats [iBitset: ", iBitset, "]. Tell Kenneth R.")
#ENDIF
BREAK
ENDSWITCH
RETURN (iStatData)
ENDFUNC
PROC SET_PLAYER_PED_PLAYERKIT_PURCHASED_BITSET(enumCharacterList ePed, PLAYERKIT ePlyrKit, INT iStatData)
INT iIndex = GET_KIT_INDEX_FROM_PLAYERKIT_TYPE(ePlyrKit)
INT iBitset = GET_KIT_BITSET(iIndex)
SWITCH iBitset
CASE 0
SWITCH ePed
CASE CHAR_MICHAEL STAT_SET_INT(SP0_WEAP_TINT_PURCH_0, iStatData) BREAK
CASE CHAR_FRANKLIN STAT_SET_INT(SP1_WEAP_TINT_PURCH_0, iStatData) BREAK
CASE CHAR_TREVOR STAT_SET_INT(SP2_WEAP_TINT_PURCH_0, iStatData) BREAK
ENDSWITCH
BREAK
CASE 1
SWITCH ePed
CASE CHAR_MICHAEL STAT_SET_INT(SP0_WEAP_TINT_PURCH_1, iStatData) BREAK
CASE CHAR_FRANKLIN STAT_SET_INT(SP1_WEAP_TINT_PURCH_1, iStatData) BREAK
CASE CHAR_TREVOR STAT_SET_INT(SP2_WEAP_TINT_PURCH_1, iStatData) BREAK
ENDSWITCH
BREAK
CASE 2
SWITCH ePed
CASE CHAR_MICHAEL STAT_SET_INT(SP0_WEAP_TINT_PURCH_2, iStatData) BREAK
CASE CHAR_FRANKLIN STAT_SET_INT(SP1_WEAP_TINT_PURCH_2, iStatData) BREAK
CASE CHAR_TREVOR STAT_SET_INT(SP2_WEAP_TINT_PURCH_2, iStatData) BREAK
ENDSWITCH
BREAK
CASE 3
SWITCH ePed
CASE CHAR_MICHAEL STAT_SET_INT(SP0_WEAP_TINT_PURCH_3, iStatData) BREAK
CASE CHAR_FRANKLIN STAT_SET_INT(SP1_WEAP_TINT_PURCH_3, iStatData) BREAK
CASE CHAR_TREVOR STAT_SET_INT(SP2_WEAP_TINT_PURCH_3, iStatData) BREAK
ENDSWITCH
BREAK
CASE 4
SWITCH ePed
CASE CHAR_MICHAEL STAT_SET_INT(SP0_WEAP_TINT_PURCH_4, iStatData) BREAK
CASE CHAR_FRANKLIN STAT_SET_INT(SP1_WEAP_TINT_PURCH_4, iStatData) BREAK
CASE CHAR_TREVOR STAT_SET_INT(SP2_WEAP_TINT_PURCH_4, iStatData) BREAK
ENDSWITCH
BREAK
CASE 5
SWITCH ePed
CASE CHAR_MICHAEL STAT_SET_INT(SP0_WEAP_TINT_PURCH_5, iStatData) BREAK
CASE CHAR_FRANKLIN STAT_SET_INT(SP1_WEAP_TINT_PURCH_5, iStatData) BREAK
CASE CHAR_TREVOR STAT_SET_INT(SP2_WEAP_TINT_PURCH_5, iStatData) BREAK
ENDSWITCH
BREAK
CASE 6
SWITCH ePed
CASE CHAR_MICHAEL STAT_SET_INT(SP0_WEAP_TINT_PURCH_6, iStatData) BREAK
CASE CHAR_FRANKLIN STAT_SET_INT(SP1_WEAP_TINT_PURCH_6, iStatData) BREAK
CASE CHAR_TREVOR STAT_SET_INT(SP2_WEAP_TINT_PURCH_6, iStatData) BREAK
ENDSWITCH
BREAK
CASE 7
SWITCH ePed
CASE CHAR_MICHAEL STAT_SET_INT(SP0_WEAP_TINT_PURCH_7, iStatData) BREAK
CASE CHAR_FRANKLIN STAT_SET_INT(SP1_WEAP_TINT_PURCH_7, iStatData) BREAK
CASE CHAR_TREVOR STAT_SET_INT(SP2_WEAP_TINT_PURCH_7, iStatData) BREAK
ENDSWITCH
BREAK
#IF USE_TU_CHANGES
CASE 8
SWITCH ePed
CASE CHAR_MICHAEL STAT_SET_INT(SP0_WEAP_TINT_PURCH_8, iStatData) BREAK
CASE CHAR_FRANKLIN STAT_SET_INT(SP1_WEAP_TINT_PURCH_8, iStatData) BREAK
CASE CHAR_TREVOR STAT_SET_INT(SP2_WEAP_TINT_PURCH_8, iStatData) BREAK
ENDSWITCH
BREAK
CASE 9
SWITCH ePed
CASE CHAR_MICHAEL STAT_SET_INT(SP0_WEAP_TINT_PURCH_9, iStatData) BREAK
CASE CHAR_FRANKLIN STAT_SET_INT(SP1_WEAP_TINT_PURCH_9, iStatData) BREAK
CASE CHAR_TREVOR STAT_SET_INT(SP2_WEAP_TINT_PURCH_9, iStatData) BREAK
ENDSWITCH
BREAK
CASE 10
SWITCH ePed
CASE CHAR_MICHAEL STAT_SET_INT(SP0_WEAP_TINT_PURCH_10, iStatData) BREAK
CASE CHAR_FRANKLIN STAT_SET_INT(SP1_WEAP_TINT_PURCH_10, iStatData) BREAK
CASE CHAR_TREVOR STAT_SET_INT(SP2_WEAP_TINT_PURCH_10, iStatData) BREAK
ENDSWITCH
BREAK
CASE 11
SWITCH ePed
CASE CHAR_MICHAEL STAT_SET_INT(SP0_WEAP_TINT_PURCH_11, iStatData) BREAK
CASE CHAR_FRANKLIN STAT_SET_INT(SP1_WEAP_TINT_PURCH_11, iStatData) BREAK
CASE CHAR_TREVOR STAT_SET_INT(SP2_WEAP_TINT_PURCH_11, iStatData) BREAK
ENDSWITCH
BREAK
CASE 12
SWITCH ePed
CASE CHAR_MICHAEL STAT_SET_INT(SP0_WEAP_TINT_PURCH_12, iStatData) BREAK
CASE CHAR_FRANKLIN STAT_SET_INT(SP1_WEAP_TINT_PURCH_12, iStatData) BREAK
CASE CHAR_TREVOR STAT_SET_INT(SP2_WEAP_TINT_PURCH_12, iStatData) BREAK
ENDSWITCH
BREAK
#ENDIF
DEFAULT
#IF IS_DEBUG_BUILD
CASSERTLN(DEBUG_PED_COMP, "SET_PLAYER_PED_PLAYERKIT_PURCHASED_BITSET - ran out of stats [iBitset: ", iBitset, "]. Tell Kenneth R.")
#ENDIF
BREAK
ENDSWITCH
ENDPROC
PROC SET_PLAYER_PED_PLAYERKIT_PURCHASED(enumCharacterList ePed, PLAYERKIT ePlyrKit, BOOL bState = TRUE)
IF IS_PLAYER_PED_PLAYABLE(ePed)
INT iStatData = GET_PLAYER_PED_PLAYERKIT_PURCHASED_BITSET(ePed, ePlyrKit)
INT iIndex = GET_KIT_INDEX_FROM_PLAYERKIT_TYPE(ePlyrKit)
INT iBit = GET_KIT_INDEX_BITSET(iIndex)
IF bState
SET_BIT(iStatData, iBit)
ELSE
CLEAR_BIT(iStatData, iBit)
ENDIF
SET_PLAYER_PED_PLAYERKIT_PURCHASED_BITSET(ePed, ePlyrKit, iStatData)
ENDIF
ENDPROC
FUNC BOOL IS_PLAYER_PED_PLAYERKIT_PURCHASED(enumCharacterList ePed, PLAYERKIT ePlyrKit)
IF IS_PLAYER_PED_PLAYABLE(ePed)
INT iStatData = GET_PLAYER_PED_PLAYERKIT_PURCHASED_BITSET(ePed, ePlyrKit)
INT iIndex = GET_KIT_INDEX_FROM_PLAYERKIT_TYPE(ePlyrKit)
INT iBit = GET_KIT_INDEX_BITSET(iIndex)
RETURN (IS_BIT_SET(iStatData, iBit))
ENDIF
RETURN FALSE
ENDFUNC
///////////////////////////////////////////////////////////////////////////////////////////////////
///
/// SHOP ITEM STATS - PLAYER KIT VIEWED
///
FUNC INT GET_PLAYER_PED_PLAYERKIT_VIEWED_BITSET(enumCharacterList ePed, PLAYERKIT ePlyrKit)
INT iStatData
INT iIndex = GET_KIT_INDEX_FROM_PLAYERKIT_TYPE(ePlyrKit)
INT iBitset = GET_KIT_BITSET(iIndex)
SWITCH iBitset
CASE 0
SWITCH ePed
CASE CHAR_MICHAEL STAT_GET_INT(SP0_WEAP_TINT_VIEW_0, iStatData) BREAK
CASE CHAR_FRANKLIN STAT_GET_INT(SP1_WEAP_TINT_VIEW_0, iStatData) BREAK
CASE CHAR_TREVOR STAT_GET_INT(SP2_WEAP_TINT_VIEW_0, iStatData) BREAK
ENDSWITCH
BREAK
CASE 1
SWITCH ePed
CASE CHAR_MICHAEL STAT_GET_INT(SP0_WEAP_TINT_VIEW_1, iStatData) BREAK
CASE CHAR_FRANKLIN STAT_GET_INT(SP1_WEAP_TINT_VIEW_1, iStatData) BREAK
CASE CHAR_TREVOR STAT_GET_INT(SP2_WEAP_TINT_VIEW_1, iStatData) BREAK
ENDSWITCH
BREAK
CASE 2
SWITCH ePed
CASE CHAR_MICHAEL STAT_GET_INT(SP0_WEAP_TINT_VIEW_2, iStatData) BREAK
CASE CHAR_FRANKLIN STAT_GET_INT(SP1_WEAP_TINT_VIEW_2, iStatData) BREAK
CASE CHAR_TREVOR STAT_GET_INT(SP2_WEAP_TINT_VIEW_2, iStatData) BREAK
ENDSWITCH
BREAK
CASE 3
SWITCH ePed
CASE CHAR_MICHAEL STAT_GET_INT(SP0_WEAP_TINT_VIEW_3, iStatData) BREAK
CASE CHAR_FRANKLIN STAT_GET_INT(SP1_WEAP_TINT_VIEW_3, iStatData) BREAK
CASE CHAR_TREVOR STAT_GET_INT(SP2_WEAP_TINT_VIEW_3, iStatData) BREAK
ENDSWITCH
BREAK
CASE 4
SWITCH ePed
CASE CHAR_MICHAEL STAT_GET_INT(SP0_WEAP_TINT_VIEW_4, iStatData) BREAK
CASE CHAR_FRANKLIN STAT_GET_INT(SP1_WEAP_TINT_VIEW_4, iStatData) BREAK
CASE CHAR_TREVOR STAT_GET_INT(SP2_WEAP_TINT_VIEW_4, iStatData) BREAK
ENDSWITCH
BREAK
CASE 5
SWITCH ePed
CASE CHAR_MICHAEL STAT_GET_INT(SP0_WEAP_TINT_VIEW_5, iStatData) BREAK
CASE CHAR_FRANKLIN STAT_GET_INT(SP1_WEAP_TINT_VIEW_5, iStatData) BREAK
CASE CHAR_TREVOR STAT_GET_INT(SP2_WEAP_TINT_VIEW_5, iStatData) BREAK
ENDSWITCH
BREAK
CASE 6
SWITCH ePed
CASE CHAR_MICHAEL STAT_GET_INT(SP0_WEAP_TINT_VIEW_6, iStatData) BREAK
CASE CHAR_FRANKLIN STAT_GET_INT(SP1_WEAP_TINT_VIEW_6, iStatData) BREAK
CASE CHAR_TREVOR STAT_GET_INT(SP2_WEAP_TINT_VIEW_6, iStatData) BREAK
ENDSWITCH
BREAK
CASE 7
SWITCH ePed
CASE CHAR_MICHAEL STAT_GET_INT(SP0_WEAP_TINT_VIEW_7, iStatData) BREAK
CASE CHAR_FRANKLIN STAT_GET_INT(SP1_WEAP_TINT_VIEW_7, iStatData) BREAK
CASE CHAR_TREVOR STAT_GET_INT(SP2_WEAP_TINT_VIEW_7, iStatData) BREAK
ENDSWITCH
BREAK
#IF USE_TU_CHANGES
CASE 8
SWITCH ePed
CASE CHAR_MICHAEL STAT_GET_INT(SP0_WEAP_TINT_VIEW_8, iStatData) BREAK
CASE CHAR_FRANKLIN STAT_GET_INT(SP1_WEAP_TINT_VIEW_8, iStatData) BREAK
CASE CHAR_TREVOR STAT_GET_INT(SP2_WEAP_TINT_VIEW_8, iStatData) BREAK
ENDSWITCH
BREAK
CASE 9
SWITCH ePed
CASE CHAR_MICHAEL STAT_GET_INT(SP0_WEAP_TINT_VIEW_9, iStatData) BREAK
CASE CHAR_FRANKLIN STAT_GET_INT(SP1_WEAP_TINT_VIEW_9, iStatData) BREAK
CASE CHAR_TREVOR STAT_GET_INT(SP2_WEAP_TINT_VIEW_9, iStatData) BREAK
ENDSWITCH
BREAK
CASE 10
SWITCH ePed
CASE CHAR_MICHAEL STAT_GET_INT(SP0_WEAP_TINT_VIEW_10, iStatData) BREAK
CASE CHAR_FRANKLIN STAT_GET_INT(SP1_WEAP_TINT_VIEW_10, iStatData) BREAK
CASE CHAR_TREVOR STAT_GET_INT(SP2_WEAP_TINT_VIEW_10, iStatData) BREAK
ENDSWITCH
BREAK
CASE 11
SWITCH ePed
CASE CHAR_MICHAEL STAT_GET_INT(SP0_WEAP_TINT_VIEW_11, iStatData) BREAK
CASE CHAR_FRANKLIN STAT_GET_INT(SP1_WEAP_TINT_VIEW_11, iStatData) BREAK
CASE CHAR_TREVOR STAT_GET_INT(SP2_WEAP_TINT_VIEW_11, iStatData) BREAK
ENDSWITCH
BREAK
CASE 12
SWITCH ePed
CASE CHAR_MICHAEL STAT_GET_INT(SP0_WEAP_TINT_VIEW_12, iStatData) BREAK
CASE CHAR_FRANKLIN STAT_GET_INT(SP1_WEAP_TINT_VIEW_12, iStatData) BREAK
CASE CHAR_TREVOR STAT_GET_INT(SP2_WEAP_TINT_VIEW_12, iStatData) BREAK
ENDSWITCH
BREAK
#ENDIF
DEFAULT
#IF IS_DEBUG_BUILD
CASSERTLN(DEBUG_PED_COMP, "GET_PLAYER_PED_PLAYERKIT_VIEWED_BITSET - ran out of stats [iBitset: ", iBitset, "]. Tell Kenneth R.")
#ENDIF
BREAK
ENDSWITCH
RETURN (iStatData)
ENDFUNC
PROC SET_PLAYER_PED_PLAYERKIT_VIEWED_BITSET(enumCharacterList ePed, PLAYERKIT ePlyrKit, INT iStatData)
INT iIndex = GET_KIT_INDEX_FROM_PLAYERKIT_TYPE(ePlyrKit)
INT iBitset = GET_KIT_BITSET(iIndex)
SWITCH iBitset
CASE 0
SWITCH ePed
CASE CHAR_MICHAEL STAT_SET_INT(SP0_WEAP_TINT_VIEW_0, iStatData) BREAK
CASE CHAR_FRANKLIN STAT_SET_INT(SP1_WEAP_TINT_VIEW_0, iStatData) BREAK
CASE CHAR_TREVOR STAT_SET_INT(SP2_WEAP_TINT_VIEW_0, iStatData) BREAK
ENDSWITCH
BREAK
CASE 1
SWITCH ePed
CASE CHAR_MICHAEL STAT_SET_INT(SP0_WEAP_TINT_VIEW_1, iStatData) BREAK
CASE CHAR_FRANKLIN STAT_SET_INT(SP1_WEAP_TINT_VIEW_1, iStatData) BREAK
CASE CHAR_TREVOR STAT_SET_INT(SP2_WEAP_TINT_VIEW_1, iStatData) BREAK
ENDSWITCH
BREAK
CASE 2
SWITCH ePed
CASE CHAR_MICHAEL STAT_SET_INT(SP0_WEAP_TINT_VIEW_2, iStatData) BREAK
CASE CHAR_FRANKLIN STAT_SET_INT(SP1_WEAP_TINT_VIEW_2, iStatData) BREAK
CASE CHAR_TREVOR STAT_SET_INT(SP2_WEAP_TINT_VIEW_2, iStatData) BREAK
ENDSWITCH
BREAK
CASE 3
SWITCH ePed
CASE CHAR_MICHAEL STAT_SET_INT(SP0_WEAP_TINT_VIEW_3, iStatData) BREAK
CASE CHAR_FRANKLIN STAT_SET_INT(SP1_WEAP_TINT_VIEW_3, iStatData) BREAK
CASE CHAR_TREVOR STAT_SET_INT(SP2_WEAP_TINT_VIEW_3, iStatData) BREAK
ENDSWITCH
BREAK
CASE 4
SWITCH ePed
CASE CHAR_MICHAEL STAT_SET_INT(SP0_WEAP_TINT_VIEW_4, iStatData) BREAK
CASE CHAR_FRANKLIN STAT_SET_INT(SP1_WEAP_TINT_VIEW_4, iStatData) BREAK
CASE CHAR_TREVOR STAT_SET_INT(SP2_WEAP_TINT_VIEW_4, iStatData) BREAK
ENDSWITCH
BREAK
CASE 5
SWITCH ePed
CASE CHAR_MICHAEL STAT_SET_INT(SP0_WEAP_TINT_VIEW_5, iStatData) BREAK
CASE CHAR_FRANKLIN STAT_SET_INT(SP1_WEAP_TINT_VIEW_5, iStatData) BREAK
CASE CHAR_TREVOR STAT_SET_INT(SP2_WEAP_TINT_VIEW_5, iStatData) BREAK
ENDSWITCH
BREAK
CASE 6
SWITCH ePed
CASE CHAR_MICHAEL STAT_SET_INT(SP0_WEAP_TINT_VIEW_6, iStatData) BREAK
CASE CHAR_FRANKLIN STAT_SET_INT(SP1_WEAP_TINT_VIEW_6, iStatData) BREAK
CASE CHAR_TREVOR STAT_SET_INT(SP2_WEAP_TINT_VIEW_6, iStatData) BREAK
ENDSWITCH
BREAK
CASE 7
SWITCH ePed
CASE CHAR_MICHAEL STAT_SET_INT(SP0_WEAP_TINT_VIEW_7, iStatData) BREAK
CASE CHAR_FRANKLIN STAT_SET_INT(SP1_WEAP_TINT_VIEW_7, iStatData) BREAK
CASE CHAR_TREVOR STAT_SET_INT(SP2_WEAP_TINT_VIEW_7, iStatData) BREAK
ENDSWITCH
BREAK
#IF USE_TU_CHANGES
CASE 8
SWITCH ePed
CASE CHAR_MICHAEL STAT_SET_INT(SP0_WEAP_TINT_VIEW_8, iStatData) BREAK
CASE CHAR_FRANKLIN STAT_SET_INT(SP1_WEAP_TINT_VIEW_8, iStatData) BREAK
CASE CHAR_TREVOR STAT_SET_INT(SP2_WEAP_TINT_VIEW_8, iStatData) BREAK
ENDSWITCH
BREAK
CASE 9
SWITCH ePed
CASE CHAR_MICHAEL STAT_SET_INT(SP0_WEAP_TINT_VIEW_9, iStatData) BREAK
CASE CHAR_FRANKLIN STAT_SET_INT(SP1_WEAP_TINT_VIEW_9, iStatData) BREAK
CASE CHAR_TREVOR STAT_SET_INT(SP2_WEAP_TINT_VIEW_9, iStatData) BREAK
ENDSWITCH
BREAK
CASE 10
SWITCH ePed
CASE CHAR_MICHAEL STAT_SET_INT(SP0_WEAP_TINT_VIEW_10, iStatData) BREAK
CASE CHAR_FRANKLIN STAT_SET_INT(SP1_WEAP_TINT_VIEW_10, iStatData) BREAK
CASE CHAR_TREVOR STAT_SET_INT(SP2_WEAP_TINT_VIEW_10, iStatData) BREAK
ENDSWITCH
BREAK
CASE 11
SWITCH ePed
CASE CHAR_MICHAEL STAT_SET_INT(SP0_WEAP_TINT_VIEW_11, iStatData) BREAK
CASE CHAR_FRANKLIN STAT_SET_INT(SP1_WEAP_TINT_VIEW_11, iStatData) BREAK
CASE CHAR_TREVOR STAT_SET_INT(SP2_WEAP_TINT_VIEW_11, iStatData) BREAK
ENDSWITCH
BREAK
CASE 12
SWITCH ePed
CASE CHAR_MICHAEL STAT_SET_INT(SP0_WEAP_TINT_VIEW_12, iStatData) BREAK
CASE CHAR_FRANKLIN STAT_SET_INT(SP1_WEAP_TINT_VIEW_12, iStatData) BREAK
CASE CHAR_TREVOR STAT_SET_INT(SP2_WEAP_TINT_VIEW_12, iStatData) BREAK
ENDSWITCH
BREAK
#ENDIF
DEFAULT
#IF IS_DEBUG_BUILD
CASSERTLN(DEBUG_PED_COMP, "SET_PLAYER_PED_PLAYERKIT_VIEWED_BITSET - ran out of stats [iBitset: ", iBitset, "]. Tell Kenneth R.")
#ENDIF
BREAK
ENDSWITCH
ENDPROC
PROC SET_PLAYER_PED_PLAYERKIT_VIEWED(enumCharacterList ePed, PLAYERKIT ePlyrKit, BOOL bState = TRUE)
IF IS_PLAYER_PED_PLAYABLE(ePed)
INT iStatData = GET_PLAYER_PED_PLAYERKIT_VIEWED_BITSET(ePed, ePlyrKit)
INT iIndex = GET_KIT_INDEX_FROM_PLAYERKIT_TYPE(ePlyrKit)
INT iBit = GET_KIT_INDEX_BITSET(iIndex)
IF bState
SET_BIT(iStatData, iBit)
ELSE
CLEAR_BIT(iStatData, iBit)
ENDIF
SET_PLAYER_PED_PLAYERKIT_VIEWED_BITSET(ePed, ePlyrKit, iStatData)
ENDIF
ENDPROC
FUNC BOOL IS_PLAYER_PED_PLAYERKIT_VIEWED(enumCharacterList ePed, PLAYERKIT ePlyrKit)
IF IS_PLAYER_PED_PLAYABLE(ePed)
INT iStatData = GET_PLAYER_PED_PLAYERKIT_VIEWED_BITSET(ePed, ePlyrKit)
INT iIndex = GET_KIT_INDEX_FROM_PLAYERKIT_TYPE(ePlyrKit)
INT iBit = GET_KIT_INDEX_BITSET(iIndex)
RETURN (IS_BIT_SET(iStatData, iBit))
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE: Returns TRUE if the tattoo has been viewed by the current player character
FUNC BOOL HAS_PLAYER_PED_TATTOO_BEEN_VIEWED(enumCharacterList ePed, TATTOO_NAME_ENUM eTattoo)
IF IS_PLAYER_PED_PLAYABLE(ePed)
TATTOO_DATA_STRUCT sTattooData
IF GET_TATTOO_DATA(sTattooData, eTattoo, GET_TATTOO_FACTION_FOR_PLAYER_PED(ePed), NULL)
#if USE_CLF_DLC
RETURN IS_BIT_SET(g_savedGlobalsClifford.sPlayerData.sTattoos[ePed].iViewedTattoos[sTattooData.iBitset], sTattooData.iBitIndex)
#endif
#if USE_NRM_DLC
RETURN IS_BIT_SET(g_savedGlobalsnorman.sPlayerData.sTattoos[ePed].iViewedTattoos[sTattooData.iBitset], sTattooData.iBitIndex)
#endif
#if not USE_CLF_DLC
#if not USE_NRM_DLC
RETURN IS_BIT_SET(g_savedGlobals.sPlayerData.sTattoos[ePed].iViewedTattoos[sTattooData.iBitset], sTattooData.iBitIndex)
#endif
#endif
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE: Set a tattoo to be viewed for the specified character
PROC SET_PLAYER_PED_TATTOO_AS_VIEWED(enumCharacterList ePed, TATTOO_NAME_ENUM eTattoo, BOOL bViewed)
IF IS_PLAYER_PED_PLAYABLE(ePed)
TATTOO_DATA_STRUCT sTattooData
IF GET_TATTOO_DATA(sTattooData, eTattoo, GET_TATTOO_FACTION_FOR_PLAYER_PED(ePed), NULL)
IF bViewed
#if USE_CLF_DLC
SET_BIT(g_savedGlobalsClifford.sPlayerData.sTattoos[ePed].iViewedTattoos[sTattooData.iBitset], sTattooData.iBitIndex)
#endif
#if USE_NRM_DLC
SET_BIT(g_savedGlobalsnorman.sPlayerData.sTattoos[ePed].iViewedTattoos[sTattooData.iBitset], sTattooData.iBitIndex)
#endif
#if not USE_CLF_DLC
#if not USE_NRM_DLC
SET_BIT(g_savedGlobals.sPlayerData.sTattoos[ePed].iViewedTattoos[sTattooData.iBitset], sTattooData.iBitIndex)
#endif
#endif
ELSE
#if USE_CLF_DLC
CLEAR_BIT(g_savedGlobalsClifford.sPlayerData.sTattoos[ePed].iViewedTattoos[sTattooData.iBitset], sTattooData.iBitIndex)
#endif
#if USE_NRM_DLC
CLEAR_BIT(g_savedGlobalsnorman.sPlayerData.sTattoos[ePed].iViewedTattoos[sTattooData.iBitset], sTattooData.iBitIndex)
#endif
#if not USE_CLF_DLC
#if not USE_NRM_DLC
CLEAR_BIT(g_savedGlobals.sPlayerData.sTattoos[ePed].iViewedTattoos[sTattooData.iBitset], sTattooData.iBitIndex)
#endif
#endif
ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE: Returns TRUE if the tattoo has been unlocked for the specified character
FUNC BOOL IS_PLAYER_PED_TATTOO_UNLOCKED(enumCharacterList ePed, TATTOO_NAME_ENUM eTattoo)
IF IS_PLAYER_PED_PLAYABLE(ePed)
// DLC items always unlocked.
IF ePed = CHAR_MICHAEL
IF eTattoo >= TATTOO_SP_MICHAEL_DLC
RETURN TRUE
ENDIF
ELIF ePed = CHAR_FRANKLIN
IF eTattoo >= TATTOO_SP_FRANKLIN_DLC
RETURN TRUE
ENDIF
ELIF ePed = CHAR_TREVOR
IF eTattoo >= TATTOO_SP_TREVOR_DLC
RETURN TRUE
ENDIF
ENDIF
TATTOO_DATA_STRUCT sTattooData
IF GET_TATTOO_DATA(sTattooData, eTattoo, GET_TATTOO_FACTION_FOR_PLAYER_PED(ePed), NULL)
#if USE_CLF_DLC
RETURN (IS_BIT_SET(g_savedGlobalsClifford.sPlayerData.sTattoos[ePed].iUnlockedTattoos[sTattooData.iBitset], sTattooData.iBitIndex))
#endif
#if USE_NRM_DLC
RETURN (IS_BIT_SET(g_savedGlobalsnorman.sPlayerData.sTattoos[ePed].iUnlockedTattoos[sTattooData.iBitset], sTattooData.iBitIndex))
#endif
#if not USE_CLF_DLC
#if not USE_NRM_DLC
RETURN (IS_BIT_SET(g_savedGlobals.sPlayerData.sTattoos[ePed].iUnlockedTattoos[sTattooData.iBitset], sTattooData.iBitIndex))
#endif
#endif
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE: Set a tattoo to be locked or unlocked for the specified character
PROC SET_PLAYER_PED_TATTOO_UNLOCKED(enumCharacterList ePed, TATTOO_NAME_ENUM eTattoo, BOOL bUnlocked)
IF IS_PLAYER_PED_PLAYABLE(ePed)
TATTOO_DATA_STRUCT sTattooData
IF GET_TATTOO_DATA(sTattooData, eTattoo, GET_TATTOO_FACTION_FOR_PLAYER_PED(ePed), NULL)
IF bUnlocked
#if USE_CLF_DLC
SET_BIT(g_savedGlobalsClifford.sPlayerData.sTattoos[ePed].iUnlockedTattoos[sTattooData.iBitset], sTattooData.iBitIndex)
#endif
#if USE_NRM_DLC
SET_BIT(g_savedGlobalsnorman.sPlayerData.sTattoos[ePed].iUnlockedTattoos[sTattooData.iBitset], sTattooData.iBitIndex)
#endif
#if not USE_CLF_DLC
#if not USE_NRM_DLC
SET_BIT(g_savedGlobals.sPlayerData.sTattoos[ePed].iUnlockedTattoos[sTattooData.iBitset], sTattooData.iBitIndex)
#endif
#endif
ELSE
#if USE_CLF_DLC
CLEAR_BIT(g_savedGlobalsClifford.sPlayerData.sTattoos[ePed].iUnlockedTattoos[sTattooData.iBitset], sTattooData.iBitIndex)
#endif
#if USE_NRM_DLC
CLEAR_BIT(g_savedGlobalsnorman.sPlayerData.sTattoos[ePed].iUnlockedTattoos[sTattooData.iBitset], sTattooData.iBitIndex)
#endif
#if not USE_CLF_DLC
#if not USE_NRM_DLC
CLEAR_BIT(g_savedGlobals.sPlayerData.sTattoos[ePed].iUnlockedTattoos[sTattooData.iBitset], sTattooData.iBitIndex)
#endif
#endif
ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE: Returns TRUE if the tattoo is currently on the specified character
FUNC BOOL IS_PLAYER_PED_TATTOO_CURRENT(enumCharacterList ePed, TATTOO_NAME_ENUM eTattoo)
IF IS_PLAYER_PED_PLAYABLE(ePed)
TATTOO_DATA_STRUCT sTattooData
IF GET_TATTOO_DATA(sTattooData, eTattoo, GET_TATTOO_FACTION_FOR_PLAYER_PED(ePed), NULL)
#if USE_CLF_DLC
RETURN (IS_BIT_SET(g_savedGlobalsClifford.sPlayerData.sTattoos[ePed].iCurrentTattoos[sTattooData.iBitset], sTattooData.iBitIndex))
#endif
#if USE_NRM_DLC
RETURN (IS_BIT_SET(g_savedGlobalsnorman.sPlayerData.sTattoos[ePed].iCurrentTattoos[sTattooData.iBitset], sTattooData.iBitIndex))
#endif
#if not USE_CLF_DLC
#if not USE_NRM_DLC
RETURN (IS_BIT_SET(g_savedGlobals.sPlayerData.sTattoos[ePed].iCurrentTattoos[sTattooData.iBitset], sTattooData.iBitIndex))
#endif
#endif
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE: Set a tattoo to be current for the specified character
PROC SET_PED_TATTOO_CURRENT(enumCharacterList ePed, TATTOO_NAME_ENUM eTattoo, BOOL bCurrent)
IF IS_PLAYER_PED_PLAYABLE(ePed)
TATTOO_DATA_STRUCT sTattooData
IF GET_TATTOO_DATA(sTattooData, eTattoo, GET_TATTOO_FACTION_FOR_PLAYER_PED(ePed), NULL)
IF bCurrent
#if USE_CLF_DLC
SET_BIT(g_savedGlobalsClifford.sPlayerData.sTattoos[ePed].iCurrentTattoos[sTattooData.iBitset], sTattooData.iBitIndex)
#endif
#if USE_NRM_DLC
SET_BIT(g_savedGlobalsnorman.sPlayerData.sTattoos[ePed].iCurrentTattoos[sTattooData.iBitset], sTattooData.iBitIndex)
#endif
#if not USE_CLF_DLC
#if not USE_NRM_DLC
SET_BIT(g_savedGlobals.sPlayerData.sTattoos[ePed].iCurrentTattoos[sTattooData.iBitset], sTattooData.iBitIndex)
#endif
#endif
ELSE
#if USE_CLF_DLC
CLEAR_BIT(g_savedGlobalsClifford.sPlayerData.sTattoos[ePed].iCurrentTattoos[sTattooData.iBitset], sTattooData.iBitIndex)
#endif
#if USE_NRM_DLC
CLEAR_BIT(g_savedGlobalsnorman.sPlayerData.sTattoos[ePed].iCurrentTattoos[sTattooData.iBitset], sTattooData.iBitIndex)
#endif
#if not USE_CLF_DLC
#if not USE_NRM_DLC
CLEAR_BIT(g_savedGlobals.sPlayerData.sTattoos[ePed].iCurrentTattoos[sTattooData.iBitset], sTattooData.iBitIndex)
#endif
#endif
ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE: Sets the player peds decorations.
PROC RESTORE_PLAYER_PED_TATTOOSCLF(PED_INDEX ped)
// Grab the ped enum
enumCharacterList ePed = GET_PLAYER_PED_ENUM(ped)
IF IS_PLAYER_PED_PLAYABLE(ePed)
AND NOT IS_PED_INJURED(ped)
CLEAR_PED_DECORATIONS(ped)
INT iBitset, iBit
TATTOO_DATA_STRUCT sTattooData
REPEAT MAX_NUMBER_OF_TATTOO_BITSETS iBitset
REPEAT 32 iBit
IF IS_BIT_SET(g_savedGlobalsClifford.sPlayerData.sTattoos[ePed].iCurrentTattoos[iBitset], iBit)
IF GET_TATTOO_DATA(sTattooData, GET_TATTOO_NAME_FROM_BITSET_INDEX(iBitset, iBit), GET_TATTOO_FACTION_FOR_PLAYER_PED(ePed), ped)
#IF IS_DEBUG_BUILD
PRINTLN("Adding tattoo '", sTattooData.sLabel, "' to ", GET_PLAYER_PED_STRING(ePed))
#ENDIF
ADD_PED_DECORATION_FROM_HASHES(ped, sTattooData.iCollection, sTattooData.iPreset)
ENDIF
ENDIF
ENDREPEAT
ENDREPEAT
ENDIF
ENDPROC
/// PURPOSE: Sets the player peds decorations.
PROC RESTORE_PLAYER_PED_TATTOOSNRM(PED_INDEX ped)
// Grab the ped enum
enumCharacterList ePed = GET_PLAYER_PED_ENUM(ped)
IF IS_PLAYER_PED_PLAYABLE(ePed)
AND NOT IS_PED_INJURED(ped)
CLEAR_PED_DECORATIONS(ped)
INT iBitset, iBit
TATTOO_DATA_STRUCT sTattooData
REPEAT MAX_NUMBER_OF_TATTOO_BITSETS iBitset
REPEAT 32 iBit
IF IS_BIT_SET(g_savedGlobalsnorman.sPlayerData.sTattoos[ePed].iCurrentTattoos[iBitset], iBit)
IF GET_TATTOO_DATA(sTattooData, GET_TATTOO_NAME_FROM_BITSET_INDEX(iBitset, iBit), GET_TATTOO_FACTION_FOR_PLAYER_PED(ePed), ped)
#IF IS_DEBUG_BUILD
PRINTLN("Adding tattoo '", sTattooData.sLabel, "' to ", GET_PLAYER_PED_STRING(ePed))
#ENDIF
ADD_PED_DECORATION_FROM_HASHES(ped, sTattooData.iCollection, sTattooData.iPreset)
ENDIF
ENDIF
ENDREPEAT
ENDREPEAT
ENDIF
ENDPROC
/// PURPOSE: Sets the player peds decorations.
PROC RESTORE_PLAYER_PED_TATTOOS(PED_INDEX ped)
#if USE_CLF_DLC
RESTORE_PLAYER_PED_TATTOOSCLF(ped)
exit
#endif
#if USE_NRM_DLC
RESTORE_PLAYER_PED_TATTOOSNRM(ped)
exit
#endif
// Grab the ped enum
enumCharacterList ePed = GET_PLAYER_PED_ENUM(ped)
IF IS_PLAYER_PED_PLAYABLE(ePed)
AND NOT IS_PED_INJURED(ped)
CLEAR_PED_DECORATIONS(ped)
INT iBitset, iBit
TATTOO_DATA_STRUCT sTattooData
REPEAT MAX_NUMBER_OF_TATTOO_BITSETS iBitset
REPEAT 32 iBit
IF IS_BIT_SET(g_savedGlobals.sPlayerData.sTattoos[ePed].iCurrentTattoos[iBitset], iBit)
IF GET_TATTOO_DATA(sTattooData, GET_TATTOO_NAME_FROM_BITSET_INDEX(iBitset, iBit), GET_TATTOO_FACTION_FOR_PLAYER_PED(ePed), ped)
#IF IS_DEBUG_BUILD
PRINTLN("Adding tattoo '", sTattooData.sLabel, "' to ", GET_PLAYER_PED_STRING(ePed))
#ENDIF
ADD_PED_DECORATION_FROM_HASHES(ped, sTattooData.iCollection, sTattooData.iPreset)
ENDIF
ENDIF
ENDREPEAT
ENDREPEAT
ENDIF
ENDPROC
PROC SET_STORED_FBI4_MASK(PED_INDEX pedID)
IF NOT IS_PED_INJURED(pedID)
enumCharacterList ePed = GET_PLAYER_PED_ENUM(pedID)
IF ePed = CHAR_MICHAEL
IF g_savedGlobals.sPlayerData.sInfo.eFBI4MaskName[ePed] = DUMMY_PED_COMP
OR NOT SET_PED_COMP_ITEM_CURRENT_SP(pedID, g_savedGlobals.sPlayerData.sInfo.eFBI4MaskType[ePed], g_savedGlobals.sPlayerData.sInfo.eFBI4MaskName[ePed], FALSE)
CPRINTLN(DEBUG_PED_COMP, "default mask being applied")
SET_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_PROPS, PROPS_P0_MASK_HOCKEY_WHITE, FALSE)
ENDIF
ELIF ePed = CHAR_FRANKLIN
IF g_savedGlobals.sPlayerData.sInfo.eFBI4MaskName[ePed] = DUMMY_PED_COMP
OR NOT SET_PED_COMP_ITEM_CURRENT_SP(pedID, g_savedGlobals.sPlayerData.sInfo.eFBI4MaskType[ePed], g_savedGlobals.sPlayerData.sInfo.eFBI4MaskName[ePed], FALSE)
SET_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_PROPS, PROPS_P1_MASK_SKULL_GREY, FALSE)
ENDIF
ELIF ePed = CHAR_TREVOR
IF g_savedGlobals.sPlayerData.sInfo.eFBI4MaskName[ePed] = DUMMY_PED_COMP
OR NOT SET_PED_COMP_ITEM_CURRENT_SP(pedID, g_savedGlobals.sPlayerData.sInfo.eFBI4MaskType[ePed], g_savedGlobals.sPlayerData.sInfo.eFBI4MaskName[ePed], FALSE)
SET_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_PROPS, PROPS_P2_MASK_MONKEY, FALSE)
ENDIF
ENDIF
ENDIF
ENDPROC
PROC SET_STORED_FBI4_BOILER_SUIT(PED_INDEX pedID)
IF NOT IS_PED_INJURED(pedID)
enumCharacterList ePed = GET_PLAYER_PED_ENUM(pedID)
IF ePed = CHAR_MICHAEL
IF g_savedGlobals.sPlayerData.sInfo.eFBI4BoilerSuit[ePed] = DUMMY_PED_COMP
OR NOT SET_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, g_savedGlobals.sPlayerData.sInfo.eFBI4BoilerSuit[ePed], FALSE)
SET_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_P0_PREP_BOILER_SUIT_2, FALSE)
ENDIF
ELIF ePed = CHAR_FRANKLIN
IF g_savedGlobals.sPlayerData.sInfo.eFBI4BoilerSuit[ePed] = DUMMY_PED_COMP
OR NOT SET_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, g_savedGlobals.sPlayerData.sInfo.eFBI4BoilerSuit[ePed], FALSE)
SET_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_P1_PREP_BOILER_SUIT_1, FALSE)
ENDIF
ELIF ePed = CHAR_TREVOR
IF g_savedGlobals.sPlayerData.sInfo.eFBI4BoilerSuit[ePed] = DUMMY_PED_COMP
OR NOT SET_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, g_savedGlobals.sPlayerData.sInfo.eFBI4BoilerSuit[ePed], FALSE)
SET_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_P2_PREP_BOILER_SUIT_3, FALSE)
ENDIF
ENDIF
ENDIF
ENDPROC
PROC PRELOAD_STORED_FBI4_OUTFIT(PED_INDEX pedID)
IF NOT IS_PED_INJURED(pedID)
enumCharacterList ePed = GET_PLAYER_PED_ENUM(pedID)
IF ePed = CHAR_MICHAEL
IF g_savedGlobals.sPlayerData.sInfo.eFBI4BoilerSuit[ePed] = DUMMY_PED_COMP
PRELOAD_OUTFIT(pedID, OUTFIT_P0_PREP_BOILER_SUIT_2)
ELSE
PRELOAD_OUTFIT(pedID, g_savedGlobals.sPlayerData.sInfo.eFBI4BoilerSuit[ePed])
ENDIF
IF g_savedGlobals.sPlayerData.sInfo.eFBI4MaskName[ePed] = DUMMY_PED_COMP
PRELOAD_PED_COMP(pedID, COMP_TYPE_PROPS, PROPS_P0_MASK_HOCKEY_WHITE)
ELSE
PRELOAD_PED_COMP(pedID, g_savedGlobals.sPlayerData.sInfo.eFBI4MaskType[ePed], g_savedGlobals.sPlayerData.sInfo.eFBI4MaskName[ePed])
ENDIF
ELIF ePed = CHAR_FRANKLIN
IF g_savedGlobals.sPlayerData.sInfo.eFBI4BoilerSuit[ePed] = DUMMY_PED_COMP
PRELOAD_OUTFIT(pedID, OUTFIT_P1_PREP_BOILER_SUIT_1)
ELSE
PRELOAD_OUTFIT(pedID, g_savedGlobals.sPlayerData.sInfo.eFBI4BoilerSuit[ePed])
ENDIF
IF g_savedGlobals.sPlayerData.sInfo.eFBI4MaskName[ePed] = DUMMY_PED_COMP
PRELOAD_PED_COMP(pedID, COMP_TYPE_PROPS, PROPS_P1_MASK_SKULL_GREY)
ELSE
PRELOAD_PED_COMP(pedID, g_savedGlobals.sPlayerData.sInfo.eFBI4MaskType[ePed], g_savedGlobals.sPlayerData.sInfo.eFBI4MaskName[ePed])
ENDIF
ELIF ePed = CHAR_TREVOR
IF g_savedGlobals.sPlayerData.sInfo.eFBI4BoilerSuit[ePed] = DUMMY_PED_COMP
PRELOAD_OUTFIT(pedID, OUTFIT_P2_PREP_BOILER_SUIT_3)
ELSE
PRELOAD_OUTFIT(pedID, g_savedGlobals.sPlayerData.sInfo.eFBI4BoilerSuit[ePed])
ENDIF
IF g_savedGlobals.sPlayerData.sInfo.eFBI4MaskName[ePed] = DUMMY_PED_COMP
PRELOAD_PED_COMP(pedID, COMP_TYPE_PROPS, PROPS_P2_MASK_MONKEY)
ELSE
PRELOAD_PED_COMP(pedID, g_savedGlobals.sPlayerData.sInfo.eFBI4MaskType[ePed], g_savedGlobals.sPlayerData.sInfo.eFBI4MaskName[ePed])
ENDIF
ENDIF
ENDIF
ENDPROC
PROC SET_STORED_FBI4_OUTFIT(PED_INDEX pedID)
SET_STORED_FBI4_BOILER_SUIT(pedID)
SET_STORED_FBI4_MASK(pedID)
ENDPROC
/// PURPOSE: Sets the ped component and prop variations
PROC SET_PLAYER_PED_VARIATION_STATS(PED_INDEX ped, INT iSlot = 0)
IF IS_PED_INJURED(ped)
PRINTLN("SET_PLAYER_PED_VARIATION_STATS - Ped is dead")
EXIT
ENDIF
IF ENUM_TO_INT(GET_ENTITY_MODEL(ped)) != GET_PACKED_STAT_INT(PACKED_SP_PLAYER_CHAR, iSlot)
PRINTLN("SET_PLAYER_PED_VARIATION_STATS - Ped doesn't match last player model")
EXIT
ENDIF
#IF IS_DEBUG_BUILD
PRINTLN("SET_PLAYER_PED_VARIATION_STATS - Setting player ped varitions from stats")
#ENDIF
PED_VARIATION_STRUCT sTempVariations
// Store the peds variations in the packed stats for use with the front end menu.
sTempVariations.iTextureVariation[0] = GET_PACKED_STAT_INT(PACKED_SP_CLTH_TEXTVAR_HEAD, iSlot)
sTempVariations.iTextureVariation[1] = GET_PACKED_STAT_INT(PACKED_SP_CLTH_TEXTVAR_BERD, iSlot)
sTempVariations.iTextureVariation[2] = GET_PACKED_STAT_INT(PACKED_SP_CLTH_TEXTVAR_HAIR, iSlot)
sTempVariations.iTextureVariation[3] = GET_PACKED_STAT_INT(PACKED_SP_CLTH_TEXTVAR_TORSO, iSlot)
sTempVariations.iTextureVariation[4] = GET_PACKED_STAT_INT(PACKED_SP_CLTH_TEXTVAR_LEG, iSlot)
sTempVariations.iTextureVariation[5] = GET_PACKED_STAT_INT(PACKED_SP_CLTH_TEXTVAR_HAND, iSlot)
sTempVariations.iTextureVariation[6] = GET_PACKED_STAT_INT(PACKED_SP_CLTH_TEXTVAR_FEET, iSlot)
sTempVariations.iTextureVariation[7] = GET_PACKED_STAT_INT(PACKED_SP_CLTH_TEXTVAR_TEETH, iSlot)
sTempVariations.iTextureVariation[8] = GET_PACKED_STAT_INT(PACKED_SP_CLTH_TEXTVAR_SPECIAL, iSlot)
sTempVariations.iTextureVariation[9] = GET_PACKED_STAT_INT(PACKED_SP_CLTH_TEXTVAR_SPECIAL2, iSlot)
sTempVariations.iTextureVariation[10] = GET_PACKED_STAT_INT(PACKED_SP_CLTH_TEXTVAR_DECL, iSlot)
sTempVariations.iTextureVariation[11] = GET_PACKED_STAT_INT(PACKED_SP_CLTH_TEXTVAR_JBIB, iSlot)
sTempVariations.iDrawableVariation[0] = GET_PACKED_STAT_INT(PACKED_SP_CLTH_DRAWVAR_HEAD, iSlot)
sTempVariations.iDrawableVariation[1] = GET_PACKED_STAT_INT(PACKED_SP_CLTH_DRAWVAR_BERD, iSlot)
sTempVariations.iDrawableVariation[2] = GET_PACKED_STAT_INT(PACKED_SP_CLTH_DRAWVAR_HAIR, iSlot)
sTempVariations.iDrawableVariation[3] = GET_PACKED_STAT_INT(PACKED_SP_CLTH_DRAWVAR_TORSO, iSlot)
sTempVariations.iDrawableVariation[4] = GET_PACKED_STAT_INT(PACKED_SP_CLTH_DRAWVAR_LEG, iSlot)
sTempVariations.iDrawableVariation[5] = GET_PACKED_STAT_INT(PACKED_SP_CLTH_DRAWVAR_HAND, iSlot)
sTempVariations.iDrawableVariation[6] = GET_PACKED_STAT_INT(PACKED_SP_CLTH_DRAWVAR_FEET, iSlot)
sTempVariations.iDrawableVariation[7] = GET_PACKED_STAT_INT(PACKED_SP_CLTH_DRAWVAR_TEETH, iSlot)
sTempVariations.iDrawableVariation[8] = GET_PACKED_STAT_INT(PACKED_SP_CLTH_DRAWVAR_SPECIAL, iSlot)
sTempVariations.iDrawableVariation[9] = GET_PACKED_STAT_INT(PACKED_SP_CLTH_DRAWVAR_SPECIAL2, iSlot)
sTempVariations.iDrawableVariation[10] = GET_PACKED_STAT_INT(PACKED_SP_CLTH_DRAWVAR_DECL, iSlot)
sTempVariations.iDrawableVariation[11] = GET_PACKED_STAT_INT(PACKED_SP_CLTH_DRAWVAR_JBIB, iSlot)
sTempVariations.iPaletteVariation[0] = GET_PACKED_STAT_INT(PACKED_SP_CLTH_PALVAR_HEAD, iSlot)
sTempVariations.iPaletteVariation[1] = GET_PACKED_STAT_INT(PACKED_SP_CLTH_PALVAR_BERD, iSlot)
sTempVariations.iPaletteVariation[2] = GET_PACKED_STAT_INT(PACKED_SP_CLTH_PALVAR_HAIR, iSlot)
sTempVariations.iPaletteVariation[3] = GET_PACKED_STAT_INT(PACKED_SP_CLTH_PALVAR_TORSO, iSlot)
sTempVariations.iPaletteVariation[4] = GET_PACKED_STAT_INT(PACKED_SP_CLTH_PALVAR_LEG, iSlot)
sTempVariations.iPaletteVariation[5] = GET_PACKED_STAT_INT(PACKED_SP_CLTH_PALVAR_HAND, iSlot)
sTempVariations.iPaletteVariation[6] = GET_PACKED_STAT_INT(PACKED_SP_CLTH_PALVAR_FEET, iSlot)
sTempVariations.iPaletteVariation[7] = GET_PACKED_STAT_INT(PACKED_SP_CLTH_PALVAR_TEETH, iSlot)
sTempVariations.iPaletteVariation[8] = GET_PACKED_STAT_INT(PACKED_SP_CLTH_PALVAR_SPECIAL, iSlot)
sTempVariations.iPaletteVariation[9] = GET_PACKED_STAT_INT(PACKED_SP_CLTH_PALVAR_SPECIAL2, iSlot)
sTempVariations.iPaletteVariation[10] = GET_PACKED_STAT_INT(PACKED_SP_CLTH_PALVAR_DECL, iSlot)
sTempVariations.iPaletteVariation[11] = GET_PACKED_STAT_INT(PACKED_SP_CLTH_PALVAR_JBIB, iSlot)
sTempVariations.iPropIndex[0] = GET_PACKED_STAT_INT(PACKED_SP_CLTH_PROPINDX_0, iSlot)
sTempVariations.iPropIndex[1] = GET_PACKED_STAT_INT(PACKED_SP_CLTH_PROPINDX_1, iSlot)
sTempVariations.iPropIndex[2] = GET_PACKED_STAT_INT(PACKED_SP_CLTH_PROPINDX_2, iSlot)
sTempVariations.iPropIndex[3] = GET_PACKED_STAT_INT(PACKED_SP_CLTH_PROPINDX_3, iSlot)
sTempVariations.iPropIndex[4] = GET_PACKED_STAT_INT(PACKED_SP_CLTH_PROPINDX_4, iSlot)
sTempVariations.iPropIndex[5] = GET_PACKED_STAT_INT(PACKED_SP_CLTH_PROPINDX_5, iSlot)
sTempVariations.iPropIndex[6] = GET_PACKED_STAT_INT(PACKED_SP_CLTH_PROPINDX_6, iSlot)
sTempVariations.iPropIndex[7] = GET_PACKED_STAT_INT(PACKED_SP_CLTH_PROPINDX_7, iSlot)
sTempVariations.iPropIndex[8] = GET_PACKED_STAT_INT(PACKED_SP_CLTH_PROPINDX_8, iSlot)
sTempVariations.iPropTexture[0] = GET_PACKED_STAT_INT(PACKED_SP_CLTH_PROPTEXT_0, iSlot)
sTempVariations.iPropTexture[1] = GET_PACKED_STAT_INT(PACKED_SP_CLTH_PROPTEXT_1, iSlot)
sTempVariations.iPropTexture[2] = GET_PACKED_STAT_INT(PACKED_SP_CLTH_PROPTEXT_2, iSlot)
sTempVariations.iPropTexture[3] = GET_PACKED_STAT_INT(PACKED_SP_CLTH_PROPTEXT_3, iSlot)
sTempVariations.iPropTexture[4] = GET_PACKED_STAT_INT(PACKED_SP_CLTH_PROPTEXT_4, iSlot)
sTempVariations.iPropTexture[5] = GET_PACKED_STAT_INT(PACKED_SP_CLTH_PROPTEXT_5, iSlot)
sTempVariations.iPropTexture[6] = GET_PACKED_STAT_INT(PACKED_SP_CLTH_PROPTEXT_6, iSlot)
sTempVariations.iPropTexture[7] = GET_PACKED_STAT_INT(PACKED_SP_CLTH_PROPTEXT_7, iSlot)
sTempVariations.iPropTexture[8] = GET_PACKED_STAT_INT(PACKED_SP_CLTH_PROPTEXT_8, iSlot)
SET_PED_VARIATIONS(ped, sTempVariations)
ENDPROC
PROC UPDATE_PLAYER_PED_VARIATION_STATS()
IF IS_PED_INJURED(PLAYER_PED_ID())
OR NOT IS_PLAYER_PED_PLAYABLE(GET_CURRENT_PLAYER_PED_ENUM())
OR NOT HAS_IMPORTANT_STATS_LOADED()
EXIT
ENDIF
PED_VARIATION_STRUCT sTempVariations
GET_PED_VARIATIONS(PLAYER_PED_ID(), sTempVariations)
// Store the peds variations in the packed stats for use with the front end menu.
SET_PACKED_STAT_INT(PACKED_SP_CLTH_TEXTVAR_HEAD, sTempVariations.iTextureVariation[0])
SET_PACKED_STAT_INT(PACKED_SP_CLTH_TEXTVAR_BERD, sTempVariations.iTextureVariation[1])
SET_PACKED_STAT_INT(PACKED_SP_CLTH_TEXTVAR_HAIR, sTempVariations.iTextureVariation[2])
SET_PACKED_STAT_INT(PACKED_SP_CLTH_TEXTVAR_TORSO, sTempVariations.iTextureVariation[3])
SET_PACKED_STAT_INT(PACKED_SP_CLTH_TEXTVAR_LEG, sTempVariations.iTextureVariation[4])
SET_PACKED_STAT_INT(PACKED_SP_CLTH_TEXTVAR_HAND, sTempVariations.iTextureVariation[5])
SET_PACKED_STAT_INT(PACKED_SP_CLTH_TEXTVAR_FEET, sTempVariations.iTextureVariation[6])
SET_PACKED_STAT_INT(PACKED_SP_CLTH_TEXTVAR_TEETH, sTempVariations.iTextureVariation[7])
SET_PACKED_STAT_INT(PACKED_SP_CLTH_TEXTVAR_SPECIAL, sTempVariations.iTextureVariation[8])
SET_PACKED_STAT_INT(PACKED_SP_CLTH_TEXTVAR_SPECIAL2, sTempVariations.iTextureVariation[9])
SET_PACKED_STAT_INT(PACKED_SP_CLTH_TEXTVAR_DECL, sTempVariations.iTextureVariation[10])
SET_PACKED_STAT_INT(PACKED_SP_CLTH_TEXTVAR_JBIB, sTempVariations.iTextureVariation[11])
SET_PACKED_STAT_INT(PACKED_SP_CLTH_DRAWVAR_HEAD, sTempVariations.iDrawableVariation[0])
SET_PACKED_STAT_INT(PACKED_SP_CLTH_DRAWVAR_BERD, sTempVariations.iDrawableVariation[1])
SET_PACKED_STAT_INT(PACKED_SP_CLTH_DRAWVAR_HAIR, sTempVariations.iDrawableVariation[2])
SET_PACKED_STAT_INT(PACKED_SP_CLTH_DRAWVAR_TORSO, sTempVariations.iDrawableVariation[3])
SET_PACKED_STAT_INT(PACKED_SP_CLTH_DRAWVAR_LEG, sTempVariations.iDrawableVariation[4])
SET_PACKED_STAT_INT(PACKED_SP_CLTH_DRAWVAR_HAND, sTempVariations.iDrawableVariation[5])
SET_PACKED_STAT_INT(PACKED_SP_CLTH_DRAWVAR_FEET, sTempVariations.iDrawableVariation[6])
SET_PACKED_STAT_INT(PACKED_SP_CLTH_DRAWVAR_TEETH, sTempVariations.iDrawableVariation[7])
SET_PACKED_STAT_INT(PACKED_SP_CLTH_DRAWVAR_SPECIAL, sTempVariations.iDrawableVariation[8])
SET_PACKED_STAT_INT(PACKED_SP_CLTH_DRAWVAR_SPECIAL2, sTempVariations.iDrawableVariation[9])
SET_PACKED_STAT_INT(PACKED_SP_CLTH_DRAWVAR_DECL, sTempVariations.iDrawableVariation[10])
SET_PACKED_STAT_INT(PACKED_SP_CLTH_DRAWVAR_JBIB, sTempVariations.iDrawableVariation[11])
SET_PACKED_STAT_INT(PACKED_SP_CLTH_PALVAR_HEAD, sTempVariations.iPaletteVariation[0])
SET_PACKED_STAT_INT(PACKED_SP_CLTH_PALVAR_BERD, sTempVariations.iPaletteVariation[1])
SET_PACKED_STAT_INT(PACKED_SP_CLTH_PALVAR_HAIR, sTempVariations.iPaletteVariation[2])
SET_PACKED_STAT_INT(PACKED_SP_CLTH_PALVAR_TORSO, sTempVariations.iPaletteVariation[3])
SET_PACKED_STAT_INT(PACKED_SP_CLTH_PALVAR_LEG, sTempVariations.iPaletteVariation[4])
SET_PACKED_STAT_INT(PACKED_SP_CLTH_PALVAR_HAND, sTempVariations.iPaletteVariation[5])
SET_PACKED_STAT_INT(PACKED_SP_CLTH_PALVAR_FEET, sTempVariations.iPaletteVariation[6])
SET_PACKED_STAT_INT(PACKED_SP_CLTH_PALVAR_TEETH, sTempVariations.iPaletteVariation[7])
SET_PACKED_STAT_INT(PACKED_SP_CLTH_PALVAR_SPECIAL, sTempVariations.iPaletteVariation[8])
SET_PACKED_STAT_INT(PACKED_SP_CLTH_PALVAR_SPECIAL2, sTempVariations.iPaletteVariation[9])
SET_PACKED_STAT_INT(PACKED_SP_CLTH_PALVAR_DECL, sTempVariations.iPaletteVariation[10])
SET_PACKED_STAT_INT(PACKED_SP_CLTH_PALVAR_JBIB, sTempVariations.iPaletteVariation[11])
SET_PACKED_STAT_INT(PACKED_SP_CLTH_PROPINDX_0, sTempVariations.iPropIndex[0])
SET_PACKED_STAT_INT(PACKED_SP_CLTH_PROPINDX_1, sTempVariations.iPropIndex[1])
SET_PACKED_STAT_INT(PACKED_SP_CLTH_PROPINDX_2, sTempVariations.iPropIndex[2])
SET_PACKED_STAT_INT(PACKED_SP_CLTH_PROPINDX_3, sTempVariations.iPropIndex[3])
SET_PACKED_STAT_INT(PACKED_SP_CLTH_PROPINDX_4, sTempVariations.iPropIndex[4])
SET_PACKED_STAT_INT(PACKED_SP_CLTH_PROPINDX_5, sTempVariations.iPropIndex[5])
SET_PACKED_STAT_INT(PACKED_SP_CLTH_PROPINDX_6, sTempVariations.iPropIndex[6])
SET_PACKED_STAT_INT(PACKED_SP_CLTH_PROPINDX_7, sTempVariations.iPropIndex[7])
SET_PACKED_STAT_INT(PACKED_SP_CLTH_PROPINDX_8, sTempVariations.iPropIndex[8])
SET_PACKED_STAT_INT(PACKED_SP_CLTH_PROPTEXT_0, sTempVariations.iPropTexture[0])
SET_PACKED_STAT_INT(PACKED_SP_CLTH_PROPTEXT_1, sTempVariations.iPropTexture[1])
SET_PACKED_STAT_INT(PACKED_SP_CLTH_PROPTEXT_2, sTempVariations.iPropTexture[2])
SET_PACKED_STAT_INT(PACKED_SP_CLTH_PROPTEXT_3, sTempVariations.iPropTexture[3])
SET_PACKED_STAT_INT(PACKED_SP_CLTH_PROPTEXT_4, sTempVariations.iPropTexture[4])
SET_PACKED_STAT_INT(PACKED_SP_CLTH_PROPTEXT_5, sTempVariations.iPropTexture[5])
SET_PACKED_STAT_INT(PACKED_SP_CLTH_PROPTEXT_6, sTempVariations.iPropTexture[6])
SET_PACKED_STAT_INT(PACKED_SP_CLTH_PROPTEXT_7, sTempVariations.iPropTexture[7])
SET_PACKED_STAT_INT(PACKED_SP_CLTH_PROPTEXT_8, sTempVariations.iPropTexture[8])
SET_PACKED_STAT_INT(PACKED_SP_PLAYER_CHAR, ENUM_TO_INT(GET_CURRENT_PLAYER_PED_ENUM()))
#IF USE_TU_CHANGES
STAT_SET_BOOL(CLO_STORED_INITIAL, TRUE)
#ENDIF
#if USE_CLF_DLC
g_savedGlobalsClifford.sPlayerData.sInfo.bPlayerVariationsStoredToStats = TRUE
#endif
#if USE_NRM_DLC
g_savedGlobalsnorman.sPlayerData.sInfo.bPlayerVariationsStoredToStats = TRUE
#endif
#if not USE_CLF_DLC
#if not USE_NRM_DLC
g_savedGlobals.sPlayerData.sInfo.bPlayerVariationsStoredToStats = TRUE
#endif
#endif
ENDPROC
/// PURPOSE: Grabs the ped component and prop variations
/// NOTE: Param bStoreOnMission should be TRUE if mission clothes are to be saved as normal clothes
PROC STORE_PLAYER_PED_VARIATIONS(PED_INDEX ped, BOOL bStoreOnMission = FALSE)
IF NOT IS_PED_INJURED(ped)
// Grab the ped enum
enumCharacterList ePed = GET_PLAYER_PED_ENUM(ped)
IF IS_PLAYER_PED_PLAYABLE(ePed)
#IF IS_DEBUG_BUILD
PRINTLN("STORE_PLAYER_PED_VARIATIONS - Storing variation for ", GET_PLAYER_PED_STRING(ePed), " - ", GET_THIS_SCRIPT_NAME())
#ENDIF
//If trevor has pants down. default his variation
IF ePed = CHAR_TREVOR
PED_COMP_NAME_ENUM eCurrentComp
eCurrentComp = GET_PED_COMP_ITEM_CURRENT_SP(ped, COMP_TYPE_LEGS)
IF eCurrentComp = LEGS_P2_TOILET
SETUP_DEFAULT_PLAYER_VARIATIONS(ePed)
SET_PED_VARIATIONS(ped, g_savedGlobals.sPlayerData.sInfo.sVariations[ePed])
endif
endif
PED_VARIATION_STRUCT sTempVariations
GET_PED_VARIATIONS(ped, sTempVariations)
// Update the last stored ped clothes.
g_sLastStoredPlayerPedClothes[ePed] = sTempVariations
IF ped = PLAYER_PED_ID()
UPDATE_PLAYER_PED_VARIATION_STATS()
ENDIF
// Never allow the clothes shop to store clothes during missions that require you to get an outfit
IF GET_HASH_KEY(GET_THIS_SCRIPT_NAME()) != GET_HASH_KEY("clothes_shop_sp")
OR (GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("lester1")) = 0 AND GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("michael4")) = 0)
// Only store ped clothes in the saved globals when not on mission or flagged as safe to store on mission
IF bStoreOnMission
OR (NOT IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_STORY)
AND NOT IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_SPMC)
AND NOT IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_STORY_PREP)
AND NOT IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_STORY_FRIENDS)
AND NOT IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_RANDOM_CHAR)
AND NOT IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_MINIGAME)
AND NOT IS_CURRENTLY_ON_MISSION_OF_TYPE(MISSION_TYPE_MINIGAME_FRIENDS))
#IF IS_DEBUG_BUILD
IF bStoreOnMission
DEBUG_PRINTCALLSTACK()
PRINTLN("STORE_PLAYER_PED_VARIATIONS - Clothes getting stored on mission for ", GET_PLAYER_PED_STRING(ePed))
PRINTLN("...MISSION TYPE = ", g_OnMissionState)
ENDIF
#ENDIF
#if USE_CLF_DLC
g_savedGlobalsClifford.sPlayerData.sInfo.sVariations[ePed] = sTempVariations
// Track count so we know when to reset when DLC items are removed
g_savedGlobalsClifford.sPlayerData.sInfo.iTrackedPedComps[ePed] = GET_TOTAL_PED_COMP_VARIATIONS(ped)
// Track the ped component enums
INT iComp
REPEAT NUM_PED_COMPONENTS iComp
g_savedGlobalsClifford.sPlayerData.sInfo.eTrackedPedComp[iComp][ePed] = GET_PED_COMPONENT_ITEM_CURRENT_FROM_LOOKUP(ped, GET_COMP_TYPE_FROM_PED_COMPONENT(INT_TO_ENUM(PED_COMPONENT, iComp)))
ENDREPEAT
REPEAT NUM_PED_COMPONENTS iComp
g_savedGlobalsClifford.sPlayerData.sInfo.eTrackedPedComp[iComp][ePed] = GET_PED_COMPONENT_ITEM_CURRENT_FROM_LOOKUP(ped, GET_COMP_TYPE_FROM_PED_COMPONENT(INT_TO_ENUM(PED_COMPONENT, iComp)))
ENDREPEAT
#endif
#if USE_NRM_DLC
g_savedGlobalsnorman.sPlayerData.sInfo.sVariations[ePed] = sTempVariations
// Track count so we know when to reset when DLC items are removed
g_savedGlobalsnorman.sPlayerData.sInfo.iTrackedPedComps[ePed] = GET_TOTAL_PED_COMP_VARIATIONS(ped)
// Track the ped component enums
INT iComp
REPEAT NUM_PED_COMPONENTS iComp
g_savedGlobalsnorman.sPlayerData.sInfo.eTrackedPedComp[iComp][ePed] = GET_PED_COMPONENT_ITEM_CURRENT_FROM_LOOKUP(ped, GET_COMP_TYPE_FROM_PED_COMPONENT(INT_TO_ENUM(PED_COMPONENT, iComp)))
ENDREPEAT
REPEAT NUM_PED_COMPONENTS iComp
g_savedGlobalsnorman.sPlayerData.sInfo.eTrackedPedComp[iComp][ePed] = GET_PED_COMPONENT_ITEM_CURRENT_FROM_LOOKUP(ped, GET_COMP_TYPE_FROM_PED_COMPONENT(INT_TO_ENUM(PED_COMPONENT, iComp)))
ENDREPEAT
#endif
#if not USE_CLF_DLC
#if not USE_NRM_DLC
g_savedGlobals.sPlayerData.sInfo.sVariations[ePed] = sTempVariations
// Track count so we know when to reset when DLC items are removed
g_savedGlobals.sPlayerData.sInfo.iTrackedPedComps[ePed] = GET_TOTAL_PED_COMP_VARIATIONS(ped)
// Track the ped component enums
INT iComp
REPEAT NUM_PED_COMPONENTS iComp
g_savedGlobals.sPlayerData.sInfo.eTrackedPedComp[iComp][ePed] = GET_PED_COMPONENT_ITEM_CURRENT_FROM_LOOKUP(ped, GET_COMP_TYPE_FROM_PED_COMPONENT(INT_TO_ENUM(PED_COMPONENT, iComp)))
ENDREPEAT
REPEAT NUM_PED_COMPONENTS iComp
g_savedGlobals.sPlayerData.sInfo.eTrackedPedComp[iComp][ePed] = GET_PED_COMPONENT_ITEM_CURRENT_FROM_LOOKUP(ped, GET_COMP_TYPE_FROM_PED_COMPONENT(INT_TO_ENUM(PED_COMPONENT, iComp)))
ENDREPEAT
// Set the suit removed flag once set
IF ePed = CHAR_MICHAEL
IF g_savedGlobals.sFlow.controls.flagIDs[FLOWFLAG_MIC_SET_HAGGARD_SUIT]
g_savedGlobals.sFlow.controls.flagIDs[FLOWFLAG_MIC_REM_HAGGARD_SUIT] = TRUE
ENDIF
ENDIF
#endif
#endif
ENDIF
ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE: Sets the stored hairdo for the player ped
PROC STORE_PLAYER_PED_HAIRDO(PED_INDEX ped, BOOL bStoreOnMission = FALSE)
IF NOT IS_PED_INJURED(ped)
// Grab the ped enum
enumCharacterList ePed = GET_PLAYER_PED_ENUM(ped)
IF IS_PLAYER_PED_PLAYABLE(ePed)
PED_VARIATION_STRUCT sTempVariations
GET_PED_VARIATIONS(ped, sTempVariations)
// Store the peds variations in the packed stats for use with the front end menu.
SET_PACKED_STAT_INT(PACKED_SP_CLTH_TEXTVAR_HEAD, sTempVariations.iTextureVariation[0])
SET_PACKED_STAT_INT(PACKED_SP_CLTH_TEXTVAR_BERD, sTempVariations.iTextureVariation[1])
SET_PACKED_STAT_INT(PACKED_SP_CLTH_TEXTVAR_HAIR, sTempVariations.iTextureVariation[2])
SET_PACKED_STAT_INT(PACKED_SP_CLTH_DRAWVAR_HEAD, sTempVariations.iDrawableVariation[0])
SET_PACKED_STAT_INT(PACKED_SP_CLTH_DRAWVAR_BERD, sTempVariations.iDrawableVariation[1])
SET_PACKED_STAT_INT(PACKED_SP_CLTH_DRAWVAR_HAIR, sTempVariations.iDrawableVariation[2])
SET_PACKED_STAT_INT(PACKED_SP_CLTH_PALVAR_HEAD, sTempVariations.iPaletteVariation[0])
SET_PACKED_STAT_INT(PACKED_SP_CLTH_PALVAR_BERD, sTempVariations.iPaletteVariation[1])
SET_PACKED_STAT_INT(PACKED_SP_CLTH_PALVAR_HAIR, sTempVariations.iPaletteVariation[2])
// Update the last stored ped clothes.
g_sLastStoredPlayerPedClothes[ePed].iTextureVariation[0] = sTempVariations.iTextureVariation[0]
g_sLastStoredPlayerPedClothes[ePed].iTextureVariation[1] = sTempVariations.iTextureVariation[1]
g_sLastStoredPlayerPedClothes[ePed].iTextureVariation[2] = sTempVariations.iTextureVariation[2]
g_sLastStoredPlayerPedClothes[ePed].iDrawableVariation[0] = sTempVariations.iDrawableVariation[0]
g_sLastStoredPlayerPedClothes[ePed].iDrawableVariation[1] = sTempVariations.iDrawableVariation[1]
g_sLastStoredPlayerPedClothes[ePed].iDrawableVariation[2] = sTempVariations.iDrawableVariation[2]
g_sLastStoredPlayerPedClothes[ePed].iPaletteVariation[0] = sTempVariations.iPaletteVariation[0]
g_sLastStoredPlayerPedClothes[ePed].iPaletteVariation[1] = sTempVariations.iPaletteVariation[1]
g_sLastStoredPlayerPedClothes[ePed].iPaletteVariation[2] = sTempVariations.iPaletteVariation[2]
// Only store ped clothes in the saved globals when not on mission or flagged as safe to store on mission
IF (NOT IS_CURRENTLY_ON_MISSION_TO_TYPE() OR bStoreOnMission)
#IF IS_DEBUG_BUILD
PRINTLN("STORE_PLAYER_PED_HAIRDO - Storing variations for ", GET_PLAYER_PED_STRING(ePed), " - ", GET_THIS_SCRIPT_NAME())
#ENDIF
#if USE_CLF_DLC
g_savedGlobalsClifford.sPlayerData.sInfo.sVariations[ePed].iTextureVariation[0] = sTempVariations.iTextureVariation[0]
g_savedGlobalsClifford.sPlayerData.sInfo.sVariations[ePed].iTextureVariation[1] = sTempVariations.iTextureVariation[1]
g_savedGlobalsClifford.sPlayerData.sInfo.sVariations[ePed].iTextureVariation[2] = sTempVariations.iTextureVariation[2]
g_savedGlobalsClifford.sPlayerData.sInfo.sVariations[ePed].iDrawableVariation[0] = sTempVariations.iDrawableVariation[0]
g_savedGlobalsClifford.sPlayerData.sInfo.sVariations[ePed].iDrawableVariation[1] = sTempVariations.iDrawableVariation[1]
g_savedGlobalsClifford.sPlayerData.sInfo.sVariations[ePed].iDrawableVariation[2] = sTempVariations.iDrawableVariation[2]
g_savedGlobalsClifford.sPlayerData.sInfo.sVariations[ePed].iPaletteVariation[0] = sTempVariations.iPaletteVariation[0]
g_savedGlobalsClifford.sPlayerData.sInfo.sVariations[ePed].iPaletteVariation[1] = sTempVariations.iPaletteVariation[1]
g_savedGlobalsClifford.sPlayerData.sInfo.sVariations[ePed].iPaletteVariation[2] = sTempVariations.iPaletteVariation[2]
#endif
#if USE_NRM_DLC
g_savedGlobalsnorman.sPlayerData.sInfo.sVariations[ePed].iTextureVariation[0] = sTempVariations.iTextureVariation[0]
g_savedGlobalsnorman.sPlayerData.sInfo.sVariations[ePed].iTextureVariation[1] = sTempVariations.iTextureVariation[1]
g_savedGlobalsnorman.sPlayerData.sInfo.sVariations[ePed].iTextureVariation[2] = sTempVariations.iTextureVariation[2]
g_savedGlobalsnorman.sPlayerData.sInfo.sVariations[ePed].iDrawableVariation[0] = sTempVariations.iDrawableVariation[0]
g_savedGlobalsnorman.sPlayerData.sInfo.sVariations[ePed].iDrawableVariation[1] = sTempVariations.iDrawableVariation[1]
g_savedGlobalsnorman.sPlayerData.sInfo.sVariations[ePed].iDrawableVariation[2] = sTempVariations.iDrawableVariation[2]
g_savedGlobalsnorman.sPlayerData.sInfo.sVariations[ePed].iPaletteVariation[0] = sTempVariations.iPaletteVariation[0]
g_savedGlobalsnorman.sPlayerData.sInfo.sVariations[ePed].iPaletteVariation[1] = sTempVariations.iPaletteVariation[1]
g_savedGlobalsnorman.sPlayerData.sInfo.sVariations[ePed].iPaletteVariation[2] = sTempVariations.iPaletteVariation[2]
#endif
#if not USE_CLF_DLC
#if not USE_NRM_DLC
g_savedGlobals.sPlayerData.sInfo.sVariations[ePed].iTextureVariation[0] = sTempVariations.iTextureVariation[0]
g_savedGlobals.sPlayerData.sInfo.sVariations[ePed].iTextureVariation[1] = sTempVariations.iTextureVariation[1]
g_savedGlobals.sPlayerData.sInfo.sVariations[ePed].iTextureVariation[2] = sTempVariations.iTextureVariation[2]
g_savedGlobals.sPlayerData.sInfo.sVariations[ePed].iDrawableVariation[0] = sTempVariations.iDrawableVariation[0]
g_savedGlobals.sPlayerData.sInfo.sVariations[ePed].iDrawableVariation[1] = sTempVariations.iDrawableVariation[1]
g_savedGlobals.sPlayerData.sInfo.sVariations[ePed].iDrawableVariation[2] = sTempVariations.iDrawableVariation[2]
g_savedGlobals.sPlayerData.sInfo.sVariations[ePed].iPaletteVariation[0] = sTempVariations.iPaletteVariation[0]
g_savedGlobals.sPlayerData.sInfo.sVariations[ePed].iPaletteVariation[1] = sTempVariations.iPaletteVariation[1]
g_savedGlobals.sPlayerData.sInfo.sVariations[ePed].iPaletteVariation[2] = sTempVariations.iPaletteVariation[2]
#endif
#endif
ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE: Sets the stored hairdo for the player ped
PROC RESTORE_PLAYER_PED_HAIRDO(PED_INDEX ped)
// Grab the ped enum
enumCharacterList ePed = GET_PLAYER_PED_ENUM(ped)
IF IS_PLAYER_PED_PLAYABLE(ePed)
#IF IS_DEBUG_BUILD
PRINTLN("RESTORE_PLAYER_PED_HAIRDO - Restoring hairdo for ", GET_PLAYER_PED_STRING(ePed), " - ", GET_THIS_SCRIPT_NAME())
#ENDIF
#if USE_CLF_DLC
SET_PED_COMPONENT_VARIATION(ped, PED_COMP_HAIR, g_savedGlobalsClifford.sPlayerData.sInfo.sVariations[ePed].iDrawableVariation[PED_COMP_HAIR], g_savedGlobalsClifford.sPlayerData.sInfo.sVariations[ePed].iTextureVariation[PED_COMP_HAIR])
SET_PED_COMPONENT_VARIATION(ped, PED_COMP_HEAD, g_savedGlobalsClifford.sPlayerData.sInfo.sVariations[ePed].iDrawableVariation[PED_COMP_HEAD], g_savedGlobalsClifford.sPlayerData.sInfo.sVariations[ePed].iTextureVariation[PED_COMP_HEAD])
#endif
#if USE_NRM_DLC
SET_PED_COMPONENT_VARIATION(ped, PED_COMP_HAIR, g_savedGlobalsnorman.sPlayerData.sInfo.sVariations[ePed].iDrawableVariation[PED_COMP_HAIR], g_savedGlobalsnorman.sPlayerData.sInfo.sVariations[ePed].iTextureVariation[PED_COMP_HAIR])
SET_PED_COMPONENT_VARIATION(ped, PED_COMP_HEAD, g_savedGlobalsnorman.sPlayerData.sInfo.sVariations[ePed].iDrawableVariation[PED_COMP_HEAD], g_savedGlobalsnorman.sPlayerData.sInfo.sVariations[ePed].iTextureVariation[PED_COMP_HEAD])
#endif
#if not USE_CLF_DLC
#if not USE_NRM_DLC
SET_PED_COMPONENT_VARIATION(ped, PED_COMP_HAIR, g_savedGlobals.sPlayerData.sInfo.sVariations[ePed].iDrawableVariation[PED_COMP_HAIR], g_savedGlobals.sPlayerData.sInfo.sVariations[ePed].iTextureVariation[PED_COMP_HAIR])
SET_PED_COMPONENT_VARIATION(ped, PED_COMP_HEAD, g_savedGlobals.sPlayerData.sInfo.sVariations[ePed].iDrawableVariation[PED_COMP_HEAD], g_savedGlobals.sPlayerData.sInfo.sVariations[ePed].iTextureVariation[PED_COMP_HEAD])
#endif
#endif
ENDIF
ENDPROC
/// PURPOSE: Sets the ped component and prop variations
PROC RESTORE_PLAYER_PED_VARIATIONSCLF(PED_INDEX ped)
// Grab the ped enum
enumCharacterList ePed = GET_PLAYER_PED_ENUM(ped)
IF IS_PLAYER_PED_PLAYABLE(ePed)
#IF IS_DEBUG_BUILD
PRINTLN("RESTORE_PLAYER_PED_VARIATIONS - Restoring variation for ", GET_PLAYER_PED_STRING(ePed), " - ", GET_THIS_SCRIPT_NAME())
#ENDIF
// Reset to default if the DLC item count has changed
// - Perhaps we can use DLC_CHECK_SAVEGAME_PACK_CONFIGURATION instead...
IF NOT g_bDLCClothesCheckedOnRestore[ePed]
IF g_savedGlobalsClifford.sPlayerData.sInfo.iTrackedPedComps[ePed] != 0
IF GET_TOTAL_PED_COMP_VARIATIONS(ped) != g_savedGlobalsClifford.sPlayerData.sInfo.iTrackedPedComps[ePed]
#IF IS_DEBUG_BUILD
CPRINTLN(DEBUG_PED_COMP, "OUTFIT CHECK: Setting default outfit as dlc content checks have changed for ", GET_PLAYER_PED_STRING(ePed), " - ", GET_THIS_SCRIPT_NAME())
#ENDIF
SETUP_DEFAULT_PLAYER_VARIATIONS_CLF(ePed)
g_savedGlobalsClifford.sPlayerData.sInfo.iTrackedPedComps[ePed] = GET_TOTAL_PED_COMP_VARIATIONS(ped)
ENDIF
ENDIF
ENDIF
SET_PED_VARIATIONS(ped, g_savedGlobalsClifford.sPlayerData.sInfo.sVariations[ePed])
g_bDLCClothesCheckedOnRestore[ePed] = TRUE
ENDIF
ENDPROC
/// PURPOSE: Sets the ped component and prop variations
PROC RESTORE_PLAYER_PED_VARIATIONSNRM(PED_INDEX ped)
// Grab the ped enum
enumCharacterList ePed = GET_PLAYER_PED_ENUM(ped)
IF IS_PLAYER_PED_PLAYABLE(ePed)
#IF IS_DEBUG_BUILD
PRINTLN("RESTORE_PLAYER_PED_VARIATIONS - Restoring variation for ", GET_PLAYER_PED_STRING(ePed), " - ", GET_THIS_SCRIPT_NAME())
#ENDIF
// Reset to default if the DLC item count has changed
// - Perhaps we can use DLC_CHECK_SAVEGAME_PACK_CONFIGURATION instead...
IF NOT g_bDLCClothesCheckedOnRestore[ePed]
IF g_savedGlobalsnorman.sPlayerData.sInfo.iTrackedPedComps[ePed] != 0
IF GET_TOTAL_PED_COMP_VARIATIONS(ped) != g_savedGlobalsnorman.sPlayerData.sInfo.iTrackedPedComps[ePed]
#IF IS_DEBUG_BUILD
CPRINTLN(DEBUG_PED_COMP, "OUTFIT CHECK: Setting default outfit as dlc content checks have changed for ", GET_PLAYER_PED_STRING(ePed), " - ", GET_THIS_SCRIPT_NAME())
#ENDIF
SETUP_DEFAULT_PLAYER_VARIATIONS_NRM(ePed)
g_savedGlobalsnorman.sPlayerData.sInfo.iTrackedPedComps[ePed] = GET_TOTAL_PED_COMP_VARIATIONS(ped)
ENDIF
ENDIF
ENDIF
SET_PED_VARIATIONS(ped, g_savedGlobalsnorman.sPlayerData.sInfo.sVariations[ePed])
g_bDLCClothesCheckedOnRestore[ePed] = TRUE
ENDIF
ENDPROC
/// PURPOSE: Sets the ped component and prop variations
PROC RESTORE_PLAYER_PED_VARIATIONS(PED_INDEX ped)
#if USE_CLF_DLC
RESTORE_PLAYER_PED_VARIATIONSCLF(ped)
exit
#endif
#if USE_NRM_DLC
RESTORE_PLAYER_PED_VARIATIONSNRM(ped)
exit
#endif
#if not USE_CLF_DLC
#if not USE_NRM_DLC
// Grab the ped enum
enumCharacterList ePed = GET_PLAYER_PED_ENUM(ped)
IF IS_PLAYER_PED_PLAYABLE(ePed)
#IF IS_DEBUG_BUILD
PRINTLN("RESTORE_PLAYER_PED_VARIATIONS - Restoring variation for ", GET_PLAYER_PED_STRING(ePed), " - ", GET_THIS_SCRIPT_NAME())
#ENDIF
// Reset to default if the DLC item count has changed
// - Perhaps we can use DLC_CHECK_SAVEGAME_PACK_CONFIGURATION instead...
IF NOT g_bDLCClothesCheckedOnRestore[ePed]
IF g_savedGlobals.sPlayerData.sInfo.iTrackedPedComps[ePed] != 0
IF GET_TOTAL_PED_COMP_VARIATIONS(ped) != g_savedGlobals.sPlayerData.sInfo.iTrackedPedComps[ePed]
#IF IS_DEBUG_BUILD
CPRINTLN(DEBUG_PED_COMP, "OUTFIT CHECK: Setting default outfit as dlc content checks have changed for ", GET_PLAYER_PED_STRING(ePed), " - ", GET_THIS_SCRIPT_NAME())
#ENDIF
SETUP_DEFAULT_PLAYER_VARIATIONS(ePed)
g_savedGlobals.sPlayerData.sInfo.iTrackedPedComps[ePed] = GET_TOTAL_PED_COMP_VARIATIONS(ped)
ENDIF
ENDIF
ENDIF
SET_PED_VARIATIONS(ped, g_savedGlobals.sPlayerData.sInfo.sVariations[ePed])
// Reset to default if the items shouldn't be unlocked yet
IF NOT g_bDLCClothesCheckedOnRestore[ePed]
PED_COMP_NAME_ENUM eCurrentComp
BOOL bSetDefaultVariations = FALSE
IF ePed = CHAR_MICHAEL
IF NOT LOCAL_GET_MISSION_COMPLETE_STATE(SP_MISSION_MICHAEL_4)
eCurrentComp = GET_PED_COMP_ITEM_CURRENT_SP(ped, COMP_TYPE_OUTFIT)
IF eCurrentComp = OUTFIT_P0_MOVIE_TUXEDO
bSetDefaultVariations = TRUE
#IF IS_DEBUG_BUILD
CPRINTLN(DEBUG_PED_COMP, "OUTFIT CHECK: Setting default outfit as Movie Tuxedo not available for ", GET_PLAYER_PED_STRING(ePed), " - ", GET_THIS_SCRIPT_NAME())
#ENDIF
ENDIF
SET_PED_COMP_ITEM_DETAILS_SP(GET_PLAYER_PED_MODEL(CHAR_MICHAEL), COMP_TYPE_OUTFIT, OUTFIT_P0_MOVIE_TUXEDO, FALSE, FALSE)
ENDIF
IF NOT LOCAL_GET_MISSION_COMPLETE_STATE(SP_MISSION_LESTER_1)
eCurrentComp = GET_PED_COMP_ITEM_CURRENT_SP(ped, COMP_TYPE_TORSO)
IF eCurrentComp = TORSO_P0_GILET_0
OR eCurrentComp = TORSO_P0_GILET_1
OR eCurrentComp = TORSO_P0_GILET_2
OR eCurrentComp = TORSO_P0_GILET_3
OR eCurrentComp = TORSO_P0_GILET_4
OR eCurrentComp = TORSO_P0_GILET_5
bSetDefaultVariations = TRUE
#IF IS_DEBUG_BUILD
CPRINTLN(DEBUG_PED_COMP,"OUTFIT CHECK: Setting default outfit as Programmer torso not available for ", GET_PLAYER_PED_STRING(ePed), " - ", GET_THIS_SCRIPT_NAME())
#ENDIF
ENDIF
eCurrentComp = GET_PED_COMP_ITEM_CURRENT_SP(ped, COMP_TYPE_LEGS)
IF eCurrentComp = LEGS_P0_CARGO_SHORTS_0
OR eCurrentComp = LEGS_P0_CARGO_SHORTS_1
OR eCurrentComp = LEGS_P0_CARGO_SHORTS_2
OR eCurrentComp = LEGS_P0_CARGO_SHORTS_3
OR eCurrentComp = LEGS_P0_CARGO_SHORTS_4
bSetDefaultVariations = TRUE
#IF IS_DEBUG_BUILD
CPRINTLN(DEBUG_PED_COMP, "OUTFIT CHECK: Setting default outfit as Programmer legs not available for ", GET_PLAYER_PED_STRING(ePed), " - ", GET_THIS_SCRIPT_NAME())
#ENDIF
ENDIF
SET_PED_COMP_ITEM_DETAILS_SP(GET_PLAYER_PED_MODEL(CHAR_MICHAEL), COMP_TYPE_TORSO, TORSO_P0_GILET_0, TRUE, FALSE)
SET_PED_COMP_ITEM_DETAILS_SP(GET_PLAYER_PED_MODEL(CHAR_MICHAEL), COMP_TYPE_TORSO, TORSO_P0_GILET_1, TRUE, FALSE)
SET_PED_COMP_ITEM_DETAILS_SP(GET_PLAYER_PED_MODEL(CHAR_MICHAEL), COMP_TYPE_TORSO, TORSO_P0_GILET_2, TRUE, FALSE)
SET_PED_COMP_ITEM_DETAILS_SP(GET_PLAYER_PED_MODEL(CHAR_MICHAEL), COMP_TYPE_TORSO, TORSO_P0_GILET_3, TRUE, FALSE)
SET_PED_COMP_ITEM_DETAILS_SP(GET_PLAYER_PED_MODEL(CHAR_MICHAEL), COMP_TYPE_TORSO, TORSO_P0_GILET_4, TRUE, FALSE)
SET_PED_COMP_ITEM_DETAILS_SP(GET_PLAYER_PED_MODEL(CHAR_MICHAEL), COMP_TYPE_TORSO, TORSO_P0_GILET_5, TRUE, FALSE)
SET_PED_COMP_ITEM_DETAILS_SP(GET_PLAYER_PED_MODEL(CHAR_MICHAEL), COMP_TYPE_LEGS, LEGS_P0_CARGO_SHORTS_0, TRUE, FALSE)
SET_PED_COMP_ITEM_DETAILS_SP(GET_PLAYER_PED_MODEL(CHAR_MICHAEL), COMP_TYPE_LEGS, LEGS_P0_CARGO_SHORTS_1, TRUE, FALSE)
SET_PED_COMP_ITEM_DETAILS_SP(GET_PLAYER_PED_MODEL(CHAR_MICHAEL), COMP_TYPE_LEGS, LEGS_P0_CARGO_SHORTS_2, TRUE, FALSE)
SET_PED_COMP_ITEM_DETAILS_SP(GET_PLAYER_PED_MODEL(CHAR_MICHAEL), COMP_TYPE_LEGS, LEGS_P0_CARGO_SHORTS_3, TRUE, FALSE)
SET_PED_COMP_ITEM_DETAILS_SP(GET_PLAYER_PED_MODEL(CHAR_MICHAEL), COMP_TYPE_LEGS, LEGS_P0_CARGO_SHORTS_4, TRUE, FALSE)
ENDIF
ELIF ePed = CHAR_TREVOR
eCurrentComp = GET_PED_COMP_ITEM_CURRENT_SP(ped, COMP_TYPE_LEGS)
IF eCurrentComp = LEGS_P2_TOILET
bSetDefaultVariations = true
endif
ENDIF
IF bSetDefaultVariations
SETUP_DEFAULT_PLAYER_VARIATIONS(ePed)
SET_PED_VARIATIONS(ped, g_savedGlobals.sPlayerData.sInfo.sVariations[ePed])
ENDIF
ENDIF
g_bDLCClothesCheckedOnRestore[ePed] = TRUE
ENDIF
#ENDIF
#ENDIF
ENDPROC
/// PURPOSE: Cycles through the list of weapons and checks to see if the player has any ammo or mods
PROC STORE_PLAYER_PED_WEAPONS_IN_SNAPSHOT(PED_INDEX ped)
// Grab the ped enum
IF NOT IS_PED_INJURED(ped)
enumCharacterList ePed = GET_PLAYER_PED_ENUM(ped)
#IF IS_DEBUG_BUILD
PRINTLN("STORE_PLAYER_PED_WEAPONS_IN_SNAPSHOT - Storing weapons, pedID = ", NATIVE_TO_INT(ped))
#ENDIF
#if USE_CLF_DLC
GET_PED_WEAPONS(ped, g_savedGlobalsClifford.sPlayerData.sInfo.sMissionSnapshotWeapons)
INT slotIndex
FOR slotIndex = WEAPON_WHEEL_SLOT_PISTOL TO (ENUM_TO_INT(MAX_WHEEL_SLOTS)-1)
g_savedGlobalsClifford.sPlayerData.sInfo.eWeaponToShow[slotIndex][ENUM_TO_INT(ePed)] = HUD_GET_WEAPON_WHEEL_TOP_SLOT(slotIndex)
ENDFOR
#endif
#if USE_NRM_DLC
GET_PED_WEAPONS(ped, g_savedGlobalsnorman.sPlayerData.sInfo.sMissionSnapshotWeapons)
INT slotIndex
FOR slotIndex = WEAPON_WHEEL_SLOT_PISTOL TO (ENUM_TO_INT(MAX_WHEEL_SLOTS)-1)
g_savedGlobalsnorman.sPlayerData.sInfo.eWeaponToShow[slotIndex][ENUM_TO_INT(ePed)] = HUD_GET_WEAPON_WHEEL_TOP_SLOT(slotIndex)
ENDFOR
#endif
#if not USE_CLF_DLC
#if not USE_NRM_DLC
GET_PED_WEAPONS(ped, g_savedGlobals.sPlayerData.sInfo.sMissionSnapshotWeapons)
INT slotIndex
FOR slotIndex = WEAPON_WHEEL_SLOT_PISTOL TO (ENUM_TO_INT(MAX_WHEEL_SLOTS)-1)
g_savedGlobals.sPlayerData.sInfo.eWeaponToShow[slotIndex][ENUM_TO_INT(ePed)] = HUD_GET_WEAPON_WHEEL_TOP_SLOT(slotIndex)
ENDFOR
#endif
#endif
ENDIF
ENDPROC
/// PURPOSE: Cycles through the list of weapons and checks to see if the player has any ammo or mods
PROC RESTORE_PLAYER_PED_WEAPONS_IN_SNAPSHOT(PED_INDEX ped, BOOL bRemoveCurrentWeapons = TRUE)
// Grab the ped enum
IF NOT IS_PED_INJURED(ped)
enumCharacterList ePed = GET_PLAYER_PED_ENUM(ped)
#IF IS_DEBUG_BUILD
PRINTLN("RESTORE_PLAYER_PED_WEAPONS_IN_SNAPSHOT - Restoring weapons, pedID = ", NATIVE_TO_INT(ped), " Called by: ", GET_THIS_SCRIPT_NAME())
#ENDIF
#if USE_CLF_DLC
SET_PED_WEAPONS(ped, g_savedGlobalsClifford.sPlayerData.sInfo.sMissionSnapshotWeapons, bRemoveCurrentWeapons)
INT slotIndex
FOR slotIndex = WEAPON_WHEEL_SLOT_PISTOL TO (ENUM_TO_INT(MAX_WHEEL_SLOTS)-1)
HUD_SET_WEAPON_WHEEL_TOP_SLOT(g_savedGlobalsClifford.sPlayerData.sInfo.eWeaponToShow[slotIndex][ENUM_TO_INT(ePed)])
ENDFOR
#endif
#if USE_NRM_DLC
SET_PED_WEAPONS(ped, g_savedGlobalsnorman.sPlayerData.sInfo.sMissionSnapshotWeapons, bRemoveCurrentWeapons)
INT slotIndex
FOR slotIndex = WEAPON_WHEEL_SLOT_PISTOL TO (ENUM_TO_INT(MAX_WHEEL_SLOTS)-1)
HUD_SET_WEAPON_WHEEL_TOP_SLOT(g_savedGlobalsnorman.sPlayerData.sInfo.eWeaponToShow[slotIndex][ENUM_TO_INT(ePed)])
ENDFOR
#endif
#if not USE_CLF_DLC
#if not USE_NRM_DLC
SET_PED_WEAPONS(ped, g_savedGlobals.sPlayerData.sInfo.sMissionSnapshotWeapons, bRemoveCurrentWeapons)
INT slotIndex
FOR slotIndex = WEAPON_WHEEL_SLOT_PISTOL TO (ENUM_TO_INT(MAX_WHEEL_SLOTS)-1)
HUD_SET_WEAPON_WHEEL_TOP_SLOT(g_savedGlobals.sPlayerData.sInfo.eWeaponToShow[slotIndex][ENUM_TO_INT(ePed)])
ENDFOR
#endif
#endif
ENDIF
ENDPROC
/// PURPOSE: Cycles through the list of weapons and checks to see if the player has any ammo or mods
PROC RESTORE_PLAYER_PED_WEAPONS_IN_SNAPSHOT_FOR_CHAR(enumCharacterList ePed)
// Grab the ped enum
IF IS_PLAYER_PED_PLAYABLE(ePed)
#IF IS_DEBUG_BUILD
PRINTLN("RESTORE_PLAYER_PED_WEAPONS_IN_SNAPSHOT_FOR_CHAR - Restoring weapons, ped enum = ", ENUM_TO_INT(ePed))
#ENDIF
#if USE_CLF_DLC
g_savedGlobalsClifford.sPlayerData.sInfo.sWeapons[ENUM_TO_INT(ePed)] = g_savedGlobalsClifford.sPlayerData.sInfo.sMissionSnapshotWeapons
#endif
#if USE_NRM_DLC
g_savedGlobalsnorman.sPlayerData.sInfo.sWeapons[ENUM_TO_INT(ePed)] = g_savedGlobalsnorman.sPlayerData.sInfo.sMissionSnapshotWeapons
#endif
#if not USE_CLF_DLC
#if not USE_NRM_DLC
g_savedGlobals.sPlayerData.sInfo.sWeapons[ENUM_TO_INT(ePed)] = g_savedGlobals.sPlayerData.sInfo.sMissionSnapshotWeapons
#endif
#endif
ENDIF
ENDPROC
/// PURPOSE: Cycles through the list of weapons and checks to see if the player has any ammo or mods
PROC STORE_PLAYER_PED_WEAPONS(PED_INDEX ped, BOOL storeEquippedWeapon = FALSE)
// Grab the ped enum
enumCharacterList ePed = GET_PLAYER_PED_ENUM(ped)
IF IS_PLAYER_PED_PLAYABLE(ePed)
AND NOT IS_PED_INJURED(ped)
// To fix the infinite ammo issues we are now only going to store the players ammo.
// Any issues, see Kenneth.
IF ped = PLAYER_PED_ID()
#IF IS_DEBUG_BUILD
PRINTLN("STORE_PLAYER_PED_WEAPONS - Storing weapons for ", GET_PLAYER_PED_STRING(ePed), " pedID = ", NATIVE_TO_INT(ped), " Called by: ", GET_THIS_SCRIPT_NAME())
INT iEntityInstanceID
STRING strEntityScript = GET_ENTITY_SCRIPT(ped, iEntityInstanceID)
IF NOT IS_STRING_NULL(strEntityScript)
PRINTLN("...pedID belongs to script '", strEntityScript, "'")
ENDIF
IF NOT IS_PED_IN_TEMP_PLAYER_PED_ID_LIST(ped)
PRINTLN("STORE_PLAYER_PED_WEAPONS - Ped not set up correctly so weapons are likely to be removed")
//SCRIPT_ASSERT("STORE_PLAYER_PED_WEAPONS - Ped not set up correctly. Tell Kenneth R.")
ENDIF
#ENDIF
WEAPON_TYPE equippedWeapon
INT slotIndex
#IF USE_CLF_DLC
GET_PED_WEAPONS(ped, g_savedGlobalsClifford.sPlayerData.sInfo.sWeapons[ENUM_TO_INT(ePed)])
FOR slotIndex = WEAPON_WHEEL_SLOT_PISTOL TO (ENUM_TO_INT(MAX_WHEEL_SLOTS)-1)
g_savedGlobalsClifford.sPlayerData.sInfo.eWeaponToShow[slotIndex][ENUM_TO_INT(ePed)] = HUD_GET_WEAPON_WHEEL_TOP_SLOT(slotIndex)
IF storeEquippedWeapon
equippedWeapon = HUD_GET_WEAPON_WHEEL_CURRENTLY_HIGHLIGHTED()
IF g_savedGlobalsClifford.sPlayerData.sInfo.eWeaponToShow[slotIndex][ENUM_TO_INT(ePed)] = equippedWeapon
g_savedGlobalsClifford.sPlayerData.sInfo.equippedWeaponSlot = slotIndex
ENDIF
ENDIF
ENDFOR
#ENDIF
#IF USE_NRM_DLC
GET_PED_WEAPONS(ped, g_savedGlobalsnorman.sPlayerData.sInfo.sWeapons[ENUM_TO_INT(ePed)])
FOR slotIndex = WEAPON_WHEEL_SLOT_PISTOL TO (ENUM_TO_INT(MAX_WHEEL_SLOTS)-1)
g_savedGlobalsnorman.sPlayerData.sInfo.eWeaponToShow[slotIndex][ENUM_TO_INT(ePed)] = HUD_GET_WEAPON_WHEEL_TOP_SLOT(slotIndex)
IF storeEquippedWeapon
equippedWeapon = HUD_GET_WEAPON_WHEEL_CURRENTLY_HIGHLIGHTED()
IF g_savedGlobalsnorman.sPlayerData.sInfo.eWeaponToShow[slotIndex][ENUM_TO_INT(ePed)] = equippedWeapon
g_savedGlobalsnorman.sPlayerData.sInfo.equippedWeaponSlot = slotIndex
ENDIF
ENDIF
ENDFOR
#ENDIF
#IF NOT USE_SP_DLC
GET_PED_WEAPONS(ped, g_savedGlobals.sPlayerData.sInfo.sWeapons[ENUM_TO_INT(ePed)])
FOR slotIndex = WEAPON_WHEEL_SLOT_PISTOL TO (ENUM_TO_INT(MAX_WHEEL_SLOTS)-1)
g_savedGlobals.sPlayerData.sInfo.eWeaponToShow[slotIndex][ENUM_TO_INT(ePed)] = HUD_GET_WEAPON_WHEEL_TOP_SLOT(slotIndex)
IF storeEquippedWeapon
equippedWeapon = HUD_GET_WEAPON_WHEEL_CURRENTLY_HIGHLIGHTED()
IF g_savedGlobals.sPlayerData.sInfo.eWeaponToShow[slotIndex][ENUM_TO_INT(ePed)] = equippedWeapon
g_savedGlobals.sPlayerData.sInfo.equippedWeaponSlot = slotIndex
ENDIF
ENDIF
ENDFOR
#ENDIF
INT iTint
GET_PLAYER_PARACHUTE_PACK_TINT_INDEX(PLAYER_ID(), iTint)
IF (ePed = CHAR_MICHAEL) STAT_SET_INT(SP0_PARACHUTE_CURRENT_TINT, iTint)
ELIF (ePed = CHAR_FRANKLIN) STAT_SET_INT(SP1_PARACHUTE_CURRENT_TINT, iTint)
ELIF (ePed = CHAR_TREVOR) STAT_SET_INT(SP2_PARACHUTE_CURRENT_TINT, iTint)
ENDIF
ELSE
#IF IS_DEBUG_BUILD
PRINTLN("STORE_PLAYER_PED_WEAPONS - NOT storing weapons for ", GET_PLAYER_PED_STRING(ePed), " pedID = ", NATIVE_TO_INT(ped), " as it is not the PLAYER!")
#ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE: Removes all the peds weapons and then sets the new ammo and mods for each
PROC RESTORE_PLAYER_PED_WEAPONSCLF(PED_INDEX ped, BOOL bRemoveCurrentWeapons = TRUE, BOOL setEquippedWeapon = FALSE)
// Grab the ped enum
enumCharacterList ePed = GET_PLAYER_PED_ENUM(ped)
IF IS_PLAYER_PED_PLAYABLE(ePed)
AND NOT IS_PED_INJURED(ped)
PRINTLN("RESTORE_PLAYER_PED_WEAPONS - Restoring weapons for ", GET_PLAYER_PED_STRING(ePed), " Called by: ", GET_THIS_SCRIPT_NAME())
SET_PED_WEAPONS(ped, g_savedGlobalsClifford.sPlayerData.sInfo.sWeapons[ENUM_TO_INT(ePed)], bRemoveCurrentWeapons)
INT iTint
IF (ePed = CHAR_MICHAEL) STAT_GET_INT(SP0_PARACHUTE_CURRENT_TINT, iTint)
ELIF (ePed = CHAR_FRANKLIN) STAT_GET_INT(SP1_PARACHUTE_CURRENT_TINT, iTint)
ELIF (ePed = CHAR_TREVOR) STAT_GET_INT(SP2_PARACHUTE_CURRENT_TINT, iTint)
ENDIF
SET_PLAYER_PARACHUTE_PACK_TINT_INDEX(PLAYER_ID(), iTint)
INT slotIndex
FOR slotIndex = WEAPON_WHEEL_SLOT_PISTOL TO (ENUM_TO_INT(MAX_WHEEL_SLOTS)-1)
HUD_SET_WEAPON_WHEEL_TOP_SLOT(g_savedGlobalsClifford.sPlayerData.sInfo.eWeaponToShow[slotIndex][ENUM_TO_INT(ePed)])
IF setEquippedWeapon
IF slotIndex = g_savedGlobalsClifford.sPlayerData.sInfo.equippedWeaponSlot
OR g_savedGlobalsClifford.sPlayerData.sInfo.equippedWeaponSlot = -1 AND slotIndex = ENUM_TO_INT(WEAPON_WHEEL_SLOT_UNARMED_MELEE)//default melee
SET_CURRENT_PED_WEAPON(ped, g_savedGlobalsClifford.sPlayerData.sInfo.eWeaponToShow[slotIndex][ENUM_TO_INT(ePed)],TRUE)
ENDIF
ENDIF
ENDFOR
ENDIF
ENDPROC
/// PURPOSE: Removes all the peds weapons and then sets the new ammo and mods for each
PROC RESTORE_PLAYER_PED_WEAPONSNRM(PED_INDEX ped, BOOL bRemoveCurrentWeapons = TRUE, BOOL setEquippedWeapon = FALSE)
// Grab the ped enum
enumCharacterList ePed = GET_PLAYER_PED_ENUM(ped)
IF IS_PLAYER_PED_PLAYABLE(ePed)
AND NOT IS_PED_INJURED(ped)
PRINTLN("RESTORE_PLAYER_PED_WEAPONS - Restoring weapons for ", GET_PLAYER_PED_STRING(ePed), " Called by: ", GET_THIS_SCRIPT_NAME())
SET_PED_WEAPONS(ped, g_savedGlobalsnorman.sPlayerData.sInfo.sWeapons[ENUM_TO_INT(ePed)], bRemoveCurrentWeapons)
INT iTint
IF (ePed = CHAR_MICHAEL) STAT_GET_INT(SP0_PARACHUTE_CURRENT_TINT, iTint)
ELIF (ePed = CHAR_FRANKLIN) STAT_GET_INT(SP1_PARACHUTE_CURRENT_TINT, iTint)
ELIF (ePed = CHAR_TREVOR) STAT_GET_INT(SP2_PARACHUTE_CURRENT_TINT, iTint)
ENDIF
SET_PLAYER_PARACHUTE_PACK_TINT_INDEX(PLAYER_ID(), iTint)
INT slotIndex
FOR slotIndex = WEAPON_WHEEL_SLOT_PISTOL TO (ENUM_TO_INT(MAX_WHEEL_SLOTS)-1)
HUD_SET_WEAPON_WHEEL_TOP_SLOT(g_savedGlobalsnorman.sPlayerData.sInfo.eWeaponToShow[slotIndex][ENUM_TO_INT(ePed)])
IF setEquippedWeapon
IF slotIndex = g_savedGlobalsnorman.sPlayerData.sInfo.equippedWeaponSlot
OR g_savedGlobalsnorman.sPlayerData.sInfo.equippedWeaponSlot = -1 AND slotIndex = ENUM_TO_INT(WEAPON_WHEEL_SLOT_UNARMED_MELEE)//default melee
SET_CURRENT_PED_WEAPON(ped, g_savedGlobalsnorman.sPlayerData.sInfo.eWeaponToShow[slotIndex][ENUM_TO_INT(ePed)],TRUE)
ENDIF
ENDIF
ENDFOR
ENDIF
ENDPROC
/// PURPOSE: Removes all the peds weapons and then sets the new ammo and mods for each
PROC RESTORE_PLAYER_PED_WEAPONS(PED_INDEX ped, BOOL bRemoveCurrentWeapons = TRUE, BOOL setEquippedWeapon = FALSE)
#IF USE_CLF_DLC
RESTORE_PLAYER_PED_WEAPONSCLF(ped, bRemoveCurrentWeapons, setEquippedWeapon)
EXIT
#ENDIF
#IF USE_NRM_DLC
RESTORE_PLAYER_PED_WEAPONSNRM(ped, bRemoveCurrentWeapons, setEquippedWeapon)
EXIT
#ENDIF
// Grab the ped enum
enumCharacterList ePed = GET_PLAYER_PED_ENUM(ped)
IF IS_PLAYER_PED_PLAYABLE(ePed)
AND NOT IS_PED_INJURED(ped)
PRINTLN("RESTORE_PLAYER_PED_WEAPONS - Restoring weapons for ", GET_PLAYER_PED_STRING(ePed), " Called by: ", GET_THIS_SCRIPT_NAME())
SET_PED_WEAPONS(ped, g_savedGlobals.sPlayerData.sInfo.sWeapons[ENUM_TO_INT(ePed)], bRemoveCurrentWeapons)
INT slotIndex
FOR slotIndex = WEAPON_WHEEL_SLOT_PISTOL TO (ENUM_TO_INT(MAX_WHEEL_SLOTS)-1)
HUD_SET_WEAPON_WHEEL_TOP_SLOT(g_savedGlobals.sPlayerData.sInfo.eWeaponToShow[slotIndex][ENUM_TO_INT(ePed)])
IF setEquippedWeapon
IF slotIndex = g_savedGlobals.sPlayerData.sInfo.equippedWeaponSlot
OR g_savedGlobals.sPlayerData.sInfo.equippedWeaponSlot = -1 AND slotIndex = ENUM_TO_INT(WEAPON_WHEEL_SLOT_UNARMED_MELEE)//default melee
IF g_savedGlobals.sPlayerData.sInfo.eWeaponToShow[slotIndex][ENUM_TO_INT(ePed)] != WEAPONTYPE_INVALID
AND g_savedGlobals.sPlayerData.sInfo.eWeaponToShow[slotIndex][ENUM_TO_INT(ePed)] != WEAPONTYPE_MOLOTOV
if HAS_PED_GOT_WEAPON(ped, g_savedGlobals.sPlayerData.sInfo.eWeaponToShow[slotIndex][ENUM_TO_INT(ePed)])
SET_CURRENT_PED_WEAPON(ped, g_savedGlobals.sPlayerData.sInfo.eWeaponToShow[slotIndex][ENUM_TO_INT(ePed)],TRUE)
endif
ENDIF
ENDIF
ENDIF
ENDFOR
INT iTint
IF (ePed = CHAR_MICHAEL) STAT_GET_INT(SP0_PARACHUTE_CURRENT_TINT, iTint)
ELIF (ePed = CHAR_FRANKLIN) STAT_GET_INT(SP1_PARACHUTE_CURRENT_TINT, iTint)
ELIF (ePed = CHAR_TREVOR) STAT_GET_INT(SP2_PARACHUTE_CURRENT_TINT, iTint)
ENDIF
SET_PLAYER_PARACHUTE_PACK_TINT_INDEX(PLAYER_ID(), iTint)
ENDIF
ENDPROC
/// PURPOSE: Stores the player peds health.
PROC STORE_PLAYER_PED_HEALTH(PED_INDEX ped)
// Grab the ped enum
enumCharacterList ePed = GET_PLAYER_PED_ENUM(ped)
IF IS_PLAYER_PED_PLAYABLE(ePed)
AND NOT IS_PED_INJURED(ped)
// Store the health as a percentage
#if USE_CLF_DLC
g_savedGlobalsClifford.sPlayerData.sInfo.fHealthPerc[ePed] = (((TO_FLOAT(GET_ENTITY_HEALTH(ped))-100.0) / (TO_FLOAT(GET_PED_MAX_HEALTH(ped))-100.0)) * 100.0) // Health under 100 is considered dead so remove margin
#endif
#if USE_NRM_DLC
g_savedGlobalsnorman.sPlayerData.sInfo.fHealthPerc[ePed] = (((TO_FLOAT(GET_ENTITY_HEALTH(ped))-100.0) / (TO_FLOAT(GET_PED_MAX_HEALTH(ped))-100.0)) * 100.0) // Health under 100 is considered dead so remove margin
#endif
#if not USE_CLF_DLC
#if not USE_NRM_DLC
g_savedGlobals.sPlayerData.sInfo.fHealthPerc[ePed] = (((TO_FLOAT(GET_ENTITY_HEALTH(ped))-100.0) / (TO_FLOAT(GET_PED_MAX_HEALTH(ped))-100.0)) * 100.0) // Health under 100 is considered dead so remove margin
#endif
#endif
ENDIF
ENDPROC
/// PURPOSE: Sets the player peds health.
PROC RESTORE_PLAYER_PED_HEALTHCLF(PED_INDEX ped)
// Grab the ped enum
enumCharacterList ePed = GET_PLAYER_PED_ENUM(ped)
IF IS_PLAYER_PED_PLAYABLE(ePed)
AND NOT IS_PED_INJURED(ped)
// Fix for #1335266 - Multiply players health with tunable.
IF ped = PLAYER_PED_ID()
AND GET_PED_MAX_HEALTH(ped) = 200
SET_PED_MAX_HEALTH(ped, ROUND(GET_PED_MAX_HEALTH(ped)*g_sMPTunables.fMaxHealthMultiplier))
PRINTLN("RESTORE_PLAYER_PED_HEALTH - Increasing players max health for tunable")
ENDIF
// Make sure the ped will have some health
IF g_savedGlobalsClifford.sPlayerData.sInfo.fHealthPerc[ePed] <= 0
g_savedGlobalsClifford.sPlayerData.sInfo.fHealthPerc[ePed] = 100
// give ped at least a minimum of 10% health
ELIF g_savedGlobalsClifford.sPlayerData.sInfo.fHealthPerc[ePed] <= 10
g_savedGlobalsClifford.sPlayerData.sInfo.fHealthPerc[ePed] = 10
ENDIF
// Health is stored as a percentage so set it as a percentage of the max health => (perc / 100) * (max-100) + 100
SET_ENTITY_HEALTH(ped, ROUND(((g_savedGlobalsClifford.sPlayerData.sInfo.fHealthPerc[ePed] / 100.0) * (TO_FLOAT(GET_PED_MAX_HEALTH(ped)) - 100.0)) + 100.0))
ENDIF
ENDPROC
/// PURPOSE: Sets the player peds health.
PROC RESTORE_PLAYER_PED_HEALTHNRM(PED_INDEX ped)
// Grab the ped enum
enumCharacterList ePed = GET_PLAYER_PED_ENUM(ped)
IF IS_PLAYER_PED_PLAYABLE(ePed)
AND NOT IS_PED_INJURED(ped)
// Fix for #1335266 - Multiply players health with tunable.
IF ped = PLAYER_PED_ID()
AND GET_PED_MAX_HEALTH(ped) = 200
SET_PED_MAX_HEALTH(ped, ROUND(GET_PED_MAX_HEALTH(ped)*g_sMPTunables.fMaxHealthMultiplier))
PRINTLN("RESTORE_PLAYER_PED_HEALTH - Increasing players max health for tunable")
ENDIF
// Make sure the ped will have some health
IF g_savedGlobalsnorman.sPlayerData.sInfo.fHealthPerc[ePed] <= 0
g_savedGlobalsnorman.sPlayerData.sInfo.fHealthPerc[ePed] = 100
// give ped at least a minimum of 10% health
ELIF g_savedGlobalsnorman.sPlayerData.sInfo.fHealthPerc[ePed] <= 10
g_savedGlobalsnorman.sPlayerData.sInfo.fHealthPerc[ePed] = 10
ENDIF
// Health is stored as a percentage so set it as a percentage of the max health => (perc / 100) * (max-100) + 100
SET_ENTITY_HEALTH(ped, ROUND(((g_savedGlobalsnorman.sPlayerData.sInfo.fHealthPerc[ePed] / 100.0) * (TO_FLOAT(GET_PED_MAX_HEALTH(ped)) - 100.0)) + 100.0))
ENDIF
ENDPROC
/// PURPOSE: Sets the player peds health.
PROC RESTORE_PLAYER_PED_HEALTH(PED_INDEX ped)
#if USE_CLF_DLC
RESTORE_PLAYER_PED_HEALTHCLF(ped)
exit
#endif
#if USE_NRM_DLC
RESTORE_PLAYER_PED_HEALTHNRM(ped)
exit
#endif
// Grab the ped enum
enumCharacterList ePed = GET_PLAYER_PED_ENUM(ped)
IF IS_PLAYER_PED_PLAYABLE(ePed)
AND NOT IS_PED_INJURED(ped)
// Fix for #1335266 - Multiply players health with tunable.
IF ped = PLAYER_PED_ID()
AND GET_PED_MAX_HEALTH(ped) = 200
SET_PED_MAX_HEALTH(ped, ROUND(GET_PED_MAX_HEALTH(ped)*g_sMPTunables.fMaxHealthMultiplier))
PRINTLN("RESTORE_PLAYER_PED_HEALTH - Increasing players max health for tunable")
ENDIF
// Make sure the ped will have some health
IF g_savedGlobals.sPlayerData.sInfo.fHealthPerc[ePed] <= 0
g_savedGlobals.sPlayerData.sInfo.fHealthPerc[ePed] = 100
// give ped at least a minimum of 10% health
ELIF g_savedGlobals.sPlayerData.sInfo.fHealthPerc[ePed] <= 10
g_savedGlobals.sPlayerData.sInfo.fHealthPerc[ePed] = 10
ENDIF
// Health is stored as a percentage so set it as a percentage of the max health => (perc / 100) * (max-100) + 100
SET_ENTITY_HEALTH(ped, ROUND(((g_savedGlobals.sPlayerData.sInfo.fHealthPerc[ePed] / 100.0) * (TO_FLOAT(GET_PED_MAX_HEALTH(ped)) - 100.0)) + 100.0))
ENDIF
ENDPROC
/// PURPOSE: Stores the player peds armour.
PROC STORE_PLAYER_PED_ARMOUR(PED_INDEX ped)
// Grab the ped enum
enumCharacterList ePed = GET_PLAYER_PED_ENUM(ped)
IF IS_PLAYER_PED_PLAYABLE(ePed)
AND NOT IS_PED_INJURED(ped)
#if USE_CLF_DLC
g_savedGlobalsClifford.sPlayerData.sInfo.iArmour[ePed] = GET_PED_ARMOUR(ped)
#endif
#if USE_NRM_DLC
g_savedGlobalsnorman.sPlayerData.sInfo.iArmour[ePed] = GET_PED_ARMOUR(ped)
#endif
#if not USE_CLF_DLC
#if not USE_NRM_DLC
g_savedGlobals.sPlayerData.sInfo.iArmour[ePed] = GET_PED_ARMOUR(ped)
#endif
#endif
ENDIF
ENDPROC
/// PURPOSE: Sets the player peds armour.
PROC RESTORE_PLAYER_PED_ARMOURCLF(PED_INDEX ped)
// Grab the ped enum
enumCharacterList ePed = GET_PLAYER_PED_ENUM(ped)
IF IS_PLAYER_PED_PLAYABLE(ePed)
AND NOT IS_PED_INJURED(ped)
ADD_ARMOUR_TO_PED(ped, g_savedGlobalsClifford.sPlayerData.sInfo.iArmour[ePed]-GET_PED_ARMOUR(ped))
ENDIF
ENDPROC
/// PURPOSE: Sets the player peds armour.
PROC RESTORE_PLAYER_PED_ARMOURNRM(PED_INDEX ped)
// Grab the ped enum
enumCharacterList ePed = GET_PLAYER_PED_ENUM(ped)
IF IS_PLAYER_PED_PLAYABLE(ePed)
AND NOT IS_PED_INJURED(ped)
ADD_ARMOUR_TO_PED(ped, g_savedGlobalsnorman.sPlayerData.sInfo.iArmour[ePed]-GET_PED_ARMOUR(ped))
ENDIF
ENDPROC
/// PURPOSE: Sets the player peds armour.
PROC RESTORE_PLAYER_PED_ARMOUR(PED_INDEX ped)
#if USE_CLF_DLC
RESTORE_PLAYER_PED_ARMOURCLF(ped)
exit
#endif
#if USE_NRM_DLC
RESTORE_PLAYER_PED_ARMOURNRM(ped)
exit
#endif
// Grab the ped enum
enumCharacterList ePed = GET_PLAYER_PED_ENUM(ped)
IF IS_PLAYER_PED_PLAYABLE(ePed)
AND NOT IS_PED_INJURED(ped)
ADD_ARMOUR_TO_PED(ped, g_savedGlobals.sPlayerData.sInfo.iArmour[ePed]-GET_PED_ARMOUR(ped))
ENDIF
ENDPROC
/// PURPOSE: Stores the player peds coordinates and heading.
PROC STORE_PLAYER_PED_POSITION(PED_INDEX ped)
// Grab the ped enum
enumCharacterList ePed = GET_PLAYER_PED_ENUM(ped)
IF IS_PLAYER_PED_PLAYABLE(ePed)
AND NOT IS_PED_INJURED(ped)
#IF IS_DEBUG_BUILD
PRINTSTRING("<")
PRINTSTRING(GET_THIS_SCRIPT_NAME())
PRINTSTRING("> STORE_PLAYER_PED_POSITION(")
PRINTSTRING(GET_PLAYER_PED_STRING(ePed))
PRINTSTRING(", ")
PRINTVECTOR(GET_ENTITY_COORDS(ped))
PRINTSTRING(", ")
PRINTFLOAT(GET_ENTITY_HEADING(ped))
PRINTSTRING("):")
IF IS_PLAYER_SWITCH_IN_PROGRESS()
SWITCH_TYPE eSwitchType = GET_PLAYER_SWITCH_TYPE()
PRINTSTRING(Get_String_From_Switch_Type(eSwitchType))
IF (eSwitchType <> SWITCH_TYPE_SHORT)
SWITCH_STATE eSwitchState = GET_PLAYER_SWITCH_STATE()
PRINTSTRING(", ")
PRINTSTRING(Get_String_From_Switch_State(eSwitchState))
ENDIF
ELSE
PRINTSTRING("no switch")
ENDIF
PRINTNL()
#ENDIF
IF IS_PLAYER_SWITCH_IN_PROGRESS()
AND (GET_PLAYER_SWITCH_TYPE() <> SWITCH_TYPE_SHORT)
//
IF GET_PLAYER_SWITCH_STATE() = SWITCH_STATE_JUMPCUT_DESCENT
EXIT
ENDIF
ENDIF
#if USE_CLF_DLC
g_savedGlobalsClifford.sPlayerData.sInfo.vLastKnownCoords[ePed] = GET_ENTITY_COORDS(ped)
g_savedGlobalsClifford.sPlayerData.sInfo.fLastKnownHead[ePed] = GET_ENTITY_HEADING(ped)
g_savedGlobalsClifford.sPlayerData.sInfo.iLastKnownRoomKey[ePed] = GET_ROOM_KEY_FROM_ENTITY(ped)
//clamp last known coords for world limits #1578363
IF (g_savedGlobalsClifford.sPlayerData.sInfo.vLastKnownCoords[ePed].x >= 8000.0)
g_savedGlobalsClifford.sPlayerData.sInfo.vLastKnownCoords[ePed].x = 7500.0
ELIF (g_savedGlobalsClifford.sPlayerData.sInfo.vLastKnownCoords[ePed].x <= -8000.0)
g_savedGlobalsClifford.sPlayerData.sInfo.vLastKnownCoords[ePed].x = -7500.0
ENDIF
IF (g_savedGlobalsClifford.sPlayerData.sInfo.vLastKnownCoords[ePed].y >= 8000.0)
g_savedGlobalsClifford.sPlayerData.sInfo.vLastKnownCoords[ePed].y = 7500.0
ELIF (g_savedGlobalsClifford.sPlayerData.sInfo.vLastKnownCoords[ePed].y <= -8000.0)
g_savedGlobalsClifford.sPlayerData.sInfo.vLastKnownCoords[ePed].y = -7500.0
ENDIF
IF (g_savedGlobalsClifford.sPlayerData.sInfo.vLastKnownCoords[ePed].z >= 2500.0)
g_savedGlobalsClifford.sPlayerData.sInfo.vLastKnownCoords[ePed].z = 2000.0
ENDIF
#endif
#if USE_NRM_DLC
g_savedGlobalsnorman.sPlayerData.sInfo.vLastKnownCoords[ePed] = GET_ENTITY_COORDS(ped)
g_savedGlobalsnorman.sPlayerData.sInfo.fLastKnownHead[ePed] = GET_ENTITY_HEADING(ped)
g_savedGlobalsnorman.sPlayerData.sInfo.iLastKnownRoomKey[ePed] = GET_ROOM_KEY_FROM_ENTITY(ped)
//clamp last known coords for world limits #1578363
IF (g_savedGlobalsnorman.sPlayerData.sInfo.vLastKnownCoords[ePed].x >= 8000.0)
g_savedGlobalsnorman.sPlayerData.sInfo.vLastKnownCoords[ePed].x = 7500.0
ELIF (g_savedGlobalsnorman.sPlayerData.sInfo.vLastKnownCoords[ePed].x <= -8000.0)
g_savedGlobalsnorman.sPlayerData.sInfo.vLastKnownCoords[ePed].x = -7500.0
ENDIF
IF (g_savedGlobalsnorman.sPlayerData.sInfo.vLastKnownCoords[ePed].y >= 8000.0)
g_savedGlobalsnorman.sPlayerData.sInfo.vLastKnownCoords[ePed].y = 7500.0
ELIF (g_savedGlobalsnorman.sPlayerData.sInfo.vLastKnownCoords[ePed].y <= -8000.0)
g_savedGlobalsnorman.sPlayerData.sInfo.vLastKnownCoords[ePed].y = -7500.0
ENDIF
IF (g_savedGlobalsnorman.sPlayerData.sInfo.vLastKnownCoords[ePed].z >= 2500.0)
g_savedGlobalsnorman.sPlayerData.sInfo.vLastKnownCoords[ePed].z = 2000.0
ENDIF
#endif
#if not USE_CLF_DLC
#if not USE_NRM_DLC
g_savedGlobals.sPlayerData.sInfo.vLastKnownCoords[ePed] = GET_ENTITY_COORDS(ped)
g_savedGlobals.sPlayerData.sInfo.fLastKnownHead[ePed] = GET_ENTITY_HEADING(ped)
g_savedGlobals.sPlayerData.sInfo.iLastKnownRoomKey[ePed] = GET_ROOM_KEY_FROM_ENTITY(ped)
//clamp last known coords for world limits #1578363
IF (g_savedGlobals.sPlayerData.sInfo.vLastKnownCoords[ePed].x >= 8000.0)
g_savedGlobals.sPlayerData.sInfo.vLastKnownCoords[ePed].x = 7500.0
ELIF (g_savedGlobals.sPlayerData.sInfo.vLastKnownCoords[ePed].x <= -8000.0)
g_savedGlobals.sPlayerData.sInfo.vLastKnownCoords[ePed].x = -7500.0
ENDIF
IF (g_savedGlobals.sPlayerData.sInfo.vLastKnownCoords[ePed].y >= 8000.0)
g_savedGlobals.sPlayerData.sInfo.vLastKnownCoords[ePed].y = 7500.0
ELIF (g_savedGlobals.sPlayerData.sInfo.vLastKnownCoords[ePed].y <= -8000.0)
g_savedGlobals.sPlayerData.sInfo.vLastKnownCoords[ePed].y = -7500.0
ENDIF
IF (g_savedGlobals.sPlayerData.sInfo.vLastKnownCoords[ePed].z >= 2500.0)
g_savedGlobals.sPlayerData.sInfo.vLastKnownCoords[ePed].z = 2000.0
ENDIF
#endif
#endif
ENDIF
ENDPROC
/// PURPOSE: Sets the player peds coordinates and heading.
PROC RESTORE_PLAYER_PED_POSITION(PED_INDEX ped)
// Grab the ped enum
enumCharacterList ePed = GET_PLAYER_PED_ENUM(ped)
IF IS_PLAYER_PED_PLAYABLE(ePed)
AND NOT IS_PED_INJURED(ped)
#if USE_CLF_DLC
#IF IS_DEBUG_BUILD
PRINTSTRING("<")PRINTSTRING(GET_THIS_SCRIPT_NAME()) PRINTSTRING("> RESTORE_PLAYER_PED_POSITION(") PRINTSTRING(GET_PLAYER_PED_STRING(ePed))
PRINTSTRING(", ")PRINTVECTOR(g_savedGlobalsClifford.sPlayerData.sInfo.vLastKnownCoords[ePed])PRINTSTRING(", ")
PRINTFLOAT(g_savedGlobalsClifford.sPlayerData.sInfo.fLastKnownHead[ePed])PRINTSTRING(", ")
SWITCH g_sPlayerPedRequest.eState
CASE PR_STATE_WAITING
PRINTSTRING("PR_STATE_WAITING")
BREAK
CASE PR_STATE_PROCESSING
PRINTSTRING("PR_STATE_PROCESSING")
BREAK
CASE PR_STATE_COMPLETE
PRINTSTRING("PR_STATE_COMPLETE")
BREAK
ENDSWITCH
PRINTNL()
#ENDIF
IF (g_savedGlobalsClifford.sPlayerData.sInfo.fLastKnownHead[ePed] = 0.0)
AND ARE_VECTORS_EQUAL(g_savedGlobalsClifford.sPlayerData.sInfo.vLastKnownCoords[ePed], <<0,0,0>>)
EXIT
ENDIF
SET_ENTITY_COORDS_NO_OFFSET(ped, g_savedGlobalsClifford.sPlayerData.sInfo.vLastKnownCoords[ePed])
SET_ENTITY_HEADING(ped, g_savedGlobalsClifford.sPlayerData.sInfo.fLastKnownHead[ePed])
#endif
#if USE_NRM_DLC
#IF IS_DEBUG_BUILD
PRINTSTRING("<")PRINTSTRING(GET_THIS_SCRIPT_NAME()) PRINTSTRING("> RESTORE_PLAYER_PED_POSITION(") PRINTSTRING(GET_PLAYER_PED_STRING(ePed))
PRINTSTRING(", ")PRINTVECTOR(g_savedGlobalsnorman.sPlayerData.sInfo.vLastKnownCoords[ePed])PRINTSTRING(", ")
PRINTFLOAT(g_savedGlobalsnorman.sPlayerData.sInfo.fLastKnownHead[ePed])PRINTSTRING(", ")
SWITCH g_sPlayerPedRequest.eState
CASE PR_STATE_WAITING
PRINTSTRING("PR_STATE_WAITING")
BREAK
CASE PR_STATE_PROCESSING
PRINTSTRING("PR_STATE_PROCESSING")
BREAK
CASE PR_STATE_COMPLETE
PRINTSTRING("PR_STATE_COMPLETE")
BREAK
ENDSWITCH
PRINTNL()
#ENDIF
IF (g_savedGlobalsnorman.sPlayerData.sInfo.fLastKnownHead[ePed] = 0.0)
AND ARE_VECTORS_EQUAL(g_savedGlobalsnorman.sPlayerData.sInfo.vLastKnownCoords[ePed], <<0,0,0>>)
EXIT
ENDIF
SET_ENTITY_COORDS_NO_OFFSET(ped, g_savedGlobalsnorman.sPlayerData.sInfo.vLastKnownCoords[ePed])
SET_ENTITY_HEADING(ped, g_savedGlobalsnorman.sPlayerData.sInfo.fLastKnownHead[ePed])
#endif
#if not USE_CLF_DLC
#if not USE_NRM_DLC
#IF IS_DEBUG_BUILD
PRINTSTRING("<")PRINTSTRING(GET_THIS_SCRIPT_NAME()) PRINTSTRING("> RESTORE_PLAYER_PED_POSITION(") PRINTSTRING(GET_PLAYER_PED_STRING(ePed))
PRINTSTRING(", ")PRINTVECTOR(g_savedGlobals.sPlayerData.sInfo.vLastKnownCoords[ePed])PRINTSTRING(", ")
PRINTFLOAT(g_savedGlobals.sPlayerData.sInfo.fLastKnownHead[ePed])PRINTSTRING(", ")
SWITCH g_sPlayerPedRequest.eState
CASE PR_STATE_WAITING
PRINTSTRING("PR_STATE_WAITING")
BREAK
CASE PR_STATE_PROCESSING
PRINTSTRING("PR_STATE_PROCESSING")
BREAK
CASE PR_STATE_COMPLETE
PRINTSTRING("PR_STATE_COMPLETE")
BREAK
ENDSWITCH
PRINTNL()
#ENDIF
IF (g_savedGlobals.sPlayerData.sInfo.fLastKnownHead[ePed] = 0.0)
AND ARE_VECTORS_EQUAL(g_savedGlobals.sPlayerData.sInfo.vLastKnownCoords[ePed], <<0,0,0>>)
EXIT
ENDIF
SET_ENTITY_COORDS_NO_OFFSET(ped, g_savedGlobals.sPlayerData.sInfo.vLastKnownCoords[ePed])
SET_ENTITY_HEADING(ped, g_savedGlobals.sPlayerData.sInfo.fLastKnownHead[ePed])
#endif
#endif
ENDIF
ENDPROC
/// PURPOSE: Stores the player peds velocity
PROC STORE_PLAYER_PED_VELOCITY(PED_INDEX ped)
// Grab the ped enum
enumCharacterList ePed = GET_PLAYER_PED_ENUM(ped)
IF IS_PLAYER_PED_PLAYABLE(ePed)
AND NOT IS_PED_INJURED(ped)
#if USE_CLF_DLC
g_savedGlobalsClifford.sPlayerData.sInfo.vLastKnownVelocity[ePed] = GET_ENTITY_VELOCITY(ped)
#endif
#if USE_NRM_DLC
g_savedGlobalsnorman.sPlayerData.sInfo.vLastKnownVelocity[ePed] = GET_ENTITY_VELOCITY(ped)
#endif
#if not USE_CLF_DLC
#if not USE_NRM_DLC
g_savedGlobals.sPlayerData.sInfo.vLastKnownVelocity[ePed] = GET_ENTITY_VELOCITY(ped)
#endif
#endif
ENDIF
ENDPROC
/// PURPOSE: Sets the player peds velocity
PROC RESTORE_PLAYER_PED_VELOCITY(PED_INDEX ped)
// Grab the ped enum
enumCharacterList ePed = GET_PLAYER_PED_ENUM(ped)
IF IS_PLAYER_PED_PLAYABLE(ePed)
AND NOT IS_PED_INJURED(ped)
#if USE_CLF_DLC
SET_ENTITY_VELOCITY(ped, g_savedGlobalsClifford.sPlayerData.sInfo.vLastKnownVelocity[ePed])
#endif
#if USE_NRM_DLC
SET_ENTITY_VELOCITY(ped, g_savedGlobalsnorman.sPlayerData.sInfo.vLastKnownVelocity[ePed])
#endif
#if not USE_CLF_DLC
#if not USE_NRM_DLC
SET_ENTITY_VELOCITY(ped, g_savedGlobals.sPlayerData.sInfo.vLastKnownVelocity[ePed])
#endif
#endif
ENDIF
ENDPROC
FUNC VECTOR MODIFY_VEHICLE_NODE_FOR_LANES(VECTOR vInCoord, FLOAT fInHead, INT iNumLanes)
FLOAT fModDist
IF iNumLanes <= 1
fModDist = 0
ELSE
fModDist = 2.8
ENDIF
RETURN GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS(vInCoord, fInHead, <<fModDist, 0, 0>>)
ENDFUNC
FUNC BOOL GetVehicleOffsetFromCoord(VECTOR vPrevCoord, FLOAT vPrevHead,
FLOAT fDistance, NODE_FLAGS eNodeFlag,
VECTOR &vVehicleCoord_a, FLOAT &fVehicleHead_a)
IF ARE_VECTORS_ALMOST_EQUAL(vPrevCoord, <<0,0,0>>, 1.5)
vVehicleCoord_a = <<0,0,0>>
fVehicleHead_a = 0.0
RETURN FALSE
ENDIF
INT iTotalLanes
VECTOR vVehicleCoord
FLOAT fVehicleHead
FLOAT fRandomOffsetX = GET_RANDOM_FLOAT_IN_RANGE(-fDistance/2,fDistance/2) * 0.5
VECTOR vOffsetFromPed=GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS(vPrevCoord, vPrevHead, <<fRandomOffsetX,fDistance,0>>)
/*
IF GET_CLOSEST_VEHICLE_NODE_WITH_HEADING(vOffsetFromPed, vVehicleCoord, fVehicleHead, eNodeFlag)
vVehicleCoord_a = vVehicleCoord
fVehicleHead_a = fVehicleHead
RETURN TRUE
ENDIF
*/
IF GET_NTH_CLOSEST_VEHICLE_NODE_WITH_HEADING(vOffsetFromPed, 1, vVehicleCoord, fVehicleHead, iTotalLanes, eNodeFlag)
vVehicleCoord_a = vVehicleCoord
fVehicleHead_a = fVehicleHead
vVehicleCoord_a = MODIFY_VEHICLE_NODE_FOR_LANES(vVehicleCoord_a, fVehicleHead_a, iTotalLanes)
RETURN TRUE
ENDIF
vVehicleCoord_a = vPrevCoord
fVehicleHead_a = vPrevHead
RETURN FALSE
ENDFUNC
FUNC BOOL STORE_DEFAULT_PLAYER_PLANE_SWITCH_STATE(PED_INDEX ped,
VECTOR &vChosenPlaneCoord,
FLOAT &fChosenPlaneHead)
CONST_INT iPLANE_LOCATIONS 20
VECTOR vPlaneCoords[iPLANE_LOCATIONS]
FLOAT fPlaneHead[iPLANE_LOCATIONS]
INT iCount = 0
vPlaneCoords[iCount] = <<-988.0314, -937.3164, 247.4575>> fPlaneHead[iCount] =21.7565 iCount++
vPlaneCoords[iCount] = <<-1190.6515, -1442.3416, 274.3851>> fPlaneHead[iCount] =4.3914 iCount++
vPlaneCoords[iCount] = <<-1552.3132, 384.6868, 103.5778>> fPlaneHead[iCount] =313.7197 iCount++
vPlaneCoords[iCount] = <<-1807.5070, 2422.1606, 238.0954>> fPlaneHead[iCount] =266.1874 iCount++
vPlaneCoords[iCount] = <<-676.9284, 4432.5078, 360.7240>> fPlaneHead[iCount] =272.4361 iCount++
vPlaneCoords[iCount] = <<2049.1240, 6062.8164, 294.5194>> fPlaneHead[iCount] =225.8041 iCount++
vPlaneCoords[iCount] = <<2043.3855, 3475.9351, 42.2975>> fPlaneHead[iCount] =116.8867 iCount++
vPlaneCoords[iCount] = <<2634.4377, 2338.4937, 254.4784>> fPlaneHead[iCount] =142.5168 iCount++
vPlaneCoords[iCount] = <<1590.3884, 1001.1693, 287.6988>> fPlaneHead[iCount] =134.4989 iCount++
vPlaneCoords[iCount] = <<2056.5725, -632.6298, 94.2403>> fPlaneHead[iCount] =124.6985 iCount++
vPlaneCoords[iCount] = <<1558.5808, -2094.0803, 302.2927>> fPlaneHead[iCount] =97.0006 iCount++
vPlaneCoords[iCount] = <<1135.8334, -3115.1716, 4.8009>> fPlaneHead[iCount] =42.7435 iCount++
vPlaneCoords[iCount] = <<-428.0257, -2891.2900, 181.5473>> fPlaneHead[iCount] =2.7579 iCount++
vPlaneCoords[iCount] = <<-86.4255, -1548.1797, 272.6201>> fPlaneHead[iCount] =335.0247 iCount++
vPlaneCoords[iCount] = <<282.3189, 210.1434, 212.4410>> fPlaneHead[iCount] =349.6890 iCount++
vPlaneCoords[iCount] = <<824.9931, 2404.9763, 239.2513>> fPlaneHead[iCount] =355.0965 iCount++
vPlaneCoords[iCount] = <<1190.4857, 4000.3528, 235.3204>> fPlaneHead[iCount] =328.8051 iCount++
vPlaneCoords[iCount] = <<-3013.5188, 1294.3378, 31.2512>> fPlaneHead[iCount] =244.3188 iCount++
vPlaneCoords[iCount] = <<-205.1947, 1965.1676, 181.5578>> fPlaneHead[iCount] =295.9389 iCount++
vPlaneCoords[iCount] = <<-457.0207, 6013.2930, 35.6048>> fPlaneHead[iCount] =313.8458 iCount++
VECTOR vPedCoord = GET_ENTITY_COORDS(ped)
FLOAT fShortDist = 9999999.99
INT iClosestCount = -1
iCount = 0
FOR iCount = 0 TO iPLANE_LOCATIONS-1
FLOAT fCurrentDist = GET_DISTANCE_BETWEEN_COORDS(vPedCoord, vPlaneCoords[iCount])
IF fCurrentDist < fShortDist
fShortDist = fCurrentDist
iClosestCount = iCount
ENDIF
ENDFOR
IF iClosestCount >= 0 AND iClosestCount < iPLANE_LOCATIONS
#IF IS_DEBUG_BUILD
TEXT_LABEL_63 str = "store default plane coords (in air:"
str += iClosestCount
str += ")"
PRINTLN(str)
#ENDIF
vChosenPlaneCoord = vPlaneCoords[iClosestCount]
fChosenPlaneHead = fPlaneHead[iClosestCount]
RETURN TRUE
ELSE
SCRIPT_ASSERT("store default plane coords (in air:invalid)")
vChosenPlaneCoord = <<0,0,0>>
fChosenPlaneHead = 0
RETURN FALSE
ENDIF
ENDFUNC
#IF USE_TU_CHANGES
FUNC BOOL SAFE_TO_STORE_DEFAULT_PLAYER_PLANE_SWITCH_STATE(VEHICLE_INDEX vehPlane)
PRINTLN("SAFE_TO_STORE_DEFAULT_PLAYER_PLANE_SWITCH_STATE - ", GET_MODEL_NAME_OF_VEHICLE_FOR_DEBUG_ONLY(vehPlane), " for bug #1768229")
IF (GET_ENTITY_MODEL(vehPlane) = BLIMP)
PRINTLN(" \"GET_ENTITY_MODEL(vehPlane) = BLIMP\"")
RETURN FALSE
ENDIF
IF NOT IS_ENTITY_IN_AIR(vehPlane)
PRINTLN(" \"NOT IS_ENTITY_IN_AIR(vehPlane)\"")
RETURN FALSE
ENDIF
FLOAT FFF
IF GET_GROUND_Z_FOR_3D_COORD(GET_ENTITY_COORDS(vehPlane), FFF)
PRINTLN(" \"GET_GROUND_Z_FOR_3D_COORD(GET_ENTITY_COORDS(vehPlane), ", FFF, ")...\"")
ELSE
PRINTLN(" \"NOT GET_GROUND_Z_FOR_3D_COORD(GET_ENTITY_COORDS(vehPlane), ", FFF, ")\"")
RETURN FALSE
ENDIF
PRINTLN(" \"safe to store default!!!\"")
RETURN TRUE
ENDFUNC
#ENDIF
/// PURPOSE:
/// Checks whether the ped is currently in scuba gear and stores for transition.
/// PARAMS:
/// ped - pedIndex
/// ePed - enumCharList
PROC STORE_DEFAULT_PLAYER_SCUBA_SWITCH_STATE(PED_INDEX ped, enumCharacterList ePed)
BOOL bPedInScuba = IS_USING_PED_SCUBA_GEAR_VARIATION(ped)
BOOL bPedInWater = IS_ENTITY_IN_WATER(ped)
CDEBUG3LN(DEBUG_SWITCH, " - player_ped_public - STORE_DEFAULT_PLAYER_SCUBA_STATE - Checking scuba state now for ePed (enumCharList): ", ePed, "...")
CDEBUG3LN(DEBUG_SWITCH, " - player_ped_public - STORE_DEFAULT_PLAYER_SCUBA_STATE - bPedInScuba: ", PICK_STRING(bPedInScuba, "TRUE", "FALSE"), " - bPedInWater: ", PICK_STRING(bPedInWater, "TRUE", "FALSE"))
IF bPedInScuba
AND bPedInWater
CDEBUG1LN(DEBUG_SWITCH, " - player_ped_public - STORE_DEFAULT_PLAYER_SCUBA_STATE - Setting g_sDefaultPlayerSwitchState[ePed].bPlayerInScuba to TRUE for (enumCharacterList):", ePed)
g_sDefaultPlayerSwitchState[ePed].bPlayerInScuba = TRUE
ELSE
CDEBUG3LN(DEBUG_SWITCH, " - player_ped_public - STORE_DEFAULT_PLAYER_SCUBA_STATE - Ped (enumCharacterList):", ePed, " was detected as NOT being in scuba gear.")
g_sDefaultPlayerSwitchState[ePed].bPlayerInScuba = FALSE // Not neccessary but failsafe incase left on somewhere.
ENDIF
ENDPROC
/// PURPOSE:
PROC STORE_DEFAULT_PLAYER_VEHICLE_SWITCH_STATE(PED_INDEX ped, enumCharacterList ePed)
CONST_FLOAT fDistanceA 50.0
CONST_FLOAT fDistanceB 150.0
CONST_FLOAT fDistanceC 500.0
CONST_FLOAT MIN_SPEED 10.0
CONST_FLOAT MAX_SPEED 20.0
CONST_FLOAT MIN_PLANE_SPEED 40.0
FLOAT fPlayerSpeed = GET_ENTITY_SPEED(ped)
g_sDefaultPlayerSwitchState[ePed].bVehicleCoordForced = FALSE
IF IS_PED_IN_FLYING_VEHICLE(ped)
VEHICLE_INDEX vehPlane = GET_VEHICLE_PED_IS_IN(ped)
#IF NOT USE_TU_CHANGES
#IF IS_DEBUG_BUILD
CPRINTLN(DEBUG_SWITCH, "SAFE_TO_STORE_DEFAULT_PLAYER_PLANE_SWITCH_STATE - ", GET_MODEL_NAME_FOR_DEBUG(vehPlane), " for bug #1768229 (NOT USE_TU_CHANGES")
#ENDIF
IF IS_ENTITY_IN_AIR(vehPlane)
#ENDIF
#IF USE_TU_CHANGES
IF SAFE_TO_STORE_DEFAULT_PLAYER_PLANE_SWITCH_STATE(vehPlane)
#ENDIF
IF STORE_DEFAULT_PLAYER_PLANE_SWITCH_STATE(ped, g_sDefaultPlayerSwitchState[ePed].vVehicleCoord_a, g_sDefaultPlayerSwitchState[ePed].fVehicleHead_a)
AND STORE_DEFAULT_PLAYER_PLANE_SWITCH_STATE(ped, g_sDefaultPlayerSwitchState[ePed].vVehicleCoord_b, g_sDefaultPlayerSwitchState[ePed].fVehicleHead_b)
AND STORE_DEFAULT_PLAYER_PLANE_SWITCH_STATE(ped, g_sDefaultPlayerSwitchState[ePed].vVehicleCoord_c, g_sDefaultPlayerSwitchState[ePed].fVehicleHead_c)
IF IS_PED_IN_ANY_PLANE(ped)
IF fPlayerSpeed < MIN_PLANE_SPEED
fPlayerSpeed = MIN_PLANE_SPEED
ENDIF
ELSE
IF fPlayerSpeed > MAX_SPEED
fPlayerSpeed = MAX_SPEED
ELIF fPlayerSpeed < MIN_SPEED
fPlayerSpeed = MIN_SPEED
ENDIF
ENDIF
g_sDefaultPlayerSwitchState[ePed].fVehicleSpeed_a = fPlayerSpeed
g_sDefaultPlayerSwitchState[ePed].fVehicleSpeed_b = fPlayerSpeed
g_sDefaultPlayerSwitchState[ePed].fVehicleSpeed_c = fPlayerSpeed
IF NOT ARE_VECTORS_ALMOST_EQUAL(g_sDefaultPlayerSwitchState[ePed].vWalkCoord_a, <<0,0,0>>, 1.5)
#if USE_CLF_DLC
g_savedGlobalsClifford.sPlayerData.sInfo.vLastKnownCoords[ePed] = g_sDefaultPlayerSwitchState[ePed].vVehicleCoord_a
g_savedGlobalsClifford.sPlayerData.sInfo.fLastKnownHead[ePed] = g_sDefaultPlayerSwitchState[ePed].fVehicleHead_a
#endif
#if USE_NRM_DLC
g_savedGlobalsnorman.sPlayerData.sInfo.vLastKnownCoords[ePed] = g_sDefaultPlayerSwitchState[ePed].vVehicleCoord_a
g_savedGlobalsnorman.sPlayerData.sInfo.fLastKnownHead[ePed] = g_sDefaultPlayerSwitchState[ePed].fVehicleHead_a
#endif
#if not USE_CLF_DLC
#if not USE_NRM_DLC
g_savedGlobals.sPlayerData.sInfo.vLastKnownCoords[ePed] = g_sDefaultPlayerSwitchState[ePed].vVehicleCoord_a
g_savedGlobals.sPlayerData.sInfo.fLastKnownHead[ePed] = g_sDefaultPlayerSwitchState[ePed].fVehicleHead_a
#endif
#endif
ENDIF
EXIT
ENDIF
g_sDefaultPlayerSwitchState[ePed].vVehicleCoord_a = <<0,0,0>>
g_sDefaultPlayerSwitchState[ePed].vVehicleCoord_b = <<0,0,0>>
g_sDefaultPlayerSwitchState[ePed].vVehicleCoord_c = <<0,0,0>>
g_sDefaultPlayerSwitchState[ePed].fVehicleSpeed_a = 0
g_sDefaultPlayerSwitchState[ePed].fVehicleSpeed_b = 0
g_sDefaultPlayerSwitchState[ePed].fVehicleSpeed_c = 0
SCRIPT_ASSERT("store default flying vehicle coords (in air-not found?)")
EXIT
#IF NOT USE_TU_CHANGES
ELSE
g_sDefaultPlayerSwitchState[ePed].vVehicleCoord_a = <<0,0,0>>
g_sDefaultPlayerSwitchState[ePed].vVehicleCoord_b = <<0,0,0>>
g_sDefaultPlayerSwitchState[ePed].vVehicleCoord_c = <<0,0,0>>
g_sDefaultPlayerSwitchState[ePed].fVehicleSpeed_a = 0
g_sDefaultPlayerSwitchState[ePed].fVehicleSpeed_b = 0
g_sDefaultPlayerSwitchState[ePed].fVehicleSpeed_c = 0
#IF IS_DEBUG_BUILD
IF (GET_ENTITY_MODEL(vehPlane) = BLIMP)
CPRINTLN(DEBUG_SWITCH, "store default flying vehicle coords (blimp)")
ELSE
CPRINTLN(DEBUG_SWITCH, "store default flying vehicle coords (on land)")
ENDIF
#ENDIF
EXIT
ENDIF
#ENDIF
#IF USE_TU_CHANGES
ELSE
g_sDefaultPlayerSwitchState[ePed].vVehicleCoord_a = <<0,0,0>>
g_sDefaultPlayerSwitchState[ePed].vVehicleCoord_b = <<0,0,0>>
g_sDefaultPlayerSwitchState[ePed].vVehicleCoord_c = <<0,0,0>>
g_sDefaultPlayerSwitchState[ePed].fVehicleSpeed_a = 0
g_sDefaultPlayerSwitchState[ePed].fVehicleSpeed_b = 0
g_sDefaultPlayerSwitchState[ePed].fVehicleSpeed_c = 0
#IF IS_DEBUG_BUILD
IF (GET_ENTITY_MODEL(vehPlane) = BLIMP)
CPRINTLN(DEBUG_SWITCH, "store default flying vehicle coords (blimp)")
ELSE
CPRINTLN(DEBUG_SWITCH, "store default flying vehicle coords (on land)")
ENDIF
#ENDIF
EXIT
ENDIF
#ENDIF
ENDIF
IF IS_PED_IN_ANY_BOAT(ped) OR IS_PED_IN_ANY_SUB(ped)
// //
g_sDefaultPlayerSwitchState[ePed].vVehicleCoord_a = <<0,0,0>>
g_sDefaultPlayerSwitchState[ePed].vVehicleCoord_b = <<0,0,0>>
g_sDefaultPlayerSwitchState[ePed].vVehicleCoord_c = <<0,0,0>>
g_sDefaultPlayerSwitchState[ePed].fVehicleSpeed_a = 0
g_sDefaultPlayerSwitchState[ePed].fVehicleSpeed_b = 0
g_sDefaultPlayerSwitchState[ePed].fVehicleSpeed_c = 0
#IF IS_DEBUG_BUILD
CPRINTLN(DEBUG_SWITCH, " STORE_DEFAULT_PLAYER_BOAT_SWITCH_STATE(vVehicleCoord_a:", g_sDefaultPlayerSwitchState[ePed].vVehicleCoord_a, ") //", g_sDefaultPlayerSwitchState[ePed].fVehicleSpeed_a)
CPRINTLN(DEBUG_SWITCH, " STORE_DEFAULT_PLAYER_BOAT_SWITCH_STATE(vVehicleCoord_b:", g_sDefaultPlayerSwitchState[ePed].vVehicleCoord_b, ") //", g_sDefaultPlayerSwitchState[ePed].fVehicleSpeed_b)
CPRINTLN(DEBUG_SWITCH, " STORE_DEFAULT_PLAYER_BOAT_SWITCH_STATE(vVehicleCoord_c:", g_sDefaultPlayerSwitchState[ePed].vVehicleCoord_c, ") //", g_sDefaultPlayerSwitchState[ePed].fVehicleSpeed_c)
CPRINTLN(DEBUG_SWITCH, "")
#ENDIF
EXIT
ENDIF
IF fPlayerSpeed > MAX_SPEED
fPlayerSpeed = MAX_SPEED
ELIF fPlayerSpeed < MIN_SPEED
fPlayerSpeed = MIN_SPEED
ENDIF
// //
IF GetVehicleOffsetFromCoord(GET_ENTITY_COORDS(ped), GET_ENTITY_HEADING(ped),
fDistanceA,
NF_IGNORE_SLIPLANES|NF_IGNORE_SWITCHED_OFF_DEADENDS,
g_sDefaultPlayerSwitchState[ePed].vVehicleCoord_a,
g_sDefaultPlayerSwitchState[ePed].fVehicleHead_a)
g_sDefaultPlayerSwitchState[ePed].fVehicleSpeed_a = fPlayerSpeed
ELSE
g_sDefaultPlayerSwitchState[ePed].fVehicleSpeed_a = 0
ENDIF
IF GetVehicleOffsetFromCoord(g_sDefaultPlayerSwitchState[ePed].vVehicleCoord_a, g_sDefaultPlayerSwitchState[ePed].fVehicleHead_a,
fDistanceB-fDistanceA,
NF_IGNORE_SLIPLANES|NF_IGNORE_SWITCHED_OFF_DEADENDS,
g_sDefaultPlayerSwitchState[ePed].vVehicleCoord_b,
g_sDefaultPlayerSwitchState[ePed].fVehicleHead_b)
g_sDefaultPlayerSwitchState[ePed].fVehicleSpeed_b = fPlayerSpeed
ELSE
g_sDefaultPlayerSwitchState[ePed].fVehicleSpeed_b = 0
ENDIF
IF GetVehicleOffsetFromCoord(g_sDefaultPlayerSwitchState[ePed].vVehicleCoord_b, g_sDefaultPlayerSwitchState[ePed].fVehicleHead_b,
fDistanceC-fDistanceB,
NF_IGNORE_SLIPLANES|NF_IGNORE_SWITCHED_OFF_DEADENDS,
g_sDefaultPlayerSwitchState[ePed].vVehicleCoord_c,
g_sDefaultPlayerSwitchState[ePed].fVehicleHead_c)
g_sDefaultPlayerSwitchState[ePed].fVehicleSpeed_c = fPlayerSpeed
ELSE
g_sDefaultPlayerSwitchState[ePed].fVehicleSpeed_c = 0
ENDIF
g_sDefaultPlayerSwitchState[ePed].bVehicleCoordForced = FALSE
IF IS_PED_IN_ANY_VEHICLE(ped)
VEHICLE_INDEX vehSubmerged = GET_VEHICLE_PED_IS_IN(ped)
#IF IS_DEBUG_BUILD
SAVE_STRING_TO_DEBUG_FILE("submerged: ")
SAVE_FLOAT_TO_DEBUG_FILE(GET_ENTITY_SUBMERGED_LEVEL(vehSubmerged))
SAVE_STRING_TO_DEBUG_FILE(", on_all_wheels: ")
SAVE_BOOL_TO_DEBUG_FILE(IS_VEHICLE_ON_ALL_WHEELS(vehSubmerged))
SAVE_NEWLINE_TO_DEBUG_FILE()
#ENDIF
IF GET_ENTITY_SUBMERGED_LEVEL(vehSubmerged) > 0.0
AND IS_VEHICLE_ON_ALL_WHEELS(vehSubmerged)
CPRINTLN(DEBUG_SWITCH, "g_sDefaultPlayerSwitchState[ePed].bVehicleCoordForced [players vehicle is sitting in water]")
g_sDefaultPlayerSwitchState[ePed].bVehicleCoordForced = TRUE
ENDIF
ENDIF
INT iPlayerHashKey = GET_ROOM_KEY_FROM_ENTITY(PLAYER_PED_ID())
IF (iPlayerHashKey = HASH("") AND IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<361.761,-593.973,27.415>>, <<301.502,-570.014,73.120>>, 26.5))
OR (iPlayerHashKey = HASH("") AND IS_ENTITY_IN_ANGLED_AREA(PLAYER_PED_ID(), <<331.066,-601.842,56.725>>, <<285.118,-584.950,41.253>>, 26.5))
OR (iPlayerHashKey = HASH("v_40_Room1")) // entrance
OR (iPlayerHashKey = HASH("v_40_Room2")) // corridor between two broken walls
OR (iPlayerHashKey = HASH("v_40_Room3")) // ward (near broken wall)
OR (iPlayerHashKey = HASH("v_40_Room4")) // ward area (past final broken wall)
OR (iPlayerHashKey = HASH("V_40_Room005")) // entrance from shop to first broken wall
CPRINTLN(DEBUG_SWITCH, "g_sDefaultPlayerSwitchState[ePed].bVehicleCoordForced [player is in locked Nigel2 hospital:", iPlayerHashKey, "]")
g_sDefaultPlayerSwitchState[ePed].bVehicleCoordForced = TRUE
ENDIF
#IF IS_DEBUG_BUILD
CPRINTLN(DEBUG_SWITCH, " STORE_DEFAULT_PLAYER_VEHICLE_SWITCH_STATE(", g_sDefaultPlayerSwitchState[ePed].vVehicleCoord_a, ", ", g_sDefaultPlayerSwitchState[ePed].vVehicleCoord_b, ", ", g_sDefaultPlayerSwitchState[ePed].vVehicleCoord_c, ") //", g_sDefaultPlayerSwitchState[ePed].fVehicleSpeed_a, ", ", g_sDefaultPlayerSwitchState[ePed].fVehicleSpeed_b, ", ", g_sDefaultPlayerSwitchState[ePed].fVehicleSpeed_c)
#ENDIF
ENDPROC
FUNC BOOL GetPedOffsetFromCoord(VECTOR vPrevCoord, FLOAT vPrevHead,
FLOAT fDistance, //NODE_FLAGS eNodeFlag,
VECTOR &vWalkCoord_a, FLOAT &fWalkHead_a)
GET_SAFE_COORD_FLAGS eSafeCoordFlag = GSC_FLAG_NOT_ISOLATED|GSC_FLAG_NOT_WATER|GSC_FLAG_NOT_INTERIOR
INT iTotalLanes
NODE_FLAGS eNodeFlag = NF_NONE
VECTOR vSafeWalktoCoord, vRoadCoord
FLOAT fSafeWalktoGroundZ, fRoadHead
CONST_INT iNUM_OF_ANGLES_TO_CHECK 3
INT iAngle
REPEAT iNUM_OF_ANGLES_TO_CHECK iAngle
FLOAT fDebugJumpAngle = (TO_FLOAT(iAngle) / TO_FLOAT(iNUM_OF_ANGLES_TO_CHECK)) * 360.0
VECTOR vOffsetAngle = <<SIN(fDebugJumpAngle), COS(fDebugJumpAngle), 0.0>>
VECTOR vOffsetFromPed = GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS(vPrevCoord, vPrevHead, vOffsetAngle * fDistance)
IF NOT GET_NTH_CLOSEST_VEHICLE_NODE_WITH_HEADING(vOffsetFromPed, 1, vRoadCoord, fRoadHead, iTotalLanes, eNodeFlag)
fRoadHead = GET_RANDOM_FLOAT_IN_RANGE(-180,180)
ENDIF
IF GET_SAFE_COORD_FOR_PED(vOffsetFromPed, TRUE, vSafeWalktoCoord, eSafeCoordFlag | GSC_FLAG_ONLY_NETWORK_SPAWN | GSC_FLAG_ONLY_PAVEMENT)
vWalkCoord_a = vSafeWalktoCoord
fWalkHead_a = fRoadHead
VECTOR vSafeWalktoTarget = <<0,0,0>>
VECTOR vSafeWalktoOffset = GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS(vSafeWalktoCoord, fWalkHead_a, <<0,5,0>>)
IF GET_SAFE_COORD_FOR_PED(vSafeWalktoOffset, TRUE, vSafeWalktoTarget, eSafeCoordFlag)
VECTOR vSafeCoordDiff = vSafeWalktoTarget - vWalkCoord_a
fWalkHead_a = GET_HEADING_FROM_VECTOR_2D(vSafeCoordDiff.x, vSafeCoordDiff.y)
IF GET_GROUND_Z_FOR_3D_COORD(vWalkCoord_a, fSafeWalktoGroundZ)
PRINTSTRING("NET AND PAV ")
PRINTINT(iAngle)
PRINTSTRING(": ")
PRINTVECTOR(vOffsetAngle)
PRINTSTRING(" * ")
PRINTFLOAT(fDistance)
PRINTNL()
vWalkCoord_a.z = fSafeWalktoGroundZ
RETURN TRUE
ENDIF
ENDIF
ENDIF
IF GET_SAFE_COORD_FOR_PED(vOffsetFromPed, TRUE, vSafeWalktoCoord, eSafeCoordFlag | GSC_FLAG_ONLY_PAVEMENT)
vWalkCoord_a = vSafeWalktoCoord
fWalkHead_a = fRoadHead
VECTOR vSafeWalktoTarget = <<0,0,0>>
VECTOR vSafeWalktoOffset = GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS(vSafeWalktoCoord, fWalkHead_a, <<0,5,0>>)
IF GET_SAFE_COORD_FOR_PED(vSafeWalktoOffset, TRUE, vSafeWalktoTarget, eSafeCoordFlag)
VECTOR vSafeCoordDiff = vSafeWalktoTarget - vWalkCoord_a
fWalkHead_a = GET_HEADING_FROM_VECTOR_2D(vSafeCoordDiff.x, vSafeCoordDiff.y)
IF GET_GROUND_Z_FOR_3D_COORD(vWalkCoord_a, fSafeWalktoGroundZ)
PRINTSTRING("JUST PAV ")
PRINTINT(iAngle)
PRINTSTRING(": ")
PRINTVECTOR(vOffsetAngle)
PRINTSTRING(" * ")
PRINTFLOAT(fDistance)
PRINTNL()
vWalkCoord_a.z = fSafeWalktoGroundZ
RETURN TRUE
ENDIF
ENDIF
ENDIF
IF GET_SAFE_COORD_FOR_PED(vOffsetFromPed, TRUE, vSafeWalktoCoord, eSafeCoordFlag)
vWalkCoord_a = vSafeWalktoCoord
fWalkHead_a = fRoadHead
VECTOR vSafeWalktoTarget = <<0,0,0>>
VECTOR vSafeWalktoOffset = GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS(vSafeWalktoCoord, fWalkHead_a, <<0,5,0>>)
IF GET_SAFE_COORD_FOR_PED(vSafeWalktoOffset, TRUE, vSafeWalktoTarget, eSafeCoordFlag)
VECTOR vSafeCoordDiff = vSafeWalktoTarget - vWalkCoord_a
fWalkHead_a = GET_HEADING_FROM_VECTOR_2D(vSafeCoordDiff.x, vSafeCoordDiff.y)
IF GET_GROUND_Z_FOR_3D_COORD(vWalkCoord_a, fSafeWalktoGroundZ)
PRINTSTRING("default flags ")
PRINTINT(iAngle)
PRINTSTRING(": ")
PRINTVECTOR(vOffsetAngle)
PRINTSTRING(" * ")
PRINTFLOAT(fDistance)
PRINTNL()
vWalkCoord_a.z = fSafeWalktoGroundZ
RETURN TRUE
ENDIF
ENDIF
ENDIF
PED_INDEX closePed = NULL
IF GET_CLOSEST_PED(vOffsetFromPed, 1.0, TRUE, FALSE, closePed)
IF NOT IS_PED_INJURED(closePed)
AND NOT IS_PED_IN_ANY_VEHICLE(closePed)
AND NOT IS_PED_RAGDOLL(closePed)
vWalkCoord_a = GET_ENTITY_COORDS(closePed)
fWalkHead_a = GET_ENTITY_HEADING(closePed)
VECTOR vSafeWalktoTarget = <<0,0,0>>
VECTOR vSafeWalktoOffset = GET_OFFSET_FROM_COORD_AND_HEADING_IN_WORLD_COORDS(vSafeWalktoCoord, fRoadHead, <<0,5,0>>)
IF GET_SAFE_COORD_FOR_PED(vSafeWalktoOffset, TRUE, vSafeWalktoTarget, eSafeCoordFlag)
VECTOR vSafeCoordDiff = vSafeWalktoTarget - vWalkCoord_a
fWalkHead_a = GET_HEADING_FROM_VECTOR_2D(vSafeCoordDiff.x, vSafeCoordDiff.y)
IF GET_GROUND_Z_FOR_3D_COORD(vWalkCoord_a, fSafeWalktoGroundZ)
PRINTSTRING("from ped[ ")
PRINTSTRING(GET_MODEL_NAME_FOR_DEBUG(GET_ENTITY_MODEL(closePed)))
PRINTSTRING("] ")
PRINTINT(iAngle)
PRINTSTRING(": ")
PRINTVECTOR(vOffsetAngle)
PRINTSTRING(" * ")
PRINTFLOAT(fDistance)
PRINTNL()
vWalkCoord_a.z = fSafeWalktoGroundZ
RETURN TRUE
ENDIF
ENDIF
ENDIF
ENDIF
PRINTSTRING("failed at ")
PRINTINT(iAngle)
PRINTSTRING(": ")
PRINTVECTOR(vOffsetAngle)
PRINTSTRING(" * ")
PRINTFLOAT(fDistance)
PRINTNL()
ENDREPEAT
PRINTSTRING("same as prev... ")
PRINTNL()
vWalkCoord_a = vPrevCoord
fWalkHead_a = vPrevHead
RETURN FALSE
ENDFUNC
/// PURPOSE:
PROC STORE_DEFAULT_PLAYER_WALKING_SWITCH_STATE(PED_INDEX ped, enumCharacterList ePed)
GetPedOffsetFromCoord(GET_ENTITY_COORDS(ped), GET_ENTITY_HEADING(ped),
10.0, //NODE_FLAGS eNodeFlag,
g_sDefaultPlayerSwitchState[ePed].vWalkCoord_a,
g_sDefaultPlayerSwitchState[ePed].fWalkHead_a)
GetPedOffsetFromCoord(g_sDefaultPlayerSwitchState[ePed].vWalkCoord_a, g_sDefaultPlayerSwitchState[ePed].fWalkHead_a,
50.0, //NODE_FLAGS eNodeFlag,
g_sDefaultPlayerSwitchState[ePed].vWalkCoord_b,
g_sDefaultPlayerSwitchState[ePed].fWalkHead_b)
GetPedOffsetFromCoord(g_sDefaultPlayerSwitchState[ePed].vWalkCoord_b, g_sDefaultPlayerSwitchState[ePed].fWalkHead_b,
100.0, //NODE_FLAGS eNodeFlag,
g_sDefaultPlayerSwitchState[ePed].vWalkCoord_c,
g_sDefaultPlayerSwitchState[ePed].fWalkHead_c)
#IF IS_DEBUG_BUILD
PRINTSTRING(" STORE_DEFAULT_PLAYER_WALKING_SWITCH_STATE(")
PRINTVECTOR(g_sDefaultPlayerSwitchState[ePed].vWalkCoord_a)
PRINTSTRING(", ")
PRINTVECTOR(g_sDefaultPlayerSwitchState[ePed].vWalkCoord_b)
PRINTSTRING(", ")
PRINTVECTOR(g_sDefaultPlayerSwitchState[ePed].vWalkCoord_c)
PRINTNL()
#ENDIF
ENDPROC
/// PURPOSE:
PROC STORE_DEFAULT_PLAYER_SWITCH_STATE(PED_INDEX ped)
// Grab the ped enum
enumCharacterList ePed = GET_PLAYER_PED_ENUM(ped)
IF IS_PLAYER_PED_PLAYABLE(ePed)
AND NOT IS_PED_INJURED(ped)
#IF IS_DEBUG_BUILD
PRINTSTRING("STORE_DEFAULT_PLAYER_SWITCH_STATE(")
PRINTSTRING(GET_PLAYER_PED_STRING(ePed))
PRINTSTRING(", ")
PRINTVECTOR(GET_ENTITY_COORDS(PLAYER_PED_ID()))
PRINTSTRING(", ")
PRINTFLOAT(GET_ENTITY_HEADING(PLAYER_PED_ID()))
PRINTSTRING(")")
PRINTNL()
#ENDIF
STORE_DEFAULT_PLAYER_SCUBA_SWITCH_STATE(ped, ePed)
STORE_DEFAULT_PLAYER_VEHICLE_SWITCH_STATE(ped, ePed)
// STORE_DEFAULT_PLAYER_WALKING_SWITCH_STATE(ped, ePed)
#IF IS_DEBUG_BUILD
PRINTNL()
#ENDIF
ENDIF
ENDPROC
/// PURPOSE: Stores the player peds wanted level
PROC STORE_PLAYER_PED_WANTED(PED_INDEX ped)
// Grab the ped enum
enumCharacterList ePed = GET_PLAYER_PED_ENUM(ped)
IF IS_PLAYER_PED_PLAYABLE(ePed)
AND NOT IS_PED_INJURED(ped)
#IF IS_DEBUG_BUILD
PRINTSTRING("<")
PRINTSTRING(GET_THIS_SCRIPT_NAME())
PRINTSTRING("> STORE_PLAYER_PED_WANTED(")
PRINTSTRING(GET_PLAYER_PED_STRING(ePed))
PRINTSTRING(", ")
PRINTINT(GET_PLAYER_WANTED_LEVEL(PLAYER_ID()))
PRINTSTRING("):")
// PRINTSTRING("g_sPlayerPedRequest.eType = ")
// SWITCH g_sPlayerPedRequest.eType
// CASE PR_TYPE_MISSION
// PRINTSTRING("PR_TYPE_MISSION")
// BREAK
// CASE PR_TYPE_AMBIENT
// PRINTSTRING("PR_TYPE_AMBIENT")
// BREAK
// ENDSWITCH
PRINTSTRING(", ")
SWITCH g_sPlayerPedRequest.eState
CASE PR_STATE_WAITING
PRINTSTRING("PR_STATE_WAITING")
BREAK
CASE PR_STATE_PROCESSING
PRINTSTRING("PR_STATE_PROCESSING")
BREAK
CASE PR_STATE_COMPLETE
PRINTSTRING("PR_STATE_COMPLETE")
BREAK
ENDSWITCH
PRINTNL()
#ENDIF
// IF g_sPlayerPedRequest.eType = PR_TYPE_MISSION
// IF g_sPlayerPedRequest.eState = PR_STATE_PROCESSING
// EXIT
// ENDIF
// ENDIF
IF (ped = PLAYER_PED_ID())
#if USE_CLF_DLC
g_savedGlobalsClifford.sPlayerData.sInfo.iLastKnownWantedLevel[ePed] = GET_PLAYER_WANTED_LEVEL(PLAYER_ID())
#endif
#if USE_NRM_DLC
g_savedGlobalsnorman.sPlayerData.sInfo.iLastKnownWantedLevel[ePed] = GET_PLAYER_WANTED_LEVEL(PLAYER_ID())
#endif
#if not USE_CLF_DLC
#if not USE_NRM_DLC
g_savedGlobals.sPlayerData.sInfo.iLastKnownWantedLevel[ePed] = GET_PLAYER_WANTED_LEVEL(PLAYER_ID())
#endif
#endif
ELSE
#IF IS_DEBUG_BUILD
PRINTSTRING("<")
PRINTSTRING(GET_THIS_SCRIPT_NAME())
PRINTSTRING("> STORE_PLAYER_PED_WANTED(")
PRINTSTRING(GET_PLAYER_PED_STRING(ePed))
PRINTSTRING("):")
PRINTSTRING(" is not the player")
PRINTNL()
#ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE: Sets the player peds wanted level
PROC RESTORE_PLAYER_PED_WANTED(PED_INDEX ped)
// Grab the ped enum
enumCharacterList ePed = GET_PLAYER_PED_ENUM(ped)
IF IS_PLAYER_PED_PLAYABLE(ePed)
AND NOT IS_PED_INJURED(ped)
#IF IS_DEBUG_BUILD
PRINTSTRING("<")
PRINTSTRING(GET_THIS_SCRIPT_NAME())
PRINTSTRING("> RESTORE_PLAYER_PED_WANTED(")
PRINTSTRING(GET_PLAYER_PED_STRING(ePed))
PRINTSTRING("):")
PRINTSTRING(", ")
SWITCH g_sPlayerPedRequest.eState
CASE PR_STATE_WAITING
PRINTSTRING("PR_STATE_WAITING")
BREAK
CASE PR_STATE_PROCESSING
PRINTSTRING("PR_STATE_PROCESSING")
BREAK
CASE PR_STATE_COMPLETE
PRINTSTRING("PR_STATE_COMPLETE")
BREAK
ENDSWITCH
PRINTNL()
#ENDIF
IF (ped = PLAYER_PED_ID())
#if USE_CLF_DLC
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), g_savedGlobalsClifford.sPlayerData.sInfo.iLastKnownWantedLevel[ePed])
#endif
#if USE_NRM_DLC
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), g_savedGlobalsnorman.sPlayerData.sInfo.iLastKnownWantedLevel[ePed])
#endif
#if not USE_CLF_DLC
#if not USE_NRM_DLC
SET_PLAYER_WANTED_LEVEL(PLAYER_ID(), g_savedGlobals.sPlayerData.sInfo.iLastKnownWantedLevel[ePed])
#endif
#endif
SET_PLAYER_WANTED_LEVEL_NOW(PLAYER_ID())
ELSE
#IF IS_DEBUG_BUILD
PRINTSTRING("<")
PRINTSTRING(GET_THIS_SCRIPT_NAME())
PRINTSTRING("> RESTORE_PLAYER_PED_WANTED(")
PRINTSTRING(GET_PLAYER_PED_STRING(ePed))
PRINTSTRING("):")
PRINTSTRING(" is not the player")
PRINTNL()
#ENDIF
ENDIF
ELSE
#IF IS_DEBUG_BUILD
PRINTSTRING("<")
PRINTSTRING(GET_THIS_SCRIPT_NAME())
PRINTSTRING("> RESTORE_PLAYER_PED_WANTED(")
PRINTSTRING(GET_PLAYER_PED_STRING(ePed))
PRINTSTRING("):")
BOOL bFailReason = FALSE
IF NOT IS_PLAYER_PED_PLAYABLE(ePed)
PRINTSTRING("unplayable")
bFailReason = TRUE
ENDIF
IF IS_PED_INJURED(ped)
IF bFailReason
PRINTSTRING(", ")
ENDIF
PRINTSTRING("injured")
bFailReason = TRUE
ENDIF
IF NOT bFailReason
PRINTSTRING("failed")
ENDIF
PRINTNL()
#ENDIF
ENDIF
ENDPROC
/// PURPOSE: Stores the current game time to mark last usage of player ped.
PROC STORE_PLAYER_PED_LAST_GAME_TIME(PED_INDEX ped)
// Grab the ped enum
enumCharacterList ePed = GET_PLAYER_PED_ENUM(ped)
IF IS_PLAYER_PED_PLAYABLE(ePed)
AND NOT IS_PED_INJURED(ped)
#if USE_CLF_DLC
g_savedGlobalsClifford.sPlayerData.sInfo.sLastTimeActive[ePed] = GET_CURRENT_TIMEOFDAY()
#endif
#if USE_NRM_DLC
g_savedGlobalsnorman.sPlayerData.sInfo.sLastTimeActive[ePed] = GET_CURRENT_TIMEOFDAY()
#endif
#if not USE_CLF_DLC
#if not USE_NRM_DLC
g_savedGlobals.sPlayerData.sInfo.sLastTimeActive[ePed] = GET_CURRENT_TIMEOFDAY()
#endif
#endif
ENDIF
ENDPROC
/// PURPOSE: Calls all the seperate store procs
PROC STORE_PLAYER_PED_INFO(PED_INDEX ped, BOOL storeEquippedWeapon = FALSE)
#IF IS_DEBUG_BUILD
PRINTSTRING("\n STORE_PLAYER_PED_INFO - Storing info for ")PRINTSTRING(GET_PLAYER_PED_STRING(GET_PLAYER_PED_ENUM(ped)))PRINTNL()
#ENDIF
STORE_PLAYER_PED_LAST_GAME_TIME(ped)
//STORE_PLAYER_PED_VARIATIONS(ped) // Variations now have to be stored manually.
STORE_PLAYER_PED_WEAPONS(ped, storeEquippedWeapon)
STORE_PLAYER_PED_HEALTH(ped)
STORE_PLAYER_PED_ARMOUR(ped)
STORE_PLAYER_PED_POSITION(ped)
STORE_PLAYER_PED_VELOCITY(ped)
STORE_PLAYER_PED_WANTED(ped)
ENDPROC
/// PURPOSE: Calls all the seperate restore procs
PROC RESTORE_PLAYER_PED_INFO(PED_INDEX ped)
#IF IS_DEBUG_BUILD
PRINTSTRING("\n RESTORE_PLAYER_PED_INFO - Restoring info for ")PRINTSTRING(GET_PLAYER_PED_STRING(GET_PLAYER_PED_ENUM(ped)))PRINTNL()
#ENDIF
RESTORE_PLAYER_PED_VARIATIONS(ped)
RESTORE_PLAYER_PED_WEAPONS(ped)
RESTORE_PLAYER_PED_HEALTH(ped)
RESTORE_PLAYER_PED_ARMOUR(ped)
RESTORE_PLAYER_PED_POSITION(ped)
RESTORE_PLAYER_PED_VELOCITY(ped)
RESTORE_PLAYER_PED_TATTOOS(ped)
ENDPROC
PROC SAFE_AMBIENT_STORE_PLAYER_PED_INFO(PED_INDEX ped)
enumCharacterList ePed = GET_PLAYER_PED_ENUM(ped)
#if USE_CLF_DLC
VECTOR vLastKnownCoords = g_savedGlobalsClifford.sPlayerData.sInfo.vLastKnownCoords[ePed]
FLOAT fLastKnownHead = g_savedGlobalsClifford.sPlayerData.sInfo.fLastKnownHead[ePed]
INT iLastKnownRoomKey = g_savedGlobalsClifford.sPlayerData.sInfo.iLastKnownRoomKey[ePed]
VECTOR vLastKnownVelocity = g_savedGlobalsClifford.sPlayerData.sInfo.vLastKnownVelocity[ePed]
#endif
#if USE_NRM_DLC
VECTOR vLastKnownCoords = g_savedGlobalsnorman.sPlayerData.sInfo.vLastKnownCoords[ePed]
FLOAT fLastKnownHead = g_savedGlobalsnorman.sPlayerData.sInfo.fLastKnownHead[ePed]
INT iLastKnownRoomKey = g_savedGlobalsnorman.sPlayerData.sInfo.iLastKnownRoomKey[ePed]
VECTOR vLastKnownVelocity = g_savedGlobalsnorman.sPlayerData.sInfo.vLastKnownVelocity[ePed]
#endif
#if not USE_CLF_DLC
#if not USE_NRM_DLC
VECTOR vLastKnownCoords = g_savedGlobals.sPlayerData.sInfo.vLastKnownCoords[ePed]
FLOAT fLastKnownHead = g_savedGlobals.sPlayerData.sInfo.fLastKnownHead[ePed]
INT iLastKnownRoomKey = g_savedGlobals.sPlayerData.sInfo.iLastKnownRoomKey[ePed]
VECTOR vLastKnownVelocity = g_savedGlobals.sPlayerData.sInfo.vLastKnownVelocity[ePed]
#endif
#endif
STORE_PLAYER_PED_INFO(ped)
IF NOT ARE_VECTORS_EQUAL(vLastKnownCoords, <<0,0,0>>)
#if USE_CLF_DLC
FLOAT fLastKnownCoordZAbsf = ABSF(g_savedGlobalsClifford.sPlayerData.sInfo.vLastKnownCoords[ePed].z - vLastKnownCoords.z)
FLOAT fLastKnownCoordDist2 = VDIST2(vLastKnownCoords, g_savedGlobalsClifford.sPlayerData.sInfo.vLastKnownCoords[ePed])
FLOAT fLastKnownVelocityMag = VMAG(g_savedGlobalsClifford.sPlayerData.sInfo.vLastKnownVelocity[ePed])
#IF IS_DEBUG_BUILD
PRINTSTRING(GET_THIS_SCRIPT_NAME())PRINTSTRING(":AR_STORE_PLAYER_PED_INFO(")PRINTSTRING(GET_PLAYER_PED_STRING(ePed))PRINTSTRING(")")PRINTNL()
PRINTSTRING(" vLastKnownCoords[")PRINTVECTOR(vLastKnownCoords)PRINTSTRING("] <> g_vLastKnownCoords[")PRINTVECTOR(g_savedGlobalsClifford.sPlayerData.sInfo.vLastKnownCoords[ePed])PRINTSTRING("], absf: ")PRINTFLOAT(fLastKnownCoordZAbsf)PRINTSTRING("], vdist: ")PRINTFLOAT(SQRT(fLastKnownCoordDist2))PRINTNL()
PRINTSTRING(" fLastKnownHead[")PRINTFLOAT(fLastKnownHead)PRINTSTRING("] <> g_fLastKnownHead[")PRINTFLOAT(g_savedGlobalsClifford.sPlayerData.sInfo.fLastKnownHead[ePed])PRINTSTRING("]")PRINTNL()
PRINTSTRING(" iLastKnownRoomKey[")PRINTINT(iLastKnownRoomKey)PRINTSTRING("] <> g_iLastKnownRoomKey[")PRINTINT(g_savedGlobalsClifford.sPlayerData.sInfo.iLastKnownRoomKey[ePed])PRINTSTRING("]")PRINTNL()
PRINTSTRING(" vLastKnownVelocity[")PRINTVECTOR(vLastKnownVelocity)PRINTSTRING(": ")PRINTFLOAT(VMAG(vLastKnownVelocity))PRINTSTRING("] <> g_vLastKnownVelocity[")PRINTVECTOR(g_savedGlobalsClifford.sPlayerData.sInfo.vLastKnownVelocity[ePed])PRINTSTRING(": ")PRINTFLOAT(VMAG(g_savedGlobalsClifford.sPlayerData.sInfo.vLastKnownVelocity[ePed]))PRINTSTRING("]")PRINTNL()
PRINTNL()
#ENDIF
#endif
#if USE_NRM_DLC
FLOAT fLastKnownCoordZAbsf = ABSF(g_savedGlobalsnorman.sPlayerData.sInfo.vLastKnownCoords[ePed].z - vLastKnownCoords.z)
FLOAT fLastKnownCoordDist2 = VDIST2(vLastKnownCoords, g_savedGlobalsnorman.sPlayerData.sInfo.vLastKnownCoords[ePed])
FLOAT fLastKnownVelocityMag = VMAG(g_savedGlobalsnorman.sPlayerData.sInfo.vLastKnownVelocity[ePed])
#IF IS_DEBUG_BUILD
PRINTSTRING(GET_THIS_SCRIPT_NAME())PRINTSTRING(":AR_STORE_PLAYER_PED_INFO(")PRINTSTRING(GET_PLAYER_PED_STRING(ePed))PRINTSTRING(")")PRINTNL()
PRINTSTRING(" vLastKnownCoords[")PRINTVECTOR(vLastKnownCoords)PRINTSTRING("] <> g_vLastKnownCoords[")PRINTVECTOR(g_savedGlobalsnorman.sPlayerData.sInfo.vLastKnownCoords[ePed])PRINTSTRING("], absf: ")PRINTFLOAT(fLastKnownCoordZAbsf)PRINTSTRING("], vdist: ")PRINTFLOAT(SQRT(fLastKnownCoordDist2))PRINTNL()
PRINTSTRING(" fLastKnownHead[")PRINTFLOAT(fLastKnownHead)PRINTSTRING("] <> g_fLastKnownHead[")PRINTFLOAT(g_savedGlobalsnorman.sPlayerData.sInfo.fLastKnownHead[ePed])PRINTSTRING("]")PRINTNL()
PRINTSTRING(" iLastKnownRoomKey[")PRINTINT(iLastKnownRoomKey)PRINTSTRING("] <> g_iLastKnownRoomKey[")PRINTINT(g_savedGlobalsnorman.sPlayerData.sInfo.iLastKnownRoomKey[ePed])PRINTSTRING("]")PRINTNL()
PRINTSTRING(" vLastKnownVelocity[")PRINTVECTOR(vLastKnownVelocity)PRINTSTRING(": ")PRINTFLOAT(VMAG(vLastKnownVelocity))PRINTSTRING("] <> g_vLastKnownVelocity[")PRINTVECTOR(g_savedGlobalsnorman.sPlayerData.sInfo.vLastKnownVelocity[ePed])PRINTSTRING(": ")PRINTFLOAT(VMAG(g_savedGlobalsnorman.sPlayerData.sInfo.vLastKnownVelocity[ePed]))PRINTSTRING("]")PRINTNL()
PRINTNL()
#ENDIF
#endif
#if not USE_CLF_DLC
#if not USE_NRM_DLC
FLOAT fLastKnownCoordZAbsf = ABSF(g_savedGlobals.sPlayerData.sInfo.vLastKnownCoords[ePed].z - vLastKnownCoords.z)
FLOAT fLastKnownCoordDist2 = VDIST2(vLastKnownCoords, g_savedGlobals.sPlayerData.sInfo.vLastKnownCoords[ePed])
FLOAT fLastKnownVelocityMag = VMAG(g_savedGlobals.sPlayerData.sInfo.vLastKnownVelocity[ePed])
#IF IS_DEBUG_BUILD
PRINTSTRING(GET_THIS_SCRIPT_NAME())PRINTSTRING(":AR_STORE_PLAYER_PED_INFO(")PRINTSTRING(GET_PLAYER_PED_STRING(ePed))PRINTSTRING(")")PRINTNL()
PRINTSTRING(" vLastKnownCoords[")PRINTVECTOR(vLastKnownCoords)PRINTSTRING("] <> g_vLastKnownCoords[")PRINTVECTOR(g_savedGlobals.sPlayerData.sInfo.vLastKnownCoords[ePed])PRINTSTRING("], absf: ")PRINTFLOAT(fLastKnownCoordZAbsf)PRINTSTRING("], vdist: ")PRINTFLOAT(SQRT(fLastKnownCoordDist2))PRINTNL()
PRINTSTRING(" fLastKnownHead[")PRINTFLOAT(fLastKnownHead)PRINTSTRING("] <> g_fLastKnownHead[")PRINTFLOAT(g_savedGlobals.sPlayerData.sInfo.fLastKnownHead[ePed])PRINTSTRING("]")PRINTNL()
PRINTSTRING(" iLastKnownRoomKey[")PRINTINT(iLastKnownRoomKey)PRINTSTRING("] <> g_iLastKnownRoomKey[")PRINTINT(g_savedGlobals.sPlayerData.sInfo.iLastKnownRoomKey[ePed])PRINTSTRING("]")PRINTNL()
PRINTSTRING(" vLastKnownVelocity[")PRINTVECTOR(vLastKnownVelocity)PRINTSTRING(": ")PRINTFLOAT(VMAG(vLastKnownVelocity))PRINTSTRING("] <> g_vLastKnownVelocity[")PRINTVECTOR(g_savedGlobals.sPlayerData.sInfo.vLastKnownVelocity[ePed])PRINTSTRING(": ")PRINTFLOAT(VMAG(g_savedGlobals.sPlayerData.sInfo.vLastKnownVelocity[ePed]))PRINTSTRING("]")PRINTNL()
PRINTNL()
#ENDIF
#endif
#endif
BOOL bRestoreStoredPedInfo = FALSE
IF fLastKnownVelocityMag > 25.0
CONST_FLOAT fCONST_RESTORE_PED_INFO_DIST 25.0 //100.0
IF (fLastKnownCoordZAbsf > fCONST_RESTORE_PED_INFO_DIST)
bRestoreStoredPedInfo = TRUE
ENDIF
IF (fLastKnownCoordDist2 > (fCONST_RESTORE_PED_INFO_DIST*fCONST_RESTORE_PED_INFO_DIST))
bRestoreStoredPedInfo = TRUE
ENDIF
ENDIF
#IF USE_TU_CHANGES
IF NOT IS_PED_INJURED(ped)
#ENDIF
IF IS_PED_IN_ANY_VEHICLE(ped)
bRestoreStoredPedInfo = TRUE
PRINTLN("player ped ", GET_PLAYER_PED_STRING(ePed), " is in vehicle")
ENDIF
IF NOT HAS_COLLISION_LOADED_AROUND_ENTITY(ped)
bRestoreStoredPedInfo = TRUE
PRINTLN("no collision around player ped ", GET_PLAYER_PED_STRING(ePed), " being stored")
ENDIF
#IF USE_TU_CHANGES
ENDIF
#ENDIF
IF bRestoreStoredPedInfo
PRINTSTRING(" bRestoreStoredPedInfo")PRINTNL()
#if USE_CLF_DLC
g_savedGlobalsClifford.sPlayerData.sInfo.vLastKnownCoords[ePed] = vLastKnownCoords
g_savedGlobalsClifford.sPlayerData.sInfo.fLastKnownHead[ePed] = fLastKnownHead
g_savedGlobalsClifford.sPlayerData.sInfo.iLastKnownRoomKey[ePed] = iLastKnownRoomKey
g_savedGlobalsClifford.sPlayerData.sInfo.vLastKnownVelocity[ePed] = vLastKnownVelocity
#endif
#if USE_NRM_DLC
g_savedGlobalsnorman.sPlayerData.sInfo.vLastKnownCoords[ePed] = vLastKnownCoords
g_savedGlobalsnorman.sPlayerData.sInfo.fLastKnownHead[ePed] = fLastKnownHead
g_savedGlobalsnorman.sPlayerData.sInfo.iLastKnownRoomKey[ePed] = iLastKnownRoomKey
g_savedGlobalsnorman.sPlayerData.sInfo.vLastKnownVelocity[ePed] = vLastKnownVelocity
#endif
#if not USE_CLF_DLC
#if not USE_NRM_DLC
g_savedGlobals.sPlayerData.sInfo.vLastKnownCoords[ePed] = vLastKnownCoords
g_savedGlobals.sPlayerData.sInfo.fLastKnownHead[ePed] = fLastKnownHead
g_savedGlobals.sPlayerData.sInfo.iLastKnownRoomKey[ePed] = iLastKnownRoomKey
g_savedGlobals.sPlayerData.sInfo.vLastKnownVelocity[ePed] = vLastKnownVelocity
#endif
#endif
ELSE
PRINTSTRING(" don't bRestoreStoredPedInfo")PRINTNL()
ENDIF
ENDIF
ENDPROC
#if USE_CLF_DLC
PROC ResetLastKnownPedInfoCLF(PED_INFO_STRUCT &sInfo, SP_MISSIONS eMissionID)
IF (eMissionID = SP_MISSION_MAX)
SCRIPT_ASSERT("ResetLastKnownPedInfo: SP_MISSION_MAX is not valid mission IDs to pass.")
EXIT
ENDIF
enumCharacterList ePed
REPEAT NUM_OF_PLAYABLE_PEDS ePed
// PED_REQUEST_SCENE_ENUM eOldScene = g_savedGlobalsClifford.sPlayerSceneData.g_ePlayerLastScene[ePed]
VECTOR vLastKnownCoords = <<0,0,0>>
FLOAT fLastKnownHead = 0
IF NOT GetLastKnownPedInfoPostMission(g_savedGlobalsClifford.sPlayerSceneData.g_ePlayerLastScene[ePed], vLastKnownCoords, fLastKnownHead)
g_savedGlobalsClifford.sPlayerSceneData.g_ePlayerLastScene[ePed] = PR_SCENE_INVALID
CLEAR_TIMEOFDAY(sInfo.sLastTimeActive[ePed])
sInfo.vLastKnownCoords[ePed] = <<0,0,0>>
sInfo.fLastKnownHead[ePed] = 0.0
sInfo.iLastKnownRoomKey[ePed] = 0
sInfo.vLastKnownVelocity[ePed] = <<0,0,0>>
sInfo.iLastKnownWantedLevel[ePed] = 0
g_sDefaultPlayerSwitchState[ePed].vVehicleCoord_a = <<0,0,0>>
g_sDefaultPlayerSwitchState[ePed].fVehicleHead_a = 0
g_sDefaultPlayerSwitchState[ePed].fVehicleSpeed_a = 0
g_sDefaultPlayerSwitchState[ePed].vVehicleCoord_b = <<0,0,0>>
g_sDefaultPlayerSwitchState[ePed].fVehicleHead_b = 0
g_sDefaultPlayerSwitchState[ePed].fVehicleSpeed_b = 0
g_sDefaultPlayerSwitchState[ePed].vVehicleCoord_c = <<0,0,0>>
g_sDefaultPlayerSwitchState[ePed].fVehicleHead_c = 0
g_sDefaultPlayerSwitchState[ePed].fVehicleSpeed_c = 0
g_sDefaultPlayerSwitchState[ePed].vWalkCoord_a = <<0,0,0>>
g_sDefaultPlayerSwitchState[ePed].fWalkHead_a = 0
g_sDefaultPlayerSwitchState[ePed].vWalkCoord_b = <<0,0,0>>
g_sDefaultPlayerSwitchState[ePed].fWalkHead_b = 0
g_sDefaultPlayerSwitchState[ePed].vWalkCoord_c = <<0,0,0>>
g_sDefaultPlayerSwitchState[ePed].fWalkHead_c = 0
ENDIF
ENDREPEAT
#IF IS_DEBUG_BUILD
IF (eMissionID = SP_MISSION_NONE)
PRINTLN("<", GET_THIS_SCRIPT_NAME(), "> ResetLastKnownPedInfo(", "SP_MISSION_NONE", ").")
ELSE
#if USE_CLF_DLC
PRINTLN("<", GET_THIS_SCRIPT_NAME(), "> ResetLastKnownPedInfo(", GET_SCRIPT_FROM_HASH(g_sMissionStaticData[eMissionID].scriptHash), ").")
#endif
ENDIF
#ENDIF
ENDPROC
#ENDIF
#if USE_NRM_DLC
PROC ResetLastKnownPedInfoNRM(PED_INFO_STRUCT &sInfo, SP_MISSIONS eMissionID)
IF (eMissionID = SP_MISSION_MAX_NRM)
SCRIPT_ASSERT("ResetLastKnownPedInfo: SP_MISSION_MAX is not valid mission IDs to pass.")
EXIT
ENDIF
enumCharacterList ePed
REPEAT NUM_OF_PLAYABLE_PEDS ePed
// PED_REQUEST_SCENE_ENUM eOldScene = g_savedGlobalsnorman.sPlayerSceneData.g_ePlayerLastScene[ePed]
VECTOR vLastKnownCoords = <<0,0,0>>
FLOAT fLastKnownHead = 0
IF NOT GetLastKnownPedInfoPostMission(g_savedGlobalsnorman.sPlayerSceneData.g_ePlayerLastScene[ePed], vLastKnownCoords, fLastKnownHead)
g_savedGlobalsnorman.sPlayerSceneData.g_ePlayerLastScene[ePed] = PR_SCENE_INVALID
CLEAR_TIMEOFDAY(sInfo.sLastTimeActive[ePed])
sInfo.vLastKnownCoords[ePed] = <<0,0,0>>
sInfo.fLastKnownHead[ePed] = 0.0
sInfo.iLastKnownRoomKey[ePed] = 0
sInfo.vLastKnownVelocity[ePed] = <<0,0,0>>
sInfo.iLastKnownWantedLevel[ePed] = 0
g_sDefaultPlayerSwitchState[ePed].vVehicleCoord_a = <<0,0,0>>
g_sDefaultPlayerSwitchState[ePed].fVehicleHead_a = 0
g_sDefaultPlayerSwitchState[ePed].fVehicleSpeed_a = 0
g_sDefaultPlayerSwitchState[ePed].vVehicleCoord_b = <<0,0,0>>
g_sDefaultPlayerSwitchState[ePed].fVehicleHead_b = 0
g_sDefaultPlayerSwitchState[ePed].fVehicleSpeed_b = 0
g_sDefaultPlayerSwitchState[ePed].vVehicleCoord_c = <<0,0,0>>
g_sDefaultPlayerSwitchState[ePed].fVehicleHead_c = 0
g_sDefaultPlayerSwitchState[ePed].fVehicleSpeed_c = 0
g_sDefaultPlayerSwitchState[ePed].vWalkCoord_a = <<0,0,0>>
g_sDefaultPlayerSwitchState[ePed].fWalkHead_a = 0
g_sDefaultPlayerSwitchState[ePed].vWalkCoord_b = <<0,0,0>>
g_sDefaultPlayerSwitchState[ePed].fWalkHead_b = 0
g_sDefaultPlayerSwitchState[ePed].vWalkCoord_c = <<0,0,0>>
g_sDefaultPlayerSwitchState[ePed].fWalkHead_c = 0
ENDIF
ENDREPEAT
#IF IS_DEBUG_BUILD
IF (eMissionID = SP_MISSION_NONE)
PRINTLN("<", GET_THIS_SCRIPT_NAME(), "> ResetLastKnownPedInfo(", "SP_MISSION_NONE", ").")
ELSE
#if USE_NRM_DLC
PRINTLN("<", GET_THIS_SCRIPT_NAME(), "> ResetLastKnownPedInfo(", GET_SCRIPT_FROM_HASH_NRM(g_sMissionStaticData[eMissionID].scriptHash), ").")
#endif
ENDIF
#ENDIF
ENDPROC
#ENDIF
PROC ResetLastKnownPedInfo(PED_INFO_STRUCT &sInfo, SP_MISSIONS eMissionID)
#if USE_CLF_DLC
if g_bLoadedClifford
ResetLastKnownPedInfoCLF(sInfo,eMissionID)
EXIT
endif
#endif
#if USE_NRM_DLC
if g_bLoadedNorman
ResetLastKnownPedInfoNRM(sInfo,eMissionID)
EXIT
endif
#endif
#if not USE_CLF_DLC
#if not USE_NRM_DLC
IF (eMissionID = SP_MISSION_MAX)
SCRIPT_ASSERT("ResetLastKnownPedInfo: SP_MISSION_MAX is not valid mission IDs to pass.")
EXIT
ENDIF
enumCharacterList ePed
REPEAT NUM_OF_PLAYABLE_PEDS ePed
PED_REQUEST_SCENE_ENUM eOldScene = g_SavedGlobals.sPlayerSceneData.g_ePlayerLastScene[ePed]
IF (((eOldScene = PR_SCENE_Fa_PHONECALL_ARM3) OR (eOldScene = PR_SCENE_Fa_PHONECALL_FAM1) OR (eOldScene = PR_SCENE_Fa_PHONECALL_FAM3))
OR ((eOldScene = PR_SCENE_Fa_STRIPCLUB_ARM3)
// OR (eOldScene = PR_SCENE_Fa_STRIPCLUB_FAM1) OR (eOldScene = PR_SCENE_Fa_STRIPCLUB_FAM3)
OR (eOldScene = PR_SCENE_Ma_FAMILY6) OR (eOldScene = PR_SCENE_Ma_FINALEC) OR (eOldScene = PR_SCENE_Fa_FINALEC)
))
AND NOT (IS_BIT_SET(g_savedGlobals.sFlow.controls.bitsetIDs[FLOWBITSET_MINIGAME_ACTIVE], ENUM_TO_INT(MINIGAME_STRIPCLUB)))
#IF IS_DEBUG_BUILD
PRINTLN("<", GET_THIS_SCRIPT_NAME(), "> ResetLastKnownPedInfo(",
"dont reset, eOldScene - STRIPCLUB",
").")
#ENDIF
ELSE
VECTOR vLastKnownCoords = <<0,0,0>>
FLOAT fLastKnownHead = 0
IF NOT GetLastKnownPedInfoPostMission(g_SavedGlobals.sPlayerSceneData.g_ePlayerLastScene[ePed], vLastKnownCoords, fLastKnownHead)
g_SavedGlobals.sPlayerSceneData.g_ePlayerLastScene[ePed] = PR_SCENE_INVALID
CLEAR_TIMEOFDAY(sInfo.sLastTimeActive[ePed])
sInfo.vLastKnownCoords[ePed] = <<0,0,0>>
sInfo.fLastKnownHead[ePed] = 0.0
sInfo.iLastKnownRoomKey[ePed] = 0
sInfo.vLastKnownVelocity[ePed] = <<0,0,0>>
sInfo.iLastKnownWantedLevel[ePed] = 0
g_sDefaultPlayerSwitchState[ePed].vVehicleCoord_a = <<0,0,0>>
g_sDefaultPlayerSwitchState[ePed].fVehicleHead_a = 0
g_sDefaultPlayerSwitchState[ePed].fVehicleSpeed_a = 0
g_sDefaultPlayerSwitchState[ePed].vVehicleCoord_b = <<0,0,0>>
g_sDefaultPlayerSwitchState[ePed].fVehicleHead_b = 0
g_sDefaultPlayerSwitchState[ePed].fVehicleSpeed_b = 0
g_sDefaultPlayerSwitchState[ePed].vVehicleCoord_c = <<0,0,0>>
g_sDefaultPlayerSwitchState[ePed].fVehicleHead_c = 0
g_sDefaultPlayerSwitchState[ePed].fVehicleSpeed_c = 0
g_sDefaultPlayerSwitchState[ePed].vWalkCoord_a = <<0,0,0>>
g_sDefaultPlayerSwitchState[ePed].fWalkHead_a = 0
g_sDefaultPlayerSwitchState[ePed].vWalkCoord_b = <<0,0,0>>
g_sDefaultPlayerSwitchState[ePed].fWalkHead_b = 0
g_sDefaultPlayerSwitchState[ePed].vWalkCoord_c = <<0,0,0>>
g_sDefaultPlayerSwitchState[ePed].fWalkHead_c = 0
ENDIF
ENDIF
ENDREPEAT
#IF IS_DEBUG_BUILD
IF (eMissionID = SP_MISSION_NONE)
PRINTLN("<", GET_THIS_SCRIPT_NAME(), "> ResetLastKnownPedInfo(", "SP_MISSION_NONE", ").")
ELSE
PRINTLN("<", GET_THIS_SCRIPT_NAME(), "> ResetLastKnownPedInfo(", g_sMissionStaticData[eMissionID].scriptName, ").")
ENDIF
#ENDIF
#endif // dlc check
#endif
ENDPROC
/// PURPOSE: Sets the details for the players special vehicle
PROC UPDATE_PLAYER_PED_SAVED_VEHICLE(enumCharacterList ePed, VEHICLE_INDEX &vehID, INT iVehicleSlot, BOOL bUpdateCarApp)
IF IS_PLAYER_PED_PLAYABLE(ePed)
AND DOES_ENTITY_EXIST(vehID)
AND IS_VEHICLE_DRIVEABLE(vehID)
#if USE_CLF_DLC
IF iVehicleSlot > COUNT_OF(g_savedGlobalsClifford.sPlayerData.sInfo.sPlayerVehicle)
#IF IS_DEBUG_BUILD
PRINTLN("UPDATE_PLAYER_PED_SAVED_VEHICLE() - Unable to update vehicle, slot ID out of range, iVehicleSlot=", iVehicleSlot)
SCRIPT_ASSERT("UPDATE_PLAYER_PED_SAVED_VEHICLE() - Unable to update vehicle, slot ID out of range")
#ENDIF
EXIT
ENDIF
#endif
#if USE_NRM_DLC
IF iVehicleSlot > COUNT_OF(g_savedGlobalsnorman.sPlayerData.sInfo.sPlayerVehicle)
#IF IS_DEBUG_BUILD
PRINTLN("UPDATE_PLAYER_PED_SAVED_VEHICLE() - Unable to update vehicle, slot ID out of range, iVehicleSlot=", iVehicleSlot)
SCRIPT_ASSERT("UPDATE_PLAYER_PED_SAVED_VEHICLE() - Unable to update vehicle, slot ID out of range")
#ENDIF
EXIT
ENDIF
#endif
#if not USE_CLF_DLC
#if not USE_NRM_DLC
IF iVehicleSlot > COUNT_OF(g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle)
#IF IS_DEBUG_BUILD
PRINTLN("UPDATE_PLAYER_PED_SAVED_VEHICLE() - Unable to update vehicle, slot ID out of range, iVehicleSlot=", iVehicleSlot)
SCRIPT_ASSERT("UPDATE_PLAYER_PED_SAVED_VEHICLE() - Unable to update vehicle, slot ID out of range")
#ENDIF
EXIT
ENDIF
#endif
#endif
// Slot specific updates/checks.
IF iVehicleSlot = SAVED_VEHICLE_SLOT_CAR
#IF IS_DEBUG_BUILD
PRINTLN("UPDATE_PLAYER_PED_SAVED_VEHICLE() - Updating sPlayerVehicle[SAVED_VEHICLE_SLOT_CAR] for ", GET_PLAYER_PED_STRING(ePed))
#ENDIF
// Nothing to do.
ELIF iVehicleSlot = SAVED_VEHICLE_SLOT_BIKE
#IF IS_DEBUG_BUILD
PRINTLN("UPDATE_PLAYER_PED_SAVED_VEHICLE() - Updating sPlayerVehicle[SAVED_VEHICLE_SLOT_BIKE] for ", GET_PLAYER_PED_STRING(ePed))
#ENDIF
// Nothing to do.
ELIF iVehicleSlot = SAVED_VEHICLE_SLOT_GARAGE
#IF IS_DEBUG_BUILD
PRINTLN("UPDATE_PLAYER_PED_SAVED_VEHICLE() - Updating sPlayerVehicle[SAVED_VEHICLE_SLOT_GARAGE] for ", GET_PLAYER_PED_STRING(ePed))
#ENDIF
// Nothing to do.
ELIF iVehicleSlot = SAVED_VEHICLE_SLOT_MODDED
#IF IS_DEBUG_BUILD
PRINTLN("UPDATE_PLAYER_PED_SAVED_VEHICLE() - Updating sPlayerVehicle[SAVED_VEHICLE_SLOT_MODDED] for ", GET_PLAYER_PED_STRING(ePed))
#ENDIF
// Track last modded car so we can send to impound if it gets lost.
TRACK_VEHICLE_FOR_IMPOUND(vehID, ePed)
ENDIF
IF GET_NUM_MOD_KITS(vehID) != 0
SET_VEHICLE_MOD_KIT(vehID, 0)
ENDIF
VEHICLE_MODEL_FAIL_ENUM eFailReason
#if USE_CLF_DLC
g_savedGlobalsClifford.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].model = GET_ENTITY_MODEL(vehID)
VEHICLE_INDEX vehTrailer
IF GET_VEHICLE_TRAILER_VEHICLE(vehID, vehTrailer)
g_savedGlobalsClifford.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].modelTrailer = GET_ENTITY_MODEL(vehTrailer)
PRINTSTRING("update player: there is a trailer")PRINTNL()
ELSE
PRINTSTRING("update player: there is no trailer")PRINTNL()
ENDIF
g_savedGlobalsClifford.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].fDirtLevel = GET_VEHICLE_DIRT_LEVEL(vehID)
g_savedGlobalsClifford.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].fHealth = GET_ENTITY_HEALTH(vehID)
g_savedGlobalsClifford.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].bExtraOn[0] = IS_VEHICLE_EXTRA_TURNED_ON(vehID, 1)
g_savedGlobalsClifford.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].bExtraOn[1] = IS_VEHICLE_EXTRA_TURNED_ON(vehID, 2)
g_savedGlobalsClifford.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].bExtraOn[2] = IS_VEHICLE_EXTRA_TURNED_ON(vehID, 3)
g_savedGlobalsClifford.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].bExtraOn[3] = IS_VEHICLE_EXTRA_TURNED_ON(vehID, 4)
g_savedGlobalsClifford.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].bExtraOn[4] = IS_VEHICLE_EXTRA_TURNED_ON(vehID, 5)
g_savedGlobalsClifford.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].bExtraOn[5] = IS_VEHICLE_EXTRA_TURNED_ON(vehID, 6)
g_savedGlobalsClifford.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].bExtraOn[6] = IS_VEHICLE_EXTRA_TURNED_ON(vehID, 7)
g_savedGlobalsClifford.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].bExtraOn[7] = IS_VEHICLE_EXTRA_TURNED_ON(vehID, 8)
g_savedGlobalsClifford.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].bExtraOn[8] = IS_VEHICLE_EXTRA_TURNED_ON(vehID, 9)
g_savedGlobalsClifford.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].bExtraOn[9] = IS_VEHICLE_EXTRA_TURNED_ON(vehID, 10)
g_savedGlobalsClifford.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].bExtraOn[10] = IS_VEHICLE_EXTRA_TURNED_ON(vehID, 11)
g_savedGlobalsClifford.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].bExtraOn[11] = IS_VEHICLE_EXTRA_TURNED_ON(vehID, 12)
IF IS_VEHICLE_A_CONVERTIBLE(vehID)
CONVERTIBLE_ROOF_STATE eRoofState = GET_CONVERTIBLE_ROOF_STATE(vehID)
IF eRoofState = CRS_RAISED
OR eRoofState = CRS_ROOF_STUCK_RAISED
g_savedGlobalsClifford.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].bConvertible = TRUE
ELSE
g_savedGlobalsClifford.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].bConvertible = FALSE
ENDIF
ELSE
g_savedGlobalsClifford.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].bConvertible = FALSE
ENDIF
g_savedGlobalsClifford.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].iRadioIndex = GET_PLAYER_RADIO_STATION_INDEX()
g_savedGlobalsClifford.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].tlNumberPlate = GET_VEHICLE_NUMBER_PLATE_TEXT(vehID)
g_savedGlobalsClifford.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].iPlateBack = GET_VEHICLE_NUMBER_PLATE_TEXT_INDEX(vehID)
GET_VEHICLE_COLOURS(vehID, g_savedGlobalsClifford.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].iColour1, g_savedGlobalsClifford.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].iColour2)
GET_VEHICLE_EXTRA_COLOURS(vehID, g_savedGlobalsClifford.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].iColourExtra1, g_savedGlobalsClifford.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].iColourExtra2)
GET_VEHICLE_TYRE_SMOKE_COLOR(vehID, g_savedGlobalsClifford.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].iTyreR, g_savedGlobalsClifford.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].iTyreG, g_savedGlobalsClifford.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].iTyreB)
g_savedGlobalsClifford.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].bTyresCanBurst = GET_VEHICLE_TYRES_CAN_BURST(vehID)
g_savedGlobalsClifford.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].iWindowTintColour = GET_VEHICLE_WINDOW_TINT(vehID)
g_savedGlobalsClifford.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].iLivery = GET_VEHICLE_LIVERY(vehID)
g_savedGlobalsClifford.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].iWheelType = ENUM_TO_INT(GET_VEHICLE_WHEEL_TYPE(vehID))
g_savedGlobalsClifford.sPlayerData.sInfo.eLastVehicleSentToCloudSavehouse[ePed] = NUMBER_OF_CLF_SAVEHOUSE
// Neon lights
GET_VEHICLE_NEON_COLOUR(vehID, g_savedGlobalsClifford.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].iNeonR, g_savedGlobalsClifford.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].iNeonG, g_savedGlobalsClifford.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].iNeonB)
IF GET_VEHICLE_NEON_ENABLED(vehID, NEON_FRONT)
SET_BIT(g_savedGlobalsClifford.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].iFlags, VEHICLE_SETUP_FLAG_NEON_FRONT)
ELSE
CLEAR_BIT(g_savedGlobalsClifford.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].iFlags, VEHICLE_SETUP_FLAG_NEON_FRONT)
ENDIF
IF GET_VEHICLE_NEON_ENABLED(vehID, NEON_BACK)
SET_BIT(g_savedGlobalsClifford.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].iFlags, VEHICLE_SETUP_FLAG_NEON_BACK)
ELSE
CLEAR_BIT(g_savedGlobalsClifford.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].iFlags, VEHICLE_SETUP_FLAG_NEON_BACK)
ENDIF
IF GET_VEHICLE_NEON_ENABLED(vehID, NEON_LEFT)
SET_BIT(g_savedGlobalsClifford.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].iFlags, VEHICLE_SETUP_FLAG_NEON_LEFT)
ELSE
CLEAR_BIT(g_savedGlobalsClifford.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].iFlags, VEHICLE_SETUP_FLAG_NEON_LEFT)
ENDIF
IF GET_VEHICLE_NEON_ENABLED(vehID, NEON_RIGHT)
SET_BIT(g_savedGlobalsClifford.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].iFlags, VEHICLE_SETUP_FLAG_NEON_RIGHT)
ELSE
CLEAR_BIT(g_savedGlobalsClifford.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].iFlags, VEHICLE_SETUP_FLAG_NEON_RIGHT)
ENDIF
IF GET_VEHICLE_MOD_KIT(vehID) >= 0
AND IS_VEHICLE_SAFE_FOR_MOD_SHOP(vehID, FALSE, eFailReason)
GET_VEHICLE_MOD_DATA(vehID, g_savedGlobalsClifford.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].iModIndex, g_savedGlobalsClifford.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].iModVariation)
ENDIF
UNUSED_PARAMETER(bUpdatecarApp)
#endif
#if USE_NRM_DLC
g_savedGlobalsnorman.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].model = GET_ENTITY_MODEL(vehID)
VEHICLE_INDEX vehTrailer
IF GET_VEHICLE_TRAILER_VEHICLE(vehID, vehTrailer)
g_savedGlobalsnorman.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].modelTrailer = GET_ENTITY_MODEL(vehTrailer)
PRINTSTRING("update player: there is a trailer")PRINTNL()
ELSE
PRINTSTRING("update player: there is no trailer")PRINTNL()
ENDIF
g_savedGlobalsnorman.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].fDirtLevel = GET_VEHICLE_DIRT_LEVEL(vehID)
g_savedGlobalsnorman.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].fHealth = GET_ENTITY_HEALTH(vehID)
g_savedGlobalsnorman.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].bExtraOn[0] = IS_VEHICLE_EXTRA_TURNED_ON(vehID, 1)
g_savedGlobalsnorman.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].bExtraOn[1] = IS_VEHICLE_EXTRA_TURNED_ON(vehID, 2)
g_savedGlobalsnorman.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].bExtraOn[2] = IS_VEHICLE_EXTRA_TURNED_ON(vehID, 3)
g_savedGlobalsnorman.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].bExtraOn[3] = IS_VEHICLE_EXTRA_TURNED_ON(vehID, 4)
g_savedGlobalsnorman.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].bExtraOn[4] = IS_VEHICLE_EXTRA_TURNED_ON(vehID, 5)
g_savedGlobalsnorman.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].bExtraOn[5] = IS_VEHICLE_EXTRA_TURNED_ON(vehID, 6)
g_savedGlobalsnorman.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].bExtraOn[6] = IS_VEHICLE_EXTRA_TURNED_ON(vehID, 7)
g_savedGlobalsnorman.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].bExtraOn[7] = IS_VEHICLE_EXTRA_TURNED_ON(vehID, 8)
g_savedGlobalsnorman.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].bExtraOn[8] = IS_VEHICLE_EXTRA_TURNED_ON(vehID, 9)
IF IS_VEHICLE_A_CONVERTIBLE(vehID)
CONVERTIBLE_ROOF_STATE eRoofState = GET_CONVERTIBLE_ROOF_STATE(vehID)
IF eRoofState = CRS_RAISED
OR eRoofState = CRS_ROOF_STUCK_RAISED
g_savedGlobalsnorman.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].bConvertible = TRUE
ELSE
g_savedGlobalsnorman.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].bConvertible = FALSE
ENDIF
ELSE
g_savedGlobalsnorman.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].bConvertible = FALSE
ENDIF
g_savedGlobalsnorman.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].iRadioIndex = GET_PLAYER_RADIO_STATION_INDEX()
g_savedGlobalsnorman.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].tlNumberPlate = GET_VEHICLE_NUMBER_PLATE_TEXT(vehID)
g_savedGlobalsnorman.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].iPlateBack = GET_VEHICLE_NUMBER_PLATE_TEXT_INDEX(vehID)
GET_VEHICLE_COLOURS(vehID, g_savedGlobalsnorman.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].iColour1, g_savedGlobalsnorman.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].iColour2)
GET_VEHICLE_EXTRA_COLOURS(vehID, g_savedGlobalsnorman.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].iColourExtra1, g_savedGlobalsnorman.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].iColourExtra2)
GET_VEHICLE_TYRE_SMOKE_COLOR(vehID, g_savedGlobalsnorman.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].iTyreR, g_savedGlobalsnorman.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].iTyreG, g_savedGlobalsnorman.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].iTyreB)
g_savedGlobalsnorman.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].bTyresCanBurst = GET_VEHICLE_TYRES_CAN_BURST(vehID)
g_savedGlobalsnorman.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].iWindowTintColour = GET_VEHICLE_WINDOW_TINT(vehID)
g_savedGlobalsnorman.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].iLivery = GET_VEHICLE_LIVERY(vehID)
g_savedGlobalsnorman.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].iWheelType = ENUM_TO_INT(GET_VEHICLE_WHEEL_TYPE(vehID))
g_savedGlobalsnorman.sPlayerData.sInfo.eLastVehicleSentToCloudSavehouse[ePed] = NUMBER_OF_NRM_SAVEHOUSE
// Neon lights
GET_VEHICLE_NEON_COLOUR(vehID, g_savedGlobalsnorman.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].iNeonR, g_savedGlobalsnorman.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].iNeonG, g_savedGlobalsnorman.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].iNeonB)
IF GET_VEHICLE_NEON_ENABLED(vehID, NEON_FRONT)
SET_BIT(g_savedGlobalsnorman.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].iFlags, VEHICLE_SETUP_FLAG_NEON_FRONT)
ELSE
CLEAR_BIT(g_savedGlobalsnorman.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].iFlags, VEHICLE_SETUP_FLAG_NEON_FRONT)
ENDIF
IF GET_VEHICLE_NEON_ENABLED(vehID, NEON_BACK)
SET_BIT(g_savedGlobalsnorman.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].iFlags, VEHICLE_SETUP_FLAG_NEON_BACK)
ELSE
CLEAR_BIT(g_savedGlobalsnorman.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].iFlags, VEHICLE_SETUP_FLAG_NEON_BACK)
ENDIF
IF GET_VEHICLE_NEON_ENABLED(vehID, NEON_LEFT)
SET_BIT(g_savedGlobalsnorman.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].iFlags, VEHICLE_SETUP_FLAG_NEON_LEFT)
ELSE
CLEAR_BIT(g_savedGlobalsnorman.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].iFlags, VEHICLE_SETUP_FLAG_NEON_LEFT)
ENDIF
IF GET_VEHICLE_NEON_ENABLED(vehID, NEON_RIGHT)
SET_BIT(g_savedGlobalsnorman.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].iFlags, VEHICLE_SETUP_FLAG_NEON_RIGHT)
ELSE
CLEAR_BIT(g_savedGlobalsnorman.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].iFlags, VEHICLE_SETUP_FLAG_NEON_RIGHT)
ENDIF
IF GET_VEHICLE_MOD_KIT(vehID) >= 0
AND IS_VEHICLE_SAFE_FOR_MOD_SHOP(vehID, FALSE, eFailReason)
GET_VEHICLE_MOD_DATA(vehID, g_savedGlobalsnorman.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].iModIndex, g_savedGlobalsnorman.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].iModVariation)
ENDIF
UNUSED_PARAMETER(bUpdatecarApp)
#endif
#if not USE_CLF_DLC
#if not USE_NRM_DLC
g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].model = GET_ENTITY_MODEL(vehID)
VEHICLE_INDEX vehTrailer
IF GET_VEHICLE_TRAILER_VEHICLE(vehID, vehTrailer)
g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].modelTrailer = GET_ENTITY_MODEL(vehTrailer)
PRINTSTRING("update player: there is a trailer")PRINTNL()
ELSE
PRINTSTRING("update player: there is no trailer")PRINTNL()
ENDIF
g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].fDirtLevel = GET_VEHICLE_DIRT_LEVEL(vehID)
g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].fHealth = GET_ENTITY_HEALTH(vehID)
g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].bExtraOn[0] = IS_VEHICLE_EXTRA_TURNED_ON(vehID, 1)
g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].bExtraOn[1] = IS_VEHICLE_EXTRA_TURNED_ON(vehID, 2)
g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].bExtraOn[2] = IS_VEHICLE_EXTRA_TURNED_ON(vehID, 3)
g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].bExtraOn[3] = IS_VEHICLE_EXTRA_TURNED_ON(vehID, 4)
g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].bExtraOn[4] = IS_VEHICLE_EXTRA_TURNED_ON(vehID, 5)
g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].bExtraOn[5] = IS_VEHICLE_EXTRA_TURNED_ON(vehID, 6)
g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].bExtraOn[6] = IS_VEHICLE_EXTRA_TURNED_ON(vehID, 7)
g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].bExtraOn[7] = IS_VEHICLE_EXTRA_TURNED_ON(vehID, 8)
g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].bExtraOn[8] = IS_VEHICLE_EXTRA_TURNED_ON(vehID, 9)
g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].bExtraOn[9] = IS_VEHICLE_EXTRA_TURNED_ON(vehID, 10)
g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].bExtraOn[10] = IS_VEHICLE_EXTRA_TURNED_ON(vehID, 11)
g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].bExtraOn[11] = IS_VEHICLE_EXTRA_TURNED_ON(vehID, 12)
IF IS_VEHICLE_A_CONVERTIBLE(vehID)
CONVERTIBLE_ROOF_STATE eRoofState = GET_CONVERTIBLE_ROOF_STATE(vehID)
IF eRoofState = CRS_RAISED
OR eRoofState = CRS_ROOF_STUCK_RAISED
g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].bConvertible = TRUE
ELSE
g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].bConvertible = FALSE
ENDIF
ELSE
g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].bConvertible = FALSE
ENDIF
g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].iRadioIndex = GET_PLAYER_RADIO_STATION_INDEX()
g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].tlNumberPlate = GET_VEHICLE_NUMBER_PLATE_TEXT(vehID)
g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].iPlateBack = GET_VEHICLE_NUMBER_PLATE_TEXT_INDEX(vehID)
GET_VEHICLE_COLOURS(vehID, g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].iColour1, g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].iColour2)
GET_VEHICLE_EXTRA_COLOURS(vehID, g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].iColourExtra1, g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].iColourExtra2)
GET_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)
g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].bTyresCanBurst = GET_VEHICLE_TYRES_CAN_BURST(vehID)
g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].iWindowTintColour = GET_VEHICLE_WINDOW_TINT(vehID)
g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].iLivery = GET_VEHICLE_LIVERY(vehID)
g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].iWheelType = ENUM_TO_INT(GET_VEHICLE_WHEEL_TYPE(vehID))
// Neon lights
GET_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)
IF GET_VEHICLE_NEON_ENABLED(vehID, NEON_FRONT)
SET_BIT(g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].iFlags, VEHICLE_SETUP_FLAG_NEON_FRONT)
ELSE
CLEAR_BIT(g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].iFlags, VEHICLE_SETUP_FLAG_NEON_FRONT)
ENDIF
IF GET_VEHICLE_NEON_ENABLED(vehID, NEON_BACK)
SET_BIT(g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].iFlags, VEHICLE_SETUP_FLAG_NEON_BACK)
ELSE
CLEAR_BIT(g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].iFlags, VEHICLE_SETUP_FLAG_NEON_BACK)
ENDIF
IF GET_VEHICLE_NEON_ENABLED(vehID, NEON_LEFT)
SET_BIT(g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].iFlags, VEHICLE_SETUP_FLAG_NEON_LEFT)
ELSE
CLEAR_BIT(g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].iFlags, VEHICLE_SETUP_FLAG_NEON_LEFT)
ENDIF
IF GET_VEHICLE_NEON_ENABLED(vehID, NEON_RIGHT)
SET_BIT(g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].iFlags, VEHICLE_SETUP_FLAG_NEON_RIGHT)
ELSE
CLEAR_BIT(g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].iFlags, VEHICLE_SETUP_FLAG_NEON_RIGHT)
ENDIF
g_savedGlobals.sPlayerData.sInfo.eLastVehicleSentToCloudSavehouse[ePed] = NUMBER_OF_SAVEHOUSE_LOCATIONS
IF GET_VEHICLE_MOD_KIT(vehID) >= 0
AND IS_VEHICLE_SAFE_FOR_MOD_SHOP(vehID, FALSE, eFailReason)
GET_VEHICLE_MOD_DATA(vehID, g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].iModIndex, g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].iModVariation)
// Overwrite the CarApp data
IF bUpdateCarApp
// Game data
g_savedGlobals.sSocialData.sCarAppData[ePed].bSendDataToCloud = TRUE
// Vehicle data
g_savedGlobals.sSocialData.sCarAppData[ePed].eModel = g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].model
g_savedGlobals.sSocialData.sCarAppData[ePed].iWindowTint = g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].iWindowTintColour
g_savedGlobals.sSocialData.sCarAppData[ePed].iTyreSmokeR = g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].iTyreR
g_savedGlobals.sSocialData.sCarAppData[ePed].iTyreSmokeG = g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].iTyreG
g_savedGlobals.sSocialData.sCarAppData[ePed].iTyreSmokeB = g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].iTyreB
g_savedGlobals.sSocialData.sCarAppData[ePed].iWheelType = g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].iWheelType
g_savedGlobals.sSocialData.sCarAppData[ePed].bBulletProofTyres = (NOT g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].bTyresCanBurst)
g_savedGlobals.sSocialData.sCarAppData[ePed].tlPlateText = g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].tlNumberPlate
g_savedGlobals.sSocialData.sCarAppData[ePed].iPlateBack = g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].iPlateBack
g_savedGlobals.sSocialData.sCarAppData[ePed].iEngine = g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].iModIndex[MOD_ENGINE]
g_savedGlobals.sSocialData.sCarAppData[ePed].iBrakes = g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].iModIndex[MOD_BRAKES]
g_savedGlobals.sSocialData.sCarAppData[ePed].iWheels = g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].iModIndex[MOD_WHEELS]
g_savedGlobals.sSocialData.sCarAppData[ePed].iExhaust = g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].iModIndex[MOD_EXHAUST]
g_savedGlobals.sSocialData.sCarAppData[ePed].iSuspension = g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].iModIndex[MOD_SUSPENSION]
g_savedGlobals.sSocialData.sCarAppData[ePed].iArmour = g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].iModIndex[MOD_ARMOUR]
g_savedGlobals.sSocialData.sCarAppData[ePed].iHorn = g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].iModIndex[MOD_HORN]
g_savedGlobals.sSocialData.sCarAppData[ePed].iLights = g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].iModIndex[MOD_TOGGLE_XENON_LIGHTS]
g_savedGlobals.sSocialData.sCarAppData[ePed].iTyreSmoke = g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].iModIndex[MOD_TOGGLE_TYRE_SMOKE]
g_savedGlobals.sSocialData.sCarAppData[ePed].iTurbo = g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].iModIndex[MOD_TOGGLE_TURBO]
g_savedGlobals.sSocialData.sCarAppData[ePed].iModCountEngine = GET_NUM_VEHICLE_MODS(vehID, MOD_ENGINE)+1
g_savedGlobals.sSocialData.sCarAppData[ePed].iModCountBrakes = GET_NUM_VEHICLE_MODS(vehID, MOD_BRAKES)+1
g_savedGlobals.sSocialData.sCarAppData[ePed].iModCountExhaust = GET_NUM_VEHICLE_MODS(vehID, MOD_EXHAUST)+1
g_savedGlobals.sSocialData.sCarAppData[ePed].iModCountWheels = GET_NUM_VEHICLE_MODS(vehID, MOD_WHEELS)+1
g_savedGlobals.sSocialData.sCarAppData[ePed].iModCountHorn = GET_NUM_VEHICLE_MODS(vehID, MOD_HORN)+1
g_savedGlobals.sSocialData.sCarAppData[ePed].iModCountArmour = GET_NUM_VEHICLE_MODS(vehID, MOD_ARMOUR)+1
g_savedGlobals.sSocialData.sCarAppData[ePed].iModCountSuspension = GET_NUM_VEHICLE_MODS(vehID, MOD_SUSPENSION)+1
g_savedGlobals.sSocialData.sCarAppData[ePed].iModColoursThatCanBeSet = GET_VEHICLE_COLOURS_WHICH_CAN_BE_SET(vehID)
g_savedGlobals.sSocialData.sCarAppData[ePed].iHornHash[0] = GET_VEHICLE_DEFAULT_HORN(vehID)
g_savedGlobals.sSocialData.sCarAppData[ePed].iHornHash[1] = GET_VEHICLE_MOD_MODIFIER_VALUE(vehID, MOD_HORN, 0)
g_savedGlobals.sSocialData.sCarAppData[ePed].iHornHash[2] = GET_VEHICLE_MOD_MODIFIER_VALUE(vehID, MOD_HORN, 1)
g_savedGlobals.sSocialData.sCarAppData[ePed].iHornHash[3] = GET_VEHICLE_MOD_MODIFIER_VALUE(vehID, MOD_HORN, 2)
g_savedGlobals.sSocialData.sCarAppData[ePed].iHornHash[4] = GET_VEHICLE_MOD_MODIFIER_VALUE(vehID, MOD_HORN, 3)
g_savedGlobals.sSocialData.sCarAppData[ePed].eModKitType = GET_VEHICLE_MOD_KIT_TYPE(vehID)
g_savedGlobals.sSocialData.sCarAppData[ePed].fModPriceModifier = GET_VEHICLE_MOD_PRICE_MODIFIER(vehID)
#IF USE_TU_CHANGES
g_savedGlobals.sSocialData.sCarAppData[ePed].iHornHash[0] = GET_VEHICLE_DEFAULT_HORN_IGNORE_MODS(vehID)
#ENDIF
INT iColGroup
MOD_COLOR_TYPE colorType
INT baseCol, specCol
GET_VEHICLE_MOD_COLOR_1(vehID, colorType, baseCol, specCol)
IF colorType = MCT_METALLIC
iColGroup = 0
ELIF colorType = MCT_CLASSIC
iColGroup = 1
ELIF colorType = MCT_MATTE
iColGroup = 2
ELIF colorType = MCT_METALS
iColGroup = 3
ELIF colorType = MCT_CHROME
iColGroup = 4
ELSE
iColGroup = -1
ENDIF
GET_CAR_APP_COLOUR_INDEX_FROM_VEHICLE_COLOUR(g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].iColour1, g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].iColourExtra1, iColGroup, TRUE, g_savedGlobals.sSocialData.sCarAppData[ePed].iColourID1)
GET_VEHICLE_MOD_COLOR_2(vehID, colorType, baseCol)
IF colorType = MCT_METALLIC
iColGroup = 0
ELIF colorType = MCT_CLASSIC
iColGroup = 1
ELIF colorType = MCT_MATTE
iColGroup = 2
ELIF colorType = MCT_METALS
iColGroup = 3
ELIF colorType = MCT_CHROME
iColGroup = 4
ELSE
iColGroup = -1
ENDIF
GET_CAR_APP_COLOUR_INDEX_FROM_VEHICLE_COLOUR(g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[iVehicleSlot][ePed].iColour2, -1, iColGroup, FALSE, g_savedGlobals.sSocialData.sCarAppData[ePed].iColourID2)
PRINTLN("UPDATE_PLAYER_PED_SAVED_VEHICLE() - Car App globals updated with new vehicle data")
PRINTLN("iColourID1 = ", g_savedGlobals.sSocialData.sCarAppData[ePed].iColourID1)
PRINTLN("iColourID2 = ", g_savedGlobals.sSocialData.sCarAppData[ePed].iColourID2)
PRINTLN("iWindowTint = ", g_savedGlobals.sSocialData.sCarAppData[ePed].iWindowTint)
PRINTLN("iTyreSmoke = ", g_savedGlobals.sSocialData.sCarAppData[ePed].iTyreSmoke)
PRINTLN("iEngine = ", g_savedGlobals.sSocialData.sCarAppData[ePed].iEngine)
PRINTLN("iExhaust = ", g_savedGlobals.sSocialData.sCarAppData[ePed].iExhaust)
PRINTLN("iBrakes = ", g_savedGlobals.sSocialData.sCarAppData[ePed].iBrakes)
PRINTLN("iWheels = ", g_savedGlobals.sSocialData.sCarAppData[ePed].iWheels)
PRINTLN("iSuspension = ", g_savedGlobals.sSocialData.sCarAppData[ePed].iSuspension)
PRINTLN("iHorn = ", g_savedGlobals.sSocialData.sCarAppData[ePed].iHorn)
PRINTLN("iLights = ", g_savedGlobals.sSocialData.sCarAppData[ePed].iLights)
PRINTLN("iTurbo = ", g_savedGlobals.sSocialData.sCarAppData[ePed].iTurbo)
PRINTLN("iArmour = ", g_savedGlobals.sSocialData.sCarAppData[ePed].iArmour)
ENDIF
ENDIF
#endif
#endif
ENDIF
ENDPROC
/// PURPOSE: Sets the details for the npc peds stored vehicle
PROC UPDATE_NPC_PED_SAVED_VEHICLE(enumCharacterList ePed, VEHICLE_INDEX &vehID, INT iVehicleSlot)
IF DOES_ENTITY_EXIST(vehID)
AND IS_VEHICLE_DRIVEABLE(vehID)
INT iPed
IF ePed = CHAR_AMANDA
iPed = 0
ELIF ePed = CHAR_TRACEY
iPed = 1
ELSE
#IF IS_DEBUG_BUILD
PRINTLN("UPDATE_NPC_PED_SAVED_VEHICLE() - Unable to update vehicle, ped ID out of range, ePed=", ePed)
SCRIPT_ASSERT("UPDATE_NPC_PED_SAVED_VEHICLE() - Unable to update vehicle, ped ID out of range")
#ENDIF
EXIT
ENDIF
#if USE_CLF_DLC
IF iVehicleSlot > COUNT_OF(g_savedGlobalsClifford.sPlayerData.sInfo.sNPCVehicle)
#IF IS_DEBUG_BUILD
PRINTLN("UPDATE_NPC_PED_SAVED_VEHICLE() - Unable to update vehicle, slot ID out of range, iVehicleSlot=", iVehicleSlot)
SCRIPT_ASSERT("UPDATE_NPC_PED_SAVED_VEHICLE() - Unable to update vehicle, slot ID out of range")
#ENDIF
EXIT
ENDIF
#endif
#if USE_NRM_DLC
IF iVehicleSlot > COUNT_OF(g_savedGlobalsnorman.sPlayerData.sInfo.sNPCVehicle)
#IF IS_DEBUG_BUILD
PRINTLN("UPDATE_NPC_PED_SAVED_VEHICLE() - Unable to update vehicle, slot ID out of range, iVehicleSlot=", iVehicleSlot)
SCRIPT_ASSERT("UPDATE_NPC_PED_SAVED_VEHICLE() - Unable to update vehicle, slot ID out of range")
#ENDIF
EXIT
ENDIF
#endif
#if not USE_CLF_DLC
#if not USE_NRM_DLC
IF iVehicleSlot > COUNT_OF(g_savedGlobals.sPlayerData.sInfo.sNPCVehicle)
#IF IS_DEBUG_BUILD
PRINTLN("UPDATE_NPC_PED_SAVED_VEHICLE() - Unable to update vehicle, slot ID out of range, iVehicleSlot=", iVehicleSlot)
SCRIPT_ASSERT("UPDATE_NPC_PED_SAVED_VEHICLE() - Unable to update vehicle, slot ID out of range")
#ENDIF
EXIT
ENDIF
#endif
#endif
// Slot specific updates/checks.
IF iVehicleSlot = SAVED_VEHICLE_SLOT_CAR
#IF IS_DEBUG_BUILD
PRINTLN("UPDATE_NPC_PED_SAVED_VEHICLE() - Updating sNPCVehicle[SAVED_VEHICLE_SLOT_CAR] for ", GET_PLAYER_PED_STRING(ePed))
#ENDIF
// Nothing to do.
ENDIF
IF GET_NUM_MOD_KITS(vehID) != 0
SET_VEHICLE_MOD_KIT(vehID, 0)
ENDIF
#if USE_CLF_DLC
g_savedGlobalsClifford.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].model = GET_ENTITY_MODEL(vehID)
VEHICLE_INDEX vehTrailer
IF GET_VEHICLE_TRAILER_VEHICLE(vehID, vehTrailer)
g_savedGlobalsClifford.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].modelTrailer = GET_ENTITY_MODEL(vehTrailer)
PRINTSTRING("update npc: there is a trailer")PRINTNL()
ELSE
PRINTSTRING("update npc: there is no trailer")PRINTNL()
ENDIF
g_savedGlobalsClifford.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].fDirtLevel = GET_VEHICLE_DIRT_LEVEL(vehID)
g_savedGlobalsClifford.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].fHealth = GET_ENTITY_HEALTH(vehID)
g_savedGlobalsClifford.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].bExtraOn[0] = IS_VEHICLE_EXTRA_TURNED_ON(vehID, 1)
g_savedGlobalsClifford.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].bExtraOn[1] = IS_VEHICLE_EXTRA_TURNED_ON(vehID, 2)
g_savedGlobalsClifford.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].bExtraOn[2] = IS_VEHICLE_EXTRA_TURNED_ON(vehID, 3)
g_savedGlobalsClifford.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].bExtraOn[3] = IS_VEHICLE_EXTRA_TURNED_ON(vehID, 4)
g_savedGlobalsClifford.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].bExtraOn[4] = IS_VEHICLE_EXTRA_TURNED_ON(vehID, 5)
g_savedGlobalsClifford.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].bExtraOn[5] = IS_VEHICLE_EXTRA_TURNED_ON(vehID, 6)
g_savedGlobalsClifford.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].bExtraOn[6] = IS_VEHICLE_EXTRA_TURNED_ON(vehID, 7)
g_savedGlobalsClifford.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].bExtraOn[7] = IS_VEHICLE_EXTRA_TURNED_ON(vehID, 8)
g_savedGlobalsClifford.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].bExtraOn[8] = IS_VEHICLE_EXTRA_TURNED_ON(vehID, 9)
g_savedGlobalsClifford.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].bExtraOn[9] = IS_VEHICLE_EXTRA_TURNED_ON(vehID, 10)
g_savedGlobalsClifford.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].bExtraOn[10] = IS_VEHICLE_EXTRA_TURNED_ON(vehID, 11)
g_savedGlobalsClifford.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].bExtraOn[11] = IS_VEHICLE_EXTRA_TURNED_ON(vehID, 12)
IF IS_VEHICLE_A_CONVERTIBLE(vehID)
CONVERTIBLE_ROOF_STATE eRoofState = GET_CONVERTIBLE_ROOF_STATE(vehID)
IF eRoofState = CRS_RAISED
OR eRoofState = CRS_ROOF_STUCK_RAISED
g_savedGlobalsClifford.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].bConvertible = TRUE
ELSE
g_savedGlobalsClifford.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].bConvertible = FALSE
ENDIF
ELSE
g_savedGlobalsClifford.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].bConvertible = FALSE
ENDIF
g_savedGlobalsClifford.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].iRadioIndex = GET_PLAYER_RADIO_STATION_INDEX()
g_savedGlobalsClifford.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].tlNumberPlate = GET_VEHICLE_NUMBER_PLATE_TEXT(vehID)
g_savedGlobalsClifford.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].iPlateBack = GET_VEHICLE_NUMBER_PLATE_TEXT_INDEX(vehID)
GET_VEHICLE_COLOURS(vehID, g_savedGlobalsClifford.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].iColour1, g_savedGlobalsClifford.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].iColour2)
GET_VEHICLE_EXTRA_COLOURS(vehID, g_savedGlobalsClifford.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].iColourExtra1, g_savedGlobalsClifford.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].iColourExtra2)
GET_VEHICLE_TYRE_SMOKE_COLOR(vehID, g_savedGlobalsClifford.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].iTyreR, g_savedGlobalsClifford.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].iTyreG, g_savedGlobalsClifford.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].iTyreB)
g_savedGlobalsClifford.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].bTyresCanBurst = GET_VEHICLE_TYRES_CAN_BURST(vehID)
g_savedGlobalsClifford.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].iWindowTintColour = GET_VEHICLE_WINDOW_TINT(vehID)
g_savedGlobalsClifford.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].iLivery = GET_VEHICLE_LIVERY(vehID)
g_savedGlobalsClifford.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].iWheelType = ENUM_TO_INT(GET_VEHICLE_WHEEL_TYPE(vehID))
// Neon lights
GET_VEHICLE_NEON_COLOUR(vehID, g_savedGlobalsClifford.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].iNeonR, g_savedGlobalsClifford.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].iNeonG, g_savedGlobalsClifford.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].iNeonB)
IF GET_VEHICLE_NEON_ENABLED(vehID, NEON_FRONT)
SET_BIT(g_savedGlobalsClifford.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].iFlags, VEHICLE_SETUP_FLAG_NEON_FRONT)
ELSE
CLEAR_BIT(g_savedGlobalsClifford.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].iFlags, VEHICLE_SETUP_FLAG_NEON_FRONT)
ENDIF
IF GET_VEHICLE_NEON_ENABLED(vehID, NEON_BACK)
SET_BIT(g_savedGlobalsClifford.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].iFlags, VEHICLE_SETUP_FLAG_NEON_BACK)
ELSE
CLEAR_BIT(g_savedGlobalsClifford.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].iFlags, VEHICLE_SETUP_FLAG_NEON_BACK)
ENDIF
IF GET_VEHICLE_NEON_ENABLED(vehID, NEON_LEFT)
SET_BIT(g_savedGlobalsClifford.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].iFlags, VEHICLE_SETUP_FLAG_NEON_LEFT)
ELSE
CLEAR_BIT(g_savedGlobalsClifford.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].iFlags, VEHICLE_SETUP_FLAG_NEON_LEFT)
ENDIF
IF GET_VEHICLE_NEON_ENABLED(vehID, NEON_RIGHT)
SET_BIT(g_savedGlobalsClifford.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].iFlags, VEHICLE_SETUP_FLAG_NEON_RIGHT)
ELSE
CLEAR_BIT(g_savedGlobalsClifford.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].iFlags, VEHICLE_SETUP_FLAG_NEON_RIGHT)
ENDIF
IF GET_VEHICLE_MOD_KIT(vehID) >= 0
GET_VEHICLE_MOD_DATA(vehID, g_savedGlobalsClifford.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].iModIndex, g_savedGlobalsClifford.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].iModVariation)
ENDIF
#endif
#if USE_NRM_DLC
g_savedGlobalsnorman.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].model = GET_ENTITY_MODEL(vehID)
VEHICLE_INDEX vehTrailer
IF GET_VEHICLE_TRAILER_VEHICLE(vehID, vehTrailer)
g_savedGlobalsnorman.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].modelTrailer = GET_ENTITY_MODEL(vehTrailer)
PRINTSTRING("update npc: there is a trailer")PRINTNL()
ELSE
PRINTSTRING("update npc: there is no trailer")PRINTNL()
ENDIF
g_savedGlobalsnorman.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].fDirtLevel = GET_VEHICLE_DIRT_LEVEL(vehID)
g_savedGlobalsnorman.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].fHealth = GET_ENTITY_HEALTH(vehID)
g_savedGlobalsnorman.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].bExtraOn[0] = IS_VEHICLE_EXTRA_TURNED_ON(vehID, 1)
g_savedGlobalsnorman.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].bExtraOn[1] = IS_VEHICLE_EXTRA_TURNED_ON(vehID, 2)
g_savedGlobalsnorman.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].bExtraOn[2] = IS_VEHICLE_EXTRA_TURNED_ON(vehID, 3)
g_savedGlobalsnorman.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].bExtraOn[3] = IS_VEHICLE_EXTRA_TURNED_ON(vehID, 4)
g_savedGlobalsnorman.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].bExtraOn[4] = IS_VEHICLE_EXTRA_TURNED_ON(vehID, 5)
g_savedGlobalsnorman.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].bExtraOn[5] = IS_VEHICLE_EXTRA_TURNED_ON(vehID, 6)
g_savedGlobalsnorman.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].bExtraOn[6] = IS_VEHICLE_EXTRA_TURNED_ON(vehID, 7)
g_savedGlobalsnorman.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].bExtraOn[7] = IS_VEHICLE_EXTRA_TURNED_ON(vehID, 8)
g_savedGlobalsnorman.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].bExtraOn[8] = IS_VEHICLE_EXTRA_TURNED_ON(vehID, 9)
IF IS_VEHICLE_A_CONVERTIBLE(vehID)
CONVERTIBLE_ROOF_STATE eRoofState = GET_CONVERTIBLE_ROOF_STATE(vehID)
IF eRoofState = CRS_RAISED
OR eRoofState = CRS_ROOF_STUCK_RAISED
g_savedGlobalsnorman.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].bConvertible = TRUE
ELSE
g_savedGlobalsnorman.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].bConvertible = FALSE
ENDIF
ELSE
g_savedGlobalsnorman.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].bConvertible = FALSE
ENDIF
g_savedGlobalsnorman.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].iRadioIndex = GET_PLAYER_RADIO_STATION_INDEX()
g_savedGlobalsnorman.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].tlNumberPlate = GET_VEHICLE_NUMBER_PLATE_TEXT(vehID)
g_savedGlobalsnorman.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].iPlateBack = GET_VEHICLE_NUMBER_PLATE_TEXT_INDEX(vehID)
GET_VEHICLE_COLOURS(vehID, g_savedGlobalsnorman.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].iColour1, g_savedGlobalsnorman.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].iColour2)
GET_VEHICLE_EXTRA_COLOURS(vehID, g_savedGlobalsnorman.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].iColourExtra1, g_savedGlobalsnorman.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].iColourExtra2)
GET_VEHICLE_TYRE_SMOKE_COLOR(vehID, g_savedGlobalsnorman.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].iTyreR, g_savedGlobalsnorman.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].iTyreG, g_savedGlobalsnorman.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].iTyreB)
g_savedGlobalsnorman.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].bTyresCanBurst = GET_VEHICLE_TYRES_CAN_BURST(vehID)
g_savedGlobalsnorman.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].iWindowTintColour = GET_VEHICLE_WINDOW_TINT(vehID)
g_savedGlobalsnorman.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].iLivery = GET_VEHICLE_LIVERY(vehID)
g_savedGlobalsnorman.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].iWheelType = ENUM_TO_INT(GET_VEHICLE_WHEEL_TYPE(vehID))
// Neon lights
GET_VEHICLE_NEON_COLOUR(vehID, g_savedGlobalsnorman.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].iNeonR, g_savedGlobalsnorman.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].iNeonG, g_savedGlobalsnorman.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].iNeonB)
IF GET_VEHICLE_NEON_ENABLED(vehID, NEON_FRONT)
SET_BIT(g_savedGlobalsnorman.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].iFlags, VEHICLE_SETUP_FLAG_NEON_FRONT)
ELSE
CLEAR_BIT(g_savedGlobalsnorman.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].iFlags, VEHICLE_SETUP_FLAG_NEON_FRONT)
ENDIF
IF GET_VEHICLE_NEON_ENABLED(vehID, NEON_BACK)
SET_BIT(g_savedGlobalsnorman.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].iFlags, VEHICLE_SETUP_FLAG_NEON_BACK)
ELSE
CLEAR_BIT(g_savedGlobalsnorman.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].iFlags, VEHICLE_SETUP_FLAG_NEON_BACK)
ENDIF
IF GET_VEHICLE_NEON_ENABLED(vehID, NEON_LEFT)
SET_BIT(g_savedGlobalsnorman.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].iFlags, VEHICLE_SETUP_FLAG_NEON_LEFT)
ELSE
CLEAR_BIT(g_savedGlobalsnorman.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].iFlags, VEHICLE_SETUP_FLAG_NEON_LEFT)
ENDIF
IF GET_VEHICLE_NEON_ENABLED(vehID, NEON_RIGHT)
SET_BIT(g_savedGlobalsnorman.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].iFlags, VEHICLE_SETUP_FLAG_NEON_RIGHT)
ELSE
CLEAR_BIT(g_savedGlobalsnorman.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].iFlags, VEHICLE_SETUP_FLAG_NEON_RIGHT)
ENDIF
IF GET_VEHICLE_MOD_KIT(vehID) >= 0
GET_VEHICLE_MOD_DATA(vehID, g_savedGlobalsnorman.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].iModIndex, g_savedGlobalsnorman.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].iModVariation)
ENDIF
#endif
#if not USE_CLF_DLC
#if not USE_NRM_DLC
g_savedGlobals.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].model = GET_ENTITY_MODEL(vehID)
VEHICLE_INDEX vehTrailer
IF GET_VEHICLE_TRAILER_VEHICLE(vehID, vehTrailer)
g_savedGlobals.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].modelTrailer = GET_ENTITY_MODEL(vehTrailer)
PRINTSTRING("update npc: there is a trailer")PRINTNL()
ELSE
PRINTSTRING("update npc: there is no trailer")PRINTNL()
ENDIF
g_savedGlobals.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].fDirtLevel = GET_VEHICLE_DIRT_LEVEL(vehID)
g_savedGlobals.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].fHealth = GET_ENTITY_HEALTH(vehID)
g_savedGlobals.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].bExtraOn[0] = IS_VEHICLE_EXTRA_TURNED_ON(vehID, 1)
g_savedGlobals.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].bExtraOn[1] = IS_VEHICLE_EXTRA_TURNED_ON(vehID, 2)
g_savedGlobals.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].bExtraOn[2] = IS_VEHICLE_EXTRA_TURNED_ON(vehID, 3)
g_savedGlobals.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].bExtraOn[3] = IS_VEHICLE_EXTRA_TURNED_ON(vehID, 4)
g_savedGlobals.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].bExtraOn[4] = IS_VEHICLE_EXTRA_TURNED_ON(vehID, 5)
g_savedGlobals.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].bExtraOn[5] = IS_VEHICLE_EXTRA_TURNED_ON(vehID, 6)
g_savedGlobals.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].bExtraOn[6] = IS_VEHICLE_EXTRA_TURNED_ON(vehID, 7)
g_savedGlobals.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].bExtraOn[7] = IS_VEHICLE_EXTRA_TURNED_ON(vehID, 8)
g_savedGlobals.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].bExtraOn[8] = IS_VEHICLE_EXTRA_TURNED_ON(vehID, 9)
g_savedGlobals.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].bExtraOn[9] = IS_VEHICLE_EXTRA_TURNED_ON(vehID, 10)
g_savedGlobals.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].bExtraOn[10] = IS_VEHICLE_EXTRA_TURNED_ON(vehID, 11)
g_savedGlobals.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].bExtraOn[11] = IS_VEHICLE_EXTRA_TURNED_ON(vehID, 12)
IF IS_VEHICLE_A_CONVERTIBLE(vehID)
CONVERTIBLE_ROOF_STATE eRoofState = GET_CONVERTIBLE_ROOF_STATE(vehID)
IF eRoofState = CRS_RAISED
OR eRoofState = CRS_ROOF_STUCK_RAISED
g_savedGlobals.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].bConvertible = TRUE
ELSE
g_savedGlobals.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].bConvertible = FALSE
ENDIF
ELSE
g_savedGlobals.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].bConvertible = FALSE
ENDIF
g_savedGlobals.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].iRadioIndex = GET_PLAYER_RADIO_STATION_INDEX()
g_savedGlobals.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].tlNumberPlate = GET_VEHICLE_NUMBER_PLATE_TEXT(vehID)
g_savedGlobals.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].iPlateBack = GET_VEHICLE_NUMBER_PLATE_TEXT_INDEX(vehID)
GET_VEHICLE_COLOURS(vehID, g_savedGlobals.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].iColour1, g_savedGlobals.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].iColour2)
GET_VEHICLE_EXTRA_COLOURS(vehID, g_savedGlobals.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].iColourExtra1, g_savedGlobals.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].iColourExtra2)
GET_VEHICLE_TYRE_SMOKE_COLOR(vehID, g_savedGlobals.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].iTyreR, g_savedGlobals.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].iTyreG, g_savedGlobals.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].iTyreB)
g_savedGlobals.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].bTyresCanBurst = GET_VEHICLE_TYRES_CAN_BURST(vehID)
g_savedGlobals.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].iWindowTintColour = GET_VEHICLE_WINDOW_TINT(vehID)
g_savedGlobals.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].iLivery = GET_VEHICLE_LIVERY(vehID)
g_savedGlobals.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].iWheelType = ENUM_TO_INT(GET_VEHICLE_WHEEL_TYPE(vehID))
// Neon lights
GET_VEHICLE_NEON_COLOUR(vehID, g_savedGlobals.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].iNeonR, g_savedGlobals.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].iNeonG, g_savedGlobals.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].iNeonB)
IF GET_VEHICLE_NEON_ENABLED(vehID, NEON_FRONT)
SET_BIT(g_savedGlobals.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].iFlags, VEHICLE_SETUP_FLAG_NEON_FRONT)
ELSE
CLEAR_BIT(g_savedGlobals.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].iFlags, VEHICLE_SETUP_FLAG_NEON_FRONT)
ENDIF
IF GET_VEHICLE_NEON_ENABLED(vehID, NEON_BACK)
SET_BIT(g_savedGlobals.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].iFlags, VEHICLE_SETUP_FLAG_NEON_BACK)
ELSE
CLEAR_BIT(g_savedGlobals.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].iFlags, VEHICLE_SETUP_FLAG_NEON_BACK)
ENDIF
IF GET_VEHICLE_NEON_ENABLED(vehID, NEON_LEFT)
SET_BIT(g_savedGlobals.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].iFlags, VEHICLE_SETUP_FLAG_NEON_LEFT)
ELSE
CLEAR_BIT(g_savedGlobals.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].iFlags, VEHICLE_SETUP_FLAG_NEON_LEFT)
ENDIF
IF GET_VEHICLE_NEON_ENABLED(vehID, NEON_RIGHT)
SET_BIT(g_savedGlobals.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].iFlags, VEHICLE_SETUP_FLAG_NEON_RIGHT)
ELSE
CLEAR_BIT(g_savedGlobals.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].iFlags, VEHICLE_SETUP_FLAG_NEON_RIGHT)
ENDIF
IF GET_VEHICLE_MOD_KIT(vehID) >= 0
GET_VEHICLE_MOD_DATA(vehID, g_savedGlobals.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].iModIndex, g_savedGlobals.sPlayerData.sInfo.sNPCVehicle[iVehicleSlot][iPed].iModVariation)
ENDIF
#endif
#endif
ENDIF
ENDPROC
/// PURPOSE: Checks if a coord is contained within the area defined by a Vector ID.
///
/// PARAM NOTES: vPosition - The coord being checked for containment within the Vector ID.
/// eVectorID - An enum referencing the Vector ID having its area queried.
/// RETURN: A BOOL that will be TRUE if the coord is contained within the Vector ID's area.
FUNC BOOL IS_COORD_IN_VECTOR_ID_AREA_for_autosave(VECTOR vPosition, VectorID eVectorID)
IF eVectorID != VID_BLANK
IF VDIST2(vPosition, g_sVectorIDData[eVectorID].position) <= (g_sVectorIDData[eVectorID].radius*g_sVectorIDData[eVectorID].radius)
RETURN TRUE
ELIF g_sVectorIDData[eVectorID].extensionID != VID_BLANK
RETURN IS_COORD_IN_VECTOR_ID_AREA_for_autosave(vPosition, g_sVectorIDData[eVectorID].extensionID)
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
#if USE_CLF_DLC
FUNC BOOL CHECK_PLAYER_MISSION_BLIPS_on_autosaveCLF()
CONST_FLOAT fCONST_MIN_MISSION_DIST_FROM_SAFEHOUSE 50.0
CONST_FLOAT fCONST_MIN_COORD_DIST_FROM_SAFEHOUSE 30.0
PED_INDEX pedID = PLAYER_PED_ID()
IF IS_PED_INJURED(pedID)
SCRIPT_ASSERT("IS_PED_INJURED(pedID) //CHECK_PLAYER_MISSION_BLIPS_on_autosave()")
RETURN FALSE
ENDIF
#IF IS_DEBUG_BUILD
INT iValidMissions = 0
STATIC_BLIP_NAME_ENUM eClosestMissionBlip = STATIC_BLIP_NAME_DUMMY_FINAL
PRINTLN("CHECK_PLAYER_MISSION_BLIPS_on_autosave ", GET_CURRENT_PLAYER_PED_STRING())
#ENDIF
// IF g_savedGlobalsClifford.sFlow.controls.flagIDs[FLOWFLAG_BLOCK_SAVEHOUSE_FOR_AUTOSAVE] //Get_Mission_Flow_Flag_State[]
// PRINTLN(" FLOWFLAG - block safehouse for autosave")
// RETURN TRUE
// ENDIF
// * SAFEHOUSE BLIPS #939375 * //
VECTOR vSavehouseCoord = <<0,0,0>>
FLOAT fReturnHeading = 0
IF OVERRIDE_SAVE_HOUSE(FALSE, <<0,0,0>>, 0, TRUE, vSavehouseCoord, fReturnHeading)
//Check for mission triggers to avoid on loading.
INT iTriggerIndex
REPEAT MAX_MISSION_TRIGGERS_TU iTriggerIndex
IF g_TriggerableMissionsTU[iTriggerIndex].bUsed
IF g_TriggerableMissionsTU[iTriggerIndex].eType = MISSION_TRIGGER_TYPE_SCENE
IF g_TriggerableMissionsTU[iTriggerIndex].eMissionID != SP_MISSION_NONE
STATIC_BLIP_NAME_ENUM eMissionBlip = g_sMissionStaticData[g_TriggerableMissionsTU[iTriggerIndex].eMissionID].blip
IF eMissionBlip != STATIC_BLIP_NAME_DUMMY_FINAL
VECTOR vMissionCoord
IF IS_BIT_SET(g_GameBlips[eMissionBlip].iSetting, STATIC_BLIP_SETTING_MULTI_COORD_AND_SPRITE)
IF IS_PLAYER_PED_PLAYABLE(GET_CURRENT_PLAYER_PED_ENUM())
vMissionCoord = g_GameBlips[eMissionBlip].vCoords[GET_CURRENT_PLAYER_PED_INT()]
ELSE
vMissionCoord = g_GameBlips[eMissionBlip].vCoords[0]
ENDIF
ELSE
vMissionCoord = g_GameBlips[eMissionBlip].vCoords[0]
ENDIF
FLOAT fSafehouseToBlipDist2 = VDIST2(vSavehouseCoord, vMissionCoord)
#IF IS_DEBUG_BUILD
PRINTSTRING(" eMissionBlip ")
PRINTINT(ENUM_TO_INT(eMissionBlip))
PRINTSTRING(" and iSavehouse at ")
PRINTVECTOR(vSavehouseCoord)
PRINTNL()
PRINTSTRING(" vMissionCoord: ")
PRINTFLOAT(SQRT(fSafehouseToBlipDist2))
PRINTSTRING(" [MAX:")
PRINTFLOAT(fCONST_MIN_MISSION_DIST_FROM_SAFEHOUSE)
PRINTSTRING("]")
PRINTNL()
#ENDIF
IF (fSafehouseToBlipDist2 < (fCONST_MIN_MISSION_DIST_FROM_SAFEHOUSE*fCONST_MIN_MISSION_DIST_FROM_SAFEHOUSE))
RETURN TRUE
ENDIF
#IF IS_DEBUG_BUILD
iValidMissions++
IF (eClosestMissionBlip >= STATIC_BLIP_NAME_DUMMY_FINAL)
eClosestMissionBlip = eMissionBlip
ELSE
FLOAT fSafehouseToClosestBlipDist = VDIST(vSavehouseCoord, g_GameBlips[eClosestMissionBlip].vCoords[0])
IF (SQRT(fSafehouseToBlipDist2) < fSafehouseToClosestBlipDist)
eClosestMissionBlip = eMissionBlip
ENDIF
ENDIF
#ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDREPEAT
//Check for running missions with blips to avoid on loading.
IF g_eRunningMission != SP_MISSION_NONE
STATIC_BLIP_NAME_ENUM eMissionBlip = g_sMissionStaticData[g_eRunningMission].blip
IF eMissionBlip != STATIC_BLIP_NAME_DUMMY_FINAL
VECTOR vMissionCoord
IF IS_BIT_SET(g_GameBlips[eMissionBlip].iSetting, STATIC_BLIP_SETTING_MULTI_COORD_AND_SPRITE)
IF IS_PLAYER_PED_PLAYABLE(GET_CURRENT_PLAYER_PED_ENUM())
vMissionCoord = g_GameBlips[eMissionBlip].vCoords[GET_CURRENT_PLAYER_PED_INT()]
ELSE
vMissionCoord = g_GameBlips[eMissionBlip].vCoords[0]
ENDIF
ELSE
vMissionCoord = g_GameBlips[eMissionBlip].vCoords[0]
ENDIF
FLOAT fSafehouseToBlipDist2 = VDIST2(vSavehouseCoord, vMissionCoord)
#IF IS_DEBUG_BUILD
PRINTSTRING(" g_eRunningMission ")
PRINTINT(ENUM_TO_INT(eMissionBlip))
PRINTSTRING(" and iSavehouse at ")
PRINTVECTOR(vSavehouseCoord)
PRINTNL()
PRINTSTRING(" vMissionCoord: ")
PRINTFLOAT(SQRT(fSafehouseToBlipDist2))
PRINTSTRING(" [MAX:")
PRINTFLOAT(fCONST_MIN_MISSION_DIST_FROM_SAFEHOUSE)
PRINTSTRING("]")
PRINTNL()
#ENDIF
IF (fSafehouseToBlipDist2 < (fCONST_MIN_MISSION_DIST_FROM_SAFEHOUSE*fCONST_MIN_MISSION_DIST_FROM_SAFEHOUSE))
RETURN TRUE
ENDIF
#IF IS_DEBUG_BUILD
iValidMissions++
IF (eClosestMissionBlip >= STATIC_BLIP_NAME_DUMMY_FINAL)
eClosestMissionBlip = eMissionBlip
ELSE
FLOAT fSafehouseToClosestBlipDist = VDIST(vSavehouseCoord, g_GameBlips[eClosestMissionBlip].vCoords[0])
IF (SQRT(fSafehouseToBlipDist2) < fSafehouseToClosestBlipDist)
eClosestMissionBlip = eMissionBlip
ENDIF
ENDIF
#ENDIF
ENDIF
ENDIF
// #1447979 //
INT iQueueGameTimer = GET_GAME_TIMER()
CONST_INT iCONST_QueueGameTimerMs 180000 //3min
INT index
REPEAT g_savedGlobalsClifford.sCommsControlData.iNoQueuedCalls index
VectorID eVectorID = g_savedGlobalsClifford.sCommsControlData.sQueuedCalls[index].sCommData.eRestrictedAreaID
IF eVectorID <> VID_BLANK
INT iQueuedCallsDelay = g_savedGlobalsClifford.sCommsControlData.sQueuedCalls[index].sCommData.iQueueTime - iQueueGameTimer
IF (iQueuedCallsDelay < iCONST_QueueGameTimerMs)
IF IS_COORD_IN_VECTOR_ID_AREA_for_autosave(vSavehouseCoord, eVectorID)
PRINTLN(" QUEUE CALLS - blocked for comms ", index, ".")
RETURN TRUE
ENDIF
ENDIF
ENDIF
ENDREPEAT
REPEAT g_savedGlobalsClifford.sCommsControlData.iNoQueuedTexts index
VectorID eVectorID = g_savedGlobalsClifford.sCommsControlData.sQueuedTexts[index].sCommData.eRestrictedAreaID
IF eVectorID <> VID_BLANK
INT iQueuedTextsDelay = g_savedGlobalsClifford.sCommsControlData.sQueuedTexts[index].sCommData.iQueueTime - iQueueGameTimer
IF (iQueuedTextsDelay < iCONST_QueueGameTimerMs)
IF IS_COORD_IN_VECTOR_ID_AREA_for_autosave(vSavehouseCoord, eVectorID)
PRINTLN(" QUEUE TEXTS - blocked for comms ", index, ".")
RETURN TRUE
ENDIF
ENDIF
ENDIF
ENDREPEAT
REPEAT g_savedGlobalsClifford.sCommsControlData.iNoQueuedEmails index
VectorID eVectorID = g_savedGlobalsClifford.sCommsControlData.sQueuedEmails[index].sCommData.eRestrictedAreaID
IF eVectorID <> VID_BLANK
INT iQueuedEmailsDelay = g_savedGlobalsClifford.sCommsControlData.sQueuedEmails[index].sCommData.iQueueTime - iQueueGameTimer
IF (iQueuedEmailsDelay < iCONST_QueueGameTimerMs)
IF IS_COORD_IN_VECTOR_ID_AREA_for_autosave(vSavehouseCoord, eVectorID)
PRINTLN(" QUEUE EMAILS - blocked for comms ", index, ".")
RETURN TRUE
ENDIF
ENDIF
ENDIF
ENDREPEAT
ENDIF
#IF IS_DEBUG_BUILD
PRINTLN(" iValidMissions:", iValidMissions, ", eClosestMissionBlip", ENUM_TO_INT(eClosestMissionBlip))
#ENDIF
RETURN FALSE
ENDFUNC
#endif
#if USE_NRM_DLC
FUNC BOOL CHECK_PLAYER_MISSION_BLIPS_on_autosaveNRM()
CONST_FLOAT fCONST_MIN_MISSION_DIST_FROM_SAFEHOUSE 50.0
CONST_FLOAT fCONST_MIN_COORD_DIST_FROM_SAFEHOUSE 30.0
PED_INDEX pedID = PLAYER_PED_ID()
IF IS_PED_INJURED(pedID)
SCRIPT_ASSERT("IS_PED_INJURED(pedID) //CHECK_PLAYER_MISSION_BLIPS_on_autosave()")
RETURN FALSE
ENDIF
#IF IS_DEBUG_BUILD
INT iValidMissions = 0
STATIC_BLIP_NAME_ENUM eClosestMissionBlip = STATIC_BLIP_NAME_DUMMY_FINAL
PRINTLN("CHECK_PLAYER_MISSION_BLIPS_on_autosave ", GET_CURRENT_PLAYER_PED_STRING())
#ENDIF
// IF g_savedGlobalsnorman.sFlow.controls.flagIDs[FLOWFLAG_BLOCK_SAVEHOUSE_FOR_AUTOSAVE] //Get_Mission_Flow_Flag_State[]
// PRINTLN(" FLOWFLAG - block safehouse for autosave")
// RETURN TRUE
// ENDIF
// * SAFEHOUSE BLIPS #939375 * //
VECTOR vSavehouseCoord = <<0,0,0>>
FLOAT fReturnHeading = 0
IF OVERRIDE_SAVE_HOUSE(FALSE, <<0,0,0>>, 0, TRUE, vSavehouseCoord, fReturnHeading)
//Check for mission triggers to avoid on loading.
INT iTriggerIndex
REPEAT MAX_MISSION_TRIGGERS_TU iTriggerIndex
IF g_TriggerableMissionsTU[iTriggerIndex].bUsed
IF g_TriggerableMissionsTU[iTriggerIndex].eType = MISSION_TRIGGER_TYPE_SCENE
IF g_TriggerableMissionsTU[iTriggerIndex].eMissionID != SP_MISSION_NONE
STATIC_BLIP_NAME_ENUM eMissionBlip = g_sMissionStaticData[g_TriggerableMissionsTU[iTriggerIndex].eMissionID].blip
IF eMissionBlip != STATIC_BLIP_NAME_DUMMY_FINAL
VECTOR vMissionCoord
IF IS_BIT_SET(g_GameBlips[eMissionBlip].iSetting, STATIC_BLIP_SETTING_MULTI_COORD_AND_SPRITE)
IF IS_PLAYER_PED_PLAYABLE(GET_CURRENT_PLAYER_PED_ENUM())
vMissionCoord = g_GameBlips[eMissionBlip].vCoords[GET_CURRENT_PLAYER_PED_INT()]
ELSE
vMissionCoord = g_GameBlips[eMissionBlip].vCoords[0]
ENDIF
ELSE
vMissionCoord = g_GameBlips[eMissionBlip].vCoords[0]
ENDIF
FLOAT fSafehouseToBlipDist2 = VDIST2(vSavehouseCoord, vMissionCoord)
#IF IS_DEBUG_BUILD
PRINTSTRING(" eMissionBlip ")
PRINTINT(ENUM_TO_INT(eMissionBlip))
PRINTSTRING(" and iSavehouse at ")
PRINTVECTOR(vSavehouseCoord)
PRINTNL()
PRINTSTRING(" vMissionCoord: ")
PRINTFLOAT(SQRT(fSafehouseToBlipDist2))
PRINTSTRING(" [MAX:")
PRINTFLOAT(fCONST_MIN_MISSION_DIST_FROM_SAFEHOUSE)
PRINTSTRING("]")
PRINTNL()
#ENDIF
IF (fSafehouseToBlipDist2 < (fCONST_MIN_MISSION_DIST_FROM_SAFEHOUSE*fCONST_MIN_MISSION_DIST_FROM_SAFEHOUSE))
RETURN TRUE
ENDIF
#IF IS_DEBUG_BUILD
iValidMissions++
IF (eClosestMissionBlip >= STATIC_BLIP_NAME_DUMMY_FINAL)
eClosestMissionBlip = eMissionBlip
ELSE
FLOAT fSafehouseToClosestBlipDist = VDIST(vSavehouseCoord, g_GameBlips[eClosestMissionBlip].vCoords[0])
IF (SQRT(fSafehouseToBlipDist2) < fSafehouseToClosestBlipDist)
eClosestMissionBlip = eMissionBlip
ENDIF
ENDIF
#ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDREPEAT
//Check for running missions with blips to avoid on loading.
IF g_eRunningMission != SP_MISSION_NONE
STATIC_BLIP_NAME_ENUM eMissionBlip = g_sMissionStaticData[g_eRunningMission].blip
IF eMissionBlip != STATIC_BLIP_NAME_DUMMY_FINAL
VECTOR vMissionCoord
IF IS_BIT_SET(g_GameBlips[eMissionBlip].iSetting, STATIC_BLIP_SETTING_MULTI_COORD_AND_SPRITE)
IF IS_PLAYER_PED_PLAYABLE(GET_CURRENT_PLAYER_PED_ENUM())
vMissionCoord = g_GameBlips[eMissionBlip].vCoords[GET_CURRENT_PLAYER_PED_INT()]
ELSE
vMissionCoord = g_GameBlips[eMissionBlip].vCoords[0]
ENDIF
ELSE
vMissionCoord = g_GameBlips[eMissionBlip].vCoords[0]
ENDIF
FLOAT fSafehouseToBlipDist2 = VDIST2(vSavehouseCoord, vMissionCoord)
#IF IS_DEBUG_BUILD
PRINTSTRING(" g_eRunningMission ")
PRINTINT(ENUM_TO_INT(eMissionBlip))
PRINTSTRING(" and iSavehouse at ")
PRINTVECTOR(vSavehouseCoord)
PRINTNL()
PRINTSTRING(" vMissionCoord: ")
PRINTFLOAT(SQRT(fSafehouseToBlipDist2))
PRINTSTRING(" [MAX:")
PRINTFLOAT(fCONST_MIN_MISSION_DIST_FROM_SAFEHOUSE)
PRINTSTRING("]")
PRINTNL()
#ENDIF
IF (fSafehouseToBlipDist2 < (fCONST_MIN_MISSION_DIST_FROM_SAFEHOUSE*fCONST_MIN_MISSION_DIST_FROM_SAFEHOUSE))
RETURN TRUE
ENDIF
#IF IS_DEBUG_BUILD
iValidMissions++
IF (eClosestMissionBlip >= STATIC_BLIP_NAME_DUMMY_FINAL)
eClosestMissionBlip = eMissionBlip
ELSE
FLOAT fSafehouseToClosestBlipDist = VDIST(vSavehouseCoord, g_GameBlips[eClosestMissionBlip].vCoords[0])
IF (SQRT(fSafehouseToBlipDist2) < fSafehouseToClosestBlipDist)
eClosestMissionBlip = eMissionBlip
ENDIF
ENDIF
#ENDIF
ENDIF
ENDIF
// #1447979 //
INT iQueueGameTimer = GET_GAME_TIMER()
CONST_INT iCONST_QueueGameTimerMs 180000 //3min
INT index
REPEAT g_savedGlobalsnorman.sCommsControlData.iNoQueuedCalls index
VectorID eVectorID = g_savedGlobalsnorman.sCommsControlData.sQueuedCalls[index].sCommData.eRestrictedAreaID
IF eVectorID <> VID_BLANK
INT iQueuedCallsDelay = g_savedGlobalsnorman.sCommsControlData.sQueuedCalls[index].sCommData.iQueueTime - iQueueGameTimer
IF (iQueuedCallsDelay < iCONST_QueueGameTimerMs)
IF IS_COORD_IN_VECTOR_ID_AREA_for_autosave(vSavehouseCoord, eVectorID)
PRINTLN(" QUEUE CALLS - blocked for comms ", index, ".")
RETURN TRUE
ENDIF
ENDIF
ENDIF
ENDREPEAT
REPEAT g_savedGlobalsnorman.sCommsControlData.iNoQueuedTexts index
VectorID eVectorID = g_savedGlobalsnorman.sCommsControlData.sQueuedTexts[index].sCommData.eRestrictedAreaID
IF eVectorID <> VID_BLANK
INT iQueuedTextsDelay = g_savedGlobalsnorman.sCommsControlData.sQueuedTexts[index].sCommData.iQueueTime - iQueueGameTimer
IF (iQueuedTextsDelay < iCONST_QueueGameTimerMs)
IF IS_COORD_IN_VECTOR_ID_AREA_for_autosave(vSavehouseCoord, eVectorID)
PRINTLN(" QUEUE TEXTS - blocked for comms ", index, ".")
RETURN TRUE
ENDIF
ENDIF
ENDIF
ENDREPEAT
REPEAT g_savedGlobalsnorman.sCommsControlData.iNoQueuedEmails index
VectorID eVectorID = g_savedGlobalsnorman.sCommsControlData.sQueuedEmails[index].sCommData.eRestrictedAreaID
IF eVectorID <> VID_BLANK
INT iQueuedEmailsDelay = g_savedGlobalsnorman.sCommsControlData.sQueuedEmails[index].sCommData.iQueueTime - iQueueGameTimer
IF (iQueuedEmailsDelay < iCONST_QueueGameTimerMs)
IF IS_COORD_IN_VECTOR_ID_AREA_for_autosave(vSavehouseCoord, eVectorID)
PRINTLN(" QUEUE EMAILS - blocked for comms ", index, ".")
RETURN TRUE
ENDIF
ENDIF
ENDIF
ENDREPEAT
ENDIF
#IF IS_DEBUG_BUILD
PRINTLN(" iValidMissions:", iValidMissions, ", eClosestMissionBlip", ENUM_TO_INT(eClosestMissionBlip))
#ENDIF
RETURN FALSE
ENDFUNC
#endif
FUNC BOOL CHECK_PLAYER_MISSION_BLIPS_on_autosave()
#if USE_CLF_DLC
return CHECK_PLAYER_MISSION_BLIPS_on_autosaveCLF()
#endif
#if USE_NRM_DLC
return CHECK_PLAYER_MISSION_BLIPS_on_autosaveNRM()
#endif
#if not USE_CLF_DLC
#if not USE_NRM_DLC
CONST_FLOAT fCONST_MIN_MISSION_DIST_FROM_SAFEHOUSE 50.0
CONST_FLOAT fCONST_MIN_COORD_DIST_FROM_SAFEHOUSE 30.0
PED_INDEX pedID = PLAYER_PED_ID()
IF IS_PED_INJURED(pedID)
SCRIPT_ASSERT("IS_PED_INJURED(pedID) //CHECK_PLAYER_MISSION_BLIPS_on_autosave()")
RETURN FALSE
ENDIF
#IF IS_DEBUG_BUILD
INT iValidMissions = 0
STATIC_BLIP_NAME_ENUM eClosestMissionBlip = STATIC_BLIP_NAME_DUMMY_FINAL
PRINTLN("CHECK_PLAYER_MISSION_BLIPS_on_autosave ", GET_CURRENT_PLAYER_PED_STRING())
#ENDIF
IF g_savedGlobals.sFlow.controls.flagIDs[FLOWFLAG_BLOCK_SAVEHOUSE_FOR_AUTOSAVE] //Get_Mission_Flow_Flag_State[]
PRINTLN(" FLOWFLAG - block safehouse for autosave")
RETURN TRUE
ENDIF
// * SAFEHOUSE BLIPS #939375 * //
VECTOR vSavehouseCoord = <<0,0,0>>
FLOAT fReturnHeading = 0
IF OVERRIDE_SAVE_HOUSE(FALSE, <<0,0,0>>, 0, TRUE, vSavehouseCoord, fReturnHeading)
//Check for mission triggers to avoid on loading.
INT iTriggerIndex
REPEAT MAX_MISSION_TRIGGERS iTriggerIndex
IF g_TriggerableMissions[iTriggerIndex].bUsed
IF g_TriggerableMissions[iTriggerIndex].eType = MISSION_TRIGGER_TYPE_SCENE
IF g_TriggerableMissions[iTriggerIndex].eMissionID != SP_MISSION_NONE
STATIC_BLIP_NAME_ENUM eMissionBlip = g_sMissionStaticData[g_TriggerableMissions[iTriggerIndex].eMissionID].blip
IF eMissionBlip != STATIC_BLIP_NAME_DUMMY_FINAL
VECTOR vMissionCoord
IF IS_BIT_SET(g_GameBlips[eMissionBlip].iSetting, STATIC_BLIP_SETTING_MULTI_COORD_AND_SPRITE)
IF IS_PLAYER_PED_PLAYABLE(GET_CURRENT_PLAYER_PED_ENUM())
vMissionCoord = g_GameBlips[eMissionBlip].vCoords[GET_CURRENT_PLAYER_PED_INT()]
ELSE
vMissionCoord = g_GameBlips[eMissionBlip].vCoords[0]
ENDIF
ELSE
vMissionCoord = g_GameBlips[eMissionBlip].vCoords[0]
ENDIF
FLOAT fSafehouseToBlipDist2 = VDIST2(vSavehouseCoord, vMissionCoord)
#IF IS_DEBUG_BUILD
PRINTSTRING(" eMissionBlip ")
PRINTINT(ENUM_TO_INT(eMissionBlip))
PRINTSTRING(" and iSavehouse at ")
PRINTVECTOR(vSavehouseCoord)
PRINTNL()
PRINTSTRING(" vMissionCoord: ")
PRINTFLOAT(SQRT(fSafehouseToBlipDist2))
PRINTSTRING(" [MAX:")
PRINTFLOAT(fCONST_MIN_MISSION_DIST_FROM_SAFEHOUSE)
PRINTSTRING("]")
PRINTNL()
#ENDIF
IF (fSafehouseToBlipDist2 < (fCONST_MIN_MISSION_DIST_FROM_SAFEHOUSE*fCONST_MIN_MISSION_DIST_FROM_SAFEHOUSE))
RETURN TRUE
ENDIF
#IF IS_DEBUG_BUILD
iValidMissions++
IF (eClosestMissionBlip >= STATIC_BLIP_NAME_DUMMY_FINAL)
eClosestMissionBlip = eMissionBlip
ELSE
FLOAT fSafehouseToClosestBlipDist = VDIST(vSavehouseCoord, g_GameBlips[eClosestMissionBlip].vCoords[0])
IF (SQRT(fSafehouseToBlipDist2) < fSafehouseToClosestBlipDist)
eClosestMissionBlip = eMissionBlip
ENDIF
ENDIF
#ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDREPEAT
//Check for running missions with blips to avoid on loading.
IF g_eRunningMission != SP_MISSION_NONE
STATIC_BLIP_NAME_ENUM eMissionBlip = g_sMissionStaticData[g_eRunningMission].blip
IF eMissionBlip != STATIC_BLIP_NAME_DUMMY_FINAL
VECTOR vMissionCoord
IF IS_BIT_SET(g_GameBlips[eMissionBlip].iSetting, STATIC_BLIP_SETTING_MULTI_COORD_AND_SPRITE)
IF IS_PLAYER_PED_PLAYABLE(GET_CURRENT_PLAYER_PED_ENUM())
vMissionCoord = g_GameBlips[eMissionBlip].vCoords[GET_CURRENT_PLAYER_PED_INT()]
ELSE
vMissionCoord = g_GameBlips[eMissionBlip].vCoords[0]
ENDIF
ELSE
vMissionCoord = g_GameBlips[eMissionBlip].vCoords[0]
ENDIF
FLOAT fSafehouseToBlipDist2 = VDIST2(vSavehouseCoord, vMissionCoord)
#IF IS_DEBUG_BUILD
PRINTSTRING(" g_eRunningMission ")
PRINTINT(ENUM_TO_INT(eMissionBlip))
PRINTSTRING(" and iSavehouse at ")
PRINTVECTOR(vSavehouseCoord)
PRINTNL()
PRINTSTRING(" vMissionCoord: ")
PRINTFLOAT(SQRT(fSafehouseToBlipDist2))
PRINTSTRING(" [MAX:")
PRINTFLOAT(fCONST_MIN_MISSION_DIST_FROM_SAFEHOUSE)
PRINTSTRING("]")
PRINTNL()
#ENDIF
IF (fSafehouseToBlipDist2 < (fCONST_MIN_MISSION_DIST_FROM_SAFEHOUSE*fCONST_MIN_MISSION_DIST_FROM_SAFEHOUSE))
RETURN TRUE
ENDIF
#IF IS_DEBUG_BUILD
iValidMissions++
IF (eClosestMissionBlip >= STATIC_BLIP_NAME_DUMMY_FINAL)
eClosestMissionBlip = eMissionBlip
ELSE
FLOAT fSafehouseToClosestBlipDist = VDIST(vSavehouseCoord, g_GameBlips[eClosestMissionBlip].vCoords[0])
IF (SQRT(fSafehouseToBlipDist2) < fSafehouseToClosestBlipDist)
eClosestMissionBlip = eMissionBlip
ENDIF
ENDIF
#ENDIF
ENDIF
ENDIF
// #1447979 //
INT iQueueGameTimer = GET_GAME_TIMER()
CONST_INT iCONST_QueueGameTimerMs 180000 //3min
INT index
REPEAT g_savedGlobals.sCommsControlData.iNoQueuedCalls index
VectorID eVectorID = g_savedGlobals.sCommsControlData.sQueuedCalls[index].sCommData.eRestrictedAreaID
IF eVectorID <> VID_BLANK
IF ((eVectorID <> VID_BLANK) AND (eVectorID <> VID_AMBIENT_BASEJUMP_HARBOR) AND (eVectorID <> VID_AMBIENT_BASEJUMP_CANAL) AND (eVectorID <> VID_AMBIENT_BASEJUMP_RACE_TRACK) AND (eVectorID <> VID_AMBIENT_BASEJUMP_CANAL) AND (eVectorID <> VID_AMBIENT_BASEJUMP_WINDMILLS) AND (eVectorID <> VID_AMBIENT_BASEJUMP_CANAL) AND (eVectorID <> VID_AMBIENT_BASEJUMP_NORTH_CLIFF) AND (eVectorID <> VID_AMBIENT_BASEJUMP_CANAL) AND (eVectorID <> VID_AMBIENT_BASEJUMP_MAZE_BANK) AND (eVectorID <> VID_AMBIENT_BASEJUMP_CANAL) AND (eVectorID <> VID_AMBIENT_BASEJUMP_CRANE) AND (eVectorID <> VID_AMBIENT_BASEJUMP_CANAL) AND (eVectorID <> VID_AMBIENT_BASEJUMP_RIVER_CLIFF) AND (eVectorID <> VID_AMBIENT_BASEJUMP_CANAL) AND (eVectorID <> VID_AMBIENT_BASEJUMP_RUNAWAY_TRAIN) AND (eVectorID <> VID_AMBIENT_BASEJUMP_CANAL) AND (eVectorID <> VID_AMBIENT_BASEJUMP_GOLF_COURSE) AND (eVectorID <> VID_AMBIENT_BASEJUMP_CANAL) AND (eVectorID <> VID_AMBIENT_BASEJUMP_1K) AND (eVectorID <> VID_AMBIENT_BASEJUMP_CANAL) AND (eVectorID <> VID_AMBIENT_BASEJUMP_1_5K) AND (eVectorID <> VID_AMBIENT_BASEJUMP_CANAL) AND (eVectorID <> VID_AMBIENT_BASEJUMP_CANAL) AND (eVectorID <> VID_AMBIENT_BASEJUMP_ROCK_CLIFF))
INT iQueuedCallsDelay = g_savedGlobals.sCommsControlData.sQueuedCalls[index].sCommData.iQueueTime - iQueueGameTimer
IF (iQueuedCallsDelay < iCONST_QueueGameTimerMs)
IF IS_COORD_IN_VECTOR_ID_AREA_for_autosave(vSavehouseCoord, eVectorID)
PRINTLN(" QUEUE CALLS - blocked for comms ", index, ".")
RETURN TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDREPEAT
REPEAT g_savedGlobals.sCommsControlData.iNoQueuedTexts index
VectorID eVectorID = g_savedGlobals.sCommsControlData.sQueuedTexts[index].sCommData.eRestrictedAreaID
IF eVectorID <> VID_BLANK
IF ((eVectorID <> VID_BLANK) AND (eVectorID <> VID_AMBIENT_BASEJUMP_HARBOR) AND (eVectorID <> VID_AMBIENT_BASEJUMP_CANAL) AND (eVectorID <> VID_AMBIENT_BASEJUMP_RACE_TRACK) AND (eVectorID <> VID_AMBIENT_BASEJUMP_CANAL) AND (eVectorID <> VID_AMBIENT_BASEJUMP_WINDMILLS) AND (eVectorID <> VID_AMBIENT_BASEJUMP_CANAL) AND (eVectorID <> VID_AMBIENT_BASEJUMP_NORTH_CLIFF) AND (eVectorID <> VID_AMBIENT_BASEJUMP_CANAL) AND (eVectorID <> VID_AMBIENT_BASEJUMP_MAZE_BANK) AND (eVectorID <> VID_AMBIENT_BASEJUMP_CANAL) AND (eVectorID <> VID_AMBIENT_BASEJUMP_CRANE) AND (eVectorID <> VID_AMBIENT_BASEJUMP_CANAL) AND (eVectorID <> VID_AMBIENT_BASEJUMP_RIVER_CLIFF) AND (eVectorID <> VID_AMBIENT_BASEJUMP_CANAL) AND (eVectorID <> VID_AMBIENT_BASEJUMP_RUNAWAY_TRAIN) AND (eVectorID <> VID_AMBIENT_BASEJUMP_CANAL) AND (eVectorID <> VID_AMBIENT_BASEJUMP_GOLF_COURSE) AND (eVectorID <> VID_AMBIENT_BASEJUMP_CANAL) AND (eVectorID <> VID_AMBIENT_BASEJUMP_1K) AND (eVectorID <> VID_AMBIENT_BASEJUMP_CANAL) AND (eVectorID <> VID_AMBIENT_BASEJUMP_1_5K) AND (eVectorID <> VID_AMBIENT_BASEJUMP_CANAL) AND (eVectorID <> VID_AMBIENT_BASEJUMP_CANAL) AND (eVectorID <> VID_AMBIENT_BASEJUMP_ROCK_CLIFF))
INT iQueuedTextsDelay = g_savedGlobals.sCommsControlData.sQueuedTexts[index].sCommData.iQueueTime - iQueueGameTimer
IF (iQueuedTextsDelay < iCONST_QueueGameTimerMs)
IF IS_COORD_IN_VECTOR_ID_AREA_for_autosave(vSavehouseCoord, eVectorID)
PRINTLN(" QUEUE TEXTS - blocked for comms ", index, ".")
RETURN TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDREPEAT
REPEAT g_savedGlobals.sCommsControlData.iNoQueuedEmails index
VectorID eVectorID = g_savedGlobals.sCommsControlData.sQueuedEmails[index].sCommData.eRestrictedAreaID
IF eVectorID <> VID_BLANK
IF ((eVectorID <> VID_BLANK) AND (eVectorID <> VID_AMBIENT_BASEJUMP_HARBOR) AND (eVectorID <> VID_AMBIENT_BASEJUMP_CANAL) AND (eVectorID <> VID_AMBIENT_BASEJUMP_RACE_TRACK) AND (eVectorID <> VID_AMBIENT_BASEJUMP_CANAL) AND (eVectorID <> VID_AMBIENT_BASEJUMP_WINDMILLS) AND (eVectorID <> VID_AMBIENT_BASEJUMP_CANAL) AND (eVectorID <> VID_AMBIENT_BASEJUMP_NORTH_CLIFF) AND (eVectorID <> VID_AMBIENT_BASEJUMP_CANAL) AND (eVectorID <> VID_AMBIENT_BASEJUMP_MAZE_BANK) AND (eVectorID <> VID_AMBIENT_BASEJUMP_CANAL) AND (eVectorID <> VID_AMBIENT_BASEJUMP_CRANE) AND (eVectorID <> VID_AMBIENT_BASEJUMP_CANAL) AND (eVectorID <> VID_AMBIENT_BASEJUMP_RIVER_CLIFF) AND (eVectorID <> VID_AMBIENT_BASEJUMP_CANAL) AND (eVectorID <> VID_AMBIENT_BASEJUMP_RUNAWAY_TRAIN) AND (eVectorID <> VID_AMBIENT_BASEJUMP_CANAL) AND (eVectorID <> VID_AMBIENT_BASEJUMP_GOLF_COURSE) AND (eVectorID <> VID_AMBIENT_BASEJUMP_CANAL) AND (eVectorID <> VID_AMBIENT_BASEJUMP_1K) AND (eVectorID <> VID_AMBIENT_BASEJUMP_CANAL) AND (eVectorID <> VID_AMBIENT_BASEJUMP_1_5K) AND (eVectorID <> VID_AMBIENT_BASEJUMP_CANAL) AND (eVectorID <> VID_AMBIENT_BASEJUMP_CANAL) AND (eVectorID <> VID_AMBIENT_BASEJUMP_ROCK_CLIFF))
INT iQueuedEmailsDelay = g_savedGlobals.sCommsControlData.sQueuedEmails[index].sCommData.iQueueTime - iQueueGameTimer
IF (iQueuedEmailsDelay < iCONST_QueueGameTimerMs)
IF IS_COORD_IN_VECTOR_ID_AREA_for_autosave(vSavehouseCoord, eVectorID)
PRINTLN(" QUEUE EMAILS - blocked for comms ", index, ".")
RETURN TRUE
ENDIF
ENDIF
ENDIF
ENDIF
ENDREPEAT
VECTOR vCentreProperty = <<0,0,0>>
FLOAT fPropertyDistChec = -1
FLOW_BITSET_IDS eFlowBitsetToQuery
INT iOffsetBitIndex
// For Michael's Family Home
//Is this bit in our first or second bitset?
IF ENUM_TO_INT(LAUNCH_BIT_SH_INTRO_M_HOME) <= 31
eFlowBitsetToQuery = FLOWBITSET_RESTART_FLOW_LAUNCHED_SCRIPTS_1
iOffsetBitIndex = ENUM_TO_INT(LAUNCH_BIT_SH_INTRO_M_HOME)
ELSE
eFlowBitsetToQuery = FLOWBITSET_RESTART_FLOW_LAUNCHED_SCRIPTS_2
iOffsetBitIndex = ENUM_TO_INT(LAUNCH_BIT_SH_INTRO_M_HOME) - 31
ENDIF
IF IS_BIT_SET (g_savedGlobals.sFlow.controls.bitsetIDs[eFlowBitsetToQuery], iOffsetBitIndex)
// cutscene script is due to relaunch or is active
vCentreProperty = << -808.79742, 169.31934, 70.95580 >>
fPropertyDistChec = 85.0
FLOAT fPropertyDist2 = VDIST2(vSavehouseCoord, vCentreProperty)
IF (fPropertyDist2 < (fPropertyDistChec*fPropertyDistChec))
#IF IS_DEBUG_BUILD
PRINTSTRING("safehouse load blocked too close to Michael safehouse tutorial scene [")
PRINTFLOAT(SQRT(fPropertyDist2))
PRINTSTRING("m]")
PRINTNL()
#ENDIF
RETURN TRUE
ENDIF
ENDIF
// For Franklin's hills safehouse -
//Is this bit in our first or second bitset?
IF ENUM_TO_INT(LAUNCH_BIT_SH_INTRO_F_HILLS) <= 31
eFlowBitsetToQuery = FLOWBITSET_RESTART_FLOW_LAUNCHED_SCRIPTS_1
iOffsetBitIndex = ENUM_TO_INT(LAUNCH_BIT_SH_INTRO_F_HILLS)
ELSE
eFlowBitsetToQuery = FLOWBITSET_RESTART_FLOW_LAUNCHED_SCRIPTS_2
iOffsetBitIndex = ENUM_TO_INT(LAUNCH_BIT_SH_INTRO_F_HILLS) - 31
ENDIF
IF IS_BIT_SET (g_savedGlobals.sFlow.controls.bitsetIDs[eFlowBitsetToQuery], iOffsetBitIndex)
// cutscene script is due to relaunch or is active
vCentreProperty = << -2.62564, 528.32562, 178.39198 >>
fPropertyDistChec = 65.0
FLOAT fPropertyDist2 = VDIST2(vSavehouseCoord, vCentreProperty)
IF (fPropertyDist2 < (fPropertyDistChec*fPropertyDistChec))
#IF IS_DEBUG_BUILD
PRINTSTRING("safehouse load blocked too close to Franklin safehouse tutorial scene [")
PRINTFLOAT(SQRT(fPropertyDist2))
PRINTSTRING("m]")
PRINTNL()
#ENDIF
RETURN TRUE
ENDIF
ENDIF
// // // // //
ENDIF
#IF IS_DEBUG_BUILD
PRINTLN(" iValidMissions:", iValidMissions, ", eClosestMissionBlip", ENUM_TO_INT(eClosestMissionBlip))
#ENDIF
RETURN FALSE
#endif
#endif
ENDFUNC
#if USE_CLF_DLC
FUNC BOOL SHOULD_PROCESS_DESCENT_SWITCH_ON_LOADCLF()
#IF IS_DEBUG_BUILD
PRINTSTRING("SHOULD_PROCESS_DESCENT_SWITCH_ON_LOAD(")
PRINTSTRING("wasFadedOut:")
PRINTBOOL(g_savedGlobalsClifford.sFlowCustom.wasFadedOut)
PRINTSTRING(", wasFadedOut_switch:")
PRINTBOOL(g_savedGlobalsClifford.sFlowCustom.wasFadedOut_switch)
PRINTSTRING(", bIgnoreScreenFade:")
PRINTBOOL(g_sAutosaveData.bIgnoreScreenFade)
PRINTSTRING(", g_savedGlobals.sRepeatPlayData.mPlayerStruct.vPos:")
PRINTVECTOR(g_savedGlobalsClifford.sRepeatPlayData.mPlayerStruct.vPos)
PRINTSTRING(")")
PRINTNL()
#ENDIF
IF g_savedGlobalsClifford.sFlowCustom.wasFadedOut_switch
IF (g_savedGlobalsClifford.sFlow.missionSavedData[SP_MISSION_CLF_TRAIN].completed) // #1104329, before start
IF ARE_VECTORS_EQUAL(g_savedGlobalsClifford.sRepeatPlayData.mPlayerStruct.vPos, <<0.0,0.0,0.0>>)
RETURN TRUE
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
#ENDIF
#if USE_NRM_DLC
FUNC BOOL SHOULD_PROCESS_DESCENT_SWITCH_ON_LOADNRM()
#IF IS_DEBUG_BUILD
PRINTSTRING("SHOULD_PROCESS_DESCENT_SWITCH_ON_LOAD(")
PRINTSTRING("wasFadedOut:")
PRINTBOOL(g_savedGlobalsnorman.sFlowCustom.wasFadedOut)
PRINTSTRING(", wasFadedOut_switch:")
PRINTBOOL(g_savedGlobalsnorman.sFlowCustom.wasFadedOut_switch)
PRINTSTRING(", bIgnoreScreenFade:")
PRINTBOOL(g_sAutosaveData.bIgnoreScreenFade)
PRINTSTRING(", g_savedGlobals.sRepeatPlayData.mPlayerStruct.vPos:")
PRINTVECTOR(g_savedGlobalsnorman.sRepeatPlayData.mPlayerStruct.vPos)
PRINTSTRING(")")
PRINTNL()
#ENDIF
IF g_savedGlobalsnorman.sFlowCustom.wasFadedOut_switch
IF (g_savedGlobalsnorman.sFlow.missionSavedData[SP_MISSION_NRM_SUR_START].completed) // #1104329, before Arm1
IF ARE_VECTORS_EQUAL(g_savedGlobalsnorman.sRepeatPlayData.mPlayerStruct.vPos, <<0.0,0.0,0.0>>)
RETURN TRUE
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
#ENDIF
FUNC BOOL SHOULD_PROCESS_DESCENT_SWITCH_ON_LOAD()
#if USE_CLF_DLC
return SHOULD_PROCESS_DESCENT_SWITCH_ON_LOADCLF()
#endif
#if USE_NRM_DLC
return SHOULD_PROCESS_DESCENT_SWITCH_ON_LOADNRM()
#endif
#if not USE_CLF_DLC
#if not USE_NRM_DLC
#IF IS_DEBUG_BUILD
PRINTSTRING("SHOULD_PROCESS_DESCENT_SWITCH_ON_LOAD(")
PRINTSTRING("wasFadedOut:")
PRINTBOOL(g_savedGlobals.sFlowCustom.wasFadedOut)
PRINTSTRING(", wasFadedOut_switch:")
PRINTBOOL(g_savedGlobals.sFlowCustom.wasFadedOut_switch)
PRINTSTRING(", bIgnoreScreenFade:")
PRINTBOOL(g_sAutosaveData.bIgnoreScreenFade)
PRINTSTRING(", g_savedGlobals.sRepeatPlayData.mPlayerStruct.vPos:")
PRINTVECTOR(g_savedGlobals.sRepeatPlayData.mPlayerStruct.vPos)
PRINTSTRING(")")
PRINTNL()
#ENDIF
IF g_savedGlobals.sFlowCustom.wasFadedOut_switch
IF (g_savedGlobals.sFlow.missionSavedData[SP_MISSION_ARMENIAN_1].completed) // #1104329, before Arm1
IF ARE_VECTORS_EQUAL(g_savedGlobals.sRepeatPlayData.mPlayerStruct.vPos, <<0.0,0.0,0.0>>)
RETURN TRUE
ENDIF
ENDIF
ENDIF
RETURN FALSE
#ENDIF
#ENDIF
ENDFUNC
PROC REGISTER_PLAYER_PED_WITH_AUTOMATIC_DOORS(enumCharacterList char, PED_INDEX &ped)
CPRINTLN(DEBUG_FLOW, "REGISTER_PLAYER_PED_WITH_AUTOMATIC_DOORS char= ", char)
SWITCH char
CASE CHAR_MICHAEL
REGISTER_PED_TO_ACTIVATE_AUTOMATIC_DOOR(AUTODOOR_MICHAEL_MANSION_GATE, ped)
REGISTER_PED_TO_ACTIVATE_AUTOMATIC_DOOR(AUTODOOR_MIL_BASE_GATE_IN, ped)
REGISTER_PED_TO_ACTIVATE_AUTOMATIC_DOOR(AUTODOOR_MIL_BASE_GATE_OUT, ped)
REGISTER_PED_TO_ACTIVATE_AUTOMATIC_DOOR(AUTODOOR_DTOWN_VINEWOOD_GARAGE, ped)
BREAK
CASE CHAR_FRANKLIN
#if not USE_CLF_DLC
#if not USE_NRM_DLC
IF (g_savedGlobals.sFlow.missionSavedData[SP_MISSION_ARMENIAN_3].completed)
REGISTER_PED_TO_ACTIVATE_AUTOMATIC_DOOR(AUTODOOR_MICHAEL_MANSION_GATE, ped)
ENDIF
#endif
#endif
REGISTER_PED_TO_ACTIVATE_AUTOMATIC_DOOR(AUTODOOR_MIL_BASE_GATE_IN, ped)
REGISTER_PED_TO_ACTIVATE_AUTOMATIC_DOOR(AUTODOOR_MIL_BASE_GATE_OUT, ped)
REGISTER_PED_TO_ACTIVATE_AUTOMATIC_DOOR(AUTODOOR_DTOWN_VINEWOOD_GARAGE, ped)
#if not USE_CLF_DLC
#if not USE_NRM_DLC
IF g_savedGlobals.sFlow.controls.flagIDs[FLOWFLAG_FRANKLIN_MOVED_TO_HILLS_APARTMENT]
REGISTER_PED_TO_ACTIVATE_AUTOMATIC_DOOR(AUTODOOR_FRAN_HILLS_GARAGE, ped)
ENDIF
#endif
#endif
BREAK
CASE CHAR_TREVOR
#if not USE_CLF_DLC
#if not USE_NRM_DLC
IF (g_savedGlobals.sFlow.missionSavedData[SP_MISSION_FAMILY_4].completed)
REGISTER_PED_TO_ACTIVATE_AUTOMATIC_DOOR(AUTODOOR_MICHAEL_MANSION_GATE, ped)
ENDIF
#endif
#endif
REGISTER_PED_TO_ACTIVATE_AUTOMATIC_DOOR(AUTODOOR_MIL_BASE_GATE_IN, ped)
REGISTER_PED_TO_ACTIVATE_AUTOMATIC_DOOR(AUTODOOR_MIL_BASE_GATE_OUT, ped)
REGISTER_PED_TO_ACTIVATE_AUTOMATIC_DOOR(AUTODOOR_DTOWN_VINEWOOD_GARAGE, ped)
BREAK
ENDSWITCH
ENDPROC
PROC UNREGISTER_PLAYER_PED_WITH_AUTOMATIC_DOORS(enumCharacterList char, PED_INDEX &ped)
CPRINTLN(DEBUG_FLOW, "UNREGISTER_PLAYER_PED_WITH_AUTOMATIC_DOORS char= ", char)
SWITCH char
CASE CHAR_MICHAEL
UNREGISTER_PED_TO_ACTIVATE_AUTOMATIC_DOOR(AUTODOOR_MICHAEL_MANSION_GATE, ped)
UNREGISTER_PED_TO_ACTIVATE_AUTOMATIC_DOOR(AUTODOOR_MIL_BASE_GATE_IN, ped)
UNREGISTER_PED_TO_ACTIVATE_AUTOMATIC_DOOR(AUTODOOR_MIL_BASE_GATE_OUT, ped)
UNREGISTER_PED_TO_ACTIVATE_AUTOMATIC_DOOR(AUTODOOR_DTOWN_VINEWOOD_GARAGE, ped)
BREAK
CASE CHAR_FRANKLIN
UNREGISTER_PED_TO_ACTIVATE_AUTOMATIC_DOOR(AUTODOOR_MICHAEL_MANSION_GATE, ped)
UNREGISTER_PED_TO_ACTIVATE_AUTOMATIC_DOOR(AUTODOOR_MIL_BASE_GATE_IN, ped)
UNREGISTER_PED_TO_ACTIVATE_AUTOMATIC_DOOR(AUTODOOR_MIL_BASE_GATE_OUT, ped)
UNREGISTER_PED_TO_ACTIVATE_AUTOMATIC_DOOR(AUTODOOR_DTOWN_VINEWOOD_GARAGE, ped)
#if not USE_CLF_DLC
#if not USE_NRM_DLC
IF g_savedGlobals.sFlow.controls.flagIDs[FLOWFLAG_FRANKLIN_MOVED_TO_HILLS_APARTMENT]
UNREGISTER_PED_TO_ACTIVATE_AUTOMATIC_DOOR(AUTODOOR_FRAN_HILLS_GARAGE, ped)
ENDIF
#endif
#endif
BREAK
CASE CHAR_TREVOR
UNREGISTER_PED_TO_ACTIVATE_AUTOMATIC_DOOR(AUTODOOR_MICHAEL_MANSION_GATE, ped)
UNREGISTER_PED_TO_ACTIVATE_AUTOMATIC_DOOR(AUTODOOR_MIL_BASE_GATE_IN, ped)
UNREGISTER_PED_TO_ACTIVATE_AUTOMATIC_DOOR(AUTODOOR_MIL_BASE_GATE_OUT, ped)
UNREGISTER_PED_TO_ACTIVATE_AUTOMATIC_DOOR(AUTODOOR_DTOWN_VINEWOOD_GARAGE, ped)
BREAK
ENDSWITCH
ENDPROC
/// PURPOSE: Returns TRUE if the player is allowed to use the wardrobe and shops to change clothes.
FUNC BOOL CAN_PLAYER_CHANGE_CLOTHES_ON_MISSION()
RETURN (g_bPlayerCanChangeClothesOnMission)
ENDFUNC
/// PURPOSE: Allows scripts to block the player from using the wardrobe and shops to change clothes.
PROC SET_PLAYER_CAN_CHANGE_CLOTHES_ON_MISSION(BOOL bCanChange)
g_bPlayerCanChangeClothesOnMission = bCanChange
#IF IS_DEBUG_BUILD
IF bCanChange
PRINTLN("SET_PLAYER_CAN_CHANGE_CLOTHES_ON_MISSION(TRUE) called by script '", GET_THIS_SCRIPT_NAME(),"'")
ELSE
PRINTLN("SET_PLAYER_CAN_CHANGE_CLOTHES_ON_MISSION(FALSE) called by script '", GET_THIS_SCRIPT_NAME(),"'")
ENDIF
#ENDIF
ENDPROC
/// PURPOSE:
/// set the global saved bool bChangedClothesOnMission for ePed to TRUE - that player char has had their outfit changed on mission
/// PARAMS:
/// ePed - char ID of the player who's changed his changed (CHAR_MICHAEL, CHAR_FRANKLIN, CHAR_TREVOR)
PROC SET_PLAYER_HAS_CHANGE_CLOTHES_ON_MISSION(enumCharacterList ePed)
IF NOT IS_PLAYER_PED_PLAYABLE(ePed)
EXIT
ENDIF
#if USE_CLF_DLC
g_savedGlobalsClifford.sPlayerData.sInfo.bChangedClothesOnMission[ePed] = TRUE
#endif
#if USE_NRM_DLC
g_savedGlobalsnorman.sPlayerData.sInfo.bChangedClothesOnMission[ePed] = TRUE
#endif
#if not USE_CLF_DLC
#if not USE_NRM_DLC
g_savedGlobals.sPlayerData.sInfo.bChangedClothesOnMission[ePed] = TRUE
#endif
#endif
#IF IS_DEBUG_BUILD
PRINTSTRING("SET_PLAYER_HAS_CHANGE_CLOTHES_ON_MISSION(")
PRINTSTRING(GET_PLAYER_PED_STRING(ePed))
PRINTSTRING(", ")
PRINTBOOL(TRUE)
PRINTSTRING(") called by script ")
PRINTSTRING(GET_THIS_SCRIPT_NAME())
PRINTNL()
#ENDIF
ENDPROC
/// PURPOSE:
/// set the global saved bool bChangedClothesOnMission for ePed to hasChange - whether the player has changed outfit or not
/// PARAMS:
/// ePed - char ID of the player who's changed his changed (CHAR_MICHAEL, CHAR_FRANKLIN, CHAR_TREVOR)
/// hasChange - the value to set a player chars saved bChangedClothesOnMission bool
PROC RESET_PLAYER_HAS_CHANGE_CLOTHES_ON_MISSION(enumCharacterList ePed, BOOL hasChange)
IF NOT IS_PLAYER_PED_PLAYABLE(ePed)
EXIT
ENDIF
#if USE_CLF_DLC
g_savedGlobalsClifford.sPlayerData.sInfo.bChangedClothesOnMission[ePed] = hasChange
#endif
#if USE_NRM_DLC
g_savedGlobalsnorman.sPlayerData.sInfo.bChangedClothesOnMission[ePed] = hasChange
#endif
#if not USE_CLF_DLC
#if not USE_NRM_DLC
g_savedGlobals.sPlayerData.sInfo.bChangedClothesOnMission[ePed] = hasChange
#endif
#endif
#IF IS_DEBUG_BUILD
PRINTSTRING("RESET_PLAYER_HAS_CHANGE_CLOTHES_ON_MISSION(")
PRINTSTRING(GET_PLAYER_PED_STRING(ePed))
PRINTSTRING(", ")
PRINTBOOL(hasChange)
PRINTSTRING(") called by script ")
PRINTSTRING(GET_THIS_SCRIPT_NAME())
PRINTNL()
#ENDIF
ENDPROC
/// PURPOSE:
///
/// PARAMS:
/// ePed - char ID of the player who's changed his changed (CHAR_MICHAEL, CHAR_FRANKLIN, CHAR_TREVOR)
/// RETURNS:
/// TRUE if the player changed his outfit on a mission, FALSE otherwise
FUNC BOOL GET_PLAYER_HAS_CHANGE_CLOTHES_ON_MISSION(enumCharacterList ePed)
IF NOT IS_PLAYER_PED_PLAYABLE(ePed)
RETURN FALSE
ENDIF
#IF IS_DEBUG_BUILD
PRINTSTRING("GET_PLAYER_HAS_CHANGE_CLOTHES_ON_MISSION(")
PRINTSTRING(GET_PLAYER_PED_STRING(ePed))
PRINTSTRING(")")
PRINTNL()
#ENDIF
#if USE_CLF_DLC
RETURN g_savedGlobalsClifford.sPlayerData.sInfo.bChangedClothesOnMission[ePed]
#endif
#if USE_NRM_DLC
RETURN g_savedGlobalsnorman.sPlayerData.sInfo.bChangedClothesOnMission[ePed]
#endif
#if not USE_CLF_DLC
#if not USE_NRM_DLC
RETURN g_savedGlobals.sPlayerData.sInfo.bChangedClothesOnMission[ePed]
#endif
#endif
ENDFUNC
FUNC BOOL StoreInGlobalSelector(PED_INDEX pedID, enumCharacterList ePed, BOOL bInLeadIn = FALSE)
#IF IS_DEBUG_BUILD
PRINTSTRING("StoreInGlobalSelector(")
PRINTINT(NATIVE_TO_INT(pedID))
PRINTSTRING(", ")
PRINTSTRING(GET_PLAYER_PED_STRING(ePed))
PRINTSTRING(")")
PRINTNL()
#ENDIF
SELECTOR_SLOTS_ENUM eSelectorPed = NUMBER_OF_SELECTOR_PEDS
IF ePed = CHAR_MICHAEL
eSelectorPed = SELECTOR_PED_MICHAEL
ELIF ePed = CHAR_TREVOR
eSelectorPed = SELECTOR_PED_TREVOR
ELIF ePed = CHAR_FRANKLIN
eSelectorPed = SELECTOR_PED_FRANKLIN
ELIF ePed = NO_CHARACTER
eSelectorPed = SELECTOR_PED_MULTIPLAYER
RETURN FALSE
ENDIF
IF DOES_ENTITY_EXIST(g_sPlayerPedRequest.sSelectorPeds.pedID[eSelectorPed])
INT iQueueSpot = -1, iQueue
REPEAT COUNT_OF(g_ambientSelectorPedDeleteQueue) iQueue
IF (iQueueSpot < 0)
IF NOT DOES_ENTITY_EXIST(g_ambientSelectorPedDeleteQueue[iQueue])
iQueueSpot = iQueue
ENDIF
ENDIF
ENDREPEAT
IF (iQueueSpot < 0)
OR (iQueueSpot > COUNT_OF(g_ambientSelectorPedDeleteQueue))
SCRIPT_ASSERT("invalid iQueueSpot???")
iQueueSpot = 0
ENDIF
g_ambientSelectorPedDeleteQueue[iQueueSpot] = g_sPlayerPedRequest.sSelectorPeds.pedID[eSelectorPed]
IF bInLeadIn
IF NOT IS_PED_INJURED(g_ambientSelectorPedDeleteQueue[iQueueSpot])
IF DOES_ENTITY_EXIST(pedID)
IF NOT IS_ENTITY_DEAD(pedID)
CPRINTLN(DEBUG_TRIGGER, "Telling old ", GET_PLAYER_PED_STRING(ePed), " ped to flee coords of lead-in created ", GET_PLAYER_PED_STRING(ePed), ".")
CLEAR_PED_TASKS(g_ambientSelectorPedDeleteQueue[iQueueSpot])
TASK_SMART_FLEE_COORD(g_ambientSelectorPedDeleteQueue[iQueueSpot], GET_ENTITY_COORDS(pedID), 1000.0, -1, TRUE)
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
g_sPlayerPedRequest.sSelectorPeds.pedID[eSelectorPed] = pedID
#if USE_CLF_DLC
g_savedGlobalsClifford.sPlayerData.sInfo.sLastTimeActive[ePed] = GET_CURRENT_TIMEOFDAY()
g_savedGlobalsClifford.sPlayerData.sInfo.vLastKnownCoords[ePed] = GET_ENTITY_COORDS(pedID)
g_savedGlobalsClifford.sPlayerData.sInfo.fLastKnownHead[ePed] = GET_ENTITY_HEADING(pedID)
#endif
#if USE_NRM_DLC
g_savedGlobalsnorman.sPlayerData.sInfo.sLastTimeActive[ePed] = GET_CURRENT_TIMEOFDAY()
g_savedGlobalsnorman.sPlayerData.sInfo.vLastKnownCoords[ePed] = GET_ENTITY_COORDS(pedID)
g_savedGlobalsnorman.sPlayerData.sInfo.fLastKnownHead[ePed] = GET_ENTITY_HEADING(pedID)
#endif
#if not USE_CLF_DLC
#if not USE_NRM_DLC
g_savedGlobals.sPlayerData.sInfo.sLastTimeActive[ePed] = GET_CURRENT_TIMEOFDAY()
g_savedGlobals.sPlayerData.sInfo.vLastKnownCoords[ePed] = GET_ENTITY_COORDS(pedID)
g_savedGlobals.sPlayerData.sInfo.fLastKnownHead[ePed] = GET_ENTITY_HEADING(pedID)
#endif
#endif
IF bInLeadIn
SET_BIT(g_sPlayerPedRequest.iBitsetPedInLeadIn, ENUM_TO_INT(eSelectorPed))
CPRINTLN(DEBUG_TRIGGER, "Flagged selector pedID for ", GET_PLAYER_PED_STRING(ePed), " as created for lead-in.")
ENDIF
RETURN TRUE
ENDFUNC
FUNC BOOL StoreAsGlobalFriend(PED_INDEX pedID, enumCharacterList ePed)
#IF IS_DEBUG_BUILD
PRINTSTRING("StoreAsGlobalFriend(")
PRINTINT(NATIVE_TO_INT(pedID))
PRINTSTRING(", ")
PRINTSTRING(GET_PLAYER_PED_STRING(ePed))
PRINTSTRING(")")
PRINTNL()
#ENDIF
enumFriend eFriend = NO_FRIEND
IF ePed = CHAR_LAMAR
eFriend = FR_LAMAR
ELIF ePed = CHAR_JIMMY
eFriend = FR_JIMMY
ELIF ePed = CHAR_AMANDA
eFriend = FR_AMANDA
ELSE
eFriend = NO_FRIEND
RETURN FALSE
ENDIF
#IF IS_DEBUG_BUILD
PRINTSTRING("g_pGlobalFriends[ENUM_TO_INT(")
PRINTSTRING(GET_PLAYER_PED_STRING(ePed))
PRINTSTRING(":")
PRINTINT(ENUM_TO_INT(eFriend))
PRINTSTRING(") - NUM_OF_PLAYABLE_PEDS")
PRINTSTRING(":")
PRINTINT(NUM_OF_PLAYABLE_PEDS)
PRINTSTRING("] = ")
PRINTINT(NATIVE_TO_INT(pedID))
PRINTNL()
#ENDIF
g_pGlobalFriends[ENUM_TO_INT(eFriend) - NUM_OF_PLAYABLE_PEDS] = pedID
RETURN TRUE
ENDFUNC
FUNC BOOL IS_PED_IN_VEHICLE_AND_SAFE_TO_REMOVE(PED_INDEX PedIndex, VEHICLE_INDEX VehicleIndex, BOOL ConsiderEnteringAsInVehicle = FALSE)
IF IS_PED_IN_VEHICLE(PedIndex, VehicleIndex, ConsiderEnteringAsInVehicle)
MODEL_NAMES eVehicleModel = GET_ENTITY_MODEL(VehicleIndex)
IF IS_THIS_MODEL_A_BOAT(eVehicleModel)
OR (eVehicleModel = SUBMERSIBLE OR eVehicleModel = SUBMERSIBLE2)
IF IS_ENTITY_IN_WATER(VehicleIndex)
PRINTSTRING("IS_PED_IN_VEHICLE_AND_SAFE_TO_REMOVE - vehicle is a boat in the water")PRINTNL()
RETURN FALSE
ENDIF
PRINTSTRING("IS_PED_IN_VEHICLE_AND_SAFE_TO_REMOVE - vehicle is a boat NOT in the water")PRINTNL()
RETURN TRUE
ENDIF
IF IS_THIS_MODEL_A_PLANE(eVehicleModel) OR IS_THIS_MODEL_A_HELI(eVehicleModel)
OR (eVehicleModel = BLIMP)
IF IS_ENTITY_IN_AIR(VehicleIndex)
PRINTSTRING("IS_PED_IN_VEHICLE_AND_SAFE_TO_REMOVE - vehicle is a plane in the air")PRINTNL()
RETURN FALSE
ENDIF
PRINTSTRING("IS_PED_IN_VEHICLE_AND_SAFE_TO_REMOVE - vehicle is a plane NOT in the air")PRINTNL()
RETURN TRUE
ENDIF
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE: Returns the vehicle model enum for the specified story character
PROC STORE_VEH_DATA_FROM_VEH(PED_INDEX pedIndex, VEHICLE_INDEX vehicleIndex, PED_VEH_DATA_STRUCT &sVehData,
VECTOR &vVehStoredCoord, FLOAT &fVehStoredHead, enumTimetableVehState &eVehState
#IF USE_TU_CHANGES , VEHICLE_GEN_NAME_ENUM &eVehGen #ENDIF, BOOL awkwardAngle = FALSE )
sVehData.bIsPlayerVehicle = FALSE
#IF USE_TU_CHANGES
enumCharacterList ePed = NO_CHARACTER
#ENDIF
IF NOT IS_ENTITY_DEAD(pedIndex)
AND NOT IS_ENTITY_DEAD(vehicleIndex)
#IF NOT USE_TU_CHANGES
enumCharacterList ePed = GET_PLAYER_PED_ENUM(pedIndex)
#ENDIF
#IF USE_TU_CHANGES
ePed = GET_PLAYER_PED_ENUM(pedIndex)
#ENDIF
#IF USE_TU_CHANGES
IF ENUM_TO_INT(ePed) > NUM_OF_PLAYABLE_PEDS
IF NETWORK_IS_GAME_IN_PROGRESS()
PRINTLN("STORE_VEH_DATA_FROM_VEH: ePed > NUM_OF_PLAYABLE_PEDS!!")
ELSE
SCRIPT_ASSERT("STORE_VEH_DATA_FROM_VEH: ePed > NUM_OF_PLAYABLE_PEDS!!")
ENDIF
EXIT
ENDIF
#ENDIF
//1586393
#if not USE_CLF_DLC
#if not USE_NRM_DLC
IF DECOR_EXIST_ON(vehicleIndex,"GetawayVehicleValid")
IF DECOR_GET_BOOL(vehicleIndex, "GetawayVehicleValid")
IF g_savedGlobals.sFlow.controls.flagIDs[FLOWFLAG_MISSION_FBI_4_PREP_3_COMPLETED]
OR g_savedGlobals.sFlow.controls.flagIDs[FLOWFLAG_HEIST_AGENCY_PREP_2_DONE]
OR g_savedGlobals.sFlow.controls.flagIDs[FLOWFLAG_HEIST_FINALE_PREPE_DONE]
eVehState = PTVS_0_noVehicle
g_vPlayerVeh[ePed] = NULL
EXIT
ENDIF
ENDIF
ENDIF
#endif
#endif
IF IS_PED_IN_VEHICLE(pedIndex, vehicleIndex) OR awkwardAngle
// vehicleIndex = GET_VEHICLE_PED_IS_IN(pedIndex)
eVehState = PTVS_2_playerInVehicle
g_vPlayerVeh[ePed] = vehicleIndex
ELIF IS_PED_IN_ANY_VEHICLE(pedIndex)
vehicleIndex = GET_VEHICLE_PED_IS_IN(pedIndex)
eVehState = PTVS_2_playerInVehicle
g_vPlayerVeh[ePed] = vehicleIndex
ELSE
#IF USE_TU_CHANGES
// work around for GET_VEHICLE_GEN_VEHICLE_INDEX() //
VEHICLE_GEN_NAME_ENUM eVehicleGen
REPEAT NUMBER_OF_VEHICLES_TO_GEN eVehicleGen
IF vehicleIndex = g_sVehicleGenNSData.vehicleID[eVehicleGen]
PRINTSTRING("url:bugstar:1648196 - switch trying to store a vehgen vehicle [")
PRINTINT(ENUM_TO_INT(eVehicleGen))
PRINTSTRING("] as players last known veh")
PRINTNL()
eVehState = PTVS_0_noVehicle
g_vPlayerVeh[ePed] = NULL
EXIT
ENDIF
ENDREPEAT
// // // // // // // // // // // // // // // // // //
#ENDIF
#IF NOT USE_TU_CHANGES
#IF IS_DEBUG_BUILD
PRINTSTRING("url:bugstar:1648196 - switch trying to store a vehgen vehicle not not using TU changes so who knows if it worked!!")
PRINTNL()
#ENDIF
#ENDIF
IF NOT IS_ENTITY_DEAD(g_vPlayerVeh[ePed])
IF NOT IS_VEHICLE_IN_PLAYERS_GARAGE(g_vPlayerVeh[ePed], ePed, FALSE)
OR IS_PED_IN_VEHICLE(pedIndex, g_vPlayerVeh[ePed])
VECTOR vPedCoord, vVehCoord
vPedCoord = GET_ENTITY_COORDS(pedIndex)
vVehCoord = GET_ENTITY_COORDS(g_vPlayerVeh[ePed])
IF IS_PED_IN_VEHICLE_AND_SAFE_TO_REMOVE(pedIndex, g_vPlayerVeh[ePed])
IF VDIST2(vPedCoord, vVehCoord) < (150*150)
vVehStoredCoord = vVehCoord
fVehStoredHead = GET_ENTITY_HEADING(g_vPlayerVeh[ePed])
eVehState = PTVS_1_playerWithVehicle
g_vPlayerVeh[ePed] = vehicleIndex
IF VDIST2(vPedCoord, vVehCoord) < (1.5*1.5)
PRINTLN("STORE_VEH_DATA_FROM_VEH: PTVS_1_playerWithVehicle TOO CLOSE ", GET_PLAYER_PED_STRING(ePed), " ", GET_MODEL_NAME_OF_VEHICLE_FOR_DEBUG_ONLY(g_vPlayerVeh[ePed]), ", ", VDIST(vPedCoord, vVehCoord), ", vPedCoord:", vPedCoord)
ELSE
PRINTLN("STORE_VEH_DATA_FROM_VEH: PTVS_1_playerWithVehicle FAR ENOUGH ", GET_PLAYER_PED_STRING(ePed), " ", GET_MODEL_NAME_OF_VEHICLE_FOR_DEBUG_ONLY(g_vPlayerVeh[ePed]), ", ", VDIST(vPedCoord, vVehCoord), ", vPedCoord:", vPedCoord)
ENDIF
ENDIF
ENDIF
ELSE
eVehState = PTVS_0_noVehicle
g_vPlayerVeh[ePed] = NULL
ENDIF
ENDIF
ENDIF
ENDIF
INT iExtra
IF DOES_ENTITY_EXIST(vehicleIndex)
sVehData.model = GET_ENTITY_MODEL(vehicleIndex)
//sVehData.modelTrailer = DUMMY_MODEL_FOR_SCRIPT
VEHICLE_INDEX vehTrailer
IF GET_VEHICLE_TRAILER_VEHICLE(vehicleIndex, vehTrailer)
sVehData.modelTrailer = GET_ENTITY_MODEL(vehTrailer)
PRINTSTRING("store veh: there is a trailer")PRINTNL()
ELSE
PRINTSTRING("store veh: there is no trailer")PRINTNL()
ENDIF
sVehData.fDirtLevel = GET_VEHICLE_DIRT_LEVEL(vehicleIndex)
sVehData.fHealth = GET_ENTITY_HEALTH(vehicleIndex)
// Colours
sVehData.iColourCombo = GET_VEHICLE_COLOUR_COMBINATION(vehicleIndex)
IF sVehData.iColourCombo > -1
sVehData.bColourCombo = TRUE
sVehData.iColour1 = -1
sVehData.iColour2 = -1
ELSE
sVehData.bColourCombo = FALSE
GET_VEHICLE_COLOURS(vehicleIndex, sVehData.iColour1, sVehData.iColour2)
ENDIF
// Can't get vehicle extra colour for boats (url:bugstar:354001)
IF NOT IS_THIS_MODEL_A_BOAT(sVehData.model)
sVehData.bColourExtra = TRUE
GET_VEHICLE_EXTRA_COLOURS(vehicleIndex, sVehData.iColourExtra1, sVehData.iColourExtra2)
ELSE
sVehData.bColourExtra = FALSE
sVehData.iColourExtra1 = -1
sVehData.iColourExtra2 = -1
ENDIF
// Plates
sVehData.tlNumberPlate = GET_VEHICLE_NUMBER_PLATE_TEXT(vehicleIndex)
sVehData.iPlateBack = GET_VEHICLE_NUMBER_PLATE_TEXT_INDEX(vehicleIndex)
// Tyres
sVehData.bTyresCanBurst = GET_VEHICLE_TYRES_CAN_BURST(vehicleIndex)
GET_VEHICLE_TYRE_SMOKE_COLOR(vehicleIndex, sVehData.iTyreR, sVehData.iTyreG, sVehData.iTyreB)
// Windows
sVehData.iWindowTintColour = GET_VEHICLE_WINDOW_TINT(vehicleIndex)
// Neon lights
GET_VEHICLE_NEON_COLOUR(vehicleIndex, sVehData.iNeonR, sVehData.iNeonG, sVehData.iNeonB)
IF GET_VEHICLE_NEON_ENABLED(vehicleIndex, NEON_FRONT)
SET_BIT(sVehData.iFlags, VEHICLE_SETUP_FLAG_NEON_FRONT)
ELSE
CLEAR_BIT(sVehData.iFlags, VEHICLE_SETUP_FLAG_NEON_FRONT)
ENDIF
IF GET_VEHICLE_NEON_ENABLED(vehicleIndex, NEON_BACK)
SET_BIT(sVehData.iFlags, VEHICLE_SETUP_FLAG_NEON_BACK)
ELSE
CLEAR_BIT(sVehData.iFlags, VEHICLE_SETUP_FLAG_NEON_BACK)
ENDIF
IF GET_VEHICLE_NEON_ENABLED(vehicleIndex, NEON_LEFT)
SET_BIT(sVehData.iFlags, VEHICLE_SETUP_FLAG_NEON_LEFT)
ELSE
CLEAR_BIT(sVehData.iFlags, VEHICLE_SETUP_FLAG_NEON_LEFT)
ENDIF
IF GET_VEHICLE_NEON_ENABLED(vehicleIndex, NEON_RIGHT)
SET_BIT(sVehData.iFlags, VEHICLE_SETUP_FLAG_NEON_RIGHT)
ELSE
CLEAR_BIT(sVehData.iFlags, VEHICLE_SETUP_FLAG_NEON_RIGHT)
ENDIF
// Livery
sVehData.iLivery = GET_VEHICLE_LIVERY(vehicleIndex)
// Wheel type
sVehData.iWheelType = ENUM_TO_INT(GET_VEHICLE_WHEEL_TYPE(vehicleIndex))
// Extras
REPEAT NUMBER_OF_VEHICLE_EXTRAS iExtra
sVehData.bExtraOn[iExtra] = IS_VEHICLE_EXTRA_TURNED_ON(vehicleIndex, iExtra+1)
ENDREPEAT
IF IS_VEHICLE_A_CONVERTIBLE(vehicleIndex)
CONVERTIBLE_ROOF_STATE eRoofState = GET_CONVERTIBLE_ROOF_STATE(vehicleIndex)
IF eRoofState = CRS_RAISED
OR eRoofState = CRS_ROOF_STUCK_RAISED
sVehData.bConvertible = TRUE
PRINTSTRING("store veh: is a convertible-raised")PRINTNL()
ELSE
sVehData.bConvertible = FALSE
PRINTSTRING("store veh: is a convertible-lowered")PRINTNL()
ENDIF
ELSE
sVehData.bConvertible = FALSE
PRINTSTRING("store veh: not a convertible")PRINTNL()
ENDIF
// Radio
IF (pedIndex = PLAYER_PED_ID())
sVehData.iRadioIndex = GET_PLAYER_RADIO_STATION_INDEX()
ELSE
//
ENDIF
// Mods
GET_VEHICLE_MOD_DATA(vehicleIndex, sVehData.iModIndex, sVehData.iModVariation)
// Env Eff
sVehData.fEnvEff = GET_VEHICLE_ENVEFF_SCALE(vehicleIndex)
sVehData.bIsPlayerVehicle = IS_VEHICLE_IN_TEMP_PLAYER_VEHICLE_ID_LIST(vehicleIndex)
#IF USE_TU_CHANGES
eVehGen = VEHGEN_NONE
SWITCH ePed
CASE CHAR_MICHAEL
IF g_savedGlobals.sVehicleGenData.sDynamicData[0].eModel = GET_ENTITY_MODEL(vehicleIndex)
eVehGen = VEHGEN_WEB_HANGAR_MICHAEL
ENDIF
BREAK
CASE CHAR_FRANKLIN
IF g_savedGlobals.sVehicleGenData.sDynamicData[1].eModel = GET_ENTITY_MODEL(vehicleIndex)
eVehGen = VEHGEN_WEB_HANGAR_FRANKLIN
ENDIF
BREAK
CASE CHAR_TREVOR
IF g_savedGlobals.sVehicleGenData.sDynamicData[2].eModel = GET_ENTITY_MODEL(vehicleIndex)
eVehGen = VEHGEN_WEB_HANGAR_TREVOR
ENDIF
BREAK
ENDSWITCH
#ENDIF
ELSE
eVehState = PTVS_0_noVehicle
vVehStoredCoord = <<0,0,0>>
fVehStoredHead = 0
sVehData.model = DUMMY_MODEL_FOR_SCRIPT
sVehData.modelTrailer = DUMMY_MODEL_FOR_SCRIPT
sVehData.fDirtLevel = 0
sVehData.fHealth = 0
sVehData.iColourCombo = 0
sVehData.iColour1 = 0
sVehData.iColour2 = 0
sVehData.iColourExtra1 = 0
sVehData.iColourExtra2 = 0
sVehData.bColourCombo = FALSE
sVehData.bColourExtra = FALSE
REPEAT COUNT_OF(sVehData.bExtraOn) iExtra
sVehData.bExtraOn[iExtra] = FALSE
ENDREPEAT
sVehData.bConvertible = FALSE
sVehData.iRadioIndex = 0
eVehState = PTVS_0_noVehicle
#IF USE_TU_CHANGES
eVehGen = VEHGEN_NONE
#ENDIF
sVehData.fEnvEff = 0.0
ENDIF
ENDPROC
/// PURPOSE: Returns the vehicle model enum for the specified story character
PROC STORE_VEH_DATA_FROM_PEDCLF(PED_INDEX pedIndex, PED_VEH_DATA_STRUCT &sVehData,
VECTOR &vVehStoredCoord, FLOAT &fVehStoredHead, enumTimetableVehState &eVehState
#IF USE_TU_CHANGES , VEHICLE_GEN_NAME_ENUM &eVehGen #ENDIF )
// eVehState = PTVS_0_noVehicle
// vVehStoredCoord = <<0,0,0>>
// fVehStoredHead = 0
VEHICLE_INDEX vehicleIndex = NULL
IF DOES_ENTITY_EXIST(pedIndex)
IF NOT IS_ENTITY_DEAD(pedIndex)
IF IS_PED_IN_ANY_VEHICLE(pedIndex)
vehicleIndex = GET_VEHICLE_PED_IS_IN(pedIndex)
eVehState = PTVS_2_playerInVehicle
ELSE
enumCharacterList ePed = GET_PLAYER_PED_ENUMCLF(pedIndex)
IF NOT IS_ENTITY_DEAD(g_vPlayerVeh[ePed])
IF IS_VEHICLE_SEAT_FREE(g_vPlayerVeh[ePed], VS_DRIVER) //#1519778
VECTOR vPedCoord, vVehCoord
vPedCoord = GET_ENTITY_COORDS(pedIndex)
vVehCoord = GET_ENTITY_COORDS(g_vPlayerVeh[ePed])
IF VDIST2(vPedCoord, vVehCoord) < (150*150)
// vVehStoredCoord = vVehCoord
// fVehStoredHead = GET_ENTITY_HEADING(g_vPlayerVeh[ePed])
// eVehState = PTVS_1_playerWithVehicle
// vehicleIndex = g_vPlayerVeh[ePed]
//
// IF VDIST2(vPedCoord, vVehCoord) < (1.5*1.5)
// PRINTLN("STORE_VEH_DATA_FROM_PEDCLF: PTVS_1_playerWithVehicle TOO CLOSE ", GET_PLAYER_PED_STRING(ePed), " ", VDIST(vPedCoord, vVehCoord))
// ELSE
// PRINTLN("STORE_VEH_DATA_FROM_PEDCLF: PTVS_1_playerWithVehicle FAR ENOUGH ", GET_PLAYER_PED_STRING(ePed), " ", VDIST(vPedCoord, vVehCoord))
// ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
STORE_VEH_DATA_FROM_VEH(pedIndex, vehicleIndex, sVehData,
vVehStoredCoord, fVehStoredHead, eVehState #IF USE_TU_CHANGES , eVehGen #ENDIF )
ENDPROC
PROC STORE_VEH_DATA_FROM_PEDNRM(PED_INDEX pedIndex, PED_VEH_DATA_STRUCT &sVehData,
VECTOR &vVehStoredCoord, FLOAT &fVehStoredHead, enumTimetableVehState &eVehState
#IF USE_TU_CHANGES , VEHICLE_GEN_NAME_ENUM &eVehGen #ENDIF )
// eVehState = PTVS_0_noVehicle
// vVehStoredCoord = <<0,0,0>>
// fVehStoredHead = 0
VEHICLE_INDEX vehicleIndex = NULL
IF DOES_ENTITY_EXIST(pedIndex)
IF NOT IS_ENTITY_DEAD(pedIndex)
IF IS_PED_IN_ANY_VEHICLE(pedIndex)
vehicleIndex = GET_VEHICLE_PED_IS_IN(pedIndex)
eVehState = PTVS_2_playerInVehicle
ELSE
enumCharacterList ePed = GET_PLAYER_PED_ENUMNRM(pedIndex)
IF NOT IS_ENTITY_DEAD(g_vPlayerVeh[ePed])
IF IS_VEHICLE_SEAT_FREE(g_vPlayerVeh[ePed], VS_DRIVER) //#1519778
VECTOR vPedCoord, vVehCoord
vPedCoord = GET_ENTITY_COORDS(pedIndex)
vVehCoord = GET_ENTITY_COORDS(g_vPlayerVeh[ePed])
IF VDIST2(vPedCoord, vVehCoord) < (150*150)
// vVehStoredCoord = vVehCoord
// fVehStoredHead = GET_ENTITY_HEADING(g_vPlayerVeh[ePed])
// eVehState = PTVS_1_playerWithVehicle
// vehicleIndex = g_vPlayerVeh[ePed]
//
// IF VDIST2(vPedCoord, vVehCoord) < (1.5*1.5)
// PRINTLN("STORE_VEH_DATA_FROM_PEDNRM: PTVS_1_playerWithVehicle TOO CLOSE ", GET_PLAYER_PED_STRING(ePed), " ", VDIST(vPedCoord, vVehCoord))
// ELSE
// PRINTLN("STORE_VEH_DATA_FROM_PEDNRM: PTVS_1_playerWithVehicle FAR ENOUGH ", GET_PLAYER_PED_STRING(ePed), " ", VDIST(vPedCoord, vVehCoord))
// ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
STORE_VEH_DATA_FROM_VEH(pedIndex, vehicleIndex, sVehData,
vVehStoredCoord, fVehStoredHead, eVehState #IF USE_TU_CHANGES , eVehGen #ENDIF )
ENDPROC
PROC STORE_VEH_DATA_FROM_PED(PED_INDEX pedIndex, PED_VEH_DATA_STRUCT &sVehData,
VECTOR &vVehStoredCoord, FLOAT &fVehStoredHead, enumTimetableVehState &eVehState
#IF USE_TU_CHANGES , VEHICLE_GEN_NAME_ENUM &eVehGen #ENDIF )
BOOL awkwardAngle = FALSE
#if USE_CLF_DLC
if g_bLoadedClifford
STORE_VEH_DATA_FROM_PEDCLF(pedIndex,sVehData,vVehStoredCoord,fVehStoredHead,eVehState #IF USE_TU_CHANGES , eVehGen #ENDIF )
exit
endif
#endif
#if USE_NRM_DLC
if g_bLoadedNorman
STORE_VEH_DATA_FROM_PEDNRM(pedIndex,sVehData,vVehStoredCoord,fVehStoredHead,eVehState #IF USE_TU_CHANGES , eVehGen #ENDIF )
exit
endif
#endif
// eVehState = PTVS_0_noVehicle
// vVehStoredCoord = <<0,0,0>>
// fVehStoredHead = 0
VEHICLE_INDEX vehicleIndex = NULL
IF DOES_ENTITY_EXIST(pedIndex)
IF NOT IS_ENTITY_DEAD(pedIndex)
IF IS_PED_IN_ANY_VEHICLE(pedIndex)
vehicleIndex = GET_VEHICLE_PED_IS_IN(pedIndex)
eVehState = PTVS_2_playerInVehicle
ELSE
enumCharacterList ePed = GET_PLAYER_PED_ENUM(pedIndex)
IF NOT IS_ENTITY_DEAD(g_vPlayerVeh[ePed])
IF IS_VEHICLE_SEAT_FREE(g_vPlayerVeh[ePed], VS_DRIVER) //#1519778
VECTOR vPedCoord, vVehCoord
vPedCoord = GET_ENTITY_COORDS(pedIndex)
vVehCoord = GET_ENTITY_COORDS(g_vPlayerVeh[ePed])
//B*-2337678
IF GET_ENTITY_MODEL(g_vPlayerVeh[ePed]) = luxor2
IF VDIST(vPedCoord, vVehCoord) < 10.0
PRINTLN("STORE_VEH_DATA_FROM_PED: PTVS_1_playerWithVehicle ", GET_PLAYER_PED_STRING(ePed), " ", VDIST(vPedCoord, vVehCoord))
eVehState = PTVS_2_playerInVehicle
vehicleIndex = g_vPlayerVeh[ePed]
awkwardAngle = TRUE
ELSE
PRINTLN("STORE_VEH_DATA_FROM_PED: PTVS_1_playerWithVehicle TOO FAR ", GET_PLAYER_PED_STRING(ePed), " ", VDIST(vPedCoord, vVehCoord))
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
STORE_VEH_DATA_FROM_VEH(pedIndex, vehicleIndex, sVehData,
vVehStoredCoord, fVehStoredHead, eVehState #IF USE_TU_CHANGES , eVehGen #ENDIF , awkwardAngle )
CPRINTLN(DEBUG_SWITCH,"eVehState = ",eVehState)
ENDPROC
/// PURPOSE:
PROC SET_VEH_DATA_FROM_STRUCT(VEHICLE_INDEX &vehicleIndex, PED_VEH_DATA_STRUCT sVehData)
// Colours
IF sVehData.bColourCombo
SET_VEHICLE_COLOUR_COMBINATION(vehicleIndex, sVehData.iColourCombo)
ELSE
SET_VEHICLE_COLOURS(vehicleIndex, sVehData.iColour1, sVehData.iColour2)
ENDIF
IF sVehData.bColourExtra
SET_VEHICLE_EXTRA_COLOURS(vehicleIndex, sVehData.iColourExtra1, sVehData.iColourExtra2)
ENDIF
// Dirt
SET_VEHICLE_DIRT_LEVEL(vehicleIndex, sVehData.fDirtLevel)
SET_ENTITY_HEALTH(vehicleIndex, sVehData.fHealth)
// Extras
INT iExtra
REPEAT NUMBER_OF_VEHICLE_EXTRAS iExtra
SET_VEHICLE_EXTRA(vehicleIndex, iExtra+1, (NOT sVehData.bExtraOn[iExtra]))
ENDREPEAT
IF sVehData.bConvertible
IF IS_VEHICLE_A_CONVERTIBLE(vehicleIndex)
RAISE_CONVERTIBLE_ROOF(vehicleIndex, TRUE) //SET_CONVERTIBLE_ROOF(vehicleIndex, sVehData.bConvertible)
ENDIF
ENDIF
// 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.
INT iPlateBack
TEXT_LABEL_15 tlPlateText
IF GET_CAR_APP_NUMBER_PLATE(tlPlateText, iPlateBack)
AND sVehData.bIsPlayerVehicle
#IF NOT USE_TU_CHANGES
SET_VEHICLE_NUMBER_PLATE_TEXT(vehicleIndex, sVehData.tlNumberPlate)
SET_VEHICLE_NUMBER_PLATE_TEXT_INDEX(vehicleIndex, sVehData.iPlateBack)
ELSE
#ENDIF
#IF USE_TU_CHANGES
SET_VEHICLE_NUMBER_PLATE_TEXT(vehicleIndex, tlPlateText)
SET_VEHICLE_NUMBER_PLATE_TEXT_INDEX(vehicleIndex, iPlateBack)
ELIF NOT IS_STRING_NULL_OR_EMPTY(sVehData.tlNumberPlate)
#ENDIF
SET_VEHICLE_NUMBER_PLATE_TEXT(vehicleIndex, sVehData.tlNumberPlate)
IF sVehData.iPlateBack >= 0
AND sVehData.iPlateBack < GET_NUMBER_OF_VEHICLE_NUMBER_PLATES()
SET_VEHICLE_NUMBER_PLATE_TEXT_INDEX(vehicleIndex, sVehData.iPlateBack)
ENDIF
ENDIF
// Tyres
SET_VEHICLE_TYRE_SMOKE_COLOR(vehicleIndex, sVehData.iTyreR, sVehData.iTyreG, sVehData.iTyreB)
SET_VEHICLE_TYRES_CAN_BURST(vehicleIndex, sVehData.bTyresCanBurst)
// Window tint
SET_VEHICLE_WINDOW_TINT(vehicleIndex, sVehData.iWindowTintColour)
// Neon lights
SET_VEHICLE_NEON_COLOUR(vehicleIndex, sVehData.iNeonR, sVehData.iNeonG, sVehData.iNeonB)
SET_VEHICLE_NEON_ENABLED(vehicleIndex, NEON_FRONT, IS_BIT_SET(sVehData.iFlags, VEHICLE_SETUP_FLAG_NEON_FRONT))
SET_VEHICLE_NEON_ENABLED(vehicleIndex, NEON_BACK, IS_BIT_SET(sVehData.iFlags, VEHICLE_SETUP_FLAG_NEON_BACK))
SET_VEHICLE_NEON_ENABLED(vehicleIndex, NEON_LEFT, IS_BIT_SET(sVehData.iFlags, VEHICLE_SETUP_FLAG_NEON_LEFT))
SET_VEHICLE_NEON_ENABLED(vehicleIndex, NEON_RIGHT, IS_BIT_SET(sVehData.iFlags, VEHICLE_SETUP_FLAG_NEON_RIGHT))
// Livery
IF GET_VEHICLE_LIVERY_COUNT(vehicleIndex) > 1
AND sVehData.iLivery >= 0
SET_VEHICLE_LIVERY(vehicleIndex, sVehData.iLivery)
ENDIF
// Wheels
IF sVehData.iWheelType > -1
IF NOT IS_THIS_MODEL_A_BICYCLE(GET_ENTITY_MODEL(vehicleIndex))
IF IS_THIS_MODEL_A_BIKE(GET_ENTITY_MODEL(vehicleIndex))
IF (INT_TO_ENUM(MOD_WHEEL_TYPE, sVehData.iWheelType) = MWT_BIKE)
SET_VEHICLE_WHEEL_TYPE(vehicleIndex, INT_TO_ENUM(MOD_WHEEL_TYPE, sVehData.iWheelType))
ENDIF
ELSE
SET_VEHICLE_WHEEL_TYPE(vehicleIndex, INT_TO_ENUM(MOD_WHEEL_TYPE, sVehData.iWheelType))
ENDIF
ENDIF
ENDIF
// Mods
SET_VEHICLE_MOD_DATA(vehicleIndex, sVehData.iModIndex, sVehData.iModVariation)
// Env Eff
SET_VEHICLE_ENVEFF_SCALE(vehicleIndex, sVehData.fEnvEff)
ENDPROC
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// PLAYER PED CREATION FUNCTIONS ///
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
ENUM enumCreateState
eCS_0_ok_to_create = 0,
eCS_1_PLAYER_NOT_PLAYING,
eCS_2_PLAYER_LAST_SCENE_DEAD,
eCS_3_SWITCH_IN_PROGRESS,
eCS_4_INVALID_LAST_TIME_ACTIVE,
eCS_5_TOO_MANY_HOURS_PASSED,
eCS_6_INVALID_LAST_KNOWN_COORDS,
eCS_7_TOO_FAR_TO_CREATE,
eCS_8_TOO_CLOSE_TO_CREATE,
eCS_9_SPHERE_VISIBLE,
eCS_10_POST_MISSION_SWITCH,
eCS_11_SUPRESSED_FOR_FRIEND_ACTIVITY,
eCS_12_NEAR_MISSION_TRIGGER,
eCS_13_LEADIN_TRIGGER,
eCS_14_DIRECTOR_MODE,
// // // // // // // // // // // // // // // // // // // // // // // //
eDS_0_ok_to_delete, //15
eDS_1_PLAYER_NOT_PLAYING, //16
eDS_2_PLAYER_LAST_SCENE_DEAD, //17
eDS_3_CURRENT_SELECTOR_PED, //18
eDS_4_NEW_SELECTOR_PED, //19
eDS_5_SWITCH_IN_PROGRESS, //20
eDS_6_TOO_CLOSE_TO_DELETE, //21
eDS_7_ON_SCREEN, //22
// eDS_8_SWITCH_TYPE_MISSION, //*23
eDS_9_SWITCH_STATE_PROCESSING, //24
eDS_10_LEADIN, //25
eDS_11_DIRECTOR_MODE, //26
// // // // // // // // // // // // // // // // // // // // // // // //
eCS_MAX
ENDENUM
CONST_FLOAT fCONST_FRIEND_TOO_FAR_TO_CREATE 150.0
CONST_FLOAT fCONST_FRIEND_TOO_CLOSE_TO_CREATE 15.0
CONST_FLOAT fCONST_FRIEND_TOO_CLOSE_TO_DELETE 200.0
CONST_FLOAT fCONST_FRIEND_TOO_FAR_TO_SEE 40.0
FUNC BOOL SafeToCreatePlayerAmbientPedAtLastKnownLocationCLF(enumCharacterList ePed,enumCreateState &eCreateState)
IF NOT IS_PLAYER_PLAYING(PLAYER_ID())
eCreateState = eCS_1_PLAYER_NOT_PLAYING
RETURN FALSE
ENDIF
IF (g_savedGlobalsClifford.sPlayerSceneData.g_ePlayerLastScene[ePed] = PR_SCENE_DEAD)
eCreateState = eCS_2_PLAYER_LAST_SCENE_DEAD
RETURN FALSE
ENDIF
IF IS_PLAYER_SWITCH_IN_PROGRESS()
IF GET_PLAYER_SWITCH_TYPE() = SWITCH_TYPE_SHORT
eCreateState = eCS_3_SWITCH_IN_PROGRESS
RETURN FALSE
ENDIF
IF GET_PLAYER_SWITCH_STATE() != SWITCH_STATE_JUMPCUT_DESCENT
eCreateState = eCS_3_SWITCH_IN_PROGRESS
RETURN FALSE
ENDIF
ENDIF
TIMEOFDAY sLastTimeActive = g_savedGlobalsClifford.sPlayerData.sInfo.sLastTimeActive[ePed]
IF NOT Is_TIMEOFDAY_Valid(sLastTimeActive)
eCreateState = eCS_4_INVALID_LAST_TIME_ACTIVE
RETURN FALSE
ENDIF
IF HasNumOfHoursPassedSincePedTimeStruct(sLastTimeActive, g_iCONST_GAME_HOURS_FOR_DEFAULT_SWITCH)
eCreateState = eCS_5_TOO_MANY_HOURS_PASSED
RETURN FALSE
ENDIF
IF IS_CURRENTLY_ON_MISSION_TO_TYPE(MISSION_TYPE_DIRECTOR)
eCreateState = eCS_14_DIRECTOR_MODE
RETURN FALSE
ENDIF
VECTOR vFriendCharLastKnown = g_savedGlobalsClifford.sPlayerData.sInfo.vLastKnownCoords[ePed]
IF ARE_VECTORS_EQUAL(vFriendCharLastKnown, <<0,0,0>>)
AND (g_savedGlobalsClifford.sPlayerData.sInfo.fLastKnownHead[ePed] = 0)
eCreateState = eCS_6_INVALID_LAST_KNOWN_COORDS
RETURN FALSE
ENDIF
VECTOR vPlayerCharCurrent = GET_ENTITY_COORDS(PLAYER_PED_ID())
FLOAT fPlayerDistFromCharLastKnown2 = VDIST2(vFriendCharLastKnown, vPlayerCharCurrent)
IF (fPlayerDistFromCharLastKnown2 > (fCONST_FRIEND_TOO_FAR_TO_CREATE*fCONST_FRIEND_TOO_FAR_TO_CREATE))
eCreateState = eCS_7_TOO_FAR_TO_CREATE
RETURN FALSE
ENDIF
IF NOT IS_PLAYER_SWITCH_IN_PROGRESS()
IF (fPlayerDistFromCharLastKnown2 < (fCONST_FRIEND_TOO_CLOSE_TO_CREATE*fCONST_FRIEND_TOO_CLOSE_TO_CREATE))
eCreateState = eCS_8_TOO_CLOSE_TO_CREATE
RETURN FALSE
ENDIF
CONST_FLOAT fCONST_FRIEND_IGNORE_VISIBILITY_TO_CREATE 100.0
CONST_FLOAT fCONST_FRIENDSPHERE_VISIBILITY_TO_CREATE 30.0
IF (fPlayerDistFromCharLastKnown2 < (fCONST_FRIEND_IGNORE_VISIBILITY_TO_CREATE*fCONST_FRIEND_IGNORE_VISIBILITY_TO_CREATE))
IF (fPlayerDistFromCharLastKnown2 < (fCONST_FRIENDSPHERE_VISIBILITY_TO_CREATE*fCONST_FRIENDSPHERE_VISIBILITY_TO_CREATE))
IF IS_SPHERE_VISIBLE(vFriendCharLastKnown, 3.0)
eCreateState = eCS_9_SPHERE_VISIBLE
#IF IS_DEBUG_BUILD
DrawDebugSceneSphere(vFriendCharLastKnown, 3.0, HUD_COLOUR_BLUELIGHT, 0.1)
#ENDIF
RETURN FALSE
ENDIF
ELSE
IF IS_SPHERE_VISIBLE(vFriendCharLastKnown, 0.5)
AND WOULD_ENTITY_BE_OCCLUDED(GET_PLAYER_PED_MODEL(ePed), vFriendCharLastKnown, FALSE)
eCreateState = eCS_9_SPHERE_VISIBLE
#IF IS_DEBUG_BUILD
DrawDebugSceneSphere(vFriendCharLastKnown, 1.0, HUD_COLOUR_REDLIGHT, 0.1)
#ENDIF
RETURN FALSE
ENDIF
ENDIF
ENDIF
ENDIF
VECTOR vLastKnownCoords
FLOAT fLastKnownHead
IF GetLastKnownPedInfoPostMission(g_savedGlobalsClifford.sPlayerSceneData.g_ePlayerLastScene[ePed], vLastKnownCoords, fLastKnownHead)
eCreateState = eCS_10_POST_MISSION_SWITCH
RETURN FALSE
ENDIF
IF g_bSupressAmbientPlayersForFriendActivity
eCreateState = eCS_11_SUPRESSED_FOR_FRIEND_ACTIVITY
RETURN FALSE
ENDIF
STATIC_BLIP_NAME_ENUM eBlip
REPEAT g_iTotalStaticBlips eBlip
IF IS_BIT_SET(g_GameBlips[eBlip].iSetting,STATIC_BLIP_SETTING_ACTIVE)
CONST_FLOAT fCONST_MIN_DIST_FROM_MISSION_BLIP 10.0
VECTOR vBlipCoord = g_GameBlips[eBlip].vCoords[0]
IF VDIST2(vFriendCharLastKnown, vBlipCoord) < (fCONST_MIN_DIST_FROM_MISSION_BLIP*fCONST_MIN_DIST_FROM_MISSION_BLIP)
eCreateState = eCS_12_NEAR_MISSION_TRIGGER
RETURN FALSE
ENDIF
//for multi-char missions
IF IS_BIT_SET(g_GameBlips[eBlip].iSetting,STATIC_BLIP_SETTING_MULTI_COORD_AND_SPRITE)//g_GameBlips[eBlip].bMultiCoordAndSprite
INT iMultiBlip, iMULTI_BLIP_COUNT = 3
REPEAT iMULTI_BLIP_COUNT iMultiBlip
VECTOR vMultiBlipCoord = g_GameBlips[eBlip].vCoords[iMultiBlip]
IF NOT IS_VECTOR_ZERO(vMultiBlipCoord)
IF VDIST2(vFriendCharLastKnown, vMultiBlipCoord) < (fCONST_MIN_DIST_FROM_MISSION_BLIP*fCONST_MIN_DIST_FROM_MISSION_BLIP)
eCreateState = eCS_12_NEAR_MISSION_TRIGGER
RETURN FALSE
ENDIF
ENDIF
ENDREPEAT
ENDIF
ENDIF
ENDREPEAT
INT iTriggerIndex
REPEAT MAX_MISSION_TRIGGERS_TU iTriggerIndex
IF g_TriggerableMissionsTU[iTriggerIndex].bUsed
SP_MISSIONS eMissionID = g_TriggerableMissionsTU[iTriggerIndex].eMissionID
FLOAT fFriendRejectDistance = g_TriggerableMissionsTU[iTriggerIndex].sScene.fFriendRejectDistance
fFriendRejectDistance *= 1.5 //#1721545
INT iFriendsToAcceptBitset = g_TriggerableMissionsTU[iTriggerIndex].sScene.iFriendsToAcceptBitset
eBlip = g_sMissionStaticData[eMissionID].blip
VECTOR vBlipCoord = g_GameBlips[eBlip].vCoords[0]
FLOAT fDist2FamilyToTrigger = VDIST2(vFriendCharLastKnown, vBlipCoord)
IF NOT IS_BIT_SET(iFriendsToAcceptBitset, ENUM_TO_INT(ePed))
IF (fDist2FamilyToTrigger < (fFriendRejectDistance*fFriendRejectDistance))
eCreateState = eCS_13_LEADIN_TRIGGER
RETURN FALSE
ENDIF
ENDIF
ENDIF
ENDREPEAT
//
eCreateState = eCS_0_ok_to_create
RETURN TRUE
ENDFUNC
FUNC BOOL SafeToCreatePlayerAmbientPedAtLastKnownLocationNRM(enumCharacterList ePed,enumCreateState &eCreateState)
IF NOT IS_PLAYER_PLAYING(PLAYER_ID())
eCreateState = eCS_1_PLAYER_NOT_PLAYING
RETURN FALSE
ENDIF
IF (g_savedGlobalsnorman.sPlayerSceneData.g_ePlayerLastScene[ePed] = PR_SCENE_DEAD)
eCreateState = eCS_2_PLAYER_LAST_SCENE_DEAD
RETURN FALSE
ENDIF
IF IS_PLAYER_SWITCH_IN_PROGRESS()
IF GET_PLAYER_SWITCH_TYPE() = SWITCH_TYPE_SHORT
eCreateState = eCS_3_SWITCH_IN_PROGRESS
RETURN FALSE
ENDIF
IF GET_PLAYER_SWITCH_STATE() != SWITCH_STATE_JUMPCUT_DESCENT
eCreateState = eCS_3_SWITCH_IN_PROGRESS
RETURN FALSE
ENDIF
ENDIF
TIMEOFDAY sLastTimeActive = g_savedGlobalsnorman.sPlayerData.sInfo.sLastTimeActive[ePed]
IF NOT Is_TIMEOFDAY_Valid(sLastTimeActive)
eCreateState = eCS_4_INVALID_LAST_TIME_ACTIVE
RETURN FALSE
ENDIF
IF HasNumOfHoursPassedSincePedTimeStruct(sLastTimeActive, g_iCONST_GAME_HOURS_FOR_DEFAULT_SWITCH)
eCreateState = eCS_5_TOO_MANY_HOURS_PASSED
RETURN FALSE
ENDIF
IF IS_CURRENTLY_ON_MISSION_TO_TYPE(MISSION_TYPE_DIRECTOR)
eCreateState = eCS_14_DIRECTOR_MODE
RETURN FALSE
ENDIF
VECTOR vFriendCharLastKnown = g_savedGlobalsnorman.sPlayerData.sInfo.vLastKnownCoords[ePed]
IF ARE_VECTORS_EQUAL(vFriendCharLastKnown, <<0,0,0>>)
AND (g_savedGlobals.sPlayerData.sInfo.fLastKnownHead[ePed] = 0)
eCreateState = eCS_6_INVALID_LAST_KNOWN_COORDS
RETURN FALSE
ENDIF
VECTOR vPlayerCharCurrent = GET_ENTITY_COORDS(PLAYER_PED_ID())
FLOAT fPlayerDistFromCharLastKnown2 = VDIST2(vFriendCharLastKnown, vPlayerCharCurrent)
IF (fPlayerDistFromCharLastKnown2 > (fCONST_FRIEND_TOO_FAR_TO_CREATE*fCONST_FRIEND_TOO_FAR_TO_CREATE))
eCreateState = eCS_7_TOO_FAR_TO_CREATE
RETURN FALSE
ENDIF
IF NOT IS_PLAYER_SWITCH_IN_PROGRESS()
IF (fPlayerDistFromCharLastKnown2 < (fCONST_FRIEND_TOO_CLOSE_TO_CREATE*fCONST_FRIEND_TOO_CLOSE_TO_CREATE))
eCreateState = eCS_8_TOO_CLOSE_TO_CREATE
RETURN FALSE
ENDIF
CONST_FLOAT fCONST_FRIEND_IGNORE_VISIBILITY_TO_CREATE 100.0
CONST_FLOAT fCONST_FRIENDSPHERE_VISIBILITY_TO_CREATE 30.0
IF (fPlayerDistFromCharLastKnown2 < (fCONST_FRIEND_IGNORE_VISIBILITY_TO_CREATE*fCONST_FRIEND_IGNORE_VISIBILITY_TO_CREATE))
IF (fPlayerDistFromCharLastKnown2 < (fCONST_FRIENDSPHERE_VISIBILITY_TO_CREATE*fCONST_FRIENDSPHERE_VISIBILITY_TO_CREATE))
IF IS_SPHERE_VISIBLE(vFriendCharLastKnown, 3.0)
eCreateState = eCS_9_SPHERE_VISIBLE
#IF IS_DEBUG_BUILD
DrawDebugSceneSphere(vFriendCharLastKnown, 3.0, HUD_COLOUR_BLUELIGHT, 0.1)
#ENDIF
RETURN FALSE
ENDIF
ELSE
IF IS_SPHERE_VISIBLE(vFriendCharLastKnown, 0.5)
AND WOULD_ENTITY_BE_OCCLUDED(GET_PLAYER_PED_MODELNRM(ePed), vFriendCharLastKnown, FALSE)
eCreateState = eCS_9_SPHERE_VISIBLE
#IF IS_DEBUG_BUILD
DrawDebugSceneSphere(vFriendCharLastKnown, 1.0, HUD_COLOUR_REDLIGHT, 0.1)
#ENDIF
RETURN FALSE
ENDIF
ENDIF
ENDIF
ENDIF
VECTOR vLastKnownCoords
FLOAT fLastKnownHead
IF GetLastKnownPedInfoPostMission(g_savedGlobalsnorman.sPlayerSceneData.g_ePlayerLastScene[ePed], vLastKnownCoords, fLastKnownHead)
eCreateState = eCS_10_POST_MISSION_SWITCH
RETURN FALSE
ENDIF
IF g_bSupressAmbientPlayersForFriendActivity
eCreateState = eCS_11_SUPRESSED_FOR_FRIEND_ACTIVITY
RETURN FALSE
ENDIF
STATIC_BLIP_NAME_ENUM eBlip
REPEAT g_iTotalStaticBlips eBlip
IF IS_BIT_SET(g_GameBlips[eBlip].iSetting,STATIC_BLIP_SETTING_ACTIVE)
CONST_FLOAT fCONST_MIN_DIST_FROM_MISSION_BLIP 10.0
VECTOR vBlipCoord = g_GameBlips[eBlip].vCoords[0]
IF VDIST2(vFriendCharLastKnown, vBlipCoord) < (fCONST_MIN_DIST_FROM_MISSION_BLIP*fCONST_MIN_DIST_FROM_MISSION_BLIP)
eCreateState = eCS_12_NEAR_MISSION_TRIGGER
RETURN FALSE
ENDIF
//for multi-char missions
IF IS_BIT_SET(g_GameBlips[eBlip].iSetting,STATIC_BLIP_SETTING_MULTI_COORD_AND_SPRITE)//g_GameBlips[eBlip].bMultiCoordAndSprite
INT iMultiBlip, iMULTI_BLIP_COUNT = 3
REPEAT iMULTI_BLIP_COUNT iMultiBlip
VECTOR vMultiBlipCoord = g_GameBlips[eBlip].vCoords[iMultiBlip]
IF NOT IS_VECTOR_ZERO(vMultiBlipCoord)
IF VDIST2(vFriendCharLastKnown, vMultiBlipCoord) < (fCONST_MIN_DIST_FROM_MISSION_BLIP*fCONST_MIN_DIST_FROM_MISSION_BLIP)
eCreateState = eCS_12_NEAR_MISSION_TRIGGER
RETURN FALSE
ENDIF
ENDIF
ENDREPEAT
ENDIF
ENDIF
ENDREPEAT
INT iTriggerIndex
REPEAT MAX_MISSION_TRIGGERS_TU iTriggerIndex
IF g_TriggerableMissionsTU[iTriggerIndex].bUsed
SP_MISSIONS eMissionID = g_TriggerableMissionsTU[iTriggerIndex].eMissionID
FLOAT fFriendRejectDistance = g_TriggerableMissionsTU[iTriggerIndex].sScene.fFriendRejectDistance
fFriendRejectDistance *= 1.5 //#1721545
INT iFriendsToAcceptBitset = g_TriggerableMissionsTU[iTriggerIndex].sScene.iFriendsToAcceptBitset
eBlip = g_sMissionStaticData[eMissionID].blip
VECTOR vBlipCoord = g_GameBlips[eBlip].vCoords[0]
FLOAT fDist2FamilyToTrigger = VDIST2(vFriendCharLastKnown, vBlipCoord)
IF NOT IS_BIT_SET(iFriendsToAcceptBitset, ENUM_TO_INT(ePed))
IF (fDist2FamilyToTrigger < (fFriendRejectDistance*fFriendRejectDistance))
eCreateState = eCS_13_LEADIN_TRIGGER
RETURN FALSE
ENDIF
ENDIF
ENDIF
ENDREPEAT
//
eCreateState = eCS_0_ok_to_create
RETURN TRUE
ENDFUNC
FUNC BOOL SafeToCreatePlayerAmbientPedAtLastKnownLocation(enumCharacterList ePed,enumCreateState &eCreateState)
#if USE_CLF_DLC
if g_bLoadedClifford
return SafeToCreatePlayerAmbientPedAtLastKnownLocationCLF(ePed,eCreateState)
endif
#endif
#if USE_NRM_DLC
if g_bLoadedNorman
return SafeToCreatePlayerAmbientPedAtLastKnownLocationNRM(ePed,eCreateState)
endif
#endif
IF NOT IS_PLAYER_PLAYING(PLAYER_ID())
eCreateState = eCS_1_PLAYER_NOT_PLAYING
RETURN FALSE
ENDIF
IF (g_SavedGlobals.sPlayerSceneData.g_ePlayerLastScene[ePed] = PR_SCENE_DEAD)
eCreateState = eCS_2_PLAYER_LAST_SCENE_DEAD
RETURN FALSE
ENDIF
IF IS_PLAYER_SWITCH_IN_PROGRESS()
IF GET_PLAYER_SWITCH_TYPE() = SWITCH_TYPE_SHORT
eCreateState = eCS_3_SWITCH_IN_PROGRESS
RETURN FALSE
ENDIF
IF GET_PLAYER_SWITCH_STATE() != SWITCH_STATE_JUMPCUT_DESCENT
eCreateState = eCS_3_SWITCH_IN_PROGRESS
RETURN FALSE
ENDIF
ENDIF
TIMEOFDAY sLastTimeActive = g_savedGlobals.sPlayerData.sInfo.sLastTimeActive[ePed]
IF NOT Is_TIMEOFDAY_Valid(sLastTimeActive)
eCreateState = eCS_4_INVALID_LAST_TIME_ACTIVE
RETURN FALSE
ENDIF
IF HasNumOfHoursPassedSincePedTimeStruct(sLastTimeActive, g_iCONST_GAME_HOURS_FOR_DEFAULT_SWITCH)
eCreateState = eCS_5_TOO_MANY_HOURS_PASSED
RETURN FALSE
ENDIF
IF IS_CURRENTLY_ON_MISSION_TO_TYPE(MISSION_TYPE_DIRECTOR)
eCreateState = eCS_14_DIRECTOR_MODE
RETURN FALSE
ENDIF
VECTOR vFriendCharLastKnown = g_savedGlobals.sPlayerData.sInfo.vLastKnownCoords[ePed]
IF ARE_VECTORS_EQUAL(vFriendCharLastKnown, <<0,0,0>>)
AND (g_savedGlobals.sPlayerData.sInfo.fLastKnownHead[ePed] = 0)
eCreateState = eCS_6_INVALID_LAST_KNOWN_COORDS
RETURN FALSE
ENDIF
VECTOR vPlayerCharCurrent = GET_ENTITY_COORDS(PLAYER_PED_ID())
FLOAT fPlayerDistFromCharLastKnown2 = VDIST2(vFriendCharLastKnown, vPlayerCharCurrent)
IF (fPlayerDistFromCharLastKnown2 > (fCONST_FRIEND_TOO_FAR_TO_CREATE*fCONST_FRIEND_TOO_FAR_TO_CREATE))
eCreateState = eCS_7_TOO_FAR_TO_CREATE
RETURN FALSE
ENDIF
IF NOT IS_PLAYER_SWITCH_IN_PROGRESS()
IF (fPlayerDistFromCharLastKnown2 < (fCONST_FRIEND_TOO_CLOSE_TO_CREATE*fCONST_FRIEND_TOO_CLOSE_TO_CREATE))
eCreateState = eCS_8_TOO_CLOSE_TO_CREATE
RETURN FALSE
ENDIF
CONST_FLOAT fCONST_FRIEND_IGNORE_VISIBILITY_TO_CREATE 100.0
CONST_FLOAT fCONST_FRIENDSPHERE_VISIBILITY_TO_CREATE 30.0
IF (fPlayerDistFromCharLastKnown2 < (fCONST_FRIEND_IGNORE_VISIBILITY_TO_CREATE*fCONST_FRIEND_IGNORE_VISIBILITY_TO_CREATE))
IF (fPlayerDistFromCharLastKnown2 < (fCONST_FRIENDSPHERE_VISIBILITY_TO_CREATE*fCONST_FRIENDSPHERE_VISIBILITY_TO_CREATE))
IF IS_SPHERE_VISIBLE(vFriendCharLastKnown, 3.0)
eCreateState = eCS_9_SPHERE_VISIBLE
#IF IS_DEBUG_BUILD
DrawDebugSceneSphere(vFriendCharLastKnown, 3.0, HUD_COLOUR_BLUELIGHT, 0.1)
#ENDIF
RETURN FALSE
ENDIF
ELSE
IF IS_SPHERE_VISIBLE(vFriendCharLastKnown, 0.5)
AND WOULD_ENTITY_BE_OCCLUDED(GET_PLAYER_PED_MODEL(ePed), vFriendCharLastKnown, FALSE)
eCreateState = eCS_9_SPHERE_VISIBLE
#IF IS_DEBUG_BUILD
DrawDebugSceneSphere(vFriendCharLastKnown, 1.0, HUD_COLOUR_REDLIGHT, 0.1)
#ENDIF
RETURN FALSE
ENDIF
ENDIF
ENDIF
ENDIF
VECTOR vLastKnownCoords
FLOAT fLastKnownHead
#if USE_CLF_DLC
IF GetLastKnownPedInfoPostMission(g_savedGlobalsClifford.sPlayerSceneData.g_ePlayerLastScene[ePed], vLastKnownCoords, fLastKnownHead)
eCreateState = eCS_10_POST_MISSION_SWITCH
RETURN FALSE
ENDIF
#endif
#if USE_NRM_DLC
IF GetLastKnownPedInfoPostMission(g_savedGlobalsnorman.sPlayerSceneData.g_ePlayerLastScene[ePed], vLastKnownCoords, fLastKnownHead)
eCreateState = eCS_10_POST_MISSION_SWITCH
RETURN FALSE
ENDIF
#endif
#if not USE_CLF_DLC
#if not USE_NRM_DLC
IF GetLastKnownPedInfoPostMission(g_SavedGlobals.sPlayerSceneData.g_ePlayerLastScene[ePed], vLastKnownCoords, fLastKnownHead)
eCreateState = eCS_10_POST_MISSION_SWITCH
RETURN FALSE
ENDIF
#endif
#endif
IF g_bSupressAmbientPlayersForFriendActivity
eCreateState = eCS_11_SUPRESSED_FOR_FRIEND_ACTIVITY
RETURN FALSE
ENDIF
STATIC_BLIP_NAME_ENUM eBlip
REPEAT g_iTotalStaticBlips eBlip
IF IS_BIT_SET(g_GameBlips[eBlip].iSetting,STATIC_BLIP_SETTING_ACTIVE)
CONST_FLOAT fCONST_MIN_DIST_FROM_MISSION_BLIP 10.0
VECTOR vBlipCoord = g_GameBlips[eBlip].vCoords[0]
IF VDIST2(vFriendCharLastKnown, vBlipCoord) < (fCONST_MIN_DIST_FROM_MISSION_BLIP*fCONST_MIN_DIST_FROM_MISSION_BLIP)
eCreateState = eCS_12_NEAR_MISSION_TRIGGER
RETURN FALSE
ENDIF
//for multi-char missions
IF IS_BIT_SET(g_GameBlips[eBlip].iSetting,STATIC_BLIP_SETTING_MULTI_COORD_AND_SPRITE)//g_GameBlips[eBlip].bMultiCoordAndSprite
INT iMultiBlip, iMULTI_BLIP_COUNT = 3
REPEAT iMULTI_BLIP_COUNT iMultiBlip
VECTOR vMultiBlipCoord = g_GameBlips[eBlip].vCoords[iMultiBlip]
IF NOT IS_VECTOR_ZERO(vMultiBlipCoord)
IF VDIST2(vFriendCharLastKnown, vMultiBlipCoord) < (fCONST_MIN_DIST_FROM_MISSION_BLIP*fCONST_MIN_DIST_FROM_MISSION_BLIP)
eCreateState = eCS_12_NEAR_MISSION_TRIGGER
RETURN FALSE
ENDIF
ENDIF
ENDREPEAT
ENDIF
ENDIF
ENDREPEAT
INT iTriggerIndex
#if USE_CLF_DLC
REPEAT MAX_MISSION_TRIGGERS_TU iTriggerIndex
IF g_TriggerableMissionsTU[iTriggerIndex].bUsed
SP_MISSIONS eMissionID = g_TriggerableMissionsTU[iTriggerIndex].eMissionID
FLOAT fFriendRejectDistance = g_TriggerableMissionsTU[iTriggerIndex].sScene.fFriendRejectDistance
fFriendRejectDistance *= 1.5 //#1721545
INT iFriendsToAcceptBitset = g_TriggerableMissionsTU[iTriggerIndex].sScene.iFriendsToAcceptBitset
eBlip = g_sMissionStaticData[eMissionID].blip
VECTOR vBlipCoord = g_GameBlips[eBlip].vCoords[0]
FLOAT fDist2FamilyToTrigger = VDIST2(vFriendCharLastKnown, vBlipCoord)
IF NOT IS_BIT_SET(iFriendsToAcceptBitset, ENUM_TO_INT(ePed))
IF (fDist2FamilyToTrigger < (fFriendRejectDistance*fFriendRejectDistance))
eCreateState = eCS_13_LEADIN_TRIGGER
RETURN FALSE
ENDIF
ENDIF
ENDIF
ENDREPEAT
#endif
#if USE_NRM_DLC
REPEAT MAX_MISSION_TRIGGERS_TU iTriggerIndex
IF g_TriggerableMissionsTU[iTriggerIndex].bUsed
SP_MISSIONS eMissionID = g_TriggerableMissionsTU[iTriggerIndex].eMissionID
FLOAT fFriendRejectDistance = g_TriggerableMissionsTU[iTriggerIndex].sScene.fFriendRejectDistance
fFriendRejectDistance *= 1.5 //#1721545
INT iFriendsToAcceptBitset = g_TriggerableMissionsTU[iTriggerIndex].sScene.iFriendsToAcceptBitset
eBlip = g_sMissionStaticData[eMissionID].blip
VECTOR vBlipCoord = g_GameBlips[eBlip].vCoords[0]
FLOAT fDist2FamilyToTrigger = VDIST2(vFriendCharLastKnown, vBlipCoord)
IF NOT IS_BIT_SET(iFriendsToAcceptBitset, ENUM_TO_INT(ePed))
IF (fDist2FamilyToTrigger < (fFriendRejectDistance*fFriendRejectDistance))
eCreateState = eCS_13_LEADIN_TRIGGER
RETURN FALSE
ENDIF
ENDIF
ENDIF
ENDREPEAT
#endif
#if not USE_SP_DLC
REPEAT MAX_MISSION_TRIGGERS iTriggerIndex
IF g_TriggerableMissions[iTriggerIndex].bUsed
SP_MISSIONS eMissionID = g_TriggerableMissions[iTriggerIndex].eMissionID
FLOAT fFriendRejectDistance = g_TriggerableMissions[iTriggerIndex].sScene.fFriendRejectDistance
fFriendRejectDistance *= 1.5 //#1721545
INT iFriendsToAcceptBitset = g_TriggerableMissions[iTriggerIndex].sScene.iFriendsToAcceptBitset
eBlip = g_sMissionStaticData[eMissionID].blip
VECTOR vBlipCoord = g_GameBlips[eBlip].vCoords[0]
FLOAT fDist2FamilyToTrigger = VDIST2(vFriendCharLastKnown, vBlipCoord)
IF NOT IS_BIT_SET(iFriendsToAcceptBitset, ENUM_TO_INT(ePed))
IF (fDist2FamilyToTrigger < (fFriendRejectDistance*fFriendRejectDistance))
eCreateState = eCS_13_LEADIN_TRIGGER
RETURN FALSE
ENDIF
ENDIF
ENDIF
ENDREPEAT
#endif
//
eCreateState = eCS_0_ok_to_create
RETURN TRUE
ENDFUNC
FUNC BOOL SafeToDeletePlayerAmbientPed(PED_INDEX pedID, enumCharacterList ePed, SELECTOR_SLOTS_ENUM eSelectorChar,
enumCreateState &eDeleteState)
IF NOT IS_PLAYER_PLAYING(PLAYER_ID())
eDeleteState = eDS_1_PLAYER_NOT_PLAYING
RETURN FALSE
ENDIF
#if USE_CLF_DLC
IF (g_savedGlobalsClifford.sPlayerSceneData.g_ePlayerLastScene[ePed] = PR_SCENE_DEAD)
eDeleteState = eDS_2_PLAYER_LAST_SCENE_DEAD
RETURN FALSE
ENDIF
#endif
#if USE_NRM_DLC
IF (g_savedGlobalsnorman.sPlayerSceneData.g_ePlayerLastScene[ePed] = PR_SCENE_DEAD)
eDeleteState = eDS_2_PLAYER_LAST_SCENE_DEAD
RETURN FALSE
ENDIF
#endif
#if not USE_SP_DLC
IF (g_SavedGlobals.sPlayerSceneData.g_ePlayerLastScene[ePed] = PR_SCENE_DEAD)
eDeleteState = eDS_2_PLAYER_LAST_SCENE_DEAD
RETURN FALSE
ENDIF
#endif
// IF g_sPlayerPedRequest.sSelectorPeds.eCurrentSelectorPed = eSelectorChar
// eDeleteState = eDS_3_CURRENT_SELECTOR_PED
// RETURN FALSE
// ENDIF
IF g_sPlayerPedRequest.sSelectorPeds.eNewSelectorPed = eSelectorChar
eDeleteState = eDS_4_NEW_SELECTOR_PED
RETURN FALSE
ENDIF
IF IS_PLAYER_SWITCH_IN_PROGRESS()
eDeleteState = eDS_5_SWITCH_IN_PROGRESS
RETURN FALSE
ENDIF
IF g_sPlayerPedRequest.eState = PR_STATE_PROCESSING
eDeleteState = eDS_9_SWITCH_STATE_PROCESSING
RETURN FALSE
ENDIF
IF IS_CURRENTLY_ON_MISSION_TO_TYPE(MISSION_TYPE_DIRECTOR)
eDeleteState = eDS_11_DIRECTOR_MODE
RETURN TRUE
ENDIF
VECTOR vFriendCharLastKnown = GET_ENTITY_COORDS(pedID, FALSE)
VECTOR vPlayerCharCurrent = GET_ENTITY_COORDS(PLAYER_PED_ID())
FLOAT fPlayerDistFromCharLastKnown2 = VDIST2(vFriendCharLastKnown, vPlayerCharCurrent)
IF HAS_COLLISION_LOADED_AROUND_ENTITY(pedID)
IF (fPlayerDistFromCharLastKnown2 < (fCONST_FRIEND_TOO_CLOSE_TO_DELETE*fCONST_FRIEND_TOO_CLOSE_TO_DELETE))
eDeleteState = eDS_6_TOO_CLOSE_TO_DELETE
RETURN FALSE
ENDIF
ELSE
#IF IS_DEBUG_BUILD
//[MF] Commenting the following out as a fix for B* 1681207
// SAVE_STRING_TO_DEBUG_FILE("no collision around ped at dist [")
// SAVE_FLOAT_TO_DEBUG_FILE(SQRT(fPlayerDistFromCharLastKnown2))
// SAVE_STRING_TO_DEBUG_FILE("]")
// SAVE_NEWLINE_TO_DEBUG_FILE()
#ENDIF
PRINTSTRING("no collision around ped at dist [")
PRINTFLOAT(SQRT(fPlayerDistFromCharLastKnown2))
PRINTSTRING("]")
PRINTNL()
ENDIF
IF IS_SPHERE_VISIBLE(vFriendCharLastKnown, 5.0)
IF (fPlayerDistFromCharLastKnown2 < (fCONST_FRIEND_TOO_FAR_TO_SEE*fCONST_FRIEND_TOO_FAR_TO_SEE))
eDeleteState = eDS_7_ON_SCREEN
RETURN FALSE
ENDIF
ENDIF
// IF g_sPlayerPedRequest.eType = PR_TYPE_MISSION
// eDeleteState = eDS_8_SWITCH_TYPE_MISSION
// RETURN FALSE
// ENDIF
// // #1356105 // // // // // // // // // // // // // // //
SP_MISSIONS eTriggerMission = g_eMissionTriggerProcessing
IF (eTriggerMission != SP_MISSION_NONE)
SELECTOR_SLOTS_ENUM eSelectorPed = NUMBER_OF_SELECTOR_PEDS
IF ePed = CHAR_MICHAEL
eSelectorPed = SELECTOR_PED_MICHAEL
ELIF ePed = CHAR_TREVOR
eSelectorPed = SELECTOR_PED_TREVOR
ELIF ePed = CHAR_FRANKLIN
eSelectorPed = SELECTOR_PED_FRANKLIN
ELIF ePed = NO_CHARACTER
eSelectorPed = SELECTOR_PED_MULTIPLAYER
RETURN FALSE
ENDIF
IF IS_BIT_SET(g_sPlayerPedRequest.iBitsetPedInLeadIn, ENUM_TO_INT(eSelectorPed))
eDeleteState = eDS_10_LEADIN
RETURN FALSE
ENDIF
ENDIF
// // // // // // // // // // // // // // // // // // // //
//
eDeleteState = eDS_0_ok_to_delete
RETURN TRUE
ENDFUNC
/// PURPOSE: Set any special outfits when the player is created at this point in the flow.
FUNC BOOL SET_FLOW_OUTFIT_REQUIREMENTSCLF(PED_INDEX pedID, BOOL bIgnoreSPUnderwearCheck)
enumCharacterList ePed = GET_PLAYER_PED_ENUM(pedID)
IF GET_PLAYER_HAS_CHANGE_CLOTHES_ON_MISSION(ePed)
PRINTLN("SET_FLOW_OUTFIT_REQUIREMENTSCLF() - ", GET_PLAYER_PED_STRING(ePed), " has changed outfits on mission.")
RESET_PLAYER_HAS_CHANGE_CLOTHES_ON_MISSION(ePed, FALSE)
SET_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_DEFAULT, FALSE)
STORE_PLAYER_PED_VARIATIONS(pedID, TRUE)
RETURN TRUE
ENDIF
IF IS_PED_IN_UNDERWEAR_SP(pedID)
AND NOT bIgnoreSPUnderwearCheck
PRINTLN("SET_FLOW_OUTFIT_REQUIREMENTSCLF() - ", GET_PLAYER_PED_STRING(ePed), " is in underwear.")
DEBUG_PRINTCALLSTACK()
RESET_PLAYER_HAS_CHANGE_CLOTHES_ON_MISSION(ePed, FALSE)
SET_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_DEFAULT, FALSE)
STORE_PLAYER_PED_VARIATIONS(pedID, TRUE)
RETURN TRUE
ENDIF
BOOL bScubaRemoved = FALSE
SWITCH ePed
CASE CHAR_MICHAEL
//Bed?
IF IS_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_P0_BED)
PRINTLN("SET_FLOW_OUTFIT_REQUIREMENTSCLF() - Checking Michael has bed outfit on")
SET_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_P0_DEFAULT, FALSE)
RETURN TRUE
ENDIF
//Ludendorff?
IF IS_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_P0_LUDENDORFF)
IF NOT IS_PED_COMP_ITEM_AVAILABLE_SP(GET_ENTITY_MODEL(pedID), COMP_TYPE_OUTFIT, OUTFIT_P0_LUDENDORFF)
PRINTLN("SET_FLOW_OUTFIT_REQUIREMENTSCLF() - Checking Michael has Ludendorff outfit on")
SET_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_P0_DEFAULT, FALSE)
RETURN TRUE
ENDIF
ENDIF
//Boiler suit?
IF IS_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_P0_PREP_BOILER_SUIT_1)
IF NOT IS_PED_COMP_ITEM_AVAILABLE_SP(GET_ENTITY_MODEL(pedID), COMP_TYPE_OUTFIT, OUTFIT_P0_PREP_BOILER_SUIT_1)
PRINTLN("SET_FLOW_OUTFIT_REQUIREMENTSCLF() - Checking Michael has Boiler Suit 1 outfit on")
SET_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_P0_DEFAULT, FALSE)
RETURN TRUE
ENDIF
ENDIF
IF IS_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_P0_PREP_BOILER_SUIT_2)
IF NOT IS_PED_COMP_ITEM_AVAILABLE_SP(GET_ENTITY_MODEL(pedID), COMP_TYPE_OUTFIT, OUTFIT_P0_PREP_BOILER_SUIT_2)
PRINTLN("SET_FLOW_OUTFIT_REQUIREMENTSCLF() - Checking Michael has Boiler Suit 2 outfit on")
SET_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_P0_DEFAULT, FALSE)
RETURN TRUE
ENDIF
ENDIF
IF IS_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_P0_PREP_BOILER_SUIT_3)
IF NOT IS_PED_COMP_ITEM_AVAILABLE_SP(GET_ENTITY_MODEL(pedID), COMP_TYPE_OUTFIT, OUTFIT_P0_PREP_BOILER_SUIT_3)
PRINTLN("SET_FLOW_OUTFIT_REQUIREMENTSCLF() - Checking Michael has Boiler Suit 3 outfit on")
SET_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_P0_DEFAULT, FALSE)
RETURN TRUE
ENDIF
ENDIF
//Scuba suit?
IF IS_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_P0_SCUBA_LAND)
PRINTLN("SET_FLOW_OUTFIT_REQUIREMENTSCLF() - Checking Michael has Scuba Land outfit on")
SET_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_P0_DEFAULT, FALSE)
RETURN TRUE
ENDIF
IF IS_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_P0_SCUBA_WATER)
PRINTLN("SET_FLOW_OUTFIT_REQUIREMENTSCLF() - Checking Michael has Scuba Water outfit on")
SET_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_P0_DEFAULT, FALSE)
RETURN TRUE
ENDIF
IF IS_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_P0_SCUBA_WATER_NO_MASK)
PRINTLN("SET_FLOW_OUTFIT_REQUIREMENTSCLF() - Checking Michael has Scuba Water (no mask) outfit on")
SET_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_P0_DEFAULT, FALSE)
RETURN TRUE
ENDIF
bScubaRemoved = FALSE
IF IS_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_PROPS, PROPS_P0_SCUBA_MASK)
PRINTLN("SET_FLOW_prop_REQUIREMENTS() - Checking Michael has Scuba Water mask on")
SET_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_PROPS, PROPS_EYES_NONE, FALSE)
bScubaRemoved = TRUE
ENDIF
IF IS_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_SPECIAL, SPECIAL_P0_SCUBA_ACCS_1)
PRINTLN("SET_FLOW_prop_REQUIREMENTS() - Checking Michael has Scuba Water tank on")
SET_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_SPECIAL, SPECIAL_P0_NONE, FALSE)
bScubaRemoved = TRUE
ENDIF
IF bScubaRemoved
RETURN TRUE
ENDIF
//Security?
IF IS_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_P0_SECURITY)
PRINTLN("SET_FLOW_OUTFIT_REQUIREMENTSCLF() - Checking Michael has Security outfit on")
SET_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_P0_DEFAULT, FALSE)
RETURN TRUE
ENDIF
BREAK
CASE CHAR_FRANKLIN
//Boiler suit?
IF IS_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_P1_PREP_BOILER_SUIT_1)
IF NOT IS_PED_COMP_ITEM_AVAILABLE_SP(GET_ENTITY_MODEL(pedID), COMP_TYPE_OUTFIT, OUTFIT_P1_PREP_BOILER_SUIT_1)
PRINTLN("SET_FLOW_OUTFIT_REQUIREMENTSCLF() - Checking Franklin has Boiler Suit 1 outfit on")
SET_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_P1_DEFAULT, FALSE)
RETURN TRUE
ENDIF
ENDIF
IF IS_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_P1_PREP_BOILER_SUIT_2)
IF NOT IS_PED_COMP_ITEM_AVAILABLE_SP(GET_ENTITY_MODEL(pedID), COMP_TYPE_OUTFIT, OUTFIT_P1_PREP_BOILER_SUIT_2)
PRINTLN("SET_FLOW_OUTFIT_REQUIREMENTSCLF() - Checking Franklin has Boiler Suit 2 outfit on")
SET_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_P1_DEFAULT, FALSE)
RETURN TRUE
ENDIF
ENDIF
IF IS_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_P1_PREP_BOILER_SUIT_3)
IF NOT IS_PED_COMP_ITEM_AVAILABLE_SP(GET_ENTITY_MODEL(pedID), COMP_TYPE_OUTFIT, OUTFIT_P1_PREP_BOILER_SUIT_3)
PRINTLN("SET_FLOW_OUTFIT_REQUIREMENTSCLF() - Checking Franklin has Boiler Suit 3 outfit on")
SET_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_P1_DEFAULT, FALSE)
RETURN TRUE
ENDIF
ENDIF
//Scuba suit?
IF IS_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_P1_SCUBA_LAND)
PRINTLN("SET_FLOW_OUTFIT_REQUIREMENTSCLF() - Checking Franklin has Scuba Land outfit on")
SET_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_P1_DEFAULT, FALSE)
RETURN TRUE
ENDIF
IF IS_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_P1_SCUBA_WATER)
PRINTLN("SET_FLOW_OUTFIT_REQUIREMENTSCLF() - Checking Franklin has Scuba Water outfit on")
SET_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_P1_DEFAULT, FALSE)
RETURN TRUE
ENDIF
bScubaRemoved = FALSE
IF IS_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_PROPS, PROPS_P1_SCUBA_MASK)
PRINTLN("SET_FLOW_prop_REQUIREMENTS() - Checking Franklin has Scuba Water mask on")
SET_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_PROPS, PROPS_EYES_NONE, FALSE)
bScubaRemoved = TRUE
ENDIF
IF IS_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_SPECIAL, SPECIAL_P1_SCUBA_1)
PRINTLN("SET_FLOW_prop_REQUIREMENTS() - Checking Franklin has Scuba Water tank on")
SET_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_SPECIAL, SPECIAL_P1_DUMMY, FALSE)
bScubaRemoved = TRUE
ENDIF
IF bScubaRemoved
RETURN TRUE
ENDIF
//White Tuxedo?
IF IS_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_P1_WHITE_TUXEDO)
PRINTLN("SET_FLOW_OUTFIT_REQUIREMENTSCLF() - Checking Franklin has White Tuxedo outfit on")
SET_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_P1_DEFAULT, FALSE)
RETURN TRUE
ENDIF
BREAK
CASE CHAR_TREVOR
IF IS_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_P2_TOILET)
PRINTLN("SET_FLOW_OUTFIT_REQUIREMENTSCLF() - Checking Trevor has toilet outfit on")
SET_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_P2_DEFAULT, FALSE)
RETURN TRUE
ENDIF
IF IS_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_P2_LADIES)
PRINTLN("SET_FLOW_OUTFIT_REQUIREMENTSCLF() - Checking Trevor has ladies outfit on")
SET_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_P2_DEFAULT, FALSE)
RETURN TRUE
ENDIF
IF IS_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_TORSO, TORSO_P2_DRESS)
PRINTLN("SET_FLOW_OUTFIT_REQUIREMENTSCLF() - Checking Trevor has dress torso on")
SET_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_P2_DEFAULT, FALSE)
RETURN TRUE
ENDIF
//Boiler suit?
IF IS_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_P2_PREP_BOILER_SUIT_1)
IF NOT IS_PED_COMP_ITEM_AVAILABLE_SP(GET_ENTITY_MODEL(pedID), COMP_TYPE_OUTFIT, OUTFIT_P2_PREP_BOILER_SUIT_1)
PRINTLN("SET_FLOW_OUTFIT_REQUIREMENTSCLF() - Checking Trevor has Boiler Suit 1 outfit on")
SET_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_P2_DEFAULT, FALSE)
RETURN TRUE
ENDIF
ENDIF
IF IS_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_P2_PREP_BOILER_SUIT_2)
IF NOT IS_PED_COMP_ITEM_AVAILABLE_SP(GET_ENTITY_MODEL(pedID), COMP_TYPE_OUTFIT, OUTFIT_P2_PREP_BOILER_SUIT_2)
PRINTLN("SET_FLOW_OUTFIT_REQUIREMENTSCLF() - Checking Trevor has Boiler Suit 2 outfit on")
SET_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_P2_DEFAULT, FALSE)
RETURN TRUE
ENDIF
ENDIF
IF IS_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_P2_PREP_BOILER_SUIT_3)
IF NOT IS_PED_COMP_ITEM_AVAILABLE_SP(GET_ENTITY_MODEL(pedID), COMP_TYPE_OUTFIT, OUTFIT_P2_PREP_BOILER_SUIT_3)
PRINTLN("SET_FLOW_OUTFIT_REQUIREMENTSCLF() - Checking Trevor has Boiler Suit 3 outfit on")
SET_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_P2_DEFAULT, FALSE)
RETURN TRUE
ENDIF
ENDIF
//Scuba suit?
IF IS_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_P2_SCUBA_LAND)
PRINTLN("SET_FLOW_OUTFIT_REQUIREMENTSCLF() - Checking Trevor has Scuba Land outfit on")
SET_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_P2_DEFAULT, FALSE)
RETURN TRUE
ENDIF
IF IS_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_P2_SCUBA_WATER)
PRINTLN("SET_FLOW_OUTFIT_REQUIREMENTSCLF() - Checking Trevor has Scuba Water outfit on")
SET_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_P2_DEFAULT, FALSE)
RETURN TRUE
ENDIF
bScubaRemoved = FALSE
IF IS_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_PROPS, PROPS_P2_SCUBA_MASK)
PRINTLN("SET_FLOW_prop_REQUIREMENTS() - Checking Trevor has Scuba Water mask on")
SET_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_PROPS, PROPS_EYES_NONE, FALSE)
bScubaRemoved = TRUE
ENDIF
IF IS_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_SPECIAL, SPECIAL_P2_SCUBA_1)
PRINTLN("SET_FLOW_prop_REQUIREMENTS() - Checking Trevor has Scuba Water tank on")
SET_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_SPECIAL, SPECIAL_P2_DUMMY, FALSE)
bScubaRemoved = TRUE
ENDIF
IF bScubaRemoved
RETURN TRUE
ENDIF
//Security?
IF IS_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_P2_SECURITY)
PRINTLN("SET_FLOW_OUTFIT_REQUIREMENTSCLF() - Checking Trevor has Security outfit on")
SET_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_P2_DEFAULT, FALSE)
RETURN TRUE
ENDIF
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
FUNC BOOL SET_FLOW_OUTFIT_REQUIREMENTSNRM(PED_INDEX pedID, BOOL bIgnoreSPUnderwearCheck)
enumCharacterList ePed = GET_PLAYER_PED_ENUM(pedID)
IF GET_PLAYER_HAS_CHANGE_CLOTHES_ON_MISSION(ePed)
PRINTLN("SET_FLOW_OUTFIT_REQUIREMENTSNRM() - ", GET_PLAYER_PED_STRING(ePed), " has changed outfits on mission.")
RESET_PLAYER_HAS_CHANGE_CLOTHES_ON_MISSION(ePed, FALSE)
SET_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_DEFAULT, FALSE)
STORE_PLAYER_PED_VARIATIONS(pedID, TRUE)
RETURN TRUE
ENDIF
IF IS_PED_IN_UNDERWEAR_SP(pedID)
AND NOT bIgnoreSPUnderwearCheck
PRINTLN("SET_FLOW_OUTFIT_REQUIREMENTSNRM() - ", GET_PLAYER_PED_STRING(ePed), " is in underwear.")
DEBUG_PRINTCALLSTACK()
RESET_PLAYER_HAS_CHANGE_CLOTHES_ON_MISSION(ePed, FALSE)
SET_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_DEFAULT, FALSE)
STORE_PLAYER_PED_VARIATIONS(pedID, TRUE)
RETURN TRUE
ENDIF
BOOL bScubaRemoved = FALSE
SWITCH ePed
CASE CHAR_MICHAEL
//Bed?
IF IS_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_P0_BED)
PRINTLN("SET_FLOW_OUTFIT_REQUIREMENTSNRM() - Checking Michael has bed outfit on")
SET_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_P0_DEFAULT, FALSE)
RETURN TRUE
ENDIF
//Ludendorff?
IF IS_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_P0_LUDENDORFF)
IF NOT IS_PED_COMP_ITEM_AVAILABLE_SP(GET_ENTITY_MODEL(pedID), COMP_TYPE_OUTFIT, OUTFIT_P0_LUDENDORFF)
PRINTLN("SET_FLOW_OUTFIT_REQUIREMENTSNRM() - Checking Michael has Ludendorff outfit on")
SET_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_P0_DEFAULT, FALSE)
RETURN TRUE
ENDIF
ENDIF
//Boiler suit?
IF IS_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_P0_PREP_BOILER_SUIT_1)
IF NOT IS_PED_COMP_ITEM_AVAILABLE_SP(GET_ENTITY_MODEL(pedID), COMP_TYPE_OUTFIT, OUTFIT_P0_PREP_BOILER_SUIT_1)
PRINTLN("SET_FLOW_OUTFIT_REQUIREMENTSNRM() - Checking Michael has Boiler Suit 1 outfit on")
SET_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_P0_DEFAULT, FALSE)
RETURN TRUE
ENDIF
ENDIF
IF IS_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_P0_PREP_BOILER_SUIT_2)
IF NOT IS_PED_COMP_ITEM_AVAILABLE_SP(GET_ENTITY_MODEL(pedID), COMP_TYPE_OUTFIT, OUTFIT_P0_PREP_BOILER_SUIT_2)
PRINTLN("SET_FLOW_OUTFIT_REQUIREMENTSNRM() - Checking Michael has Boiler Suit 2 outfit on")
SET_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_P0_DEFAULT, FALSE)
RETURN TRUE
ENDIF
ENDIF
IF IS_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_P0_PREP_BOILER_SUIT_3)
IF NOT IS_PED_COMP_ITEM_AVAILABLE_SP(GET_ENTITY_MODEL(pedID), COMP_TYPE_OUTFIT, OUTFIT_P0_PREP_BOILER_SUIT_3)
PRINTLN("SET_FLOW_OUTFIT_REQUIREMENTSNRM() - Checking Michael has Boiler Suit 3 outfit on")
SET_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_P0_DEFAULT, FALSE)
RETURN TRUE
ENDIF
ENDIF
//Scuba suit?
IF IS_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_P0_SCUBA_LAND)
PRINTLN("SET_FLOW_OUTFIT_REQUIREMENTSNRM() - Checking Michael has Scuba Land outfit on")
SET_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_P0_DEFAULT, FALSE)
RETURN TRUE
ENDIF
IF IS_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_P0_SCUBA_WATER)
PRINTLN("SET_FLOW_OUTFIT_REQUIREMENTSNRM() - Checking Michael has Scuba Water outfit on")
SET_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_P0_DEFAULT, FALSE)
RETURN TRUE
ENDIF
IF IS_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_P0_SCUBA_WATER_NO_MASK)
PRINTLN("SET_FLOW_OUTFIT_REQUIREMENTSNRM() - Checking Michael has Scuba Water (no mask) outfit on")
SET_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_P0_DEFAULT, FALSE)
RETURN TRUE
ENDIF
bScubaRemoved = FALSE
IF IS_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_PROPS, PROPS_P0_SCUBA_MASK)
PRINTLN("SET_FLOW_prop_REQUIREMENTS() - Checking Michael has Scuba Water mask on")
SET_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_PROPS, PROPS_EYES_NONE, FALSE)
bScubaRemoved = TRUE
ENDIF
IF IS_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_SPECIAL, SPECIAL_P0_SCUBA_ACCS_1)
PRINTLN("SET_FLOW_prop_REQUIREMENTS() - Checking Michael has Scuba Water tank on")
SET_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_SPECIAL, SPECIAL_P0_NONE, FALSE)
bScubaRemoved = TRUE
ENDIF
IF bScubaRemoved
RETURN TRUE
ENDIF
//Security?
IF IS_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_P0_SECURITY)
PRINTLN("SET_FLOW_OUTFIT_REQUIREMENTSNRM() - Checking Michael has Security outfit on")
SET_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_P0_DEFAULT, FALSE)
RETURN TRUE
ENDIF
BREAK
CASE CHAR_FRANKLIN
BREAK
CASE CHAR_TREVOR
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
FUNC BOOL SET_FLOW_OUTFIT_REQUIREMENTS(PED_INDEX pedID, BOOL bIgnoreSPUnderwearCheck = FALSE)
#if USE_CLF_DLC
return SET_FLOW_OUTFIT_REQUIREMENTSCLF(pedID, bIgnoreSPUnderwearCheck)
#endif
#if USE_NRM_DLC
return SET_FLOW_OUTFIT_REQUIREMENTSNRM(pedID, bIgnoreSPUnderwearCheck)
#endif
#if not USE_CLF_DLC
#if not USE_NRM_DLC
enumCharacterList ePed = GET_PLAYER_PED_ENUM(pedID)
IF GET_PLAYER_HAS_CHANGE_CLOTHES_ON_MISSION(ePed)
PRINTLN("SET_FLOW_OUTFIT_REQUIREMENTS() - ", GET_PLAYER_PED_STRING(ePed), " has changed outfits on mission.")
RESET_PLAYER_HAS_CHANGE_CLOTHES_ON_MISSION(ePed, FALSE)
SET_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_DEFAULT, FALSE)
STORE_PLAYER_PED_VARIATIONS(pedID, TRUE)
RETURN TRUE
ENDIF
IF NOT bIgnoreSPUnderwearCheck
IF IS_PED_IN_UNDERWEAR_SP(pedID)
PRINTLN("SET_FLOW_OUTFIT_REQUIREMENTS() - ", GET_PLAYER_PED_STRING(ePed), " is in underwear.")
RESET_PLAYER_HAS_CHANGE_CLOTHES_ON_MISSION(ePed, FALSE)
SET_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_DEFAULT, FALSE)
STORE_PLAYER_PED_VARIATIONS(pedID, TRUE)
RETURN TRUE
ENDIF
ELSE
PRINTLN("SET_FLOW_OUTFIT_REQUIREMENTS() - ", GET_PLAYER_PED_STRING(ePed), " ignores the underwear check.")
DEBUG_PRINTCALLSTACK()
ENDIF
BOOL bScubaRemoved = FALSE
SWITCH ePed
CASE CHAR_MICHAEL
// Default outfit?
IF g_savedGlobals.sFlow.controls.flagIDs[FLOWFLAG_MIC_HAS_HAGGARD_SUIT]
AND NOT g_savedGlobals.sFlow.controls.flagIDs[FLOWFLAG_MIC_REM_HAGGARD_SUIT]
PRINTLN("SET_FLOW_OUTFIT_REQUIREMENTS() - Setting haggard suit on Michael")
SET_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_DEFAULT, FALSE)
g_savedGlobals.sFlow.controls.flagIDs[FLOWFLAG_MIC_SET_HAGGARD_SUIT] = TRUE
RETURN TRUE
ENDIF
// Topless?
IF g_savedGlobals.sFlow.controls.flagIDs[FLOWFLAG_MIC_HIDE_BARE_CHEST]
g_savedGlobals.sFlow.controls.flagIDs[FLOWFLAG_MIC_HIDE_BARE_CHEST] = FALSE
PRINTLN("SET_FLOW_OUTFIT_REQUIREMENTS() - Checking Michael has a top on")
IF NOT IS_PED_INJURED(pedID)
IF IS_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_TORSO, TORSO_P0_BARE_CHEST)
SET_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_TORSO, TORSO_P0_YOGA_0, FALSE)
RETURN TRUE
ENDIF
ENDIF
ENDIF
//Bed?
IF IS_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_P0_BED)
PRINTLN("SET_FLOW_OUTFIT_REQUIREMENTS() - Checking Michael has bed outfit on")
SET_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_P0_DEFAULT, FALSE)
RETURN TRUE
ENDIF
//Ludendorff?
IF IS_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_P0_LUDENDORFF)
IF NOT IS_PED_COMP_ITEM_AVAILABLE_SP(GET_ENTITY_MODEL(pedID), COMP_TYPE_OUTFIT, OUTFIT_P0_LUDENDORFF)
PRINTLN("SET_FLOW_OUTFIT_REQUIREMENTS() - Checking Michael has Ludendorff outfit on")
SET_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_P0_DEFAULT, FALSE)
RETURN TRUE
ENDIF
ENDIF
//Boiler suit?
IF IS_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_P0_PREP_BOILER_SUIT_1)
IF NOT IS_PED_COMP_ITEM_AVAILABLE_SP(GET_ENTITY_MODEL(pedID), COMP_TYPE_OUTFIT, OUTFIT_P0_PREP_BOILER_SUIT_1)
PRINTLN("SET_FLOW_OUTFIT_REQUIREMENTS() - Checking Michael has Boiler Suit 1 outfit on")
SET_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_P0_DEFAULT, FALSE)
RETURN TRUE
ENDIF
ENDIF
IF IS_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_P0_PREP_BOILER_SUIT_2)
IF NOT IS_PED_COMP_ITEM_AVAILABLE_SP(GET_ENTITY_MODEL(pedID), COMP_TYPE_OUTFIT, OUTFIT_P0_PREP_BOILER_SUIT_2)
PRINTLN("SET_FLOW_OUTFIT_REQUIREMENTS() - Checking Michael has Boiler Suit 2 outfit on")
SET_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_P0_DEFAULT, FALSE)
RETURN TRUE
ENDIF
ENDIF
IF IS_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_P0_PREP_BOILER_SUIT_3)
IF NOT IS_PED_COMP_ITEM_AVAILABLE_SP(GET_ENTITY_MODEL(pedID), COMP_TYPE_OUTFIT, OUTFIT_P0_PREP_BOILER_SUIT_3)
PRINTLN("SET_FLOW_OUTFIT_REQUIREMENTS() - Checking Michael has Boiler Suit 3 outfit on")
SET_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_P0_DEFAULT, FALSE)
RETURN TRUE
ENDIF
ENDIF
//Scuba suit?
IF IS_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_P0_SCUBA_LAND)
PRINTLN("SET_FLOW_OUTFIT_REQUIREMENTS() - Checking Michael has Scuba Land outfit on")
SET_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_P0_DEFAULT, FALSE)
RETURN TRUE
ENDIF
IF IS_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_P0_SCUBA_WATER)
PRINTLN("SET_FLOW_OUTFIT_REQUIREMENTS() - Checking Michael has Scuba Water outfit on")
SET_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_P0_DEFAULT, FALSE)
RETURN TRUE
ENDIF
IF IS_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_P0_SCUBA_WATER_NO_MASK)
PRINTLN("SET_FLOW_OUTFIT_REQUIREMENTS() - Checking Michael has Scuba Water (no mask) outfit on")
SET_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_P0_DEFAULT, FALSE)
RETURN TRUE
ENDIF
IF IS_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_PROPS, PROPS_P0_SCUBA_MASK)
PRINTLN("SET_FLOW_prop_REQUIREMENTS() - Checking Michael has Scuba Water mask on")
SET_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_PROPS, PROPS_EYES_NONE, FALSE)
bScubaRemoved = TRUE
ENDIF
IF IS_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_SPECIAL, SPECIAL_P0_SCUBA_ACCS_1)
PRINTLN("SET_FLOW_prop_REQUIREMENTS() - Checking Michael has Scuba Water tank on")
SET_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_SPECIAL, SPECIAL_P0_NONE, FALSE)
bScubaRemoved = TRUE
ENDIF
IF bScubaRemoved
RETURN TRUE
ENDIF
//Security?
IF IS_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_P0_SECURITY)
PRINTLN("SET_FLOW_OUTFIT_REQUIREMENTS() - Checking Michael has Security outfit on")
SET_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_P0_DEFAULT, FALSE)
RETURN TRUE
ENDIF
BREAK
CASE CHAR_FRANKLIN
//Boiler suit?
IF IS_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_P1_PREP_BOILER_SUIT_1)
IF NOT IS_PED_COMP_ITEM_AVAILABLE_SP(GET_ENTITY_MODEL(pedID), COMP_TYPE_OUTFIT, OUTFIT_P1_PREP_BOILER_SUIT_1)
PRINTLN("SET_FLOW_OUTFIT_REQUIREMENTS() - Checking Franklin has Boiler Suit 1 outfit on")
SET_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_P1_DEFAULT, FALSE)
RETURN TRUE
ENDIF
ENDIF
IF IS_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_P1_PREP_BOILER_SUIT_2)
IF NOT IS_PED_COMP_ITEM_AVAILABLE_SP(GET_ENTITY_MODEL(pedID), COMP_TYPE_OUTFIT, OUTFIT_P1_PREP_BOILER_SUIT_2)
PRINTLN("SET_FLOW_OUTFIT_REQUIREMENTS() - Checking Franklin has Boiler Suit 2 outfit on")
SET_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_P1_DEFAULT, FALSE)
RETURN TRUE
ENDIF
ENDIF
IF IS_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_P1_PREP_BOILER_SUIT_3)
IF NOT IS_PED_COMP_ITEM_AVAILABLE_SP(GET_ENTITY_MODEL(pedID), COMP_TYPE_OUTFIT, OUTFIT_P1_PREP_BOILER_SUIT_3)
PRINTLN("SET_FLOW_OUTFIT_REQUIREMENTS() - Checking Franklin has Boiler Suit 3 outfit on")
SET_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_P1_DEFAULT, FALSE)
RETURN TRUE
ENDIF
ENDIF
//Scuba suit?
IF IS_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_P1_SCUBA_LAND)
PRINTLN("SET_FLOW_OUTFIT_REQUIREMENTS() - Checking Franklin has Scuba Land outfit on")
SET_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_P1_DEFAULT, FALSE)
RETURN TRUE
ENDIF
IF IS_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_P1_SCUBA_WATER)
PRINTLN("SET_FLOW_OUTFIT_REQUIREMENTS() - Checking Franklin has Scuba Water outfit on")
SET_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_P1_DEFAULT, FALSE)
RETURN TRUE
ENDIF
IF IS_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_PROPS, PROPS_P1_SCUBA_MASK)
PRINTLN("SET_FLOW_prop_REQUIREMENTS() - Checking Franklin has Scuba Water mask on")
SET_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_PROPS, PROPS_EYES_NONE, FALSE)
bScubaRemoved = TRUE
ENDIF
IF IS_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_SPECIAL, SPECIAL_P1_SCUBA_1)
PRINTLN("SET_FLOW_prop_REQUIREMENTS() - Checking Franklin has Scuba Water tank on")
SET_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_SPECIAL, SPECIAL_P1_DUMMY, FALSE)
bScubaRemoved = TRUE
ENDIF
IF bScubaRemoved
RETURN TRUE
ENDIF
//White Tuxedo?
IF IS_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_P1_WHITE_TUXEDO)
PRINTLN("SET_FLOW_OUTFIT_REQUIREMENTS() - Checking Franklin has White Tuxedo outfit on")
SET_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_P1_DEFAULT, FALSE)
RETURN TRUE
ENDIF
BREAK
CASE CHAR_TREVOR
IF IS_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_P2_TOILET)
PRINTLN("SET_FLOW_OUTFIT_REQUIREMENTS() - Checking Trevor has toilet outfit on")
SET_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_P2_DEFAULT, FALSE)
RETURN TRUE
ENDIF
IF IS_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_P2_LADIES)
PRINTLN("SET_FLOW_OUTFIT_REQUIREMENTS() - Checking Trevor has ladies outfit on")
SET_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_P2_DEFAULT, FALSE)
RETURN TRUE
ENDIF
IF NOT bIgnoreSPUnderwearCheck
IF IS_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_TORSO, TORSO_P2_DRESS)
PRINTLN("SET_FLOW_OUTFIT_REQUIREMENTS() - Checking Trevor has dress torso on")
SET_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_P2_DEFAULT, FALSE)
RETURN TRUE
ENDIF
ELSE
PRINTLN("SET_FLOW_OUTFIT_REQUIREMENTS() - ", GET_PLAYER_PED_STRING(ePed), " ignores Trevors has dress torso check.")
DEBUG_PRINTCALLSTACK()
ENDIF
//Boiler suit?
IF IS_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_P2_PREP_BOILER_SUIT_1)
IF NOT IS_PED_COMP_ITEM_AVAILABLE_SP(GET_ENTITY_MODEL(pedID), COMP_TYPE_OUTFIT, OUTFIT_P2_PREP_BOILER_SUIT_1)
PRINTLN("SET_FLOW_OUTFIT_REQUIREMENTS() - Checking Trevor has Boiler Suit 1 outfit on")
SET_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_P2_DEFAULT, FALSE)
RETURN TRUE
ENDIF
ENDIF
IF IS_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_P2_PREP_BOILER_SUIT_2)
IF NOT IS_PED_COMP_ITEM_AVAILABLE_SP(GET_ENTITY_MODEL(pedID), COMP_TYPE_OUTFIT, OUTFIT_P2_PREP_BOILER_SUIT_2)
PRINTLN("SET_FLOW_OUTFIT_REQUIREMENTS() - Checking Trevor has Boiler Suit 2 outfit on")
SET_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_P2_DEFAULT, FALSE)
RETURN TRUE
ENDIF
ENDIF
IF IS_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_P2_PREP_BOILER_SUIT_3)
IF NOT IS_PED_COMP_ITEM_AVAILABLE_SP(GET_ENTITY_MODEL(pedID), COMP_TYPE_OUTFIT, OUTFIT_P2_PREP_BOILER_SUIT_3)
PRINTLN("SET_FLOW_OUTFIT_REQUIREMENTS() - Checking Trevor has Boiler Suit 3 outfit on")
SET_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_P2_DEFAULT, FALSE)
RETURN TRUE
ENDIF
ENDIF
//Scuba suit?
IF IS_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_P2_SCUBA_LAND)
PRINTLN("SET_FLOW_OUTFIT_REQUIREMENTS() - Checking Trevor has Scuba Land outfit on")
SET_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_P2_DEFAULT, FALSE)
RETURN TRUE
ENDIF
IF IS_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_P2_SCUBA_WATER)
PRINTLN("SET_FLOW_OUTFIT_REQUIREMENTS() - Checking Trevor has Scuba Water outfit on")
SET_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_P2_DEFAULT, FALSE)
RETURN TRUE
ENDIF
IF IS_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_PROPS, PROPS_P2_SCUBA_MASK)
PRINTLN("SET_FLOW_prop_REQUIREMENTS() - Checking Trevor has Scuba Water mask on")
SET_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_PROPS, PROPS_EYES_NONE, FALSE)
bScubaRemoved = TRUE
ENDIF
IF IS_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_SPECIAL, SPECIAL_P2_SCUBA_1)
PRINTLN("SET_FLOW_prop_REQUIREMENTS() - Checking Trevor has Scuba Water tank on")
SET_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_SPECIAL, SPECIAL_P2_DUMMY, FALSE)
bScubaRemoved = TRUE
ENDIF
IF bScubaRemoved
RETURN TRUE
ENDIF
//Security?
IF IS_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_P2_SECURITY)
PRINTLN("SET_FLOW_OUTFIT_REQUIREMENTS() - Checking Trevor has Security outfit on")
SET_PED_COMP_ITEM_CURRENT_SP(pedID, COMP_TYPE_OUTFIT, OUTFIT_P2_DEFAULT, FALSE)
RETURN TRUE
ENDIF
BREAK
ENDSWITCH
RETURN FALSE
#endif
#endif
ENDFUNC
/// PURPOSE: Set any special outfits when the player is created at this point in the flow.
FUNC BOOL SET_FLOW_OUTFIT_REQUIREMENTS_FOR_CUTSCENE_HANDLECLF(STRING sHandle, enuMCharacterList ePed)
IF GET_PLAYER_HAS_CHANGE_CLOTHES_ON_MISSION(ePed)
PRINTLN("SET_FLOW_OUTFIT_REQUIREMENTS_FOR_CUTSCENE_HANDLE() - ", GET_PLAYER_PED_STRING(ePed), " has changed outfits on mission")
PED_COMP_OUTFIT_DATA_STRUCT sOutfitData
PED_COMP_ITEM_DATA_STRUCT sItemData
sOutfitData = GET_PED_COMPONENT_DATA_FOR_OUTFIT(GET_PLAYER_PED_MODELCLF(ePed), OUTFIT_DEFAULT)
INT iItemType, iProp
REPEAT NUMBER_OF_PED_COMP_TYPES iItemType
IF sOutfitData.eItems[iItemType] != DUMMY_PED_COMP
sItemData = GET_PED_COMP_DATA_FOR_ITEM_SP(GET_PLAYER_PED_MODELCLF(ePed), INT_TO_ENUM(PED_COMP_TYPE_ENUM, iItemType), sOutfitData.eItems[iItemType])
IF iItemType = ENUM_TO_INT(COMP_TYPE_PROPS)
// Dont set any props
REPEAT NUM_PLAYER_PED_PROPS iProp
SET_CUTSCENE_PED_PROP_VARIATION(sHandle, INT_TO_ENUM(PED_PROP_POSITION, iProp), -1, 0, GET_PLAYER_PED_MODEL(ePed))
ENDREPEAT
ELIF iItemType != ENUM_TO_INT(COMP_TYPE_OUTFIT)
AND iItemType != ENUM_TO_INT(COMP_TYPE_PROPGROUP)
SET_CUTSCENE_PED_COMPONENT_VARIATION(sHandle, GET_PED_COMPONENT_FROM_TYPE(INT_TO_ENUM(PED_COMP_TYPE_ENUM, iItemType)), sItemData.iDrawable, sItemData.iTexture, GET_PLAYER_PED_MODELCLF(ePed))
ENDIF
ENDIF
ENDREPEAT
RESET_PLAYER_HAS_CHANGE_CLOTHES_ON_MISSION(ePed, FALSE)
RETURN TRUE
ENDIF
SWITCH ePed
CASE CHAR_MICHAEL
BREAK
CASE CHAR_TREVOR
PED_COMP_OUTFIT_DATA_STRUCT sOutfitData, sDefaultOutfitData
PED_COMP_ITEM_DATA_STRUCT sItemData, sDefaultItemData
// If Trevor is not wearing a dress, make sure he doesnt appear in just his underwear.
sItemData = GET_PED_COMP_DATA_FOR_ITEM_SP(GET_PLAYER_PED_MODEL(ePed), COMP_TYPE_TORSO, TORSO_P2_DRESS)
IF g_savedGlobalsClifford.sPlayerData.sInfo.sVariations[ePed].iDrawableVariation[PED_COMP_TORSO] = sItemData.iDrawable
// do nothing.
ELSE
// put some clothes on
sOutfitData = GET_PED_COMPONENT_DATA_FOR_OUTFIT(GET_PLAYER_PED_MODEL(ePed), OUTFIT_P2_UNDERWEAR)
sDefaultOutfitData = GET_PED_COMPONENT_DATA_FOR_OUTFIT(GET_PLAYER_PED_MODEL(ePed), OUTFIT_P2_DEFAULT)
INT iItemType, iProp
REPEAT NUMBER_OF_PED_COMP_TYPES iItemType
IF sOutfitData.eItems[iItemType] != DUMMY_PED_COMP
IF iItemType = ENUM_TO_INT(COMP_TYPE_PROPS)
// Dont set any props
REPEAT NUM_PLAYER_PED_PROPS iProp
SET_CUTSCENE_PED_PROP_VARIATION(sHandle, INT_TO_ENUM(PED_PROP_POSITION, iProp), -1, 0, GET_PLAYER_PED_MODEL(ePed))
ENDREPEAT
ELIF iItemType != ENUM_TO_INT(COMP_TYPE_OUTFIT)
AND iItemType != ENUM_TO_INT(COMP_TYPE_PROPGROUP)
#IF IS_DEBUG_BUILD
IF iItemType >= NUM_PED_COMPONENTS
PRINTLN("iItemType >= NUM_PED_COMPONENTS???")
SCRIPT_ASSERT("iItemType >= NUM_PED_COMPONENTS???")
RETURN FALSE
ENDIF
#ENDIF
IF (iItemType = ENUM_TO_INT(COMP_TYPE_TORSO)
OR iItemType = ENUM_TO_INT(COMP_TYPE_LEGS))
sItemData = GET_PED_COMP_DATA_FOR_ITEM_SP(GET_PLAYER_PED_MODEL(ePed), INT_TO_ENUM(PED_COMP_TYPE_ENUM, iItemType), sOutfitData.eItems[iItemType])
IF sItemData.iDrawable = g_savedGlobalsClifford.sPlayerData.sInfo.sVariations[ePed].iDrawableVariation[iItemType]
AND sItemData.iTexture = g_savedGlobalsClifford.sPlayerData.sInfo.sVariations[ePed].iTextureVariation[iItemType]
PRINTLN("//cutscene Underwear torso or legs? [ePed: ", ePed, ", iItemType: ", iItemType, ", iDrawable: ", sItemData.iDrawable, ", iTexture: ", sItemData.iTexture, "]")
// SCRIPT_ASSERT("//cutscene Underwear torso or legs?")
sDefaultItemData = GET_PED_COMP_DATA_FOR_ITEM_SP(GET_PLAYER_PED_MODEL(ePed), INT_TO_ENUM(PED_COMP_TYPE_ENUM, iItemType), sDefaultOutfitData.eItems[iItemType])
g_savedGlobalsClifford.sPlayerData.sInfo.sVariations[ePed].iDrawableVariation[iItemType] = sDefaultItemData.iDrawable
g_savedGlobalsClifford.sPlayerData.sInfo.sVariations[ePed].iTextureVariation[iItemType] = sDefaultItemData.iTexture
SET_CUTSCENE_PED_COMPONENT_VARIATION(sHandle, GET_PED_COMPONENT_FROM_TYPE(INT_TO_ENUM(PED_COMP_TYPE_ENUM, iItemType)), sDefaultItemData.iDrawable, sDefaultItemData.iTexture, GET_PLAYER_PED_MODELCLF(ePed))
IF iItemType = ENUM_TO_INT(COMP_TYPE_LEGS)
PRINTLN("//cutscene Underwear feet? [ePed: ", ePed, "]")
// SCRIPT_ASSERT("//cutscene Underwear feet?")
sDefaultItemData = GET_PED_COMP_DATA_FOR_ITEM_SP(GET_PLAYER_PED_MODELCLF(ePed), COMP_TYPE_FEET, sDefaultOutfitData.eItems[COMP_TYPE_FEET])
g_savedGlobalsClifford.sPlayerData.sInfo.sVariations[ePed].iDrawableVariation[PED_COMP_FEET] = sDefaultItemData.iDrawable
g_savedGlobalsClifford.sPlayerData.sInfo.sVariations[ePed].iTextureVariation[PED_COMP_FEET] = sDefaultItemData.iTexture
SET_CUTSCENE_PED_COMPONENT_VARIATION(sHandle, GET_PED_COMPONENT_FROM_TYPE(COMP_TYPE_FEET), sDefaultItemData.iDrawable, sDefaultItemData.iTexture, GET_PLAYER_PED_MODELCLF(ePed))
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDREPEAT
ENDIF
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
FUNC BOOL SET_FLOW_OUTFIT_REQUIREMENTS_FOR_CUTSCENE_HANDLENRM(STRING sHandle, enuMCharacterList ePed)
IF GET_PLAYER_HAS_CHANGE_CLOTHES_ON_MISSION(ePed)
PRINTLN("SET_FLOW_OUTFIT_REQUIREMENTS_FOR_CUTSCENE_HANDLE() - ", GET_PLAYER_PED_STRING(ePed), " has changed outfits on mission")
PED_COMP_OUTFIT_DATA_STRUCT sOutfitData
PED_COMP_ITEM_DATA_STRUCT sItemData
sOutfitData = GET_PED_COMPONENT_DATA_FOR_OUTFIT(GET_PLAYER_PED_MODEL(ePed), OUTFIT_DEFAULT)
INT iItemType, iProp
REPEAT NUMBER_OF_PED_COMP_TYPES iItemType
IF sOutfitData.eItems[iItemType] != DUMMY_PED_COMP
sItemData = GET_PED_COMP_DATA_FOR_ITEM_SP(GET_PLAYER_PED_MODEL(ePed), INT_TO_ENUM(PED_COMP_TYPE_ENUM, iItemType), sOutfitData.eItems[iItemType])
IF iItemType = ENUM_TO_INT(COMP_TYPE_PROPS)
// Dont set any props
REPEAT NUM_PLAYER_PED_PROPS iProp
SET_CUTSCENE_PED_PROP_VARIATION(sHandle, INT_TO_ENUM(PED_PROP_POSITION, iProp), -1, 0, GET_PLAYER_PED_MODELNRM(ePed))
ENDREPEAT
ELIF iItemType != ENUM_TO_INT(COMP_TYPE_OUTFIT)
AND iItemType != ENUM_TO_INT(COMP_TYPE_PROPGROUP)
SET_CUTSCENE_PED_COMPONENT_VARIATION(sHandle, GET_PED_COMPONENT_FROM_TYPE(INT_TO_ENUM(PED_COMP_TYPE_ENUM, iItemType)), sItemData.iDrawable, sItemData.iTexture, GET_PLAYER_PED_MODELNRM(ePed))
ENDIF
ENDIF
ENDREPEAT
RESET_PLAYER_HAS_CHANGE_CLOTHES_ON_MISSION(ePed, FALSE)
RETURN TRUE
ENDIF
SWITCH ePed
CASE CHAR_MICHAEL
BREAK
CASE CHAR_NRM_JIMMY
BREAK
CASE CHAR_NRM_TRACEY
BREAK
ENDSWITCH
RETURN FALSE
ENDFUNC
FUNC BOOL SET_FLOW_OUTFIT_REQUIREMENTS_FOR_CUTSCENE_HANDLE(STRING sHandle, enuMCharacterList ePed)
#if USE_CLF_DLC
return SET_FLOW_OUTFIT_REQUIREMENTS_FOR_CUTSCENE_HANDLECLF(sHandle,ePed)
#endif
#if USE_NRM_DLC
return SET_FLOW_OUTFIT_REQUIREMENTS_FOR_CUTSCENE_HANDLENRM(sHandle,ePed)
#endif
#if not USE_CLF_DLC
#if not USE_NRM_DLC
IF GET_PLAYER_HAS_CHANGE_CLOTHES_ON_MISSION(ePed)
PRINTLN("SET_FLOW_OUTFIT_REQUIREMENTS_FOR_CUTSCENE_HANDLE() - ", GET_PLAYER_PED_STRING(ePed), " has changed outfits on mission")
PED_COMP_OUTFIT_DATA_STRUCT sOutfitData
PED_COMP_ITEM_DATA_STRUCT sItemData
sOutfitData = GET_PED_COMPONENT_DATA_FOR_OUTFIT(GET_PLAYER_PED_MODEL(ePed), OUTFIT_DEFAULT)
INT iItemType, iProp
REPEAT NUMBER_OF_PED_COMP_TYPES iItemType
IF sOutfitData.eItems[iItemType] != DUMMY_PED_COMP
sItemData = GET_PED_COMP_DATA_FOR_ITEM_SP(GET_PLAYER_PED_MODEL(ePed), INT_TO_ENUM(PED_COMP_TYPE_ENUM, iItemType), sOutfitData.eItems[iItemType])
IF iItemType = ENUM_TO_INT(COMP_TYPE_PROPS)
// Dont set any props
REPEAT NUM_PLAYER_PED_PROPS iProp
SET_CUTSCENE_PED_PROP_VARIATION(sHandle, INT_TO_ENUM(PED_PROP_POSITION, iProp), -1, 0, GET_PLAYER_PED_MODEL(ePed))
ENDREPEAT
ELIF iItemType != ENUM_TO_INT(COMP_TYPE_OUTFIT)
AND iItemType != ENUM_TO_INT(COMP_TYPE_PROPGROUP)
SET_CUTSCENE_PED_COMPONENT_VARIATION(sHandle, GET_PED_COMPONENT_FROM_TYPE(INT_TO_ENUM(PED_COMP_TYPE_ENUM, iItemType)), sItemData.iDrawable, sItemData.iTexture, GET_PLAYER_PED_MODEL(ePed))
ENDIF
ENDIF
ENDREPEAT
RESET_PLAYER_HAS_CHANGE_CLOTHES_ON_MISSION(ePed, FALSE)
RETURN TRUE
ENDIF
SWITCH ePed
CASE CHAR_MICHAEL
IF g_savedGlobals.sFlow.controls.flagIDs[FLOWFLAG_MIC_HAS_HAGGARD_SUIT]
AND NOT g_savedGlobals.sFlow.controls.flagIDs[FLOWFLAG_MIC_REM_HAGGARD_SUIT]
PRINTLN("SET_FLOW_OUTFIT_REQUIREMENTS_FOR_CUTSCENE_HANDLE() - Setting haggard suit on Michael")
PED_COMP_OUTFIT_DATA_STRUCT sOutfitData
PED_COMP_ITEM_DATA_STRUCT sItemData
sOutfitData = GET_PED_COMPONENT_DATA_FOR_OUTFIT(GET_PLAYER_PED_MODEL(ePed), OUTFIT_DEFAULT)
INT iItemType, iProp
REPEAT NUMBER_OF_PED_COMP_TYPES iItemType
IF sOutfitData.eItems[iItemType] != DUMMY_PED_COMP
sItemData = GET_PED_COMP_DATA_FOR_ITEM_SP(GET_PLAYER_PED_MODEL(ePed), INT_TO_ENUM(PED_COMP_TYPE_ENUM, iItemType), sOutfitData.eItems[iItemType])
IF iItemType = ENUM_TO_INT(COMP_TYPE_PROPS)
// Dont set any props
REPEAT NUM_PLAYER_PED_PROPS iProp
SET_CUTSCENE_PED_PROP_VARIATION(sHandle, INT_TO_ENUM(PED_PROP_POSITION, iProp), -1, 0, GET_PLAYER_PED_MODEL(ePed))
ENDREPEAT
ELIF iItemType != ENUM_TO_INT(COMP_TYPE_OUTFIT)
AND iItemType != ENUM_TO_INT(COMP_TYPE_PROPGROUP)
SET_CUTSCENE_PED_COMPONENT_VARIATION(sHandle, GET_PED_COMPONENT_FROM_TYPE(INT_TO_ENUM(PED_COMP_TYPE_ENUM, iItemType)), sItemData.iDrawable, sItemData.iTexture, GET_PLAYER_PED_MODEL(ePed))
ENDIF
ENDIF
ENDREPEAT
g_savedGlobals.sFlow.controls.flagIDs[FLOWFLAG_MIC_SET_HAGGARD_SUIT] = TRUE
ENDIF
BREAK
CASE CHAR_TREVOR
PED_COMP_OUTFIT_DATA_STRUCT sOutfitData, sDefaultOutfitData
PED_COMP_ITEM_DATA_STRUCT sItemData, sDefaultItemData
// If Trevor is not wearing a dress, make sure he doesnt appear in just his underwear.
sItemData = GET_PED_COMP_DATA_FOR_ITEM_SP(GET_PLAYER_PED_MODEL(ePed), COMP_TYPE_TORSO, TORSO_P2_DRESS)
IF g_savedGlobals.sPlayerData.sInfo.sVariations[ePed].iDrawableVariation[PED_COMP_TORSO] = sItemData.iDrawable
// do nothing.
ELSE
// put some clothes on
sOutfitData = GET_PED_COMPONENT_DATA_FOR_OUTFIT(GET_PLAYER_PED_MODEL(ePed), OUTFIT_P2_UNDERWEAR)
sDefaultOutfitData = GET_PED_COMPONENT_DATA_FOR_OUTFIT(GET_PLAYER_PED_MODEL(ePed), OUTFIT_P2_DEFAULT)
INT iItemType, iProp
REPEAT NUMBER_OF_PED_COMP_TYPES iItemType
IF sOutfitData.eItems[iItemType] != DUMMY_PED_COMP
IF iItemType = ENUM_TO_INT(COMP_TYPE_PROPS)
// Dont set any props
REPEAT NUM_PLAYER_PED_PROPS iProp
SET_CUTSCENE_PED_PROP_VARIATION(sHandle, INT_TO_ENUM(PED_PROP_POSITION, iProp), -1, 0, GET_PLAYER_PED_MODEL(ePed))
ENDREPEAT
ELIF iItemType != ENUM_TO_INT(COMP_TYPE_OUTFIT)
AND iItemType != ENUM_TO_INT(COMP_TYPE_PROPGROUP)
#IF IS_DEBUG_BUILD
IF iItemType >= NUM_PED_COMPONENTS
PRINTLN("iItemType >= NUM_PED_COMPONENTS???")
SCRIPT_ASSERT("iItemType >= NUM_PED_COMPONENTS???")
RETURN FALSE
ENDIF
#ENDIF
IF (iItemType = ENUM_TO_INT(COMP_TYPE_TORSO)
OR iItemType = ENUM_TO_INT(COMP_TYPE_LEGS))
sItemData = GET_PED_COMP_DATA_FOR_ITEM_SP(GET_PLAYER_PED_MODEL(ePed), INT_TO_ENUM(PED_COMP_TYPE_ENUM, iItemType), sOutfitData.eItems[iItemType])
IF sItemData.iDrawable = g_savedGlobals.sPlayerData.sInfo.sVariations[ePed].iDrawableVariation[iItemType]
AND sItemData.iTexture = g_savedGlobals.sPlayerData.sInfo.sVariations[ePed].iTextureVariation[iItemType]
PRINTLN("//cutscene Underwear torso or legs? [ePed: ", ePed, ", iItemType: ", iItemType, ", iDrawable: ", sItemData.iDrawable, ", iTexture: ", sItemData.iTexture, "]")
// SCRIPT_ASSERT("//cutscene Underwear torso or legs?")
sDefaultItemData = GET_PED_COMP_DATA_FOR_ITEM_SP(GET_PLAYER_PED_MODEL(ePed), INT_TO_ENUM(PED_COMP_TYPE_ENUM, iItemType), sDefaultOutfitData.eItems[iItemType])
g_savedGlobals.sPlayerData.sInfo.sVariations[ePed].iDrawableVariation[iItemType] = sDefaultItemData.iDrawable
g_savedGlobals.sPlayerData.sInfo.sVariations[ePed].iTextureVariation[iItemType] = sDefaultItemData.iTexture
SET_CUTSCENE_PED_COMPONENT_VARIATION(sHandle, GET_PED_COMPONENT_FROM_TYPE(INT_TO_ENUM(PED_COMP_TYPE_ENUM, iItemType)), sDefaultItemData.iDrawable, sDefaultItemData.iTexture, GET_PLAYER_PED_MODEL(ePed))
IF iItemType = ENUM_TO_INT(COMP_TYPE_LEGS)
PRINTLN("//cutscene Underwear feet? [ePed: ", ePed, "]")
// SCRIPT_ASSERT("//cutscene Underwear feet?")
sDefaultItemData = GET_PED_COMP_DATA_FOR_ITEM_SP(GET_PLAYER_PED_MODEL(ePed), COMP_TYPE_FEET, sDefaultOutfitData.eItems[COMP_TYPE_FEET])
g_savedGlobals.sPlayerData.sInfo.sVariations[ePed].iDrawableVariation[PED_COMP_FEET] = sDefaultItemData.iDrawable
g_savedGlobals.sPlayerData.sInfo.sVariations[ePed].iTextureVariation[PED_COMP_FEET] = sDefaultItemData.iTexture
SET_CUTSCENE_PED_COMPONENT_VARIATION(sHandle, GET_PED_COMPONENT_FROM_TYPE(COMP_TYPE_FEET), sDefaultItemData.iDrawable, sDefaultItemData.iTexture, GET_PLAYER_PED_MODEL(ePed))
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDREPEAT
ENDIF
BREAK
ENDSWITCH
RETURN FALSE
#endif
#endif
ENDFUNC
/// PURPOSE: Creates the specified player character on foot at their last saved location.
/// NOTE: This function should be called each frame until TRUE is returned.
/// The ePed param should either be CHAR_MICHAEL, CHAR_FRANKLIN, or CHAR_TREVOR
FUNC BOOL CREATE_PLAYER_PED_ON_FOOT_AT_LAST_KNOWN_LOCATIONCLF(PED_INDEX &ReturnPed, enumCharacterList ePed, BOOL bCleanupModel = TRUE)
IF IS_PLAYER_PED_PLAYABLE(ePed)
// Load the required model
MODEL_NAMES model = GET_PLAYER_PED_MODELCLF(ePed)
REQUEST_MODEL(model)
IF HAS_MODEL_LOADED(model)
// Ally: As the selector script is will be active in both sp and mp, we can't have it creating
// networked objects when it is not a net script.
IF DOES_ENTITY_EXIST(ReturnPed)
DELETE_PED(ReturnPed)
ENDIF
ReturnPed = CREATE_PED(PEDTYPE_MISSION, model, g_savedGlobalsClifford.sPlayerData.sInfo.vLastKnownCoords[ePed], g_savedGlobalsClifford.sPlayerData.sInfo.fLastKnownHead[ePed], FALSE, FALSE)
SET_ENTITY_COORDS_NO_OFFSET(Returnped, g_savedGlobalsClifford.sPlayerData.sInfo.vLastKnownCoords[ePed])
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ".sc: CREATE_PLAYER_PED_ON_FOOT_AT_LAST_KNOWN_LOCATION - ", GET_PLAYER_PED_STRING(ePed))
#ENDIF
StoreInGlobalSelector(ReturnPed, ePed)
SET_PED_CAN_LOSE_PROPS_ON_DAMAGE(ReturnPed, FALSE)
RESTORE_PLAYER_PED_INFO(ReturnPed)
SET_FLOW_OUTFIT_REQUIREMENTS(ReturnPed)
STORE_TEMP_PLAYER_PED_ID(ReturnPed)
IF bCleanupModel
SET_MODEL_AS_NO_LONGER_NEEDED(model)
ENDIF
RETURN TRUE
ENDIF
ELSE
#IF IS_DEBUG_BUILD
SCRIPT_ASSERT("CREATE_PLAYER_PED_ON_FOOT_AT_LAST_KNOWN_LOCATION - Ped is not a player character.")
PRINTSTRING("\nCREATE_PLAYER_PED_ON_FOOT_AT_LAST_KNOWN_LOCATION - Ped is not a player character.")PRINTNL()
#ENDIF
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL CREATE_PLAYER_PED_ON_FOOT_AT_LAST_KNOWN_LOCATIONNRM(PED_INDEX &ReturnPed, enumCharacterList ePed, BOOL bCleanupModel = TRUE)
IF IS_PLAYER_PED_PLAYABLE(ePed)
// Load the required model
MODEL_NAMES model = GET_PLAYER_PED_MODELNRM(ePed)
REQUEST_MODEL(model)
IF HAS_MODEL_LOADED(model)
// Ally: As the selector script is will be active in both sp and mp, we can't have it creating
// networked objects when it is not a net script.
IF DOES_ENTITY_EXIST(ReturnPed)
DELETE_PED(ReturnPed)
ENDIF
ReturnPed = CREATE_PED(PEDTYPE_MISSION, model, g_savedGlobalsnorman.sPlayerData.sInfo.vLastKnownCoords[ePed], g_savedGlobalsnorman.sPlayerData.sInfo.fLastKnownHead[ePed], FALSE, FALSE)
SET_ENTITY_COORDS_NO_OFFSET(Returnped, g_savedGlobalsnorman.sPlayerData.sInfo.vLastKnownCoords[ePed])
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ".sc: CREATE_PLAYER_PED_ON_FOOT_AT_LAST_KNOWN_LOCATION - ", GET_PLAYER_PED_STRING(ePed))
#ENDIF
StoreInGlobalSelector(ReturnPed, ePed)
SET_PED_CAN_LOSE_PROPS_ON_DAMAGE(ReturnPed, FALSE)
RESTORE_PLAYER_PED_INFO(ReturnPed)
SET_FLOW_OUTFIT_REQUIREMENTS(ReturnPed)
STORE_TEMP_PLAYER_PED_ID(ReturnPed)
IF bCleanupModel
SET_MODEL_AS_NO_LONGER_NEEDED(model)
ENDIF
RETURN TRUE
ENDIF
ELSE
#IF IS_DEBUG_BUILD
SCRIPT_ASSERT("CREATE_PLAYER_PED_ON_FOOT_AT_LAST_KNOWN_LOCATION - Ped is not a player character.")
PRINTSTRING("\nCREATE_PLAYER_PED_ON_FOOT_AT_LAST_KNOWN_LOCATION - Ped is not a player character.")PRINTNL()
#ENDIF
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL CREATE_PLAYER_PED_ON_FOOT_AT_LAST_KNOWN_LOCATION(PED_INDEX &ReturnPed, enumCharacterList ePed, BOOL bCleanupModel = TRUE)
#if USE_CLF_DLC
if g_bLoadedClifford
return CREATE_PLAYER_PED_ON_FOOT_AT_LAST_KNOWN_LOCATIONCLF(ReturnPed,ePed,bCleanupModel)
endif
#endif
#if USE_NRM_DLC
if g_bLoadedNorman
return CREATE_PLAYER_PED_ON_FOOT_AT_LAST_KNOWN_LOCATIONNRM(ReturnPed,ePed,bCleanupModel)
endif
#endif
IF IS_PLAYER_PED_PLAYABLE(ePed)
// Load the required model
MODEL_NAMES model = GET_PLAYER_PED_MODEL(ePed)
REQUEST_MODEL(model)
IF HAS_MODEL_LOADED(model)
// Ally: As the selector script is will be active in both sp and mp, we can't have it creating
// networked objects when it is not a net script.
IF DOES_ENTITY_EXIST(ReturnPed)
DELETE_PED(ReturnPed)
ENDIF
ReturnPed = CREATE_PED(PEDTYPE_MISSION, model, g_savedGlobals.sPlayerData.sInfo.vLastKnownCoords[ePed], g_savedGlobals.sPlayerData.sInfo.fLastKnownHead[ePed], FALSE, FALSE)
SET_ENTITY_COORDS_NO_OFFSET(Returnped, g_savedGlobals.sPlayerData.sInfo.vLastKnownCoords[ePed])
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ".sc: CREATE_PLAYER_PED_ON_FOOT_AT_LAST_KNOWN_LOCATION - ", GET_PLAYER_PED_STRING(ePed))
#ENDIF
StoreInGlobalSelector(ReturnPed, ePed)
SET_PED_CAN_LOSE_PROPS_ON_DAMAGE(ReturnPed, FALSE)
RESTORE_PLAYER_PED_INFO(ReturnPed)
SET_FLOW_OUTFIT_REQUIREMENTS(ReturnPed)
STORE_TEMP_PLAYER_PED_ID(ReturnPed)
IF bCleanupModel
SET_MODEL_AS_NO_LONGER_NEEDED(model)
ENDIF
RETURN TRUE
ENDIF
ELSE
#IF IS_DEBUG_BUILD
SCRIPT_ASSERT("CREATE_PLAYER_PED_ON_FOOT_AT_LAST_KNOWN_LOCATION - Ped is not a player character.")
PRINTSTRING("\nCREATE_PLAYER_PED_ON_FOOT_AT_LAST_KNOWN_LOCATION - Ped is not a player character.")PRINTNL()
#ENDIF
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE: Creates the specified player character on foot.
/// NOTE: This function should be called each frame until TRUE is returned.
/// The ePed param should be one of the main characters.
FUNC BOOL CREATE_PLAYER_PED_ON_FOOTCLF(PED_INDEX &ReturnPed, enumCharacterList ePed, VECTOR vCoords, FLOAT fHeading = 0.0, BOOL bCleanupModel = TRUE, BOOL bInLeadIn = FALSE)
IF IS_PLAYER_PED_PLAYABLE(ePed)
// Load the required model
MODEL_NAMES model = GET_PLAYER_PED_MODELCLF(ePed)
REQUEST_MODEL(model)
IF HAS_MODEL_LOADED(model)
// Ally: As the selector script is will be active in both sp and mp, we can't have it creating
// networked objects when it is not a net script.
IF DOES_ENTITY_EXIST(ReturnPed)
DELETE_PED(ReturnPed)
ENDIF
ReturnPed = CREATE_PED(PEDTYPE_MISSION, model, vCoords, fHeading, FALSE, FALSE)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ".sc: CREATE_PLAYER_PED_ON_FOOT - ", GET_PLAYER_PED_STRING(ePed))
#ENDIF
StoreInGlobalSelector(ReturnPed, ePed, bInLeadIn)
SET_PED_CAN_LOSE_PROPS_ON_DAMAGE(ReturnPed, FALSE)
RESTORE_PLAYER_PED_VARIATIONSCLF(ReturnPed)
RESTORE_PLAYER_PED_WEAPONSCLF(ReturnPed)
RESTORE_PLAYER_PED_ARMOURCLF(ReturnPed)
RESTORE_PLAYER_PED_TATTOOSCLF(ReturnPed)
SET_FLOW_OUTFIT_REQUIREMENTS(ReturnPed)
STORE_TEMP_PLAYER_PED_ID(ReturnPed)
IF bCleanupModel
SET_MODEL_AS_NO_LONGER_NEEDED(model)
ENDIF
RETURN TRUE
ENDIF
ELSE
#IF IS_DEBUG_BUILD
SCRIPT_ASSERT("CREATE_PLAYER_PED_ON_FOOT - Ped is not a player character.")
PRINTSTRING("\nCREATE_PLAYER_PED_ON_FOOT - Ped is not a player character.")PRINTNL()
#ENDIF
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL CREATE_PLAYER_PED_ON_FOOTNRM(PED_INDEX &ReturnPed, enumCharacterList ePed, VECTOR vCoords, FLOAT fHeading = 0.0, BOOL bCleanupModel = TRUE, BOOL bInLeadIn = FALSE)
IF IS_PLAYER_PED_PLAYABLE(ePed)
// Load the required model
MODEL_NAMES model = GET_PLAYER_PED_MODELNRM(ePed)
REQUEST_MODEL(model)
IF HAS_MODEL_LOADED(model)
// Ally: As the selector script is will be active in both sp and mp, we can't have it creating
// networked objects when it is not a net script.
IF DOES_ENTITY_EXIST(ReturnPed)
DELETE_PED(ReturnPed)
ENDIF
ReturnPed = CREATE_PED(PEDTYPE_MISSION, model, vCoords, fHeading, FALSE, FALSE)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ".sc: CREATE_PLAYER_PED_ON_FOOT - ", GET_PLAYER_PED_STRING(ePed))
#ENDIF
StoreInGlobalSelector(ReturnPed, ePed, bInLeadIn)
SET_PED_CAN_LOSE_PROPS_ON_DAMAGE(ReturnPed, FALSE)
RESTORE_PLAYER_PED_VARIATIONSNRM(ReturnPed)
RESTORE_PLAYER_PED_WEAPONSNRM(ReturnPed)
RESTORE_PLAYER_PED_ARMOURNRM(ReturnPed)
RESTORE_PLAYER_PED_TATTOOSNRM(ReturnPed)
SET_FLOW_OUTFIT_REQUIREMENTS(ReturnPed)
STORE_TEMP_PLAYER_PED_ID(ReturnPed)
IF bCleanupModel
SET_MODEL_AS_NO_LONGER_NEEDED(model)
ENDIF
RETURN TRUE
ENDIF
ELSE
#IF IS_DEBUG_BUILD
SCRIPT_ASSERT("CREATE_PLAYER_PED_ON_FOOT - Ped is not a player character.")
PRINTSTRING("\nCREATE_PLAYER_PED_ON_FOOT - Ped is not a player character.")PRINTNL()
#ENDIF
ENDIF
RETURN FALSE
ENDFUNC
FUNC BOOL CREATE_PLAYER_PED_ON_FOOT(PED_INDEX &ReturnPed, enumCharacterList ePed, VECTOR vCoords, FLOAT fHeading = 0.0, BOOL bCleanupModel = TRUE, BOOL bInLeadIn = FALSE, BOOL bIgnoreUnderwearcheck = FALSE)
#if USE_CLF_DLC
if g_bLoadedClifford
return CREATE_PLAYER_PED_ON_FOOTCLF(ReturnPed,ePed,vCoords,fHeading,bCleanupModel,bInLeadIn)
endif
#endif
#if USE_NRM_DLC
if g_bLoadedNorman
return CREATE_PLAYER_PED_ON_FOOTNRM(ReturnPed,ePed,vCoords,fHeading,bCleanupModel,bInLeadIn)
endif
#endif
IF IS_PLAYER_PED_PLAYABLE(ePed)
// Load the required model
MODEL_NAMES model = GET_PLAYER_PED_MODEL(ePed)
REQUEST_MODEL(model)
IF HAS_MODEL_LOADED(model)
// Ally: As the selector script is will be active in both sp and mp, we can't have it creating
// networked objects when it is not a net script.
IF DOES_ENTITY_EXIST(ReturnPed)
DELETE_PED(ReturnPed)
ENDIF
ReturnPed = CREATE_PED(PEDTYPE_MISSION, model, vCoords, fHeading, FALSE, FALSE)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ".sc: CREATE_PLAYER_PED_ON_FOOT - ", GET_PLAYER_PED_STRING(ePed))
#ENDIF
StoreInGlobalSelector(ReturnPed, ePed, bInLeadIn)
SET_PED_CAN_LOSE_PROPS_ON_DAMAGE(ReturnPed, FALSE)
RESTORE_PLAYER_PED_VARIATIONS(ReturnPed)
RESTORE_PLAYER_PED_WEAPONS(ReturnPed)
RESTORE_PLAYER_PED_ARMOUR(ReturnPed)
RESTORE_PLAYER_PED_TATTOOS(ReturnPed)
SET_FLOW_OUTFIT_REQUIREMENTS(ReturnPed, bIgnoreUnderwearcheck)
STORE_TEMP_PLAYER_PED_ID(ReturnPed)
IF bCleanupModel
SET_MODEL_AS_NO_LONGER_NEEDED(model)
ENDIF
RETURN TRUE
ENDIF
ELSE
#IF IS_DEBUG_BUILD
SCRIPT_ASSERT("CREATE_PLAYER_PED_ON_FOOT - Ped is not a player character.")
PRINTSTRING("\nCREATE_PLAYER_PED_ON_FOOT - Ped is not a player character.")PRINTNL()
#ENDIF
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE: Creates the specified player character in a vehicle that has already been created.
/// NOTE: This function should be called each frame until TRUE is returned.
/// The ePed param should be one of the main characters.
FUNC BOOL CREATE_PLAYER_PED_INSIDE_VEHICLE(PED_INDEX &ReturnPed, enumCharacterList ePed, VEHICLE_INDEX vehicle, VEHICLE_SEAT seat = VS_DRIVER, BOOL bCleanupModel = TRUE, BOOL bInLeadIn = FALSE, BOOL bIgnoreUnderwearcheck = FALSE)
IF IS_PLAYER_PED_PLAYABLE(ePed)
// Load the required model
MODEL_NAMES model = GET_PLAYER_PED_MODEL(ePed)
REQUEST_MODEL(model)
IF HAS_MODEL_LOADED(model)
// Ally: As the selector script is will be active in both sp and mp, we can't have it creating
// networked objects when it is not a net script.
IF DOES_ENTITY_EXIST(ReturnPed)
DELETE_PED(ReturnPed)
ENDIF
IF DOES_ENTITY_EXIST(vehicle)
AND IS_VEHICLE_DRIVEABLE(vehicle)
ReturnPed = CREATE_PED_INSIDE_VEHICLE(vehicle, PEDTYPE_MISSION, model, seat)
#IF IS_DEBUG_BUILD
PRINTLN(GET_THIS_SCRIPT_NAME(), ".sc: CREATE_PLAYER_PED_INSIDE_VEHICLE - ", GET_PLAYER_PED_STRING(ePed))
//try and catch 557329
IF ARE_STRINGS_EQUAL(GET_THIS_SCRIPT_NAME(), "debug")
DEBUG_PRINTCALLSTACK()
ENDIF
#ENDIF
StoreInGlobalSelector(ReturnPed, ePed, bInLeadIn)
SET_PED_CAN_LOSE_PROPS_ON_DAMAGE(ReturnPed, FALSE)
RESTORE_PLAYER_PED_VARIATIONS(ReturnPed)
RESTORE_PLAYER_PED_WEAPONS(ReturnPed)
RESTORE_PLAYER_PED_ARMOUR(ReturnPed)
RESTORE_PLAYER_PED_TATTOOS(ReturnPed)
SET_FLOW_OUTFIT_REQUIREMENTS(ReturnPed, bIgnoreUnderwearcheck)
STORE_TEMP_PLAYER_PED_ID(ReturnPed)
IF bCleanupModel
SET_MODEL_AS_NO_LONGER_NEEDED(model)
ENDIF
ENDIF
RETURN TRUE
ENDIF
ELSE
#IF IS_DEBUG_BUILD
SCRIPT_ASSERT("CREATE_PLAYER_PED_INSIDE_VEHICLE - Ped is not a player character.")
PRINTSTRING("\nCREATE_PLAYER_PED_INSIDE_VEHICLE - Ped is not a player character.")PRINTNL()
#ENDIF
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE: Repositions the players last vehicle (if they have any)
PROC REPOSITION_PLAYERS_VEHICLE(VECTOR vCoords, FLOAT fHeading)
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
VEHICLE_INDEX lastVehID = GET_PLAYERS_LAST_VEHICLE()
IF DOES_ENTITY_EXIST(lastVehID)
IF IS_VEHICLE_DRIVEABLE(lastVehID)
SET_ENTITY_COORDS(lastVehID, vCoords)
SET_ENTITY_HEADING(lastVehID, fHeading)
SET_VEHICLE_ON_GROUND_PROPERLY(lastVehID)
ENDIF
ENDIF
ENDIF
ENDPROC
/// PURPOSE: Checks to see if the players last vehicle matches the specified flags
FUNC BOOL IS_PLAYERS_VEHICLE_OF_TYPE(PLAYER_VEHICLE_FLAGS flags)
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
VEHICLE_INDEX lastVehID = GET_PLAYERS_LAST_VEHICLE()
IF DOES_ENTITY_EXIST(lastVehID)
IF IS_VEHICLE_DRIVEABLE(lastVehID)
MODEL_NAMES eVehicleModel = GET_ENTITY_MODEL(lastVehID)
enumCharacterList eCurrentPed = GET_CURRENT_PLAYER_PED_ENUM()
IF (ENUM_TO_INT(flags) & ENUM_TO_INT(PV_CAR)) != 0
IF NOT IS_THIS_MODEL_A_CAR(eVehicleModel)
RETURN FALSE
ENDIF
ENDIF
IF (ENUM_TO_INT(flags) & ENUM_TO_INT(PV_BIKE)) != 0
IF NOT IS_THIS_MODEL_A_BIKE(eVehicleModel)
RETURN FALSE
ENDIF
ENDIF
IF (ENUM_TO_INT(flags) & ENUM_TO_INT(PV_HELI)) != 0
IF NOT IS_THIS_MODEL_A_HELI(eVehicleModel)
RETURN FALSE
ENDIF
ENDIF
IF (ENUM_TO_INT(flags) & ENUM_TO_INT(PV_BOAT)) != 0
IF NOT IS_THIS_MODEL_A_BOAT(eVehicleModel)
RETURN FALSE
ENDIF
ENDIF
IF (ENUM_TO_INT(flags) & ENUM_TO_INT(PV_2_DOOR)) != 0
IF GET_ENTITY_BONE_INDEX_BY_NAME(lastVehID, "door_dside_r") <> -1
OR GET_ENTITY_BONE_INDEX_BY_NAME(lastVehID, "door_pside_r") <> -1
RETURN FALSE
ENDIF
ENDIF
IF (ENUM_TO_INT(flags) & ENUM_TO_INT(PV_4_DOOR)) != 0
IF GET_ENTITY_BONE_INDEX_BY_NAME(lastVehID, "door_dside_r") = -1
OR GET_ENTITY_BONE_INDEX_BY_NAME(lastVehID, "door_pside_r") = -1
RETURN FALSE
ENDIF
ENDIF
IF (ENUM_TO_INT(flags) & ENUM_TO_INT(PV_2_SEATER)) != 0
IF IS_THIS_MODEL_A_BIKE(eVehicleModel)
IF GET_ENTITY_BONE_INDEX_BY_NAME(lastVehID, "seat_r") = -1
RETURN FALSE
ENDIF
ELSE
IF GET_ENTITY_BONE_INDEX_BY_NAME(lastVehID, "seat_dside_r") <> -1
OR GET_ENTITY_BONE_INDEX_BY_NAME(lastVehID, "seat_pside_r") <> -1
RETURN FALSE
ENDIF
ENDIF
ENDIF
IF (ENUM_TO_INT(flags) & ENUM_TO_INT(PV_4_SEATER)) != 0
IF GET_ENTITY_BONE_INDEX_BY_NAME(lastVehID, "seat_dside_r") = -1
OR GET_ENTITY_BONE_INDEX_BY_NAME(lastVehID, "seat_pside_r") = -1
RETURN FALSE
ENDIF
ENDIF
IF (ENUM_TO_INT(flags) & ENUM_TO_INT(PV_DEFAULT_PLAYER_VEHICLE)) != 0
IF NOT IS_PLAYER_PED_PLAYABLE(eCurrentPed)
RETURN FALSE
ENDIF
IF GET_PLAYER_VEH_MODEL(eCurrentPed) <> eVehicleModel
RETURN FALSE
ENDIF
ENDIF
IF (ENUM_TO_INT(flags) & ENUM_TO_INT(PV_SAFE_FOR_REPOSITION)) != 0
IF NOT IS_THIS_MODEL_A_CAR(eVehicleModel)
AND NOT IS_THIS_MODEL_A_BIKE(eVehicleModel)
RETURN FALSE
ENDIF
IF IS_BIG_VEHICLE(lastVehID)
RETURN FALSE
ENDIF
INT iInstanceID
STRING sScriptName = GET_ENTITY_SCRIPT(lastVehID, iInstanceID)
IF NOT IS_STRING_NULL_OR_EMPTY(sScriptName)
IF GET_HASH_KEY(sScriptName) = GET_HASH_KEY("taxiService")
RETURN FALSE
ENDIF
ENDIF
// Do not reposition vehicles in the garage.
IF IS_VEHICLE_IN_PLAYERS_GARAGE(lastVehID, eCurrentPed, FALSE)
RETURN FALSE
ENDIF
ENDIF
// All flags match
RETURN TRUE
ENDIF
ENDIF
ENDIF
// Unable to query last vehicle
RETURN FALSE
ENDFUNC
/// PURPOSE: Returns true if the extra is turned on
FUNC BOOL IS_MR_RASPBERRY_JAM_TURNED_ON(VEHICLE_INDEX ReturnVeh)
RETURN IS_VEHICLE_EXTRA_TURNED_ON(ReturnVeh, 5)
ENDFUNC
/// PURPOSE: Sets the vehicle extra for Trevors bodhi2
PROC TURN_ON_MR_RASPBERRY_JAM(VEHICLE_INDEX &ReturnVeh)
// Attach Mr Raspberry Jam to Trevors truck
#if USE_CLF_DLC
IF NOT IS_MR_RASPBERRY_JAM_TURNED_ON(ReturnVeh)
SET_VEHICLE_EXTRA(ReturnVeh, 5, true)
ENDIF
#endif
#if USE_NRM_DLC
IF NOT IS_MR_RASPBERRY_JAM_TURNED_ON(ReturnVeh)
SET_VEHICLE_EXTRA(ReturnVeh, 5, true)
ENDIF
#endif
#if not USE_CLF_DLC
#if not USE_NRM_DLC
IF NOT IS_MR_RASPBERRY_JAM_TURNED_ON(ReturnVeh)
SET_VEHICLE_EXTRA(ReturnVeh, 5, (NOT g_savedGlobals.sFlow.controls.flagIDs[FLOWFLAG_PLAYER_VEH_T_UNLOCK_RASP_JAM]))
ENDIF
#endif
#endif
ENDPROC
/// PURPOSE: Creates the specified player characters vehicle.
/// NOTE: This function should be called each frame until TRUE is returned.
/// The ePed param should be one of the main characters.
/// The eTypePreference will use the player vehicle that closely matches the type specified
#if USE_CLF_DLC
FUNC BOOL CREATE_PLAYER_VEHICLECLF(VEHICLE_INDEX &ReturnVeh, enumCharacterList ePed, VECTOR vCoords, FLOAT fHeading, BOOL bCleanupModel = TRUE, VEHICLE_CREATE_TYPE_ENUM eTypePreference = VEHICLE_TYPE_DEFAULT)
IF IS_PLAYER_PED_PLAYABLE(ePed)
// Grab the vehicle data for the specified ped
INT iPlateBack
TEXT_LABEL_15 tlPlateText
PED_VEH_DATA_STRUCT sVehData
GET_PLAYER_VEH_DATA(ePed, sVehData, eTypePreference)
IF sVehData.model = DUMMY_MODEL_FOR_SCRIPT
// Bail out so we don't get stuck.
// Scripts should be checking if the vehicle is driveable anyway.
RETURN TRUE
ENDIF
IF DOES_ENTITY_EXIST(ReturnVeh)
IF GET_ENTITY_MODEL(ReturnVeh) != sVehData.model
#IF IS_DEBUG_BUILD
SCRIPT_ASSERT("CREATE_PLAYER_VEHICLE - Vehicle ID already exists with different model")
#ENDIF
ENDIF
RETURN TRUE
ENDIF
// Clear the save data for Michaels car when he gets it back from Jimmy.
IF ePed = CHAR_MICHAEL
AND NOT g_savedGlobalsClifford.sPlayerData.sInfo.bJimmyModsSetOnMichaelsCar
g_savedGlobalsClifford.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_CAR][ePed].model = DUMMY_MODEL_FOR_SCRIPT
// we set the mods down below...
ENDIF
// Create the stored CAR vehicle if it has the same model.
IF g_savedGlobalsClifford.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_CAR][ePed].model = sVehData.model
REQUEST_MODEL(g_savedGlobalsClifford.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_CAR][ePed].model)
IF HAS_MODEL_LOADED(g_savedGlobalsClifford.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_CAR][ePed].model)
PRINTLN(GET_THIS_SCRIPT_NAME(), ": CREATE_PLAYER_VEHICLE() Using stored car data for ped ", ePed)
ReturnVeh = CREATE_VEHICLE(g_savedGlobalsClifford.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_CAR][ePed].model, vCoords, fHeading, FALSE, FALSE)
SET_VEHICLE_ON_GROUND_PROPERLY(ReturnVeh)
SET_VEHICLE_NOT_STEALABLE_AMBIENTLY(ReturnVeh, FALSE)
SET_VEHICLE_CAN_SAVE_IN_GARAGE(ReturnVeh, FALSE)
SET_VEHICLE_HAS_STRONG_AXLES(ReturnVeh, TRUE)
// Bug 492963 - Increase vehicle health by 250 (each part)
//SET_ENTITY_MAX_HEALTH(ReturnVeh, 1250)
SET_ENTITY_HEALTH(ReturnVeh, 1250)
SET_VEHICLE_ENGINE_HEALTH(ReturnVeh, 1250)
SET_VEHICLE_PETROL_TANK_HEALTH(ReturnVeh, 1250)
sVehData.fHealth = 1250
// Colours
SET_VEHICLE_COLOURS(ReturnVeh, g_savedGlobalsClifford.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_CAR][ePed].iColour1, g_savedGlobalsClifford.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_CAR][ePed].iColour2)
SET_VEHICLE_EXTRA_COLOURS(ReturnVeh, g_savedGlobalsClifford.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_CAR][ePed].iColourExtra1, g_savedGlobalsClifford.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_CAR][ePed].iColourExtra2)
// Dirt
SET_VEHICLE_DIRT_LEVEL(ReturnVeh, sVehData.fDirtLevel)
// Extras
INT iExtra
REPEAT NUMBER_OF_VEHICLE_EXTRAS iExtra
SET_VEHICLE_EXTRA(ReturnVeh, iExtra+1, (NOT g_savedGlobalsClifford.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_CAR][ePed].bExtraOn[iExtra]))
ENDREPEAT
IF g_savedGlobalsClifford.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_CAR][ePed].bConvertible
SET_CONVERTIBLE_ROOF(ReturnVeh, g_savedGlobalsClifford.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_CAR][ePed].bConvertible)
ENDIF
// 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(ReturnVeh, tlPlateText)
SET_VEHICLE_NUMBER_PLATE_TEXT_INDEX(ReturnVeh, iPlateBack)
ELSE
SET_VEHICLE_NUMBER_PLATE_TEXT(ReturnVeh, g_savedGlobalsClifford.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_CAR][ePed].tlNumberPlate)
IF g_savedGlobalsClifford.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_CAR][ePed].iPlateBack >= 0
AND g_savedGlobalsClifford.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_CAR][ePed].iPlateBack < GET_NUMBER_OF_VEHICLE_NUMBER_PLATES()
SET_VEHICLE_NUMBER_PLATE_TEXT_INDEX(ReturnVeh, g_savedGlobalsClifford.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_CAR][ePed].iPlateBack)
ENDIF
ENDIF
// Tyres
SET_VEHICLE_TYRE_SMOKE_COLOR(ReturnVeh, g_savedGlobalsClifford.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_CAR][ePed].iTyreR, g_savedGlobalsClifford.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_CAR][ePed].iTyreG, g_savedGlobalsClifford.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_CAR][ePed].iTyreB)
SET_VEHICLE_TYRES_CAN_BURST(ReturnVeh, g_savedGlobalsClifford.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_CAR][ePed].bTyresCanBurst)
// Window tint
SET_VEHICLE_WINDOW_TINT(ReturnVeh, g_savedGlobalsClifford.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_CAR][ePed].iWindowTintColour)
// Livery
IF GET_VEHICLE_LIVERY_COUNT(ReturnVeh) > 1
AND g_savedGlobalsClifford.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_CAR][ePed].iLivery >= 0
SET_VEHICLE_LIVERY(ReturnVeh, g_savedGlobalsClifford.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_CAR][ePed].iLivery)
ENDIF
// Wheels
IF g_savedGlobalsClifford.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_CAR][ePed].iWheelType > -1
IF NOT IS_THIS_MODEL_A_BICYCLE(GET_ENTITY_MODEL(ReturnVeh))
IF IS_THIS_MODEL_A_BIKE(GET_ENTITY_MODEL(ReturnVeh))
IF (INT_TO_ENUM(MOD_WHEEL_TYPE, g_savedGlobalsClifford.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_CAR][ePed].iWheelType) = MWT_BIKE)
SET_VEHICLE_WHEEL_TYPE(ReturnVeh, INT_TO_ENUM(MOD_WHEEL_TYPE, g_savedGlobalsClifford.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_CAR][ePed].iWheelType))
ENDIF
ELSE
SET_VEHICLE_WHEEL_TYPE(ReturnVeh, INT_TO_ENUM(MOD_WHEEL_TYPE, g_savedGlobalsClifford.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_CAR][ePed].iWheelType))
ENDIF
ENDIF
ENDIF
// Mods
SET_VEHICLE_MOD_DATA(ReturnVeh, g_savedGlobalsClifford.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_CAR][ePed].iModIndex, g_savedGlobalsClifford.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_CAR][ePed].iModVariation)
// Env Eff
SET_VEHICLE_ENVEFF_SCALE(ReturnVeh, sVehData.fEnvEff)
// Attach Mr Raspberry Jam to Trevors truck
IF ePed = CHAR_TREVOR
IF GET_ENTITY_MODEL(ReturnVeh) = BODHI2
TURN_ON_MR_RASPBERRY_JAM(ReturnVeh)
ENDIF
ENDIF
IF bCleanupModel
SET_MODEL_AS_NO_LONGER_NEEDED(g_savedGlobalsClifford.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_CAR][ePed].model)
ENDIF
STORE_TEMP_PLAYER_VEHICLE_ID(ReturnVeh, ePed)
RETURN TRUE
ENDIF
// Create the stored BIKE vehicle if it has the same model.
ELIF g_savedGlobalsClifford.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_BIKE][ePed].model = sVehData.model
REQUEST_MODEL(g_savedGlobalsClifford.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_BIKE][ePed].model)
IF HAS_MODEL_LOADED(g_savedGlobalsClifford.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_BIKE][ePed].model)
PRINTLN(GET_THIS_SCRIPT_NAME(), ": CREATE_PLAYER_VEHICLE() Using stored bike data")
ReturnVeh = CREATE_VEHICLE(g_savedGlobalsClifford.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_BIKE][ePed].model, vCoords, fHeading, FALSE, FALSE)
SET_VEHICLE_ON_GROUND_PROPERLY(ReturnVeh)
SET_VEHICLE_NOT_STEALABLE_AMBIENTLY(ReturnVeh, FALSE)
SET_VEHICLE_CAN_SAVE_IN_GARAGE(ReturnVeh, FALSE)
SET_VEHICLE_HAS_STRONG_AXLES(ReturnVeh, TRUE)
// Bug 492963 - Increase vehicle health by 250 (each part)
//SET_ENTITY_MAX_HEALTH(ReturnVeh, 1250)
SET_ENTITY_HEALTH(ReturnVeh, 1250)
SET_VEHICLE_ENGINE_HEALTH(ReturnVeh, 1250)
SET_VEHICLE_PETROL_TANK_HEALTH(ReturnVeh, 1250)
sVehData.fHealth = 1250
// Colours
SET_VEHICLE_COLOURS(ReturnVeh, g_savedGlobalsClifford.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_BIKE][ePed].iColour1, g_savedGlobalsClifford.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_BIKE][ePed].iColour2)
SET_VEHICLE_EXTRA_COLOURS(ReturnVeh, g_savedGlobalsClifford.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_BIKE][ePed].iColourExtra1, g_savedGlobalsClifford.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_BIKE][ePed].iColourExtra2)
// Dirt
SET_VEHICLE_DIRT_LEVEL(ReturnVeh, sVehData.fDirtLevel)
// Extras
INT iExtra
REPEAT NUMBER_OF_VEHICLE_EXTRAS iExtra
SET_VEHICLE_EXTRA(ReturnVeh, iExtra+1, (NOT g_savedGlobalsClifford.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_BIKE][ePed].bExtraOn[iExtra]))
ENDREPEAT
IF g_savedGlobalsClifford.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_BIKE][ePed].bConvertible
SET_CONVERTIBLE_ROOF(ReturnVeh, g_savedGlobalsClifford.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_BIKE][ePed].bConvertible)
ENDIF
// 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(ReturnVeh, tlPlateText)
SET_VEHICLE_NUMBER_PLATE_TEXT_INDEX(ReturnVeh, iPlateBack)
ELSE
SET_VEHICLE_NUMBER_PLATE_TEXT(ReturnVeh, g_savedGlobalsClifford.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_BIKE][ePed].tlNumberPlate)
IF g_savedGlobalsClifford.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_BIKE][ePed].iPlateBack >= 0
AND g_savedGlobalsClifford.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_BIKE][ePed].iPlateBack < GET_NUMBER_OF_VEHICLE_NUMBER_PLATES()
SET_VEHICLE_NUMBER_PLATE_TEXT_INDEX(ReturnVeh, g_savedGlobalsClifford.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_BIKE][ePed].iPlateBack)
ENDIF
ENDIF
// Tyres
SET_VEHICLE_TYRE_SMOKE_COLOR(ReturnVeh, g_savedGlobalsClifford.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_BIKE][ePed].iTyreR, g_savedGlobalsClifford.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_BIKE][ePed].iTyreG, g_savedGlobalsClifford.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_BIKE][ePed].iTyreB)
SET_VEHICLE_TYRES_CAN_BURST(ReturnVeh, g_savedGlobalsClifford.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_BIKE][ePed].bTyresCanBurst)
// Window tint
SET_VEHICLE_WINDOW_TINT(ReturnVeh, g_savedGlobalsClifford.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_BIKE][ePed].iWindowTintColour)
// Livery
IF GET_VEHICLE_LIVERY_COUNT(ReturnVeh) > 1
AND g_savedGlobalsClifford.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_BIKE][ePed].iLivery >= 0
SET_VEHICLE_LIVERY(ReturnVeh, g_savedGlobalsClifford.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_BIKE][ePed].iLivery)
ENDIF
// Wheels
IF g_savedGlobalsClifford.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_BIKE][ePed].iWheelType > -1
IF NOT IS_THIS_MODEL_A_BICYCLE(GET_ENTITY_MODEL(ReturnVeh))
IF IS_THIS_MODEL_A_BIKE(GET_ENTITY_MODEL(ReturnVeh))
IF (INT_TO_ENUM(MOD_WHEEL_TYPE, g_savedGlobalsClifford.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_BIKE][ePed].iWheelType) = MWT_BIKE)
SET_VEHICLE_WHEEL_TYPE(ReturnVeh, INT_TO_ENUM(MOD_WHEEL_TYPE, g_savedGlobalsClifford.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_BIKE][ePed].iWheelType))
ENDIF
ELSE
SET_VEHICLE_WHEEL_TYPE(ReturnVeh, INT_TO_ENUM(MOD_WHEEL_TYPE, g_savedGlobalsClifford.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_BIKE][ePed].iWheelType))
ENDIF
ENDIF
ENDIF
// Mods
SET_VEHICLE_MOD_DATA(ReturnVeh, g_savedGlobalsClifford.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_BIKE][ePed].iModIndex, g_savedGlobalsClifford.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_BIKE][ePed].iModVariation)
// Env Eff
SET_VEHICLE_ENVEFF_SCALE(ReturnVeh, sVehData.fEnvEff)
// Attach Mr Raspberry Jam to Trevors truck
IF ePed = CHAR_TREVOR
IF GET_ENTITY_MODEL(ReturnVeh) = BODHI2
TURN_ON_MR_RASPBERRY_JAM(ReturnVeh)
ENDIF
ENDIF
IF bCleanupModel
SET_MODEL_AS_NO_LONGER_NEEDED(g_savedGlobalsClifford.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_BIKE][ePed].model)
ENDIF
STORE_TEMP_PLAYER_VEHICLE_ID(ReturnVeh, ePed)
RETURN TRUE
ENDIF
// Just use default vehicle data.
ELSE
REQUEST_MODEL(sVehData.model)
IF HAS_MODEL_LOADED(sVehData.model)
BOOL bPlayerVehicle = TRUE
PRINTLN(GET_THIS_SCRIPT_NAME(), ": CREATE_PLAYER_VEHICLE() Using default data")
ReturnVeh = CREATE_VEHICLE(sVehData.model, vCoords, fHeading)
SET_VEHICLE_ON_GROUND_PROPERLY(ReturnVeh)
SET_VEHICLE_NOT_STEALABLE_AMBIENTLY(ReturnVeh, FALSE)
SET_VEHICLE_CAN_SAVE_IN_GARAGE(ReturnVeh, FALSE)
SET_VEHICLE_HAS_STRONG_AXLES(ReturnVeh, TRUE)
// Keep track of initial plate text in case we need to use it
TEXT_LABEL_15 sInitialPlateText
sInitialPlateText = GET_VEHICLE_NUMBER_PLATE_TEXT(ReturnVeh)
// Bug 492963 - Increase vehicle health by 250 (each part)
//SET_ENTITY_MAX_HEALTH(ReturnVeh, 1250)
SET_ENTITY_HEALTH(ReturnVeh, 1250)
SET_VEHICLE_ENGINE_HEALTH(ReturnVeh, 1250)
SET_VEHICLE_PETROL_TANK_HEALTH(ReturnVeh, 1250)
sVehData.fHealth = 1250
// Colours
SET_VEHICLE_COLOURS(ReturnVeh, sVehData.iColour1, sVehData.iColour2)
SET_VEHICLE_EXTRA_COLOURS(ReturnVeh, sVehData.iColourExtra1, sVehData.iColourExtra2)
// Dirt
SET_VEHICLE_DIRT_LEVEL(ReturnVeh, sVehData.fDirtLevel)
// Extras
INT iExtra
REPEAT NUMBER_OF_VEHICLE_EXTRAS iExtra
SET_VEHICLE_EXTRA(ReturnVeh, iExtra+1, (NOT sVehData.bExtraOn[iExtra]))
ENDREPEAT
IF sVehData.bConvertible
SET_CONVERTIBLE_ROOF(ReturnVeh, sVehData.bConvertible)
ENDIF
// 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(ReturnVeh, tlPlateText)
SET_VEHICLE_NUMBER_PLATE_TEXT_INDEX(ReturnVeh, iPlateBack)
ELSE
SET_VEHICLE_NUMBER_PLATE_TEXT(ReturnVeh, sVehData.tlNumberPlate)
IF sVehData.iPlateBack >= 0
AND sVehData.iPlateBack < GET_NUMBER_OF_VEHICLE_NUMBER_PLATES()
SET_VEHICLE_NUMBER_PLATE_TEXT_INDEX(ReturnVeh, sVehData.iPlateBack)
ENDIF
ENDIF
// Tyres
SET_VEHICLE_TYRE_SMOKE_COLOR(ReturnVeh, sVehData.iTyreR, sVehData.iTyreG, sVehData.iTyreB)
SET_VEHICLE_TYRES_CAN_BURST(ReturnVeh, sVehData.bTyresCanBurst)
// Window tint
SET_VEHICLE_WINDOW_TINT(ReturnVeh, sVehData.iWindowTintColour)
// Livery
IF GET_VEHICLE_LIVERY_COUNT(ReturnVeh) > 1
AND sVehData.iLivery >= 0
SET_VEHICLE_LIVERY(ReturnVeh, sVehData.iLivery)
ENDIF
// Wheels
IF sVehData.iWheelType > -1
IF NOT IS_THIS_MODEL_A_BICYCLE(GET_ENTITY_MODEL(ReturnVeh))
IF IS_THIS_MODEL_A_BIKE(GET_ENTITY_MODEL(ReturnVeh))
IF (INT_TO_ENUM(MOD_WHEEL_TYPE, sVehData.iWheelType) = MWT_BIKE)
SET_VEHICLE_WHEEL_TYPE(ReturnVeh, INT_TO_ENUM(MOD_WHEEL_TYPE, sVehData.iWheelType))
ENDIF
ELSE
SET_VEHICLE_WHEEL_TYPE(ReturnVeh, INT_TO_ENUM(MOD_WHEEL_TYPE, sVehData.iWheelType))
ENDIF
ENDIF
ENDIF
// Mods
SET_VEHICLE_MOD_DATA(ReturnVeh, sVehData.iModIndex, sVehData.iModVariation)
// Env Eff
SET_VEHICLE_ENVEFF_SCALE(ReturnVeh, sVehData.fEnvEff)
//////////////////////
/// Flow checks
// Use random number plate for bagger bike if it is not unlocked yet
IF ePed = CHAR_FRANKLIN
IF GET_ENTITY_MODEL(ReturnVeh) = BAGGER
SET_VEHICLE_NUMBER_PLATE_TEXT(ReturnVeh, sInitialPlateText)
bPlayerVehicle = FALSE
ENDIF
// Attach Mr Raspberry Jam to Trevors truck
ELIF ePed = CHAR_TREVOR
IF GET_ENTITY_MODEL(ReturnVeh) = BODHI2
TURN_ON_MR_RASPBERRY_JAM(ReturnVeh)
ENDIF
// Create Michaels car with the Jimmy mods.
ELIF ePed = CHAR_MICHAEL
AND NOT g_savedGlobalsClifford.sPlayerData.sInfo.bJimmyModsSetOnMichaelsCar
AND GET_ENTITY_MODEL(ReturnVeh) = TAILGATER
PRINTLN(GET_THIS_SCRIPT_NAME(), ": CREATE_PLAYER_VEHICLE() Setting Jimmy mods")
SET_VEHICLE_MOD(ReturnVeh, MOD_GRILL, 1) // Chrome Grille
SET_VEHICLE_MOD(ReturnVeh, MOD_HORN, 7) // Musical Horn 5
SET_VEHICLE_MOD(ReturnVeh, MOD_ENGINE, 2) // EMS Upgrade, Level 3
SET_VEHICLE_MOD(ReturnVeh, MOD_BUMPER_R, 3) // EMS Upgrade, Level 3painted Bumper & Diffuser
SET_VEHICLE_MOD(ReturnVeh, MOD_BONNET, 5) // Double Vented Hood
SET_VEHICLE_MOD(ReturnVeh, MOD_SPOILER, 0) // Lip Spoiler
SET_VEHICLE_MOD(ReturnVeh, MOD_SKIRT, 3) // Custom Skirts 4
SET_VEHICLE_MOD(ReturnVeh, MOD_GEARBOX, 1) // Sports Transmission
SET_VEHICLE_MOD(ReturnVeh, MOD_EXHAUST, 3) // Dual Exit Exhaust
SET_VEHICLE_MOD(ReturnVeh, MOD_BRAKES, 2) // Race Brakes
TOGGLE_VEHICLE_MOD(ReturnVeh, MOD_TOGGLE_XENON_LIGHTS, TRUE) // Xenon Lights
SET_VEHICLE_WHEEL_TYPE(ReturnVeh, MWT_LOWRIDER)
SET_VEHICLE_MOD(ReturnVeh, MOD_WHEELS, 11) // Dollar Wheels
SET_VEHICLE_WINDOW_TINT(ReturnVeh, 2) // Dark Smoke
g_savedGlobalsClifford.sPlayerData.sInfo.bJimmyModsSetOnMichaelsCar = TRUE
// Need to save this!
UPDATE_PLAYER_PED_SAVED_VEHICLE(ePed, ReturnVeh, SAVED_VEHICLE_SLOT_CAR, TRUE)
ENDIF
IF bCleanupModel
SET_MODEL_AS_NO_LONGER_NEEDED(sVehData.model)
ENDIF
#IF IS_DEBUG_BUILD
// CarApp debug
IF g_bDebugLosSantosCustomsPlayedStatusOverride
// Do not use if the vehicle has not been unlocked by the player
IF sVehData.model != BAGGER
PRINTLN(GET_THIS_SCRIPT_NAME(), ": CREATE_PLAYER_VEHICLE() Setting debug app mods")
SET_VEHICLE_NUMBER_PLATE_TEXT(ReturnVeh, "APPDEBUG")
IF GET_NUM_MOD_KITS(ReturnVeh) > 0
SET_VEHICLE_MOD_KIT(ReturnVeh, 0)
TOGGLE_VEHICLE_MOD(ReturnVeh, MOD_TOGGLE_TURBO, TRUE)
TOGGLE_VEHICLE_MOD(ReturnVeh, MOD_TOGGLE_SUBWOOFER, TRUE)
TOGGLE_VEHICLE_MOD(ReturnVeh, MOD_TOGGLE_TYRE_SMOKE, TRUE)
SET_VEHICLE_TYRE_SMOKE_COLOR(ReturnVeh, 255, 255, 255)
SET_VEHICLE_WINDOW_TINT(ReturnVeh, 0)
IF GET_NUM_VEHICLE_MODS(ReturnVeh, MOD_ARMOUR) >= 1
SET_VEHICLE_MOD(ReturnVeh, MOD_ARMOUR, 0)
ENDIF
IF GET_NUM_VEHICLE_MODS(ReturnVeh, MOD_SPOILER) >= 1
SET_VEHICLE_MOD(ReturnVeh, MOD_SPOILER, 0)
ENDIF
IF GET_NUM_VEHICLE_MODS(ReturnVeh, MOD_SKIRT) >= 1
SET_VEHICLE_MOD(ReturnVeh, MOD_SKIRT, 0)
ENDIF
IF GET_NUM_VEHICLE_MODS(ReturnVeh, MOD_BONNET) >= 1
SET_VEHICLE_MOD(ReturnVeh, MOD_BONNET, 0)
ENDIF
IF GET_NUM_VEHICLE_MODS(ReturnVeh, MOD_GRILL) >= 1
SET_VEHICLE_MOD(ReturnVeh, MOD_BONNET, 0)
ENDIF
ENDIF
ENDIF
ENDIF
#ENDIF
IF bPlayerVehicle
STORE_TEMP_PLAYER_VEHICLE_ID(ReturnVeh, ePed)
ENDIF
RETURN TRUE
ENDIF
ENDIF
ELSE
#IF IS_DEBUG_BUILD
PRINTSTRING("\n")
PRINTSTRING(GET_THIS_SCRIPT_NAME())
PRINTSTRING(": CREATE_PLAYER_VEHICLE - Ped is not a player character.")
PRINTNL()
SCRIPT_ASSERT("CREATE_PLAYER_VEHICLE - Ped is not a player character.")
#ENDIF
ENDIF
RETURN FALSE
ENDFUNC
#endif
#if USE_NRM_DLC
FUNC BOOL CREATE_PLAYER_VEHICLENRM(VEHICLE_INDEX &ReturnVeh, enumCharacterList ePed, VECTOR vCoords, FLOAT fHeading, BOOL bCleanupModel = TRUE, VEHICLE_CREATE_TYPE_ENUM eTypePreference = VEHICLE_TYPE_DEFAULT)
IF IS_PLAYER_PED_PLAYABLE(ePed)
// Grab the vehicle data for the specified ped
INT iPlateBack
TEXT_LABEL_15 tlPlateText
PED_VEH_DATA_STRUCT sVehData
GET_PLAYER_VEH_DATA(ePed, sVehData, eTypePreference)
IF sVehData.model = DUMMY_MODEL_FOR_SCRIPT
// Bail out so we don't get stuck.
// Scripts should be checking if the vehicle is driveable anyway.
RETURN TRUE
ENDIF
IF DOES_ENTITY_EXIST(ReturnVeh)
IF GET_ENTITY_MODEL(ReturnVeh) != sVehData.model
#IF IS_DEBUG_BUILD
SCRIPT_ASSERT("CREATE_PLAYER_VEHICLE - Vehicle ID already exists with different model")
#ENDIF
ENDIF
RETURN TRUE
ENDIF
// Clear the save data for Michaels car when he gets it back from Jimmy.
IF ePed = CHAR_MICHAEL
AND NOT g_savedGlobalsnorman.sPlayerData.sInfo.bJimmyModsSetOnMichaelsCar
g_savedGlobalsnorman.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_CAR][ePed].model = DUMMY_MODEL_FOR_SCRIPT
// we set the mods down below...
ENDIF
// Create the stored CAR vehicle if it has the same model.
IF g_savedGlobalsnorman.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_CAR][ePed].model = sVehData.model
REQUEST_MODEL(g_savedGlobalsnorman.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_CAR][ePed].model)
IF HAS_MODEL_LOADED(g_savedGlobalsnorman.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_CAR][ePed].model)
PRINTLN(GET_THIS_SCRIPT_NAME(), ": CREATE_PLAYER_VEHICLE() Using stored car data for ped ", ePed)
ReturnVeh = CREATE_VEHICLE(g_savedGlobalsnorman.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_CAR][ePed].model, vCoords, fHeading, FALSE, FALSE)
SET_VEHICLE_ON_GROUND_PROPERLY(ReturnVeh)
SET_VEHICLE_NOT_STEALABLE_AMBIENTLY(ReturnVeh, FALSE)
SET_VEHICLE_CAN_SAVE_IN_GARAGE(ReturnVeh, FALSE)
SET_VEHICLE_HAS_STRONG_AXLES(ReturnVeh, TRUE)
// Bug 492963 - Increase vehicle health by 250 (each part)
//SET_ENTITY_MAX_HEALTH(ReturnVeh, 1250)
SET_ENTITY_HEALTH(ReturnVeh, 1250)
SET_VEHICLE_ENGINE_HEALTH(ReturnVeh, 1250)
SET_VEHICLE_PETROL_TANK_HEALTH(ReturnVeh, 1250)
sVehData.fHealth = 1250
// Colours
SET_VEHICLE_COLOURS(ReturnVeh, g_savedGlobalsnorman.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_CAR][ePed].iColour1, g_savedGlobalsnorman.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_CAR][ePed].iColour2)
SET_VEHICLE_EXTRA_COLOURS(ReturnVeh, g_savedGlobalsnorman.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_CAR][ePed].iColourExtra1, g_savedGlobalsnorman.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_CAR][ePed].iColourExtra2)
// Dirt
SET_VEHICLE_DIRT_LEVEL(ReturnVeh, sVehData.fDirtLevel)
// Extras
INT iExtra
REPEAT NUMBER_OF_VEHICLE_EXTRAS iExtra
SET_VEHICLE_EXTRA(ReturnVeh, iExtra+1, (NOT g_savedGlobalsnorman.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_CAR][ePed].bExtraOn[iExtra]))
ENDREPEAT
IF g_savedGlobalsnorman.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_CAR][ePed].bConvertible
SET_CONVERTIBLE_ROOF(ReturnVeh, g_savedGlobalsnorman.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_CAR][ePed].bConvertible)
ENDIF
// 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(ReturnVeh, tlPlateText)
SET_VEHICLE_NUMBER_PLATE_TEXT_INDEX(ReturnVeh, iPlateBack)
ELSE
SET_VEHICLE_NUMBER_PLATE_TEXT(ReturnVeh, g_savedGlobalsnorman.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_CAR][ePed].tlNumberPlate)
IF g_savedGlobalsnorman.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_CAR][ePed].iPlateBack >= 0
AND g_savedGlobalsnorman.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_CAR][ePed].iPlateBack < GET_NUMBER_OF_VEHICLE_NUMBER_PLATES()
SET_VEHICLE_NUMBER_PLATE_TEXT_INDEX(ReturnVeh, g_savedGlobalsnorman.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_CAR][ePed].iPlateBack)
ENDIF
ENDIF
// Tyres
SET_VEHICLE_TYRE_SMOKE_COLOR(ReturnVeh, g_savedGlobalsnorman.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_CAR][ePed].iTyreR, g_savedGlobalsnorman.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_CAR][ePed].iTyreG, g_savedGlobalsnorman.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_CAR][ePed].iTyreB)
SET_VEHICLE_TYRES_CAN_BURST(ReturnVeh, g_savedGlobalsnorman.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_CAR][ePed].bTyresCanBurst)
// Window tint
SET_VEHICLE_WINDOW_TINT(ReturnVeh, g_savedGlobalsnorman.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_CAR][ePed].iWindowTintColour)
// Livery
IF GET_VEHICLE_LIVERY_COUNT(ReturnVeh) > 1
AND g_savedGlobalsnorman.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_CAR][ePed].iLivery >= 0
SET_VEHICLE_LIVERY(ReturnVeh, g_savedGlobalsnorman.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_CAR][ePed].iLivery)
ENDIF
// Wheels
IF g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_CAR][ePed].iWheelType > -1
IF NOT IS_THIS_MODEL_A_BICYCLE(GET_ENTITY_MODEL(ReturnVeh))
IF IS_THIS_MODEL_A_BIKE(GET_ENTITY_MODEL(ReturnVeh))
IF (INT_TO_ENUM(MOD_WHEEL_TYPE, g_savedGlobalsnorman.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_CAR][ePed].iWheelType) = MWT_BIKE)
SET_VEHICLE_WHEEL_TYPE(ReturnVeh, INT_TO_ENUM(MOD_WHEEL_TYPE, g_savedGlobalsnorman.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_CAR][ePed].iWheelType))
ENDIF
ELSE
SET_VEHICLE_WHEEL_TYPE(ReturnVeh, INT_TO_ENUM(MOD_WHEEL_TYPE, g_savedGlobalsnorman.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_CAR][ePed].iWheelType))
ENDIF
ENDIF
ENDIF
// Mods
SET_VEHICLE_MOD_DATA(ReturnVeh, g_savedGlobalsnorman.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_CAR][ePed].iModIndex, g_savedGlobalsnorman.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_CAR][ePed].iModVariation)
// Env Eff
SET_VEHICLE_ENVEFF_SCALE(ReturnVeh, sVehData.fEnvEff)
// Attach Mr Raspberry Jam to Trevors truck
IF ePed = CHAR_TREVOR
IF GET_ENTITY_MODEL(ReturnVeh) = BODHI2
TURN_ON_MR_RASPBERRY_JAM(ReturnVeh)
ENDIF
ENDIF
IF bCleanupModel
SET_MODEL_AS_NO_LONGER_NEEDED(g_savedGlobalsnorman.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_CAR][ePed].model)
ENDIF
STORE_TEMP_PLAYER_VEHICLE_ID(ReturnVeh, ePed)
RETURN TRUE
ENDIF
// Create the stored BIKE vehicle if it has the same model.
ELIF g_savedGlobalsnorman.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_BIKE][ePed].model = sVehData.model
REQUEST_MODEL(g_savedGlobalsnorman.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_BIKE][ePed].model)
IF HAS_MODEL_LOADED(g_savedGlobalsnorman.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_BIKE][ePed].model)
PRINTLN(GET_THIS_SCRIPT_NAME(), ": CREATE_PLAYER_VEHICLE() Using stored bike data")
ReturnVeh = CREATE_VEHICLE(g_savedGlobalsnorman.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_BIKE][ePed].model, vCoords, fHeading, FALSE, FALSE)
SET_VEHICLE_ON_GROUND_PROPERLY(ReturnVeh)
SET_VEHICLE_NOT_STEALABLE_AMBIENTLY(ReturnVeh, FALSE)
SET_VEHICLE_CAN_SAVE_IN_GARAGE(ReturnVeh, FALSE)
SET_VEHICLE_HAS_STRONG_AXLES(ReturnVeh, TRUE)
// Bug 492963 - Increase vehicle health by 250 (each part)
//SET_ENTITY_MAX_HEALTH(ReturnVeh, 1250)
SET_ENTITY_HEALTH(ReturnVeh, 1250)
SET_VEHICLE_ENGINE_HEALTH(ReturnVeh, 1250)
SET_VEHICLE_PETROL_TANK_HEALTH(ReturnVeh, 1250)
sVehData.fHealth = 1250
// Colours
SET_VEHICLE_COLOURS(ReturnVeh, g_savedGlobalsnorman.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_BIKE][ePed].iColour1, g_savedGlobalsnorman.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_BIKE][ePed].iColour2)
SET_VEHICLE_EXTRA_COLOURS(ReturnVeh, g_savedGlobalsnorman.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_BIKE][ePed].iColourExtra1, g_savedGlobalsnorman.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_BIKE][ePed].iColourExtra2)
// Dirt
SET_VEHICLE_DIRT_LEVEL(ReturnVeh, sVehData.fDirtLevel)
// Extras
INT iExtra
REPEAT NUMBER_OF_VEHICLE_EXTRAS iExtra
SET_VEHICLE_EXTRA(ReturnVeh, iExtra+1, (NOT g_savedGlobalsnorman.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_BIKE][ePed].bExtraOn[iExtra]))
ENDREPEAT
IF g_savedGlobalsnorman.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_BIKE][ePed].bConvertible
SET_CONVERTIBLE_ROOF(ReturnVeh, g_savedGlobalsnorman.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_BIKE][ePed].bConvertible)
ENDIF
// 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(ReturnVeh, tlPlateText)
SET_VEHICLE_NUMBER_PLATE_TEXT_INDEX(ReturnVeh, iPlateBack)
ELSE
SET_VEHICLE_NUMBER_PLATE_TEXT(ReturnVeh, g_savedGlobalsnorman.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_BIKE][ePed].tlNumberPlate)
IF g_savedGlobalsnorman.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_BIKE][ePed].iPlateBack >= 0
AND g_savedGlobalsnorman.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_BIKE][ePed].iPlateBack < GET_NUMBER_OF_VEHICLE_NUMBER_PLATES()
SET_VEHICLE_NUMBER_PLATE_TEXT_INDEX(ReturnVeh, g_savedGlobalsnorman.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_BIKE][ePed].iPlateBack)
ENDIF
ENDIF
// Tyres
SET_VEHICLE_TYRE_SMOKE_COLOR(ReturnVeh, g_savedGlobalsnorman.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_BIKE][ePed].iTyreR, g_savedGlobalsnorman.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_BIKE][ePed].iTyreG, g_savedGlobalsnorman.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_BIKE][ePed].iTyreB)
SET_VEHICLE_TYRES_CAN_BURST(ReturnVeh, g_savedGlobalsnorman.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_BIKE][ePed].bTyresCanBurst)
// Window tint
SET_VEHICLE_WINDOW_TINT(ReturnVeh, g_savedGlobalsnorman.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_BIKE][ePed].iWindowTintColour)
// Livery
IF GET_VEHICLE_LIVERY_COUNT(ReturnVeh) > 1
AND g_savedGlobalsnorman.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_BIKE][ePed].iLivery >= 0
SET_VEHICLE_LIVERY(ReturnVeh, g_savedGlobalsnorman.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_BIKE][ePed].iLivery)
ENDIF
// Wheels
IF g_savedGlobalsnorman.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_BIKE][ePed].iWheelType > -1
IF NOT IS_THIS_MODEL_A_BICYCLE(GET_ENTITY_MODEL(ReturnVeh))
IF IS_THIS_MODEL_A_BIKE(GET_ENTITY_MODEL(ReturnVeh))
IF (INT_TO_ENUM(MOD_WHEEL_TYPE, g_savedGlobalsnorman.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_BIKE][ePed].iWheelType) = MWT_BIKE)
SET_VEHICLE_WHEEL_TYPE(ReturnVeh, INT_TO_ENUM(MOD_WHEEL_TYPE, g_savedGlobalsnorman.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_BIKE][ePed].iWheelType))
ENDIF
ELSE
SET_VEHICLE_WHEEL_TYPE(ReturnVeh, INT_TO_ENUM(MOD_WHEEL_TYPE, g_savedGlobalsnorman.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_BIKE][ePed].iWheelType))
ENDIF
ENDIF
ENDIF
// Mods
SET_VEHICLE_MOD_DATA(ReturnVeh, g_savedGlobalsnorman.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_BIKE][ePed].iModIndex, g_savedGlobalsnorman.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_BIKE][ePed].iModVariation)
// Env Eff
SET_VEHICLE_ENVEFF_SCALE(ReturnVeh, sVehData.fEnvEff)
// Attach Mr Raspberry Jam to Trevors truck
IF ePed = CHAR_TREVOR
IF GET_ENTITY_MODEL(ReturnVeh) = BODHI2
TURN_ON_MR_RASPBERRY_JAM(ReturnVeh)
ENDIF
ENDIF
IF bCleanupModel
SET_MODEL_AS_NO_LONGER_NEEDED(g_savedGlobalsnorman.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_BIKE][ePed].model)
ENDIF
STORE_TEMP_PLAYER_VEHICLE_ID(ReturnVeh, ePed)
RETURN TRUE
ENDIF
// Just use default vehicle data.
ELSE
REQUEST_MODEL(sVehData.model)
IF HAS_MODEL_LOADED(sVehData.model)
BOOL bPlayerVehicle = TRUE
PRINTLN(GET_THIS_SCRIPT_NAME(), ": CREATE_PLAYER_VEHICLE() Using default data")
ReturnVeh = CREATE_VEHICLE(sVehData.model, vCoords, fHeading)
SET_VEHICLE_ON_GROUND_PROPERLY(ReturnVeh)
SET_VEHICLE_NOT_STEALABLE_AMBIENTLY(ReturnVeh, FALSE)
SET_VEHICLE_CAN_SAVE_IN_GARAGE(ReturnVeh, FALSE)
SET_VEHICLE_HAS_STRONG_AXLES(ReturnVeh, TRUE)
// Keep track of initial plate text in case we need to use it
TEXT_LABEL_15 sInitialPlateText
sInitialPlateText = GET_VEHICLE_NUMBER_PLATE_TEXT(ReturnVeh)
// Bug 492963 - Increase vehicle health by 250 (each part)
//SET_ENTITY_MAX_HEALTH(ReturnVeh, 1250)
SET_ENTITY_HEALTH(ReturnVeh, 1250)
SET_VEHICLE_ENGINE_HEALTH(ReturnVeh, 1250)
SET_VEHICLE_PETROL_TANK_HEALTH(ReturnVeh, 1250)
sVehData.fHealth = 1250
// Colours
SET_VEHICLE_COLOURS(ReturnVeh, sVehData.iColour1, sVehData.iColour2)
SET_VEHICLE_EXTRA_COLOURS(ReturnVeh, sVehData.iColourExtra1, sVehData.iColourExtra2)
// Dirt
SET_VEHICLE_DIRT_LEVEL(ReturnVeh, sVehData.fDirtLevel)
// Extras
INT iExtra
REPEAT NUMBER_OF_VEHICLE_EXTRAS iExtra
SET_VEHICLE_EXTRA(ReturnVeh, iExtra+1, (NOT sVehData.bExtraOn[iExtra]))
ENDREPEAT
IF sVehData.bConvertible
SET_CONVERTIBLE_ROOF(ReturnVeh, sVehData.bConvertible)
ENDIF
// 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(ReturnVeh, tlPlateText)
SET_VEHICLE_NUMBER_PLATE_TEXT_INDEX(ReturnVeh, iPlateBack)
ELSE
SET_VEHICLE_NUMBER_PLATE_TEXT(ReturnVeh, sVehData.tlNumberPlate)
IF sVehData.iPlateBack >= 0
AND sVehData.iPlateBack < GET_NUMBER_OF_VEHICLE_NUMBER_PLATES()
SET_VEHICLE_NUMBER_PLATE_TEXT_INDEX(ReturnVeh, sVehData.iPlateBack)
ENDIF
ENDIF
// Tyres
SET_VEHICLE_TYRE_SMOKE_COLOR(ReturnVeh, sVehData.iTyreR, sVehData.iTyreG, sVehData.iTyreB)
SET_VEHICLE_TYRES_CAN_BURST(ReturnVeh, sVehData.bTyresCanBurst)
// Window tint
SET_VEHICLE_WINDOW_TINT(ReturnVeh, sVehData.iWindowTintColour)
// Livery
IF GET_VEHICLE_LIVERY_COUNT(ReturnVeh) > 1
AND sVehData.iLivery >= 0
SET_VEHICLE_LIVERY(ReturnVeh, sVehData.iLivery)
ENDIF
// Wheels
IF sVehData.iWheelType > -1
IF NOT IS_THIS_MODEL_A_BICYCLE(GET_ENTITY_MODEL(ReturnVeh))
IF IS_THIS_MODEL_A_BIKE(GET_ENTITY_MODEL(ReturnVeh))
IF (INT_TO_ENUM(MOD_WHEEL_TYPE, sVehData.iWheelType) = MWT_BIKE)
SET_VEHICLE_WHEEL_TYPE(ReturnVeh, INT_TO_ENUM(MOD_WHEEL_TYPE, sVehData.iWheelType))
ENDIF
ELSE
SET_VEHICLE_WHEEL_TYPE(ReturnVeh, INT_TO_ENUM(MOD_WHEEL_TYPE, sVehData.iWheelType))
ENDIF
ENDIF
ENDIF
// Mods
SET_VEHICLE_MOD_DATA(ReturnVeh, sVehData.iModIndex, sVehData.iModVariation)
// Env Eff
SET_VEHICLE_ENVEFF_SCALE(ReturnVeh, sVehData.fEnvEff)
//////////////////////
/// Flow checks
// Use random number plate for bagger bike if it is not unlocked yet
IF ePed = CHAR_FRANKLIN
IF GET_ENTITY_MODEL(ReturnVeh) = BAGGER
SET_VEHICLE_NUMBER_PLATE_TEXT(ReturnVeh, sInitialPlateText)
bPlayerVehicle = FALSE
ENDIF
// Attach Mr Raspberry Jam to Trevors truck
ELIF ePed = CHAR_TREVOR
IF GET_ENTITY_MODEL(ReturnVeh) = BODHI2
TURN_ON_MR_RASPBERRY_JAM(ReturnVeh)
ENDIF
// Create Michaels car with the Jimmy mods.
ELIF ePed = CHAR_MICHAEL
AND NOT g_savedGlobalsnorman.sPlayerData.sInfo.bJimmyModsSetOnMichaelsCar
AND GET_ENTITY_MODEL(ReturnVeh) = TAILGATER
PRINTLN(GET_THIS_SCRIPT_NAME(), ": CREATE_PLAYER_VEHICLE() Setting Jimmy mods")
SET_VEHICLE_MOD(ReturnVeh, MOD_GRILL, 1) // Chrome Grille
SET_VEHICLE_MOD(ReturnVeh, MOD_HORN, 7) // Musical Horn 5
SET_VEHICLE_MOD(ReturnVeh, MOD_ENGINE, 2) // EMS Upgrade, Level 3
SET_VEHICLE_MOD(ReturnVeh, MOD_BUMPER_R, 3) // EMS Upgrade, Level 3painted Bumper & Diffuser
SET_VEHICLE_MOD(ReturnVeh, MOD_BONNET, 5) // Double Vented Hood
SET_VEHICLE_MOD(ReturnVeh, MOD_SPOILER, 0) // Lip Spoiler
SET_VEHICLE_MOD(ReturnVeh, MOD_SKIRT, 3) // Custom Skirts 4
SET_VEHICLE_MOD(ReturnVeh, MOD_GEARBOX, 1) // Sports Transmission
SET_VEHICLE_MOD(ReturnVeh, MOD_EXHAUST, 3) // Dual Exit Exhaust
SET_VEHICLE_MOD(ReturnVeh, MOD_BRAKES, 2) // Race Brakes
TOGGLE_VEHICLE_MOD(ReturnVeh, MOD_TOGGLE_XENON_LIGHTS, TRUE) // Xenon Lights
SET_VEHICLE_WHEEL_TYPE(ReturnVeh, MWT_LOWRIDER)
SET_VEHICLE_MOD(ReturnVeh, MOD_WHEELS, 11) // Dollar Wheels
SET_VEHICLE_WINDOW_TINT(ReturnVeh, 2) // Dark Smoke
g_savedGlobalsnorman.sPlayerData.sInfo.bJimmyModsSetOnMichaelsCar = TRUE
// Need to save this!
UPDATE_PLAYER_PED_SAVED_VEHICLE(ePed, ReturnVeh, SAVED_VEHICLE_SLOT_CAR, TRUE)
ENDIF
IF bCleanupModel
SET_MODEL_AS_NO_LONGER_NEEDED(sVehData.model)
ENDIF
#IF IS_DEBUG_BUILD
// CarApp debug
IF g_bDebugLosSantosCustomsPlayedStatusOverride
// Do not use if the vehicle has not been unlocked by the player
IF sVehData.model != BAGGER
PRINTLN(GET_THIS_SCRIPT_NAME(), ": CREATE_PLAYER_VEHICLE() Setting debug app mods")
SET_VEHICLE_NUMBER_PLATE_TEXT(ReturnVeh, "APPDEBUG")
IF GET_NUM_MOD_KITS(ReturnVeh) > 0
SET_VEHICLE_MOD_KIT(ReturnVeh, 0)
TOGGLE_VEHICLE_MOD(ReturnVeh, MOD_TOGGLE_TURBO, TRUE)
TOGGLE_VEHICLE_MOD(ReturnVeh, MOD_TOGGLE_SUBWOOFER, TRUE)
TOGGLE_VEHICLE_MOD(ReturnVeh, MOD_TOGGLE_TYRE_SMOKE, TRUE)
SET_VEHICLE_TYRE_SMOKE_COLOR(ReturnVeh, 255, 255, 255)
SET_VEHICLE_WINDOW_TINT(ReturnVeh, 0)
IF GET_NUM_VEHICLE_MODS(ReturnVeh, MOD_ARMOUR) >= 1
SET_VEHICLE_MOD(ReturnVeh, MOD_ARMOUR, 0)
ENDIF
IF GET_NUM_VEHICLE_MODS(ReturnVeh, MOD_SPOILER) >= 1
SET_VEHICLE_MOD(ReturnVeh, MOD_SPOILER, 0)
ENDIF
IF GET_NUM_VEHICLE_MODS(ReturnVeh, MOD_SKIRT) >= 1
SET_VEHICLE_MOD(ReturnVeh, MOD_SKIRT, 0)
ENDIF
IF GET_NUM_VEHICLE_MODS(ReturnVeh, MOD_BONNET) >= 1
SET_VEHICLE_MOD(ReturnVeh, MOD_BONNET, 0)
ENDIF
IF GET_NUM_VEHICLE_MODS(ReturnVeh, MOD_GRILL) >= 1
SET_VEHICLE_MOD(ReturnVeh, MOD_BONNET, 0)
ENDIF
ENDIF
ENDIF
ENDIF
#ENDIF
IF bPlayerVehicle
STORE_TEMP_PLAYER_VEHICLE_ID(ReturnVeh, ePed)
ENDIF
RETURN TRUE
ENDIF
ENDIF
ELSE
#IF IS_DEBUG_BUILD
PRINTSTRING("\n")
PRINTSTRING(GET_THIS_SCRIPT_NAME())
PRINTSTRING(": CREATE_PLAYER_VEHICLE - Ped is not a player character.")
PRINTNL()
SCRIPT_ASSERT("CREATE_PLAYER_VEHICLE - Ped is not a player character.")
#ENDIF
ENDIF
RETURN FALSE
ENDFUNC
#endif
FUNC BOOL CREATE_PLAYER_VEHICLE(VEHICLE_INDEX &ReturnVeh, enumCharacterList ePed, VECTOR vCoords, FLOAT fHeading, BOOL bCleanupModel = TRUE, VEHICLE_CREATE_TYPE_ENUM eTypePreference = VEHICLE_TYPE_DEFAULT)
#if USE_CLF_DLC
return CREATE_PLAYER_VEHICLECLF(ReturnVeh,ePed,vCoords,fHeading,bCleanupModel,eTypePreference)
#endif
#if USE_NRM_DLC
return CREATE_PLAYER_VEHICLENRM(ReturnVeh,ePed,vCoords,fHeading,bCleanupModel,eTypePreference)
#endif
#if not USE_CLF_DLC
#if not USE_NRM_DLC
IF IS_PLAYER_PED_PLAYABLE(ePed)
// Grab the vehicle data for the specified ped
INT iPlateBack
TEXT_LABEL_15 tlPlateText
PED_VEH_DATA_STRUCT sVehData
GET_PLAYER_VEH_DATA(ePed, sVehData, eTypePreference)
IF sVehData.model = DUMMY_MODEL_FOR_SCRIPT
// Bail out so we don't get stuck.
// Scripts should be checking if the vehicle is driveable anyway.
RETURN TRUE
ENDIF
IF DOES_ENTITY_EXIST(ReturnVeh)
IF GET_ENTITY_MODEL(ReturnVeh) != sVehData.model
#IF IS_DEBUG_BUILD
SCRIPT_ASSERT("CREATE_PLAYER_VEHICLE - Vehicle ID already exists with different model")
#ENDIF
ENDIF
RETURN TRUE
ENDIF
// Clear the save data for Michaels car when he gets it back from Jimmy.
IF ePed = CHAR_MICHAEL
AND NOT g_savedGlobals.sPlayerData.sInfo.bJimmyModsSetOnMichaelsCar
AND (g_savedGlobals.sFlow.controls.flagIDs[FLOWFLAG_MICHAEL_TREVOR_EXILE_FINISHED])
g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_CAR][ePed].model = DUMMY_MODEL_FOR_SCRIPT
// we set the mods down below...
ENDIF
// Create the stored CAR vehicle if it has the same model.
IF g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_CAR][ePed].model = sVehData.model
REQUEST_MODEL(g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_CAR][ePed].model)
IF HAS_MODEL_LOADED(g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_CAR][ePed].model)
PRINTLN(GET_THIS_SCRIPT_NAME(), ": CREATE_PLAYER_VEHICLE() Using stored car data for ped ", ePed)
ReturnVeh = CREATE_VEHICLE(g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_CAR][ePed].model, vCoords, fHeading, FALSE, FALSE)
SET_VEHICLE_ON_GROUND_PROPERLY(ReturnVeh)
SET_VEHICLE_NOT_STEALABLE_AMBIENTLY(ReturnVeh, FALSE)
SET_VEHICLE_CAN_SAVE_IN_GARAGE(ReturnVeh, FALSE)
SET_VEHICLE_HAS_STRONG_AXLES(ReturnVeh, TRUE)
// Bug 492963 - Increase vehicle health by 250 (each part)
//SET_ENTITY_MAX_HEALTH(ReturnVeh, 1250)
SET_ENTITY_HEALTH(ReturnVeh, 1250)
SET_VEHICLE_ENGINE_HEALTH(ReturnVeh, 1250)
SET_VEHICLE_PETROL_TANK_HEALTH(ReturnVeh, 1250)
sVehData.fHealth = 1250
// Colours
SET_VEHICLE_COLOURS(ReturnVeh, g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_CAR][ePed].iColour1, g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_CAR][ePed].iColour2)
SET_VEHICLE_EXTRA_COLOURS(ReturnVeh, g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_CAR][ePed].iColourExtra1, g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_CAR][ePed].iColourExtra2)
// Dirt
SET_VEHICLE_DIRT_LEVEL(ReturnVeh, sVehData.fDirtLevel)
// Extras
INT iExtra
REPEAT NUMBER_OF_VEHICLE_EXTRAS iExtra
SET_VEHICLE_EXTRA(ReturnVeh, iExtra+1, (NOT g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_CAR][ePed].bExtraOn[iExtra]))
ENDREPEAT
IF g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_CAR][ePed].bConvertible
SET_CONVERTIBLE_ROOF(ReturnVeh, g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_CAR][ePed].bConvertible)
ENDIF
// 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(ReturnVeh, tlPlateText)
SET_VEHICLE_NUMBER_PLATE_TEXT_INDEX(ReturnVeh, iPlateBack)
ELSE
SET_VEHICLE_NUMBER_PLATE_TEXT(ReturnVeh, g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_CAR][ePed].tlNumberPlate)
IF g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_CAR][ePed].iPlateBack >= 0
AND g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_CAR][ePed].iPlateBack < GET_NUMBER_OF_VEHICLE_NUMBER_PLATES()
SET_VEHICLE_NUMBER_PLATE_TEXT_INDEX(ReturnVeh, g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_CAR][ePed].iPlateBack)
ENDIF
ENDIF
// Tyres
SET_VEHICLE_TYRE_SMOKE_COLOR(ReturnVeh, g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_CAR][ePed].iTyreR, g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_CAR][ePed].iTyreG, g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_CAR][ePed].iTyreB)
SET_VEHICLE_TYRES_CAN_BURST(ReturnVeh, g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_CAR][ePed].bTyresCanBurst)
// Window tint
SET_VEHICLE_WINDOW_TINT(ReturnVeh, g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_CAR][ePed].iWindowTintColour)
// Neon lights
SET_VEHICLE_NEON_COLOUR(ReturnVeh, g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_CAR][ePed].iNeonR, g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_CAR][ePed].iNeonG, g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_CAR][ePed].iNeonB)
SET_VEHICLE_NEON_ENABLED(ReturnVeh, NEON_FRONT, IS_BIT_SET(g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_CAR][ePed].iFlags, VEHICLE_SETUP_FLAG_NEON_FRONT))
SET_VEHICLE_NEON_ENABLED(ReturnVeh, NEON_BACK, IS_BIT_SET(g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_CAR][ePed].iFlags, VEHICLE_SETUP_FLAG_NEON_BACK))
SET_VEHICLE_NEON_ENABLED(ReturnVeh, NEON_LEFT, IS_BIT_SET(g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_CAR][ePed].iFlags, VEHICLE_SETUP_FLAG_NEON_LEFT))
SET_VEHICLE_NEON_ENABLED(ReturnVeh, NEON_RIGHT, IS_BIT_SET(g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_CAR][ePed].iFlags, VEHICLE_SETUP_FLAG_NEON_RIGHT))
// Livery
IF GET_VEHICLE_LIVERY_COUNT(ReturnVeh) > 1
AND g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_CAR][ePed].iLivery >= 0
SET_VEHICLE_LIVERY(ReturnVeh, g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_CAR][ePed].iLivery)
ENDIF
// Wheels
IF g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_CAR][ePed].iWheelType > -1
IF NOT IS_THIS_MODEL_A_BICYCLE(GET_ENTITY_MODEL(ReturnVeh))
IF IS_THIS_MODEL_A_BIKE(GET_ENTITY_MODEL(ReturnVeh))
IF (INT_TO_ENUM(MOD_WHEEL_TYPE, g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_CAR][ePed].iWheelType) = MWT_BIKE)
SET_VEHICLE_WHEEL_TYPE(ReturnVeh, INT_TO_ENUM(MOD_WHEEL_TYPE, g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_CAR][ePed].iWheelType))
ENDIF
ELSE
SET_VEHICLE_WHEEL_TYPE(ReturnVeh, INT_TO_ENUM(MOD_WHEEL_TYPE, g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_CAR][ePed].iWheelType))
ENDIF
ENDIF
ENDIF
// Mods
SET_VEHICLE_MOD_DATA(ReturnVeh, g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_CAR][ePed].iModIndex, g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_CAR][ePed].iModVariation)
// Env Eff
SET_VEHICLE_ENVEFF_SCALE(ReturnVeh, sVehData.fEnvEff)
// Attach Mr Raspberry Jam to Trevors truck
IF ePed = CHAR_TREVOR
IF GET_ENTITY_MODEL(ReturnVeh) = BODHI2
TURN_ON_MR_RASPBERRY_JAM(ReturnVeh)
ENDIF
ENDIF
IF bCleanupModel
SET_MODEL_AS_NO_LONGER_NEEDED(g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_CAR][ePed].model)
ENDIF
STORE_TEMP_PLAYER_VEHICLE_ID(ReturnVeh, ePed)
RETURN TRUE
ENDIF
// Create the stored BIKE vehicle if it has the same model.
ELIF g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_BIKE][ePed].model = sVehData.model
REQUEST_MODEL(g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_BIKE][ePed].model)
IF HAS_MODEL_LOADED(g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_BIKE][ePed].model)
PRINTLN(GET_THIS_SCRIPT_NAME(), ": CREATE_PLAYER_VEHICLE() Using stored bike data")
ReturnVeh = CREATE_VEHICLE(g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_BIKE][ePed].model, vCoords, fHeading, FALSE, FALSE)
SET_VEHICLE_ON_GROUND_PROPERLY(ReturnVeh)
SET_VEHICLE_NOT_STEALABLE_AMBIENTLY(ReturnVeh, FALSE)
SET_VEHICLE_CAN_SAVE_IN_GARAGE(ReturnVeh, FALSE)
SET_VEHICLE_HAS_STRONG_AXLES(ReturnVeh, TRUE)
// Bug 492963 - Increase vehicle health by 250 (each part)
//SET_ENTITY_MAX_HEALTH(ReturnVeh, 1250)
SET_ENTITY_HEALTH(ReturnVeh, 1250)
SET_VEHICLE_ENGINE_HEALTH(ReturnVeh, 1250)
SET_VEHICLE_PETROL_TANK_HEALTH(ReturnVeh, 1250)
sVehData.fHealth = 1250
// Colours
SET_VEHICLE_COLOURS(ReturnVeh, g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_BIKE][ePed].iColour1, g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_BIKE][ePed].iColour2)
SET_VEHICLE_EXTRA_COLOURS(ReturnVeh, g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_BIKE][ePed].iColourExtra1, g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_BIKE][ePed].iColourExtra2)
// Dirt
SET_VEHICLE_DIRT_LEVEL(ReturnVeh, sVehData.fDirtLevel)
// Extras
INT iExtra
REPEAT NUMBER_OF_VEHICLE_EXTRAS iExtra
SET_VEHICLE_EXTRA(ReturnVeh, iExtra+1, (NOT g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_BIKE][ePed].bExtraOn[iExtra]))
ENDREPEAT
IF g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_BIKE][ePed].bConvertible
SET_CONVERTIBLE_ROOF(ReturnVeh, g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_BIKE][ePed].bConvertible)
ENDIF
// 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(ReturnVeh, tlPlateText)
SET_VEHICLE_NUMBER_PLATE_TEXT_INDEX(ReturnVeh, iPlateBack)
ELSE
SET_VEHICLE_NUMBER_PLATE_TEXT(ReturnVeh, g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_BIKE][ePed].tlNumberPlate)
IF g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_BIKE][ePed].iPlateBack >= 0
AND g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_BIKE][ePed].iPlateBack < GET_NUMBER_OF_VEHICLE_NUMBER_PLATES()
SET_VEHICLE_NUMBER_PLATE_TEXT_INDEX(ReturnVeh, g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_BIKE][ePed].iPlateBack)
ENDIF
ENDIF
// Tyres
SET_VEHICLE_TYRE_SMOKE_COLOR(ReturnVeh, g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_BIKE][ePed].iTyreR, g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_BIKE][ePed].iTyreG, g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_BIKE][ePed].iTyreB)
SET_VEHICLE_TYRES_CAN_BURST(ReturnVeh, g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_BIKE][ePed].bTyresCanBurst)
// Window tint
SET_VEHICLE_WINDOW_TINT(ReturnVeh, g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_BIKE][ePed].iWindowTintColour)
// Neon lights
SET_VEHICLE_NEON_COLOUR(ReturnVeh, g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_BIKE][ePed].iNeonR, g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_BIKE][ePed].iNeonG, g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_BIKE][ePed].iNeonB)
SET_VEHICLE_NEON_ENABLED(ReturnVeh, NEON_FRONT, IS_BIT_SET(g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_BIKE][ePed].iFlags, VEHICLE_SETUP_FLAG_NEON_FRONT))
SET_VEHICLE_NEON_ENABLED(ReturnVeh, NEON_BACK, IS_BIT_SET(g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_BIKE][ePed].iFlags, VEHICLE_SETUP_FLAG_NEON_BACK))
SET_VEHICLE_NEON_ENABLED(ReturnVeh, NEON_LEFT, IS_BIT_SET(g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_BIKE][ePed].iFlags, VEHICLE_SETUP_FLAG_NEON_LEFT))
SET_VEHICLE_NEON_ENABLED(ReturnVeh, NEON_RIGHT, IS_BIT_SET(g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_BIKE][ePed].iFlags, VEHICLE_SETUP_FLAG_NEON_RIGHT))
// Livery
IF GET_VEHICLE_LIVERY_COUNT(ReturnVeh) > 1
AND g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_BIKE][ePed].iLivery >= 0
SET_VEHICLE_LIVERY(ReturnVeh, g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_BIKE][ePed].iLivery)
ENDIF
// Wheels
IF g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_BIKE][ePed].iWheelType > -1
IF NOT IS_THIS_MODEL_A_BICYCLE(GET_ENTITY_MODEL(ReturnVeh))
IF IS_THIS_MODEL_A_BIKE(GET_ENTITY_MODEL(ReturnVeh))
IF (INT_TO_ENUM(MOD_WHEEL_TYPE, g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_BIKE][ePed].iWheelType) = MWT_BIKE)
SET_VEHICLE_WHEEL_TYPE(ReturnVeh, INT_TO_ENUM(MOD_WHEEL_TYPE, g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_BIKE][ePed].iWheelType))
ENDIF
ELSE
SET_VEHICLE_WHEEL_TYPE(ReturnVeh, INT_TO_ENUM(MOD_WHEEL_TYPE, g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_BIKE][ePed].iWheelType))
ENDIF
ENDIF
ENDIF
// Mods
SET_VEHICLE_MOD_DATA(ReturnVeh, g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_BIKE][ePed].iModIndex, g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_BIKE][ePed].iModVariation)
// Env Eff
SET_VEHICLE_ENVEFF_SCALE(ReturnVeh, sVehData.fEnvEff)
// Attach Mr Raspberry Jam to Trevors truck
IF ePed = CHAR_TREVOR
IF GET_ENTITY_MODEL(ReturnVeh) = BODHI2
TURN_ON_MR_RASPBERRY_JAM(ReturnVeh)
ENDIF
ENDIF
IF bCleanupModel
SET_MODEL_AS_NO_LONGER_NEEDED(g_savedGlobals.sPlayerData.sInfo.sPlayerVehicle[SAVED_VEHICLE_SLOT_BIKE][ePed].model)
ENDIF
STORE_TEMP_PLAYER_VEHICLE_ID(ReturnVeh, ePed)
RETURN TRUE
ENDIF
// Just use default vehicle data.
ELSE
REQUEST_MODEL(sVehData.model)
IF HAS_MODEL_LOADED(sVehData.model)
BOOL bPlayerVehicle = TRUE
PRINTLN(GET_THIS_SCRIPT_NAME(), ": CREATE_PLAYER_VEHICLE() Using default data")
ReturnVeh = CREATE_VEHICLE(sVehData.model, vCoords, fHeading)
SET_VEHICLE_ON_GROUND_PROPERLY(ReturnVeh)
SET_VEHICLE_NOT_STEALABLE_AMBIENTLY(ReturnVeh, FALSE)
SET_VEHICLE_CAN_SAVE_IN_GARAGE(ReturnVeh, FALSE)
SET_VEHICLE_HAS_STRONG_AXLES(ReturnVeh, TRUE)
// Keep track of initial plate text in case we need to use it
TEXT_LABEL_15 sInitialPlateText
sInitialPlateText = GET_VEHICLE_NUMBER_PLATE_TEXT(ReturnVeh)
// Bug 492963 - Increase vehicle health by 250 (each part)
//SET_ENTITY_MAX_HEALTH(ReturnVeh, 1250)
SET_ENTITY_HEALTH(ReturnVeh, 1250)
SET_VEHICLE_ENGINE_HEALTH(ReturnVeh, 1250)
SET_VEHICLE_PETROL_TANK_HEALTH(ReturnVeh, 1250)
sVehData.fHealth = 1250
// Colours
SET_VEHICLE_COLOURS(ReturnVeh, sVehData.iColour1, sVehData.iColour2)
SET_VEHICLE_EXTRA_COLOURS(ReturnVeh, sVehData.iColourExtra1, sVehData.iColourExtra2)
// Dirt
SET_VEHICLE_DIRT_LEVEL(ReturnVeh, sVehData.fDirtLevel)
// Extras
INT iExtra
REPEAT NUMBER_OF_VEHICLE_EXTRAS iExtra
SET_VEHICLE_EXTRA(ReturnVeh, iExtra+1, (NOT sVehData.bExtraOn[iExtra]))
ENDREPEAT
IF sVehData.bConvertible
SET_CONVERTIBLE_ROOF(ReturnVeh, sVehData.bConvertible)
ENDIF
// 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(ReturnVeh, tlPlateText)
SET_VEHICLE_NUMBER_PLATE_TEXT_INDEX(ReturnVeh, iPlateBack)
ELSE
SET_VEHICLE_NUMBER_PLATE_TEXT(ReturnVeh, sVehData.tlNumberPlate)
IF sVehData.iPlateBack >= 0
AND sVehData.iPlateBack < GET_NUMBER_OF_VEHICLE_NUMBER_PLATES()
SET_VEHICLE_NUMBER_PLATE_TEXT_INDEX(ReturnVeh, sVehData.iPlateBack)
ENDIF
ENDIF
// Tyres
SET_VEHICLE_TYRE_SMOKE_COLOR(ReturnVeh, sVehData.iTyreR, sVehData.iTyreG, sVehData.iTyreB)
SET_VEHICLE_TYRES_CAN_BURST(ReturnVeh, sVehData.bTyresCanBurst)
// Window tint
SET_VEHICLE_WINDOW_TINT(ReturnVeh, sVehData.iWindowTintColour)
// Neon lights
SET_VEHICLE_NEON_COLOUR(ReturnVeh, sVehData.iNeonR, sVehData.iNeonG, sVehData.iNeonB)
SET_VEHICLE_NEON_ENABLED(ReturnVeh, NEON_FRONT, IS_BIT_SET(sVehData.iFlags, VEHICLE_SETUP_FLAG_NEON_FRONT))
SET_VEHICLE_NEON_ENABLED(ReturnVeh, NEON_BACK, IS_BIT_SET(sVehData.iFlags, VEHICLE_SETUP_FLAG_NEON_BACK))
SET_VEHICLE_NEON_ENABLED(ReturnVeh, NEON_LEFT, IS_BIT_SET(sVehData.iFlags, VEHICLE_SETUP_FLAG_NEON_LEFT))
SET_VEHICLE_NEON_ENABLED(ReturnVeh, NEON_RIGHT, IS_BIT_SET(sVehData.iFlags, VEHICLE_SETUP_FLAG_NEON_RIGHT))
// Livery
IF GET_VEHICLE_LIVERY_COUNT(ReturnVeh) > 1
AND sVehData.iLivery >= 0
SET_VEHICLE_LIVERY(ReturnVeh, sVehData.iLivery)
ENDIF
// Wheels
IF sVehData.iWheelType > -1
IF NOT IS_THIS_MODEL_A_BICYCLE(GET_ENTITY_MODEL(ReturnVeh))
IF IS_THIS_MODEL_A_BIKE(GET_ENTITY_MODEL(ReturnVeh))
IF (INT_TO_ENUM(MOD_WHEEL_TYPE, sVehData.iWheelType) = MWT_BIKE)
SET_VEHICLE_WHEEL_TYPE(ReturnVeh, INT_TO_ENUM(MOD_WHEEL_TYPE, sVehData.iWheelType))
ENDIF
ELSE
SET_VEHICLE_WHEEL_TYPE(ReturnVeh, INT_TO_ENUM(MOD_WHEEL_TYPE, sVehData.iWheelType))
ENDIF
ENDIF
ENDIF
// Mods
SET_VEHICLE_MOD_DATA(ReturnVeh, sVehData.iModIndex, sVehData.iModVariation)
// Env Eff
SET_VEHICLE_ENVEFF_SCALE(ReturnVeh, sVehData.fEnvEff)
//////////////////////
/// Flow checks
// Use random number plate for bagger bike if it is not unlocked yet
IF ePed = CHAR_FRANKLIN
IF GET_ENTITY_MODEL(ReturnVeh) = BAGGER
AND NOT (g_savedGlobals.sFlow.controls.flagIDs[FLOWFLAG_PLAYER_VEH_F_UNLOCK_BIKE])
SET_VEHICLE_NUMBER_PLATE_TEXT(ReturnVeh, sInitialPlateText)
bPlayerVehicle = FALSE
ENDIF
// Attach Mr Raspberry Jam to Trevors truck
ELIF ePed = CHAR_TREVOR
IF GET_ENTITY_MODEL(ReturnVeh) = BODHI2
TURN_ON_MR_RASPBERRY_JAM(ReturnVeh)
ENDIF
// Create Michaels car with the Jimmy mods.
ELIF ePed = CHAR_MICHAEL
AND NOT g_savedGlobals.sPlayerData.sInfo.bJimmyModsSetOnMichaelsCar
AND (g_savedGlobals.sFlow.controls.flagIDs[FLOWFLAG_MICHAEL_TREVOR_EXILE_FINISHED])
AND GET_ENTITY_MODEL(ReturnVeh) = TAILGATER
PRINTLN(GET_THIS_SCRIPT_NAME(), ": CREATE_PLAYER_VEHICLE() Setting Jimmy mods")
SET_VEHICLE_MOD(ReturnVeh, MOD_GRILL, 1) // Chrome Grille
SET_VEHICLE_MOD(ReturnVeh, MOD_HORN, 7) // Musical Horn 5
SET_VEHICLE_MOD(ReturnVeh, MOD_ENGINE, 2) // EMS Upgrade, Level 3
SET_VEHICLE_MOD(ReturnVeh, MOD_BUMPER_R, 3) // EMS Upgrade, Level 3painted Bumper & Diffuser
SET_VEHICLE_MOD(ReturnVeh, MOD_BONNET, 5) // Double Vented Hood
SET_VEHICLE_MOD(ReturnVeh, MOD_SPOILER, 0) // Lip Spoiler
SET_VEHICLE_MOD(ReturnVeh, MOD_SKIRT, 3) // Custom Skirts 4
SET_VEHICLE_MOD(ReturnVeh, MOD_GEARBOX, 1) // Sports Transmission
SET_VEHICLE_MOD(ReturnVeh, MOD_EXHAUST, 3) // Dual Exit Exhaust
SET_VEHICLE_MOD(ReturnVeh, MOD_BRAKES, 2) // Race Brakes
TOGGLE_VEHICLE_MOD(ReturnVeh, MOD_TOGGLE_XENON_LIGHTS, TRUE) // Xenon Lights
SET_VEHICLE_WHEEL_TYPE(ReturnVeh, MWT_LOWRIDER)
SET_VEHICLE_MOD(ReturnVeh, MOD_WHEELS, 11) // Dollar Wheels
SET_VEHICLE_WINDOW_TINT(ReturnVeh, 2) // Dark Smoke
g_savedGlobals.sPlayerData.sInfo.bJimmyModsSetOnMichaelsCar = TRUE
// Need to save this!
UPDATE_PLAYER_PED_SAVED_VEHICLE(ePed, ReturnVeh, SAVED_VEHICLE_SLOT_CAR, TRUE)
ENDIF
IF bCleanupModel
SET_MODEL_AS_NO_LONGER_NEEDED(sVehData.model)
ENDIF
#IF IS_DEBUG_BUILD
// CarApp debug
IF g_bDebugLosSantosCustomsPlayedStatusOverride
// Do not use if the vehicle has not been unlocked by the player
IF sVehData.model != BAGGER
OR g_savedGlobals.sFlow.controls.flagIDs[FLOWFLAG_PLAYER_VEH_F_UNLOCK_BIKE]
PRINTLN(GET_THIS_SCRIPT_NAME(), ": CREATE_PLAYER_VEHICLE() Setting debug app mods")
SET_VEHICLE_NUMBER_PLATE_TEXT(ReturnVeh, "APPDEBUG")
IF GET_NUM_MOD_KITS(ReturnVeh) > 0
SET_VEHICLE_MOD_KIT(ReturnVeh, 0)
TOGGLE_VEHICLE_MOD(ReturnVeh, MOD_TOGGLE_TURBO, TRUE)
TOGGLE_VEHICLE_MOD(ReturnVeh, MOD_TOGGLE_SUBWOOFER, TRUE)
TOGGLE_VEHICLE_MOD(ReturnVeh, MOD_TOGGLE_TYRE_SMOKE, TRUE)
SET_VEHICLE_TYRE_SMOKE_COLOR(ReturnVeh, 255, 255, 255)
SET_VEHICLE_WINDOW_TINT(ReturnVeh, 0)
IF GET_NUM_VEHICLE_MODS(ReturnVeh, MOD_ARMOUR) >= 1
SET_VEHICLE_MOD(ReturnVeh, MOD_ARMOUR, 0)
ENDIF
IF GET_NUM_VEHICLE_MODS(ReturnVeh, MOD_SPOILER) >= 1
SET_VEHICLE_MOD(ReturnVeh, MOD_SPOILER, 0)
ENDIF
IF GET_NUM_VEHICLE_MODS(ReturnVeh, MOD_SKIRT) >= 1
SET_VEHICLE_MOD(ReturnVeh, MOD_SKIRT, 0)
ENDIF
IF GET_NUM_VEHICLE_MODS(ReturnVeh, MOD_BONNET) >= 1
SET_VEHICLE_MOD(ReturnVeh, MOD_BONNET, 0)
ENDIF
IF GET_NUM_VEHICLE_MODS(ReturnVeh, MOD_GRILL) >= 1
SET_VEHICLE_MOD(ReturnVeh, MOD_BONNET, 0)
ENDIF
ENDIF
ENDIF
ENDIF
#ENDIF
IF bPlayerVehicle
STORE_TEMP_PLAYER_VEHICLE_ID(ReturnVeh, ePed)
ENDIF
RETURN TRUE
ENDIF
ENDIF
ELSE
#IF IS_DEBUG_BUILD
PRINTSTRING("\n")
PRINTSTRING(GET_THIS_SCRIPT_NAME())
PRINTSTRING(": CREATE_PLAYER_VEHICLE - Ped is not a player character.")
PRINTNL()
SCRIPT_ASSERT("CREATE_PLAYER_VEHICLE - Ped is not a player character.")
#ENDIF
ENDIF
RETURN FALSE
#endif
#endif
ENDFUNC
FUNC BOOL CREATE_PLAYER_PED_IN_LAST_KNOWN_VEHICLE_AT_LOCATIONCLF(PED_INDEX &ReturnPed,
enumCharacterList ePed,
PED_VEH_DATA_STRUCT sSavedVehicle,
BOOL bCleanupModel = TRUE)
enumTimetableVehState eSavedLastVehState = g_ePlayerLastVehState[ePed]
IF sSavedVehicle.model <> DUMMY_MODEL_FOR_SCRIPT
AND (eSavedLastVehState <> PTVS_0_noVehicle)
REQUEST_MODEL(sSavedVehicle.model)
REQUEST_PLAYER_PED_MODELCLF(ePed)
IF sSavedVehicle.modelTrailer <> DUMMY_MODEL_FOR_SCRIPT
REQUEST_MODEL(sSavedVehicle.modelTrailer)
IF NOT HAS_MODEL_LOADED(sSavedVehicle.modelTrailer)
RETURN FALSE
ENDIF
ENDIF
IF NOT HAS_MODEL_LOADED(sSavedVehicle.model)
OR NOT HAS_PLAYER_PED_MODEL_LOADED(ePed)
RETURN FALSE
ENDIF
VECTOR vCoords = g_savedGlobalsClifford.sPlayerData.sInfo.vLastKnownCoords[ePed]
FLOAT fHeading = g_savedGlobalsClifford.sPlayerData.sInfo.fLastKnownHead[ePed]
IF (eSavedLastVehState = PTVS_1_playerWithVehicle)
vCoords = g_vPlayerLastVehCoord[ePed]
fHeading = g_fPlayerLastVehHead[ePed]
ENDIF
VECTOR vOccupiedBounds = <<2,2,2>>
IF IS_AREA_OCCUPIED(vCoords-vOccupiedBounds, vCoords+vOccupiedBounds, FALSE, TRUE, TRUE, FALSE, FALSE)
PRINTLN("IS_AREA_OCCUPIED???")
VECTOR vVehicleCoord
FLOAT fVehicleHead
IF GetVehicleOffsetFromCoord(vCoords, fHeading, 0.0, NF_NONE, vVehicleCoord, fVehicleHead)
IF (eSavedLastVehState = PTVS_1_playerWithVehicle)
g_vPlayerLastVehCoord[ePed] = vVehicleCoord
g_fPlayerLastVehHead[ePed] = fVehicleHead
ELSE
g_savedGlobalsClifford.sPlayerData.sInfo.vLastKnownCoords[ePed] = vVehicleCoord
g_savedGlobalsClifford.sPlayerData.sInfo.fLastKnownHead[ePed] = fVehicleHead
ENDIF
RETURN FALSE
ENDIF
ENDIF
VEHICLE_INDEX vehicleID = CREATE_VEHICLE(sSavedVehicle.model, vCoords, fHeading)
SET_VEHICLE_NOT_STEALABLE_AMBIENTLY(vehicleID, FALSE)
SET_VEHICLE_CAN_SAVE_IN_GARAGE(vehicleID, FALSE)
SET_VEHICLE_HAS_STRONG_AXLES(vehicleID, TRUE)
SET_VEH_DATA_FROM_STRUCT(vehicleID, sSavedVehicle)
// Storing as personal player vehicle, to fix B*1978148
IF sSavedVehicle.bIsPlayerVehicle
STORE_TEMP_PLAYER_VEHICLE_ID(vehicleID, ePed)
ENDIF
IF sSavedVehicle.modelTrailer <> DUMMY_MODEL_FOR_SCRIPT
VEHICLE_INDEX trailerID = CREATE_VEHICLE(sSavedVehicle.modelTrailer, vCoords+<<0,0,5>>, fHeading)
ATTACH_VEHICLE_TO_TRAILER(vehicleID, trailerID)
ENDIF
IF bCleanupModel
SET_MODEL_AS_NO_LONGER_NEEDED(sSavedVehicle.model)
IF sSavedVehicle.modelTrailer <> DUMMY_MODEL_FOR_SCRIPT
SET_MODEL_AS_NO_LONGER_NEEDED(sSavedVehicle.modelTrailer)
ENDIF
ENDIF
IF (eSavedLastVehState = PTVS_2_playerInVehicle)
IF CREATE_PLAYER_PED_INSIDE_VEHICLE(ReturnPed, ePed, vehicleID, VS_DRIVER, bCleanupModel)
SET_VEHICLE_AS_NO_LONGER_NEEDED(vehicleID)
RETURN TRUE
ENDIF
ELIF (eSavedLastVehState = PTVS_1_playerWithVehicle)
IF CREATE_PLAYER_PED_ON_FOOT_AT_LAST_KNOWN_LOCATION(ReturnPed, ePed, bCleanupModel)
SET_VEHICLE_AS_NO_LONGER_NEEDED(vehicleID)
RETURN TRUE
ENDIF
ELSE
SCRIPT_ASSERT("CREATE_PLAYER_PED_IN_LAST_KNOWN_VEHICLE_AT_LOCATION - eSavedLastVehState???")
RETURN FALSE
ENDIF
RETURN FALSE
ELSE
RETURN CREATE_PLAYER_PED_ON_FOOT_AT_LAST_KNOWN_LOCATION(ReturnPed, ePed, bCleanupModel)
ENDIF
ENDFUNC
FUNC BOOL CREATE_PLAYER_PED_IN_LAST_KNOWN_VEHICLE_AT_LOCATIONNRM(PED_INDEX &ReturnPed,
enumCharacterList ePed,
PED_VEH_DATA_STRUCT sSavedVehicle,
BOOL bCleanupModel = TRUE)
enumTimetableVehState eSavedLastVehState = g_ePlayerLastVehState[ePed]
IF sSavedVehicle.model <> DUMMY_MODEL_FOR_SCRIPT
AND (eSavedLastVehState <> PTVS_0_noVehicle)
REQUEST_MODEL(sSavedVehicle.model)
REQUEST_PLAYER_PED_MODELNRM(ePed)
IF sSavedVehicle.modelTrailer <> DUMMY_MODEL_FOR_SCRIPT
REQUEST_MODEL(sSavedVehicle.modelTrailer)
IF NOT HAS_MODEL_LOADED(sSavedVehicle.modelTrailer)
RETURN FALSE
ENDIF
ENDIF
IF NOT HAS_MODEL_LOADED(sSavedVehicle.model)
OR NOT HAS_PLAYER_PED_MODEL_LOADED(ePed)
RETURN FALSE
ENDIF
VECTOR vCoords = g_savedGlobalsnorman.sPlayerData.sInfo.vLastKnownCoords[ePed]
FLOAT fHeading = g_savedGlobalsnorman.sPlayerData.sInfo.fLastKnownHead[ePed]
IF (eSavedLastVehState = PTVS_1_playerWithVehicle)
vCoords = g_vPlayerLastVehCoord[ePed]
fHeading = g_fPlayerLastVehHead[ePed]
ENDIF
VECTOR vOccupiedBounds = <<2,2,2>>
IF IS_AREA_OCCUPIED(vCoords-vOccupiedBounds, vCoords+vOccupiedBounds, FALSE, TRUE, TRUE, FALSE, FALSE)
PRINTLN("IS_AREA_OCCUPIED???")
VECTOR vVehicleCoord
FLOAT fVehicleHead
IF GetVehicleOffsetFromCoord(vCoords, fHeading, 0.0, NF_NONE, vVehicleCoord, fVehicleHead)
IF (eSavedLastVehState = PTVS_1_playerWithVehicle)
g_vPlayerLastVehCoord[ePed] = vVehicleCoord
g_fPlayerLastVehHead[ePed] = fVehicleHead
ELSE
g_savedGlobalsnorman.sPlayerData.sInfo.vLastKnownCoords[ePed] = vVehicleCoord
g_savedGlobalsnorman.sPlayerData.sInfo.fLastKnownHead[ePed] = fVehicleHead
ENDIF
RETURN FALSE
ENDIF
ENDIF
VEHICLE_INDEX vehicleID = CREATE_VEHICLE(sSavedVehicle.model, vCoords, fHeading)
SET_VEHICLE_NOT_STEALABLE_AMBIENTLY(vehicleID, FALSE)
SET_VEHICLE_CAN_SAVE_IN_GARAGE(vehicleID, FALSE)
SET_VEHICLE_HAS_STRONG_AXLES(vehicleID, TRUE)
SET_VEH_DATA_FROM_STRUCT(vehicleID, sSavedVehicle)
// Storing as personal player vehicle, to fix B*1978148
IF sSavedVehicle.bIsPlayerVehicle
STORE_TEMP_PLAYER_VEHICLE_ID(vehicleID, ePed)
ENDIF
IF sSavedVehicle.modelTrailer <> DUMMY_MODEL_FOR_SCRIPT
VEHICLE_INDEX trailerID = CREATE_VEHICLE(sSavedVehicle.modelTrailer, vCoords+<<0,0,5>>, fHeading)
ATTACH_VEHICLE_TO_TRAILER(vehicleID, trailerID)
ENDIF
IF bCleanupModel
SET_MODEL_AS_NO_LONGER_NEEDED(sSavedVehicle.model)
IF sSavedVehicle.modelTrailer <> DUMMY_MODEL_FOR_SCRIPT
SET_MODEL_AS_NO_LONGER_NEEDED(sSavedVehicle.modelTrailer)
ENDIF
ENDIF
IF (eSavedLastVehState = PTVS_2_playerInVehicle)
IF CREATE_PLAYER_PED_INSIDE_VEHICLE(ReturnPed, ePed, vehicleID, VS_DRIVER, bCleanupModel)
SET_VEHICLE_AS_NO_LONGER_NEEDED(vehicleID)
RETURN TRUE
ENDIF
ELIF (eSavedLastVehState = PTVS_1_playerWithVehicle)
IF CREATE_PLAYER_PED_ON_FOOT_AT_LAST_KNOWN_LOCATION(ReturnPed, ePed, bCleanupModel)
SET_VEHICLE_AS_NO_LONGER_NEEDED(vehicleID)
RETURN TRUE
ENDIF
ELSE
SCRIPT_ASSERT("CREATE_PLAYER_PED_IN_LAST_KNOWN_VEHICLE_AT_LOCATION - eSavedLastVehState???")
RETURN FALSE
ENDIF
RETURN FALSE
ELSE
RETURN CREATE_PLAYER_PED_ON_FOOT_AT_LAST_KNOWN_LOCATION(ReturnPed, ePed, bCleanupModel)
ENDIF
ENDFUNC
FUNC BOOL CREATE_PLAYER_PED_IN_LAST_KNOWN_VEHICLE_AT_LOCATION(PED_INDEX &ReturnPed,
enumCharacterList ePed,
PED_VEH_DATA_STRUCT sSavedVehicle,
BOOL bCleanupModel = TRUE)
#if USE_CLF_DLC
if g_bLoadedClifford
return CREATE_PLAYER_PED_IN_LAST_KNOWN_VEHICLE_AT_LOCATIONCLF(ReturnPed,ePed,sSavedVehicle,bCleanupModel)
endif
#endif
#if USE_NRM_DLC
if g_bLoadedNorman
return CREATE_PLAYER_PED_IN_LAST_KNOWN_VEHICLE_AT_LOCATIONNRM(ReturnPed,ePed,sSavedVehicle,bCleanupModel)
endif
#endif
enumTimetableVehState eSavedLastVehState = g_ePlayerLastVehState[ePed]
IF sSavedVehicle.model <> DUMMY_MODEL_FOR_SCRIPT
AND (eSavedLastVehState <> PTVS_0_noVehicle)
REQUEST_MODEL(sSavedVehicle.model)
REQUEST_PLAYER_PED_MODEL(ePed)
IF sSavedVehicle.modelTrailer <> DUMMY_MODEL_FOR_SCRIPT
REQUEST_MODEL(sSavedVehicle.modelTrailer)
IF NOT HAS_MODEL_LOADED(sSavedVehicle.modelTrailer)
RETURN FALSE
ENDIF
ENDIF
IF NOT HAS_MODEL_LOADED(sSavedVehicle.model)
OR NOT HAS_PLAYER_PED_MODEL_LOADED(ePed)
RETURN FALSE
ENDIF
VECTOR vCoords = g_savedGlobals.sPlayerData.sInfo.vLastKnownCoords[ePed]
FLOAT fHeading = g_savedGlobals.sPlayerData.sInfo.fLastKnownHead[ePed]
IF (eSavedLastVehState = PTVS_1_playerWithVehicle)
vCoords = g_vPlayerLastVehCoord[ePed]
fHeading = g_fPlayerLastVehHead[ePed]
ENDIF
VECTOR vOccupiedBounds = <<2,2,2>>
IF IS_AREA_OCCUPIED(vCoords-vOccupiedBounds, vCoords+vOccupiedBounds, FALSE, TRUE, TRUE, FALSE, FALSE)
PRINTLN("IS_AREA_OCCUPIED???")
VECTOR vVehicleCoord
FLOAT fVehicleHead
IF GetVehicleOffsetFromCoord(vCoords, fHeading, 0.0, NF_NONE, vVehicleCoord, fVehicleHead)
IF (eSavedLastVehState = PTVS_1_playerWithVehicle)
g_vPlayerLastVehCoord[ePed] = vVehicleCoord
g_fPlayerLastVehHead[ePed] = fVehicleHead
ELSE
g_savedGlobals.sPlayerData.sInfo.vLastKnownCoords[ePed] = vVehicleCoord
g_savedGlobals.sPlayerData.sInfo.fLastKnownHead[ePed] = fVehicleHead
ENDIF
RETURN FALSE
ENDIF
ENDIF
VEHICLE_INDEX vehicleID = CREATE_VEHICLE(sSavedVehicle.model, vCoords, fHeading)
SET_VEHICLE_NOT_STEALABLE_AMBIENTLY(vehicleID, FALSE)
SET_VEHICLE_CAN_SAVE_IN_GARAGE(vehicleID, FALSE)
SET_VEHICLE_HAS_STRONG_AXLES(vehicleID, TRUE)
SET_VEH_DATA_FROM_STRUCT(vehicleID, sSavedVehicle)
SET_ENTITY_SHOULD_FREEZE_WAITING_ON_COLLISION(vehicleID, TRUE)
// Storing as personal player vehicle, to fix B*1978148
IF sSavedVehicle.bIsPlayerVehicle
STORE_TEMP_PLAYER_VEHICLE_ID(vehicleID, ePed)
ENDIF
IF sSavedVehicle.modelTrailer <> DUMMY_MODEL_FOR_SCRIPT
VEHICLE_INDEX trailerID = CREATE_VEHICLE(sSavedVehicle.modelTrailer, vCoords+<<0,0,5>>, fHeading)
ATTACH_VEHICLE_TO_TRAILER(vehicleID, trailerID)
ENDIF
IF bCleanupModel
SET_MODEL_AS_NO_LONGER_NEEDED(sSavedVehicle.model)
IF sSavedVehicle.modelTrailer <> DUMMY_MODEL_FOR_SCRIPT
SET_MODEL_AS_NO_LONGER_NEEDED(sSavedVehicle.modelTrailer)
ENDIF
ENDIF
IF (eSavedLastVehState = PTVS_2_playerInVehicle)
IF CREATE_PLAYER_PED_INSIDE_VEHICLE(ReturnPed, ePed, vehicleID, VS_DRIVER, bCleanupModel)
SET_VEHICLE_AS_NO_LONGER_NEEDED(vehicleID)
RETURN TRUE
ENDIF
ELIF (eSavedLastVehState = PTVS_1_playerWithVehicle)
IF CREATE_PLAYER_PED_ON_FOOT_AT_LAST_KNOWN_LOCATION(ReturnPed, ePed, bCleanupModel)
SET_VEHICLE_AS_NO_LONGER_NEEDED(vehicleID)
RETURN TRUE
ENDIF
ELSE
SCRIPT_ASSERT("CREATE_PLAYER_PED_IN_LAST_KNOWN_VEHICLE_AT_LOCATION - eSavedLastVehState???")
RETURN FALSE
ENDIF
RETURN FALSE
ELSE
RETURN CREATE_PLAYER_PED_ON_FOOT_AT_LAST_KNOWN_LOCATION(ReturnPed, ePed, bCleanupModel)
ENDIF
ENDFUNC
/// PURPOSE: Returns TRUE if the player is considered to be in their default vehicle.
FUNC BOOL IS_PLAYER_USING_DEFAULT_VEHICLE(VEHICLE_CREATE_TYPE_ENUM eTypePreference = VEHICLE_TYPE_DEFAULT)
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
// Grab the players last vehicle (will be the current vehicle if they are in one)
VEHICLE_INDEX tempVeh = GET_PLAYERS_LAST_VEHICLE()
IF DOES_ENTITY_EXIST(tempVeh)
AND IS_VEHICLE_DRIVEABLE(tempVeh)
// If this was a player created vehicle
IF IS_VEHICLE_IN_TEMP_PLAYER_VEHICLE_ID_LIST(tempVeh)
// Type check
IF eTypePreference = VEHICLE_TYPE_CAR
IF NOT IS_THIS_MODEL_A_CAR(GET_ENTITY_MODEL(tempVeh))
RETURN FALSE
ENDIF
ELIF eTypePreference = VEHICLE_TYPE_BIKE
IF NOT IS_THIS_MODEL_A_BIKE(GET_ENTITY_MODEL(tempVeh))
RETURN FALSE
ENDIF
ENDIF
// Player is in the vehicle
IF IS_PED_IN_VEHICLE(PLAYER_PED_ID(), tempVeh)
RETURN TRUE
ENDIF
// Player is within 50m of the vehicle
IF GET_DISTANCE_BETWEEN_COORDS(GET_ENTITY_COORDS(PLAYER_PED_ID()), GET_ENTITY_COORDS(tempVeh)) < 50.0
RETURN TRUE
ENDIF
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// CHOP PED CREATION FUNCTIONS ///
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// PURPOSE: Returns the model enum for Chop
FUNC MODEL_NAMES GET_CHOP_MODEL()
RETURN (A_C_CHOP)
ENDFUNC
/// PURPOSE: Creates Chop the dog at the specified coords.
/// NOTE: This function should be called each frame until TRUE is returned.
FUNC BOOL CREATE_CHOP(PED_INDEX &ReturnPed, VECTOR vCoords, FLOAT fHeading = 0.0, BOOL bCleanupModel = TRUE)
// Load the required model
MODEL_NAMES model = GET_CHOP_MODEL()
REQUEST_MODEL(model)
IF HAS_MODEL_LOADED(model)
IF DOES_ENTITY_EXIST(ReturnPed)
DELETE_PED(ReturnPed)
ENDIF
ReturnPed = CREATE_PED(PEDTYPE_MISSION, model, vCoords, fHeading, FALSE, FALSE)
#IF IS_DEBUG_BUILD
PRINTLN("CREATE_CHOP_PED - Chop created at ", GET_STRING_FROM_VECTOR(vCoords), " by \"", GET_THIS_SCRIPT_NAME(), "\".")
#ENDIF
// Set Chops variations
SET_PED_COMPONENT_VARIATION(ReturnPed, PED_COMP_HEAD, 0, 0)
SET_PED_COMPONENT_VARIATION(ReturnPed, PED_COMP_BERD, 0, 0)
SET_PED_COMPONENT_VARIATION(ReturnPed, PED_COMP_HAIR, 0, 0)
IF g_savedGlobals.sSocialData.bDogAppUsed // B*1536385 Set Chop's collar if the player has used the app
SET_PED_COMPONENT_VARIATION(ReturnPed, PED_COMP_TORSO, 0, g_savedGlobals.sSocialData.sDogAppData.iCollar)
ELSE
SET_PED_COMPONENT_VARIATION(ReturnPed, PED_COMP_TORSO, 0, 4) // B*1168557 Set to Ballas collar by default
ENDIF
SET_PED_COMPONENT_VARIATION(ReturnPed, PED_COMP_LEG, 0, 0) // Coat
SET_PED_COMPONENT_VARIATION(ReturnPed, PED_COMP_HAND, 0, 0)
SET_PED_COMPONENT_VARIATION(ReturnPed, PED_COMP_FEET, 0, 0)
SET_PED_COMPONENT_VARIATION(ReturnPed, PED_COMP_TEETH, 0, 0)
SET_PED_COMPONENT_VARIATION(ReturnPed, PED_COMP_SPECIAL, 0, 0)
SET_PED_COMPONENT_VARIATION(ReturnPed, PED_COMP_SPECIAL2, 0, 0)
SET_PED_COMPONENT_VARIATION(ReturnPed, PED_COMP_DECL, 0, 0)
SET_PED_COMPONENT_VARIATION(ReturnPed, PED_COMP_JBIB, 0, 0)
CLEAR_ALL_PED_PROPS(ReturnPed)
IF bCleanupModel
SET_MODEL_AS_NO_LONGER_NEEDED(model)
ENDIF
RETURN TRUE
ENDIF
RETURN FALSE
ENDFUNC
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// STORY PED CREATION FUNCTIONS ///
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// PURPOSE: Creates the specified non-player character on foot.
/// NOTE: This function should be called each frame until TRUE is returned.
/// The ePed param should be one of the story characters (CHAR_LESTER, CHAR_TRACEY, CHAR_LAMAR etc).
FUNC BOOL CREATE_NPC_PED_ON_FOOT(PED_INDEX &ReturnPed, enumCharacterList ePed, VECTOR vCoords, FLOAT fHeading = 0.0, BOOL bCleanupModel = TRUE)
IF NOT IS_PLAYER_PED_PLAYABLE(ePed)
// Request and load the required model
MODEL_NAMES model = GET_NPC_PED_MODEL(ePed)
REQUEST_MODEL(model)
IF HAS_MODEL_LOADED(model)
// Ally: As the selector script is will be active in both sp and mp, we can't have it creating
// networked objects when it is not a net script.
IF DOES_ENTITY_EXIST(ReturnPed)
DELETE_PED(ReturnPed)
ENDIF
ReturnPed = CREATE_PED(PEDTYPE_MISSION, model, vCoords, fHeading, FALSE, FALSE)
SET_PED_DEFAULT_COMPONENT_VARIATION(ReturnPed)
//#1103185
IF (model = IG_LAMARDAVIS)
IF (GET_PED_DRAWABLE_VARIATION(ReturnPed, PED_COMP_TORSO) = 0)
SET_PED_COMPONENT_VARIATION(ReturnPed, PED_COMP_HAND, 2, 0)
ENDIF
ENDIF
StoreAsGlobalFriend(ReturnPed, ePed)
IF bCleanupModel
SET_MODEL_AS_NO_LONGER_NEEDED(model)
ENDIF
RETURN TRUE
ENDIF
ELSE
#IF IS_DEBUG_BUILD
SCRIPT_ASSERT("CREATE_NPC_PED_ON_FOOT - Ped is not story character.")
PRINTSTRING("\nCREATE_NPC_PED_ON_FOOT - Ped is not story character.")PRINTNL()
#ENDIF
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE: Creates the specified non-player character in a vehicle that has already been created.
/// NOTE: This function should be called each frame until TRUE is returned.
/// The ePed param should be one of the story characters (CHAR_LESTER, CHAR_TRACEY, CHAR_LAMAR etc).
FUNC BOOL CREATE_NPC_PED_INSIDE_VEHICLE(PED_INDEX &ReturnPed, enumCharacterList ePed, VEHICLE_INDEX vehicle, VEHICLE_SEAT seat = VS_DRIVER, BOOL bCleanupModel = TRUE)
IF NOT IS_PLAYER_PED_PLAYABLE(ePed)
// Load the required model
MODEL_NAMES model = GET_NPC_PED_MODEL(ePed)
// Request model
REQUEST_MODEL(model)
IF HAS_MODEL_LOADED(model)
// Ally: As the selector script is will be active in both sp and mp, we can't have it creating
// networked objects when it is not a net script.
IF DOES_ENTITY_EXIST(ReturnPed)
DELETE_PED(ReturnPed)
ENDIF
IF DOES_ENTITY_EXIST(vehicle)
AND IS_VEHICLE_DRIVEABLE(vehicle)
ReturnPed = CREATE_PED_INSIDE_VEHICLE(vehicle, PEDTYPE_MISSION, model, seat, FALSE, FALSE)
SET_PED_DEFAULT_COMPONENT_VARIATION(ReturnPed)
StoreAsGlobalFriend(ReturnPed, ePed)
IF bCleanupModel
SET_MODEL_AS_NO_LONGER_NEEDED(model)
ENDIF
ENDIF
RETURN TRUE
ENDIF
ELSE
#IF IS_DEBUG_BUILD
SCRIPT_ASSERT("CREATE_NPC_PED_INSIDE_VEHICLE - Ped is not a story character.")
PRINTSTRING("\nCREATE_NPC_PED_INSIDE_VEHICLE - Ped is not a story character.")PRINTNL()
#ENDIF
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE: Creates the specified non-player characters vehicle.
/// NOTE: This function should be called each frame until TRUE is returned.
/// The ePed param should be one of the story characters (CHAR_LESTER, CHAR_TRACEY, CHAR_LAMAR etc).
/// The eTypePreference will use the player vehicle that closely matches the type specified
/// PURPOSE: Creates the specified non-player characters vehicle.
/// NOTE: This function should be called each frame until TRUE is returned.
/// The ePed param should be one of the story characters (CHAR_LESTER, CHAR_TRACEY, CHAR_LAMAR etc).
/// The eTypePreference will use the player vehicle that closely matches the type specified
#if USE_CLF_DLC
FUNC BOOL CREATE_NPC_VEHICLECLF(VEHICLE_INDEX &ReturnVeh, enumCharacterList ePed, VECTOR vCoords, FLOAT fHeading, BOOL bCleanupModel = TRUE, VEHICLE_CREATE_TYPE_ENUM eTypePreference = VEHICLE_TYPE_DEFAULT)
IF NOT IS_PLAYER_PED_PLAYABLE(ePed)
// Grab the vehicle dta for the specified ped
PED_VEH_DATA_STRUCT sVehData
GET_NPC_VEH_DATA(ePed, sVehData, eTypePreference)
IF DOES_ENTITY_EXIST(ReturnVeh)
IF GET_ENTITY_MODEL(ReturnVeh) != sVehData.model
#IF IS_DEBUG_BUILD
SCRIPT_ASSERT("CREATE_NPC_VEHICLE - Vehicle ID already exists with different model")
#ENDIF
ENDIF
RETURN TRUE
ENDIF
// Create the stored CAR vehicle if it has the same model.
IF (ePed = CHAR_AMANDA AND g_savedGlobalsClifford.sPlayerData.sInfo.sNPCVehicle[SAVED_VEHICLE_SLOT_CAR][0].model = sVehData.model)
OR (ePed = CHAR_TRACEY AND g_savedGlobalsClifford.sPlayerData.sInfo.sNPCVehicle[SAVED_VEHICLE_SLOT_CAR][1].model = sVehData.model)
INT iPed
IF ePed = CHAR_AMANDA
iPed = 0
ELIF ePed = CHAR_TRACEY
iPed = 1
ENDIF
REQUEST_MODEL(g_savedGlobalsClifford.sPlayerData.sInfo.sNPCVehicle[SAVED_VEHICLE_SLOT_CAR][iPed].model)
IF HAS_MODEL_LOADED(g_savedGlobalsClifford.sPlayerData.sInfo.sNPCVehicle[SAVED_VEHICLE_SLOT_CAR][iPed].model)
PRINTLN(GET_THIS_SCRIPT_NAME(), ": CREATE_NPC_VEHICLE() Using stored car data for ped ", ePed)
ReturnVeh = CREATE_VEHICLE(g_savedGlobalsClifford.sPlayerData.sInfo.sNPCVehicle[SAVED_VEHICLE_SLOT_CAR][iPed].model, vCoords, fHeading, FALSE, FALSE)
SET_VEHICLE_ON_GROUND_PROPERLY(ReturnVeh)
SET_VEHICLE_NOT_STEALABLE_AMBIENTLY(ReturnVeh, FALSE)
SET_VEHICLE_CAN_SAVE_IN_GARAGE(ReturnVeh, FALSE)
SET_VEHICLE_HAS_STRONG_AXLES(ReturnVeh, TRUE)
// Bug 492963 - Increase vehicle health by 250 (each part)
//SET_ENTITY_MAX_HEALTH(ReturnVeh, 1250)
SET_ENTITY_HEALTH(ReturnVeh, 1250)
SET_VEHICLE_ENGINE_HEALTH(ReturnVeh, 1250)
SET_VEHICLE_PETROL_TANK_HEALTH(ReturnVeh, 1250)
sVehData.fHealth = 1250
// Colours
SET_VEHICLE_COLOURS(ReturnVeh, g_savedGlobalsClifford.sPlayerData.sInfo.sNPCVehicle[SAVED_VEHICLE_SLOT_CAR][iPed].iColour1, g_savedGlobalsClifford.sPlayerData.sInfo.sNPCVehicle[SAVED_VEHICLE_SLOT_CAR][iPed].iColour2)
SET_VEHICLE_EXTRA_COLOURS(ReturnVeh, g_savedGlobalsClifford.sPlayerData.sInfo.sNPCVehicle[SAVED_VEHICLE_SLOT_CAR][iPed].iColourExtra1, g_savedGlobalsClifford.sPlayerData.sInfo.sNPCVehicle[SAVED_VEHICLE_SLOT_CAR][iPed].iColourExtra2)
// Dirt
SET_VEHICLE_DIRT_LEVEL(ReturnVeh, sVehData.fDirtLevel)
// Extras
INT iExtra
REPEAT NUMBER_OF_VEHICLE_EXTRAS iExtra
SET_VEHICLE_EXTRA(ReturnVeh, iExtra+1, (NOT g_savedGlobalsClifford.sPlayerData.sInfo.sNPCVehicle[SAVED_VEHICLE_SLOT_CAR][iPed].bExtraOn[iExtra]))
ENDREPEAT
IF g_savedGlobalsClifford.sPlayerData.sInfo.sNPCVehicle[SAVED_VEHICLE_SLOT_CAR][iPed].bConvertible
IF IS_VEHICLE_A_CONVERTIBLE(ReturnVeh)
IF g_savedGlobalsClifford.sPlayerData.sInfo.sNPCVehicle[SAVED_VEHICLE_SLOT_CAR][iPed].bConvertible
RAISE_CONVERTIBLE_ROOF(ReturnVeh, TRUE)
ELSE
LOWER_CONVERTIBLE_ROOF(ReturnVeh, TRUE)
ENDIF
ENDIF
ENDIF
// Number plate
SET_VEHICLE_NUMBER_PLATE_TEXT(ReturnVeh, g_savedGlobalsClifford.sPlayerData.sInfo.sNPCVehicle[SAVED_VEHICLE_SLOT_CAR][iPed].tlNumberPlate)
IF g_savedGlobalsClifford.sPlayerData.sInfo.sNPCVehicle[SAVED_VEHICLE_SLOT_CAR][iPed].iPlateBack >= 0
AND g_savedGlobalsClifford.sPlayerData.sInfo.sNPCVehicle[SAVED_VEHICLE_SLOT_CAR][iPed].iPlateBack < GET_NUMBER_OF_VEHICLE_NUMBER_PLATES()
SET_VEHICLE_NUMBER_PLATE_TEXT_INDEX(ReturnVeh, g_savedGlobalsClifford.sPlayerData.sInfo.sNPCVehicle[SAVED_VEHICLE_SLOT_CAR][iPed].iPlateBack)
ENDIF
// Tyres
SET_VEHICLE_TYRE_SMOKE_COLOR(ReturnVeh, g_savedGlobalsClifford.sPlayerData.sInfo.sNPCVehicle[SAVED_VEHICLE_SLOT_CAR][iPed].iTyreR, g_savedGlobalsClifford.sPlayerData.sInfo.sNPCVehicle[SAVED_VEHICLE_SLOT_CAR][iPed].iTyreG, g_savedGlobalsClifford.sPlayerData.sInfo.sNPCVehicle[SAVED_VEHICLE_SLOT_CAR][iPed].iTyreB)
SET_VEHICLE_TYRES_CAN_BURST(ReturnVeh, g_savedGlobalsClifford.sPlayerData.sInfo.sNPCVehicle[SAVED_VEHICLE_SLOT_CAR][iPed].bTyresCanBurst)
// Window tint
SET_VEHICLE_WINDOW_TINT(ReturnVeh, g_savedGlobalsClifford.sPlayerData.sInfo.sNPCVehicle[SAVED_VEHICLE_SLOT_CAR][iPed].iWindowTintColour)
// Livery
IF GET_VEHICLE_LIVERY_COUNT(ReturnVeh) > 1
AND g_savedGlobalsClifford.sPlayerData.sInfo.sNPCVehicle[SAVED_VEHICLE_SLOT_CAR][iPed].iLivery >= 0
SET_VEHICLE_LIVERY(ReturnVeh, g_savedGlobalsClifford.sPlayerData.sInfo.sNPCVehicle[SAVED_VEHICLE_SLOT_CAR][iPed].iLivery)
ENDIF
// Wheels
IF g_savedGlobalsClifford.sPlayerData.sInfo.sNPCVehicle[SAVED_VEHICLE_SLOT_CAR][iPed].iWheelType > -1
IF NOT IS_THIS_MODEL_A_BICYCLE(GET_ENTITY_MODEL(ReturnVeh))
IF IS_THIS_MODEL_A_BIKE(GET_ENTITY_MODEL(ReturnVeh))
IF (INT_TO_ENUM(MOD_WHEEL_TYPE, g_savedGlobalsClifford.sPlayerData.sInfo.sNPCVehicle[SAVED_VEHICLE_SLOT_CAR][iPed].iWheelType) = MWT_BIKE)
SET_VEHICLE_WHEEL_TYPE(ReturnVeh, INT_TO_ENUM(MOD_WHEEL_TYPE, g_savedGlobalsClifford.sPlayerData.sInfo.sNPCVehicle[SAVED_VEHICLE_SLOT_CAR][iPed].iWheelType))
ENDIF
ELSE
SET_VEHICLE_WHEEL_TYPE(ReturnVeh, INT_TO_ENUM(MOD_WHEEL_TYPE, g_savedGlobalsClifford.sPlayerData.sInfo.sNPCVehicle[SAVED_VEHICLE_SLOT_CAR][iPed].iWheelType))
ENDIF
ENDIF
ENDIF
// Mods
SET_VEHICLE_MOD_DATA(ReturnVeh, g_savedGlobalsClifford.sPlayerData.sInfo.sNPCVehicle[SAVED_VEHICLE_SLOT_CAR][iPed].iModIndex, g_savedGlobalsClifford.sPlayerData.sInfo.sNPCVehicle[SAVED_VEHICLE_SLOT_CAR][iPed].iModVariation)
// Env Eff
SET_VEHICLE_ENVEFF_SCALE(ReturnVeh, sVehData.fEnvEff)
IF bCleanupModel
SET_MODEL_AS_NO_LONGER_NEEDED(g_savedGlobalsClifford.sPlayerData.sInfo.sNPCVehicle[SAVED_VEHICLE_SLOT_CAR][iPed].model)
ENDIF
STORE_TEMP_NPC_VEHICLE_ID(ReturnVeh)
RETURN TRUE
ENDIF
ELSE
REQUEST_MODEL(sVehData.model)
IF HAS_MODEL_LOADED(sVehData.model)
PRINTLN(GET_THIS_SCRIPT_NAME(), ": CREATE_NPC_VEHICLE() Using default car data for ped ", ePed)
ReturnVeh = CREATE_VEHICLE(sVehData.model, vCoords, fHeading, FALSE, FALSE)
SET_VEHICLE_ON_GROUND_PROPERLY(ReturnVeh)
SET_VEHICLE_NOT_STEALABLE_AMBIENTLY(ReturnVeh, FALSE)
SET_VEHICLE_CAN_SAVE_IN_GARAGE(ReturnVeh, FALSE)
SET_VEHICLE_HAS_STRONG_AXLES(ReturnVeh, TRUE)
// Colours
SET_VEH_DATA_FROM_STRUCT(ReturnVeh, sVehData)
IF ePed = CHAR_AMANDA
OR ePed = CHAR_TRACEY
STORE_TEMP_NPC_VEHICLE_ID(ReturnVeh)
ENDIF
IF bCleanupModel
SET_MODEL_AS_NO_LONGER_NEEDED(sVehData.model)
ENDIF
RETURN TRUE
ENDIF
ENDIF
ELSE
#IF IS_DEBUG_BUILD
SCRIPT_ASSERT("CREATE_NPC_VEHICLE - Ped is not story character.")
PRINTSTRING("\nCREATE_NPC_VEHICLE - Ped is not story character.")PRINTNL()
#ENDIF
ENDIF
RETURN FALSE
ENDFUNC
#ENDIF
#if USE_NRM_DLC
FUNC BOOL CREATE_NPC_VEHICLENRM(VEHICLE_INDEX &ReturnVeh, enumCharacterList ePed, VECTOR vCoords, FLOAT fHeading, BOOL bCleanupModel = TRUE, VEHICLE_CREATE_TYPE_ENUM eTypePreference = VEHICLE_TYPE_DEFAULT)
IF NOT IS_PLAYER_PED_PLAYABLE(ePed)
// Grab the vehicle dta for the specified ped
PED_VEH_DATA_STRUCT sVehData
GET_NPC_VEH_DATA(ePed, sVehData, eTypePreference)
IF DOES_ENTITY_EXIST(ReturnVeh)
IF GET_ENTITY_MODEL(ReturnVeh) != sVehData.model
#IF IS_DEBUG_BUILD
SCRIPT_ASSERT("CREATE_NPC_VEHICLE - Vehicle ID already exists with different model")
#ENDIF
ENDIF
RETURN TRUE
ENDIF
// Create the stored CAR vehicle if it has the same model.
IF (ePed = CHAR_NRM_AMANDA AND g_savedGlobalsnorman.sPlayerData.sInfo.sNPCVehicle[SAVED_VEHICLE_SLOT_CAR][0].model = sVehData.model)
// OR (ePed = CHAR_TRACEY AND g_savedGlobalsnorman.sPlayerData.sInfo.sNPCVehicle[SAVED_VEHICLE_SLOT_CAR][1].model = sVehData.model)
INT iPed
IF ePed = CHAR_NRM_AMANDA
iPed = 0
// ELIF ePed = CHAR_TRACEY
// iPed = 1
ENDIF
REQUEST_MODEL(g_savedGlobalsnorman.sPlayerData.sInfo.sNPCVehicle[SAVED_VEHICLE_SLOT_CAR][iPed].model)
IF HAS_MODEL_LOADED(g_savedGlobalsnorman.sPlayerData.sInfo.sNPCVehicle[SAVED_VEHICLE_SLOT_CAR][iPed].model)
PRINTLN(GET_THIS_SCRIPT_NAME(), ": CREATE_NPC_VEHICLE() Using stored car data for ped ", ePed)
ReturnVeh = CREATE_VEHICLE(g_savedGlobalsnorman.sPlayerData.sInfo.sNPCVehicle[SAVED_VEHICLE_SLOT_CAR][iPed].model, vCoords, fHeading, FALSE, FALSE)
SET_VEHICLE_ON_GROUND_PROPERLY(ReturnVeh)
SET_VEHICLE_NOT_STEALABLE_AMBIENTLY(ReturnVeh, FALSE)
SET_VEHICLE_CAN_SAVE_IN_GARAGE(ReturnVeh, FALSE)
SET_VEHICLE_HAS_STRONG_AXLES(ReturnVeh, TRUE)
// Bug 492963 - Increase vehicle health by 250 (each part)
//SET_ENTITY_MAX_HEALTH(ReturnVeh, 1250)
SET_ENTITY_HEALTH(ReturnVeh, 1250)
SET_VEHICLE_ENGINE_HEALTH(ReturnVeh, 1250)
SET_VEHICLE_PETROL_TANK_HEALTH(ReturnVeh, 1250)
sVehData.fHealth = 1250
// Colours
SET_VEHICLE_COLOURS(ReturnVeh, g_savedGlobalsnorman.sPlayerData.sInfo.sNPCVehicle[SAVED_VEHICLE_SLOT_CAR][iPed].iColour1, g_savedGlobalsnorman.sPlayerData.sInfo.sNPCVehicle[SAVED_VEHICLE_SLOT_CAR][iPed].iColour2)
SET_VEHICLE_EXTRA_COLOURS(ReturnVeh, g_savedGlobalsnorman.sPlayerData.sInfo.sNPCVehicle[SAVED_VEHICLE_SLOT_CAR][iPed].iColourExtra1, g_savedGlobalsnorman.sPlayerData.sInfo.sNPCVehicle[SAVED_VEHICLE_SLOT_CAR][iPed].iColourExtra2)
// Dirt
SET_VEHICLE_DIRT_LEVEL(ReturnVeh, sVehData.fDirtLevel)
// Extras
INT iExtra
REPEAT NUMBER_OF_VEHICLE_EXTRAS iExtra
SET_VEHICLE_EXTRA(ReturnVeh, iExtra+1, (NOT g_savedGlobalsnorman.sPlayerData.sInfo.sNPCVehicle[SAVED_VEHICLE_SLOT_CAR][iPed].bExtraOn[iExtra]))
ENDREPEAT
IF g_savedGlobalsnorman.sPlayerData.sInfo.sNPCVehicle[SAVED_VEHICLE_SLOT_CAR][iPed].bConvertible
IF IS_VEHICLE_A_CONVERTIBLE(ReturnVeh)
IF g_savedGlobalsnorman.sPlayerData.sInfo.sNPCVehicle[SAVED_VEHICLE_SLOT_CAR][iPed].bConvertible
RAISE_CONVERTIBLE_ROOF(ReturnVeh, TRUE)
ELSE
LOWER_CONVERTIBLE_ROOF(ReturnVeh, TRUE)
ENDIF
ENDIF
ENDIF
// Number plate
SET_VEHICLE_NUMBER_PLATE_TEXT(ReturnVeh, g_savedGlobalsnorman.sPlayerData.sInfo.sNPCVehicle[SAVED_VEHICLE_SLOT_CAR][iPed].tlNumberPlate)
IF g_savedGlobalsnorman.sPlayerData.sInfo.sNPCVehicle[SAVED_VEHICLE_SLOT_CAR][iPed].iPlateBack >= 0
AND g_savedGlobalsnorman.sPlayerData.sInfo.sNPCVehicle[SAVED_VEHICLE_SLOT_CAR][iPed].iPlateBack < GET_NUMBER_OF_VEHICLE_NUMBER_PLATES()
SET_VEHICLE_NUMBER_PLATE_TEXT_INDEX(ReturnVeh, g_savedGlobalsnorman.sPlayerData.sInfo.sNPCVehicle[SAVED_VEHICLE_SLOT_CAR][iPed].iPlateBack)
ENDIF
// Tyres
SET_VEHICLE_TYRE_SMOKE_COLOR(ReturnVeh, g_savedGlobalsnorman.sPlayerData.sInfo.sNPCVehicle[SAVED_VEHICLE_SLOT_CAR][iPed].iTyreR, g_savedGlobalsnorman.sPlayerData.sInfo.sNPCVehicle[SAVED_VEHICLE_SLOT_CAR][iPed].iTyreG, g_savedGlobalsnorman.sPlayerData.sInfo.sNPCVehicle[SAVED_VEHICLE_SLOT_CAR][iPed].iTyreB)
SET_VEHICLE_TYRES_CAN_BURST(ReturnVeh, g_savedGlobalsnorman.sPlayerData.sInfo.sNPCVehicle[SAVED_VEHICLE_SLOT_CAR][iPed].bTyresCanBurst)
// Window tint
SET_VEHICLE_WINDOW_TINT(ReturnVeh, g_savedGlobalsnorman.sPlayerData.sInfo.sNPCVehicle[SAVED_VEHICLE_SLOT_CAR][iPed].iWindowTintColour)
// Livery
IF GET_VEHICLE_LIVERY_COUNT(ReturnVeh) > 1
AND g_savedGlobalsnorman.sPlayerData.sInfo.sNPCVehicle[SAVED_VEHICLE_SLOT_CAR][iPed].iLivery >= 0
SET_VEHICLE_LIVERY(ReturnVeh, g_savedGlobalsnorman.sPlayerData.sInfo.sNPCVehicle[SAVED_VEHICLE_SLOT_CAR][iPed].iLivery)
ENDIF
// Wheels
IF g_savedGlobalsnorman.sPlayerData.sInfo.sNPCVehicle[SAVED_VEHICLE_SLOT_CAR][iPed].iWheelType > -1
IF NOT IS_THIS_MODEL_A_BICYCLE(GET_ENTITY_MODEL(ReturnVeh))
IF IS_THIS_MODEL_A_BIKE(GET_ENTITY_MODEL(ReturnVeh))
IF (INT_TO_ENUM(MOD_WHEEL_TYPE, g_savedGlobalsnorman.sPlayerData.sInfo.sNPCVehicle[SAVED_VEHICLE_SLOT_CAR][iPed].iWheelType) = MWT_BIKE)
SET_VEHICLE_WHEEL_TYPE(ReturnVeh, INT_TO_ENUM(MOD_WHEEL_TYPE, g_savedGlobalsnorman.sPlayerData.sInfo.sNPCVehicle[SAVED_VEHICLE_SLOT_CAR][iPed].iWheelType))
ENDIF
ELSE
SET_VEHICLE_WHEEL_TYPE(ReturnVeh, INT_TO_ENUM(MOD_WHEEL_TYPE, g_savedGlobalsnorman.sPlayerData.sInfo.sNPCVehicle[SAVED_VEHICLE_SLOT_CAR][iPed].iWheelType))
ENDIF
ENDIF
ENDIF
// Mods
SET_VEHICLE_MOD_DATA(ReturnVeh, g_savedGlobalsnorman.sPlayerData.sInfo.sNPCVehicle[SAVED_VEHICLE_SLOT_CAR][iPed].iModIndex, g_savedGlobalsnorman.sPlayerData.sInfo.sNPCVehicle[SAVED_VEHICLE_SLOT_CAR][iPed].iModVariation)
// Env Eff
SET_VEHICLE_ENVEFF_SCALE(ReturnVeh, sVehData.fEnvEff)
IF bCleanupModel
SET_MODEL_AS_NO_LONGER_NEEDED(g_savedGlobalsnorman.sPlayerData.sInfo.sNPCVehicle[SAVED_VEHICLE_SLOT_CAR][iPed].model)
endif
STORE_TEMP_NPC_VEHICLE_ID(ReturnVeh)
RETURN TRUE
ENDIF
ELSE
REQUEST_MODEL(sVehData.model)
IF HAS_MODEL_LOADED(sVehData.model)
PRINTLN(GET_THIS_SCRIPT_NAME(), ": CREATE_NPC_VEHICLE() Using default car data for ped ", ePed)
ReturnVeh = CREATE_VEHICLE(sVehData.model, vCoords, fHeading, FALSE, FALSE)
SET_VEHICLE_ON_GROUND_PROPERLY(ReturnVeh)
SET_VEHICLE_NOT_STEALABLE_AMBIENTLY(ReturnVeh, FALSE)
SET_VEHICLE_CAN_SAVE_IN_GARAGE(ReturnVeh, FALSE)
SET_VEHICLE_HAS_STRONG_AXLES(ReturnVeh, TRUE)
// Colours
SET_VEH_DATA_FROM_STRUCT(ReturnVeh, sVehData)
IF ePed = CHAR_NRM_AMANDA
STORE_TEMP_NPC_VEHICLE_ID(ReturnVeh)
ENDIF
IF bCleanupModel
SET_MODEL_AS_NO_LONGER_NEEDED(sVehData.model)
ENDIF
RETURN TRUE
ENDIF
ENDIF
ELSE
#IF IS_DEBUG_BUILD
SCRIPT_ASSERT("CREATE_NPC_VEHICLE - Ped is not story character.")
PRINTSTRING("\nCREATE_NPC_VEHICLE - Ped is not story character.")PRINTNL()
#ENDIF
ENDIF
RETURN FALSE
ENDFUNC
#ENDIF
FUNC BOOL CREATE_NPC_VEHICLE(VEHICLE_INDEX &ReturnVeh, enumCharacterList ePed, VECTOR vCoords, FLOAT fHeading, BOOL bCleanupModel = TRUE, VEHICLE_CREATE_TYPE_ENUM eTypePreference = VEHICLE_TYPE_DEFAULT)
#if USE_CLF_DLC
return CREATE_NPC_VEHICLECLF(ReturnVeh,ePed,vCoords,fHeading,bCleanupModel,eTypePreference)
#endif
#if USE_NRM_DLC
return CREATE_NPC_VEHICLENRM(ReturnVeh,ePed,vCoords,fHeading,bCleanupModel,eTypePreference)
#endif
#if not USE_SP_DLC
IF NOT IS_PLAYER_PED_PLAYABLE(ePed)
// Grab the vehicle dta for the specified ped
PED_VEH_DATA_STRUCT sVehData
GET_NPC_VEH_DATA(ePed, sVehData, eTypePreference)
IF DOES_ENTITY_EXIST(ReturnVeh)
IF GET_ENTITY_MODEL(ReturnVeh) != sVehData.model
#IF IS_DEBUG_BUILD
SCRIPT_ASSERT("CREATE_NPC_VEHICLE - Vehicle ID already exists with different model")
#ENDIF
ENDIF
RETURN TRUE
ENDIF
// Create the stored CAR vehicle if it has the same model.
IF (ePed = CHAR_AMANDA AND g_savedGlobals.sPlayerData.sInfo.sNPCVehicle[SAVED_VEHICLE_SLOT_CAR][0].model = sVehData.model)
OR (ePed = CHAR_TRACEY AND g_savedGlobals.sPlayerData.sInfo.sNPCVehicle[SAVED_VEHICLE_SLOT_CAR][1].model = sVehData.model)
INT iPed
IF ePed = CHAR_AMANDA
iPed = 0
ELIF ePed = CHAR_TRACEY
iPed = 1
ENDIF
REQUEST_MODEL(g_savedGlobals.sPlayerData.sInfo.sNPCVehicle[SAVED_VEHICLE_SLOT_CAR][iPed].model)
IF HAS_MODEL_LOADED(g_savedGlobals.sPlayerData.sInfo.sNPCVehicle[SAVED_VEHICLE_SLOT_CAR][iPed].model)
PRINTLN(GET_THIS_SCRIPT_NAME(), ": CREATE_NPC_VEHICLE() Using stored car data for ped ", ePed)
ReturnVeh = CREATE_VEHICLE(g_savedGlobals.sPlayerData.sInfo.sNPCVehicle[SAVED_VEHICLE_SLOT_CAR][iPed].model, vCoords, fHeading, FALSE, FALSE)
SET_VEHICLE_ON_GROUND_PROPERLY(ReturnVeh)
SET_VEHICLE_NOT_STEALABLE_AMBIENTLY(ReturnVeh, FALSE)
SET_VEHICLE_CAN_SAVE_IN_GARAGE(ReturnVeh, FALSE)
SET_VEHICLE_HAS_STRONG_AXLES(ReturnVeh, TRUE)
// Bug 492963 - Increase vehicle health by 250 (each part)
//SET_ENTITY_MAX_HEALTH(ReturnVeh, 1250)
SET_ENTITY_HEALTH(ReturnVeh, 1250)
SET_VEHICLE_ENGINE_HEALTH(ReturnVeh, 1250)
SET_VEHICLE_PETROL_TANK_HEALTH(ReturnVeh, 1250)
sVehData.fHealth = 1250
// Colours
SET_VEHICLE_COLOURS(ReturnVeh, g_savedGlobals.sPlayerData.sInfo.sNPCVehicle[SAVED_VEHICLE_SLOT_CAR][iPed].iColour1, g_savedGlobals.sPlayerData.sInfo.sNPCVehicle[SAVED_VEHICLE_SLOT_CAR][iPed].iColour2)
SET_VEHICLE_EXTRA_COLOURS(ReturnVeh, g_savedGlobals.sPlayerData.sInfo.sNPCVehicle[SAVED_VEHICLE_SLOT_CAR][iPed].iColourExtra1, g_savedGlobals.sPlayerData.sInfo.sNPCVehicle[SAVED_VEHICLE_SLOT_CAR][iPed].iColourExtra2)
// Dirt
SET_VEHICLE_DIRT_LEVEL(ReturnVeh, sVehData.fDirtLevel)
// Extras
INT iExtra
REPEAT NUMBER_OF_VEHICLE_EXTRAS iExtra
SET_VEHICLE_EXTRA(ReturnVeh, iExtra+1, (NOT g_savedGlobals.sPlayerData.sInfo.sNPCVehicle[SAVED_VEHICLE_SLOT_CAR][iPed].bExtraOn[iExtra]))
ENDREPEAT
IF g_savedGlobals.sPlayerData.sInfo.sNPCVehicle[SAVED_VEHICLE_SLOT_CAR][iPed].bConvertible
IF IS_VEHICLE_A_CONVERTIBLE(ReturnVeh)
IF g_savedGlobals.sPlayerData.sInfo.sNPCVehicle[SAVED_VEHICLE_SLOT_CAR][iPed].bConvertible
RAISE_CONVERTIBLE_ROOF(ReturnVeh, TRUE)
ELSE
LOWER_CONVERTIBLE_ROOF(ReturnVeh, TRUE)
ENDIF
ENDIF
ENDIF
// Number plate
SET_VEHICLE_NUMBER_PLATE_TEXT(ReturnVeh, g_savedGlobals.sPlayerData.sInfo.sNPCVehicle[SAVED_VEHICLE_SLOT_CAR][iPed].tlNumberPlate)
IF g_savedGlobals.sPlayerData.sInfo.sNPCVehicle[SAVED_VEHICLE_SLOT_CAR][iPed].iPlateBack >= 0
AND g_savedGlobals.sPlayerData.sInfo.sNPCVehicle[SAVED_VEHICLE_SLOT_CAR][iPed].iPlateBack < GET_NUMBER_OF_VEHICLE_NUMBER_PLATES()
SET_VEHICLE_NUMBER_PLATE_TEXT_INDEX(ReturnVeh, g_savedGlobals.sPlayerData.sInfo.sNPCVehicle[SAVED_VEHICLE_SLOT_CAR][iPed].iPlateBack)
ENDIF
// Tyres
SET_VEHICLE_TYRE_SMOKE_COLOR(ReturnVeh, g_savedGlobals.sPlayerData.sInfo.sNPCVehicle[SAVED_VEHICLE_SLOT_CAR][iPed].iTyreR, g_savedGlobals.sPlayerData.sInfo.sNPCVehicle[SAVED_VEHICLE_SLOT_CAR][iPed].iTyreG, g_savedGlobals.sPlayerData.sInfo.sNPCVehicle[SAVED_VEHICLE_SLOT_CAR][iPed].iTyreB)
SET_VEHICLE_TYRES_CAN_BURST(ReturnVeh, g_savedGlobals.sPlayerData.sInfo.sNPCVehicle[SAVED_VEHICLE_SLOT_CAR][iPed].bTyresCanBurst)
// Window tint
SET_VEHICLE_WINDOW_TINT(ReturnVeh, g_savedGlobals.sPlayerData.sInfo.sNPCVehicle[SAVED_VEHICLE_SLOT_CAR][iPed].iWindowTintColour)
// Neon lights
SET_VEHICLE_NEON_COLOUR(ReturnVeh, g_savedGlobals.sPlayerData.sInfo.sNPCVehicle[SAVED_VEHICLE_SLOT_CAR][iPed].iNeonR, g_savedGlobals.sPlayerData.sInfo.sNPCVehicle[SAVED_VEHICLE_SLOT_CAR][iPed].iNeonG, g_savedGlobals.sPlayerData.sInfo.sNPCVehicle[SAVED_VEHICLE_SLOT_CAR][iPed].iNeonB)
SET_VEHICLE_NEON_ENABLED(ReturnVeh, NEON_FRONT, IS_BIT_SET(g_savedGlobals.sPlayerData.sInfo.sNPCVehicle[SAVED_VEHICLE_SLOT_CAR][iPed].iFlags, VEHICLE_SETUP_FLAG_NEON_FRONT))
SET_VEHICLE_NEON_ENABLED(ReturnVeh, NEON_BACK, IS_BIT_SET(g_savedGlobals.sPlayerData.sInfo.sNPCVehicle[SAVED_VEHICLE_SLOT_CAR][iPed].iFlags, VEHICLE_SETUP_FLAG_NEON_BACK))
SET_VEHICLE_NEON_ENABLED(ReturnVeh, NEON_LEFT, IS_BIT_SET(g_savedGlobals.sPlayerData.sInfo.sNPCVehicle[SAVED_VEHICLE_SLOT_CAR][iPed].iFlags, VEHICLE_SETUP_FLAG_NEON_LEFT))
SET_VEHICLE_NEON_ENABLED(ReturnVeh, NEON_RIGHT, IS_BIT_SET(g_savedGlobals.sPlayerData.sInfo.sNPCVehicle[SAVED_VEHICLE_SLOT_CAR][iPed].iFlags, VEHICLE_SETUP_FLAG_NEON_RIGHT))
// Livery
IF GET_VEHICLE_LIVERY_COUNT(ReturnVeh) > 1
AND g_savedGlobals.sPlayerData.sInfo.sNPCVehicle[SAVED_VEHICLE_SLOT_CAR][iPed].iLivery >= 0
SET_VEHICLE_LIVERY(ReturnVeh, g_savedGlobals.sPlayerData.sInfo.sNPCVehicle[SAVED_VEHICLE_SLOT_CAR][iPed].iLivery)
ENDIF
// Wheels
IF g_savedGlobals.sPlayerData.sInfo.sNPCVehicle[SAVED_VEHICLE_SLOT_CAR][iPed].iWheelType > -1
IF NOT IS_THIS_MODEL_A_BICYCLE(GET_ENTITY_MODEL(ReturnVeh))
IF IS_THIS_MODEL_A_BIKE(GET_ENTITY_MODEL(ReturnVeh))
IF (INT_TO_ENUM(MOD_WHEEL_TYPE, g_savedGlobals.sPlayerData.sInfo.sNPCVehicle[SAVED_VEHICLE_SLOT_CAR][iPed].iWheelType) = MWT_BIKE)
SET_VEHICLE_WHEEL_TYPE(ReturnVeh, INT_TO_ENUM(MOD_WHEEL_TYPE, g_savedGlobals.sPlayerData.sInfo.sNPCVehicle[SAVED_VEHICLE_SLOT_CAR][iPed].iWheelType))
ENDIF
ELSE
SET_VEHICLE_WHEEL_TYPE(ReturnVeh, INT_TO_ENUM(MOD_WHEEL_TYPE, g_savedGlobals.sPlayerData.sInfo.sNPCVehicle[SAVED_VEHICLE_SLOT_CAR][iPed].iWheelType))
ENDIF
ENDIF
ENDIF
// Mods
SET_VEHICLE_MOD_DATA(ReturnVeh, g_savedGlobals.sPlayerData.sInfo.sNPCVehicle[SAVED_VEHICLE_SLOT_CAR][iPed].iModIndex, g_savedGlobals.sPlayerData.sInfo.sNPCVehicle[SAVED_VEHICLE_SLOT_CAR][iPed].iModVariation)
// Env Eff
SET_VEHICLE_ENVEFF_SCALE(ReturnVeh, sVehData.fEnvEff)
IF bCleanupModel
SET_MODEL_AS_NO_LONGER_NEEDED(g_savedGlobals.sPlayerData.sInfo.sNPCVehicle[SAVED_VEHICLE_SLOT_CAR][iPed].model)
endif
STORE_TEMP_NPC_VEHICLE_ID(ReturnVeh)
RETURN TRUE
ENDIF
ELSE
REQUEST_MODEL(sVehData.model)
IF HAS_MODEL_LOADED(sVehData.model)
PRINTLN(GET_THIS_SCRIPT_NAME(), ": CREATE_NPC_VEHICLE() Using default car data for ped ", ePed)
ReturnVeh = CREATE_VEHICLE(sVehData.model, vCoords, fHeading, FALSE, FALSE)
SET_VEHICLE_ON_GROUND_PROPERLY(ReturnVeh)
SET_VEHICLE_NOT_STEALABLE_AMBIENTLY(ReturnVeh, FALSE)
SET_VEHICLE_CAN_SAVE_IN_GARAGE(ReturnVeh, FALSE)
SET_VEHICLE_HAS_STRONG_AXLES(ReturnVeh, TRUE)
// Colours
SET_VEH_DATA_FROM_STRUCT(ReturnVeh, sVehData)
IF ePed = CHAR_AMANDA
OR ePed = CHAR_TRACEY
STORE_TEMP_NPC_VEHICLE_ID(ReturnVeh)
ENDIF
IF bCleanupModel
SET_MODEL_AS_NO_LONGER_NEEDED(sVehData.model)
ENDIF
RETURN TRUE
ENDIF
ENDIF
ELSE
#IF IS_DEBUG_BUILD
SCRIPT_ASSERT("CREATE_NPC_VEHICLE - Ped is not story character.")
PRINTSTRING("\nCREATE_NPC_VEHICLE - Ped is not story character.")PRINTNL()
#ENDIF
ENDIF
RETURN FALSE
#ENDIF
ENDFUNC
CONST_FLOAT NO_HEADING -1.0
PROC DO_PLAYER_MAP_WARP_WITH_LOAD(VECTOR paramCoords, FLOAT paramHeading = NO_HEADING, BOOL paramFadeScreen = TRUE, INT paramTimeout = 12000, FLOAT paramLoadRadius = 125.0, BOOL bKeepOriginalZ = FALSE)
IF paramFadeScreen
IF NOT IS_SCREEN_FADED_OUT()
IF NOT IS_SCREEN_FADING_OUT()
DO_SCREEN_FADE_OUT(500)
ENDIF
ENDIF
WHILE NOT IS_SCREEN_FADED_OUT()
WAIT(0)
ENDWHILE
ENDIF
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
//Move streaming focus to warp location.
SET_FOCUS_POS_AND_VEL(paramCoords, <<0,0,0>>)
//Load streaming volume at new warp position.
INT iBreakOutTimer = GET_GAME_TIMER() + paramTimeout
NEW_LOAD_SCENE_START_SPHERE(paramCoords, paramLoadRadius)
WHILE NOT IS_NEW_LOAD_SCENE_LOADED() AND GET_GAME_TIMER() < iBreakOutTimer
WAIT(0)
ENDWHILE
//Streaming volume loaded, move player.
IF NOT (IS_ENTITY_DEAD(PLAYER_PED_ID()))
IF NOT bKeepOriginalZ
paramCoords.Z += 1.0
GET_GROUND_Z_FOR_3D_COORD(paramCoords, paramCoords.Z)
ENDIF
SET_ENTITY_COORDS(PLAYER_PED_ID(), paramCoords)
IF paramHeading != NO_HEADING
SET_ENTITY_HEADING(PLAYER_PED_ID(), paramHeading)
ENDIF
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
ENDIF
CLEAR_FOCUS()
NEW_LOAD_SCENE_STOP()
//Reset area.
CLEAR_AREA(paramCoords, 5000.0, TRUE, FALSE)
INSTANTLY_FILL_PED_POPULATION()
INSTANTLY_FILL_VEHICLE_POPULATION()
// reset camera behind player
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
ENDIF
IF paramFadeScreen
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
ENDIF
ENDPROC
//Based on the DO_PLAYER_MAP_WARP_WITH_LOAD function, made to use the code native to perform a warp with fade and load
PROC DO_PLAYER_TELEPORT(VECTOR vCoords,
FLOAT fHeading = NO_HEADING,
BOOL bFadeScreen = TRUE
, BOOL bSnapToGround = TRUE
, INT iTimeout = 12000)
CDEBUG1LN(DEBUG_SYSTEM,"Performing player teleport to ",vCoords," from script ",GET_THIS_SCRIPT_NAME())
START_PLAYER_TELEPORT(PLAYER_ID(),vCoords, fHeading, DEFAULT, bSnapToGround, bFadeScreen)
INT iWaitTime = GET_GAME_TIMER() + iTimeout
WHILE NOT (UPDATE_PLAYER_TELEPORT(PLAYER_ID()) OR iWaitTime < GET_GAME_TIMER())
CDEBUG3LN(DEBUG_SYSTEM,"Waiting for player teleport to finish")
WAIT(0)
ENDWHILE
CDEBUG1LN(DEBUG_SYSTEM,"Done performing teleport to coords ",vCoords)
ENDPROC
PROC DO_PLAYER_WARP_WITH_LOAD_AND_PAUSE(VECTOR paramPosition, FLOAT paramHeading = NO_HEADING, INT paramFrameTimeout = 350, FLOAT paramLoadRadius = 60.0, BOOL paramFadeInOutScreen = FALSE)
CPRINTLN(DEBUG_SYSTEM, "DO_PLAYER_WARP_WITH_LOAD_AND_PAUSE: Warping player to ", paramPosition, ".")
IF paramFadeInOutScreen
IF NOT IS_SCREEN_FADED_OUT()
IF NOT IS_SCREEN_FADING_OUT()
DO_SCREEN_FADE_OUT(DEFAULT_FADE_TIME)
ENDIF
ENDIF
WHILE NOT IS_SCREEN_FADED_OUT()
WAIT(0)
ENDWHILE
ENDIF
// Move the player and the camera
CLEAR_AREA(paramPosition, 5.0, TRUE)
IF DOES_ENTITY_EXIST(PLAYER_PED_ID())
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
SET_ENTITY_COORDS(PLAYER_PED_ID(), paramPosition)
IF paramHeading != NO_HEADING
SET_ENTITY_HEADING(PLAYER_PED_ID(), paramHeading)
ENDIF
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
RESET_PED_AUDIO_FLAGS(PLAYER_PED_ID())
ENDIF
ENDIF
//Wait a frame for the camera to catch up before pausing
WAIT(0)
SET_GAME_PAUSED(TRUE)
//Load the streaming volume.
NEW_LOAD_SCENE_START_SPHERE(paramPosition, paramLoadRadius)
INT iNewLoadSceneTimeout = 0
CPRINTLN(DEBUG_SYSTEM, "Starting new load scene.")
WHILE NOT IS_NEW_LOAD_SCENE_LOADED()
AND (iNewLoadSceneTimeout < paramFrameTimeout)
iNewLoadSceneTimeout++
WAIT(0)
ENDWHILE
CPRINTLN(DEBUG_SYSTEM, "Finished new load scene. Load took ", iNewLoadSceneTimeout, " frames.")
//Clean up the new load scene.
NEW_LOAD_SCENE_STOP()
//Clear the area around the player.
CLEAR_AREA(paramPosition, 5.0, TRUE)
//Reset the camera behind the player.
SET_GAMEPLAY_CAM_RELATIVE_PITCH(0.0)
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0.0)
//Unpause when all is done.
SET_GAME_PAUSED(FALSE)
IF paramFadeInOutScreen
DO_SCREEN_FADE_IN(DEFAULT_FADE_TIME)
ENDIF
ENDPROC
FUNC BOOL STORE_Clock_For_Multiplayer_Switch()
g_sMultiplayerTransitionTOD = GET_CURRENT_TIMEOFDAY()
RETURN FALSE
ENDFUNC
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// ///
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
FUNC BOOL Is_Player_Timetable_Scene_In_ProgressCLF()
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("player_timetableCLF")) > 0
// player timetable scene is in progress!
RETURN TRUE
ENDIF
// player timetable scene is NOT in progress...
RETURN FALSE
ENDFUNC
FUNC BOOL Is_Player_Timetable_Scene_In_ProgressNRM()
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("player_timetableNRM")) > 0
// player timetable scene is in progress!
RETURN TRUE
ENDIF
// player timetable scene is NOT in progress...
RETURN FALSE
ENDFUNC
FUNC BOOL Is_Player_Timetable_Scene_In_Progress()
#IF USE_CLF_DLC
IF g_bLoadedClifford
RETURN Is_Player_Timetable_Scene_In_ProgressCLF()
ENDIF
#ENDIF
#IF USE_NRM_DLC
IF g_bLoadedNorman
RETURN Is_Player_Timetable_Scene_In_ProgressNRM()
ENDIF
#ENDIF
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("player_timetable_scene")) > 0
// player timetable scene is in progress!
RETURN TRUE
ENDIF
// player timetable scene is NOT in progress...
RETURN FALSE
ENDFUNC
FUNC PED_REQUEST_SCENE_ENUM Get_Player_Timetable_Scene_In_Progress()
IF IS_PLAYER_SWITCH_IN_PROGRESS()
// player switch is in progress!
RETURN g_eSelectedPlayerCharScene
ENDIF
IF Is_Player_Timetable_Scene_In_Progress()
// player timetable scene is in progress!
RETURN g_eSelectedPlayerCharScene
ENDIF
// player timetable scene is NOT in progress...
RETURN PR_SCENE_INVALID
ENDFUNC
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// PED CUTSCENE VARIATIONS ///
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// PURPOSE: Determine whether the player_controller script should set player ped data when a cutscene is running.
/// Data includes player ped variations and weapons, as well as vehicle mods, colours, and plate text.
/// NOTE: Please ensure that this gets set back to TRUE when you are done.
PROC SET_PLAYER_PED_DATA_IN_CUTSCENES(BOOL bClothes = TRUE, BOOL bWeapons = TRUE)
PRINTLN("SET_PLAYER_PED_DATA_IN_CUTSCENES(", bClothes, ", ", bWeapons, ") called by ", GET_THIS_SCRIPT_NAME())
g_bSetPlayerClothesInCutscenes = bClothes
g_bSetPlayerWeaponsInCutscenes = bWeapons
ENDPROC
PROC GET_PED_VARIATIONS_FOR_CUTSCENE(PED_INDEX pedID, PED_VARIATION_STRUCT &sVariations, COMPONENT_BLOCK_FLAGS eCompBlocks = CBF_ALL)
INT iComponent
PED_COMP_NAME_ENUM eItemRemoval
PED_VARIATION_STRUCT sFullVariations
PED_COMP_ITEM_DATA_STRUCT sItemDetails
MODEL_NAMES eModel = GET_ENTITY_MODEL(pedID)
GET_PED_VARIATIONS(pedID, sFullVariations, CBF_NONE)
GET_PED_VARIATIONS(pedID, sVariations, eCompBlocks)
BOOL bHairForced = FALSE
BOOL bBeardForced = FALSE
#IF IS_DEBUG_BUILD
enumCharacterList ePed = GET_PLAYER_PED_ENUM(pedID)
#ENDIF
// If we remove an item, and it forced a hair/beard change, re-instate the hair/bear
REPEAT NUM_PED_COMPONENTS iComponent
IF sVariations.iDrawableVariation[iComponent] != sFullVariations.iDrawableVariation[iComponent]
OR sVariations.iTextureVariation[iComponent] != sFullVariations.iTextureVariation[iComponent]
PRINTLN("GET_PED_VARIATIONS_FOR_CUTSCENE() - Component has been changed on slot ", iComponent)
IF DOES_ITEM_FORCE_HAIR_CHANGE(eModel, GET_COMP_TYPE_FROM_PED_COMPONENT(INT_TO_ENUM(PED_COMPONENT, iComponent)), GET_PED_COMP_ITEM_FROM_VARIATIONS(pedID, sFullVariations.iDrawableVariation[iComponent], sFullVariations.iTextureVariation[iComponent], GET_COMP_TYPE_FROM_PED_COMPONENT(INT_TO_ENUM(PED_COMPONENT, iComponent))), eItemRemoval)
#IF IS_DEBUG_BUILD
PRINTLN("GET_PED_VARIATIONS_FOR_CUTSCENE() - Setting stored hair for ", GET_PLAYER_PED_STRING(ePed))
#ENDIF
sItemDetails = GET_PED_COMP_DATA_FOR_ITEM_SP(eModel, COMP_TYPE_HAIR, sVariations.eStoredHairstyle)
sVariations.iDrawableVariation[PED_COMP_HAIR] = sItemDetails.iDrawable
sVariations.iTextureVariation[PED_COMP_HAIR] = sItemDetails.iTexture
bHairForced = TRUE
ENDIF
IF DOES_ITEM_FORCE_BEARD_CHANGE(eModel, GET_COMP_TYPE_FROM_PED_COMPONENT(INT_TO_ENUM(PED_COMPONENT, iComponent)), GET_PED_COMP_ITEM_FROM_VARIATIONS(pedID, sFullVariations.iDrawableVariation[iComponent], sFullVariations.iTextureVariation[iComponent], GET_COMP_TYPE_FROM_PED_COMPONENT(INT_TO_ENUM(PED_COMPONENT, iComponent))), eItemRemoval)
#IF IS_DEBUG_BUILD
PRINTLN("GET_PED_VARIATIONS_FOR_CUTSCENE() - Setting stored beard for ", GET_PLAYER_PED_STRING(ePed))
#ENDIF
sItemDetails = GET_PED_COMP_DATA_FOR_ITEM_SP(eModel, COMP_TYPE_BERD, sVariations.eStoredBeard)
sVariations.iDrawableVariation[PED_COMP_BERD] = sItemDetails.iDrawable
sVariations.iTextureVariation[PED_COMP_BERD] = sItemDetails.iTexture
bBeardForced = TRUE
ENDIF
ENDIF
ENDREPEAT
REPEAT NUM_PLAYER_PED_PROPS iComponent
IF sVariations.iPropIndex[iComponent] != sFullVariations.iPropIndex[iComponent]
OR sVariations.iPropTexture[iComponent] != sFullVariations.iPropTexture[iComponent]
PRINTLN("GET_PED_VARIATIONS_FOR_CUTSCENE() - Prop has been changed on slot ", iComponent)
IF DOES_ITEM_FORCE_HAIR_CHANGE(eModel, COMP_TYPE_PROPS, GET_PROP_ITEM_FROM_VARIATIONS(pedID, sFullVariations.iPropIndex[iComponent], sFullVariations.iPropTexture[iComponent], INT_TO_ENUM(PED_PROP_POSITION, iComponent)), eItemRemoval)
#IF IS_DEBUG_BUILD
PRINTLN("GET_PED_VARIATIONS_FOR_CUTSCENE() - Setting stored hair for ", GET_PLAYER_PED_STRING(ePed))
#ENDIF
sItemDetails = GET_PED_COMP_DATA_FOR_ITEM_SP(eModel, COMP_TYPE_HAIR, sVariations.eStoredHairstyle)
sVariations.iDrawableVariation[PED_COMP_HAIR] = sItemDetails.iDrawable
sVariations.iTextureVariation[PED_COMP_HAIR] = sItemDetails.iTexture
bHairForced = TRUE
ENDIF
IF DOES_ITEM_FORCE_BEARD_CHANGE(eModel, COMP_TYPE_PROPS, GET_PROP_ITEM_FROM_VARIATIONS(pedID, sFullVariations.iPropIndex[iComponent], sFullVariations.iPropTexture[iComponent], INT_TO_ENUM(PED_PROP_POSITION, iComponent)), eItemRemoval)
#IF IS_DEBUG_BUILD
PRINTLN("GET_PED_VARIATIONS_FOR_CUTSCENE() - Setting stored beard for ", GET_PLAYER_PED_STRING(ePed))
#ENDIF
sItemDetails = GET_PED_COMP_DATA_FOR_ITEM_SP(eModel, COMP_TYPE_BERD, sVariations.eStoredBeard)
sVariations.iDrawableVariation[PED_COMP_BERD] = sItemDetails.iDrawable
sVariations.iTextureVariation[PED_COMP_BERD] = sItemDetails.iTexture
bBeardForced = TRUE
ENDIF
ENDIF
ENDREPEAT
// Set any forced hair or beard requisites
IF bBeardForced OR bHairForced
PED_COMP_NAME_ENUM eBeard = GET_PED_COMP_ITEM_FROM_VARIATIONS(pedID, sVariations.iDrawableVariation[PED_COMP_BERD], sVariations.iTextureVariation[PED_COMP_BERD], COMP_TYPE_BERD)
PED_COMP_NAME_ENUM eHair = GET_PED_COMP_ITEM_FROM_VARIATIONS(pedID, sVariations.iDrawableVariation[PED_COMP_HAIR], sVariations.iTextureVariation[PED_COMP_HAIR], COMP_TYPE_HAIR)
PED_COMP_NAME_ENUM eRequisite = GET_HEAD_REQUISITE_SP(eModel, eHair, eBeard)
IF eRequisite != DUMMY_PED_COMP
#IF IS_DEBUG_BUILD
PRINTLN("GET_PED_VARIATIONS_FOR_CUTSCENE() - Forcing requisite head for ", GET_PLAYER_PED_STRING(ePed))
#ENDIF
sItemDetails = GET_PED_COMP_DATA_FOR_ITEM_SP(eModel, COMP_TYPE_HEAD, eRequisite)
sVariations.iDrawableVariation[PED_COMP_HEAD] = sItemDetails.iDrawable
sVariations.iTextureVariation[PED_COMP_HEAD] = sItemDetails.iTexture
ENDIF
ENDIF
ENDPROC
/// PURPOSE: This should be used to pass in the ped index minus items that cause issues - parachutes, helmets, headsets etc.
PROC SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE(STRING sSceneHandle, PED_INDEX pedID, MODEL_NAMES eModel = DUMMY_MODEL_FOR_SCRIPT, COMPONENT_BLOCK_FLAGS eCompBlocks = CBF_ALL)
PED_VARIATION_STRUCT sVariations
GET_PED_VARIATIONS_FOR_CUTSCENE(pedID, sVariations, eCompBlocks)
// Now add to the cutscene
INT iComponent
REPEAT NUM_PED_COMPONENTS iComponent
SET_CUTSCENE_PED_COMPONENT_VARIATION(sSceneHandle, INT_TO_ENUM(PED_COMPONENT, iComponent), sVariations.iDrawableVariation[iComponent], sVariations.iTextureVariation[iComponent], eModel)
ENDREPEAT
REPEAT NUM_PLAYER_PED_PROPS iComponent
IF sVariations.iPropIndex[iComponent] = -1
OR sVariations.iPropIndex[iComponent] = 255
SET_CUTSCENE_PED_PROP_VARIATION(sSceneHandle, INT_TO_ENUM(PED_PROP_POSITION, iComponent), -1, 0, eModel)
ELSE
SET_CUTSCENE_PED_PROP_VARIATION(sSceneHandle, INT_TO_ENUM(PED_PROP_POSITION, iComponent), sVariations.iPropIndex[iComponent], sVariations.iPropTexture[iComponent], eModel)
ENDIF
ENDREPEAT
ENDPROC
/// PURPOSE: Sets the stored varaitions to be used in the cutscene for the given player ped/scene handle
/// NOTE: This is the clothes that the ped had before the start of a mission
PROC SET_STORED_PLAYER_PED_CUTSCENE_VARIATIONS(enumCharacterList ePed, STRING sSceneHandle, COMPONENT_BLOCK_FLAGS eCompBlocks = CBF_ALL)
IF NOT IS_PLAYER_PED_PLAYABLE(ePed)
EXIT
ENDIF
#if USE_CLF_DLC
PED_VARIATION_STRUCT sFullVariations = g_savedGlobalsClifford.sPlayerData.sInfo.sVariations[ePed]
PED_VARIATION_STRUCT sVariations = g_savedGlobalsClifford.sPlayerData.sInfo.sVariations[ePed]
#endif
#if USE_NRM_DLC
PED_VARIATION_STRUCT sFullVariations = g_savedGlobalsnorman.sPlayerData.sInfo.sVariations[ePed]
PED_VARIATION_STRUCT sVariations = g_savedGlobalsnorman.sPlayerData.sInfo.sVariations[ePed]
#endif
#if not USE_CLF_DLC
#if not USE_NRM_DLC
PED_VARIATION_STRUCT sFullVariations = g_savedGlobals.sPlayerData.sInfo.sVariations[ePed]
PED_VARIATION_STRUCT sVariations = g_savedGlobals.sPlayerData.sInfo.sVariations[ePed]
#endif
#endif
INT i
REPEAT NUM_PED_COMPONENTS i
GET_VARIATION_TO_STORE(NULL, INT_TO_ENUM(PED_COMPONENT, i), sVariations.iDrawableVariation[i], sVariations.iTextureVariation[i], sVariations.iPaletteVariation[i], eCompBlocks, ePed)
ENDREPEAT
REPEAT NUM_PLAYER_PED_PROPS i
GET_PROP_VARIATION_TO_STORE(NULL, INT_TO_ENUM(PED_PROP_POSITION, i), sVariations.iPropIndex[i], sVariations.iPropTexture[i], eCompBlocks, ePed)
ENDREPEAT
INT iComponent
PED_COMP_NAME_ENUM eItemRemoval
PED_COMP_ITEM_DATA_STRUCT sItemDetails
MODEL_NAMES eModel = GET_PLAYER_PED_MODEL(ePed)
BOOL bHairForced = FALSE
BOOL bBeardForced = FALSE
// If we remove an item, and it forced a hair/beard change, re-instate the hair/bear
REPEAT NUM_PED_COMPONENTS iComponent
IF sVariations.iDrawableVariation[iComponent] != sFullVariations.iDrawableVariation[iComponent]
OR sVariations.iTextureVariation[iComponent] != sFullVariations.iTextureVariation[iComponent]
PRINTLN("SET_STORED_PLAYER_PED_CUTSCENE_VARIATIONS() - Component has been changed on slot ", iComponent)
#if USE_CLF_DLC
IF DOES_ITEM_FORCE_HAIR_CHANGE(eModel, GET_COMP_TYPE_FROM_PED_COMPONENT(INT_TO_ENUM(PED_COMPONENT, iComponent)), g_savedGlobalsClifford.sPlayerData.sInfo.eTrackedPedComp[iComponent][ePed], eItemRemoval)
#IF IS_DEBUG_BUILD
PRINTLN("SET_STORED_PLAYER_PED_CUTSCENE_VARIATIONS() - Setting stored hair for ", GET_PLAYER_PED_STRING(ePed))
#ENDIF
sItemDetails = GET_PED_COMP_DATA_FOR_ITEM_SP(eModel, COMP_TYPE_HAIR, sVariations.eStoredHairstyle)
sVariations.iDrawableVariation[PED_COMP_HAIR] = sItemDetails.iDrawable
sVariations.iTextureVariation[PED_COMP_HAIR] = sItemDetails.iTexture
bHairForced = TRUE
ENDIF
IF DOES_ITEM_FORCE_BEARD_CHANGE(eModel, GET_COMP_TYPE_FROM_PED_COMPONENT(INT_TO_ENUM(PED_COMPONENT, iComponent)), g_savedGlobalsClifford.sPlayerData.sInfo.eTrackedPedComp[iComponent][ePed], eItemRemoval)
#IF IS_DEBUG_BUILD
PRINTLN("SET_STORED_PLAYER_PED_CUTSCENE_VARIATIONS() - Setting stored beard for ", GET_PLAYER_PED_STRING(ePed))
#ENDIF
sItemDetails = GET_PED_COMP_DATA_FOR_ITEM_SP(eModel, COMP_TYPE_BERD, sVariations.eStoredBeard)
sVariations.iDrawableVariation[PED_COMP_BERD] = sItemDetails.iDrawable
sVariations.iTextureVariation[PED_COMP_BERD] = sItemDetails.iTexture
bBeardForced = TRUE
ENDIF
#endif
#if USE_NRM_DLC
IF DOES_ITEM_FORCE_HAIR_CHANGE(eModel, GET_COMP_TYPE_FROM_PED_COMPONENT(INT_TO_ENUM(PED_COMPONENT, iComponent)), g_savedGlobalsClifford.sPlayerData.sInfo.eTrackedPedComp[iComponent][ePed], eItemRemoval)
#IF IS_DEBUG_BUILD
PRINTLN("SET_STORED_PLAYER_PED_CUTSCENE_VARIATIONS() - Setting stored hair for ", GET_PLAYER_PED_STRING(ePed))
#ENDIF
sItemDetails = GET_PED_COMP_DATA_FOR_ITEM_SP(eModel, COMP_TYPE_HAIR, sVariations.eStoredHairstyle)
sVariations.iDrawableVariation[PED_COMP_HAIR] = sItemDetails.iDrawable
sVariations.iTextureVariation[PED_COMP_HAIR] = sItemDetails.iTexture
bHairForced = TRUE
ENDIF
IF DOES_ITEM_FORCE_BEARD_CHANGE(eModel, GET_COMP_TYPE_FROM_PED_COMPONENT(INT_TO_ENUM(PED_COMPONENT, iComponent)), g_savedGlobalsClifford.sPlayerData.sInfo.eTrackedPedComp[iComponent][ePed], eItemRemoval)
#IF IS_DEBUG_BUILD
PRINTLN("SET_STORED_PLAYER_PED_CUTSCENE_VARIATIONS() - Setting stored beard for ", GET_PLAYER_PED_STRING(ePed))
#ENDIF
sItemDetails = GET_PED_COMP_DATA_FOR_ITEM_SP(eModel, COMP_TYPE_BERD, sVariations.eStoredBeard)
sVariations.iDrawableVariation[PED_COMP_BERD] = sItemDetails.iDrawable
sVariations.iTextureVariation[PED_COMP_BERD] = sItemDetails.iTexture
bBeardForced = TRUE
ENDIF
#endif
#if not USE_CLF_DLC
#if not USE_NRM_DLC
IF DOES_ITEM_FORCE_HAIR_CHANGE(eModel, GET_COMP_TYPE_FROM_PED_COMPONENT(INT_TO_ENUM(PED_COMPONENT, iComponent)), g_savedGlobals.sPlayerData.sInfo.eTrackedPedComp[iComponent][ePed], eItemRemoval)
#IF IS_DEBUG_BUILD
PRINTLN("SET_STORED_PLAYER_PED_CUTSCENE_VARIATIONS() - Setting stored hair for ", GET_PLAYER_PED_STRING(ePed))
#ENDIF
sItemDetails = GET_PED_COMP_DATA_FOR_ITEM_SP(eModel, COMP_TYPE_HAIR, sVariations.eStoredHairstyle)
sVariations.iDrawableVariation[PED_COMP_HAIR] = sItemDetails.iDrawable
sVariations.iTextureVariation[PED_COMP_HAIR] = sItemDetails.iTexture
bHairForced = TRUE
ENDIF
IF DOES_ITEM_FORCE_BEARD_CHANGE(eModel, GET_COMP_TYPE_FROM_PED_COMPONENT(INT_TO_ENUM(PED_COMPONENT, iComponent)), g_savedGlobals.sPlayerData.sInfo.eTrackedPedComp[iComponent][ePed], eItemRemoval)
#IF IS_DEBUG_BUILD
PRINTLN("SET_STORED_PLAYER_PED_CUTSCENE_VARIATIONS() - Setting stored beard for ", GET_PLAYER_PED_STRING(ePed))
#ENDIF
sItemDetails = GET_PED_COMP_DATA_FOR_ITEM_SP(eModel, COMP_TYPE_BERD, sVariations.eStoredBeard)
sVariations.iDrawableVariation[PED_COMP_BERD] = sItemDetails.iDrawable
sVariations.iTextureVariation[PED_COMP_BERD] = sItemDetails.iTexture
bBeardForced = TRUE
ENDIF
#endif
#endif
ENDIF
ENDREPEAT
REPEAT NUM_PLAYER_PED_PROPS iComponent
IF sVariations.iPropIndex[iComponent] != sFullVariations.iPropIndex[iComponent]
OR sVariations.iPropTexture[iComponent] != sFullVariations.iPropTexture[iComponent]
PRINTLN("SET_STORED_PLAYER_PED_CUTSCENE_VARIATIONS() - Prop has been changed on slot ", iComponent)
#if USE_CLF_DLC
IF DOES_ITEM_FORCE_HAIR_CHANGE(eModel, COMP_TYPE_PROPS, g_savedGlobalsClifford.sPlayerData.sInfo.eTrackedPedProps[iComponent][ePed], eItemRemoval)
#IF IS_DEBUG_BUILD
PRINTLN("SET_STORED_PLAYER_PED_CUTSCENE_VARIATIONS() - Setting stored hair for ", GET_PLAYER_PED_STRING(ePed))
#ENDIF
sItemDetails = GET_PED_COMP_DATA_FOR_ITEM_SP(eModel, COMP_TYPE_HAIR, sVariations.eStoredHairstyle)
sVariations.iDrawableVariation[PED_COMP_HAIR] = sItemDetails.iDrawable
sVariations.iTextureVariation[PED_COMP_HAIR] = sItemDetails.iTexture
bHairForced = TRUE
ENDIF
IF DOES_ITEM_FORCE_BEARD_CHANGE(eModel, COMP_TYPE_PROPS, g_savedGlobalsClifford.sPlayerData.sInfo.eTrackedPedProps[iComponent][ePed], eItemRemoval)
#IF IS_DEBUG_BUILD
PRINTLN("SET_STORED_PLAYER_PED_CUTSCENE_VARIATIONS() - Setting stored beard for ", GET_PLAYER_PED_STRING(ePed))
#ENDIF
sItemDetails = GET_PED_COMP_DATA_FOR_ITEM_SP(eModel, COMP_TYPE_BERD, sVariations.eStoredBeard)
sVariations.iDrawableVariation[PED_COMP_BERD] = sItemDetails.iDrawable
sVariations.iTextureVariation[PED_COMP_BERD] = sItemDetails.iTexture
bBeardForced = TRUE
ENDIF
#endif
#if USE_NRM_DLC
IF DOES_ITEM_FORCE_HAIR_CHANGE(eModel, COMP_TYPE_PROPS, g_savedGlobalsnorman.sPlayerData.sInfo.eTrackedPedProps[iComponent][ePed], eItemRemoval)
#IF IS_DEBUG_BUILD
PRINTLN("SET_STORED_PLAYER_PED_CUTSCENE_VARIATIONS() - Setting stored hair for ", GET_PLAYER_PED_STRING(ePed))
#ENDIF
sItemDetails = GET_PED_COMP_DATA_FOR_ITEM_SP(eModel, COMP_TYPE_HAIR, sVariations.eStoredHairstyle)
sVariations.iDrawableVariation[PED_COMP_HAIR] = sItemDetails.iDrawable
sVariations.iTextureVariation[PED_COMP_HAIR] = sItemDetails.iTexture
bHairForced = TRUE
ENDIF
IF DOES_ITEM_FORCE_BEARD_CHANGE(eModel, COMP_TYPE_PROPS, g_savedGlobalsnorman.sPlayerData.sInfo.eTrackedPedProps[iComponent][ePed], eItemRemoval)
#IF IS_DEBUG_BUILD
PRINTLN("SET_STORED_PLAYER_PED_CUTSCENE_VARIATIONS() - Setting stored beard for ", GET_PLAYER_PED_STRING(ePed))
#ENDIF
sItemDetails = GET_PED_COMP_DATA_FOR_ITEM_SP(eModel, COMP_TYPE_BERD, sVariations.eStoredBeard)
sVariations.iDrawableVariation[PED_COMP_BERD] = sItemDetails.iDrawable
sVariations.iTextureVariation[PED_COMP_BERD] = sItemDetails.iTexture
bBeardForced = TRUE
ENDIF
#endif
#if not USE_CLF_DLC
#if not USE_NRM_DLC
IF DOES_ITEM_FORCE_HAIR_CHANGE(eModel, COMP_TYPE_PROPS, g_savedGlobals.sPlayerData.sInfo.eTrackedPedProps[iComponent][ePed], eItemRemoval)
#IF IS_DEBUG_BUILD
PRINTLN("SET_STORED_PLAYER_PED_CUTSCENE_VARIATIONS() - Setting stored hair for ", GET_PLAYER_PED_STRING(ePed))
#ENDIF
sItemDetails = GET_PED_COMP_DATA_FOR_ITEM_SP(eModel, COMP_TYPE_HAIR, sVariations.eStoredHairstyle)
sVariations.iDrawableVariation[PED_COMP_HAIR] = sItemDetails.iDrawable
sVariations.iTextureVariation[PED_COMP_HAIR] = sItemDetails.iTexture
bHairForced = TRUE
ENDIF
IF DOES_ITEM_FORCE_BEARD_CHANGE(eModel, COMP_TYPE_PROPS, g_savedGlobals.sPlayerData.sInfo.eTrackedPedProps[iComponent][ePed], eItemRemoval)
#IF IS_DEBUG_BUILD
PRINTLN("SET_STORED_PLAYER_PED_CUTSCENE_VARIATIONS() - Setting stored beard for ", GET_PLAYER_PED_STRING(ePed))
#ENDIF
sItemDetails = GET_PED_COMP_DATA_FOR_ITEM_SP(eModel, COMP_TYPE_BERD, sVariations.eStoredBeard)
sVariations.iDrawableVariation[PED_COMP_BERD] = sItemDetails.iDrawable
sVariations.iTextureVariation[PED_COMP_BERD] = sItemDetails.iTexture
bBeardForced = TRUE
ENDIF
#endif
#endif
ENDIF
ENDREPEAT
// Set any forced hair or beard requisites
IF bBeardForced OR bHairForced
#if USE_CLF_DLC
PED_COMP_NAME_ENUM eBeard = g_savedGlobalsClifford.sPlayerData.sInfo.eTrackedPedComp[PED_COMP_BERD][ePed]
PED_COMP_NAME_ENUM eHair = g_savedGlobalsClifford.sPlayerData.sInfo.eTrackedPedComp[PED_COMP_HAIR][ePed]
#endif
#if USE_NRM_DLC
PED_COMP_NAME_ENUM eBeard = g_savedGlobalsnorman.sPlayerData.sInfo.eTrackedPedComp[PED_COMP_BERD][ePed]
PED_COMP_NAME_ENUM eHair = g_savedGlobalsnorman.sPlayerData.sInfo.eTrackedPedComp[PED_COMP_HAIR][ePed]
#endif
#if not USE_CLF_DLC
#if not USE_NRM_DLC
PED_COMP_NAME_ENUM eBeard = g_savedGlobals.sPlayerData.sInfo.eTrackedPedComp[PED_COMP_BERD][ePed]
PED_COMP_NAME_ENUM eHair = g_savedGlobals.sPlayerData.sInfo.eTrackedPedComp[PED_COMP_HAIR][ePed]
#endif
#endif
PED_COMP_NAME_ENUM eRequisite = GET_HEAD_REQUISITE_SP(eModel, eHair, eBeard)
IF eRequisite != DUMMY_PED_COMP
#IF IS_DEBUG_BUILD
PRINTLN("SET_STORED_PLAYER_PED_CUTSCENE_VARIATIONS() - Forcing requisite head for ", GET_PLAYER_PED_STRING(ePed))
#ENDIF
sItemDetails = GET_PED_COMP_DATA_FOR_ITEM_SP(eModel, COMP_TYPE_HEAD, eRequisite)
sVariations.iDrawableVariation[PED_COMP_HEAD] = sItemDetails.iDrawable
sVariations.iTextureVariation[PED_COMP_HEAD] = sItemDetails.iTexture
ENDIF
ENDIF
// Now add to the cutscene
PRINTLN("SET_STORED_PLAYER_PED_CUTSCENE_VARIATIONS() - Setting cutscene variations for ", GET_PLAYER_PED_STRING(ePed), " using stored variations")
REPEAT NUM_PED_COMPONENTS iComponent
SET_CUTSCENE_PED_COMPONENT_VARIATION(sSceneHandle, INT_TO_ENUM(PED_COMPONENT, iComponent), sVariations.iDrawableVariation[iComponent], sVariations.iTextureVariation[iComponent], GET_PLAYER_PED_MODEL(ePed))
ENDREPEAT
REPEAT NUM_PLAYER_PED_PROPS iComponent
IF g_sLastStoredPlayerPedClothes[ePed].iPropIndex[iComponent] = -1
OR g_sLastStoredPlayerPedClothes[ePed].iPropIndex[iComponent] = 255
SET_CUTSCENE_PED_PROP_VARIATION(sSceneHandle, INT_TO_ENUM(PED_PROP_POSITION, iComponent), -1, 0, GET_PLAYER_PED_MODEL(ePed))
ELSE
SET_CUTSCENE_PED_PROP_VARIATION(sSceneHandle, INT_TO_ENUM(PED_PROP_POSITION, iComponent), sVariations.iPropIndex[iComponent], sVariations.iPropTexture[iComponent], GET_PLAYER_PED_MODEL(ePed))
ENDIF
ENDREPEAT
SET_FLOW_OUTFIT_REQUIREMENTS_FOR_CUTSCENE_HANDLE(sSceneHandle, ePed)
ENDPROC
/// PURPOSE: Sets the current stored varaitions to be used in the cutscene for the given player ped/scene handle
PROC SET_CURRENT_PLAYER_PED_CUTSCENE_VARIATIONS(enumCharacterList ePed, STRING sSceneHandle, COMPONENT_BLOCK_FLAGS eCompBlocks = CBF_ALL)
IF NOT IS_PLAYER_PED_PLAYABLE(ePed)
OR IS_PED_INJURED(PLAYER_PED_ID())
EXIT
ENDIF
INT iComponent
PED_VARIATION_STRUCT sVariations
// If this is the player, use current variations
IF ePed = GET_CURRENT_PLAYER_PED_ENUM()
IF g_iFlowBitsetBlockPlayerCutsceneVariations[ePed] = 0
PRINTLN("SET_STORED_PLAYER_PED_CUTSCENE_VARIATIONS() - Setting cutscene variations for ", GET_PLAYER_PED_STRING(ePed), " using player ped index.")
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE(sSceneHandle, PLAYER_PED_ID(), GET_ENTITY_MODEL(PLAYER_PED_ID()))
ELSE
PRINTLN("SET_STORED_PLAYER_PED_CUTSCENE_VARIATIONS() - Setting cutscene variations for ", GET_PLAYER_PED_STRING(ePed), " using player ped index with some blocked components.")
GET_PED_VARIATIONS_FOR_CUTSCENE(PLAYER_PED_ID(), sVariations, eCompBlocks)
REPEAT NUM_PED_COMPONENTS iComponent
IF NOT IS_BIT_SET(g_iFlowBitsetBlockPlayerCutsceneVariations[ePed], iComponent)
PRINTLN("SET_CURRENT_PLAYER_PED_CUTSCENE_VARIATIONS() - Component ", iComponent, " passed to cutscene from current player ped data.")
SET_CUTSCENE_PED_COMPONENT_VARIATION(sSceneHandle, INT_TO_ENUM(PED_COMPONENT, iComponent), sVariations.iDrawableVariation[iComponent], sVariations.iTextureVariation[iComponent], GET_PLAYER_PED_MODEL(ePed))
#IF IS_DEBUG_BUILD
ELSE
PRINTLN("SET_CURRENT_PLAYER_PED_CUTSCENE_VARIATIONS() - Component ", iComponent, " blocked.")
#ENDIF
ENDIF
ENDREPEAT
REPEAT NUM_PLAYER_PED_PROPS iComponent
IF NOT IS_BIT_SET(g_iFlowBitsetBlockPlayerCutsceneVariations[ePed], NUM_PED_COMPONENTS + iComponent)
IF sVariations.iPropIndex[iComponent] = -1
OR sVariations.iPropIndex[iComponent] = 255
PRINTLN("SET_CURRENT_PLAYER_PED_CUTSCENE_VARIATIONS() - Prop ", iComponent, " passed to cutscene from current player ped data. (-1)")
SET_CUTSCENE_PED_PROP_VARIATION(sSceneHandle, INT_TO_ENUM(PED_PROP_POSITION, iComponent), -1, 0, GET_PLAYER_PED_MODEL(ePed))
ELSE
PRINTLN("SET_CURRENT_PLAYER_PED_CUTSCENE_VARIATIONS() - Prop ", iComponent, " passed to cutscene from current player ped data.")
SET_CUTSCENE_PED_PROP_VARIATION(sSceneHandle, INT_TO_ENUM(PED_PROP_POSITION, iComponent), sVariations.iPropIndex[iComponent], sVariations.iPropTexture[iComponent], GET_PLAYER_PED_MODEL(ePed))
ENDIF
#IF IS_DEBUG_BUILD
ELSE
PRINTLN("SET_CURRENT_PLAYER_PED_CUTSCENE_VARIATIONS() - Prop ", iComponent, " blocked.")
#ENDIF
ENDIF
ENDREPEAT
ENDIF
// Otherwise use stored ped or stored variations
ELSE
INT iPed = 0
BOOL bPedUsed = FALSE
WHILE iPed < NUM_PLAYER_PED_IDS AND bPedUsed = FALSE
IF DOES_ENTITY_EXIST(g_piCreatedPlayerPedIDs[iPed])
IF NOT IS_PED_INJURED(g_piCreatedPlayerPedIDs[iPed])
AND GET_ENTITY_MODEL(g_piCreatedPlayerPedIDs[iPed]) = GET_PLAYER_PED_MODEL(ePed)
IF g_iFlowBitsetBlockPlayerCutsceneVariations[ePed] = 0
PRINTLN("SET_CURRENT_PLAYER_PED_CUTSCENE_VARIATIONS() - Setting cutscene variations for ", GET_PLAYER_PED_STRING(ePed), " using stored ped index.")
SET_CUTSCENE_PED_COMPONENT_VARIATION_FROM_PED_SAFE(sSceneHandle, g_piCreatedPlayerPedIDs[iPed], GET_ENTITY_MODEL(g_piCreatedPlayerPedIDs[iPed]))
ELSE
PRINTLN("SET_CURRENT_PLAYER_PED_CUTSCENE_VARIATIONS() - Setting cutscene variations for ", GET_PLAYER_PED_STRING(ePed), " using stored ped index with some components blocked.")
GET_PED_VARIATIONS_FOR_CUTSCENE(g_piCreatedPlayerPedIDs[iPed], sVariations, eCompBlocks)
REPEAT NUM_PED_COMPONENTS iComponent
IF NOT IS_BIT_SET(g_iFlowBitsetBlockPlayerCutsceneVariations[ePed], iComponent)
PRINTLN("SET_CURRENT_PLAYER_PED_CUTSCENE_VARIATIONS() - Component ", iComponent, " passed to cutscene from stored player data.")
SET_CUTSCENE_PED_COMPONENT_VARIATION(sSceneHandle, INT_TO_ENUM(PED_COMPONENT, iComponent), sVariations.iDrawableVariation[iComponent], sVariations.iTextureVariation[iComponent], GET_PLAYER_PED_MODEL(ePed))
#IF IS_DEBUG_BUILD
ELSE
PRINTLN("SET_CURRENT_PLAYER_PED_CUTSCENE_VARIATIONS() - Component ", iComponent, " blocked.")
#ENDIF
ENDIF
ENDREPEAT
REPEAT NUM_PLAYER_PED_PROPS iComponent
IF NOT IS_BIT_SET(g_iFlowBitsetBlockPlayerCutsceneVariations[ePed], NUM_PED_COMPONENTS + iComponent)
IF sVariations.iPropIndex[iComponent] = -1
OR sVariations.iPropIndex[iComponent] = 255
PRINTLN("SET_CURRENT_PLAYER_PED_CUTSCENE_VARIATIONS() - Prop ", iComponent, " passed to cutscene from stored player data. (-1)")
SET_CUTSCENE_PED_PROP_VARIATION(sSceneHandle, INT_TO_ENUM(PED_PROP_POSITION, iComponent), -1, 0, GET_PLAYER_PED_MODEL(ePed))
ELSE
PRINTLN("SET_CURRENT_PLAYER_PED_CUTSCENE_VARIATIONS() - Prop ", iComponent, " passed to cutscene from stored player data.")
SET_CUTSCENE_PED_PROP_VARIATION(sSceneHandle, INT_TO_ENUM(PED_PROP_POSITION, iComponent), sVariations.iPropIndex[iComponent], sVariations.iPropTexture[iComponent], GET_PLAYER_PED_MODEL(ePed))
ENDIF
#IF IS_DEBUG_BUILD
ELSE
PRINTLN("SET_CURRENT_PLAYER_PED_CUTSCENE_VARIATIONS() - Prop ", iComponent, " blocked.")
#ENDIF
ENDIF
ENDREPEAT
ENDIF
bPedUsed = TRUE
ENDIF
ENDIF
iPed++
ENDWHILE
IF NOT bPedUsed
PRINTLN("SET_CURRENT_PLAYER_PED_CUTSCENE_VARIATIONS() - Setting cutscene variation for ", GET_PLAYER_PED_STRING(ePed), " using stored variations.")
REPEAT NUM_PED_COMPONENTS iComponent
IF NOT IS_BIT_SET(g_iFlowBitsetBlockPlayerCutsceneVariations[ePed], iComponent)
SET_CUTSCENE_PED_COMPONENT_VARIATION(sSceneHandle, INT_TO_ENUM(PED_COMPONENT, iComponent), g_sLastStoredPlayerPedClothes[ePed].iDrawableVariation[iComponent], g_sLastStoredPlayerPedClothes[ePed].iTextureVariation[iComponent], GET_PLAYER_PED_MODEL(ePed))
ELSE
PRINTLN("SET_CURRENT_PLAYER_PED_CUTSCENE_VARIATIONS() - Cutscene variation blocked for component ", iComponent, ".")
ENDIF
ENDREPEAT
REPEAT NUM_PLAYER_PED_PROPS iComponent
IF g_sLastStoredPlayerPedClothes[ePed].iPropIndex[iComponent] = -1
OR g_sLastStoredPlayerPedClothes[ePed].iPropIndex[iComponent] = 255
// Don't bother setting this..
SET_CUTSCENE_PED_PROP_VARIATION(sSceneHandle, INT_TO_ENUM(PED_PROP_POSITION, iComponent), -1, 0, GET_PLAYER_PED_MODEL(ePed))
ELSE
IF NOT IS_BIT_SET(g_iFlowBitsetBlockPlayerCutsceneVariations[ePed], NUM_PED_COMPONENTS + iComponent)
SET_CUTSCENE_PED_PROP_VARIATION(sSceneHandle, INT_TO_ENUM(PED_PROP_POSITION, iComponent), g_sLastStoredPlayerPedClothes[ePed].iPropIndex[iComponent], g_sLastStoredPlayerPedClothes[ePed].iPropTexture[iComponent], GET_PLAYER_PED_MODEL(ePed))
ELSE
PRINTLN("SET_CURRENT_PLAYER_PED_CUTSCENE_VARIATIONS() - Cutscene prop blocked for prop position ", iComponent, ".")
ENDIF
ENDIF
ENDREPEAT
SET_FLOW_OUTFIT_REQUIREMENTS_FOR_CUTSCENE_HANDLE(sSceneHandle, ePed)
ENDIF
ENDIF
ENDPROC
/// PURPOSE:
/// Checks if player is in control of Trevor and has activated Trevor's special ability.
/// RETURNS:
/// TREU if player has activated Trevor's special ability, FALSE if otherwise.
FUNC BOOL IS_PLAYER_USING_TREVORS_SPECIAL_ABILITY()
IF IS_PLAYER_PLAYING(PLAYER_ID())
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
IF GET_CURRENT_PLAYER_PED_ENUM() = CHAR_TREVOR
SET_PED_RESET_FLAG(PLAYER_PED_ID(), PRF_ForceCombatTaunt, TRUE)
IF IS_SPECIAL_ABILITY_ACTIVE(PLAYER_ID())
RETURN TRUE
ENDIF
ENDIF
ENDIF
ENDIF
RETURN FALSE
ENDFUNC
/// PURPOSE:
/// Sets up the player ped for an on mission lead in. This only needs to be called once, use CLEAR_BLOCKED_PLAYER_FOR_LEAD_IN() to reset.
/// Call UPDATE_BLOCKED_PLAYER_FOR_LEAD_IN() each frame while doing the lead in.
PROC BLOCK_PLAYER_FOR_LEAD_IN(BOOL bForceUnarmed)
//Set player proofs.
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
SET_ENTITY_PROOFS(PLAYER_PED_ID(), TRUE, TRUE, TRUE, TRUE, TRUE)
SET_PED_CONFIG_FLAG(PLAYER_PED_ID(), PCF_CanBeArrested, FALSE)
SET_ENTITY_INVINCIBLE(PLAYER_PED_ID(), TRUE)
SET_PED_STEALTH_MOVEMENT(PLAYER_PED_ID(), FALSE)
IF bForceUnarmed
SET_CURRENT_PED_WEAPON(PLAYER_PED_ID(), WEAPONTYPE_UNARMED, FALSE)
ENDIF
REMOVE_PED_HELMET(PLAYER_PED_ID(), FALSE)
ENDIF
//Clear wanted level and disable it from returning during the lock in
IF IS_PLAYER_PLAYING(PLAYER_ID())
CLEAR_PLAYER_WANTED_LEVEL(PLAYER_ID())
ENDIF
SET_MAX_WANTED_LEVEL(0)
SET_WANTED_LEVEL_MULTIPLIER(0.0)
ENDPROC
/// PURPOSE:
/// Clears any flags set when you started blocking.
PROC CLEAR_BLOCKED_PLAYER_FOR_LEAD_IN()
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
SET_ENTITY_PROOFS(PLAYER_PED_ID(), FALSE, FALSE, FALSE, FALSE, FALSE)
SET_PED_CONFIG_FLAG(PLAYER_PED_ID(), PCF_CanBeArrested, TRUE)
SET_ENTITY_INVINCIBLE(PLAYER_PED_ID(), FALSE)
ENDIF
INT i
REPEAT NUM_PLAYER_PED_IDS i
IF DOES_ENTITY_EXIST(g_piCreatedPlayerPedIDs[i])
IF NOT IS_ENTITY_DEAD(g_piCreatedPlayerPedIDs[i])
SET_ENTITY_PROOFS(g_piCreatedPlayerPedIDs[i], FALSE, FALSE, FALSE, FALSE, FALSE)
SET_ENTITY_INVINCIBLE(g_piCreatedPlayerPedIDs[i], FALSE)
ENDIF
ENDIF
ENDREPEAT
//Only reset wanted multipliers if a mission hasn't started.
//If a mission has started then the wanted settings will have been
//reset in the start procedures already. -BenR
IF g_OnMissionState != MISSION_TYPE_STORY
AND g_OnMissionState != MISSION_TYPE_STORY_FRIENDS
AND g_OnMissionState != MISSION_TYPE_STORY_PREP
SET_MAX_WANTED_LEVEL(5)
SET_WANTED_LEVEL_MULTIPLIER(1.0)
ENDIF
ENDPROC
/// PURPOSE:
/// Blocks various controls and functions of the player that need to be blocked on a per frame basis.
/// Must be called every frame. Running is disabled by default extra flag for speacial case B*1402721
PROC UPDATE_BLOCKED_PLAYER_FOR_LEAD_IN(BOOL bDisableWeaponSwap, BOOL bEnableRun = FALSE)
IF NOT bEnableRun
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SPRINT)
ENDIF
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_AIM)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_ATTACK)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_ATTACK2)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK_HEAVY)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_MELEE_ATTACK_LIGHT)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_JUMP)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_COVER)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_ENTER)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_DETONATE)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_DUCK)
IF bDisableWeaponSwap
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_SELECT_WEAPON)
ENDIF
IF NOT IS_ENTITY_DEAD(PLAYER_PED_ID())
IF bEnableRun
SET_PED_MAX_MOVE_BLEND_RATIO(PLAYER_PED_ID(), PEDMOVE_RUN)
ELSE
SET_PED_MAX_MOVE_BLEND_RATIO(PLAYER_PED_ID(), PEDMOVE_WALK)
ENDIF
SET_PED_RESET_FLAG(PLAYER_PED_ID(), PRF_DisablePlayerAutoVaulting, true)
ENDIF
IF IS_PLAYER_WANTED_LEVEL_GREATER(PLAYER_ID(), 0)
CLEAR_PLAYER_WANTED_LEVEL(PLAYER_ID())
ENDIF
ENDPROC
/// PURPOSE:
/// Blocks all vehicle controls of the player.
/// Must be called every frame.
PROC DISABLE_PLAYER_VEHICLE_CONTROLS_THIS_FRAME()
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_ACCELERATE)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_BRAKE)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_HANDBRAKE)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_DUCK)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_MOVE_LR)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_MOVE_UD)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_EXIT)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_CIN_CAM)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_AIM)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_ATTACK)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_ATTACK2)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_HEADLIGHT)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_HORN)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_NEXT_RADIO)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_PREV_RADIO)
ENDPROC
/// PURPOSE:
/// Blocks vehicle controls of the player that are used for driving a vehicle.
/// Must be called every frame.
PROC DISABLE_PLAYER_VEHICLE_DRIVING_CONTROLS_THIS_FRAME()
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_ACCELERATE)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_BRAKE)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_HANDBRAKE)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_DUCK)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_MOVE_LR)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_MOVE_UD)
ENDPROC
/// PURPOSE:
/// Blocks vehicle controls of the player that are not used for driving.
/// Must be called every frame.
PROC DISABLE_PLAYER_VEHICLE_MISC_CONTROLS_THIS_FRAME()
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_EXIT)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_CIN_CAM)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_AIM)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_ATTACK)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_ATTACK2)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_HEADLIGHT)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_HORN)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_NEXT_RADIO)
DISABLE_CONTROL_ACTION(PLAYER_CONTROL, INPUT_VEH_PREV_RADIO)
ENDPROC
/// PURPOSE:
/// Removes headset from all SP characters
/// Called when player passes a mission, or rejects a replay (or accepts prep mission replay)
PROC REMOVE_ALL_HEADSETS()
INT iPed
PED_INDEX mPed
PED_COMP_NAME_ENUM eHeadSet
enumCharacterList ePed
FOR iPed = 0 TO NUM_PLAYER_PED_IDS-1
mPed = g_piCreatedPlayerPedIDs[iPed]
IF DOES_ENTITY_EXIST(mPed)
AND NOT IS_PED_INJURED(mPed)
ePed = GET_PLAYER_PED_ENUM(mPed)
eHeadSet = DUMMY_PED_COMP
SWITCH ePed
CASE CHAR_MICHAEL
eHeadSet = PROPS_P0_HEADSET
BREAK
CASE CHAR_FRANKLIN
eHeadSet = PROPS_P1_HEADSET
BREAK
CASE CHAR_TREVOR
eHeadSet = PROPS_P2_HEADSET
BREAK
ENDSWITCH
IF eHeadSet != DUMMY_PED_COMP
IF IS_PED_COMP_ITEM_CURRENT_SP(mPed, COMP_TYPE_PROPS, eHeadSet)
// head set equipped, remove it
REMOVE_PED_COMP_ITEM_SP(mPed, COMP_TYPE_PROPS, eHeadSet)
ENDIF
#if USE_CLF_DLC
// update saved variations, so headset is fully removed
IF g_savedGlobalsClifford.sPlayerData.sInfo.sVariations[ePed].iPropIndex[ANCHOR_EARS] = ENUM_TO_INT(eHeadSet)
g_savedGlobalsClifford.sPlayerData.sInfo.sVariations[ePed].iPropIndex[ANCHOR_EARS] = -1
ENDIF
#endif
#if USE_NRM_DLC
// update saved variations, so headset is fully removed
IF g_savedGlobalsnorman.sPlayerData.sInfo.sVariations[ePed].iPropIndex[ANCHOR_EARS] = ENUM_TO_INT(eHeadSet)
g_savedGlobalsnorman.sPlayerData.sInfo.sVariations[ePed].iPropIndex[ANCHOR_EARS] = -1
ENDIF
#endif
#if not USE_CLF_DLC
#if not USE_NRM_DLC
// update saved variations, so headset is fully removed
IF g_savedGlobals.sPlayerData.sInfo.sVariations[ePed].iPropIndex[ANCHOR_EARS] = ENUM_TO_INT(eHeadSet)
g_savedGlobals.sPlayerData.sInfo.sVariations[ePed].iPropIndex[ANCHOR_EARS] = -1
ENDIF
#endif
#endif
ENDIF
ENDIF
ENDFOR
ENDPROC
PROC SETUP_PLAYER_PED_DEFAULTS_FOR_MP(PED_INDEX ped)
SWITCH GET_ENTITY_MODEL(ped)
// MICHAEL
CASE PLAYER_ZERO
BREAK
// FRANKLIN
CASE PLAYER_ONE
BREAK
// TREVOR
CASE PLAYER_TWO
ADD_PED_DECORATION_FROM_HASHES( ped, HASH("singleplayer_overlays"), HASH("tp_001") )
BREAK
ENDSWITCH
ENDPROC
/// Patch the players weapons if the DLC weapon data changes.
PROC PATCH_DLC_WEAPON_LAYOUT(PED_WEAPONS_STRUCT &sTempWeapons, scrShopWeaponData &weaponData)
INT iWeaponCount = GET_NUM_DLC_WEAPONS()
INT iWeapon
INT iCharIndex
INT iWeaponSlot
INT iWeaponSlotToAdd
BOOL bSearchingForSlot
REPEAT 3 iCharIndex
PRINTLN("PATCHING DLC WEAPON LAYOUT called by ",GET_THIS_SCRIPT_NAME()," - charID=", iCharIndex)
sTempWeapons = g_savedGlobals.sPlayerData.sInfo.sWeapons[iCharIndex]
iWeaponSlotToAdd = 0
REPEAT iWeaponCount iWeapon
IF iWeaponSlotToAdd < iWeaponCount
AND GET_DLC_WEAPON_DATA(iWeapon, weaponData)
AND NOT IS_CONTENT_ITEM_LOCKED(weaponData.m_lockHash)
AND NOT IS_DLC_WEAPON_LOCKED_BY_SCRIPT(INT_TO_ENUM(WEAPON_TYPE, weaponData.m_nameHash))
// Find out if we already had this weapon in the array
bSearchingForSlot = TRUE
iWeaponSlot = 0
WHILE bSearchingForSlot AND iWeaponSlot < COUNT_OF(sTempWeapons.sDLCWeaponInfo)
IF sTempWeapons.sDLCWeaponInfo[iWeaponSlot].eWeaponType = INT_TO_ENUM(WEAPON_TYPE, weaponData.m_nameHash)
// Player already had this DLC weapon so bung it into the new slot
g_savedGlobals.sPlayerData.sInfo.sWeapons[iCharIndex].sDLCWeaponInfo[iWeaponSlotToAdd] = sTempWeapons.sDLCWeaponInfo[iWeaponSlot]
PRINTLN("...slot ", iWeaponSlotToAdd, " = ", weaponData.Label, " with ", g_savedGlobals.sPlayerData.sInfo.sWeapons[iCharIndex].sDLCWeaponInfo[iWeaponSlotToAdd].iAmmoCount, " ammo")
iWeaponSlotToAdd++
bSearchingForSlot = FALSE
ENDIF
iWeaponSlot++
ENDWHILE
// If we didn't find this weapon, give it to the player with 2 clips.
IF bSearchingForSlot
AND (IS_XBOX360_VERSION() OR IS_PS3_VERSION()) // Only do this on current gen.
g_savedGlobals.sPlayerData.sInfo.sWeapons[iCharIndex].sDLCWeaponInfo[iWeaponSlotToAdd].iAmmoCount = weaponData.DefaultClipSize*2
g_savedGlobals.sPlayerData.sInfo.sWeapons[iCharIndex].sDLCWeaponInfo[iWeaponSlotToAdd].eWeaponType = INT_TO_ENUM(WEAPON_TYPE, weaponData.m_nameHash)
g_savedGlobals.sPlayerData.sInfo.sWeapons[iCharIndex].sDLCWeaponInfo[iWeaponSlotToAdd].iModsAsBitfield = 0
g_savedGlobals.sPlayerData.sInfo.sWeapons[iCharIndex].sDLCWeaponInfo[iWeaponSlotToAdd].iTint = 0
g_savedGlobals.sPlayerData.sInfo.sWeapons[iCharIndex].sDLCWeaponInfo[iWeaponSlotToAdd].iCamo = 0
PRINTLN("...slot ", iWeaponSlotToAdd, " = ", weaponData.Label, " with ", g_savedGlobals.sPlayerData.sInfo.sWeapons[iCharIndex].sDLCWeaponInfo[iWeaponSlotToAdd].iAmmoCount, " ammo *new*")
iWeaponSlotToAdd++
ENDIF
ENDIF
ENDREPEAT
// No clear out the remaining slots
FOR iWeapon = iWeaponSlotToAdd TO NUMBER_OF_DLC_WEAPONS-1
g_savedGlobals.sPlayerData.sInfo.sWeapons[iCharIndex].sDLCWeaponInfo[iWeapon].eWeaponType = WEAPONTYPE_INVALID
g_savedGlobals.sPlayerData.sInfo.sWeapons[iCharIndex].sDLCWeaponInfo[iWeapon].iModsAsBitfield = 0
g_savedGlobals.sPlayerData.sInfo.sWeapons[iCharIndex].sDLCWeaponInfo[iWeapon].iTint = 0
g_savedGlobals.sPlayerData.sInfo.sWeapons[iCharIndex].sDLCWeaponInfo[iWeapon].iCamo = 0
PRINTLN("...slot ", iWeapon, " = empty")
ENDFOR
//Push the new weapon data out to the player character.
IF GET_CURRENT_PLAYER_PED_INT() = iCharIndex
RESTORE_PLAYER_PED_WEAPONS(PLAYER_PED_ID())
ENDIF
ENDREPEAT
ENDPROC