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

657 lines
23 KiB
Python
Executable File

//////////////////////////////////////////////////////////////////////////////////
// //
// SCRIPT NAME : component_checker.sc //
// AUTHOR : Kenneth Ross //
// DESCRIPTION : Used to cycle through the various component //
// variations and print out the information for use //
// with ped_components_data.sch. //
// //
//////////////////////////////////////////////////////////////////////////////////
// Include the standard headers (which also ensures the correct #DEFINEs are recognised)
USING "rage_builtins.sch"
USING "globals.sch"
// Do nothing in release mode
#IF IS_FINAL_BUILD
SCRIPT
ENDSCRIPT
#ENDIF
// Only include in debug mode
#IF IS_DEBUG_BUILD
USING "commands_script.sch"
USING "commands_streaming.sch"
USING "script_player.sch"
USING "cellphone_public.sch"
USING "ped_component_public.sch"
CONST_INT NUM_PED_PROP_POSITIONS 9
CONST_INT MAX_PROP_INDEXES 30
ENUM STAGE_CONTROL_ENUM
STAGE_INIT = 0,
STAGE_COMP_CHECKER,
STAGE_PROP_CHECKER,
STAGE_CLEANUP
ENDENUM
STAGE_CONTROL_ENUM eStage = STAGE_INIT
PED_COMPONENT eCompType = PED_COMP_HEAD
PED_PROP_POSITION ePropPos = ANCHOR_HEAD
MODEL_NAMES ePedModel
INT iTexture[NUM_PED_COMPONENTS]
INT iDrawable[NUM_PED_COMPONENTS]
INT iPropIndex, iTexIndex
BOOL bUpdateModel, bOutputAllInfo, bOutputVariations, bOutputCurrent, bOutputValidationCheck
TEXT_WIDGET_ID widgetID[2]
PROC SETUP_WIDGETS()
START_WIDGET_GROUP("Component Checker")
widgetID[0] = ADD_TEXT_WIDGET("Model name")
widgetID[1] = ADD_TEXT_WIDGET("Ped code")
ADD_WIDGET_BOOL("Update model", bUpdateModel)
ADD_WIDGET_BOOL("Output all ped component data", bOutputAllInfo)
ADD_WIDGET_BOOL("Output current ped component data", bOutputCurrent)
ADD_WIDGET_BOOL("Output component variations", bOutputVariations)
ADD_WIDGET_BOOL("Output validation check", bOutputValidationCheck)
STOP_WIDGET_GROUP()
ENDPROC
PROC RESET_STORED_DATA()
INT i
PED_INDEX pedID = PLAYER_PED_ID()
FOR i = 0 TO NUM_PED_COMPONENTS-1
iTexture[i] = GET_PED_TEXTURE_VARIATION(pedID, INT_TO_ENUM(PED_COMPONENT, i))
iDrawable[i] = GET_PED_DRAWABLE_VARIATION(pedID, INT_TO_ENUM(PED_COMPONENT, i))
ENDFOR
iPropIndex = 0
iTexIndex = 0
eCompType = PED_COMP_HEAD
ePropPos = ANCHOR_HEAD
ENDPROC
PROC OUTPUT_COMPONENT_VARIATIONS()
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
INT i
OPEN_DEBUG_FILE()
SAVE_NEWLINE_TO_DEBUG_FILE()
SAVE_NEWLINE_TO_DEBUG_FILE()
SAVE_STRING_TO_DEBUG_FILE("MODEL ")SAVE_INT_TO_DEBUG_FILE(ENUM_TO_INT(ePedModel))
FOR i = 0 TO NUM_PED_COMPONENTS-1
SAVE_NEWLINE_TO_DEBUG_FILE()
SAVE_STRING_TO_DEBUG_FILE("SET_PED_COMPONENT_VARIATION(PLAYER_PED_ID(), ")SAVE_STRING_TO_DEBUG_FILE(GET_COMP_VARIATION_TYPE_STRING(INT_TO_ENUM(PED_COMPONENT, i)))SAVE_STRING_TO_DEBUG_FILE(", ")SAVE_INT_TO_DEBUG_FILE(iDrawable[i]) SAVE_STRING_TO_DEBUG_FILE(", ")SAVE_INT_TO_DEBUG_FILE(iTexture[i])SAVE_STRING_TO_DEBUG_FILE(")")
ENDFOR
SAVE_NEWLINE_TO_DEBUG_FILE()
FOR i = 0 TO NUM_PED_PROP_POSITIONS-1
SAVE_NEWLINE_TO_DEBUG_FILE()
IF GET_PED_PROP_INDEX(PLAYER_PED_ID(), INT_TO_ENUM(PED_PROP_POSITION, i)) = -1
SAVE_STRING_TO_DEBUG_FILE("CLEAR_PED_PROP(PLAYER_PED_ID(), ")SAVE_STRING_TO_DEBUG_FILE(GET_PROP_POSITION_STRING(INT_TO_ENUM(PED_PROP_POSITION, i)))SAVE_STRING_TO_DEBUG_FILE(")")
ELSE
SAVE_STRING_TO_DEBUG_FILE("SET_PED_PROP_INDEX(PLAYER_PED_ID(), ")SAVE_STRING_TO_DEBUG_FILE(GET_PROP_POSITION_STRING(INT_TO_ENUM(PED_PROP_POSITION, i)))SAVE_STRING_TO_DEBUG_FILE(", ")SAVE_INT_TO_DEBUG_FILE(GET_PED_PROP_INDEX(PLAYER_PED_ID(), INT_TO_ENUM(PED_PROP_POSITION, i)))SAVE_STRING_TO_DEBUG_FILE(")")
ENDIF
ENDFOR
SAVE_NEWLINE_TO_DEBUG_FILE()
SAVE_NEWLINE_TO_DEBUG_FILE()
CLOSE_DEBUG_FILE()
ENDIF
ENDPROC
PROC OUTPUT_CURRENT_COMPONENT_INFO()
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
// INT iMaxDraw, iMaxTex
INT iType // , iDraw, iTex
INT iItem
OPEN_DEBUG_FILE()
//loop for each comp type
FOR iType = 0 TO NUMBER_OF_PED_COMP_TYPES-1
IF INT_TO_ENUM(PED_COMP_TYPE_ENUM, iType) <> COMP_TYPE_OUTFIT
AND INT_TO_ENUM(PED_COMP_TYPE_ENUM, iType) <> COMP_TYPE_PROPS
AND INT_TO_ENUM(PED_COMP_TYPE_ENUM, iType) <> COMP_TYPE_PROPGROUP
SAVE_NEWLINE_TO_DEBUG_FILE()
SAVE_STRING_TO_DEBUG_FILE("CASE ")SAVE_STRING_TO_DEBUG_FILE(GET_PED_COMP_NAME_STRING(INT_TO_ENUM(PED_COMP_TYPE_ENUM, iType)))SAVE_STRING_TO_DEBUG_FILE("_")SAVE_STRING_TO_DEBUG_FILE(GET_CONTENTS_OF_TEXT_WIDGET(widgetID[1]))SAVE_STRING_TO_DEBUG_FILE("_ITEM")SAVE_INT_TO_DEBUG_FILE(iItem)SAVE_STRING_TO_DEBUG_FILE(" FILL_PED_COMPONENT_ITEM_DATA(sData, eType, eItem, \"NO_LABEL\", ")SAVE_INT_TO_DEBUG_FILE(GET_PED_DRAWABLE_VARIATION(PLAYER_PED_ID(), GET_PED_COMPONENT_FROM_TYPE(INT_TO_ENUM(PED_COMP_TYPE_ENUM, iType))))SAVE_STRING_TO_DEBUG_FILE(", ")SAVE_INT_TO_DEBUG_FILE(GET_PED_TEXTURE_VARIATION(PLAYER_PED_ID(), GET_PED_COMPONENT_FROM_TYPE(INT_TO_ENUM(PED_COMP_TYPE_ENUM, iType))))SAVE_STRING_TO_DEBUG_FILE(", cost, !bOutfitOnly, !bCanToggle, ANCHOR_HEAD, COMP_STYLE_SENSIBLE) BREAK")
ELIF INT_TO_ENUM(PED_COMP_TYPE_ENUM, iType) = COMP_TYPE_PROPS
INT i
FOR i = 0 TO NUM_PED_PROP_POSITIONS-1
IF GET_PED_PROP_INDEX(PLAYER_PED_ID(), INT_TO_ENUM(PED_PROP_POSITION, i)) <> -1
SAVE_NEWLINE_TO_DEBUG_FILE()
SAVE_STRING_TO_DEBUG_FILE("CASE ")SAVE_STRING_TO_DEBUG_FILE(GET_PED_COMP_NAME_STRING(INT_TO_ENUM(PED_COMP_TYPE_ENUM, iType)))SAVE_STRING_TO_DEBUG_FILE("_")SAVE_STRING_TO_DEBUG_FILE(GET_CONTENTS_OF_TEXT_WIDGET(widgetID[1]))SAVE_STRING_TO_DEBUG_FILE("_ITEM")SAVE_INT_TO_DEBUG_FILE(iItem)SAVE_STRING_TO_DEBUG_FILE(" FILL_PED_COMPONENT_ITEM_DATA(sData, eType, eItem, \"NO_LABEL\", ")SAVE_INT_TO_DEBUG_FILE(GET_PED_PROP_INDEX(PLAYER_PED_ID(), INT_TO_ENUM(PED_PROP_POSITION, i)))SAVE_STRING_TO_DEBUG_FILE(", 0, cost, !bOutfitOnly, !bCanToggle, ")SAVE_STRING_TO_DEBUG_FILE(GET_PROP_POSITION_STRING(INT_TO_ENUM(PED_PROP_POSITION, i)))SAVE_STRING_TO_DEBUG_FILE(", COMP_STYLE_SENSIBLE) BREAK")
ENDIF
ENDFOR
ENDIF
ENDFOR
SAVE_NEWLINE_TO_DEBUG_FILE()
SAVE_NEWLINE_TO_DEBUG_FILE()
CLOSE_DEBUG_FILE()
ENDIF
ENDPROC
PROC OUTPUT_ALL_COMPONENT_INFO()
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
INT iMaxDraw, iMaxTex
INT iType, iDraw, iTex
INT iItem
OPEN_DEBUG_FILE()
SAVE_NEWLINE_TO_DEBUG_FILE()
SAVE_NEWLINE_TO_DEBUG_FILE()
//loop for each comp type
FOR iType = 0 TO NUMBER_OF_PED_COMP_TYPES-1
iItem = 0
IF INT_TO_ENUM(PED_COMP_TYPE_ENUM, iType) <> COMP_TYPE_OUTFIT
AND INT_TO_ENUM(PED_COMP_TYPE_ENUM, iType) <> COMP_TYPE_PROPS
AND INT_TO_ENUM(PED_COMP_TYPE_ENUM, iType) <> COMP_TYPE_PROPGROUP
iMaxDraw = GET_NUMBER_OF_PED_DRAWABLE_VARIATIONS(PLAYER_PED_ID(), GET_PED_COMPONENT_FROM_TYPE(INT_TO_ENUM(PED_COMP_TYPE_ENUM, iType)))
IF iMaxDraw > 0
iMaxDraw--
ENDIF
iItem = 0
// loop for each drawable
FOR iDraw = 0 TO iMaxDraw
iMaxTex = GET_NUMBER_OF_PED_TEXTURE_VARIATIONS(PLAYER_PED_ID(), GET_PED_COMPONENT_FROM_TYPE(INT_TO_ENUM(PED_COMP_TYPE_ENUM, iType)), iDraw)
IF iMaxTex > 0
iMaxTex--
ENDIF
// loop for each texture
FOR iTex = 0 TO iMaxtex
SAVE_NEWLINE_TO_DEBUG_FILE()
SAVE_STRING_TO_DEBUG_FILE(" ")SAVE_STRING_TO_DEBUG_FILE(GET_PED_COMP_NAME_STRING(INT_TO_ENUM(PED_COMP_TYPE_ENUM, iType)))SAVE_STRING_TO_DEBUG_FILE("_")SAVE_STRING_TO_DEBUG_FILE(GET_CONTENTS_OF_TEXT_WIDGET(widgetID[1]))SAVE_STRING_TO_DEBUG_FILE("_")SAVE_INT_TO_DEBUG_FILE(iDraw)SAVE_STRING_TO_DEBUG_FILE("_")SAVE_INT_TO_DEBUG_FILE(iTex)
IF iItem = 0
SAVE_STRING_TO_DEBUG_FILE(" =0,")
ELSE
SAVE_STRING_TO_DEBUG_FILE(" ,")
ENDIF
iItem++
ENDFOR
ENDFOR
ELSE
iItem++
ENDIF
SAVE_NEWLINE_TO_DEBUG_FILE()
ENDFOR
SAVE_NEWLINE_TO_DEBUG_FILE()
SAVE_NEWLINE_TO_DEBUG_FILE()
//loop for each comp type
FOR iType = 0 TO NUMBER_OF_PED_COMP_TYPES-1
SAVE_NEWLINE_TO_DEBUG_FILE()
iItem = 0
IF INT_TO_ENUM(PED_COMP_TYPE_ENUM, iType) <> COMP_TYPE_OUTFIT
AND INT_TO_ENUM(PED_COMP_TYPE_ENUM, iType) <> COMP_TYPE_PROPS
AND INT_TO_ENUM(PED_COMP_TYPE_ENUM, iType) <> COMP_TYPE_PROPGROUP
iMaxDraw = GET_NUMBER_OF_PED_DRAWABLE_VARIATIONS(PLAYER_PED_ID(), GET_PED_COMPONENT_FROM_TYPE(INT_TO_ENUM(PED_COMP_TYPE_ENUM, iType)))
IF iMaxDraw > 0
iMaxDraw--
ENDIF
iItem = 0
// loop for each drawable
FOR iDraw = 0 TO iMaxDraw
iMaxTex = GET_NUMBER_OF_PED_TEXTURE_VARIATIONS(PLAYER_PED_ID(), GET_PED_COMPONENT_FROM_TYPE(INT_TO_ENUM(PED_COMP_TYPE_ENUM, iType)), iDraw)
IF iMaxTex > 0
iMaxTex--
ENDIF
// loop for each texture
FOR iTex = 0 TO iMaxtex
SAVE_NEWLINE_TO_DEBUG_FILE()
SAVE_STRING_TO_DEBUG_FILE(" CASE ")SAVE_STRING_TO_DEBUG_FILE(GET_PED_COMP_NAME_STRING(INT_TO_ENUM(PED_COMP_TYPE_ENUM, iType)))SAVE_STRING_TO_DEBUG_FILE("_")SAVE_STRING_TO_DEBUG_FILE(GET_CONTENTS_OF_TEXT_WIDGET(widgetID[1]))SAVE_STRING_TO_DEBUG_FILE("_")SAVE_INT_TO_DEBUG_FILE(iDraw)SAVE_STRING_TO_DEBUG_FILE("_")SAVE_INT_TO_DEBUG_FILE(iTex)SAVE_STRING_TO_DEBUG_FILE(" tlLabel = \"LABEL_")SAVE_INT_TO_DEBUG_FILE(iDraw)SAVE_STRING_TO_DEBUG_FILE("_")SAVE_INT_TO_DEBUG_FILE(iTex)SAVE_STRING_TO_DEBUG_FILE("\", iDraw = ")SAVE_INT_TO_DEBUG_FILE(iDraw)SAVE_STRING_TO_DEBUG_FILE(" iTex = ")SAVE_INT_TO_DEBUG_FILE(iTex)SAVE_STRING_TO_DEBUG_FILE(" cost = cost BREAK")
iItem++
ENDFOR
ENDFOR
ELSE
SAVE_NEWLINE_TO_DEBUG_FILE()
IF INT_TO_ENUM(PED_COMP_TYPE_ENUM, iType) = COMP_TYPE_OUTFIT
SAVE_STRING_TO_DEBUG_FILE(" CASE ")SAVE_STRING_TO_DEBUG_FILE(GET_PED_COMP_NAME_STRING(INT_TO_ENUM(PED_COMP_TYPE_ENUM, iType)))SAVE_STRING_TO_DEBUG_FILE("_")SAVE_STRING_TO_DEBUG_FILE(GET_CONTENTS_OF_TEXT_WIDGET(widgetID[1]))SAVE_STRING_TO_DEBUG_FILE("_ITEM")SAVE_INT_TO_DEBUG_FILE(iItem)SAVE_STRING_TO_DEBUG_FILE(" FILL_PED_COMPONENT_ITEM_DATA(sData, eType, eItem, \"NO_LABEL\", 0, 0, cost, !bOutfitOnly, !bCanToggle, ANCHOR_HEAD, COMP_STYLE_SENSIBLE) BREAK")
ELSE
SAVE_STRING_TO_DEBUG_FILE(" CASE ")SAVE_STRING_TO_DEBUG_FILE(GET_PED_COMP_NAME_STRING(INT_TO_ENUM(PED_COMP_TYPE_ENUM, iType)))SAVE_STRING_TO_DEBUG_FILE("_")SAVE_STRING_TO_DEBUG_FILE(GET_CONTENTS_OF_TEXT_WIDGET(widgetID[1]))SAVE_STRING_TO_DEBUG_FILE("_ITEM")SAVE_INT_TO_DEBUG_FILE(iItem)SAVE_STRING_TO_DEBUG_FILE(" FILL_PED_COMPONENT_ITEM_DATA(sData, eType, eItem, \"NO_LABEL\", 0, 0, cost, !bOutfitOnly, !bCanToggle, ANCHOR_HEAD, COMP_STYLE_SENSIBLE) BREAK")
ENDIF
iItem++
ENDIF
SAVE_NEWLINE_TO_DEBUG_FILE()
ENDFOR
SAVE_NEWLINE_TO_DEBUG_FILE()
SAVE_NEWLINE_TO_DEBUG_FILE()
CLOSE_DEBUG_FILE()
ENDIF
ENDPROC
PROC UPDATE_INPUT()
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
// Check widgets
IF bUpdateModel
INT iModel = GET_HASH_KEY(GET_CONTENTS_OF_TEXT_WIDGET(widgetID[0]))
IF IS_MODEL_A_PED(INT_TO_ENUM(MODEL_NAMES, iModel))
MODEL_NAMES eModel = INT_TO_ENUM(MODEL_NAMES, iModel)
REQUEST_MODEL(eModel)
WHILE NOT HAS_MODEL_LOADED(eModel)
WAIT(0)
ENDWHILE
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
SET_PLAYER_MODEL(PLAYER_ID(), eModel)
SET_PED_DEFAULT_COMPONENT_VARIATION(PLAYER_PED_ID())
ENDIF
SET_MODEL_AS_NO_LONGER_NEEDED(eModel)
ENDIF
bUpdateModel = FALSE
ENDIF
IF bOutputVariations
OUTPUT_COMPONENT_VARIATIONS()
bOutputVariations = FALSE
ENDIF
IF bOutputAllInfo
OUTPUT_ALL_COMPONENT_INFO()
bOutputAllInfo = FALSE
ENDIF
IF bOutputCurrent
OUTPUT_CURRENT_COMPONENT_INFO()
bOutputCurrent = FALSE
ENDIF
IF bOutputValidationCheck
PRINTNL()
INT iComp, iDraw, iTex, iLen
REPEAT NUM_PED_COMPONENTS iComp
REPEAT GET_NUMBER_OF_PED_DRAWABLE_VARIATIONS(PLAYER_PED_ID(), INT_TO_ENUM(PED_COMPONENT, iComp)) iDraw
REPEAT GET_NUMBER_OF_PED_TEXTURE_VARIATIONS(PLAYER_PED_ID(), INT_TO_ENUM(PED_COMPONENT, iComp), iDraw) iTex
PRINTSTRING("\n")
PRINTSTRING(GET_COMP_VARIATION_TYPE_STRING(INT_TO_ENUM(PED_COMPONENT, iComp)))
iLen = GET_LENGTH_OF_LITERAL_STRING(GET_COMP_VARIATION_TYPE_STRING(INT_TO_ENUM(PED_COMPONENT, iComp)))
WHILE iLen < 20
PRINTSTRING(" ")
iLen++
ENDWHILE
PRINTINT(iDraw)PRINTSTRING(", ")PRINTINT(iTex)
IF IS_PED_COMPONENT_VARIATION_VALID(PLAYER_PED_ID(), eCompType, iDraw, iTex)
PRINTSTRING(" VALID")
ELSE
PRINTSTRING(" INVALID")
ENDIF
ENDREPEAT
ENDREPEAT
ENDREPEAT
PRINTNL()
bOutputValidationCheck = FALSE
ENDIF
// Check model consistency
IF NOT IS_PED_MODEL(PLAYER_PED_ID(), ePedModel)
ePedModel = GET_ENTITY_MODEL(PLAYER_PED_ID())
RESET_STORED_DATA()
ENDIF
// Switch stage
IF IS_BUTTON_JUST_PRESSED(PAD1, SQUARE)
IF eStage = STAGE_PROP_CHECKER
eStage = STAGE_COMP_CHECKER
ELIF eStage = STAGE_COMP_CHECKER
eStage = STAGE_PROP_CHECKER
ENDIF
RESET_STORED_DATA()
ENDIF
// Update prop checker
IF eStage = STAGE_PROP_CHECKER
IF IS_BUTTON_PRESSED(PAD1, LEFTSHOULDER1)
// Switch prop position
IF IS_BUTTON_JUST_PRESSED(PAD1, DPADUP)
IF ENUM_TO_INT(ePropPos) <= 0
ePropPos = INT_TO_ENUM(PED_PROP_POSITION, NUM_PED_PROP_POSITIONS-1)
ELSE
ePropPos = INT_TO_ENUM(PED_PROP_POSITION, ENUM_TO_INT(ePropPos)-1)
ENDIF
ELIF IS_BUTTON_JUST_PRESSED(PAD1, DPADDOWN)
IF ENUM_TO_INT(ePropPos) >= NUM_PED_PROP_POSITIONS-1
ePropPos = INT_TO_ENUM(PED_PROP_POSITION, 0)
ELSE
ePropPos = INT_TO_ENUM(PED_PROP_POSITION, ENUM_TO_INT(ePropPos)+1)
ENDIF
ENDIF
ELSE
// Switch prop index up/down
IF IS_BUTTON_JUST_PRESSED(PAD1, DPADUP)
IF iPropIndex+1 < GET_NUMBER_OF_PED_PROP_DRAWABLE_VARIATIONS(PLAYER_PED_ID(), ePropPos)
iPropIndex++
ENDIF
ELIF IS_BUTTON_JUST_PRESSED(PAD1, DPADDOWN)
iPropIndex--
IF iPropIndex < 0
iPropIndex = GET_NUMBER_OF_PED_PROP_DRAWABLE_VARIATIONS(PLAYER_PED_ID(), ePropPos) -1
ENDIF
ENDIF
// Switch texture index left/right
IF IS_BUTTON_JUST_PRESSED(PAD1, DPADRIGHT)
IF iTexIndex+1 < GET_NUMBER_OF_PED_PROP_TEXTURE_VARIATIONS(PLAYER_PED_ID(), ePropPos, iPropIndex)
iTexIndex++
ENDIF
ELIF IS_BUTTON_JUST_PRESSED(PAD1, DPADLEFT)
iTexIndex--
IF iTexIndex < 0
iTexIndex = GET_NUMBER_OF_PED_PROP_TEXTURE_VARIATIONS(PLAYER_PED_ID(), ePropPos, iPropIndex)-1
ENDIF
ENDIF
ENDIF
IF IS_BUTTON_JUST_PRESSED(PAD1, CROSS)
SET_PED_PROP_INDEX(PLAYER_PED_ID(), ePropPos, iPropIndex, iTexIndex)
ELIF IS_BUTTON_JUST_PRESSED(PAD1, CIRCLE)
CLEAR_PED_PROP(PLAYER_PED_ID(), ePropPos)
ENDIF
ELIF eStage = STAGE_COMP_CHECKER
BOOL bUpdateComponents = FALSE
PED_INDEX pedID = PLAYER_PED_ID()
IF IS_BUTTON_PRESSED(PAD1, LEFTSHOULDER1)
// Switch component type
IF IS_BUTTON_JUST_PRESSED(PAD1, DPADUP)
IF ENUM_TO_INT(eCompType) <= 0
eCompType = INT_TO_ENUM(PED_COMPONENT, NUM_PED_COMPONENTS-1)
ELSE
eCompType = INT_TO_ENUM(PED_COMPONENT, ENUM_TO_INT(eCompType)-1)
ENDIF
ELIF IS_BUTTON_JUST_PRESSED(PAD1, DPADDOWN)
IF ENUM_TO_INT(eCompType) >= NUM_PED_COMPONENTS-1
eCompType = INT_TO_ENUM(PED_COMPONENT, 0)
ELSE
eCompType = INT_TO_ENUM(PED_COMPONENT, ENUM_TO_INT(eCompType)+1)
ENDIF
ENDIF
ELSE
// Switch drawable variation up/down
IF IS_BUTTON_JUST_PRESSED(PAD1, DPADUP)
IF iDrawable[ENUM_TO_INT(eCompType)]+1 < GET_NUMBER_OF_PED_DRAWABLE_VARIATIONS(PLAYER_PED_ID(), eCompType)
iDrawable[ENUM_TO_INT(eCompType)]++
ELSE
iDrawable[ENUM_TO_INT(eCompType)] = 0
ENDIF
iTexture[ENUM_TO_INT(eCompType)] = 0 // reset texture
bUpdateComponents = TRUE
ELIF IS_BUTTON_JUST_PRESSED(PAD1, DPADDOWN)
IF iDrawable[ENUM_TO_INT(eCompType)]-1 >= 0
iDrawable[ENUM_TO_INT(eCompType)]--
ELSE
IF GET_NUMBER_OF_PED_DRAWABLE_VARIATIONS(PLAYER_PED_ID(), eCompType) = 0
iDrawable[ENUM_TO_INT(eCompType)] = 0
ELSE
iDrawable[ENUM_TO_INT(eCompType)] = GET_NUMBER_OF_PED_DRAWABLE_VARIATIONS(PLAYER_PED_ID(), eCompType)-1
ENDIF
ENDIF
iTexture[ENUM_TO_INT(eCompType)] = 0 // reset texture
bUpdateComponents = TRUE
ENDIF
// Switch texture variation left/right
IF IS_BUTTON_JUST_PRESSED(PAD1, DPADRIGHT)
IF iTexture[ENUM_TO_INT(eCompType)]+1 < GET_NUMBER_OF_PED_TEXTURE_VARIATIONS(PLAYER_PED_ID(), eCompType, iDrawable[ENUM_TO_INT(eCompType)])
iTexture[ENUM_TO_INT(eCompType)]++
ELSE
iTexture[ENUM_TO_INT(eCompType)] = 0
ENDIF
bUpdateComponents = TRUE
ELIF IS_BUTTON_JUST_PRESSED(PAD1, DPADLEFT)
IF iTexture[ENUM_TO_INT(eCompType)]-1 >= 0
iTexture[ENUM_TO_INT(eCompType)]--
ELSE
IF GET_NUMBER_OF_PED_TEXTURE_VARIATIONS(PLAYER_PED_ID(), eCompType, iDrawable[ENUM_TO_INT(eCompType)]) = 0
iTexture[ENUM_TO_INT(eCompType)] = 0
ELSE
iTexture[ENUM_TO_INT(eCompType)] = GET_NUMBER_OF_PED_TEXTURE_VARIATIONS(PLAYER_PED_ID(), eCompType, iDrawable[ENUM_TO_INT(eCompType)])-1
ENDIF
ENDIF
bUpdateComponents = TRUE
ENDIF
ENDIF
IF bUpdateComponents
INT i
FOR i = 0 TO NUM_PED_COMPONENTS-1
SET_PED_COMPONENT_VARIATION(pedID, INT_TO_ENUM(PED_COMPONENT, i), iDrawable[i], iTexture[i])
ENDFOR
ENDIF
ENDIF
ELSE
eStage = STAGE_CLEANUP
ENDIF
ENDPROC
PROC DISPLAY_STRING(FLOAT x, FLOAT y, STRING sText, BOOL bCentre, INT r = 255, INT g = 255, INT b = 255, INT a = 255)
SET_TEXT_CENTRE(bCentre)
SET_TEXT_SCALE(0.5000, 0.5000)
SET_TEXT_COLOUR(r, g, b, a)
SET_TEXT_DROPSHADOW(0, 0, 0, 0, 0)
SET_TEXT_EDGE(0, 0, 0, 0, 0)
DISPLAY_TEXT_WITH_LITERAL_STRING(x, y, "STRING", sText)
ENDPROC
PROC DISPLAY_LABEL(FLOAT x, FLOAT y, STRING sLabel, BOOL bCentre, INT r = 255, INT g = 255, INT b = 255, INT a = 255)
SET_TEXT_CENTRE(bCentre)
SET_TEXT_SCALE(0.5000, 0.5000)
SET_TEXT_COLOUR(r, g, b, a)
SET_TEXT_DROPSHADOW(0, 0, 0, 0, 0)
SET_TEXT_EDGE(0, 0, 0, 0, 0)
DISPLAY_TEXT(x, y, sLabel)
ENDPROC
PROC DISPLAY_LABEL_WITH_1_NUMBER(FLOAT x, FLOAT y, STRING sLabel, INT iNumber1, INT r = 255, INT g = 255, INT b = 255, INT a = 255)
SET_TEXT_SCALE(0.5000, 0.5000)
SET_TEXT_COLOUR(r, g, b, a)
SET_TEXT_DROPSHADOW(0, 0, 0, 0, 0)
SET_TEXT_EDGE(0, 0, 0, 0, 0)
DISPLAY_TEXT_WITH_NUMBER(x, y, sLabel, iNumber1)
ENDPROC
PROC DISPLAY_LABEL_WITH_2_NUMBERS(FLOAT x, FLOAT y, STRING sLabel, INT iNumber1, INT iNumber2, INT r = 255, INT g = 255, INT b = 255, INT a = 255)
SET_TEXT_SCALE(0.5000, 0.5000)
SET_TEXT_COLOUR(r, g, b, a)
SET_TEXT_DROPSHADOW(0, 0, 0, 0, 0)
SET_TEXT_EDGE(0, 0, 0, 0, 0)
DISPLAY_TEXT_WITH_2_NUMBERS(x, y, sLabel, iNumber1, iNumber2)
ENDPROC
PROC DISPLAY_COMPONENT_CHECKER_HUD()
HIDE_HUD_AND_RADAR_THIS_FRAME()
IF NOT IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("COMP_HELP")
PRINT_HELP_FOREVER("COMP_HELP")
ENDIF
// Interface background
DRAW_RECT(0.5000, 0.1375, 0.3500, 0.1725, 0, 0, 0, 255)
IF IS_BUTTON_PRESSED(PAD1, LEFTSHOULDER1)
DRAW_RECT(0.5000, 0.1388, 0.3500, 0.0400, 125, 125, 125, 255)
ELSE
DRAW_RECT(0.5000, 0.1893, 0.3500, 0.0400, 125, 125, 125, 255)
ENDIF
// Title
DISPLAY_STRING(0.500, 0.0615, "Component Checker", TRUE, 200, 255, 36, 255)
// Component
TEXT_LABEL_15 sText
sText = "COMP_TYPE_"
sText += ENUM_TO_INT(eCompType)
DISPLAY_LABEL(0.5000, 0.1200, sText, TRUE)
// Drawable/Texture
INT iDrawVars = GET_NUMBER_OF_PED_DRAWABLE_VARIATIONS(PLAYER_PED_ID(), eCompType)
INT iTexVars = GET_NUMBER_OF_PED_TEXTURE_VARIATIONS(PLAYER_PED_ID(), eCompType, iDrawable[ENUM_TO_INT(eCompType)])
IF iDrawVars > 0 iDrawVars-- ENDIF
IF iTexVars > 0 iTexVars-- ENDIF
DISPLAY_LABEL_WITH_2_NUMBERS(0.3500, 0.1702, "COMP_DRAW", iDrawVars, iDrawable[ENUM_TO_INT(eCompType)])
DISPLAY_LABEL_WITH_2_NUMBERS(0.5155, 0.1700, "COMP_TEX", iTexVars, iTexture[ENUM_TO_INT(eCompType)])
ENDPROC
PROC DISPLAY_PROP_CHECKER_HUD()
HIDE_HUD_AND_RADAR_THIS_FRAME()
IF NOT IS_THIS_HELP_MESSAGE_BEING_DISPLAYED("PROP_HELP")
PRINT_HELP_FOREVER("PROP_HELP")
ENDIF
// Interface background
DRAW_RECT(0.5000, 0.1375, 0.3500, 0.1725, 0, 0, 0, 255)
IF IS_BUTTON_PRESSED(PAD1, LEFTSHOULDER1)
DRAW_RECT(0.5000, 0.1388, 0.3500, 0.0400, 125, 125, 125, 255)
ELSE
DRAW_RECT(0.5000, 0.1893, 0.3500, 0.0400, 125, 125, 125, 255)
ENDIF
// Title
DISPLAY_STRING(0.500, 0.0615, "Prop Checker", TRUE, 200, 255, 36, 255)
// Prop
TEXT_LABEL_15 sText
sText = "PROP_POS_"
sText += ENUM_TO_INT(ePropPos)
DISPLAY_LABEL(0.5000, 0.1200, sText, TRUE)
// Drawable/Texture
INT iDrawVars = GET_NUMBER_OF_PED_PROP_DRAWABLE_VARIATIONS(PLAYER_PED_ID(), ePropPos)
INT iTexVars = GET_NUMBER_OF_PED_PROP_TEXTURE_VARIATIONS(PLAYER_PED_ID(), ePropPos, iPropIndex)
IF iDrawVars > 0 iDrawVars-- ENDIF
IF iTexVars > 0 iTexVars-- ENDIF
// Prop/Texture index
DISPLAY_LABEL_WITH_2_NUMBERS(0.3685, 0.1702, "PROP_INDEX", iDrawVars, iPropIndex)
DISPLAY_LABEL_WITH_2_NUMBERS(0.5155, 0.1700, "PROP_TEX", iTexVars, iTexIndex)
ENDPROC
PROC DO_INITIALISE()
VECTOR vPos = <<-428.6418, -120.9582, 64.8967>>
FLOAT fHeading = 214.7821
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
ePedModel = GET_ENTITY_MODEL(PLAYER_PED_ID())
CLEAR_AREA(vPos, 200.0, TRUE)
CLEAR_PED_TASKS_IMMEDIATELY(PLAYER_PED_ID())
SET_ENTITY_COORDS(PLAYER_PED_ID(), vPos)
SET_ENTITY_HEADING(PLAYER_PED_ID(), fHeading)
SET_PLAYER_CONTROL(PLAYER_ID(), FALSE, SPC_LEAVE_CAMERA_CONTROL_ON)
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), TRUE)
CLEAR_TIMECYCLE_MODIFIER()
DISABLE_CELLPHONE(TRUE)
RESET_STORED_DATA()
SETUP_WIDGETS()
eStage = STAGE_COMP_CHECKER
ELSE
eStage = STAGE_CLEANUP
ENDIF
ENDPROC
PROC DO_COMP_CHECKER()
UPDATE_INPUT()
DISPLAY_COMPONENT_CHECKER_HUD()
ENDPROC
PROC DO_PROP_CHECKER()
UPDATE_INPUT()
DISPLAY_PROP_CHECKER_HUD()
ENDPROC
PROC DO_CLEANUP()
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
SET_PLAYER_CONTROL(PLAYER_ID(), TRUE)
FREEZE_ENTITY_POSITION(PLAYER_PED_ID(), FALSE)
ENDIF
DISABLE_CELLPHONE(FALSE)
CLEAR_HELP()
TERMINATE_THIS_THREAD()
ENDPROC
SCRIPT
NETWORK_SET_SCRIPT_IS_SAFE_FOR_NETWORK_GAME()
WHILE TRUE
WAIT(0)
SWITCH eStage
CASE STAGE_INIT
DO_INITIALISE()
BREAK
CASE STAGE_COMP_CHECKER
DO_COMP_CHECKER()
BREAK
CASE STAGE_PROP_CHECKER
DO_PROP_CHECKER()
BREAK
CASE STAGE_CLEANUP
DO_CLEANUP()
BREAK
ENDSWITCH
IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_F)
OR IS_BUTTON_JUST_PRESSED(PAD1, TRIANGLE)
DO_CLEANUP()
ENDIF
ENDWHILE
ENDSCRIPT
#ENDIF