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, <>) 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, <>) DRAW_DEBUG_LINE(paramVars.vMinMaxCornerMin, <>) DRAW_DEBUG_LINE(paramVars.vMinMaxCornerMin, <>) DRAW_DEBUG_LINE(paramVars.vMinMaxCornerMax, <>) DRAW_DEBUG_LINE(paramVars.vMinMaxCornerMax, <>) DRAW_DEBUG_LINE(paramVars.vMinMaxCornerMax, <>) DRAW_DEBUG_LINE(<>, <>) DRAW_DEBUG_LINE(<>, <>) DRAW_DEBUG_LINE(<>, <>) DRAW_DEBUG_LINE(<>, <>) DRAW_DEBUG_LINE(<>, <>) DRAW_DEBUG_LINE(<>, <>) 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