3718 lines
141 KiB
Scheme
Executable File
3718 lines
141 KiB
Scheme
Executable File
USING "rage_builtins.sch"
|
|
USING "globals.sch"
|
|
USING "commands_debug.sch"
|
|
USING "commands_entity.sch"
|
|
USING "commands_object.sch"
|
|
USING "commands_pad.sch"
|
|
USING "commands_path.sch"
|
|
USING "commands_vehicle.sch"
|
|
USING "commands_camera.sch"
|
|
USING "commands_path.sch"
|
|
USING "commands_script.sch"
|
|
USING "commands_streaming.sch"
|
|
USING "commands_xml.sch"
|
|
USING "script_player.sch"
|
|
USING "commands_brains.sch"
|
|
USING "net_script_timers.sch"
|
|
USING "charsheet_public.sch"
|
|
USING "exclusive_vehicle_mod_helper.sch"
|
|
|
|
// *****************************************************************************************
|
|
// *****************************************************************************************
|
|
// *****************************************************************************************
|
|
//
|
|
// MISSION NAME : shared_debug.sch
|
|
// AUTHOR : Keith
|
|
// DESCRIPTION : Contains any debug keypresses and widgets common to both
|
|
// singleplayer and multiplayer.
|
|
//
|
|
// *****************************************************************************************
|
|
// *****************************************************************************************
|
|
// *****************************************************************************************
|
|
|
|
|
|
// ...Shared Debug Bit Flag Definitions
|
|
CONST_INT CLEAR_SHARED_DEBUG_FLAGS 0
|
|
CONST_INT DBG_LOCATES_ON 1 // TRUE if the debug outlines are switched ON, FALSE for OFF
|
|
CONST_INT DBG_OVERLAYS_ON 2 // TRUE if the screen HUD overlays are ON, FALSE if OFF
|
|
CONST_INT DBG_F9_SCREEN_ON 3 // TRUE if the mission flow F7 screen is ON, FALSE if OFF
|
|
CONST_INT DBG_F8_SCREEN_ON 4 // TRUE if the mission flow F9 screen is ON, FALSE if OFF
|
|
CONST_INT DBG_F10_SCREEN_ON 5 // TRUE if the family F8 screen is ON, FALSE if OFF
|
|
CONST_INT DBG_F11_SCREEN_ON 6 // TRUE if the friends F10 screen is ON, FALSE if OFF
|
|
CONST_INT DBG_RADAR_AREA_COLOURS_ON 7 // TRUE if the radar is displaying area colours, FALSE if not
|
|
CONST_INT DBG_SPACE_F9 8 // TRUE if space turned on the F9
|
|
|
|
// I've broken the rules with this INT because it contains bit flags for many different debug functions
|
|
INT m_sharedDebugFlags = CLEAR_SHARED_DEBUG_FLAGS
|
|
|
|
|
|
// NOTE: These variables should get initialised in Initialise_Shared_Debug_Variables() below
|
|
STRUCT structSharedDebugVars
|
|
// ...vehicle recording variables
|
|
BOOL vehicleRecordingRequested
|
|
BOOL vehicleRecordingBeingRecorded
|
|
BOOL moveVehicleBackToStartPosition
|
|
BOOL overwriteRecording
|
|
BOOL keepOverwriteRecordingTicked
|
|
BOOL allowSquareButtonToStartStopVehicleRecording
|
|
BOOL bAllowSimultaneousTrailerRecording
|
|
TEXT_WIDGET_ID vehicleRecordingFilenameTextWidgetID
|
|
INT vehicleRecordingID
|
|
INT iTrailerRecordingID
|
|
VEHICLE_INDEX indexVehicleRecordingVehicle
|
|
VEHICLE_INDEX vehTrailerToRecord
|
|
VECTOR xyzVehicleRecordingStartPos
|
|
VECTOR xyzVehicleRecordingStartRot
|
|
FLOAT quatVehicleRecordingStartX
|
|
FLOAT quatVehicleRecordingStartY
|
|
FLOAT quatVehicleRecordingStartZ
|
|
FLOAT quatVehicleRecordingStartW
|
|
|
|
// ...vehicle colour variables
|
|
INT vehicleColour1
|
|
INT vehicleColour2
|
|
INT vehicleColour3
|
|
INT vehicleColour4
|
|
INT vehicleColour5
|
|
INT vehicleColour6
|
|
FLOAT vehicleEnvEff
|
|
BOOL vehicleColourActivate
|
|
BOOL vehicleColourClean
|
|
BOOL vehicleColourOutput
|
|
BOOL vehicleColourInitialise
|
|
TEXT_LABEL_63 vehicleColourPathStr
|
|
TEXT_LABEL_23 vehicleColourModelStr
|
|
TEXT_WIDGET_ID vehicleColourPath
|
|
TEXT_WIDGET_ID vehicleColourModel
|
|
|
|
// ...vehicle mods
|
|
INT vehicleLivery, vehicleLiveryTemp
|
|
INT vehicleLivery2, vehicleLivery2Temp
|
|
INT vehicleModTyreSmokeR, vehicleModTyreSmokeRTemp
|
|
INT vehicleModTyreSmokeG, vehicleModTyreSmokeGTemp
|
|
INT vehicleModTyreSmokeB, vehicleModTyreSmokeBTemp
|
|
INT vehicleTyreType, vehicleTyreTypeTemp
|
|
INT vehicleModWindowTintColour, vehicleModWindowTintColourTemp
|
|
INT vehicleModSlotIndex[MAX_VEHICLE_MOD_SLOTS]
|
|
BOOL bMaxSpeedOverride
|
|
BOOL bTopSpeedOverride
|
|
FLOAT vehicleMaxSpeedOverride
|
|
FLOAT vehicleTopSpeedOverride
|
|
INT vehicleModWheelType
|
|
BOOL vehicleModEnableBasic
|
|
BOOL vehicleModEnableAdvanced
|
|
BOOL vehicleModDataSetBasic
|
|
BOOL vehicleModDataSetAdvanced
|
|
BOOL vehicleModExtraOn[16]
|
|
BOOL vehicleModExtraOnTemp[16]
|
|
BOOL vehicleModDisplayCurrentMods
|
|
BOOL selectedVehicleModDisplayCurrentMods
|
|
BOOL bTireDesign
|
|
|
|
// ...hask key generation variables
|
|
BOOL generateHashKey
|
|
INT hashKey
|
|
TEXT_WIDGET_ID hashKeyGeneratorTextWidgetID
|
|
|
|
// ...scripted cam editor variables
|
|
BOOL launchCamEditor
|
|
|
|
// ...generic debug tick
|
|
BOOL bShutdownLoadingScreens
|
|
BOOL forcefadein
|
|
BOOL forcefadeout
|
|
BOOL killplayer
|
|
BOOL forceplayercontrolon
|
|
BOOL forceplayercontroloff
|
|
BOOL forceplayerfrozen
|
|
BOOL forceplayernotfrozen
|
|
BOOL forceplayercollision
|
|
BOOL forceplayernocollision
|
|
BOOL reactivateWorldBrains
|
|
BOOL clearareaaroundplayer
|
|
|
|
// ...save game test widgets
|
|
BOOL doAutosave
|
|
BOOL doNormalSave
|
|
|
|
BOOL returnToGameplayCam
|
|
|
|
// ...ptfx tester widgets
|
|
TEXT_WIDGET_ID ptfxDictionary
|
|
TEXT_WIDGET_ID ptfxName
|
|
PTFX_ID ptfxID
|
|
VECTOR ptfxPos
|
|
VECTOR ptfxRot
|
|
FLOAT ptfxScale
|
|
BOOl playPtfxLooped
|
|
BOOL playPtfxNonLooped
|
|
BOOL ptfxIsRelativeToEntity
|
|
BOOL ptfxTesterEnabled
|
|
|
|
// ...object positioning widgets
|
|
ENTITY_INDEX objFocusedEntity
|
|
VECTOR objPos
|
|
VECTOR objRot
|
|
FLOAT objQuatX
|
|
FLOAT objQuatY
|
|
FLOAT objQuatZ
|
|
FLOAT objQuatW
|
|
BOOL objPositioningEnabled
|
|
BOOL objPositioningOutput
|
|
BOOL objPositioningFreeze
|
|
BOOL objPositioningAxisSelected
|
|
BOOL objPositioningUseLocalAxis
|
|
INT iObjPositioningCurrentAxis
|
|
|
|
// ...min/max locate widgets
|
|
BOOL bMinMaxWidgetEnabled
|
|
BOOL bMinMaxWidgetOutput
|
|
BOOL bMinMaxGetMin
|
|
BOOL bMinMaxGetMax
|
|
VECTOR vMinMaxCornerMin
|
|
VECTOR vMinMaxCornerMax
|
|
INT iMinMaxCurrentSelection
|
|
|
|
// ...door opening widget
|
|
ENTITY_INDEX objFocusedDoor
|
|
MODEL_NAMES mnDoorModel
|
|
VECTOR vDoorPosition
|
|
FLOAT fOpenRatio
|
|
BOOL bDoorOpeningEnabled
|
|
BOOL bDoorOpeningOutputLog
|
|
BOOL bDoorOpeningOutputFile
|
|
BOOL bDoorsLocked
|
|
|
|
// ...car tyre bursts and damage
|
|
VEHICLE_INDEX vehFocusedCar
|
|
MODEL_NAMES mnCarModel
|
|
VECTOR vFrontLeftWheelOffset
|
|
VECTOR vFrontRightWheelOffset
|
|
VECTOR vRearLeftWheelOffset
|
|
VECTOR vRearRightWheelOffset
|
|
VECTOR vFrontLeftDamageOffset
|
|
VECTOR vFrontRightDamageOffset
|
|
VECTOR vRearLeftDamageOffset
|
|
VECTOR vRearRightDamageOffset
|
|
FLOAT fSphereRadius
|
|
BOOL bCarTyreBurstsAndDamageEnabled
|
|
BOOL bCarTyreBurstsAndDamageOutput
|
|
BOOL bRetoreCarHealth
|
|
BOOL bDrawDebugSpheres
|
|
FLOAT fDamage
|
|
FLOAT fDeformation
|
|
BOOL bApplyFrontLeftDamage
|
|
BOOL bApplyFrontRightDamage
|
|
BOOL bApplyRearLeftDamage
|
|
BOOL bApplyRearRightDamage
|
|
|
|
// ...vehicle extras
|
|
BOOL bVehicleExtraEnabled
|
|
VEHICLE_INDEX vehVehicleExtraFocus
|
|
INT iVehicleExtra, iVehicleExtraLast
|
|
BOOL bVehicleExtra
|
|
BOOL bVehicleExtraDebug
|
|
BOOL bVehicleExtraOutput
|
|
|
|
// ...Vehicle force widgets
|
|
ENTITY_INDEX entityToApplyTo
|
|
BOOL bEnableForceWidget
|
|
INT iForceApplyType
|
|
VECTOR vForceDirection
|
|
VECTOR vForceOffset
|
|
INT iForceComponent
|
|
BOOL bIsLocalForce
|
|
BOOL bIsLocalOffset
|
|
BOOL bScaleForceByMass
|
|
|
|
// ...radar area colours
|
|
BOOL toggleRadarAreaColours
|
|
|
|
// ...Cam offset widget
|
|
BOOL bCamOffsetEnabled
|
|
BOOL bCamOffsetActivate
|
|
BOOL bCamOffsetRelativePosition
|
|
BOOL bCamOffsetRelativeLookAt
|
|
|
|
// ...native trace
|
|
TEXT_WIDGET_ID nativeTraceTextWidgetID
|
|
BOOL bNativeTraceInput
|
|
BOOL bNativeTraceBreakInput
|
|
BOOL bNativeTraceBreakFirstInput
|
|
BOOL bNativeTraceRunning
|
|
BOOL bNativeTraceBreakRunning
|
|
BOOL bNativeTraceBreakFirstRunning
|
|
|
|
// ...game time date
|
|
BOOL bDrawGameTimeDate
|
|
FLOAT fCurrentTimeDateX
|
|
FLOAT fCurrentTimeDateY
|
|
FLOAT fDebugTimeDateX
|
|
FLOAT fDebugTimeDateY
|
|
STRUCT_STAT_DATE fDebugDate1, fDebugDate2, fDebugDateRes
|
|
BOOL bAddTODs
|
|
BOOL bSetTOD
|
|
|
|
// ...set gameplay cam relative heading and pitch
|
|
BOOL bSetGameplayCamRelativePitchAndHeading
|
|
FLOAT fCamRelativePitch
|
|
FLOAT fCamRelativeHeading
|
|
|
|
// Neon colours
|
|
INT XenonColorLightIndex = 255
|
|
INT XenonColorLightIndexTemp
|
|
ENDSTRUCT
|
|
|
|
|
|
|
|
// *****************************************************************************************
|
|
// INITIALISATION FUNCTIONS
|
|
// *****************************************************************************************
|
|
|
|
/// PURPOSE: Initialises any variables required for debug
|
|
/// INPUT PARAMS: structSharedDebugVars The struct of variables to be initialised
|
|
PROC Initialise_Shared_Debug_Variables(structSharedDebugVars ¶mVars)
|
|
|
|
// ...vehicle recording variables
|
|
paramVars.vehicleRecordingRequested = FALSE
|
|
paramVars.vehicleRecordingBeingRecorded = FALSE
|
|
paramVars.moveVehicleBackToStartPosition = FALSE
|
|
paramVars.overwriteRecording = FALSE
|
|
paramVars.keepOverwriteRecordingTicked = FALSE
|
|
paramVars.allowSquareButtonToStartStopVehicleRecording = FALSE
|
|
paramVars.bAllowSimultaneousTrailerRecording = FALSE
|
|
paramVars.vehicleRecordingFilenameTextWidgetID = NULL
|
|
paramVars.vehicleRecordingID = 0
|
|
paramVars.iTrailerRecordingID = 0
|
|
paramVars.indexVehicleRecordingVehicle = NULL
|
|
paramVars.vehTrailerToRecord = NULL
|
|
paramVars.xyzVehicleRecordingStartPos = << 0.0, 0.0, 0.0 >>
|
|
paramVars.xyzVehicleRecordingStartRot = << 0.0, 0.0, 0.0 >>
|
|
paramVars.quatVehicleRecordingStartX = 0.0
|
|
paramVars.quatVehicleRecordingStartY = 0.0
|
|
paramVars.quatVehicleRecordingStartZ = 0.0
|
|
paramVars.quatVehicleRecordingStartW = 0.0
|
|
|
|
// ...vehicle colour variables
|
|
paramVars.vehicleColour1 = 0
|
|
paramVars.vehicleColour2 = 0
|
|
paramVars.vehicleColour3 = 0
|
|
paramVars.vehicleColour4 = 0
|
|
paramVars.vehicleColourActivate = FALSE
|
|
paramVars.vehicleColourInitialise = FALSE
|
|
paramVars.vehicleColourOutput = FALSE
|
|
paramVars.vehicleColourClean = FALSE
|
|
paramVars.vehicleColourPath = NULL
|
|
paramVars.vehicleColourModel = NULL
|
|
paramVars.vehicleColourPathStr = ""
|
|
paramVars.vehicleColourModelStr = ""
|
|
|
|
// ...hask key generation variables
|
|
paramVars.generateHashKey = FALSE
|
|
paramVars.hashKey = 0
|
|
paramVars.hashKeyGeneratorTextWidgetID = NULL
|
|
|
|
// ...generic debug tick
|
|
paramVars.bShutdownLoadingScreens = FALSE
|
|
paramVars.forcefadein = FALSE
|
|
paramVars.forcefadeout = FALSE
|
|
paramVars.killplayer = FALSE
|
|
paramVars.forceplayercontrolon = FALSE
|
|
paramVars.forceplayercontroloff = FALSE
|
|
paramVars.forceplayerfrozen = FALSE
|
|
paramVars.forceplayernotfrozen = FALSE
|
|
paramVars.forceplayercollision = FALSE
|
|
paramVars.forceplayernocollision = FALSE
|
|
paramVars.reactivateWorldBrains = FALSE
|
|
paramVars.clearareaaroundplayer = FALSE
|
|
|
|
// ...scripted cam editor widgets
|
|
paramVars.launchCamEditor = FALSE
|
|
|
|
// ...save game test widgets
|
|
paramVars.doAutosave = FALSE
|
|
paramVars.doNormalSave = FALSE
|
|
|
|
paramVars.returnToGameplayCam = FALSE
|
|
|
|
// ...ptfx test widgets
|
|
paramVars.ptfxDictionary = NULL
|
|
paramVars.ptfxName = NULL
|
|
paramVars.ptfxID = NULL
|
|
paramVars.ptfxPos = <<0.0, 0.0, 0.0>>
|
|
paramVars.ptfxRot = <<0.0, 0.0, 0.0>>
|
|
paramVars.ptfxScale = 1.0
|
|
paramVars.playPtfxLooped = FALSE
|
|
paramVars.playPtfxNonLooped = FALSE
|
|
paramVars.ptfxIsRelativeToEntity = FALSE
|
|
|
|
// ...object positioning widgets
|
|
paramVars.objFocusedEntity = NULL
|
|
paramVars.objPos = <<0.0, 0.0, 0.0>>
|
|
paramVars.objRot = <<0.0, 0.0, 0.0>>
|
|
paramVars.objQuatX = 0.0
|
|
paramVars.objQuatY = 0.0
|
|
paramVars.objQuatZ = 0.0
|
|
paramVars.objQuatW = 0.0
|
|
paramVars.objPositioningEnabled = FALSE
|
|
paramVars.objPositioningOutput = FALSE
|
|
paramVars.objPositioningFreeze = TRUE
|
|
paramVars.objPositioningAxisSelected = FALSE
|
|
paramVars.objPositioningUseLocalAxis = TRUE
|
|
paramVars.iObjPositioningCurrentAxis = 0
|
|
|
|
// ...min/max locate widget
|
|
paramVars.bMinMaxWidgetEnabled = FALSE
|
|
paramVars.bMinMaxWidgetOutput = FALSE
|
|
paramVars.bMinMaxGetMin = FALSE
|
|
paramVars.bMinMaxGetMax = FALSE
|
|
paramVars.iMinMaxCurrentSelection = -1
|
|
paramVars.vMinMaxCornerMin = <<0.0, 0.0, 0.0>>
|
|
paramVars.vMinMaxCornerMax = <<0.0, 0.0, 0.0>>
|
|
|
|
// ...door opening widget
|
|
paramVars.objFocusedDoor = NULL
|
|
paramVars.mnDoorModel = DUMMY_MODEL_FOR_SCRIPT
|
|
paramVars.vDoorPosition = <<0.0, 0.0, 0.0>>
|
|
paramVars.fOpenRatio = 0.0
|
|
paramVars.bDoorOpeningEnabled = FALSE
|
|
paramVars.bDoorOpeningOutputLog = FALSE
|
|
paramVars.bDoorOpeningOutputFile = FALSE
|
|
paramVars.bDoorsLocked = FALSE
|
|
|
|
// ...radar area colours
|
|
paramVars.toggleRadarAreaColours = FALSE
|
|
|
|
// ...cam offset widget
|
|
paramVars.bCamOffsetEnabled = FALSE
|
|
paramVars.bCamOffsetActivate = FALSE
|
|
paramVars.bCamOffsetRelativePosition = TRUE
|
|
paramVars.bCamOffsetRelativeLookAt = TRUE
|
|
|
|
// ...vehicle force widget
|
|
paramVars.entityToApplyTo = NULL
|
|
paramVars.bEnableForceWidget = FALSE
|
|
paramVars.iForceApplyType = 0
|
|
paramVars.vForceDirection = <<0.0, 0.0, 0.0>>
|
|
paramVars.vForceOffset = <<0.0, 0.0, 0.0>>
|
|
paramVars.iForceComponent = 0
|
|
paramVars.bIsLocalForce = FALSE
|
|
paramVars.bIsLocalOffset = FALSE
|
|
paramVars.bScaleForceByMass = FALSE
|
|
|
|
|
|
// ...native trace
|
|
paramVars.nativeTraceTextWidgetID = NULL
|
|
|
|
// ...gameplay cam relative heading and pitch
|
|
paramVars.bSetGameplayCamRelativePitchAndHeading = FALSE
|
|
paramVars.fCamRelativePitch = 0.0
|
|
paramVars.fCamRelativeHeading = 0.0
|
|
|
|
// Any initially 'on' flags
|
|
SET_BIT (m_sharedDebugFlags, DBG_OVERLAYS_ON)
|
|
|
|
ENDPROC
|
|
|
|
|
|
|
|
// *****************************************************************************************
|
|
// GENERAL FUNCTIONS
|
|
// *****************************************************************************************
|
|
|
|
// -----------------------------------------------------------------------------------------------------------
|
|
|
|
|
|
|
|
// *****************************************************************************************
|
|
// Mission Flow Debug Screen - toggle on/off
|
|
// *****************************************************************************************
|
|
|
|
/// PURPOSE:
|
|
/// KEY F9: Toggles Mission Flow debug screen on/off
|
|
PROC Maintain_KeyF9_Toggle_Mission_Flow_Debug_Screen(SCRIPT_TIMER &stTimer)
|
|
|
|
IF IS_DEBUG_KEY_JUST_PRESSED(KEY_SPACE, KEYBOARD_MODIFIER_NONE, "Normal bug") AND GET_COMMANDLINE_PARAM_EXISTS("displayF9OnBugCreation")
|
|
AND NOT IS_DEBUG_KEY_JUST_PRESSED(KEY_SPACE, KEYBOARD_MODIFIER_CTRL, "Normal bug")
|
|
AND NOT IS_DEBUG_KEY_JUST_RELEASED(KEY_SPACE, KEYBOARD_MODIFIER_CTRL, "Normal bug")
|
|
AND NOT IS_DEBUG_KEY_PRESSED(KEY_SPACE, KEYBOARD_MODIFIER_CTRL, "Normal bug")
|
|
IF !IS_BIT_SET(m_sharedDebugFlags, DBG_F9_SCREEN_ON)
|
|
AND NETWORK_IS_GAME_IN_PROGRESS()
|
|
RESET_NET_TIMER(stTimer)
|
|
START_NET_TIMER(stTimer)
|
|
SET_BIT(m_sharedDebugFlags, DBG_F9_SCREEN_ON)
|
|
//SET_BIT(m_sharedDebugFlags, DBG_SPACE_F9)
|
|
PRINTLN("...F9 SCREEN ON - SPACE")
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_BIT_SET(m_sharedDebugFlags, DBG_F9_SCREEN_ON)
|
|
IF HAS_NET_TIMER_STARTED(stTimer)
|
|
IF HAS_NET_TIMER_EXPIRED(stTimer, 500)
|
|
CLEAR_BIT(m_sharedDebugFlags, DBG_F9_SCREEN_ON)
|
|
// CLEAR_BIT(m_sharedDebugFlags, DBG_SPACE_F9)
|
|
PRINTLN("...F9 SCREEN OFF - SPACE")
|
|
RESET_NET_TIMER(stTimer)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_F9) OR IS_DEBUG_KEY_JUST_PRESSED(KEY_F9, KEYBOARD_MODIFIER_CTRL_SHIFT, "Mission Flow Screenshot") )
|
|
WHILE (IS_KEYBOARD_KEY_PRESSED(KEY_F9) OR IS_DEBUG_KEY_PRESSED(KEY_F9, KEYBOARD_MODIFIER_CTRL_SHIFT, "Mission Flow Screenshot") )
|
|
WAIT (0)
|
|
ENDWHILE
|
|
|
|
IF (IS_BIT_SET(m_sharedDebugFlags, DBG_F9_SCREEN_ON))
|
|
CLEAR_BIT(m_sharedDebugFlags, DBG_F9_SCREEN_ON)
|
|
RESET_NET_TIMER(stTimer)
|
|
WAIT(0)
|
|
|
|
PRINTSTRING("...F9 SCREEN OFF")
|
|
PRINTNL()
|
|
ELSE
|
|
SET_BIT(m_sharedDebugFlags, DBG_F9_SCREEN_ON)
|
|
RESET_NET_TIMER(stTimer)
|
|
PRINTSTRING("...F9 SCREEN ON")
|
|
PRINTNL()
|
|
ENDIF
|
|
ENDIF
|
|
|
|
|
|
ENDPROC
|
|
|
|
|
|
// *****************************************************************************************
|
|
// Force Fade In
|
|
// *****************************************************************************************
|
|
|
|
/// PURPOSE:
|
|
/// KEY LSHIFT+*: Forces the screen to fade in
|
|
PROC Maintain_KeyLShiftMultiply_Force_Fade_In()
|
|
IF IS_DEBUG_KEY_JUST_PRESSED(KEY_MULTIPLY, KEYBOARD_MODIFIER_SHIFT, "Force Fade In")
|
|
IF IS_SCREEN_FADED_OUT() OR IS_SCREEN_FADING_OUT()
|
|
DO_SCREEN_FADE_IN(1000)
|
|
PRINTSTRING("...FORCING SCREEN FADE IN")
|
|
PRINTNL()
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
|
|
// *******************************************************************************************
|
|
// WIDGET FUNCTIONS AND PROCEDURES
|
|
// *******************************************************************************************
|
|
/// PURPOSE:
|
|
///
|
|
/// PARAMS:
|
|
/// model_name -
|
|
/// AUTHOR: alwyn.roberts@rockstarnorth.com
|
|
/// COMMENTS:
|
|
PROC ADD_WIDGET_VECTOR_SLIDER(STRING name, VECTOR &pos_to_change, FLOAT min, FLOAT max, FLOAT slider_step)
|
|
TEXT_LABEL_63 slider_name = name
|
|
slider_name += " x"
|
|
IF (slider_step != 0.0)
|
|
ADD_WIDGET_FLOAT_SLIDER(slider_name, pos_to_change.x, min, max, slider_step)
|
|
ELSE
|
|
ADD_WIDGET_FLOAT_READ_ONLY(slider_name, pos_to_change.x)
|
|
ENDIF
|
|
slider_name = name
|
|
slider_name += " y"
|
|
IF (slider_step != 0.0)
|
|
ADD_WIDGET_FLOAT_SLIDER(slider_name, pos_to_change.y, min, max, slider_step)
|
|
ELSE
|
|
ADD_WIDGET_FLOAT_READ_ONLY(slider_name, pos_to_change.y)
|
|
ENDIF
|
|
slider_name = name
|
|
slider_name += " z"
|
|
IF (slider_step != 0.0)
|
|
ADD_WIDGET_FLOAT_SLIDER(slider_name, pos_to_change.z, min, max, slider_step)
|
|
ELSE
|
|
ADD_WIDGET_FLOAT_READ_ONLY(slider_name, pos_to_change.z)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
///
|
|
/// PARAMS:
|
|
/// model_name -
|
|
/// AUTHOR: neil f
|
|
/// COMMENTS:
|
|
PROC ADD_WIDGET_VECTOR_READ_ONLY(STRING name, VECTOR &pos_to_change)
|
|
ADD_WIDGET_VECTOR_SLIDER(name, pos_to_change, 0.0,0.0, 0.0)
|
|
ENDPROC
|
|
|
|
/// PURPOSE: saves the vector to the given file at the given path.
|
|
/// PARAMS:
|
|
/// vVector_to_save -
|
|
/// FilePath -
|
|
/// FileName -
|
|
/// AUTHOR: alwyn.roberts@rockstarnorth.com
|
|
/// COMMENTS:
|
|
PROC SAVE_VECTOR_TO_NAMED_DEBUG_FILE(VECTOR vVector_to_save, string FilePath, string FileName)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE("<<", FilePath, FileName)
|
|
SAVE_FLOAT_TO_NAMED_DEBUG_FILE(vVector_to_save.x, FilePath, FileName)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(", ", FilePath, FileName)
|
|
SAVE_FLOAT_TO_NAMED_DEBUG_FILE(vVector_to_save.y, FilePath, FileName)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(", ", FilePath, FileName)
|
|
SAVE_FLOAT_TO_NAMED_DEBUG_FILE(vVector_to_save.z, FilePath, FileName)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(">>", FilePath, FileName)
|
|
ENDPROC
|
|
|
|
/// PURPOSE: saves the vector to temp_debug.txt
|
|
/// PARAMS:
|
|
/// vVector_to_save -
|
|
/// AUTHOR: alwyn.roberts@rockstarnorth.com
|
|
/// COMMENTS:
|
|
PROC SAVE_VECTOR_TO_DEBUG_FILE(VECTOR vVector_to_save)
|
|
SAVE_STRING_TO_DEBUG_FILE("<<")
|
|
SAVE_FLOAT_TO_DEBUG_FILE(vVector_to_save.x)
|
|
SAVE_STRING_TO_DEBUG_FILE(", ")
|
|
SAVE_FLOAT_TO_DEBUG_FILE(vVector_to_save.y)
|
|
SAVE_STRING_TO_DEBUG_FILE(", ")
|
|
SAVE_FLOAT_TO_DEBUG_FILE(vVector_to_save.z)
|
|
SAVE_STRING_TO_DEBUG_FILE(">>")
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
///
|
|
/// PARAMS:
|
|
/// model_name -
|
|
/// AUTHOR: alwyn.roberts@rockstarnorth.com
|
|
/// COMMENTS:
|
|
PROC ADD_WIDGET_DATE_READ_ONLY(STRING name, STRUCT_STAT_DATE &date_to_change)
|
|
TEXT_LABEL_63 slider_name = name
|
|
slider_name += " year"
|
|
ADD_WIDGET_INT_READ_ONLY(slider_name, date_to_change.year)
|
|
slider_name = name
|
|
slider_name += " month"
|
|
ADD_WIDGET_INT_READ_ONLY(slider_name, date_to_change.month)
|
|
slider_name = name
|
|
slider_name += " day"
|
|
ADD_WIDGET_INT_READ_ONLY(slider_name, date_to_change.day)
|
|
slider_name = name
|
|
slider_name += " hour"
|
|
ADD_WIDGET_INT_READ_ONLY(slider_name, date_to_change.hour)
|
|
slider_name = name
|
|
slider_name += " minute"
|
|
ADD_WIDGET_INT_READ_ONLY(slider_name, date_to_change.minute)
|
|
slider_name = name
|
|
slider_name += " seconds"
|
|
ADD_WIDGET_INT_READ_ONLY(slider_name, date_to_change.seconds)
|
|
slider_name = name
|
|
slider_name += " milliseconds"
|
|
ADD_WIDGET_INT_READ_ONLY(slider_name, date_to_change.Milliseconds)
|
|
|
|
ENDPROC
|
|
|
|
|
|
/// PURPOSE:
|
|
///
|
|
/// PARAMS:
|
|
/// model_name -
|
|
/// AUTHOR: alwyn.roberts@rockstarnorth.com
|
|
/// COMMENTS:
|
|
PROC ADD_WIDGET_DATE_SLIDER(STRING name, STRUCT_STAT_DATE &date_to_change, INT Min, INT Max, INT Slider )
|
|
TEXT_LABEL_63 slider_name = name
|
|
slider_name += " year"
|
|
ADD_WIDGET_INT_SLIDER(slider_name, date_to_change.year, Min, Max, Slider)
|
|
slider_name = name
|
|
slider_name += " month"
|
|
ADD_WIDGET_INT_SLIDER(slider_name, date_to_change.month, Min, Max, Slider)
|
|
slider_name = name
|
|
slider_name += " day"
|
|
ADD_WIDGET_INT_SLIDER(slider_name, date_to_change.day, Min, Max, Slider)
|
|
slider_name = name
|
|
slider_name += " hour"
|
|
ADD_WIDGET_INT_SLIDER(slider_name, date_to_change.hour, Min, Max, Slider)
|
|
slider_name = name
|
|
slider_name += " minute"
|
|
ADD_WIDGET_INT_SLIDER(slider_name, date_to_change.minute, Min, Max, Slider)
|
|
slider_name = name
|
|
slider_name += " seconds"
|
|
ADD_WIDGET_INT_SLIDER(slider_name, date_to_change.seconds, Min, Max, Slider)
|
|
slider_name = name
|
|
slider_name += " milliseconds"
|
|
ADD_WIDGET_INT_SLIDER(slider_name, date_to_change.Milliseconds, Min, Max, Slider)
|
|
|
|
ENDPROC
|
|
|
|
|
|
/// PURPOSE: procedure that prints a bool TRUE/FALSE to the console (NOT the game screen)
|
|
/// PARAMS:
|
|
/// B -
|
|
/// AUTHOR: alwyn.roberts@rockstarnorth.com
|
|
/// COMMENTS:
|
|
PROC PRINTBOOL(BOOL B)
|
|
IF B
|
|
PRINTSTRING("TRUE")
|
|
ELSE
|
|
PRINTSTRING("FALSE")
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
//PURPOSE: Save a bool to the given file at the given path.
|
|
PROC SAVE_BOOL_TO_NAMED_DEBUG_FILE(BOOL bBool, string FilePath, string FileName)
|
|
IF bBool = TRUE
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE("TRUE", FilePath, FileName)
|
|
ELSE
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE("FALSE", FilePath, FileName)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
//PURPOSE: Save a bool to the debug file
|
|
PROC SAVE_BOOL_TO_DEBUG_FILE(BOOL bBool)
|
|
IF bBool = TRUE
|
|
SAVE_STRING_TO_DEBUG_FILE("TRUE")
|
|
ELSE
|
|
SAVE_STRING_TO_DEBUG_FILE("FALSE")
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
// *****************************************************************************************
|
|
// Player Coordinates - Write to Debug File
|
|
// *****************************************************************************************
|
|
|
|
/// PURPOSE: Writes coordinates and heading to the debug file
|
|
/// INPUT PARAMS: paramCoords The coordinates to be output
|
|
/// paramHeading The heading to be output
|
|
/// NOTES: Assumes the debug file has already been opened and this routine leaves it open
|
|
PROC Write_Coordinates_And_Heading_To_File(VECTOR paramCoords, FLOAT paramHeading)
|
|
|
|
SAVE_VECTOR_TO_DEBUG_FILE(paramCoords)
|
|
SAVE_STRING_TO_DEBUG_FILE(", ")
|
|
SAVE_FLOAT_TO_DEBUG_FILE(paramHeading)
|
|
|
|
ENDPROC
|
|
|
|
|
|
// -----------------------------------------------------------------------------------------------------------
|
|
|
|
/// PURPOSE: Writes coordinates and heading to the debug file in the debug menu format
|
|
/// INPUT PARAMS: paramCoords The coordinates to be output
|
|
/// paramHeading The heading to be output
|
|
/// NOTES: Assumes the debug file has already been opened and this routine leaves it open
|
|
PROC Write_Debug_Menu_Coordinates_And_Heading_To_File(VECTOR paramCoords, FLOAT paramHeading)
|
|
|
|
SAVE_STRING_TO_DEBUG_FILE("x=\"")
|
|
SAVE_FLOAT_TO_DEBUG_FILE(paramCoords.x)
|
|
SAVE_STRING_TO_DEBUG_FILE("\" y=\"")
|
|
SAVE_FLOAT_TO_DEBUG_FILE(paramCoords.y)
|
|
SAVE_STRING_TO_DEBUG_FILE("\" z=\"")
|
|
SAVE_FLOAT_TO_DEBUG_FILE(paramCoords.z)
|
|
SAVE_STRING_TO_DEBUG_FILE("\"")
|
|
|
|
SAVE_STRING_TO_DEBUG_FILE(" heading=\"")
|
|
SAVE_FLOAT_TO_DEBUG_FILE(paramHeading)
|
|
SAVE_STRING_TO_DEBUG_FILE("\"")
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE:
|
|
/// KEY C: Writes player coordinates, heading, and roomname to the debug file
|
|
/// NOTES:
|
|
/// Location Information Includes: coordinates, heading, roomname
|
|
PROC Maintain_KeyC_Write_Player_Location_Details_To_File()
|
|
|
|
IF NOT (IS_PLAYER_PLAYING(PLAYER_ID()))
|
|
EXIT
|
|
ENDIF
|
|
|
|
IF NOT (IS_KEYBOARD_KEY_JUST_PRESSED(KEY_C))
|
|
EXIT
|
|
ENDIF
|
|
|
|
// Coordinates and heading
|
|
VECTOR xyzP = GET_ENTITY_COORDS(PLAYER_PED_ID())
|
|
FLOAT actualZ = xyzP.z
|
|
FLOAT heading = GET_ENTITY_HEADING(PLAYER_PED_ID())
|
|
|
|
FLOAT groundZ = 0.0
|
|
IF (GET_GROUND_Z_FOR_3D_COORD(xyzP, groundZ))
|
|
xyzP.z = groundZ
|
|
ENDIF
|
|
|
|
//Camera Coords
|
|
//CAMERA_INDEX vCam = GET_DEBUG_CAM()
|
|
VECTOR vCamPos = GET_FINAL_RENDERED_CAM_COORD() //GET_CAM_COORD(vCam)
|
|
VECTOR vCamRot = GET_FINAL_RENDERED_CAM_ROT() //GET_CAM_ROT(vCam)
|
|
FLOAT fFov = GET_FINAL_RENDERED_CAM_FOV() //GET_CAM_FOV(vCam)
|
|
FLOAT fGCamHeading = GET_GAMEPLAY_CAM_RELATIVE_HEADING()
|
|
FLOAT fGCamPitch = GET_GAMEPLAY_CAM_RELATIVE_PITCH()
|
|
|
|
|
|
// Dump the Coordinates to the debug file
|
|
OPEN_DEBUG_FILE()
|
|
SAVE_NEWLINE_TO_DEBUG_FILE()
|
|
SAVE_STRING_TO_DEBUG_FILE("Player Position = ")
|
|
Write_Coordinates_And_Heading_To_File(xyzP, heading)
|
|
|
|
// Dump the player's current room name to the debug file
|
|
STRING theRoom = GET_ROOM_NAME_FROM_PED_DEBUG(PLAYER_PED_ID())
|
|
|
|
SAVE_NEWLINE_TO_DEBUG_FILE()
|
|
SAVE_STRING_TO_DEBUG_FILE("Room Name: ")
|
|
|
|
IF (ARE_STRINGS_EQUAL(theRoom, ""))
|
|
SAVE_STRING_TO_DEBUG_FILE("NONE")
|
|
ELSE
|
|
SAVE_STRING_TO_DEBUG_FILE(theRoom)
|
|
ENDIF
|
|
|
|
INT iRoomKey = GET_ROOM_KEY_FROM_ENTITY(PLAYER_PED_ID())
|
|
|
|
SAVE_STRING_TO_DEBUG_FILE(" Room Key: ")
|
|
SAVE_INT_TO_DEBUG_FILE(iRoomKey)
|
|
|
|
// Actual 'Z' on the next file
|
|
SAVE_NEWLINE_TO_DEBUG_FILE()
|
|
SAVE_STRING_TO_DEBUG_FILE("Actual Z coords = ")
|
|
SAVE_FLOAT_TO_DEBUG_FILE(actualZ)
|
|
|
|
// Dump the player's coordinates and heading in the debug menu format
|
|
SAVE_NEWLINE_TO_DEBUG_FILE()
|
|
SAVE_STRING_TO_DEBUG_FILE("Debug Menu Warp = ")
|
|
Write_Debug_Menu_Coordinates_And_Heading_To_File(xyzP, heading)
|
|
|
|
SAVE_NEWLINE_TO_DEBUG_FILE()
|
|
SAVE_STRING_TO_DEBUG_FILE("Camera Position = ")
|
|
SAVE_VECTOR_TO_DEBUG_FILE(vCamPos)
|
|
|
|
SAVE_STRING_TO_DEBUG_FILE(", ")
|
|
SAVE_VECTOR_TO_DEBUG_FILE(vCamRot)
|
|
|
|
SAVE_NEWLINE_TO_DEBUG_FILE()
|
|
SAVE_STRING_TO_DEBUG_FILE("Camera FOV = ")
|
|
SAVE_FLOAT_TO_DEBUG_FILE(fFov)
|
|
|
|
SAVE_NEWLINE_TO_DEBUG_FILE()
|
|
SAVE_STRING_TO_DEBUG_FILE("Gameplay Cam Relative Heading = ")
|
|
SAVE_FLOAT_TO_DEBUG_FILE(fGCamHeading)
|
|
|
|
SAVE_NEWLINE_TO_DEBUG_FILE()
|
|
SAVE_STRING_TO_DEBUG_FILE("Gameplay Cam Relative Pitch = ")
|
|
SAVE_FLOAT_TO_DEBUG_FILE(fGCamPitch)
|
|
|
|
//Output the coords and heading in script command format.
|
|
SAVE_NEWLINE_TO_DEBUG_FILE()
|
|
SAVE_STRING_TO_DEBUG_FILE("SET_ENTITY_COORDS(entity, ")
|
|
SAVE_VECTOR_TO_DEBUG_FILE(xyzP)
|
|
SAVE_STRING_TO_DEBUG_FILE(")")
|
|
|
|
SAVE_NEWLINE_TO_DEBUG_FILE()
|
|
SAVE_STRING_TO_DEBUG_FILE("SET_ENTITY_HEADING(entity, ")
|
|
SAVE_FLOAT_TO_DEBUG_FILE(heading)
|
|
SAVE_STRING_TO_DEBUG_FILE(")")
|
|
|
|
// End output to the debug file
|
|
SAVE_NEWLINE_TO_DEBUG_FILE()
|
|
CLOSE_DEBUG_FILE()
|
|
|
|
PRINT_NOW("DUMPCOORDS", 1500, 1)
|
|
PRINTSTRING("WRITING PLAYER AND CAMERA COORDS TO FILE...")
|
|
PRINTNL()
|
|
|
|
ENDPROC
|
|
|
|
|
|
|
|
// *****************************************************************************************
|
|
// Locate Outlines - toggle on/off
|
|
// *****************************************************************************************
|
|
|
|
/// PURPOSE:
|
|
/// KEY L: Toggles Locate outlines on/off
|
|
PROC Maintain_KeyL_Toggle_Locate_Outlines()
|
|
|
|
// Activate?
|
|
IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_L)
|
|
// ...yes
|
|
IF (IS_BIT_SET(m_sharedDebugFlags, DBG_LOCATES_ON))
|
|
CLEAR_BIT(m_sharedDebugFlags, DBG_LOCATES_ON)
|
|
SET_DEBUG_ACTIVE(FALSE)
|
|
PRINTSTRING("Locate Outlines OFF")PRINTNL()
|
|
ELSE
|
|
SET_BIT(m_sharedDebugFlags, DBG_LOCATES_ON)
|
|
SET_DEBUG_ACTIVE(TRUE)
|
|
PRINTSTRING("Locate Outlines ON")PRINTNL()
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
// *****************************************************************************************
|
|
// Max special - trigger to set
|
|
// *****************************************************************************************
|
|
|
|
/// PURPOSE:
|
|
///
|
|
PROC Maintain_AltKeyK_Max_Special_Ability()
|
|
|
|
// Activate?
|
|
IF IS_DEBUG_KEY_JUST_PRESSED(KEY_K,KEYBOARD_MODIFIER_ALT,"Enable and max special ability for all chars")
|
|
|
|
|
|
PLAYER_INDEX p = GET_PLAYER_INDEX()
|
|
IF NOT IS_PLAYER_DEAD(p)
|
|
//PRINTLN("attempting unlocking and maxing special ability for current char")
|
|
|
|
|
|
|
|
SPECIAL_ABILITY_UNLOCK(GLOBAL_CHARACTER_SHEET_GET_GAME_MODEL(CHAR_FRANKLIN))
|
|
SPECIAL_ABILITY_UNLOCK(GLOBAL_CHARACTER_SHEET_GET_GAME_MODEL(CHAR_TREVOR))
|
|
SPECIAL_ABILITY_UNLOCK(GLOBAL_CHARACTER_SHEET_GET_GAME_MODEL(CHAR_MICHAEL))
|
|
ENABLE_SPECIAL_ABILITY(p,TRUE)
|
|
SPECIAL_ABILITY_FILL_METER(p, TRUE)
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
// *****************************************************************************************
|
|
// Screen Overlays - toggle on/off
|
|
// *****************************************************************************************
|
|
|
|
/// PURPOSE:
|
|
/// KEY O: Toggles screen overlays on/off
|
|
PROC Maintain_KeyO_Toggle_Screen_Overlays()
|
|
|
|
// Activate?
|
|
IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_O)
|
|
// ...yes
|
|
IF (IS_BIT_SET(m_sharedDebugFlags, DBG_OVERLAYS_ON))
|
|
CLEAR_BIT(m_sharedDebugFlags, DBG_OVERLAYS_ON)
|
|
DISPLAY_HUD(FALSE)
|
|
DISPLAY_RADAR(FALSE)
|
|
SET_DEBUG_TEXT_VISIBLE(FALSE)
|
|
PRINTSTRING("Screen Overlays OFF")PRINTNL()
|
|
ELSE
|
|
SET_BIT(m_sharedDebugFlags, DBG_OVERLAYS_ON)
|
|
DISPLAY_HUD(TRUE)
|
|
DISPLAY_RADAR(TRUE)
|
|
PRINTSTRING("Screen Overlays ON")PRINTNL()
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
|
|
|
|
// *****************************************************************************************
|
|
// Car Flp - Dpad Down
|
|
// *****************************************************************************************
|
|
|
|
/// PURPOSE:
|
|
/// If dpad down is held, right the player vehicle if it is not reasonably upright.
|
|
PROC Maintain_DpadDown_Check_For_Player_Car_Not_Upright()
|
|
|
|
CONST_INT HOLD_BUTTON_msec 2000
|
|
CONST_FLOAT UPRIGHT_THRESHOLD 0.125
|
|
|
|
VECTOR coordsVeh
|
|
FLOAT headingVeh
|
|
|
|
IF NOT (IS_PLAYER_PLAYING(PLAYER_ID()))
|
|
EXIT
|
|
ENDIF
|
|
|
|
VEHICLE_INDEX vehTemp
|
|
|
|
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
|
|
vehTemp = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
|
|
|
|
IF NOT IS_ENTITY_DEAD(vehTemp)
|
|
|
|
IF (GET_ENTITY_UPRIGHT_VALUE(vehTemp) < UPRIGHT_THRESHOLD)
|
|
|
|
IF (IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_DOWN))
|
|
|
|
SETTIMERA(0)
|
|
|
|
WHILE (IS_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_DOWN))
|
|
|
|
// early-out to avoid the reset check if the HUD is faded
|
|
IF NOT IS_SCREEN_FADED_IN()
|
|
EXIT
|
|
ENDIF
|
|
|
|
IF IS_ENTITY_DEAD(PLAYER_PED_ID())
|
|
EXIT
|
|
ENDIF
|
|
|
|
IF NOT (IS_PLAYER_PLAYING(PLAYER_ID()))
|
|
EXIT
|
|
ENDIF
|
|
|
|
// check to see if player has control before reset
|
|
IF NOT (IS_PLAYER_CONTROL_ON(PLAYER_ID()))
|
|
EXIT
|
|
ENDIF
|
|
|
|
IF NOT (IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()))
|
|
EXIT
|
|
ENDIF
|
|
|
|
BOOL bInBoat = FALSE
|
|
IF IS_PED_IN_ANY_BOAT(PLAYER_PED_ID())
|
|
OR IS_PED_IN_ANY_SUB(PLAYER_PED_ID())
|
|
bInBoat = TRUE
|
|
ENDIF
|
|
|
|
vehTemp = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
|
|
|
|
IF NOT bInBoat AND IS_ENTITY_IN_AIR(vehTemp)
|
|
EXIT
|
|
ENDIF
|
|
|
|
// Has the player waited the desired length of time?
|
|
IF (TIMERA() > HOLD_BUTTON_msec)
|
|
// ...yes, so fix the car
|
|
|
|
PRINTSTRING("DEBUG Fixing player car.")PRINTNL()
|
|
|
|
SET_VEHICLE_FIXED(vehTemp)
|
|
SET_ENTITY_HEALTH(vehTemp, 1000)
|
|
|
|
coordsVeh = GET_ENTITY_COORDS(vehTemp)
|
|
headingVeh = GET_ENTITY_HEADING(vehTemp)
|
|
|
|
IF NOT bInBoat
|
|
GET_CLOSEST_VEHICLE_NODE_WITH_HEADING(coordsVeh,coordsVeh,headingVeh)
|
|
SET_ENTITY_HEADING(vehTemp, headingVeh)
|
|
SET_ENTITY_COORDS(vehTemp,coordsVeh)
|
|
SET_VEHICLE_ON_GROUND_PROPERLY(vehTemp)
|
|
ELSE
|
|
SET_ENTITY_ROTATION(vehTemp, <<0,0,0>>)
|
|
SET_ENTITY_HEADING(vehTemp, headingVeh)
|
|
ENDIF
|
|
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0)
|
|
|
|
WHILE (IS_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_DOWN))
|
|
WAIT(0)
|
|
ENDWHILE
|
|
|
|
EXIT
|
|
|
|
ENDIF
|
|
|
|
// Keep the car alive if the button is pressed but timer hasn't elapsed
|
|
IF (IS_VEHICLE_DRIVEABLE(vehTemp))
|
|
IF GET_ENTITY_HEALTH(vehTemp) < 300
|
|
SET_ENTITY_HEALTH(vehTemp, 400)
|
|
ENDIF
|
|
ELSE
|
|
EXIT
|
|
ENDIF
|
|
|
|
WAIT(0)
|
|
|
|
ENDWHILE
|
|
|
|
// Button has been released, but too early, so do nothing
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
|
|
// *****************************************************************************************
|
|
// HASH KEY GENERATOR
|
|
// *****************************************************************************************
|
|
|
|
// PURPOSE: Creates the widgets that generates a hash key value from a string
|
|
PROC Create_Hash_Key_Generator_Widgets(structSharedDebugVars ¶mVars)
|
|
|
|
START_WIDGET_GROUP("Hash Key Generator")
|
|
paramVars.hashKeyGeneratorTextWidgetID = ADD_TEXT_WIDGET("Hash Key String")
|
|
ADD_WIDGET_INT_READ_ONLY("Hash Value", paramVars.hashKey)
|
|
ADD_WIDGET_BOOL("Generate Hash Key (accurate in temp_debug.txt)", paramVars.generateHashKey)
|
|
STOP_WIDGET_GROUP()
|
|
|
|
ENDPROC
|
|
|
|
|
|
// -----------------------------------------------------------------------------------------------------------
|
|
|
|
// PURPOSE: Reposition the vehicle back at the start of the recording ready to try again
|
|
PROC Maintain_Hash_Key_Generator_Widgets(structSharedDebugVars ¶mVars)
|
|
|
|
IF NOT (paramVars.generateHashKey)
|
|
EXIT
|
|
ENDIF
|
|
|
|
paramVars.generateHashKey = FALSE
|
|
|
|
STRING theString = GET_CONTENTS_OF_TEXT_WIDGET(paramVars.hashKeyGeneratorTextWidgetID)
|
|
IF NOT (IS_STRING_NULL(theString))
|
|
IF NOT (ARE_STRINGS_EQUAL(theString, ""))
|
|
paramVars.hashKey = GET_HASH_KEY(theString)
|
|
ELSE
|
|
EXIT
|
|
ENDIF
|
|
ELSE
|
|
EXIT
|
|
ENDIF
|
|
|
|
OPEN_DEBUG_FILE()
|
|
SAVE_NEWLINE_TO_DEBUG_FILE()
|
|
SAVE_STRING_TO_DEBUG_FILE("HASH KEY GENERATION: ")
|
|
SAVE_STRING_TO_DEBUG_FILE(theString)
|
|
SAVE_STRING_TO_DEBUG_FILE(": ")
|
|
SAVE_INT_TO_DEBUG_FILE(paramVars.hashKey)
|
|
SAVE_NEWLINE_TO_DEBUG_FILE()
|
|
CLOSE_DEBUG_FILE()
|
|
|
|
ENDPROC
|
|
|
|
|
|
// *****************************************************************************************
|
|
// GENERIC DEBUG WIDGETS
|
|
// *****************************************************************************************
|
|
|
|
// PURPOSE: Create widgets for generic debug
|
|
PROC Create_Generic_Debug_Widgets(structSharedDebugVars ¶mVars)
|
|
|
|
START_WIDGET_GROUP("General Debug")
|
|
ADD_WIDGET_BOOL("shutdown loading screens", paramVars.bShutdownLoadingScreens)
|
|
ADD_WIDGET_BOOL("force fade in", paramVars.forcefadein)
|
|
ADD_WIDGET_BOOL("force fade out", paramVars.forcefadeout)
|
|
ADD_WIDGET_BOOL("force kill player", paramVars.killplayer)
|
|
ADD_WIDGET_BOOL("force player control on", paramVars.forceplayercontrolon)
|
|
ADD_WIDGET_BOOL("force player control off", paramVars.forceplayercontroloff)
|
|
ADD_WIDGET_BOOL("force player position freeze", paramVars.forceplayerfrozen)
|
|
ADD_WIDGET_BOOL("force player position unfreeze", paramVars.forceplayernotfrozen)
|
|
ADD_WIDGET_BOOL("force player collision on", paramVars.forceplayercollision)
|
|
ADD_WIDGET_BOOL("force player collision off", paramVars.forceplayernocollision)
|
|
ADD_WIDGET_BOOL("return to gameplay camera", paramVars.returnToGameplayCam)
|
|
ADD_WIDGET_BOOL("reactivate world brains", paramVars.reactivateWorldBrains)
|
|
ADD_WIDGET_BOOL("clear area around player (100m radius)", paramVars.clearareaaroundplayer)
|
|
STOP_WIDGET_GROUP()
|
|
|
|
ENDPROC
|
|
|
|
|
|
// -----------------------------------------------------------------------------------------------------------
|
|
|
|
// PURPOSE: Handles generic debug
|
|
PROC Maintain_Generic_Debug_Widgets(structSharedDebugVars ¶mVars)
|
|
|
|
IF paramVars.bShutdownLoadingScreens
|
|
SHUTDOWN_LOADING_SCREEN()
|
|
paramVars.bShutdownLoadingScreens = FALSE
|
|
ENDIF
|
|
|
|
IF paramVars.forcefadein
|
|
|
|
IF IS_SCREEN_FADED_OUT() OR IS_SCREEN_FADING_OUT()
|
|
DO_SCREEN_FADE_IN(1000)
|
|
ENDIF
|
|
|
|
paramVars.forcefadein = FALSE
|
|
ENDIF
|
|
|
|
IF paramVars.forcefadeout
|
|
IF IS_SCREEN_FADED_IN() OR IS_SCREEN_FADING_IN()
|
|
DO_SCREEN_FADE_OUT(1000)
|
|
ENDIF
|
|
paramVars.forcefadeout = FALSE
|
|
ENDIF
|
|
|
|
IF paramVars.killplayer
|
|
IF NOT IS_ENTITY_DEAD(GET_PLAYER_PED(GET_PLAYER_INDEX()))
|
|
SET_ENTITY_HEALTH(GET_PLAYER_PED(GET_PLAYER_INDEX()), 1)
|
|
ENDIF
|
|
|
|
paramVars.killplayer = FALSE
|
|
ENDIF
|
|
|
|
IF paramVars.forceplayercontrolon
|
|
IF NOT IS_ENTITY_DEAD(GET_PLAYER_PED(GET_PLAYER_INDEX()))
|
|
SET_PLAYER_CONTROL(GET_PLAYER_INDEX(),TRUE,SPC_AMBIENT_SCRIPT)
|
|
ENDIF
|
|
|
|
paramVars.forceplayercontrolon = FALSE
|
|
ENDIF
|
|
|
|
IF paramVars.forceplayercontroloff
|
|
IF NOT IS_ENTITY_DEAD(GET_PLAYER_PED(GET_PLAYER_INDEX()))
|
|
SET_PLAYER_CONTROL(GET_PLAYER_INDEX(),FALSE,SPC_AMBIENT_SCRIPT)
|
|
ENDIF
|
|
paramVars.forceplayercontroloff = FALSE
|
|
ENDIF
|
|
|
|
IF paramVars.forceplayerfrozen
|
|
IF NOT IS_ENTITY_DEAD(GET_PLAYER_PED(GET_PLAYER_INDEX()))
|
|
FREEZE_ENTITY_POSITION(GET_PLAYER_PED(GET_PLAYER_INDEX()), TRUE)
|
|
ENDIF
|
|
paramVars.forceplayerfrozen = FALSE
|
|
ENDIF
|
|
|
|
IF paramVars.forceplayernotfrozen
|
|
IF NOT IS_ENTITY_DEAD(GET_PLAYER_PED(GET_PLAYER_INDEX()))
|
|
FREEZE_ENTITY_POSITION(GET_PLAYER_PED(GET_PLAYER_INDEX()), FALSE)
|
|
ENDIF
|
|
paramVars.forceplayernotfrozen = FALSE
|
|
ENDIF
|
|
|
|
IF paramVars.forceplayercollision
|
|
IF NOT IS_ENTITY_DEAD(GET_PLAYER_PED(GET_PLAYER_INDEX()))
|
|
SET_ENTITY_COLLISION(GET_PLAYER_PED(GET_PLAYER_INDEX()), TRUE)
|
|
ENDIF
|
|
paramVars.forceplayercollision = FALSE
|
|
ENDIF
|
|
|
|
IF paramVars.forceplayernocollision
|
|
IF NOT IS_ENTITY_DEAD(GET_PLAYER_PED(GET_PLAYER_INDEX()))
|
|
SET_ENTITY_COLLISION(GET_PLAYER_PED(GET_PLAYER_INDEX()), FALSE)
|
|
ENDIF
|
|
paramVars.forceplayernocollision = FALSE
|
|
ENDIF
|
|
|
|
IF paramVars.reactivateWorldBrains
|
|
REACTIVATE_ALL_WORLD_BRAINS_THAT_ARE_WAITING_TILL_OUT_OF_RANGE()
|
|
paramVars.reactivateWorldBrains = FALSE
|
|
ENDIF
|
|
|
|
IF paramVars.returnToGameplayCam
|
|
DESTROY_ALL_CAMS()
|
|
SET_WIDESCREEN_BORDERS(FALSE, 0)
|
|
RENDER_SCRIPT_CAMS(FALSE, FALSE)
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(0)
|
|
paramVars.returnToGameplayCam = FALSE
|
|
ENDIF
|
|
|
|
IF paramVars.clearareaaroundplayer
|
|
IF NOT IS_ENTITY_DEAD(GET_PLAYER_PED(GET_PLAYER_INDEX()))
|
|
CLEAR_AREA(GET_ENTITY_COORDS(GET_PLAYER_PED(GET_PLAYER_INDEX())), 100.0, TRUE)
|
|
ENDIF
|
|
|
|
paramVars.clearareaaroundplayer = FALSE
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
|
|
// *****************************************************************************************
|
|
// TEST SAVEGAME WIDGETS
|
|
// *****************************************************************************************
|
|
|
|
// PURPOSE: Create widgets for new savegame method test functions
|
|
PROC Create_Test_SaveGame_Widgets(structSharedDebugVars ¶mVars)
|
|
|
|
START_WIDGET_GROUP("Save Game")
|
|
ADD_WIDGET_BOOL("AutoSave", paramVars.doAutosave)
|
|
ADD_WIDGET_BOOL("Normal Save", paramVars.doNormalSave)
|
|
STOP_WIDGET_GROUP()
|
|
|
|
ENDPROC
|
|
|
|
|
|
// -----------------------------------------------------------------------------------------------------------
|
|
|
|
PROC Maintain_Test_Autosave(structSharedDebugVars ¶mVars)
|
|
|
|
IF NOT (paramVars.doAutosave)
|
|
EXIT
|
|
ENDIF
|
|
|
|
paramVars.doAutosave = FALSE
|
|
|
|
PRINTSTRING("--------------------------------------")
|
|
PRINTNL()
|
|
PRINTSTRING("KGM......DEBUG: About to perform autosave")
|
|
PRINTNL()
|
|
PRINTSTRING("--------------------------------------")
|
|
PRINTNL()
|
|
PRINTNL()
|
|
|
|
DO_AUTO_SAVE()
|
|
|
|
WHILE (IS_AUTO_SAVE_IN_PROGRESS())
|
|
WAIT(0)
|
|
PRINTSTRING("...KGM...DEBUG: doing autosave")
|
|
PRINTNL()
|
|
ENDWHILE
|
|
|
|
PRINTSTRING("--------------------------------------")
|
|
PRINTNL()
|
|
PRINTSTRING("KGM......DEBUG: Autosave Complete")
|
|
PRINTNL()
|
|
PRINTSTRING("--------------------------------------")
|
|
PRINTNL()
|
|
PRINTNL()
|
|
|
|
ENDPROC
|
|
|
|
|
|
// -----------------------------------------------------------------------------------------------------------
|
|
|
|
PROC Maintain_Test_Normal_Save(structSharedDebugVars ¶mVars)
|
|
|
|
IF NOT (paramVars.doNormalSave)
|
|
EXIT
|
|
ENDIF
|
|
|
|
paramVars.doNormalSave = FALSE
|
|
|
|
PRINTSTRING("--------------------------------------")
|
|
PRINTNL()
|
|
PRINTSTRING("KGM......DEBUG: About to perform normal save")
|
|
PRINTNL()
|
|
PRINTSTRING("--------------------------------------")
|
|
PRINTNL()
|
|
PRINTNL()
|
|
|
|
SET_SAVE_MENU_ACTIVE()
|
|
|
|
IF (DID_SAVE_COMPLETE_SUCCESSFULLY())
|
|
PRINTSTRING("--------------------------------------")
|
|
PRINTNL()
|
|
PRINTSTRING("KGM......DEBUG: Normal Save Completed Successfully")
|
|
PRINTNL()
|
|
PRINTSTRING("--------------------------------------")
|
|
PRINTNL()
|
|
PRINTNL()
|
|
ELSE
|
|
PRINTSTRING("--------------------------------------")
|
|
PRINTNL()
|
|
PRINTSTRING("KGM......DEBUG: Normal Save FAILED")
|
|
PRINTNL()
|
|
PRINTSTRING("--------------------------------------")
|
|
PRINTNL()
|
|
PRINTNL()
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
|
|
// -----------------------------------------------------------------------------------------------------------
|
|
|
|
// PURPOSE: Handles generic debug
|
|
PROC Maintain_Test_SaveGame_Widgets(structSharedDebugVars ¶mVars)
|
|
|
|
Maintain_Test_Autosave(paramVars)
|
|
Maintain_Test_Normal_Save(paramVars)
|
|
|
|
ENDPROC
|
|
|
|
|
|
// *****************************************************************************************
|
|
// VEHICLE RECORDINGS
|
|
// *****************************************************************************************
|
|
|
|
/// PURPOSE: Creates the widgets that allow a vehicle recording to start and stop
|
|
PROC Create_Vehicle_Recording_Widgets(structSharedDebugVars ¶mVars)
|
|
|
|
START_WIDGET_GROUP("Vehicle Recording")
|
|
paramVars.vehicleRecordingFilenameTextWidgetID = ADD_TEXT_WIDGET("Car Recording Filename")
|
|
ADD_WIDGET_INT_SLIDER("Car Recording ID", paramVars.vehicleRecordingID, 0, 999, 1)
|
|
ADD_WIDGET_BOOL("Start (ticked) / Stop (unticked)", paramVars.vehicleRecordingRequested)
|
|
ADD_WIDGET_BOOL("Reset Vehicle to Start Position?", paramVars.moveVehicleBackToStartPosition)
|
|
ADD_WIDGET_BOOL("Overwrite Duplicate Save Name?", paramVars.overwriteRecording)
|
|
ADD_WIDGET_BOOL("Overwrite Duplicate Save Name - DON'T AUTO-UNTICK?", paramVars.keepOverwriteRecordingTicked)
|
|
ADD_WIDGET_BOOL("Use SQUARE button as Start / Stop?", paramVars.allowSquareButtonToStartStopVehicleRecording)
|
|
ADD_WIDGET_BOOL("Record attached trailer at the same time", paramVars.bAllowSimultaneousTrailerRecording)
|
|
ADD_WIDGET_INT_SLIDER("Trailer Recording ID", paramVars.iTrailerRecordingID, 0, 999, 1)
|
|
STOP_WIDGET_GROUP()
|
|
|
|
ENDPROC
|
|
|
|
|
|
// *****************************************************************************************
|
|
// VEHICLE COLOURS
|
|
// *****************************************************************************************
|
|
|
|
/// PURPOSE: Creates the widgets that allow a vehicle recording to start and stop
|
|
PROC Create_Vehicle_Colour_Widgets(structSharedDebugVars ¶mVars)
|
|
|
|
// Reading in the carcol.xml file so we can find out the total car colour count
|
|
INT iColourCount
|
|
/*IF LOAD_XML_FILE("../../carcols.xml")
|
|
IF GET_NUMBER_OF_XML_NODES() <> 0
|
|
INT eachNode
|
|
FOR eachNode = 0 TO (GET_NUMBER_OF_XML_NODES()-1)
|
|
IF ARE_STRINGS_EQUAL(GET_XML_NODE_NAME(), "colorName")
|
|
iColourCount++
|
|
ENDIF
|
|
GET_NEXT_XML_NODE()
|
|
ENDFOR
|
|
ENDIF
|
|
DELETE_XML_FILE()
|
|
ENDIF*/
|
|
IF iColourCount = 0
|
|
iColourCount = 250
|
|
ENDIF
|
|
|
|
START_WIDGET_GROUP("Vehicle Colours")
|
|
ADD_WIDGET_BOOL("Activate", paramVars.vehicleColourActivate)
|
|
ADD_WIDGET_BOOL("Clean vehicle", paramVars.vehicleColourClean)
|
|
|
|
ADD_WIDGET_INT_SLIDER("Colour 1", paramVars.vehicleColour1, 0, iColourCount, 1)
|
|
ADD_WIDGET_INT_SLIDER("Colour 2", paramVars.vehicleColour2, 0, iColourCount, 1)
|
|
ADD_WIDGET_INT_SLIDER("Colour 3", paramVars.vehicleColour3, 0, iColourCount, 1)
|
|
ADD_WIDGET_INT_SLIDER("Colour 4", paramVars.vehicleColour4, 0, iColourCount, 1)
|
|
ADD_WIDGET_INT_SLIDER("Colour 5", paramVars.vehicleColour5, 0, iColourCount, 1)
|
|
ADD_WIDGET_INT_SLIDER("Colour 6", paramVars.vehicleColour6, 0, iColourCount, 1)
|
|
ADD_WIDGET_FLOAT_SLIDER("Env Eff", paramVars.vehicleEnvEff, 0, 1.0, 0.01)
|
|
|
|
|
|
paramVars.vehicleColourPath = ADD_TEXT_WIDGET("Save path")
|
|
paramVars.vehicleColourModel = ADD_TEXT_WIDGET("Vehicle model")
|
|
SET_CONTENTS_OF_TEXT_WIDGET(paramVars.vehicleColourPath, "X:\\")
|
|
SET_CONTENTS_OF_TEXT_WIDGET(paramVars.vehicleColourModel, "model")
|
|
|
|
ADD_WIDGET_BOOL("Output data", paramVars.vehicleColourOutput)
|
|
STOP_WIDGET_GROUP()
|
|
|
|
ENDPROC
|
|
|
|
/// PURPOSE: Creates the widgets that allow vehicle mods to be set
|
|
PROC Create_Vehicle_Mod_Widgets(structSharedDebugVars ¶mVars)
|
|
START_WIDGET_GROUP("Vehicle Mods")
|
|
|
|
ADD_WIDGET_BOOL("Display current mods", paramVars.vehicleModDisplayCurrentMods)
|
|
ADD_WIDGET_BOOL("Display selected vehicle current mods", paramVars.selectedVehicleModDisplayCurrentMods)
|
|
|
|
START_WIDGET_GROUP("Basic Mods")
|
|
ADD_WIDGET_BOOL("Enable", paramVars.vehicleModEnableBasic)
|
|
|
|
INT i
|
|
REPEAT COUNT_OF(paramVars.vehicleModExtraOn) i
|
|
TEXT_LABEL str = "Extra["
|
|
str += (i+1)
|
|
str += "]"
|
|
ADD_WIDGET_BOOL(str, paramVars.vehicleModExtraOn[i])
|
|
ENDREPEAT
|
|
|
|
ADD_WIDGET_INT_SLIDER("Livery", paramVars.vehicleLivery, 0, 10, 1)
|
|
ADD_WIDGET_INT_SLIDER("Livery2", paramVars.vehicleLivery2, 0, 10, 1)
|
|
ADD_WIDGET_INT_SLIDER("Window Tint Colour", paramVars.vehicleModWindowTintColour, 0, 100, 1)
|
|
ADD_WIDGET_INT_SLIDER("Tyre Smoke Colour R", paramVars.vehicleModTyreSmokeR, 0, 255, 1)
|
|
ADD_WIDGET_INT_SLIDER("Tyre Smoke Colour G", paramVars.vehicleModTyreSmokeG, 0, 255, 1)
|
|
ADD_WIDGET_INT_SLIDER("Tyre Smoke Colour B", paramVars.vehicleModTyreSmokeB, 0, 255, 1)
|
|
ADD_WIDGET_STRING("Tyre Type 0: Standard, 1: LGT, 2: BPT")
|
|
ADD_WIDGET_INT_SLIDER("Tyre Type", paramVars.vehicleTyreType, -1, 2, 1)
|
|
ADD_WIDGET_INT_SLIDER("Xenon Color Index", paramVars.XenonColorLightIndex, 0, 255, 1)
|
|
|
|
STOP_WIDGET_GROUP()
|
|
|
|
START_WIDGET_GROUP("Advanced Mods")
|
|
ADD_WIDGET_BOOL("Enable", paramVars.vehicleModEnableAdvanced)
|
|
ADD_WIDGET_INT_SLIDER("Wheel Type", paramVars.vehicleModWheelType, 0, 13, 1)
|
|
ADD_WIDGET_INT_SLIDER("MOD_SPOILER", paramVars.vehicleModSlotIndex[MOD_SPOILER], -1, 250, 1)
|
|
ADD_WIDGET_INT_SLIDER("MOD_BUMPER_F", paramVars.vehicleModSlotIndex[MOD_BUMPER_F], -1, 250, 1)
|
|
ADD_WIDGET_INT_SLIDER("MOD_BUMPER_R", paramVars.vehicleModSlotIndex[MOD_BUMPER_R], -1, 250, 1)
|
|
ADD_WIDGET_INT_SLIDER("MOD_SKIRT", paramVars.vehicleModSlotIndex[MOD_SKIRT], -1, 250, 1)
|
|
ADD_WIDGET_INT_SLIDER("MOD_EXHAUST", paramVars.vehicleModSlotIndex[MOD_EXHAUST], -1, 250, 1)
|
|
ADD_WIDGET_INT_SLIDER("MOD_CHASSIS", paramVars.vehicleModSlotIndex[MOD_CHASSIS], -1, 250, 1)
|
|
ADD_WIDGET_INT_SLIDER("MOD_GRILL", paramVars.vehicleModSlotIndex[MOD_GRILL], -1, 250, 1)
|
|
ADD_WIDGET_INT_SLIDER("MOD_BONNET", paramVars.vehicleModSlotIndex[MOD_BONNET], -1, 250, 1)
|
|
ADD_WIDGET_INT_SLIDER("MOD_WING_L", paramVars.vehicleModSlotIndex[MOD_WING_L], -1, 250, 1)
|
|
ADD_WIDGET_INT_SLIDER("MOD_WING_R", paramVars.vehicleModSlotIndex[MOD_WING_R], -1, 250, 1)
|
|
ADD_WIDGET_INT_SLIDER("MOD_ROOF", paramVars.vehicleModSlotIndex[MOD_ROOF], -1, 250, 1)
|
|
|
|
ADD_WIDGET_INT_SLIDER("MOD_ENGINE", paramVars.vehicleModSlotIndex[MOD_ENGINE], -1, 250, 1)
|
|
ADD_WIDGET_INT_SLIDER("MOD_BRAKES", paramVars.vehicleModSlotIndex[MOD_BRAKES], -1, 250, 1)
|
|
ADD_WIDGET_INT_SLIDER("MOD_GEARBOX", paramVars.vehicleModSlotIndex[MOD_GEARBOX], -1, 250, 1)
|
|
ADD_WIDGET_INT_SLIDER("MOD_HORN", paramVars.vehicleModSlotIndex[MOD_HORN], -1, 250, 1)
|
|
ADD_WIDGET_INT_SLIDER("MOD_SUSPENSION", paramVars.vehicleModSlotIndex[MOD_SUSPENSION], -1, 250, 1)
|
|
ADD_WIDGET_INT_SLIDER("MOD_ARMOUR", paramVars.vehicleModSlotIndex[MOD_ARMOUR], -1, 250, 1)
|
|
|
|
ADD_WIDGET_INT_SLIDER("MOD_TOGGLE_NITROUS", paramVars.vehicleModSlotIndex[MOD_TOGGLE_NITROUS], -1, 250, 1)
|
|
ADD_WIDGET_INT_SLIDER("MOD_TOGGLE_TURBO", paramVars.vehicleModSlotIndex[MOD_TOGGLE_TURBO], -1, 250, 1)
|
|
ADD_WIDGET_INT_SLIDER("MOD_TOGGLE_SUBWOOFER", paramVars.vehicleModSlotIndex[MOD_TOGGLE_SUBWOOFER], -1, 250, 1)
|
|
ADD_WIDGET_INT_SLIDER("MOD_TOGGLE_TYRE_SMOKE", paramVars.vehicleModSlotIndex[MOD_TOGGLE_TYRE_SMOKE], -1, 250, 1)
|
|
ADD_WIDGET_INT_SLIDER("MOD_TOGGLE_HYDRAULICS", paramVars.vehicleModSlotIndex[MOD_TOGGLE_HYDRAULICS], -1, 250, 1)
|
|
ADD_WIDGET_INT_SLIDER("MOD_TOGGLE_XENON_LIGHTS", paramVars.vehicleModSlotIndex[MOD_TOGGLE_XENON_LIGHTS], -1, 250, 1)
|
|
ADD_WIDGET_INT_SLIDER("MOD_WHEELS", paramVars.vehicleModSlotIndex[MOD_WHEELS], -1, 250, 1)
|
|
ADD_WIDGET_INT_SLIDER("MOD_REAR_WHEELS", paramVars.vehicleModSlotIndex[MOD_REAR_WHEELS], -1, 250, 1)
|
|
ADD_WIDGET_BOOL("Tire Design", paramVars.bTireDesign)
|
|
|
|
ADD_WIDGET_INT_SLIDER("MOD_PLTHOLDER", paramVars.vehicleModSlotIndex[MOD_PLTHOLDER], -1, 250, 1)
|
|
ADD_WIDGET_INT_SLIDER("MOD_PLTVANITY", paramVars.vehicleModSlotIndex[MOD_PLTVANITY], -1, 250, 1)
|
|
ADD_WIDGET_INT_SLIDER("MOD_INTERIOR1", paramVars.vehicleModSlotIndex[MOD_INTERIOR1], -1, 250, 1)
|
|
ADD_WIDGET_INT_SLIDER("MOD_INTERIOR2", paramVars.vehicleModSlotIndex[MOD_INTERIOR2], -1, 250, 1)
|
|
ADD_WIDGET_INT_SLIDER("MOD_INTERIOR3", paramVars.vehicleModSlotIndex[MOD_INTERIOR3], -1, 250, 1)
|
|
ADD_WIDGET_INT_SLIDER("MOD_INTERIOR4", paramVars.vehicleModSlotIndex[MOD_INTERIOR4], -1, 250, 1)
|
|
ADD_WIDGET_INT_SLIDER("MOD_INTERIOR5", paramVars.vehicleModSlotIndex[MOD_INTERIOR5], -1, 250, 1)
|
|
ADD_WIDGET_INT_SLIDER("MOD_SEATS", paramVars.vehicleModSlotIndex[MOD_SEATS], -1, 250, 1)
|
|
ADD_WIDGET_INT_SLIDER("MOD_STEERING", paramVars.vehicleModSlotIndex[MOD_STEERING], -1, 250, 1)
|
|
ADD_WIDGET_INT_SLIDER("MOD_KNOB", paramVars.vehicleModSlotIndex[MOD_KNOB], -1, 250, 1)
|
|
ADD_WIDGET_INT_SLIDER("MOD_PLAQUE", paramVars.vehicleModSlotIndex[MOD_PLAQUE], -1, 250, 1)
|
|
ADD_WIDGET_INT_SLIDER("MOD_ICE", paramVars.vehicleModSlotIndex[MOD_ICE], -1, 250, 1)
|
|
ADD_WIDGET_INT_SLIDER("MOD_TRUNK", paramVars.vehicleModSlotIndex[MOD_TRUNK], -1, 250, 1)
|
|
ADD_WIDGET_INT_SLIDER("MOD_HYDRO", paramVars.vehicleModSlotIndex[MOD_HYDRO], -1, 250, 1)
|
|
ADD_WIDGET_INT_SLIDER("MOD_ENGINEBAY1", paramVars.vehicleModSlotIndex[MOD_ENGINEBAY1], -1, 250, 1)
|
|
ADD_WIDGET_INT_SLIDER("MOD_ENGINEBAY2", paramVars.vehicleModSlotIndex[MOD_ENGINEBAY2], -1, 250, 1)
|
|
ADD_WIDGET_INT_SLIDER("MOD_ENGINEBAY3", paramVars.vehicleModSlotIndex[MOD_ENGINEBAY3], -1, 250, 1)
|
|
ADD_WIDGET_INT_SLIDER("MOD_CHASSIS2", paramVars.vehicleModSlotIndex[MOD_CHASSIS2], -1, 250, 1)
|
|
ADD_WIDGET_INT_SLIDER("MOD_CHASSIS3", paramVars.vehicleModSlotIndex[MOD_CHASSIS3], -1, 250, 1)
|
|
ADD_WIDGET_INT_SLIDER("MOD_CHASSIS4", paramVars.vehicleModSlotIndex[MOD_CHASSIS4], -1, 250, 1)
|
|
ADD_WIDGET_INT_SLIDER("MOD_CHASSIS5", paramVars.vehicleModSlotIndex[MOD_CHASSIS5], -1, 250, 1)
|
|
ADD_WIDGET_INT_SLIDER("MOD_DOOR_L", paramVars.vehicleModSlotIndex[MOD_DOOR_L], -1, 250, 1)
|
|
ADD_WIDGET_INT_SLIDER("MOD_DOOR_R", paramVars.vehicleModSlotIndex[MOD_DOOR_R], -1, 250, 1)
|
|
ADD_WIDGET_INT_SLIDER("MOD_LIVERY", paramVars.vehicleModSlotIndex[MOD_LIVERY], -1, 250, 1)
|
|
|
|
STOP_WIDGET_GROUP()
|
|
|
|
STOP_WIDGET_GROUP()
|
|
ENDPROC
|
|
|
|
PROC Create_Vehicle_Performance_Widgets(structSharedDebugVars ¶mVars)
|
|
START_WIDGET_GROUP("Vehicle Performance")
|
|
|
|
ADD_WIDGET_BOOL("Enable max speed override", paramVars.bMaxSpeedOverride)
|
|
ADD_WIDGET_FLOAT_SLIDER("SET_VEHICLE_MAX_SPEED", paramVars.vehicleMaxSpeedOverride, -100.0, 100.0, 1.0)
|
|
|
|
ADD_WIDGET_BOOL("Enable top speed override", paramVars.bTopSpeedOverride)
|
|
ADD_WIDGET_FLOAT_SLIDER("MODIFY_VEHICLE_TOP_SPEED", paramVars.vehicleTopSpeedOverride, -100.0, 100.0, 1.0)
|
|
|
|
STOP_WIDGET_GROUP()
|
|
ENDPROC
|
|
|
|
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------------------------------------------
|
|
|
|
// PURPOSE: Reposition the vehicle back at the start of the recording ready to try again
|
|
PROC Move_Vehicle_Back_To_Start_Of_Recording(structSharedDebugVars ¶mVars)
|
|
|
|
IF (paramVars.vehicleRecordingBeingRecorded)
|
|
PRINT_NOW("CRECSTOP5", 8000, 1)
|
|
ENDIF
|
|
|
|
paramVars.vehicleRecordingRequested = FALSE
|
|
paramVars.vehicleRecordingBeingRecorded = FALSE
|
|
|
|
STOP_RECORDING_ALL_VEHICLES()
|
|
|
|
IF NOT (IS_PLAYER_PLAYING(PLAYER_ID()))
|
|
EXIT
|
|
ENDIF
|
|
|
|
IF NOT (IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()))
|
|
EXIT
|
|
ENDIF
|
|
|
|
paramVars.indexVehicleRecordingVehicle = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
|
|
SET_ENTITY_COORDS(paramVars.indexVehicleRecordingVehicle, paramVars.xyzVehicleRecordingStartPos)
|
|
SET_ENTITY_QUATERNION(paramVars.indexVehicleRecordingVehicle, paramVars.quatVehicleRecordingStartX, paramVars.quatVehicleRecordingStartY, paramVars.quatVehicleRecordingStartZ, paramVars.quatVehicleRecordingStartW)
|
|
|
|
IF paramVars.bAllowSimultaneousTrailerRecording
|
|
IF NOT IS_ENTITY_DEAD(paramVars.vehTrailerToRecord)
|
|
SET_ENTITY_COORDS_NO_OFFSET(paramVars.vehTrailerToRecord, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(paramVars.indexVehicleRecordingVehicle, <<0.0, -10.0, 0.0>>))
|
|
SET_ENTITY_ROTATION(paramVars.vehTrailerToRecord, GET_ENTITY_ROTATION(paramVars.indexVehicleRecordingVehicle))
|
|
ATTACH_VEHICLE_TO_TRAILER(paramVars.indexVehicleRecordingVehicle, paramVars.vehTrailerToRecord)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
|
|
// -----------------------------------------------------------------------------------------------------------
|
|
|
|
// PURPOSE: MAke sure the conditions are right to continue with the vehicle recording
|
|
PROC Maintain_Active_Vehicle_Recording(structSharedDebugVars ¶mVars)
|
|
|
|
IF NOT (IS_PLAYER_PLAYING(PLAYER_ID()))
|
|
PRINT_NOW("CRECENOP5", 8000, 1)
|
|
paramVars.vehicleRecordingRequested = FALSE
|
|
paramVars.vehicleRecordingBeingRecorded = FALSE
|
|
STOP_RECORDING_ALL_VEHICLES()
|
|
EXIT
|
|
ENDIF
|
|
|
|
IF NOT (IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()))
|
|
PRINT_NOW("CRECENOC5", 8000, 1)
|
|
paramVars.vehicleRecordingRequested = FALSE
|
|
paramVars.vehicleRecordingBeingRecorded = FALSE
|
|
STOP_RECORDING_ALL_VEHICLES()
|
|
EXIT
|
|
ENDIF
|
|
|
|
IF NOT (IS_VEHICLE_DRIVEABLE(paramVars.indexVehicleRecordingVehicle))
|
|
PRINT_NOW("CRECEDED5", 8000, 1)
|
|
paramVars.vehicleRecordingRequested = FALSE
|
|
paramVars.vehicleRecordingBeingRecorded = FALSE
|
|
STOP_RECORDING_ALL_VEHICLES()
|
|
EXIT
|
|
ENDIF
|
|
|
|
IF NOT (IS_RECORDING_GOING_ON_FOR_VEHICLE(paramVars.indexVehicleRecordingVehicle))
|
|
PRINT_NOW("CRECENOR5", 8000, 1)
|
|
paramVars.vehicleRecordingRequested = FALSE
|
|
paramVars.vehicleRecordingBeingRecorded = FALSE
|
|
STOP_RECORDING_ALL_VEHICLES()
|
|
EXIT
|
|
ENDIF
|
|
|
|
// Everything fine, so let it continue
|
|
|
|
ENDPROC
|
|
|
|
|
|
// -----------------------------------------------------------------------------------------------------------
|
|
|
|
// PURPOSE: Write the position and quaternian details to the debug file
|
|
PROC Write_Vehicle_Recording_Start_Position_Details_To_Debug_File(structSharedDebugVars ¶mVars)
|
|
|
|
OPEN_DEBUG_FILE()
|
|
SAVE_NEWLINE_TO_DEBUG_FILE()
|
|
|
|
STRING theFilename = GET_CONTENTS_OF_TEXT_WIDGET(paramVars.vehicleRecordingFilenameTextWidgetID)
|
|
IF NOT (IS_STRING_NULL(theFilename))
|
|
IF NOT (ARE_STRINGS_EQUAL(theFilename, ""))
|
|
SAVE_STRING_TO_DEBUG_FILE(theFilename)
|
|
SAVE_STRING_TO_DEBUG_FILE(": ")
|
|
ENDIF
|
|
ENDIF
|
|
SAVE_INT_TO_DEBUG_FILE(paramVars.vehicleRecordingID)
|
|
SAVE_NEWLINE_TO_DEBUG_FILE()
|
|
|
|
SAVE_STRING_TO_DEBUG_FILE("Vehicle Rec Start = ")
|
|
SAVE_VECTOR_TO_DEBUG_FILE(paramVars.xyzVehicleRecordingStartPos)
|
|
SAVE_NEWLINE_TO_DEBUG_FILE()
|
|
SAVE_STRING_TO_DEBUG_FILE("Vehicle Rec Rot = ")
|
|
SAVE_VECTOR_TO_DEBUG_FILE(paramVars.xyzVehicleRecordingStartRot)
|
|
SAVE_NEWLINE_TO_DEBUG_FILE()
|
|
SAVE_STRING_TO_DEBUG_FILE("Quat = ")
|
|
SAVE_FLOAT_TO_DEBUG_FILE(paramVars.quatVehicleRecordingStartX)
|
|
SAVE_STRING_TO_DEBUG_FILE(", ")
|
|
SAVE_FLOAT_TO_DEBUG_FILE(paramVars.quatVehicleRecordingStartY)
|
|
SAVE_STRING_TO_DEBUG_FILE(", ")
|
|
SAVE_FLOAT_TO_DEBUG_FILE(paramVars.quatVehicleRecordingStartZ)
|
|
SAVE_STRING_TO_DEBUG_FILE(", ")
|
|
SAVE_FLOAT_TO_DEBUG_FILE(paramVars.quatVehicleRecordingStartW)
|
|
SAVE_NEWLINE_TO_DEBUG_FILE()
|
|
CLOSE_DEBUG_FILE()
|
|
|
|
ENDPROC
|
|
|
|
|
|
// -----------------------------------------------------------------------------------------------------------
|
|
|
|
PROC Maintain_Vehicle_Recording_Widgets(structSharedDebugVars ¶mVars)
|
|
|
|
// reset to start position
|
|
IF (paramVars.moveVehicleBackToStartPosition)
|
|
Move_Vehicle_Back_To_Start_Of_Recording(paramVars)
|
|
paramVars.moveVehicleBackToStartPosition = FALSE
|
|
ENDIF
|
|
|
|
// Check if the PS3 Pad SQUARE button should start/stop a recording
|
|
IF (paramVars.allowSquareButtonToStartStopVehicleRecording)
|
|
IF (IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_X))
|
|
// Change the state of the vehicleRecordingRequested flag
|
|
IF (paramVars.vehicleRecordingRequested)
|
|
paramVars.vehicleRecordingRequested = FALSE
|
|
ELSE
|
|
paramVars.vehicleRecordingRequested = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF (paramVars.vehicleRecordingRequested)
|
|
IF (paramVars.vehicleRecordingBeingRecorded)
|
|
Maintain_Active_Vehicle_Recording(paramVars)
|
|
EXIT
|
|
ENDIF
|
|
|
|
// Error Checking Before Starting Recording
|
|
// ...player playing?
|
|
IF NOT (IS_PLAYER_PLAYING(PLAYER_ID()))
|
|
PRINT_NOW("CRECSNOP5", 8000, 1)
|
|
paramVars.vehicleRecordingRequested = FALSE
|
|
EXIT
|
|
ENDIF
|
|
|
|
// ...player in vehicle?
|
|
IF NOT (IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID()))
|
|
PRINT_NOW("CRECSNOC5", 8000, 1)
|
|
paramVars.vehicleRecordingRequested = FALSE
|
|
EXIT
|
|
ENDIF
|
|
|
|
paramVars.indexVehicleRecordingVehicle = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
|
|
|
|
IF paramVars.bAllowSimultaneousTrailerRecording
|
|
IF IS_VEHICLE_ATTACHED_TO_TRAILER(paramVars.indexVehicleRecordingVehicle)
|
|
GET_VEHICLE_TRAILER_VEHICLE(paramVars.indexVehicleRecordingVehicle, paramVars.vehTrailerToRecord)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// ...vehicle dead?
|
|
IF NOT (IS_VEHICLE_DRIVEABLE(paramVars.indexVehicleRecordingVehicle))
|
|
PRINT_NOW("CRECSDED5", 8000, 1)
|
|
paramVars.vehicleRecordingRequested = FALSE
|
|
EXIT
|
|
ENDIF
|
|
|
|
// ...is recording already going on for this vehicle?
|
|
IF (IS_RECORDING_GOING_ON_FOR_VEHICLE(paramVars.indexVehicleRecordingVehicle))
|
|
PRINT_NOW("CRECSREC5", 8000, 1)
|
|
paramVars.vehicleRecordingRequested = FALSE
|
|
STOP_RECORDING_ALL_VEHICLES()
|
|
EXIT
|
|
ENDIF
|
|
|
|
STRING theFilename = GET_CONTENTS_OF_TEXT_WIDGET(paramVars.vehicleRecordingFilenameTextWidgetID)
|
|
IF (IS_STRING_NULL(theFilename))
|
|
PRINT_NOW("CRECSNFN5", 8000, 1)
|
|
paramVars.vehicleRecordingRequested = FALSE
|
|
STOP_RECORDING_ALL_VEHICLES()
|
|
EXIT
|
|
ELSE
|
|
IF (ARE_STRINGS_EQUAL(theFilename, ""))
|
|
OR (ARE_STRINGS_EQUAL(theFilename, "New text widget"))
|
|
PRINT_NOW("CRECSNFN5", 8000, 1)
|
|
paramVars.vehicleRecordingRequested = FALSE
|
|
STOP_RECORDING_ALL_VEHICLES()
|
|
EXIT
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT (START_RECORDING_VEHICLE(paramVars.indexVehicleRecordingVehicle, paramVars.vehicleRecordingID, theFilename, paramVars.overwriteRecording))
|
|
PRINT_NOW("CRECSRTN5", 8000, 1)
|
|
paramVars.vehicleRecordingRequested = FALSE
|
|
STOP_RECORDING_ALL_VEHICLES()
|
|
EXIT
|
|
ENDIF
|
|
|
|
//Start recording the trailer if the front vehicle successfully started recording.
|
|
IF paramVars.bAllowSimultaneousTrailerRecording
|
|
IF NOT IS_ENTITY_DEAD(paramVars.vehTrailerToRecord)
|
|
START_RECORDING_VEHICLE(paramVars.vehTrailerToRecord, paramVars.iTrailerRecordingID, theFilename, paramVars.overwriteRecording)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// Everything okay, so start recording
|
|
PRINT_NOW("CRECSTART5", 300000, 1)
|
|
|
|
// Clear the 'overwrite' flag (unless it has been requested to not auto-untick)
|
|
IF NOT (paramVars.keepOverwriteRecordingTicked)
|
|
paramVars.overwriteRecording = FALSE
|
|
ENDIF
|
|
|
|
// grab the start position and quaternion
|
|
paramVars.xyzVehicleRecordingStartPos = GET_ENTITY_COORDS(paramVars.indexVehicleRecordingVehicle)
|
|
paramVars.xyzVehicleRecordingStartRot = GET_ENTITY_ROTATION(paramVars.indexVehicleRecordingVehicle)
|
|
GET_ENTITY_QUATERNION(paramVars.indexVehicleRecordingVehicle, paramVars.quatVehicleRecordingStartX, paramVars.quatVehicleRecordingStartY, paramVars.quatVehicleRecordingStartZ, paramVars.quatVehicleRecordingStartW)
|
|
Write_Vehicle_Recording_Start_Position_Details_To_Debug_File(paramVars)
|
|
paramVars.vehicleRecordingBeingRecorded = TRUE
|
|
EXIT
|
|
ENDIF
|
|
|
|
// Recording not activated, so stop one if one is currently being done
|
|
IF (paramVars.vehicleRecordingBeingRecorded)
|
|
// ...currently doing a vehicle recording, so stop it
|
|
PRINT_NOW("CRECSTOP5", 8000, 1)
|
|
STOP_RECORDING_ALL_VEHICLES()
|
|
paramVars.vehicleRecordingBeingRecorded = FALSE
|
|
EXIT
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
|
|
// -----------------------------------------------------------------------------------------------------------
|
|
|
|
// PURPOSE: Allows vehicle artists to quickly switch vehicle colours when setting up the carcols.dat file
|
|
PROC Maintain_Vehicle_Colour_Widgets(structSharedDebugVars ¶mVars)
|
|
|
|
// Only update when activated
|
|
IF paramVars.vehicleColourActivate
|
|
IF NOT IS_PED_INJURED(PLAYER_PED_ID())
|
|
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
|
|
|
|
VEHICLE_INDEX vehTemp = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(vehTemp)
|
|
|
|
INT iCol1, iCol2, iCol3, iCol4
|
|
INT iCol5, iCol6
|
|
|
|
// Set the default colours if we have just got in the vehicle
|
|
IF NOT paramVars.vehicleColourInitialise
|
|
GET_VEHICLE_COLOURS(vehTemp, paramVars.vehicleColour1, paramVars.vehicleColour2)
|
|
GET_VEHICLE_EXTRA_COLOURS(vehTemp, paramVars.vehicleColour3, paramVars.vehicleColour4)
|
|
GET_VEHICLE_EXTRA_COLOUR_5(vehTemp, paramVars.vehicleColour5)
|
|
paramVars.vehicleColourInitialise = TRUE
|
|
ENDIF
|
|
|
|
// Grab the current vehicle colours
|
|
GET_VEHICLE_COLOURS(vehTemp, iCol1,iCol2)
|
|
GET_VEHICLE_EXTRA_COLOURS(vehTemp, iCol3,iCol4)
|
|
GET_VEHICLE_EXTRA_COLOUR_5(vehTemp, iCol5)
|
|
GET_VEHICLE_EXTRA_COLOUR_5(vehTemp, iCol6)
|
|
|
|
// Update the vehicle colours
|
|
IF iCol1 <> paramVars.vehicleColour1 OR iCol2 <> paramVars.vehicleColour2
|
|
IF IS_VEHICLE_COLOUR_INDEX_LOCKED(paramVars.vehicleColour1)
|
|
OR IS_VEHICLE_COLOUR_INDEX_LOCKED(paramVars.vehicleColour2)
|
|
// skip
|
|
ELSE
|
|
SET_VEHICLE_COLOURS(vehTemp, paramVars.vehicleColour1, paramVars.vehicleColour2)
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// Update the vehicle extra colours
|
|
IF iCol3 <> paramVars.vehicleColour3 OR iCol4 <> paramVars.vehicleColour4
|
|
SET_VEHICLE_EXTRA_COLOURS(vehTemp, paramVars.vehicleColour3, paramVars.vehicleColour4)
|
|
ENDIF
|
|
|
|
// Update the vehicle extra colour 5 & 6
|
|
IF iCol6 <> paramVars.vehicleColour5
|
|
SET_VEHICLE_EXTRA_COLOUR_5(vehTemp, paramVars.vehicleColour5)
|
|
ENDIF
|
|
IF iCol6 <> paramVars.vehicleColour6
|
|
SET_VEHICLE_EXTRA_COLOUR_6(vehTemp, paramVars.vehicleColour6)
|
|
ENDIF
|
|
|
|
FLOAT fEnvEff = GET_VEHICLE_ENVEFF_SCALE(vehTemp)
|
|
IF fEnvEff != paramVars.vehicleEnvEff
|
|
SET_VEHICLE_ENVEFF_SCALE(vehTemp, paramVars.vehicleEnvEff)
|
|
ENDIF
|
|
|
|
// Clean the vehicle
|
|
IF paramVars.vehicleColourClean
|
|
SET_VEHICLE_DIRT_LEVEL(vehTemp, 0.0)
|
|
paramVars.vehicleColourClean = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
paramVars.vehicleColourInitialise = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
// Output the colours in number form
|
|
IF paramVars.vehicleColourOutput
|
|
|
|
BOOL bNewData = FALSE
|
|
|
|
TEXT_LABEL_23 sModel = GET_CONTENTS_OF_TEXT_WIDGET(paramVars.vehicleColourModel)
|
|
TEXT_LABEL_63 sPath = GET_CONTENTS_OF_TEXT_WIDGET(paramVars.vehicleColourPath)
|
|
TEXT_LABEL_23 sFile = sModel
|
|
sFile += ".txt"
|
|
|
|
// Compare the strings so we know if we should add the initial data
|
|
IF NOT ARE_STRINGS_EQUAL(paramVars.vehicleColourPathStr, sPath)
|
|
OR NOT ARE_STRINGS_EQUAL(paramVars.vehicleColourModelStr, sModel)
|
|
bNewData = TRUE
|
|
paramVars.vehicleColourModelStr = sModel
|
|
paramVars.vehicleColourPathStr = sPath
|
|
ENDIF
|
|
|
|
OPEN_NAMED_DEBUG_FILE(sPath, sFile)
|
|
|
|
IF bNewData
|
|
SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(sPath, sFile)
|
|
SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(sPath, sFile)
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(sModel, sPath, sFile)
|
|
|
|
|
|
IF GET_LENGTH_OF_LITERAL_STRING(sModel) < 3
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(", ", sPath, sFile)
|
|
ELIF GET_LENGTH_OF_LITERAL_STRING(sModel) < 8
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(", ", sPath, sFile)
|
|
ELSE
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(", ", sPath, sFile)
|
|
ENDIF
|
|
ELSE
|
|
SAVE_STRING_TO_NAMED_DEBUG_FILE(" ", sPath, sFile)
|
|
ENDIF
|
|
|
|
SAVE_INT_TO_NAMED_DEBUG_FILE(paramVars.vehicleColour1, sPath, sFile)SAVE_STRING_TO_NAMED_DEBUG_FILE(",", sPath, sFile)
|
|
SAVE_INT_TO_NAMED_DEBUG_FILE(paramVars.vehicleColour2, sPath, sFile)SAVE_STRING_TO_NAMED_DEBUG_FILE(",", sPath, sFile)
|
|
SAVE_INT_TO_NAMED_DEBUG_FILE(paramVars.vehicleColour3, sPath, sFile)SAVE_STRING_TO_NAMED_DEBUG_FILE(",", sPath, sFile)
|
|
|
|
IF paramVars.vehicleColour4 <> 0
|
|
SAVE_INT_TO_NAMED_DEBUG_FILE(paramVars.vehicleColour4, sPath, sFile)SAVE_STRING_TO_NAMED_DEBUG_FILE(",", sPath, sFile)
|
|
ENDIF
|
|
|
|
CLOSE_DEBUG_FILE()
|
|
|
|
PRINTSTRING("*** Vehicle colour data output to '")PRINTSTRING(sPath)PRINTSTRING(sFile)PRINTNL()
|
|
paramVars.vehicleColourOutput = FALSE
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
PROC Display_Vehicle_Mod_Debug(VEHICLE_INDEX &vehID, MOD_TYPE eMod, BOOL bToggleMod, STRING sTitle, FLOAT fTextX, FLOAT fTextY)
|
|
|
|
TEXT_LABEL_63 tlText = sTitle
|
|
tlText += ": "
|
|
|
|
IF NOT bToggleMod
|
|
IF (GET_VEHICLE_MOD(vehID, eMod) = -1)
|
|
tlText += "None"
|
|
ELSE
|
|
tlText += (GET_VEHICLE_MOD(vehID, eMod)+1)
|
|
tlText += " of "
|
|
tlText += (GET_NUM_VEHICLE_MODS(vehID, eMod))
|
|
ENDIF
|
|
ELSE
|
|
IF IS_TOGGLE_MOD_ON(vehID, eMod)
|
|
tlText += "On"
|
|
ELSE
|
|
tlText += "Off"
|
|
ENDIF
|
|
ENDIF
|
|
|
|
SET_TEXT_SCALE(0.4000, 0.4000)
|
|
SET_TEXT_COLOUR(255, 255, 255, 255)
|
|
DISPLAY_TEXT_WITH_LITERAL_STRING(fTextX, fTextY, "STRING", tlText)
|
|
ENDPROC
|
|
|
|
PROC Maintain_Vehicle_Mod_Widgets(structSharedDebugVars ¶mVars)
|
|
|
|
IF IS_PED_INJURED(PLAYER_PED_ID())
|
|
paramVars.vehicleModDisplayCurrentMods = FALSE
|
|
paramVars.vehicleModEnableBasic = FALSE
|
|
paramVars.vehicleModEnableAdvanced = FALSE
|
|
paramVars.vehicleModDataSetBasic = FALSE
|
|
paramVars.vehicleModDataSetAdvanced = FALSE
|
|
paramVars.selectedVehicleModDisplayCurrentMods = FALSE
|
|
EXIT
|
|
ENDIF
|
|
VEHICLE_INDEX vehID
|
|
|
|
IF !paramVars.selectedVehicleModDisplayCurrentMods
|
|
vehID = GET_PLAYERS_LAST_VEHICLE()
|
|
ELSE
|
|
IF DOES_ENTITY_EXIST(GET_FOCUS_ENTITY_INDEX())
|
|
vehID = GET_VEHICLE_INDEX_FROM_ENTITY_INDEX(GET_FOCUS_ENTITY_INDEX())
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF NOT DOES_ENTITY_EXIST(vehID)
|
|
paramVars.vehicleModDisplayCurrentMods = FALSE
|
|
paramVars.vehicleModEnableBasic = FALSE
|
|
paramVars.vehicleModEnableAdvanced = FALSE
|
|
paramVars.vehicleModDataSetBasic = FALSE
|
|
paramVars.vehicleModDataSetAdvanced = FALSE
|
|
EXIT
|
|
ENDIF
|
|
|
|
IF NOT IS_VEHICLE_DRIVEABLE(vehID)
|
|
paramVars.vehicleModDisplayCurrentMods = FALSE
|
|
paramVars.vehicleModEnableBasic = FALSE
|
|
paramVars.vehicleModEnableAdvanced = FALSE
|
|
paramVars.vehicleModDataSetBasic = FALSE
|
|
paramVars.vehicleModDataSetAdvanced = FALSE
|
|
EXIT
|
|
ENDIF
|
|
|
|
IF GET_NUM_MOD_KITS(vehID) = 0
|
|
paramVars.vehicleModDisplayCurrentMods = FALSE
|
|
paramVars.vehicleModEnableAdvanced = FALSE
|
|
paramVars.vehicleModDataSetAdvanced = FALSE
|
|
//EXIT
|
|
ENDIF
|
|
|
|
|
|
// DISPLAY MODS
|
|
IF paramVars.vehicleModDisplayCurrentMods
|
|
|
|
IF GET_VEHICLE_MOD_KIT(vehID) != 0
|
|
SET_VEHICLE_MOD_KIT(vehID, 0)
|
|
ENDIF
|
|
|
|
FLOAT fLineOffset = GET_RENDERED_CHARACTER_HEIGHT(0.4)
|
|
FLOAT fTextX = 0.825+0.005
|
|
FLOAT fTextY = 0.200+0.005
|
|
|
|
Display_Vehicle_Mod_Debug(vehID, MOD_SPOILER, FALSE, "Spoiler", fTextX, fTextY) fTextY += fLineOffset
|
|
Display_Vehicle_Mod_Debug(vehID, MOD_BUMPER_F, FALSE, "Front Bumper", fTextX, fTextY) fTextY += fLineOffset
|
|
Display_Vehicle_Mod_Debug(vehID, MOD_BUMPER_R, FALSE, "Rear Bumper", fTextX, fTextY) fTextY += fLineOffset
|
|
Display_Vehicle_Mod_Debug(vehID, MOD_SKIRT, FALSE, "Skirt", fTextX, fTextY) fTextY += fLineOffset
|
|
Display_Vehicle_Mod_Debug(vehID, MOD_EXHAUST, FALSE, "Exhaust", fTextX, fTextY) fTextY += fLineOffset
|
|
Display_Vehicle_Mod_Debug(vehID, MOD_CHASSIS, FALSE, "Chassis", fTextX, fTextY) fTextY += fLineOffset
|
|
Display_Vehicle_Mod_Debug(vehID, MOD_GRILL, FALSE, "Grill", fTextX, fTextY) fTextY += fLineOffset
|
|
Display_Vehicle_Mod_Debug(vehID, MOD_BONNET, FALSE, "Bonnet", fTextX, fTextY) fTextY += fLineOffset
|
|
Display_Vehicle_Mod_Debug(vehID, MOD_WING_L, FALSE, "Left Wing", fTextX, fTextY) fTextY += fLineOffset
|
|
Display_Vehicle_Mod_Debug(vehID, MOD_WING_R, FALSE, "Right Wing", fTextX, fTextY) fTextY += fLineOffset
|
|
Display_Vehicle_Mod_Debug(vehID, MOD_ROOF, FALSE, "Roof", fTextX, fTextY) fTextY += fLineOffset
|
|
Display_Vehicle_Mod_Debug(vehID, MOD_ENGINE, FALSE, "Engine", fTextX, fTextY) fTextY += fLineOffset
|
|
Display_Vehicle_Mod_Debug(vehID, MOD_BRAKES, FALSE, "Brakes", fTextX, fTextY) fTextY += fLineOffset
|
|
Display_Vehicle_Mod_Debug(vehID, MOD_GEARBOX, FALSE, "Gearbox", fTextX, fTextY) fTextY += fLineOffset
|
|
Display_Vehicle_Mod_Debug(vehID, MOD_HORN, FALSE, "Horn", fTextX, fTextY) fTextY += fLineOffset
|
|
Display_Vehicle_Mod_Debug(vehID, MOD_SUSPENSION, FALSE, "Suspension", fTextX, fTextY) fTextY += fLineOffset
|
|
Display_Vehicle_Mod_Debug(vehID, MOD_ARMOUR, FALSE, "Armour", fTextX, fTextY) fTextY += fLineOffset
|
|
Display_Vehicle_Mod_Debug(vehID, MOD_WHEELS, FALSE, "Wheels", fTextX, fTextY) fTextY += fLineOffset
|
|
Display_Vehicle_Mod_Debug(vehID, MOD_REAR_WHEELS, FALSE, "Rear Wheel", fTextX, fTextY) fTextY += fLineOffset+fLineOffset
|
|
|
|
Display_Vehicle_Mod_Debug(vehID, MOD_TOGGLE_NITROUS, TRUE, "Nitrous", fTextX, fTextY) fTextY += fLineOffset
|
|
Display_Vehicle_Mod_Debug(vehID, MOD_TOGGLE_TURBO, TRUE, "Turbo", fTextX, fTextY) fTextY += fLineOffset
|
|
Display_Vehicle_Mod_Debug(vehID, MOD_TOGGLE_SUBWOOFER, TRUE, "Sub Woofer", fTextX, fTextY) fTextY += fLineOffset
|
|
Display_Vehicle_Mod_Debug(vehID, MOD_TOGGLE_HYDRAULICS, TRUE, "Hydraulics", fTextX, fTextY) fTextY += fLineOffset
|
|
Display_Vehicle_Mod_Debug(vehID, MOD_TOGGLE_XENON_LIGHTS, TRUE, "Xenon Lights", fTextX, fTextY) fTextY += fLineOffset
|
|
|
|
DRAW_RECT_FROM_CORNER(0.825, 0.200, 0.175, fTextY-0.200+0.005, 0, 0, 0, 255)
|
|
ENDIF
|
|
|
|
// UPDATE BASIC MODS
|
|
IF paramVars.vehicleModEnableBasic
|
|
INT i
|
|
|
|
IF NOT paramVars.vehicleModDataSetBasic
|
|
|
|
GET_VEHICLE_TYRE_SMOKE_COLOR(vehID, paramVars.vehicleModTyreSmokeR, paramVars.vehicleModTyreSmokeG, paramVars.vehicleModTyreSmokeB)
|
|
GET_VEHICLE_TYRE_SMOKE_COLOR(vehID, paramVars.vehicleModTyreSmokeRTemp, paramVars.vehicleModTyreSmokeGTemp, paramVars.vehicleModTyreSmokeBTemp)
|
|
|
|
IF NOT GET_VEHICLE_TYRES_CAN_BURST(vehID)
|
|
paramVars.vehicleTyreTypeTemp = 2
|
|
paramVars.vehicleTyreType = 2
|
|
ELIF GET_DRIFT_TYRES_SET(vehID)
|
|
paramVars.vehicleTyreTypeTemp = 1
|
|
paramVars.vehicleTyreType = 1
|
|
ELSE
|
|
paramVars.vehicleTyreTypeTemp = 0
|
|
paramVars.vehicleTyreType = 0
|
|
ENDIF
|
|
|
|
paramVars.vehicleLivery = GET_VEHICLE_LIVERY(vehID)
|
|
paramVars.vehicleLiveryTemp = GET_VEHICLE_LIVERY(vehID)
|
|
|
|
paramVars.vehicleLivery2 = GET_VEHICLE_LIVERY2(vehID)
|
|
paramVars.vehicleLivery2Temp = GET_VEHICLE_LIVERY2(vehID)
|
|
|
|
paramVars.vehicleModWindowTintColour = GET_VEHICLE_WINDOW_TINT(vehID)
|
|
paramVars.vehicleModWindowTintColourTemp = GET_VEHICLE_WINDOW_TINT(vehID)
|
|
|
|
REPEAT COUNT_OF(paramVars.vehicleModExtraOn) i
|
|
paramVars.vehicleModExtraOn[i] = IS_VEHICLE_EXTRA_TURNED_ON(vehID, i+1)
|
|
paramVars.vehicleModExtraOnTemp[i] = IS_VEHICLE_EXTRA_TURNED_ON(vehID, i+1)
|
|
ENDREPEAT
|
|
|
|
paramVars.XenonColorLightIndexTemp = GET_VEHICLE_XENON_LIGHT_COLOR_INDEX(vehID)
|
|
|
|
paramVars.vehicleModDataSetBasic = TRUE
|
|
ENDIF
|
|
|
|
// Vehicle neon light
|
|
IF paramVars.XenonColorLightIndexTemp != paramVars.XenonColorLightIndex
|
|
SET_VEHICLE_XENON_LIGHT_COLOR_INDEX(vehID, paramVars.XenonColorLightIndex)
|
|
ENDIF
|
|
|
|
// Tyre smoke
|
|
IF paramVars.vehicleModTyreSmokeRTemp != paramVars.vehicleModTyreSmokeR
|
|
OR paramVars.vehicleModTyreSmokeGTemp != paramVars.vehicleModTyreSmokeG
|
|
OR paramVars.vehicleModTyreSmokeBTemp != paramVars.vehicleModTyreSmokeB
|
|
SET_VEHICLE_TYRE_SMOKE_COLOR(vehID, paramVars.vehicleModTyreSmokeR, paramVars.vehicleModTyreSmokeG, paramVars.vehicleModTyreSmokeB)
|
|
paramVars.vehicleModTyreSmokeRTemp = paramVars.vehicleModTyreSmokeR
|
|
paramVars.vehicleModTyreSmokeGTemp = paramVars.vehicleModTyreSmokeG
|
|
paramVars.vehicleModTyreSmokeBTemp = paramVars.vehicleModTyreSmokeB
|
|
ENDIF
|
|
|
|
// Tyre type
|
|
IF paramVars.vehicleTyreType != paramVars.vehicleTyreTypeTemp
|
|
SWITCH paramVars.vehicleTyreType
|
|
CASE 0
|
|
SET_VEHICLE_TYRES_CAN_BURST(vehID, TRUE)
|
|
SET_DRIFT_TYRES(vehID, FALSE)
|
|
BREAK
|
|
CASE 1
|
|
SET_VEHICLE_TYRES_CAN_BURST(vehID, TRUE)
|
|
SET_DRIFT_TYRES(vehID, TRUE)
|
|
BREAK
|
|
CASE 2
|
|
SET_VEHICLE_TYRES_CAN_BURST(vehID, FALSE)
|
|
SET_DRIFT_TYRES(vehID, FALSE)
|
|
BREAK
|
|
ENDSWITCH
|
|
|
|
paramVars.vehicleTyreTypeTemp = paramVars.vehicleTyreType
|
|
ENDIF
|
|
|
|
// Window tint
|
|
IF paramVars.vehicleModWindowTintColourTemp != paramVars.vehicleModWindowTintColour
|
|
SET_VEHICLE_WINDOW_TINT(vehID, paramVars.vehicleModWindowTintColour)
|
|
paramVars.vehicleModWindowTintColourTemp = paramVars.vehicleModWindowTintColour
|
|
ENDIF
|
|
|
|
// Livery
|
|
IF paramVars.vehicleLiveryTemp != paramVars.vehicleLivery
|
|
SET_VEHICLE_LIVERY(vehID, paramVars.vehicleLivery)
|
|
paramVars.vehicleLiveryTemp = paramVars.vehicleLivery
|
|
ENDIF
|
|
|
|
IF paramVars.vehicleLivery2Temp != paramVars.vehicleLivery2
|
|
SET_VEHICLE_LIVERY2(vehID, paramVars.vehicleLivery2)
|
|
paramVars.vehicleLivery2Temp = paramVars.vehicleLivery2
|
|
ENDIF
|
|
|
|
// Extras
|
|
REPEAT COUNT_OF(paramVars.vehicleModExtraOn) i
|
|
IF paramVars.vehicleModExtraOnTemp[i] != paramVars.vehicleModExtraOn[i]
|
|
SET_VEHICLE_EXTRA(vehID, i+1, !paramVars.vehicleModExtraOn[i])
|
|
paramVars.vehicleModExtraOnTemp[i] = paramVars.vehicleModExtraOn[i]
|
|
ENDIF
|
|
ENDREPEAT
|
|
ELSE
|
|
paramVars.vehicleModDataSetBasic = FALSE
|
|
ENDIF
|
|
|
|
// UPDATE ADVANCED MODS
|
|
IF paramVars.vehicleModEnableAdvanced
|
|
|
|
IF GET_VEHICLE_MOD_KIT(vehID) != 0
|
|
SET_VEHICLE_MOD_KIT(vehID, 0)
|
|
ENDIF
|
|
|
|
INT i, iMaxMods
|
|
MOD_TYPE eMod
|
|
BOOL bToggleMod
|
|
|
|
IF NOT paramVars.vehicleModDataSetAdvanced
|
|
|
|
REPEAT MAX_VEHICLE_MOD_SLOTS i
|
|
eMod = INT_TO_ENUM(MOD_TYPE, i)
|
|
IF eMod = MOD_TOGGLE_NITROUS
|
|
OR eMod = MOD_TOGGLE_TURBO
|
|
OR eMod = MOD_TOGGLE_SUBWOOFER
|
|
OR eMod = MOD_TOGGLE_TYRE_SMOKE
|
|
OR eMod = MOD_TOGGLE_HYDRAULICS
|
|
OR eMod = MOD_TOGGLE_XENON_LIGHTS
|
|
bToggleMod = TRUE
|
|
ELSE
|
|
bToggleMod = FALSE
|
|
ENDIF
|
|
|
|
IF bToggleMod
|
|
IF IS_TOGGLE_MOD_ON(vehID, eMod)
|
|
paramVars.vehicleModSlotIndex[eMod] = 1
|
|
ELSE
|
|
paramVars.vehicleModSlotIndex[eMod] = 0
|
|
ENDIF
|
|
ELSE
|
|
paramVars.vehicleModSlotIndex[eMod] = GET_VEHICLE_MOD(vehID, eMod)
|
|
ENDIF
|
|
ENDREPEAT
|
|
|
|
paramVars.vehicleModWheelType = ENUM_TO_INT(GET_VEHICLE_WHEEL_TYPE(vehID))
|
|
|
|
paramVars.vehicleModDataSetAdvanced = TRUE
|
|
ENDIF
|
|
|
|
BOOL bVariation
|
|
|
|
// Mods
|
|
REPEAT MAX_VEHICLE_MOD_SLOTS i
|
|
bVariation = FALSE
|
|
|
|
eMod = INT_TO_ENUM(MOD_TYPE, i)
|
|
IF eMod = MOD_TOGGLE_NITROUS
|
|
OR eMod = MOD_TOGGLE_TURBO
|
|
OR eMod = MOD_TOGGLE_SUBWOOFER
|
|
OR eMod = MOD_TOGGLE_TYRE_SMOKE
|
|
OR eMod = MOD_TOGGLE_HYDRAULICS
|
|
OR eMod = MOD_TOGGLE_XENON_LIGHTS
|
|
bToggleMod = TRUE
|
|
ELSE
|
|
bToggleMod = FALSE
|
|
ENDIF
|
|
|
|
IF bToggleMod
|
|
// Cap
|
|
IF paramVars.vehicleModSlotIndex[eMod] < 0
|
|
paramVars.vehicleModSlotIndex[eMod] = 0
|
|
ELIF paramVars.vehicleModSlotIndex[eMod] > 1
|
|
paramVars.vehicleModSlotIndex[eMod] = 1
|
|
ENDIF
|
|
|
|
// Turn off
|
|
IF IS_TOGGLE_MOD_ON(vehID, eMod)
|
|
IF paramVars.vehicleModSlotIndex[eMod] = 0
|
|
PRINTLN("Toggling vehicle mod off")
|
|
TOGGLE_VEHICLE_MOD(vehID, eMod, FALSE)
|
|
ENDIF
|
|
|
|
// Turn on
|
|
ELSE
|
|
IF paramVars.vehicleModSlotIndex[eMod] = 1
|
|
PRINTLN("Toggling vehicle mod on")
|
|
TOGGLE_VEHICLE_MOD(vehID, eMod, TRUE)
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
// Cap
|
|
iMaxMods = GET_NUM_VEHICLE_MODS(vehID, eMod)
|
|
IF paramVars.vehicleModSlotIndex[eMod] > iMaxMods-1
|
|
paramVars.vehicleModSlotIndex[eMod] = iMaxMods-1
|
|
ENDIF
|
|
|
|
// Update
|
|
IF GET_VEHICLE_MOD(vehID, eMod) <> paramVars.vehicleModSlotIndex[eMod]
|
|
IF paramVars.vehicleModSlotIndex[eMod] = -1
|
|
PRINTLN("Removing vehicle mod")
|
|
REMOVE_VEHICLE_MOD(vehID, eMod)
|
|
ELSE
|
|
IF GET_NUM_VEHICLE_MODS(vehID, eMod) > paramVars.vehicleModSlotIndex[eMod]
|
|
PRINTLN("Setting vehicle mod")
|
|
IF eMod = MOD_WHEELS
|
|
IF paramVars.bTireDesign
|
|
bVariation = TRUE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_VEHICLE_MOD_LOCKED(vehID, eMod, paramVars.vehicleModSlotIndex[eMod])
|
|
// skip
|
|
ELSE
|
|
SET_VEHICLE_MOD(vehID, eMod, paramVars.vehicleModSlotIndex[eMod], bVariation)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDREPEAT
|
|
IF GET_VEHICLE_WHEEL_TYPE(vehID) != INT_TO_ENUM(MOD_WHEEL_TYPE, paramVars.vehicleModWheelType)
|
|
PRINTLN("Setting wheel type")
|
|
SET_VEHICLE_WHEEL_TYPE(vehID, INT_TO_ENUM(MOD_WHEEL_TYPE, paramVars.vehicleModWheelType))
|
|
ENDIF
|
|
ELSE
|
|
paramVars.vehicleModDataSetAdvanced = FALSE
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
PROC Maintain_Vehicle_Performance_Widgets(structSharedDebugVars ¶mVars)
|
|
|
|
IF IS_PED_INJURED(PLAYER_PED_ID())
|
|
EXIT
|
|
ENDIF
|
|
|
|
IF NOT paramVars.bMaxSpeedOverride
|
|
AND NOT paramVars.bTopSpeedOverride
|
|
EXIT
|
|
ENDIF
|
|
|
|
VEHICLE_INDEX vehID = GET_PLAYERS_LAST_VEHICLE()
|
|
|
|
IF NOT DOES_ENTITY_EXIST(vehID)
|
|
EXIT
|
|
ENDIF
|
|
|
|
IF NOT IS_VEHICLE_DRIVEABLE(vehID)
|
|
EXIT
|
|
ENDIF
|
|
|
|
IF paramVars.bTopSpeedOverride
|
|
MODIFY_VEHICLE_TOP_SPEED(vehID, paramVars.vehicleTopSpeedOverride)
|
|
ENDIF
|
|
|
|
IF paramVars.bMaxSpeedOverride
|
|
SET_VEHICLE_MAX_SPEED(vehID, paramVars.vehicleMaxSpeedOverride)
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
// *****************************************************************************************
|
|
// SCRIPTED CAM EDITOR
|
|
// *****************************************************************************************
|
|
|
|
/// PURPOSE:
|
|
/// Creates a widget to launch the cam editor script.
|
|
PROC Create_Scripted_Cam_Editor_Widgets(structSharedDebugVars ¶mVars)
|
|
START_WIDGET_GROUP("Scripted Cam Editor")
|
|
ADD_WIDGET_BOOL("Launch", paramVars.launchCamEditor)
|
|
STOP_WIDGET_GROUP()
|
|
ENDPROC
|
|
|
|
PROC Maintain_Scripted_Cam_Editor_Widgets(structSharedDebugVars ¶mVars)
|
|
IF paramVars.launchCamEditor
|
|
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("scripted_cam_editor")) = 0
|
|
REQUEST_SCRIPT("scripted_cam_editor")
|
|
|
|
IF HAS_SCRIPT_LOADED("scripted_cam_editor")
|
|
START_NEW_SCRIPT("scripted_cam_editor", FRIEND_STACK_SIZE)
|
|
paramVars.launchCamEditor = FALSE
|
|
ENDIF
|
|
ELSE
|
|
paramVars.launchCamEditor = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
|
|
// *****************************************************************************************
|
|
// PTFX TESTER
|
|
// *****************************************************************************************
|
|
PROC Create_Ptfx_Tester_Widgets(structSharedDebugVars ¶mVars)
|
|
START_WIDGET_GROUP("Ptfx Tester")
|
|
ADD_WIDGET_BOOL("Enable", paramVars.ptfxTesterEnabled)
|
|
|
|
paramVars.ptfxDictionary = ADD_TEXT_WIDGET("Ptfx dictionary")
|
|
paramVars.ptfxName = ADD_TEXT_WIDGET("Ptfx name")
|
|
|
|
ADD_WIDGET_BOOL("Attach ptfx to focus entity", paramVars.ptfxIsRelativeToEntity)
|
|
ADD_WIDGET_VECTOR_SLIDER("Attach offset", paramVars.ptfxPos, -9999.0, 9999.0, 0.001)
|
|
ADD_WIDGET_VECTOR_SLIDER("Rotation", paramVars.ptfxRot, -180.0, 180.0, 0.1)
|
|
ADD_WIDGET_FLOAT_SLIDER("Scale", paramVars.ptfxScale, 0.001, 100.0, 0.01)
|
|
ADD_WIDGET_BOOL("Play/stop looped", paramVars.playPtfxLooped)
|
|
ADD_WIDGET_BOOL("Play non-looped", paramVars.playPtfxNonLooped)
|
|
STOP_WIDGET_GROUP()
|
|
ENDPROC
|
|
|
|
PROC Maintain_Ptfx_Tester_Widgets(structSharedDebugVars ¶mVars)
|
|
IF paramVars.ptfxTesterEnabled
|
|
IF paramVars.playPtfxNonLooped
|
|
OR paramVars.playPtfxLooped
|
|
BOOL bAssetsLoaded = FALSE
|
|
|
|
STRING strPtfxDict = GET_CONTENTS_OF_TEXT_WIDGET(paramVars.ptfxDictionary)
|
|
STRING strPtfxName = GET_CONTENTS_OF_TEXT_WIDGET(paramVars.ptfxName)
|
|
|
|
IF ARE_STRINGS_EQUAL(strPtfxDict, "script")
|
|
REQUEST_PTFX_ASSET()
|
|
|
|
IF HAS_PTFX_ASSET_LOADED()
|
|
bAssetsLoaded = TRUE
|
|
ENDIF
|
|
ELSE
|
|
bAssetsLoaded = TRUE
|
|
ENDIF
|
|
|
|
IF bAssetsLoaded
|
|
IF paramVars.ptfxIsRelativeToEntity
|
|
ENTITY_INDEX entityFocus = GET_FOCUS_ENTITY_INDEX()
|
|
|
|
IF NOT IS_ENTITY_DEAD(entityFocus)
|
|
IF paramVars.playPtfxNonLooped
|
|
START_PARTICLE_FX_NON_LOOPED_ON_ENTITY(strPtfxName, entityFocus, paramVars.ptfxPos, paramVars.ptfxRot, paramVars.ptfxScale)
|
|
ENDIF
|
|
|
|
IF paramVars.playPtfxLooped
|
|
IF paramVars.ptfxID = NULL
|
|
paramVars.ptfxID = START_PARTICLE_FX_LOOPED_ON_ENTITY(strPtfxName, entityFocus, paramVars.ptfxPos, paramVars.ptfxRot, paramVars.ptfxScale)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF paramVars.playPtfxNonLooped
|
|
START_PARTICLE_FX_NON_LOOPED_AT_COORD(strPtfxName, paramVars.ptfxPos, paramVars.ptfxRot, paramVars.ptfxScale)
|
|
ENDIF
|
|
|
|
IF paramVars.playPtfxLooped
|
|
IF paramVars.ptfxID = NULL
|
|
paramVars.ptfxID = START_PARTICLE_FX_LOOPED_AT_COORD(strPtfxName, paramVars.ptfxPos, paramVars.ptfxRot, paramVars.ptfxScale)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
paramVars.playPtfxNonLooped = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF paramVars.ptfxID != NULL
|
|
IF paramVars.playPtfxLooped
|
|
//NOTE: Real-time updates to looping particle effects could go here.
|
|
ELSE
|
|
STOP_PARTICLE_FX_LOOPED(paramVars.ptfxID)
|
|
paramVars.ptfxID = NULL
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
// *****************************************************************************************
|
|
// OBJECT POSITIONING
|
|
// *****************************************************************************************
|
|
|
|
/// PURPOSE:
|
|
/// Creates a widget to launch the cam editor script.
|
|
PROC Create_Object_Positioning_Widgets(structSharedDebugVars ¶mVars)
|
|
START_WIDGET_GROUP("Entity Positioning")
|
|
ADD_WIDGET_STRING("When enabled, click on an entity to start positioning. Drag the entity using the axis markers.")
|
|
ADD_WIDGET_BOOL("Enable widgets", paramVars.objPositioningEnabled)
|
|
|
|
ADD_WIDGET_VECTOR_SLIDER("Position", paramVars.objPos, -10000.0, 10000.0, 0.01)
|
|
ADD_WIDGET_VECTOR_SLIDER("Rotation", paramVars.objRot, -180.0, 180.0, 0.1)
|
|
ADD_WIDGET_BOOL("Show local position axis", paramVars.objPositioningUseLocalAxis)
|
|
ADD_WIDGET_BOOL("Output to debug", paramVars.objPositioningOutput)
|
|
ADD_WIDGET_BOOL("Freeze entity when repositioning", paramVars.objPositioningFreeze)
|
|
|
|
ADD_WIDGET_FLOAT_READ_ONLY("Quat X", paramVars.objQuatX)
|
|
ADD_WIDGET_FLOAT_READ_ONLY("Quat Y", paramVars.objQuatY)
|
|
ADD_WIDGET_FLOAT_READ_ONLY("Quat Z", paramVars.objQuatZ)
|
|
ADD_WIDGET_FLOAT_READ_ONLY("Quat W", paramVars.objQuatW)
|
|
STOP_WIDGET_GROUP()
|
|
ENDPROC
|
|
|
|
PROC Maintain_Object_Positioning_Widgets(structSharedDebugVars ¶mVars)
|
|
BOOL bJustDeselectedAxis = FALSE
|
|
|
|
IF paramVars.objPositioningEnabled
|
|
IF NOT IS_ENTITY_DEAD(paramVars.objFocusedEntity)
|
|
//Draw the axes.
|
|
VECTOR vXOffset, vYOffset, vZOffset
|
|
VECTOR vCentre = GET_ENTITY_COORDS(paramVars.objFocusedEntity)
|
|
VECTOR vMouse2DPos, vXOffset2D, vYOffset2D, vZOffset2D, vCentre2D
|
|
FLOAT fDistToXOffset, fDistToYOffset, fDistToZOffset, fClosestDist
|
|
|
|
IF paramVars.objPositioningUseLocalAxis
|
|
vXOffset = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(paramVars.objFocusedEntity, <<-1.0, 0.0, 0.0>>)
|
|
vYOffset = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(paramVars.objFocusedEntity, <<0.0, -1.0, 0.0>>)
|
|
vZOffset = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(paramVars.objFocusedEntity, <<0.0, 0.0, 1.0>>)
|
|
ELSE
|
|
vXOffset = vCentre + <<-1.0, 0.0, 0.0>>
|
|
vYOffset = vCentre + <<0.0, -1.0, 0.0>>
|
|
vZOffset = vCentre + <<0.0, 0.0, 1.0>>
|
|
ENDIF
|
|
|
|
GET_MOUSE_POSITION(vMouse2DPos.x, vMouse2DPos.y)
|
|
GET_SCREEN_COORD_FROM_WORLD_COORD(vXOffset, vXOffset2D.x, vXOffset2D.y)
|
|
GET_SCREEN_COORD_FROM_WORLD_COORD(vYOffset, vYOffset2D.x, vYOffset2D.y)
|
|
GET_SCREEN_COORD_FROM_WORLD_COORD(vZOffset, vZOffset2D.x, vZOffset2D.y)
|
|
GET_SCREEN_COORD_FROM_WORLD_COORD(vCentre, vCentre2D.x, vCentre2D.y)
|
|
|
|
SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE(TRUE)
|
|
|
|
IF paramVars.objPositioningAxisSelected AND paramVars.iObjPositioningCurrentAxis = 0
|
|
DRAW_DEBUG_LINE_2D(vCentre2D, vXOffset2D, 255, 255, 255, 200)
|
|
DRAW_RECT(vXOffset2D.x, vXOffset2D.y, 0.0125, 0.02, 255, 255, 255, 200)
|
|
ELSE
|
|
DRAW_DEBUG_LINE_2D(vCentre2D, vXOffset2D, 255, 0, 0, 200)
|
|
DRAW_RECT(vXOffset2D.x, vXOffset2D.y, 0.0125, 0.02, 255, 0, 0, 200)
|
|
ENDIF
|
|
|
|
IF paramVars.objPositioningAxisSelected AND paramVars.iObjPositioningCurrentAxis = 1
|
|
DRAW_DEBUG_LINE_2D(vCentre2D, vYOffset2D, 255, 255, 255, 200)
|
|
DRAW_RECT(vYOffset2D.x, vYOffset2D.y, 0.0125, 0.02, 255, 255, 255, 200)
|
|
ELSE
|
|
DRAW_DEBUG_LINE_2D(vCentre2D, vYOffset2D, 0, 255, 0, 200)
|
|
DRAW_RECT(vYOffset2D.x, vYOffset2D.y, 0.0125, 0.02, 0, 255, 0, 200)
|
|
ENDIF
|
|
|
|
IF paramVars.objPositioningAxisSelected AND paramVars.iObjPositioningCurrentAxis = 2
|
|
DRAW_DEBUG_LINE_2D(vCentre2D, vZOffset2D, 255, 255, 255, 200)
|
|
DRAW_RECT(vZOffset2D.x, vZOffset2D.y, 0.0125, 0.02, 255, 255, 255, 200)
|
|
ELSE
|
|
DRAW_DEBUG_LINE_2D(vCentre2D, vZOffset2D, 0, 0, 255, 200)
|
|
DRAW_RECT(vZOffset2D.x, vZOffset2D.y, 0.0125, 0.02, 0, 0, 255, 200)
|
|
ENDIF
|
|
|
|
//Update widget values if the player selects an axis and drags.
|
|
IF IS_MOUSE_BUTTON_PRESSED(MB_LEFT_BTN)
|
|
fDistToXOffset = VDIST(vMouse2DPos, vXOffset2D)
|
|
fDistToYOffset = VDIST(vMouse2DPos, vYOffset2D)
|
|
fDistToZOffset = VDIST(vMouse2DPos, vZOffset2D)
|
|
|
|
IF NOT paramVars.objPositioningAxisSelected
|
|
//Get the closest axis to the mouse, if it's close enough then select it.
|
|
IF fDistToXOffset < fDistToYOffset
|
|
IF fDistToXOffset < fDistToZOffset
|
|
paramVars.iObjPositioningCurrentAxis = 0
|
|
fClosestDist = fDistToXOffset
|
|
ELSE
|
|
paramVars.iObjPositioningCurrentAxis = 2
|
|
fClosestDist = fDistToZOffset
|
|
ENDIF
|
|
ELIF fDistToYOffset < fDistToZOffset
|
|
paramVars.iObjPositioningCurrentAxis = 1
|
|
fClosestDist = fDistToYOffset
|
|
ELSE
|
|
paramVars.iObjPositioningCurrentAxis = 2
|
|
fClosestDist = fDistToZOffset
|
|
ENDIF
|
|
|
|
IF fClosestDist < 0.02
|
|
paramVars.objPositioningAxisSelected = TRUE
|
|
ENDIF
|
|
ELSE
|
|
FLOAT fMoveSpeed = 0.0
|
|
FLOAT fDistFromXToCentre = VDIST(vXOffset2D, vCentre2D)
|
|
FLOAT fDistFromYToCentre = VDIST(vYOffset2D, vCentre2D)
|
|
FLOAT fDistFromZToCentre = VDIST(vZOffset2D, vCentre2D)
|
|
|
|
//Compare the difference between the mouse position and the axis.
|
|
IF paramVars.iObjPositioningCurrentAxis = 0
|
|
//Using the length of the axis line in 2D space we can work out how much the object needs to move in 3D space to match the new mouse position.
|
|
VECTOR vDesiredXOffset = GET_CLOSEST_POINT_ON_LINE(vMouse2DPos, vCentre2D, vXOffset2D, FALSE)
|
|
FLOAT fDistFromDesiredXOffsetToXOffset = VDIST(vDesiredXOffset, vXOffset2D)
|
|
fMoveSpeed = fDistFromDesiredXOffsetToXOffset / fDistFromXToCentre
|
|
|
|
IF DOT_PRODUCT(vDesiredXOffset - vXOffset2D, vXOffset2D - vCentre2D) > 0.0
|
|
fMoveSpeed = -fMoveSpeed
|
|
ENDIF
|
|
|
|
IF paramVars.objPositioningUseLocalAxis
|
|
paramVars.objPos = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(paramVars.objFocusedEntity, <<fMoveSpeed, 0.0, 0.0>>)
|
|
ELSE
|
|
paramVars.objPos.x += fMoveSpeed
|
|
ENDIF
|
|
ELIF paramVars.iObjPositioningCurrentAxis = 1
|
|
VECTOR vDesiredYOffset = GET_CLOSEST_POINT_ON_LINE(vMouse2DPos, vCentre2D, vYOffset2D, FALSE)
|
|
FLOAT fDistFromDesiredYOffsetToYOffset = VDIST(vDesiredYOffset, vYOffset2D)
|
|
fMoveSpeed = fDistFromDesiredYOffsetToYOffset / fDistFromYToCentre
|
|
|
|
IF DOT_PRODUCT(vDesiredYOffset - vYOffset2D, vYOffset2D - vCentre2D) > 0.0
|
|
fMoveSpeed = -fMoveSpeed
|
|
ENDIF
|
|
|
|
IF paramVars.objPositioningUseLocalAxis
|
|
paramVars.objPos = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(paramVars.objFocusedEntity, <<0.0, fMoveSpeed, 0.0>>)
|
|
ELSE
|
|
paramVars.objPos.y += fMoveSpeed
|
|
ENDIF
|
|
ELSE
|
|
VECTOR vDesiredZOffset = GET_CLOSEST_POINT_ON_LINE(vMouse2DPos, vCentre2D, vZOffset2D, FALSE)
|
|
FLOAT fDistFromDesiredZOffsetToZOffset = VDIST(vDesiredZOffset, vZOffset2D)
|
|
fMoveSpeed = fDistFromDesiredZOffsetToZOffset / fDistFromZToCentre
|
|
|
|
IF DOT_PRODUCT(vDesiredZOffset - vZOffset2D, vZOffset2D - vCentre2D) < 0.0
|
|
fMoveSpeed = -fMoveSpeed
|
|
ENDIF
|
|
|
|
IF paramVars.objPositioningUseLocalAxis
|
|
paramVars.objPos = GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(paramVars.objFocusedEntity, <<0.0, 0.0, fMoveSpeed>>)
|
|
ELSE
|
|
paramVars.objPos.z += fMoveSpeed
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ELSE
|
|
IF paramVars.objPositioningAxisSelected
|
|
bJustDeselectedAxis = TRUE
|
|
ENDIF
|
|
|
|
paramVars.objPositioningAxisSelected = FALSE
|
|
paramVars.iObjPositioningCurrentAxis = 0
|
|
ENDIF
|
|
|
|
//Update position/rotation based on widget values.
|
|
FREEZE_ENTITY_POSITION(paramVars.objFocusedEntity, paramVars.objPositioningFreeze)
|
|
SET_ENTITY_COORDS_NO_OFFSET(paramVars.objFocusedEntity, paramVars.objPos)
|
|
SET_ENTITY_ROTATION(paramVars.objFocusedEntity, paramVars.objRot)
|
|
|
|
GET_ENTITY_QUATERNION(paramVars.objFocusedEntity, paramVars.objQuatX, paramVars.objQuatY, paramVars.objQuatZ, paramVars.objQuatW)
|
|
ENDIF
|
|
|
|
//If we're not dragging an object around then allow selection of other objects.
|
|
//NOTE: this is done after the object positioning section so that axis selection takes priority over object selection.
|
|
IF NOT paramVars.objPositioningAxisSelected
|
|
AND NOT bJustDeselectedAxis
|
|
IF IS_MOUSE_BUTTON_JUST_RELEASED(MB_LEFT_BTN)
|
|
ENTITY_INDEX entityFocus = GET_FOCUS_ENTITY_INDEX()
|
|
|
|
IF NOT IS_ENTITY_DEAD(entityFocus)
|
|
IF entityFocus != paramVars.objFocusedEntity
|
|
paramVars.objFocusedEntity = entityFocus
|
|
|
|
paramVars.objPos = GET_ENTITY_COORDS(entityFocus)
|
|
paramVars.objRot = GET_ENTITY_ROTATION(entityFocus)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF paramVars.objPositioningOutput
|
|
SAVE_NEWLINE_TO_DEBUG_FILE()
|
|
SAVE_STRING_TO_DEBUG_FILE("SET_ENTITY_COORDS_NO_OFFSET(entity, ")
|
|
SAVE_VECTOR_TO_DEBUG_FILE(paramVars.objPos)
|
|
SAVE_STRING_TO_DEBUG_FILE(")")
|
|
SAVE_NEWLINE_TO_DEBUG_FILE()
|
|
SAVE_STRING_TO_DEBUG_FILE("SET_ENTITY_ROTATION(entity, ")
|
|
SAVE_VECTOR_TO_DEBUG_FILE(paramVars.objRot)
|
|
SAVE_STRING_TO_DEBUG_FILE(")")
|
|
SAVE_NEWLINE_TO_DEBUG_FILE()
|
|
SAVE_STRING_TO_DEBUG_FILE("SET_ENTITY_QUATERNION(entity, ")
|
|
SAVE_FLOAT_TO_DEBUG_FILE(paramVars.objQuatX)
|
|
SAVE_STRING_TO_DEBUG_FILE(", ")
|
|
SAVE_FLOAT_TO_DEBUG_FILE(paramVars.objQuatY)
|
|
SAVE_STRING_TO_DEBUG_FILE(", ")
|
|
SAVE_FLOAT_TO_DEBUG_FILE(paramVars.objQuatZ)
|
|
SAVE_STRING_TO_DEBUG_FILE(", ")
|
|
SAVE_FLOAT_TO_DEBUG_FILE(paramVars.objQuatW)
|
|
SAVE_STRING_TO_DEBUG_FILE(")")
|
|
SAVE_NEWLINE_TO_DEBUG_FILE()
|
|
|
|
paramVars.objPositioningOutput = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
|
|
// *****************************************************************************************
|
|
// MIN/MAX LOCATE
|
|
// *****************************************************************************************
|
|
|
|
PROC Create_MinMax_Locate_Widgets(structSharedDebugVars ¶mVars)
|
|
START_WIDGET_GROUP("Min/Max Locates")
|
|
ADD_WIDGET_STRING("When enabled, drag the min/max corners to change the locate size.")
|
|
ADD_WIDGET_BOOL("Enable widget", paramVars.bMinMaxWidgetEnabled)
|
|
ADD_WIDGET_BOOL("Output to debug", paramVars.bMinMaxWidgetOutput)
|
|
|
|
ADD_WIDGET_BOOL("Grab min pos from camera", paramVars.bMinMaxGetMin)
|
|
ADD_WIDGET_VECTOR_SLIDER("Min", paramVars.vMinMaxCornerMin, -10000.0, 10000.0, 0.01)
|
|
ADD_WIDGET_BOOL("Grab max pos from camera", paramVars.bMinMaxGetMax)
|
|
ADD_WIDGET_VECTOR_SLIDER("Max", paramVars.vMinMaxCornerMax, -10000.0, 10000.0, 0.01)
|
|
STOP_WIDGET_GROUP()
|
|
ENDPROC
|
|
|
|
PROC Maintain_MinMax_Locate_Widgets(structSharedDebugVars ¶mVars)
|
|
IF paramVars.bMinMaxWidgetEnabled
|
|
//Stick some initial values in around the player.
|
|
IF paramVars.vMinMaxCornerMin.x = 0.0
|
|
AND paramVars.vMinMaxCornerMin.y = 0.0
|
|
AND paramVars.vMinMaxCornerMin.z = 0.0
|
|
AND paramVars.vMinMaxCornerMax.x = 0.0
|
|
AND paramVars.vMinMaxCornerMax.y = 0.0
|
|
AND paramVars.vMinMaxCornerMax.z = 0.0
|
|
paramVars.vMinMaxCornerMin = GET_ENTITY_COORDS(PLAYER_PED_ID()) + <<-2.0, -2.0, 0.0>>
|
|
paramVars.vMinMaxCornerMax = GET_ENTITY_COORDS(PLAYER_PED_ID()) + <<2.0, 2.0, 2.0>>
|
|
ENDIF
|
|
|
|
IF paramVars.bMinMaxGetMin
|
|
paramVars.vMinMaxCornerMin = GET_FINAL_RENDERED_CAM_COORD()
|
|
paramVars.bMinMaxGetMin = FALSE
|
|
ENDIF
|
|
|
|
IF paramVars.bMinMaxGetMax
|
|
paramVars.vMinMaxCornerMax = GET_FINAL_RENDERED_CAM_COORD()
|
|
paramVars.bMinMaxGetMax = FALSE
|
|
ENDIF
|
|
|
|
//allow dragging the min and max nodes.
|
|
IF IS_MOUSE_BUTTON_PRESSED(MB_LEFT_BTN)
|
|
VECTOR vMouse2DPos, vMin2DPos, vMax2DPos, vXoffset2D, vYOffset2D
|
|
FLOAT fDistToMin, fDistToMax, fXMoveSpeed, fYMoveSpeed
|
|
|
|
GET_MOUSE_POSITION(vMouse2DPos.x, vMouse2DPos.y)
|
|
GET_SCREEN_COORD_FROM_WORLD_COORD(paramVars.vMinMaxCornerMin, vMin2DPos.x, vMin2DPos.y)
|
|
GET_SCREEN_COORD_FROM_WORLD_COORD(paramVars.vMinMaxCornerMax, vMax2DPos.x, vMax2DPos.y)
|
|
|
|
IF paramVars.iMinMaxCurrentSelection = -1
|
|
fDistToMin = VDIST(vMouse2DPos, vMin2DPos)
|
|
fDistToMax = VDIST(vMouse2DPos, vMax2DPos)
|
|
|
|
IF fDistToMin < fDistToMax
|
|
IF fDistToMin < 0.02
|
|
paramVars.iMinMaxCurrentSelection = 0
|
|
ENDIF
|
|
ELSE
|
|
IF fDistToMax < 0.02
|
|
paramVars.iMinMaxCurrentSelection = 1
|
|
ENDIF
|
|
ENDIF
|
|
ELIF paramVars.iMinMaxCurrentSelection = 0
|
|
VECTOR vXOffset = paramVars.vMinMaxCornerMin + <<1.0, 0.0, 0.0>>
|
|
VECTOR vYOffset = paramVars.vMinMaxCornerMin + <<0.0, 1.0, 0.0>>
|
|
GET_SCREEN_COORD_FROM_WORLD_COORD(vXOffset, vXoffset2D.x, vXoffset2D.y)
|
|
GET_SCREEN_COORD_FROM_WORLD_COORD(vYOffset, vYoffset2D.x, vYoffset2D.y)
|
|
|
|
VECTOR vDesiredXOffset = GET_CLOSEST_POINT_ON_LINE(vMouse2DPos, vMin2DPos, vXOffset2D, FALSE)
|
|
FLOAT fDistFromDesiredXOffsetToCentre = VDIST(vDesiredXOffset, vMin2DPos)
|
|
FLOAT fDistFromMaxXToCentre = VDIST(vXOffset2D, vMin2DPos)
|
|
fXMoveSpeed = fDistFromDesiredXOffsetToCentre / fDistFromMaxXToCentre
|
|
|
|
IF DOT_PRODUCT(vDesiredXOffset - vMin2DPos, vXOffset2D - vMin2DPos) < 0.0
|
|
fXMoveSpeed = -fXMoveSpeed
|
|
ENDIF
|
|
|
|
VECTOR vDesiredYOffset = GET_CLOSEST_POINT_ON_LINE(vMouse2DPos, vMin2DPos, vYOffset2D, FALSE)
|
|
FLOAT fDistFromDesiredYOffsetToCentre = VDIST(vDesiredYOffset, vMin2DPos)
|
|
FLOAT fDistFromMaxYToCentre = VDIST(vYOffset2D, vMin2DPos)
|
|
fYMoveSpeed = fDistFromDesiredYOffsetToCentre / fDistFromMaxYToCentre
|
|
|
|
IF DOT_PRODUCT(vDesiredYOffset - vMin2DPos, vYOffset2D - vMin2DPos) < 0.0
|
|
fYMoveSpeed = -fYMoveSpeed
|
|
ENDIF
|
|
|
|
paramVars.vMinMaxCornerMin.x += fXMoveSpeed
|
|
paramVars.vMinMaxCornerMin.y += fYMoveSpeed
|
|
ELSE
|
|
VECTOR vXOffset = paramVars.vMinMaxCornerMax + <<1.0, 0.0, 0.0>>
|
|
VECTOR vYOffset = paramVars.vMinMaxCornerMax + <<0.0, 1.0, 0.0>>
|
|
GET_SCREEN_COORD_FROM_WORLD_COORD(vXOffset, vXoffset2D.x, vXoffset2D.y)
|
|
GET_SCREEN_COORD_FROM_WORLD_COORD(vYOffset, vYoffset2D.x, vYoffset2D.y)
|
|
|
|
VECTOR vDesiredXOffset = GET_CLOSEST_POINT_ON_LINE(vMouse2DPos, vMax2DPos, vXOffset2D, FALSE)
|
|
FLOAT fDistFromDesiredXOffsetToCentre = VDIST(vDesiredXOffset, vMax2DPos)
|
|
FLOAT fDistFromMaxXToCentre = VDIST(vXOffset2D, vMax2DPos)
|
|
fXMoveSpeed = fDistFromDesiredXOffsetToCentre / fDistFromMaxXToCentre
|
|
|
|
IF DOT_PRODUCT(vDesiredXOffset - vMax2DPos, vXOffset2D - vMax2DPos) < 0.0
|
|
fXMoveSpeed = -fXMoveSpeed
|
|
ENDIF
|
|
|
|
VECTOR vDesiredYOffset = GET_CLOSEST_POINT_ON_LINE(vMouse2DPos, vMax2DPos, vYOffset2D, FALSE)
|
|
FLOAT fDistFromDesiredYOffsetToCentre = VDIST(vDesiredYOffset, vMax2DPos)
|
|
FLOAT fDistFromMaxYToCentre = VDIST(vYOffset2D, vMax2DPos)
|
|
fYMoveSpeed = fDistFromDesiredYOffsetToCentre / fDistFromMaxYToCentre
|
|
|
|
IF DOT_PRODUCT(vDesiredYOffset - vMax2DPos, vYOffset2D - vMax2DPos) < 0.0
|
|
fYMoveSpeed = -fYMoveSpeed
|
|
ENDIF
|
|
|
|
paramVars.vMinMaxCornerMax.x += fXMoveSpeed
|
|
paramVars.vMinMaxCornerMax.y += fYMoveSpeed
|
|
ENDIF
|
|
ELSE
|
|
paramVars.iMinMaxCurrentSelection = -1
|
|
ENDIF
|
|
|
|
IF paramVars.bMinMaxWidgetOutput
|
|
SAVE_NEWLINE_TO_DEBUG_FILE()
|
|
|
|
SAVE_STRING_TO_DEBUG_FILE("vMin = ")
|
|
SAVE_VECTOR_TO_DEBUG_FILE(paramVars.vMinMaxCornerMin)
|
|
SAVE_NEWLINE_TO_DEBUG_FILE()
|
|
|
|
SAVE_STRING_TO_DEBUG_FILE("vMax = ")
|
|
SAVE_VECTOR_TO_DEBUG_FILE(paramVars.vMinMaxCornerMax)
|
|
SAVE_NEWLINE_TO_DEBUG_FILE()
|
|
|
|
paramVars.bMinMaxWidgetOutput = FALSE
|
|
ENDIF
|
|
|
|
//Draw a rectangle to visualise the locate.
|
|
SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE(TRUE)
|
|
|
|
IF paramVars.iMinMaxCurrentSelection = 0
|
|
DRAW_DEBUG_SPHERE(paramVars.vMinMaxCornerMin, 0.2, 255, 255, 255)
|
|
ELSE
|
|
DRAW_DEBUG_SPHERE(paramVars.vMinMaxCornerMin, 0.2, 255, 0, 0)
|
|
ENDIF
|
|
|
|
IF paramVars.iMinMaxCurrentSelection = 1
|
|
DRAW_DEBUG_SPHERE(paramVars.vMinMaxCornerMax, 0.2, 255, 255, 255)
|
|
ELSE
|
|
DRAW_DEBUG_SPHERE(paramVars.vMinMaxCornerMax, 0.2, 0, 255, 0)
|
|
ENDIF
|
|
|
|
DRAW_DEBUG_LINE(paramVars.vMinMaxCornerMin, <<paramVars.vMinMaxCornerMax.x, paramVars.vMinMaxCornerMin.y, paramVars.vMinMaxCornerMin.z>>)
|
|
DRAW_DEBUG_LINE(paramVars.vMinMaxCornerMin, <<paramVars.vMinMaxCornerMin.x, paramVars.vMinMaxCornerMax.y, paramVars.vMinMaxCornerMin.z>>)
|
|
DRAW_DEBUG_LINE(paramVars.vMinMaxCornerMin, <<paramVars.vMinMaxCornerMin.x, paramVars.vMinMaxCornerMin.y, paramVars.vMinMaxCornerMax.z>>)
|
|
|
|
DRAW_DEBUG_LINE(paramVars.vMinMaxCornerMax, <<paramVars.vMinMaxCornerMax.x, paramVars.vMinMaxCornerMax.y, paramVars.vMinMaxCornerMin.z>>)
|
|
DRAW_DEBUG_LINE(paramVars.vMinMaxCornerMax, <<paramVars.vMinMaxCornerMax.x, paramVars.vMinMaxCornerMin.y, paramVars.vMinMaxCornerMax.z>>)
|
|
DRAW_DEBUG_LINE(paramVars.vMinMaxCornerMax, <<paramVars.vMinMaxCornerMin.x, paramVars.vMinMaxCornerMax.y, paramVars.vMinMaxCornerMax.z>>)
|
|
|
|
DRAW_DEBUG_LINE(<<paramVars.vMinMaxCornerMin.x, paramVars.vMinMaxCornerMax.y, paramVars.vMinMaxCornerMin.z>>,
|
|
<<paramVars.vMinMaxCornerMin.x, paramVars.vMinMaxCornerMax.y, paramVars.vMinMaxCornerMax.z>>)
|
|
DRAW_DEBUG_LINE(<<paramVars.vMinMaxCornerMax.x, paramVars.vMinMaxCornerMin.y, paramVars.vMinMaxCornerMin.z>>,
|
|
<<paramVars.vMinMaxCornerMax.x, paramVars.vMinMaxCornerMin.y, paramVars.vMinMaxCornerMax.z>>)
|
|
|
|
DRAW_DEBUG_LINE(<<paramVars.vMinMaxCornerMin.x, paramVars.vMinMaxCornerMin.y, paramVars.vMinMaxCornerMax.z>>,
|
|
<<paramVars.vMinMaxCornerMax.x, paramVars.vMinMaxCornerMin.y, paramVars.vMinMaxCornerMax.z>>)
|
|
DRAW_DEBUG_LINE(<<paramVars.vMinMaxCornerMin.x, paramVars.vMinMaxCornerMin.y, paramVars.vMinMaxCornerMax.z>>,
|
|
<<paramVars.vMinMaxCornerMin.x, paramVars.vMinMaxCornerMax.y, paramVars.vMinMaxCornerMax.z>>)
|
|
|
|
DRAW_DEBUG_LINE(<<paramVars.vMinMaxCornerMax.x, paramVars.vMinMaxCornerMax.y, paramVars.vMinMaxCornerMin.z>>,
|
|
<<paramVars.vMinMaxCornerMin.x, paramVars.vMinMaxCornerMax.y, paramVars.vMinMaxCornerMin.z>>)
|
|
DRAW_DEBUG_LINE(<<paramVars.vMinMaxCornerMax.x, paramVars.vMinMaxCornerMax.y, paramVars.vMinMaxCornerMin.z>>,
|
|
<<paramVars.vMinMaxCornerMax.x, paramVars.vMinMaxCornerMin.y, paramVars.vMinMaxCornerMin.z>>)
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
// *****************************************************************************************
|
|
// DOOR OPENING ROTATION
|
|
// *****************************************************************************************
|
|
|
|
PROC Create_Door_Opening_Widgets(structSharedDebugVars ¶mVars)
|
|
START_WIDGET_GROUP("Door Opening")
|
|
ADD_WIDGET_BOOL("Enable widget", paramVars.bDoorOpeningEnabled)
|
|
ADD_WIDGET_STRING("Click on a door to change its open ratio.")
|
|
ADD_WIDGET_FLOAT_SLIDER("Door open ratio: ", paramVars.fOpenRatio, -2.5, 2.5, 0.01)
|
|
ADD_WIDGET_BOOL("Doors locked", paramVars.bDoorsLocked)
|
|
ADD_WIDGET_BOOL("Output to RAG output log", paramVars.bDoorOpeningOutputLog)
|
|
ADD_WIDGET_BOOL("Output to debug file", paramVars.bDoorOpeningOutputFile)
|
|
STOP_WIDGET_GROUP()
|
|
ENDPROC
|
|
|
|
PROC Maintain_Door_Opening_Widgets(structSharedDebugVars ¶mVars)
|
|
|
|
IF paramVars.bDoorOpeningEnabled
|
|
|
|
ENTITY_INDEX entityFocus = GET_FOCUS_ENTITY_INDEX()
|
|
|
|
IF NOT IS_ENTITY_DEAD(entityFocus)
|
|
//If the current focused entity differs from the one stored, update the widgets to match the new entity.
|
|
IF entityFocus != paramVars.objFocusedDoor
|
|
paramVars.objFocusedDoor = entityFocus
|
|
|
|
paramVars.vDoorPosition = GET_ENTITY_COORDS(entityFocus)
|
|
paramVars.mnDoorModel = GET_ENTITY_MODEL(entityFocus)
|
|
ENDIF
|
|
|
|
SET_STATE_OF_CLOSEST_DOOR_OF_TYPE(paramVars.mnDoorModel, paramVars.vDoorPosition, paramVars.bDoorsLocked, paramVars.fOpenRatio)
|
|
|
|
ENDIF
|
|
|
|
IF paramVars.bDoorOpeningOutputFile
|
|
SAVE_NEWLINE_TO_DEBUG_FILE()
|
|
SAVE_STRING_TO_DEBUG_FILE("SET_STATE_OF_CLOSEST_DOOR_OF_TYPE(")
|
|
SAVE_STRING_TO_DEBUG_FILE(GET_MODEL_NAME_FOR_DEBUG(paramVars.mnDoorModel))
|
|
SAVE_STRING_TO_DEBUG_FILE(", ")
|
|
SAVE_VECTOR_TO_DEBUG_FILE(paramVars.vDoorPosition)
|
|
SAVE_STRING_TO_DEBUG_FILE(", ")
|
|
SAVE_BOOL_TO_DEBUG_FILE(paramVars.bDoorsLocked)
|
|
SAVE_STRING_TO_DEBUG_FILE(", ")
|
|
SAVE_FLOAT_TO_DEBUG_FILE(paramVars.fOpenRatio)
|
|
SAVE_STRING_TO_DEBUG_FILE(")")
|
|
SAVE_NEWLINE_TO_DEBUG_FILE()
|
|
|
|
paramVars.bDoorOpeningOutputFile = FALSE
|
|
ENDIF
|
|
|
|
IF paramVars.bDoorOpeningOutputLog
|
|
|
|
PRINTSTRING("SET_STATE_OF_CLOSEST_DOOR_OF_TYPE(")
|
|
PRINTSTRING(GET_MODEL_NAME_FOR_DEBUG(paramVars.mnDoorModel))
|
|
PRINTSTRING(", ")
|
|
PRINTVECTOR(paramVars.vDoorPosition)
|
|
PRINTSTRING(", ")
|
|
PRINTBOOL(paramVars.bDoorsLocked)
|
|
PRINTSTRING(", ")
|
|
PRINTFLOAT(paramVars.fOpenRatio)
|
|
PRINTSTRING(")")
|
|
PRINTNL()
|
|
|
|
paramVars.bDoorOpeningOutputLog = FALSE
|
|
ENDIF
|
|
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
|
|
// *****************************************************************************************
|
|
// RADAR MAP AREA COLOURS
|
|
// *****************************************************************************************
|
|
|
|
// PURPOSE: Add a widget that allows the area colours to be displayed on the Radar
|
|
PROC Create_Radar_Map_Colours_Widgets(structSharedDebugVars ¶mVars)
|
|
ADD_WIDGET_BOOL("Toggle Radar Area Colours (tick to display)", paramVars.toggleRadarAreaColours)
|
|
ENDPROC
|
|
|
|
|
|
// *****************************************************************************************
|
|
// GET CAM OFFSET FROM ENTITY
|
|
// *****************************************************************************************
|
|
|
|
/// PURPOSE:
|
|
/// Creates a widget to launch the cam editor script.
|
|
PROC Create_Cam_Offset_Widgets(structSharedDebugVars ¶mVars)
|
|
START_WIDGET_GROUP("Get Cam Offset From Entity")
|
|
ADD_WIDGET_STRING("When enabled, click on an entity, then move the game cam into position.")
|
|
|
|
ADD_WIDGET_BOOL("Enable widgets", paramVars.bCamOffsetEnabled)
|
|
ADD_WIDGET_BOOL("Offset relative to entity", paramVars.bCamOffsetRelativePosition)
|
|
ADD_WIDGET_BOOL("Lookat relative to entity", paramVars.bCamOffsetRelativeLookAt)
|
|
ADD_WIDGET_BOOL("Output to temp_debug", paramVars.bCamOffsetActivate)
|
|
|
|
STOP_WIDGET_GROUP()
|
|
ENDPROC
|
|
|
|
PROC Maintain_Cam_Offset_Widgets(structSharedDebugVars ¶mVars)
|
|
IF paramVars.bCamOffsetEnabled
|
|
ENTITY_INDEX entityFocus = GET_FOCUS_ENTITY_INDEX()
|
|
|
|
IF NOT IS_ENTITY_DEAD(entityFocus)
|
|
//If the current focused entity differs from the one stored, update the widgets to match the new entity.
|
|
IF entityFocus != paramVars.objFocusedEntity
|
|
paramVars.objFocusedEntity = entityFocus
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF paramVars.bCamOffsetActivate
|
|
IF NOT IS_ENTITY_DEAD(paramVars.objFocusedEntity)
|
|
VECTOR v_cam_pos = GET_FINAL_RENDERED_CAM_COORD()
|
|
VECTOR v_cam_rot = GET_FINAL_RENDERED_CAM_ROT()
|
|
VECTOR v_entity_rot = GET_ENTITY_ROTATION(paramVars.objFocusedEntity)
|
|
IF v_entity_rot.z > 180.0
|
|
v_entity_rot.z = -180.0 -(180.0 - v_entity_rot.z)
|
|
ENDIF
|
|
|
|
VECTOR v_cam_dir = <<-SIN(v_cam_rot.z) * COS(v_cam_rot.x), COS(v_cam_rot.z) * COS(v_cam_rot.x), SIN(v_cam_rot.x)>>
|
|
VECTOR v_cam_front_pos = v_cam_pos + (v_cam_dir * 3.0)
|
|
|
|
SAVE_NEWLINE_TO_DEBUG_FILE()
|
|
|
|
SAVE_STRING_TO_DEBUG_FILE("ATTACH_CAM_TO_ENTITY(cam, entity, ")
|
|
IF paramVars.bCamOffsetRelativePosition
|
|
SAVE_VECTOR_TO_DEBUG_FILE(GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(paramVars.objFocusedEntity, v_cam_pos))
|
|
SAVE_STRING_TO_DEBUG_FILE(", TRUE)")
|
|
ELSE
|
|
SAVE_VECTOR_TO_DEBUG_FILE( v_cam_pos - GET_ENTITY_COORDS(paramVars.objFocusedEntity) )
|
|
SAVE_STRING_TO_DEBUG_FILE(", FALSE)")
|
|
ENDIF
|
|
|
|
SAVE_NEWLINE_TO_DEBUG_FILE()
|
|
|
|
SAVE_STRING_TO_DEBUG_FILE("POINT_CAM_AT_ENTITY(cam, entity, ")
|
|
IF paramVars.bCamOffsetRelativeLookAt
|
|
SAVE_VECTOR_TO_DEBUG_FILE(GET_OFFSET_FROM_ENTITY_GIVEN_WORLD_COORDS(paramVars.objFocusedEntity, v_cam_front_pos))
|
|
SAVE_STRING_TO_DEBUG_FILE(", TRUE)")
|
|
ELSE
|
|
SAVE_VECTOR_TO_DEBUG_FILE( v_cam_front_pos - GET_ENTITY_COORDS(paramVars.objFocusedEntity) )
|
|
SAVE_STRING_TO_DEBUG_FILE(", FALSE)")
|
|
ENDIF
|
|
|
|
SAVE_NEWLINE_TO_DEBUG_FILE()
|
|
|
|
SAVE_STRING_TO_DEBUG_FILE("SET_CAM_FOV(cam, ")
|
|
SAVE_FLOAT_TO_DEBUG_FILE(GET_FINAL_RENDERED_CAM_FOV())
|
|
SAVE_STRING_TO_DEBUG_FILE(")")
|
|
|
|
SAVE_NEWLINE_TO_DEBUG_FILE()
|
|
|
|
//Source data
|
|
VECTOR v_entity_pos = GET_ENTITY_COORDS(paramVars.objFocusedEntity)
|
|
|
|
SAVE_STRING_TO_DEBUG_FILE("Camera world coords: ")
|
|
SAVE_VECTOR_TO_DEBUG_FILE(v_cam_pos)
|
|
SAVE_STRING_TO_DEBUG_FILE(" Camera rotation: ")
|
|
SAVE_VECTOR_TO_DEBUG_FILE(v_cam_rot)
|
|
|
|
SAVE_NEWLINE_TO_DEBUG_FILE()
|
|
|
|
SAVE_STRING_TO_DEBUG_FILE("Entity world coords: ")
|
|
SAVE_VECTOR_TO_DEBUG_FILE(v_entity_pos)
|
|
SAVE_STRING_TO_DEBUG_FILE(" Entity rotation: ")
|
|
SAVE_VECTOR_TO_DEBUG_FILE(v_entity_rot)
|
|
|
|
SAVE_NEWLINE_TO_DEBUG_FILE()
|
|
ENDIF
|
|
|
|
paramVars.bCamOffsetActivate = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
|
|
// *****************************************************************************************
|
|
// VEHICLE FORCES
|
|
// *****************************************************************************************
|
|
PROC Create_Vehicle_Force_Widgets(structSharedDebugVars ¶mVars)
|
|
START_WIDGET_GROUP("Entity forces")
|
|
ADD_WIDGET_STRING("When enabled click on an entity, adjust the settings, then hold Square/X to apply the force.")
|
|
|
|
ADD_WIDGET_BOOL("Enable widgets", paramVars.bEnableForceWidget)
|
|
ADD_WIDGET_INT_SLIDER("Force type", paramVars.iForceApplyType, 0, 5, 1)
|
|
ADD_WIDGET_VECTOR_SLIDER("Force direction", paramVars.vForceDirection, -50.0, 50.0, 0.1)
|
|
ADD_WIDGET_VECTOR_SLIDER("Force offset", paramVars.vForceOffset, -30.0, 30.0, 0.1)
|
|
ADD_WIDGET_INT_SLIDER("Component", paramVars.iForceComponent, 0, 50, 1)
|
|
ADD_WIDGET_BOOL("Local force", paramVars.bIsLocalForce)
|
|
ADD_WIDGET_BOOL("Local offset", paramVars.bIsLocalOffset)
|
|
ADD_WIDGET_BOOL("Scale by mass", paramVars.bScaleForceByMass)
|
|
STOP_WIDGET_GROUP()
|
|
ENDPROC
|
|
|
|
PROC Maintain_Vehicle_Force_Widgets(structSharedDebugVars ¶mVars)
|
|
IF paramVars.bEnableForceWidget
|
|
ENTITY_INDEX entityFocus = GET_FOCUS_ENTITY_INDEX()
|
|
|
|
IF NOT IS_ENTITY_DEAD(entityFocus)
|
|
//If the current focused entity differs from the one stored, update the widgets to match the new entity.
|
|
IF entityFocus != paramVars.entityToApplyTo
|
|
paramVars.entityToApplyTo = entityFocus
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF IS_CONTROL_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_X)
|
|
APPLY_FORCE_TYPE eForceType
|
|
|
|
IF paramVars.iForceApplyType = 0
|
|
eForceType = APPLY_TYPE_FORCE
|
|
ELIF paramVars.iForceApplyType = 1
|
|
eForceType = APPLY_TYPE_IMPULSE
|
|
ELIF paramVars.iForceApplyType = 2
|
|
eForceType = APPLY_TYPE_EXTERNAL_FORCE
|
|
ELIF paramVars.iForceApplyType = 3
|
|
eForceType = APPLY_TYPE_EXTERNAL_IMPULSE
|
|
ELIF paramVars.iForceApplyType = 4
|
|
eForceType = APPLY_TYPE_TORQUE
|
|
ELIF paramVars.iForceApplyType = 5
|
|
eForceType = APPLY_TYPE_ANGULAR_IMPULSE
|
|
ENDIF
|
|
|
|
APPLY_FORCE_TO_ENTITY(entityFocus, eForceType, paramVars.vForceDirection, paramVars.vForceOffset, paramVars.iForceComponent,
|
|
paramVars.bIsLocalForce, paramVars.bIsLocalOffset, paramVars.bScaleForceByMass)
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
|
|
// -----------------------------------------------------------------------------------------------------------
|
|
|
|
// PURPOSE: Check if the widget tickbox has changed that allows the area colours to be displayed on the Radar
|
|
PROC Maintain_Radar_Map_Colours_Widgets(structSharedDebugVars ¶mVars)
|
|
|
|
// Check if the Radar Area Colours tickbox is ticked
|
|
IF NOT (paramVars.toggleRadarAreaColours)
|
|
EXIT
|
|
ENDIF
|
|
|
|
// Untick the toggle
|
|
paramVars.toggleRadarAreaColours = FALSE
|
|
|
|
PRINTSTRING("------> Radar Area Colours Toggle Detected") PRINTNL()
|
|
|
|
// Tickbox is ticked, so switch it on or off
|
|
IF (IS_BIT_SET(m_sharedDebugFlags, DBG_RADAR_AREA_COLOURS_ON))
|
|
PRINTSTRING(" Radar Area Colours already on - about to clear the minimap component") PRINTNL()
|
|
|
|
// It's already on, so switch it off
|
|
SET_MINIMAP_COMPONENT(MINIMAP_COMPONENT_DEBUG_MAP_AREAS, FALSE)
|
|
CLEAR_BIT(m_sharedDebugFlags, DBG_RADAR_AREA_COLOURS_ON)
|
|
|
|
PRINTSTRING(" ...cleared") PRINTNL()
|
|
EXIT
|
|
ENDIF
|
|
|
|
PRINTSTRING(" Radar Area Colours not on - about to set the minimap component") PRINTNL()
|
|
|
|
// Area Colours are off, so switch them on
|
|
IF NOT (SET_MINIMAP_COMPONENT(MINIMAP_COMPONENT_DEBUG_MAP_AREAS, TRUE))
|
|
// ...component not valid
|
|
EXIT
|
|
ENDIF
|
|
|
|
PRINTSTRING(" ...set") PRINTNL()
|
|
|
|
// Set the 'colours on' bitflag
|
|
SET_BIT(m_sharedDebugFlags, DBG_RADAR_AREA_COLOURS_ON)
|
|
|
|
ENDPROC
|
|
|
|
// *****************************************************************************************
|
|
// CAR DAMAGE
|
|
// *****************************************************************************************
|
|
|
|
/// PURPOSE:
|
|
/// Add a widget that allows to mark areas on cars for tyre burst and damage
|
|
PROC Create_Car_Damage_Widgets(structSharedDebugVars ¶mVars)
|
|
START_WIDGET_GROUP("Car Damage")
|
|
ADD_WIDGET_BOOL("Enable widget", paramVars.bCarTyreBurstsAndDamageEnabled)
|
|
ADD_WIDGET_STRING("Click on a car to start editing tyre burst areas and damage.")
|
|
ADD_WIDGET_BOOL("Draw debug spheres", paramVars.bDrawDebugSpheres)
|
|
ADD_WIDGET_BOOL("Restore car's health", paramVars.bRetoreCarHealth)
|
|
ADD_WIDGET_FLOAT_SLIDER("Damage", paramVars.fDamage, 0.0, 500.0, 1.0)
|
|
ADD_WIDGET_FLOAT_SLIDER("Deformation", paramVars.fDeformation, 0.0, 500.0, 1.0)
|
|
ADD_WIDGET_BOOL("Apply front left damage", paramVars.bApplyFrontLeftDamage)
|
|
ADD_WIDGET_BOOL("Apply front right damage", paramVars.bApplyFrontRightDamage)
|
|
ADD_WIDGET_BOOL("Apply rear left damage", paramVars.bApplyRearLeftDamage)
|
|
ADD_WIDGET_BOOL("Apply rear right damage", paramVars.bApplyRearRightDamage)
|
|
ADD_WIDGET_FLOAT_SLIDER("Sphere radius", paramVars.fSphereRadius, 0.1, 2.0, 0.1)
|
|
START_WIDGET_GROUP("Front Left Wheel offset")
|
|
ADD_WIDGET_VECTOR_SLIDER("Front Left wheel offset", paramVars.vFrontLeftWheelOffset, -5.0, 5.0, 0.05)
|
|
STOP_WIDGET_GROUP()
|
|
START_WIDGET_GROUP("Front Right Wheel offset")
|
|
ADD_WIDGET_VECTOR_SLIDER("Front Right wheel offset", paramVars.vFrontRightWheelOffset, -5.0, 5.0, 0.05)
|
|
STOP_WIDGET_GROUP()
|
|
START_WIDGET_GROUP("Rear Left Wheel offset")
|
|
ADD_WIDGET_VECTOR_SLIDER("Rear Left wheel offset", paramVars.vRearLeftWheelOffset, -5.0, 5.0, 0.05)
|
|
STOP_WIDGET_GROUP()
|
|
START_WIDGET_GROUP("Rear Right Wheel offset")
|
|
ADD_WIDGET_VECTOR_SLIDER("Rear Right wheel offset", paramVars.vRearRightWheelOffset, -5.0, 5.0, 0.05)
|
|
STOP_WIDGET_GROUP()
|
|
START_WIDGET_GROUP("Front Left Damage offset")
|
|
ADD_WIDGET_VECTOR_SLIDER("Front Left damage offset", paramVars.vFrontLeftDamageOffset, -5.0, 5.0, 0.05)
|
|
STOP_WIDGET_GROUP()
|
|
START_WIDGET_GROUP("Front Right Damage offset")
|
|
ADD_WIDGET_VECTOR_SLIDER("Front Right damage offset", paramVars.vFrontRightDamageOffset, -5.0, 5.0, 0.05)
|
|
STOP_WIDGET_GROUP()
|
|
START_WIDGET_GROUP("Rear Left Damage offset")
|
|
ADD_WIDGET_VECTOR_SLIDER("Rear Left damage offset", paramVars.vRearLeftDamageOffset, -5.0, 5.0, 0.05)
|
|
STOP_WIDGET_GROUP()
|
|
START_WIDGET_GROUP("Rear Right Damage offset")
|
|
ADD_WIDGET_VECTOR_SLIDER("Rear Right damage offset", paramVars.vRearRightDamageOffset, -5.0, 5.0, 0.05)
|
|
STOP_WIDGET_GROUP()
|
|
ADD_WIDGET_BOOL("Output to debug", paramVars.bCarTyreBurstsAndDamageOutput)
|
|
|
|
paramVars.fSphereRadius = 0.2
|
|
|
|
paramVars.vFrontLeftWheelOffset = << -1.0, 1.5, -0.5 >>
|
|
paramVars.vFrontRightWheelOffset = << 1.0, 1.5, -0.5 >>
|
|
paramVars.vRearLeftWheelOffset = << -1.0, -1.5, -0.5 >>
|
|
paramVars.vRearRightWheelOffset = << 1.0, -1.5, -0.5 >>
|
|
|
|
paramVars.vFrontLeftDamageOffset = << -1.0, 1.0, 0.2 >>
|
|
paramVars.vFrontRightDamageOffset = << 1.0, 1.0, 0.2 >>
|
|
paramVars.vRearLeftDamageOffset = << -1.0, -1.0, 0.2 >>
|
|
paramVars.vRearRightDamageOffset = << 1.0, -1.0, 0.2 >>
|
|
|
|
paramVars.fDamage = 100.0
|
|
paramVars.fDeformation = 100.0
|
|
|
|
paramVars.bDrawDebugSpheres = TRUE
|
|
|
|
STOP_WIDGET_GROUP()
|
|
ENDPROC
|
|
|
|
|
|
// ════════════════════════════════════╡ VEHICLE EXTRAS ╞══════════════════════════════════
|
|
|
|
/// PURPOSE:
|
|
/// Add a widget to easily modify a vehicles extras
|
|
PROC Create_Vehicle_Extra_Widgets(structSharedDebugVars ¶mVars)
|
|
START_WIDGET_GROUP("Vehicle Extras")
|
|
ADD_WIDGET_BOOL("Enable widget", paramVars.bVehicleExtraEnabled)
|
|
ADD_WIDGET_STRING("Click on a vehicle to start editing the vehicle extras.")
|
|
ADD_WIDGET_INT_SLIDER("Extra Index", paramVars.iVehicleExtra, 0, 32, 1)
|
|
ADD_WIDGET_BOOL("Extra Toggle", paramVars.bVehicleExtra)
|
|
ADD_WIDGET_STRING("")
|
|
ADD_WIDGET_BOOL("Debug Info", paramVars.bVehicleExtraDebug)
|
|
ADD_WIDGET_BOOL("Output Info", paramVars.bVehicleExtraOutput)
|
|
STOP_WIDGET_GROUP()
|
|
ENDPROC
|
|
|
|
PROC Maintain_Car_Damage_Widgets(structSharedDebugVars ¶mVars)
|
|
|
|
IF paramVars.bCarTyreBurstsAndDamageEnabled
|
|
|
|
ENTITY_INDEX entityFocus = GET_FOCUS_ENTITY_INDEX()
|
|
|
|
IF NOT IS_ENTITY_DEAD(entityFocus)
|
|
AND IS_ENTITY_A_VEHICLE(entityFocus)
|
|
|
|
VEHICLE_INDEX vehicleFocus = GET_VEHICLE_INDEX_FROM_ENTITY_INDEX(entityFocus)
|
|
|
|
IF IS_VEHICLE_DRIVEABLE(vehicleFocus)
|
|
|
|
//If the current focused entity differs from the one stored, update the widgets to match the new entity.
|
|
IF vehicleFocus != paramVars.vehFocusedCar
|
|
paramVars.vehFocusedCar = vehicleFocus
|
|
paramVars.mnCarModel = GET_ENTITY_MODEL(entityFocus)
|
|
ENDIF
|
|
|
|
IF ( paramVars.bRetoreCarHealth = TRUE )
|
|
|
|
SET_VEHICLE_ENGINE_HEALTH(paramVars.vehFocusedCar, 1000)
|
|
SET_ENTITY_HEALTH(paramVars.vehFocusedCar, 1000)
|
|
SET_VEHICLE_FIXED(paramVars.vehFocusedCar)
|
|
|
|
paramVars.bRetoreCarHealth = FALSE
|
|
|
|
ENDIF
|
|
|
|
IF ( paramVars.bDrawDebugSpheres = TRUE )
|
|
DRAW_DEBUG_SPHERE(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(paramVars.vehFocusedCar, paramVars.vFrontLeftWheelOffset), paramVars.fSphereRadius, 0, 0, 255, 128)
|
|
DRAW_DEBUG_SPHERE(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(paramVars.vehFocusedCar, paramVars.vFrontRightWheelOffset), paramVars.fSphereRadius, 0, 0, 255, 128)
|
|
DRAW_DEBUG_SPHERE(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(paramVars.vehFocusedCar, paramVars.vRearLeftWheelOffset), paramVars.fSphereRadius, 0, 0, 255, 128)
|
|
DRAW_DEBUG_SPHERE(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(paramVars.vehFocusedCar, paramVars.vRearRightWheelOffset), paramVars.fSphereRadius, 0, 0, 255, 128)
|
|
|
|
DRAW_DEBUG_TEXT("FRONT LEFT WHEEL", GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(paramVars.vehFocusedCar, paramVars.vFrontLeftWheelOffset))
|
|
DRAW_DEBUG_TEXT("FRONT RIGHT WHEEL", GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(paramVars.vehFocusedCar, paramVars.vFrontRightWheelOffset))
|
|
DRAW_DEBUG_TEXT("REAR LEFT WHEEL", GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(paramVars.vehFocusedCar, paramVars.vRearLeftWheelOffset))
|
|
DRAW_DEBUG_TEXT("REAR RIGHT WHEEL", GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(paramVars.vehFocusedCar, paramVars.vRearRightWheelOffset))
|
|
|
|
DRAW_DEBUG_SPHERE(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(paramVars.vehFocusedCar, paramVars.vFrontLeftDamageOffset), 0.1, 255, 0, 0)
|
|
DRAW_DEBUG_SPHERE(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(paramVars.vehFocusedCar, paramVars.vFrontRightDamageOffset), 0.1, 255, 0, 0)
|
|
DRAW_DEBUG_SPHERE(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(paramVars.vehFocusedCar, paramVars.vRearLeftDamageOffset), 0.1, 255, 0, 0)
|
|
DRAW_DEBUG_SPHERE(GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(paramVars.vehFocusedCar, paramVars.vRearRightDamageOffset), 0.1, 255, 0, 0)
|
|
|
|
DRAW_DEBUG_TEXT("FRONT LEFT DAMAGE", GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(paramVars.vehFocusedCar, paramVars.vFrontLeftDamageOffset), 255, 0, 0)
|
|
DRAW_DEBUG_TEXT("FRONT RIGHT DAMAGE", GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(paramVars.vehFocusedCar, paramVars.vFrontRightDamageOffset), 255, 0, 0)
|
|
DRAW_DEBUG_TEXT("REAR LEFT DAMAGE", GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(paramVars.vehFocusedCar, paramVars.vRearLeftDamageOffset), 255, 0, 0)
|
|
DRAW_DEBUG_TEXT("REAR RIGHT DAMAGE", GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(paramVars.vehFocusedCar, paramVars.vRearRightDamageOffset), 255, 0, 0)
|
|
|
|
ENDIF
|
|
|
|
IF ( paramVars.bApplyFrontLeftDamage = TRUE )
|
|
SET_VEHICLE_DAMAGE(paramVars.vehFocusedCar, paramVars.vFrontLeftDamageOffset, paramVars.fDamage, paramVars.fDeformation, TRUE)
|
|
paramVars.bApplyFrontLeftDamage = FALSE
|
|
ENDIF
|
|
|
|
IF ( paramVars.bApplyFrontRightDamage = TRUE )
|
|
SET_VEHICLE_DAMAGE(paramVars.vehFocusedCar, paramVars.vFrontRightDamageOffset, paramVars.fDamage, paramVars.fDeformation, TRUE)
|
|
paramVars.bApplyFrontRightDamage = FALSE
|
|
ENDIF
|
|
|
|
IF ( paramVars.bApplyRearLeftDamage = TRUE )
|
|
SET_VEHICLE_DAMAGE(paramVars.vehFocusedCar, paramVars.vRearLeftDamageOffset, paramVars.fDamage, paramVars.fDeformation, TRUE)
|
|
paramVars.bApplyRearLeftDamage = FALSE
|
|
ENDIF
|
|
|
|
IF ( paramVars.bApplyRearRightDamage = TRUE )
|
|
SET_VEHICLE_DAMAGE(paramVars.vehFocusedCar, paramVars.vRearRightDamageOffset, paramVars.fDamage, paramVars.fDeformation, TRUE)
|
|
paramVars.bApplyRearRightDamage = FALSE
|
|
ENDIF
|
|
|
|
ELSE
|
|
|
|
paramVars.bApplyFrontLeftDamage = FALSE
|
|
paramVars.bApplyFrontRightDamage = FALSE
|
|
paramVars.bApplyRearLeftDamage = FALSE
|
|
paramVars.bApplyRearRightDamage = FALSE
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
|
|
IF ( paramVars.bCarTyreBurstsAndDamageOutput = TRUE )
|
|
SAVE_NEWLINE_TO_DEBUG_FILE()
|
|
SAVE_NEWLINE_TO_DEBUG_FILE()
|
|
SAVE_STRING_TO_DEBUG_FILE("CAR MODEL: ")
|
|
SAVE_STRING_TO_DEBUG_FILE(GET_MODEL_NAME_FOR_DEBUG(paramVars.mnCarModel))
|
|
SAVE_NEWLINE_TO_DEBUG_FILE()
|
|
SAVE_STRING_TO_DEBUG_FILE("FRONT LEFT WHEEL OFFSET: ")
|
|
SAVE_VECTOR_TO_DEBUG_FILE(paramVars.vFrontLeftWheelOffset)
|
|
SAVE_NEWLINE_TO_DEBUG_FILE()
|
|
SAVE_STRING_TO_DEBUG_FILE("FRONT RIGHT WHEEL OFFSET: ")
|
|
SAVE_VECTOR_TO_DEBUG_FILE(paramVars.vFrontRightWheelOffset)
|
|
SAVE_NEWLINE_TO_DEBUG_FILE()
|
|
SAVE_STRING_TO_DEBUG_FILE("REAR LEFT WHEEL OFFSET: ")
|
|
SAVE_VECTOR_TO_DEBUG_FILE(paramVars.vRearLeftWheelOffset)
|
|
SAVE_NEWLINE_TO_DEBUG_FILE()
|
|
SAVE_STRING_TO_DEBUG_FILE("REAR RIGHT WHEEL OFFSET: ")
|
|
SAVE_VECTOR_TO_DEBUG_FILE(paramVars.vRearRightWheelOffset)
|
|
SAVE_NEWLINE_TO_DEBUG_FILE()
|
|
SAVE_STRING_TO_DEBUG_FILE("FRONT LEFT DAMAGE OFFSET: ")
|
|
SAVE_VECTOR_TO_DEBUG_FILE(paramVars.vFrontLeftDamageOffset)
|
|
SAVE_NEWLINE_TO_DEBUG_FILE()
|
|
SAVE_STRING_TO_DEBUG_FILE("FRONT RIGHT DAMAGE OFFSET: ")
|
|
SAVE_VECTOR_TO_DEBUG_FILE(paramVars.vFrontRightDamageOffset)
|
|
SAVE_NEWLINE_TO_DEBUG_FILE()
|
|
SAVE_STRING_TO_DEBUG_FILE("REAR LEFT DAMAGE OFFSET: ")
|
|
SAVE_VECTOR_TO_DEBUG_FILE(paramVars.vRearLeftDamageOffset)
|
|
SAVE_NEWLINE_TO_DEBUG_FILE()
|
|
SAVE_STRING_TO_DEBUG_FILE("REAR RIGHT DAMAGE OFFSET: ")
|
|
SAVE_VECTOR_TO_DEBUG_FILE(paramVars.vRearRightDamageOffset)
|
|
SAVE_NEWLINE_TO_DEBUG_FILE()
|
|
SAVE_STRING_TO_DEBUG_FILE("DAMAGE: ")
|
|
SAVE_FLOAT_TO_DEBUG_FILE(paramVars.fDamage)
|
|
SAVE_NEWLINE_TO_DEBUG_FILE()
|
|
SAVE_STRING_TO_DEBUG_FILE("DEFORMATION: ")
|
|
SAVE_FLOAT_TO_DEBUG_FILE(paramVars.fDeformation)
|
|
SAVE_NEWLINE_TO_DEBUG_FILE()
|
|
SAVE_NEWLINE_TO_DEBUG_FILE()
|
|
|
|
paramVars.bCarTyreBurstsAndDamageOutput = FALSE
|
|
|
|
ENDIF
|
|
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
|
|
PROC Maintain_Vehicle_Extra_Widgets(structSharedDebugVars ¶mVars)
|
|
IF paramVars.bVehicleExtraEnabled
|
|
ENTITY_INDEX entityFocus = GET_FOCUS_ENTITY_INDEX()
|
|
|
|
IF NOT IS_ENTITY_DEAD(entityFocus)
|
|
AND IS_ENTITY_A_VEHICLE(entityFocus)
|
|
VEHICLE_INDEX vehicleFocus = GET_VEHICLE_INDEX_FROM_ENTITY_INDEX(entityFocus)
|
|
IF IS_VEHICLE_DRIVEABLE(vehicleFocus)
|
|
//If the current focused entity differs from the one stored, update the widgets to match the new entity.
|
|
IF vehicleFocus != paramVars.vehVehicleExtraFocus
|
|
paramVars.vehVehicleExtraFocus = vehicleFocus
|
|
ENDIF
|
|
|
|
IF paramVars.iVehicleExtra != paramVars.iVehicleExtraLast
|
|
paramVars.iVehicleExtraLast = paramVars.iVehicleExtra
|
|
|
|
IF IS_VEHICLE_EXTRA_TURNED_ON(paramVars.vehVehicleExtraFocus, paramVars.iVehicleExtra)
|
|
paramVars.bVehicleExtra = TRUE
|
|
ELSE
|
|
paramVars.bVehicleExtra = FALSE
|
|
ENDIF
|
|
ELSE
|
|
IF paramVars.bVehicleExtra != IS_VEHICLE_EXTRA_TURNED_ON(paramVars.vehVehicleExtraFocus, paramVars.iVehicleExtra)
|
|
SET_VEHICLE_EXTRA(paramVars.vehVehicleExtraFocus, paramVars.iVehicleExtra, paramVars.bVehicleExtra)
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF paramVars.bVehicleExtraDebug = TRUE
|
|
//SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE(TRUE)
|
|
|
|
TEXT_LABEL txtLabel
|
|
|
|
txtLabel = "iVehicleExtra = "
|
|
txtLabel += paramVars.iVehicleExtra
|
|
|
|
DRAW_DEBUG_TEXT(txtLabel, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(paramVars.vehVehicleExtraFocus, <<0.0, 0.0, 0.5>>))
|
|
|
|
txtLabel = "bVehicleExtra = "
|
|
IF paramVars.bVehicleExtra
|
|
txtLabel += "TRUE"
|
|
ELSE
|
|
txtLabel += "FALSE"
|
|
ENDIF
|
|
|
|
DRAW_DEBUG_TEXT(txtLabel, GET_OFFSET_FROM_ENTITY_IN_WORLD_COORDS(paramVars.vehVehicleExtraFocus, <<0.0, 0.0, 0.25>>))
|
|
ENDIF
|
|
|
|
IF paramVars.bVehicleExtraOutput = TRUE
|
|
SAVE_NEWLINE_TO_DEBUG_FILE()
|
|
SAVE_NEWLINE_TO_DEBUG_FILE()
|
|
SAVE_STRING_TO_DEBUG_FILE("iVehicleExtra = ")
|
|
SAVE_INT_TO_DEBUG_FILE(paramVars.iVehicleExtra)
|
|
SAVE_NEWLINE_TO_DEBUG_FILE()
|
|
SAVE_STRING_TO_DEBUG_FILE("bVehicleExtra = ")
|
|
SAVE_BOOL_TO_DEBUG_FILE(paramVars.bVehicleExtra)
|
|
SAVE_NEWLINE_TO_DEBUG_FILE()
|
|
SAVE_NEWLINE_TO_DEBUG_FILE()
|
|
|
|
paramVars.bCarTyreBurstsAndDamageOutput = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
|
|
// *****************************************************************************************
|
|
// SCRIPTED CAM EDITOR
|
|
// *****************************************************************************************
|
|
|
|
/// PURPOSE:
|
|
/// Creates a widget to launch the cam editor script.
|
|
PROC Create_Native_Trace_Widget(structSharedDebugVars ¶mVars)
|
|
START_WIDGET_GROUP("Native Trace")
|
|
paramVars.nativeTraceTextWidgetID = ADD_TEXT_WIDGET("Native Command")
|
|
ADD_WIDGET_BOOL("Trace", paramVars.bNativeTraceInput)
|
|
ADD_WIDGET_BOOL("Break on call", paramVars.bNativeTraceBreakInput)
|
|
ADD_WIDGET_BOOL("Break on first call only", paramVars.bNativeTraceBreakFirstInput)
|
|
|
|
// ADD_WIDGET_BOOL("bNativeTraceRunning", paramVars.bNativeTraceRunning)
|
|
// ADD_WIDGET_BOOL("bNativeTraceBreakRunning", paramVars.bNativeTraceBreakRunning)
|
|
// ADD_WIDGET_BOOL("bNativeTraceBreakFirstRunning", paramVars.bNativeTraceBreakFirstRunning)
|
|
|
|
STOP_WIDGET_GROUP()
|
|
ENDPROC
|
|
|
|
|
|
PROC Create_Game_Time_Date_Widget(structSharedDebugVars ¶mVars)
|
|
START_WIDGET_GROUP("Time/Date")
|
|
ADD_WIDGET_BOOL("Draw Time/Date", paramVars.bDrawGameTimeDate)
|
|
ADD_WIDGET_FLOAT_SLIDER("Current Time/Date X", paramVars.fCurrentTimeDateX, -1.0, 1.0, 0.01)
|
|
ADD_WIDGET_FLOAT_SLIDER("Current Time/Date Y", paramVars.fCurrentTimeDateY, -1.0, 1.0, 0.01)
|
|
|
|
ADD_WIDGET_STRING("Set g_debugTOD variable to draw custom TIMEOFDAY value.")
|
|
ADD_WIDGET_FLOAT_SLIDER("Debug Time/Date X", paramVars.fDebugTimeDateX, -1.0, 1.0, 0.01)
|
|
ADD_WIDGET_FLOAT_SLIDER("Debug Time/Date Y", paramVars.fDebugTimeDateY, -1.0, 1.0, 0.01)
|
|
|
|
ADD_WIDGET_STRING(" ")
|
|
ADD_WIDGET_STRING("Debug TOD calculations")
|
|
ADD_WIDGET_DATE_SLIDER("TOD1",paramVars.fDebugDate1,0,3000,1)
|
|
ADD_WIDGET_STRING(" ")
|
|
|
|
ADD_WIDGET_DATE_SLIDER("TOD2",paramVars.fDebugDate2,0,3000,1)
|
|
ADD_WIDGET_BOOL("Add TODs",paramVars.bAddTODs)
|
|
ADD_WIDGET_BOOL("Set current TOD - uses TOD1",paramVars.bSetTOD)
|
|
|
|
|
|
ADD_WIDGET_DATE_READ_ONLY("Test Result",paramVars.fDebugDateRes)
|
|
|
|
|
|
STOP_WIDGET_GROUP()
|
|
ENDPROC
|
|
|
|
PROC Maintain_Native_Trace_Widgets(structSharedDebugVars ¶mVars)
|
|
IF paramVars.bNativeTraceInput
|
|
|
|
// if the TRACE_NATIVE_COMMAND is running, the BREAK_ON_NATIVE_COMMAND can't be.
|
|
IF paramVars.bNativeTraceBreakInput
|
|
paramVars.bNativeTraceBreakInput = FALSE
|
|
ENDIF
|
|
IF paramVars.bNativeTraceBreakRunning
|
|
paramVars.bNativeTraceBreakRunning = FALSE
|
|
ENDIF
|
|
IF paramVars.bNativeTraceBreakFirstInput
|
|
paramVars.bNativeTraceBreakFirstInput = FALSE
|
|
ENDIF
|
|
IF paramVars.bNativeTraceBreakFirstRunning
|
|
paramVars.bNativeTraceBreakFirstRunning = FALSE
|
|
ENDIF
|
|
|
|
// start the trace
|
|
IF NOT paramVars.bNativeTraceRunning
|
|
TRACE_NATIVE_COMMAND(GET_CONTENTS_OF_TEXT_WIDGET(paramVars.nativeTraceTextWidgetID))
|
|
paramVars.bNativeTraceRunning = TRUE
|
|
ENDIF
|
|
|
|
ELSE
|
|
IF paramVars.bNativeTraceRunning
|
|
paramVars.bNativeTraceRunning = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
|
|
IF paramVars.bNativeTraceBreakInput
|
|
|
|
// if the BREAK_ON_NATIVE_COMMAND is running, the TRACE_NATIVE_COMMAND can't be.
|
|
IF paramVars.bNativeTraceInput
|
|
paramVars.bNativeTraceInput = FALSE
|
|
ENDIF
|
|
IF paramVars.bNativeTraceRunning
|
|
paramVars.bNativeTraceRunning = FALSE
|
|
ENDIF
|
|
|
|
// start the break
|
|
IF NOT paramVars.bNativeTraceBreakRunning
|
|
|
|
IF NOT paramVars.bNativeTraceBreakFirstInput
|
|
BREAK_ON_NATIVE_COMMAND(GET_CONTENTS_OF_TEXT_WIDGET(paramVars.nativeTraceTextWidgetID), FALSE)
|
|
ELSE
|
|
BREAK_ON_NATIVE_COMMAND(GET_CONTENTS_OF_TEXT_WIDGET(paramVars.nativeTraceTextWidgetID), TRUE)
|
|
paramVars.bNativeTraceBreakFirstRunning = TRUE
|
|
ENDIF
|
|
paramVars.bNativeTraceBreakRunning = TRUE
|
|
|
|
ELSE
|
|
// has the user change the option for breaking on first call
|
|
IF paramVars.bNativeTraceBreakFirstInput
|
|
IF NOT paramVars.bNativeTraceBreakFirstRunning
|
|
paramVars.bNativeTraceBreakRunning = FALSE
|
|
ENDIF
|
|
ELSE
|
|
IF paramVars.bNativeTraceBreakFirstRunning
|
|
paramVars.bNativeTraceBreakRunning = FALSE
|
|
paramVars.bNativeTraceBreakFirstRunning = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ELSE
|
|
IF paramVars.bNativeTraceBreakRunning
|
|
paramVars.bNativeTraceBreakRunning = FALSE
|
|
ENDIF
|
|
IF paramVars.bNativeTraceBreakFirstInput
|
|
|
|
IF paramVars.bNativeTraceBreakFirstRunning
|
|
paramVars.bNativeTraceBreakFirstRunning = FALSE
|
|
paramVars.bNativeTraceBreakFirstInput = FALSE
|
|
ELSE
|
|
paramVars.bNativeTraceBreakInput = TRUE
|
|
ENDIF
|
|
ELSE
|
|
IF paramVars.bNativeTraceBreakFirstRunning
|
|
paramVars.bNativeTraceBreakFirstRunning = FALSE
|
|
ENDIF
|
|
ENDIF
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
|
|
// *****************************************************************************************
|
|
// GAMEPLAY CAM RELATIVE PITCH AND HEADING
|
|
// *****************************************************************************************
|
|
|
|
PROC Create_Gameplay_Cam_Relative_Pitch_And_Heading_Widgets(structSharedDebugVars ¶mVars)
|
|
START_WIDGET_GROUP("Gameplay Cam Relative Pitch And Heading")
|
|
ADD_WIDGET_BOOL("Set Cam Heading And Pitch", paramVars.bSetGameplayCamRelativePitchAndHeading)
|
|
ADD_WIDGET_FLOAT_SLIDER("Relative Pitch: ", paramVars.fCamRelativePitch, -360.0, 360.0, 1.0)
|
|
ADD_WIDGET_FLOAT_SLIDER("Relative Heading: ", paramVars.fCamRelativeHeading, -360.0, 360.0, 1.0)
|
|
STOP_WIDGET_GROUP()
|
|
ENDPROC
|
|
|
|
PROC Maintain_Gameplay_Cam_Relative_Pitch_And_Heading_Widgets(structSharedDebugVars ¶mVars)
|
|
|
|
IF paramVars.bSetGameplayCamRelativePitchAndHeading
|
|
|
|
SET_GAMEPLAY_CAM_RELATIVE_PITCH(paramVars.fCamRelativePitch)
|
|
SET_GAMEPLAY_CAM_RELATIVE_HEADING(paramVars.fCamRelativeHeading)
|
|
|
|
paramVars.bSetGameplayCamRelativePitchAndHeading = FALSE
|
|
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
// ===========================================================================================================
|
|
|
|
/// PURPOSE:
|
|
/// Checks for any keyboard-activated debug commands common to both singleplayer and multiplayer.
|
|
PROC Maintain_Shared_Debug_Keypresses(SCRIPT_TIMER &stTimer)
|
|
|
|
Maintain_AltKeyK_Max_Special_Ability()
|
|
Maintain_KeyC_Write_Player_Location_Details_To_File()
|
|
Maintain_KeyL_Toggle_Locate_Outlines()
|
|
Maintain_KeyO_Toggle_Screen_Overlays()
|
|
Maintain_DpadDown_Check_For_Player_Car_Not_Upright()
|
|
Maintain_KeyF9_Toggle_Mission_Flow_Debug_Screen(stTimer)
|
|
Maintain_KeyLShiftMultiply_Force_Fade_In()
|
|
|
|
ENDPROC
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------------------------------------------
|
|
|
|
/// PURPOSE:
|
|
/// Creates for any widget-activated debug commands common to both singleplayer and multiplayer.
|
|
/// NOTES:
|
|
/// Also initialises the shared debug variables
|
|
PROC Create_Shared_Debug_Widgets(structSharedDebugVars ¶mVars)
|
|
|
|
Initialise_Shared_Debug_Variables(paramVars)
|
|
|
|
Create_Hash_Key_Generator_Widgets(paramVars)
|
|
Create_Vehicle_Recording_Widgets(paramVars)
|
|
Create_Vehicle_Colour_Widgets(paramVars)
|
|
Create_Vehicle_Mod_Widgets(paramVars)
|
|
Create_Vehicle_Performance_Widgets(paramVars)
|
|
Create_Generic_Debug_Widgets(paramVars)
|
|
Create_Test_SaveGame_Widgets(paramVars)
|
|
Create_Scripted_Cam_Editor_Widgets(paramVars)
|
|
Create_Ptfx_Tester_Widgets(paramVars)
|
|
Create_Object_Positioning_Widgets(paramVars)
|
|
Create_MinMax_Locate_Widgets(paramVars)
|
|
Create_Door_Opening_Widgets(paramVars)
|
|
Create_Radar_Map_Colours_Widgets(paramVars)
|
|
Create_Car_Damage_Widgets(paramVars)
|
|
Create_Vehicle_Extra_Widgets(paramVars)
|
|
Create_Cam_Offset_widgets(paramVars)
|
|
Create_Vehicle_Force_Widgets(paramVars)
|
|
Create_Native_Trace_Widget(paramVars)
|
|
Create_Game_Time_Date_Widget(paramVars)
|
|
Create_Gameplay_Cam_Relative_Pitch_And_Heading_Widgets(paramVars)
|
|
|
|
ADD_WIDGET_BOOL("Switch on script debug info", displayDebugDataInCommandWindow)
|
|
|
|
//ADD_WIDGET_BOOL("Use new code AI blip system", g_bUseCodeAIBlipSystem)
|
|
|
|
|
|
ENDPROC
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------------------------------------------
|
|
|
|
/// PURPOSE:
|
|
/// Checks for any widget-activated debug commands common to both singleplayer and multiplayer.
|
|
PROC Maintain_Shared_Debug_Widgets(structSharedDebugVars ¶mVars)
|
|
|
|
Maintain_Hash_Key_Generator_Widgets(paramVars)
|
|
Maintain_Vehicle_Recording_Widgets(paramVars)
|
|
Maintain_Vehicle_Colour_Widgets(paramVars)
|
|
Maintain_Vehicle_Mod_Widgets(paramVars)
|
|
Maintain_Vehicle_Performance_Widgets(paramVars)
|
|
Maintain_Generic_Debug_Widgets(paramVars)
|
|
Maintain_Test_SaveGame_Widgets(paramVars)
|
|
Maintain_Scripted_Cam_Editor_Widgets(paramVars)
|
|
Maintain_Ptfx_Tester_Widgets(paramVars)
|
|
Maintain_Object_Positioning_Widgets(paramVars)
|
|
Maintain_MinMax_Locate_Widgets(paramVars)
|
|
Maintain_Door_Opening_Widgets(paramVars)
|
|
Maintain_Radar_Map_Colours_Widgets(paramVars)
|
|
Maintain_Car_Damage_Widgets(paramVars)
|
|
Maintain_Vehicle_Extra_Widgets(paramVars)
|
|
Maintain_Cam_Offset_widgets(paramVars)
|
|
Maintain_Vehicle_Force_Widgets(paramVars)
|
|
Maintain_Native_Trace_Widgets(paramVars)
|
|
Maintain_Gameplay_Cam_Relative_Pitch_And_Heading_Widgets(paramVars)
|
|
|
|
ENDPROC
|
|
|
|
|
|
|
|
|
|
// ===========================================================================================================
|
|
|
|
/// PURPOSE:
|
|
/// Checks for any keyboard-activated debug commands common to both singleplayer and multiplayer.
|
|
PROC UPDATE_DEBUG_TIMESTAMP()
|
|
SET_BIT(g_iDebugTimestampBitset, 0)
|
|
ENDPROC
|
|
|
|
FUNC STRING GET_DEBUG_TIMESTAMP()
|
|
RETURN GET_STRING_FROM_STRING(g_tlDebugTimestamp, 0, GET_LENGTH_OF_LITERAL_STRING(g_tlDebugTimestamp))
|
|
ENDFUNC
|
|
|
|
PROC PRINT_NUMBER_OF_COMMANDS_EXECUTED_SINCE_LAST_CALL(STRING strName)
|
|
INT iThisNumCommandsExecuted = GET_NUMBER_OF_INSTRUCTIONS_EXECUTED()
|
|
IF (iThisNumCommandsExecuted < g_iCommandExecutedLastCall)
|
|
g_iCommandExecutedLastCall = 0
|
|
ENDIF
|
|
PRINTLN("COMMANDS_EXECUTED_SINCE_LAST_CALL - ", strName, " = ", iThisNumCommandsExecuted - g_iCommandExecutedLastCall, " total commands this frame = ", iThisNumCommandsExecuted)
|
|
g_iCommandExecutedLastCall = iThisNumCommandsExecuted
|
|
ENDPROC
|
|
|
|
PROC UPDATE_HIGHEST_NUMBER_OF_COMMANDS_EXECUTED_THIS_FRAME(INT &iCurrentHighest)
|
|
INT iThisNumCommandsExecuted = GET_NUMBER_OF_INSTRUCTIONS_EXECUTED()
|
|
IF (iThisNumCommandsExecuted > 1000000)
|
|
PRINTLN("over 1 million commands for ", GET_THIS_SCRIPT_NAME(), ".sc, total = ", iThisNumCommandsExecuted)
|
|
ENDIF
|
|
IF (iThisNumCommandsExecuted > iCurrentHighest)
|
|
PRINTLN("NEW max no of commands for ", GET_THIS_SCRIPT_NAME(), ".sc is ", iThisNumCommandsExecuted)
|
|
iCurrentHighest = iThisNumCommandsExecuted
|
|
ENDIF
|
|
ENDPROC
|
|
|
|
|
|
FUNC STRING DEBUG_GET_LEVEL_NAME(eLevelIndex level)
|
|
SWITCH level
|
|
CASE LEVEL_GTA5 RETURN "LEVEL_GTA5" BREAK
|
|
CASE LEVEL_TESTBED RETURN "LEVEL_TESTBED" BREAK
|
|
CASE LEVEL_VFX_TEST RETURN "LEVEL_VFX_TEST" BREAK
|
|
CASE LEVEL_NM_TEST RETURN "LEVEL_NM_TEST" BREAK
|
|
CASE LEVEL_NET_TEST RETURN "LEVEL_NET_TEST" BREAK
|
|
CASE LEVEL_ANIM_TEST RETURN "LEVEL_ANIM_TEST" BREAK
|
|
CASE LEVEL_CP_TESTBED RETURN "LEVEL_CP_TESTBED" BREAK
|
|
CASE LEVEL_TOOLS_TEST RETURN "LEVEL_TOOLS_TEST" BREAK
|
|
CASE LEVEL_WATERBED RETURN "LEVEL_WATERBED" BREAK
|
|
CASE LEVEL_GFX_TEST RETURN "LEVEL_GFX_TEST" BREAK
|
|
ENDSWITCH
|
|
|
|
RETURN "UNKNOWN LEVEL"
|
|
ENDFUNC
|
|
|
|
FUNC STRING GET_CAMERA_GRAPH_TYPE_NAME(CAMERA_GRAPH_TYPE eGraphType)
|
|
SWITCH eGraphType
|
|
CASE GRAPH_TYPE_LINEAR RETURN "GRAPH_TYPE_LINEAR"
|
|
CASE GRAPH_TYPE_SIN_ACCEL_DECEL RETURN "GRAPH_TYPE_SIN_ACCEL_DECEL"
|
|
CASE GRAPH_TYPE_ACCEL RETURN "GRAPH_TYPE_ACCEL"
|
|
CASE GRAPH_TYPE_DECEL RETURN "GRAPH_TYPE_DECEL"
|
|
CASE GRAPH_TYPE_SLOW_IN RETURN "GRAPH_TYPE_SLOW_IN"
|
|
CASE GRAPH_TYPE_SLOW_OUT RETURN "GRAPH_TYPE_SLOW_OUT"
|
|
CASE GRAPH_TYPE_SLOW_IN_OUT RETURN "GRAPH_TYPE_SLOW_IN_OUT"
|
|
CASE GRAPH_TYPE_VERY_SLOW_IN RETURN "GRAPH_TYPE_VERY_SLOW_IN"
|
|
CASE GRAPH_TYPE_VERY_SLOW_OUT RETURN "GRAPH_TYPE_VERY_SLOW_OUT"
|
|
CASE GRAPH_TYPE_VERY_SLOW_IN_SLOW_OUT RETURN "GRAPH_TYPE_VERY_SLOW_IN_SLOW_OUT"
|
|
CASE GRAPH_TYPE_SLOW_IN_VERY_SLOW_OUT RETURN "GRAPH_TYPE_SLOW_IN_VERY_SLOW_OUT"
|
|
CASE GRAPH_TYPE_VERY_SLOW_IN_VERY_SLOW_OUT RETURN "GRAPH_TYPE_V_SLOW_IN_V_SLOW_OUT"
|
|
CASE GRAPH_TYPE_EASE_IN RETURN "GRAPH_TYPE_EASE_IN"
|
|
CASE GRAPH_TYPE_EASE_OUT RETURN "GRAPH_TYPE_EASE_OUT"
|
|
CASE GRAPH_TYPE_QUADRATIC_EASE_IN RETURN "GRAPH_TYPE_QUADRATIC_EASE_IN"
|
|
CASE GRAPH_TYPE_QUADRATIC_EASE_OUT RETURN "GRAPH_TYPE_QUADRATIC_EASE_OUT"
|
|
CASE GRAPH_TYPE_QUADRATIC_EASE_IN_OUT RETURN "GRAPH_TYPE_QUADRATIC_EASE_IN_OUT"
|
|
CASE GRAPH_TYPE_CUBIC_EASE_IN RETURN "GRAPH_TYPE_CUBIC_EASE_IN"
|
|
CASE GRAPH_TYPE_CUBIC_EASE_OUT RETURN "GRAPH_TYPE_CUBIC_EASE_OUT"
|
|
CASE GRAPH_TYPE_CUBIC_EASE_IN_OUT RETURN "GRAPH_TYPE_CUBIC_EASE_IN_OUT"
|
|
CASE GRAPH_TYPE_QUARTIC_EASE_IN RETURN "GRAPH_TYPE_QUARTIC_EASE_IN"
|
|
CASE GRAPH_TYPE_QUARTIC_EASE_OUT RETURN "GRAPH_TYPE_QUARTIC_EASE_OUT"
|
|
CASE GRAPH_TYPE_QUARTIC_EASE_IN_OUT RETURN "GRAPH_TYPE_QUARTIC_EASE_IN_OUT"
|
|
CASE GRAPH_TYPE_QUINTIC_EASE_IN RETURN "GRAPH_TYPE_QUINTIC_EASE_IN"
|
|
CASE GRAPH_TYPE_QUINTIC_EASE_OUT RETURN "GRAPH_TYPE_QUINTIC_EASE_OUT"
|
|
CASE GRAPH_TYPE_QUINTIC_EASE_IN_OUT RETURN "GRAPH_TYPE_QUINTIC_EASE_IN_OUT"
|
|
CASE GRAPH_TYPE_CIRCULAR_EASE_IN RETURN "GRAPH_TYPE_CIRC_EASE_INTYPE_LINEAR"
|
|
CASE GRAPH_TYPE_CIRCULAR_EASE_OUT RETURN "GRAPH_TYPE_CIRC_EASE_OUT"
|
|
CASE GRAPH_TYPE_CIRCULAR_EASE_IN_OUT RETURN "GRAPH_TYPE_CIRC_EASE_IN_OUT"
|
|
ENDSWITCH
|
|
RETURN ""
|
|
ENDFUNC
|
|
|
|
|
|
// ##### --------------------------------------------------------------------------------------------------
|
|
// ##### Section Name: Debug Movers -----------------------------------------------------------------------
|
|
// ##### Description: Helper Functions for adding movers to debug so it can be dragged around the screen --
|
|
// ##### --------------------------------------------------------------------------------------------------
|
|
// ##### --------------------------------------------------------------------------------------------------
|
|
|
|
// Reuse this one, as we don't care.
|
|
CONST_INT ciDEBUG_ON_SCREEN_MOVERS_REUSABLE 0 // If you don't care that other debug might also use this.
|
|
|
|
// Debug.sc
|
|
CONST_INT ciDEBUG_ON_SCREEN_MOVERS_CONVERSATION 1
|
|
|
|
// MC DEBUG (start at 1
|
|
CONST_INT ciDEBUG_ON_SCREEN_MOVERS_SPAWN_GROUPS 1
|
|
CONST_INT ciDEBUG_ON_SCREEN_MOVERS_AGGRO_INDEXES 2
|
|
CONST_INT ciDEBUG_ON_SCREEN_MOVERS_CUSTOM_SPAWN_POINTS 3
|
|
CONST_INT ciDEBUG_ON_SCREEN_MOVERS_ENTITY_STATE 4
|
|
|
|
// MAX
|
|
CONST_INT ciDEBUG_ON_SCREEN_MOVERS_MAX 5
|
|
|
|
STRUCT DEBUG_MOVERS_STRUCT
|
|
FLOAT fDebugMoverMouseX[ciDEBUG_ON_SCREEN_MOVERS_MAX]
|
|
FLOAT fDebugMoverMouseY[ciDEBUG_ON_SCREEN_MOVERS_MAX]
|
|
INT iDebugMoverExtend = -1
|
|
ENDSTRUCT
|
|
|
|
FUNC BOOL IS_DEBUG_MOVERS_MOUSE_CLICK_PRESSED(MOUSE_BUTTON eMB)
|
|
|
|
// TODO - This is unreliable for some reason. Sometimes not detecting the press, including IS_MOUSE_BUTTON_PRESSED. Investigate a better way. Note: INPUT_CURSOR_ACCEPT does not work while in Debug Keyboard.
|
|
IF IS_MOUSE_BUTTON_PRESSED(eMB)
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
|
|
ENDFUNC
|
|
|
|
FUNC BOOL IS_DEBUG_MOVER_BEING_HOVERED_OVER(DEBUG_MOVERS_STRUCT &sDebugMoversStruct, INT iDebugMoverType, FLOAT fPosX, FLOAT fPosY, FLOAT fSizeX, FLOAT fSizeY, FLOAT &fXReturn, FLOAT &fYReturn)
|
|
|
|
FLOAT fMouseX = GET_CONTROL_NORMAL(FRONTEND_CONTROL, INPUT_CURSOR_X)
|
|
FLOAT fMouseY = GET_CONTROL_NORMAL(FRONTEND_CONTROL, INPUT_CURSOR_Y)
|
|
|
|
FLOAT fRectX_Max = fPosX + PICK_FLOAT(iDebugMoverType = sDebugMoversStruct.iDebugMoverExtend, 1.0, fSizeX/2)
|
|
FLOAT fRectY_Max = fPosY + PICK_FLOAT(iDebugMoverType = sDebugMoversStruct.iDebugMoverExtend, 1.0, fSizeY/2)
|
|
FLOAT fRectX_Min = fPosX - PICK_FLOAT(iDebugMoverType = sDebugMoversStruct.iDebugMoverExtend, 1.0, fSizeX/2)
|
|
FLOAT fRectY_Min = fPosY - PICK_FLOAT(iDebugMoverType = sDebugMoversStruct.iDebugMoverExtend, 1.0, fSizeY/2)
|
|
|
|
IF sDebugMoversStruct.iDebugMoverExtend = iDebugMoverType
|
|
sDebugMoversStruct.iDebugMoverExtend = -1
|
|
ENDIF
|
|
|
|
IF fMouseX >= fRectX_Min AND fMouseX <= fRectX_Max
|
|
AND fMouseY >= fRectY_Min AND fMouseY <= fRectY_Max
|
|
fXReturn = fMouseX
|
|
fYReturn = fMouseY
|
|
RETURN TRUE
|
|
ENDIF
|
|
|
|
RETURN FALSE
|
|
ENDFUNC
|
|
|
|
PROC PROCESS_DEBUG_MOVER_FOR_TYPE(DEBUG_MOVERS_STRUCT &sDebugMoversStruct, INT iDebugMoverType, FLOAT &fPosX, FLOAT &fPosY, FLOAT fSizeX, FLOAT fSizeY, BOOL bDrawWhenNotHovering = FALSE, BOOL bRectFromCorner = FALSE, BOOL bRectFromLeftCenter = FALSE)
|
|
|
|
IF iDebugMoverType < 0
|
|
OR iDebugMoverType > ciDEBUG_ON_SCREEN_MOVERS_MAX
|
|
EXIT
|
|
ENDIF
|
|
|
|
IF sDebugMoversStruct.fDebugMoverMouseX[iDebugMoverType] != 0.0
|
|
AND sDebugMoversStruct.fDebugMoverMouseY[iDebugMoverType] != 0.0
|
|
fPosX = sDebugMoversStruct.fDebugMoverMouseX[iDebugMoverType]
|
|
fPosY = sDebugMoversStruct.fDebugMoverMouseY[iDebugMoverType]
|
|
ENDIF
|
|
|
|
FLOAT fRectX, fRectY
|
|
IF bRectFromLeftCenter
|
|
fRectX = fPosX + fSizeX/2
|
|
fRectY = fPosY
|
|
ELIF bRectFromCorner
|
|
fRectX = fPosX + fSizeX/2
|
|
fRectY = fPosY + fSizeY/2
|
|
ELSE
|
|
fRectX = fPosX
|
|
fRectY = fPosY
|
|
ENDIF
|
|
|
|
FLOAT fMouseX, fMouseY
|
|
|
|
IF NOT IS_DEBUG_MOVER_BEING_HOVERED_OVER(sDebugMoversStruct, iDebugMoverType, fRectX, fRectY, fSizeX, fSizeY, fMouseX, fMouseY)
|
|
// Not Hovered
|
|
IF bDrawWhenNotHovering
|
|
DRAW_RECT(fRectX, fRectY, fSizeX, fSizeY, 0, 0, 0, 50)
|
|
ENDIF
|
|
IF iDebugMoverType = sDebugMoversStruct.iDebugMoverExtend
|
|
sDebugMoversStruct.iDebugMoverExtend = -1
|
|
ENDIF
|
|
|
|
EXIT
|
|
ENDIF
|
|
|
|
IF IS_DEBUG_MOVERS_MOUSE_CLICK_PRESSED(MB_LEFT_BTN)
|
|
// Pressed
|
|
DRAW_RECT(fRectX, fRectY, fSizeX, fSizeY, 0, 0, 0, 150)
|
|
|
|
// Mouse Cache
|
|
IF sDebugMoversStruct.iDebugMoverExtend = -1
|
|
sDebugMoversStruct.fDebugMoverMouseX[iDebugMoverType] = fMouseX - PICK_FLOAT(bRectFromCorner, fSizeX/2, 0.0)
|
|
sDebugMoversStruct.fDebugMoverMouseY[iDebugMoverType] = fMouseY - PICK_FLOAT(bRectFromCorner, fSizeY/2, 0.0)
|
|
sDebugMoversStruct.iDebugMoverExtend = iDebugMoverType
|
|
ENDIF
|
|
ELSE
|
|
// Hovered
|
|
DRAW_RECT(fRectX, fRectY, fSizeX, fSizeY, 0, 0, 0, 100)
|
|
IF iDebugMoverType = sDebugMoversStruct.iDebugMoverExtend
|
|
sDebugMoversStruct.iDebugMoverExtend = -1
|
|
ENDIF
|
|
ENDIF
|
|
|
|
ENDPROC
|
|
|
|
|