//Compile out Title Update changes to header functions. //Must be before includes. //CONST_INT USE_TU_CHANGES 0 // Removed by Kenneth R. USING "rage_builtins.sch" USING "globals.sch" USING "commands_datafile.sch" USING "net_mission.sch" USING "net_transition_sessions.sch" #IF IS_DEBUG_BUILD USING "script_metrics_public.sch" #ENDIF #IF NOT IS_DEBUG_BUILD SCRIPT ENDSCRIPT #ENDIF #IF IS_DEBUG_BUILD BOOL bRender BOOL bRenderNumbers = FALSE BOOL bRenderPeaks = TRUE BOOL bUploadToCloud BOOL bUploadingToCloud //BOOL bSuccessfulUploadToCloud BOOL bDownloadFromCloud //BOOL bDownloadingFromCloud //BOOL bSuccessfulDowloadFromCloud BOOL bEnableCloudUploading BOOL bTurnOnFileWriting = TRUE FLOAT fWindowX = 0.103 FLOAT fWindowY = 0.08 FLOAT fWindowMinH = 0.021 FLOAT fWindowW = 0.749 FLOAT fTextScale = 0.267 FLOAT fTextIndentX = 0.005 FLOAT fTextIndentY = -0.004 FLOAT fLineSpacerY = 0.015 FLOAT fNoPlayersIntX = 0.086 FLOAT fNoBotsStringX = 0.12 FLOAT fNoBotsIntX = 0.185 FLOAT fBarWidthPerMS = 0.03 FLOAT fBarHeight = 0.01 FLOAT fTimeBarX = 0.131 FLOAT fCurrentTimeX = 0.089 FLOAT fAverageTimeX = 0.078 FLOAT fPeakTimeX = 0.106 TEXT_LABEL_63 sFileName TEXT_LABEL_63 sFilePath TEXT_LABEL_63 ScriptName TEXT_LABEL_63 ExeVersion TEXT_LABEL_63 ScriptVersion //TEXT_LABEL_63 CloudFilename //TEXT_LABEL_63 CloudPathName STRING strVersionName INT iNoPlayers INT iNoBots INT iPlayerNumber INT iPlayerTeam INT iRecordingInterval = 11000 INT iTotal INT iTotalNoPlayers INT iTotalNoBots INT iTotalPlayerNumber INT iTotalPlayerTeam INT iTotalNetworkTime INT iTotalThreadDuration // for recording BOOL bStartRecording BOOL bRecordAllThreads = TRUE BOOL bRecordSpecificThreadOnly = FALSE BOOL bRenderStoredPeaks TEXT_WIDGET_ID TextWidget STRING SpecificScript DATAFILE_ARRAY ScriptInfoArray DATAFILE_DICT DataFileDict DATAFILE_DICT GeneralInfoDict FLOAT fCurrentTime FLOAT fAverageTime FLOAT fPeakTime FLOAT fTotalCurrentTime2 FLOAT fTotalAverageTime2 FLOAT fTotalPeakTime2 FLOAT fTotalCurrentTime FLOAT fTotalAverageTime FLOAT fTotalPeakTime CONST_INT MAX_NO_THREADS 64 FLOAT fStoredPeakTime[MAX_NO_THREADS] INT iTotalThreadsLastFrame FUNC BOOL SHOULD_IGNORE_THREAD(THREADID Thread_ID) IF (bRecordAllThreads) IF ARE_STRINGS_EQUAL(GET_NAME_OF_SCRIPT_WITH_THIS_ID(Thread_ID), "net_bot_brain") OR (Thread_ID = GET_ID_OF_THIS_THREAD()) RETURN(TRUE) ENDIF ELSE IF ARE_STRINGS_EQUAL(GET_NAME_OF_SCRIPT_WITH_THIS_ID(Thread_ID), SpecificScript) RETURN(FALSE) ELSE RETURN(TRUE) ENDIF ENDIF RETURN(FALSE) ENDFUNC FUNC INT GET_NUMBER_OF_BOTS() IF NETWORK_IS_GAME_IN_PROGRESS() RETURN(NETWORK_BOT_GET_NUMBER_OF_ACTIVE_BOTS()) ENDIF RETURN(0) ENDFUNC FUNC INT GET_NUMBER_OF_REAL_PLAYERS() IF NETWORK_IS_GAME_IN_PROGRESS() INT i INT iCount PLAYER_INDEX PlayerID REPEAT NUM_NETWORK_PLAYERS i PlayerID = INT_TO_NATIVE(PLAYER_INDEX, i) IF NETWORK_IS_PLAYER_ACTIVE(playerID) iCount += 1 ENDIF ENDREPEAT iCount -= NETWORK_BOT_GET_NUMBER_OF_ACTIVE_BOTS() RETURN(iCount) ENDIF RETURN(1) ENDFUNC PROC PRINT_METRIC_STRING(STRING sString) SAVE_STRING_TO_NAMED_DEBUG_FILE(sString, sFilePath, sFileName) PRINTSTRING(sString) ENDPROC PROC PRINT_METRIC_NEWLINE() SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(sFilePath, sFileName) PRINTNL() ENDPROC PROC PRINT_METRIC_INT(INT iInt) SAVE_INT_TO_NAMED_DEBUG_FILE(iInt, sFilePath, sFileName) PRINTINT(iInt) ENDPROC PROC PRINT_METRIC_FLOAT(FLOAT fFloat) SAVE_FLOAT_TO_NAMED_DEBUG_FILE(fFloat, sFilePath, sFileName) PRINTFLOAT(fFloat) ENDPROC PROC STORE_GENERAL_DETAILS() // IF IS_DEBUG_KEY_JUST_PRESSED(KEY_1,KEYBOARD_MODIFIER_SHIFT, "Dump script metric data to file") // ExeVersion = "Beta" // ENDIF // IF IS_DEBUG_KEY_JUST_PRESSED(KEY_2,KEYBOARD_MODIFIER_SHIFT, "Dump script metric data to file") // ExeVersion = "BankRel" // ENDIF // IF IS_DEBUG_KEY_JUST_PRESSED(KEY_3,KEYBOARD_MODIFIER_SHIFT, "Dump script metric data to file") // ExeVersion = "Release" // ENDIF strVersionName = GET_GAME_VERSION_NAME() iNoPlayers = GET_NUMBER_OF_REAL_PLAYERS() iNoBots = GET_NUMBER_OF_BOTS() iPlayerNumber = NATIVE_TO_INT(GET_PLAYER_INDEX()) IF NETWORK_IS_GAME_IN_PROGRESS() iPlayerTeam = GET_PLAYER_TEAM(GET_PLAYER_INDEX()) ELSE iPlayerTeam = -1 ENDIF ScriptVersion = "Debug" ENDPROC PROC GENERATE_FILE_NAME() // generate the file name sFileName = "SM_" sFileName += strVersionName sFileName += "_" sFileName += iNoPlayers sFileName += "_" sFileName += iNoBots sFileName += "_" sFileName += ExeVersion sFileName += "_" sFileName += GET_REAL_WORLD_TIME() sFileName += ".txt" ENDPROC PROC PRINT_TOTAL_METRIC_DETAILS() INT iAvNoPlayer = ROUND(TO_FLOAT(iTotalNoPlayers) / TO_FLOAT(iTotal)) INT iAvNoBots = ROUND(TO_FLOAT(iTotalNoBots) / TO_FLOAT(iTotal)) INT iAvPlayerNumber = ROUND(TO_FLOAT(iTotalPlayerNumber) / TO_FLOAT(iTotal)) INT iAvPlayerTeam = ROUND(TO_FLOAT(iTotalPlayerTeam) / TO_FLOAT(iTotal)) INT iAvNetworkTime = ROUND(TO_FLOAT(iTotalNetworkTime) / TO_FLOAT(iTotal)) INT iAvThreadDuration = ROUND(TO_FLOAT(iTotalThreadDuration) / TO_FLOAT(iTotal)) TEXT_LABEL_63 strNetworkTime strNetworkTime = "NetworkTime:" strNetworkTime += iAvNetworkTime strNetworkTime += ";" TEXT_LABEL_63 strGeneralInfo strGeneralInfo = "V:" strGeneralInfo += strVersionName strGeneralInfo += ";Plyrs:" strGeneralInfo += iAvNoPlayer strGeneralInfo += ";Bots:" strGeneralInfo += iAvNoBots strGeneralInfo += ";Exe:" strGeneralInfo += ExeVersion strGeneralInfo += ";SV:" strGeneralInfo += ScriptVersion strGeneralInfo += ";" TEXT_LABEL_63 strPlayerInfo strPlayerInfo = "PID:" strPlayerInfo += iAvPlayerNumber strPlayerInfo += ";Team:" strPlayerInfo += iAvPlayerTeam strPlayerInfo += ";" TEXT_LABEL_63 strScriptInfo strScriptInfo = "Script:" strScriptInfo += "TOTAL" strScriptInfo += ";" strScriptInfo += "Host:0;" TEXT_LABEL_63 strDuration strDuration = "Duration:" strDuration += iAvThreadDuration strDuration += ";" CPRINTLN(DEBUG_METRIC_DATA, "Writing TOTAL script metrics...") // write to external file IF (bTurnOnFileWriting) SAVE_STRING_TO_NAMED_DEBUG_FILE(strNetworkTime, DebugFilePath, DebugFileName) SAVE_STRING_TO_NAMED_DEBUG_FILE(strGeneralInfo, DebugFilePath, DebugFileName) SAVE_STRING_TO_NAMED_DEBUG_FILE(strPlayerInfo, DebugFilePath, DebugFileName) SAVE_STRING_TO_NAMED_DEBUG_FILE(strScriptInfo, DebugFilePath, DebugFileName) SAVE_STRING_TO_NAMED_DEBUG_FILE(strDuration, DebugFilePath, DebugFileName) SAVE_STRING_TO_NAMED_DEBUG_FILE("Current:", DebugFilePath, DebugFileName) SAVE_FLOAT_TO_NAMED_DEBUG_FILE(fTotalCurrentTime2, DebugFilePath, DebugFileName) SAVE_STRING_TO_NAMED_DEBUG_FILE(";Average:", DebugFilePath, DebugFileName) SAVE_FLOAT_TO_NAMED_DEBUG_FILE(fTotalAverageTime2, DebugFilePath, DebugFileName) SAVE_STRING_TO_NAMED_DEBUG_FILE(";Peak:", DebugFilePath, DebugFileName) SAVE_FLOAT_TO_NAMED_DEBUG_FILE(fTotalPeakTime2, DebugFilePath, DebugFileName) SAVE_STRING_TO_NAMED_DEBUG_FILE(";", DebugFilePath, DebugFileName) SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(DebugFilePath, DebugFileName) ENDIF ENDPROC ENUM SCRIPT_METRIC_FLAGS SMF_NULL, SMF_ON_MISSION, SMF_OFF_MISSION, SMF_DM, SMF_RACE, SMF_MISSION ENDENUM PROC PRINT_METRIC_DETAILS_FOR_THREAD(THREADID Thread_ID, SCRIPT_METRIC_FLAGS MetricFlag=SMF_NULL) INT iNetworkTime = NATIVE_TO_INT(GET_NETWORK_TIME()) TEXT_LABEL_63 strNetworkTime strNetworkTime = "NetworkTime:" strNetworkTime += iNetworkTime strNetworkTime += ";" TEXT_LABEL_63 strGeneralInfo strGeneralInfo = "V:" strGeneralInfo += strVersionName strGeneralInfo += ";Plyrs:" strGeneralInfo += iNoPlayers strGeneralInfo += ";Bots:" strGeneralInfo += iNoBots strGeneralInfo += ";Exe:" strGeneralInfo += ExeVersion strGeneralInfo += ";SV:" strGeneralInfo += ScriptVersion strGeneralInfo += ";" TEXT_LABEL_63 strPlayerInfo strPlayerInfo = "PID:" strPlayerInfo += iPlayerNumber strPlayerInfo += ";Team:" strPlayerInfo += iPlayerTeam strPlayerInfo += ";" TEXT_LABEL_63 strScriptInfo strScriptInfo = "Script:" IF (MetricFlag = SMF_NULL) strScriptInfo += GET_NAME_OF_SCRIPT_WITH_THIS_ID(Thread_ID) ELSE IF NETWORK_IS_GAME_IN_PROGRESS() SWITCH MetricFlag CASE SMF_DM strScriptInfo += "UGC_D " strScriptInfo += GlobalplayerBD_MissionName[NATIVE_TO_INT(PLAYER_ID())].tl63MissionName BREAK CASE SMF_RACE strScriptInfo += "UGC_R " strScriptInfo += GlobalplayerBD_MissionName[NATIVE_TO_INT(PLAYER_ID())].tl63MissionName BREAK CASE SMF_MISSION strScriptInfo += "UGC_M " strScriptInfo += GlobalplayerBD_MissionName[NATIVE_TO_INT(PLAYER_ID())].tl63MissionName BREAK CASE SMF_ON_MISSION strScriptInfo += "ON_MISS " strScriptInfo += GET_NAME_OF_SCRIPT_WITH_THIS_ID(Thread_ID) BREAK CASE SMF_OFF_MISSION strScriptInfo += "OFF_MISS " strScriptInfo += GET_NAME_OF_SCRIPT_WITH_THIS_ID(Thread_ID) BREAK ENDSWITCH ENDIF ENDIF strScriptInfo += ";" IF AM_I_HOST_OF_THREAD(Thread_ID) strScriptInfo += "Host:1;" ELSE strScriptInfo += "Host:0;" ENDIF INT iThreadDuration = GET_THREAD_DURATION(Thread_ID) TEXT_LABEL_63 strDuration strDuration = "Duration:" strDuration += iThreadDuration strDuration += ";" fCurrentTime = METRICS_GET_UPDATE_TIME_FOR_THREAD(Thread_ID) fAverageTime = METRICS_GET_AVERAGE_UPDATE_TIME_FOR_THREAD(Thread_ID) fPeakTime = METRICS_GET_PEAK_UPDATE_TIME_FOR_THREAD(Thread_ID) CPRINTLN(DEBUG_METRIC_DATA, "Writing script metrics...") // write to external file IF (bTurnOnFileWriting) SAVE_STRING_TO_NAMED_DEBUG_FILE(strNetworkTime, DebugFilePath, DebugFileName) SAVE_STRING_TO_NAMED_DEBUG_FILE(strGeneralInfo, DebugFilePath, DebugFileName) SAVE_STRING_TO_NAMED_DEBUG_FILE(strPlayerInfo, DebugFilePath, DebugFileName) SAVE_STRING_TO_NAMED_DEBUG_FILE(strScriptInfo, DebugFilePath, DebugFileName) SAVE_STRING_TO_NAMED_DEBUG_FILE(strDuration, DebugFilePath, DebugFileName) SAVE_STRING_TO_NAMED_DEBUG_FILE("Current:", DebugFilePath, DebugFileName) SAVE_FLOAT_TO_NAMED_DEBUG_FILE(fCurrentTime, DebugFilePath, DebugFileName) SAVE_STRING_TO_NAMED_DEBUG_FILE(";Average:", DebugFilePath, DebugFileName) SAVE_FLOAT_TO_NAMED_DEBUG_FILE(fAverageTime, DebugFilePath, DebugFileName) SAVE_STRING_TO_NAMED_DEBUG_FILE(";Peak:", DebugFilePath, DebugFileName) SAVE_FLOAT_TO_NAMED_DEBUG_FILE(fPeakTime, DebugFilePath, DebugFileName) SAVE_STRING_TO_NAMED_DEBUG_FILE(";", DebugFilePath, DebugFileName) SAVE_NEWLINE_TO_NAMED_DEBUG_FILE(DebugFilePath, DebugFileName) ENDIF iTotal += 1 iTotalNoPlayers += iNoPlayers iTotalNoBots += iNoBots iTotalPlayerNumber += iPlayerNumber iTotalPlayerTeam += iPlayerTeam iTotalNetworkTime += iNetworkTime iTotalThreadDuration += iThreadDuration fTotalCurrentTime2 += fCurrentTime fTotalAverageTime2 += fAverageTime fTotalPeakTime2 += fPeakTime CPRINTLN(DEBUG_METRIC_DATA, "Finished writing script metrics") ENDPROC PROC PRINT_ALL_METRIC_INFO_TO_CHANNEL() STORE_GENERAL_DETAILS() // write general details IF (bEnableCloudUploading) IF NOT (bUploadToCloud) DATAFILE_CREATE() DataFileDict = DATAFILE_GET_FILE_DICT() GeneralInfoDict = DATADICT_CREATE_DICT(DataFileDict, "GeneralInfo") DATADICT_SET_STRING(GeneralInfoDict, "V", strVersionName) DATADICT_SET_INT(GeneralInfoDict, "Plyrs", iNoPlayers) DATADICT_SET_INT(GeneralInfoDict, "Bots", iNoBots) DATADICT_SET_STRING(GeneralInfoDict, "Exe", ExeVersion) DATADICT_SET_STRING(GeneralInfoDict, "SV", ScriptVersion) DATADICT_SET_INT(GeneralInfoDict, "PID", iPlayerNumber) DATADICT_SET_INT(GeneralInfoDict, "Team", iPlayerTeam) VECTOR vCoords IF DOES_ENTITY_EXIST(PLAYER_PED_ID()) vCoords = GET_ENTITY_COORDS(PLAYER_PED_ID(), FALSE) ENDIF DATADICT_SET_FLOAT(GeneralInfoDict, "PlayerX", vCoords.x) DATADICT_SET_FLOAT(GeneralInfoDict, "PlayerY", vCoords.y) DATADICT_SET_FLOAT(GeneralInfoDict, "PlayerZ", vCoords.z) IF NETWORK_IS_GAME_IN_PROGRESS() DATADICT_SET_STRING(GeneralInfoDict, "GameTime", GET_TIME_AS_STRING(GET_NETWORK_TIME())) ELSE DATADICT_SET_INT(GeneralInfoDict, "GameTime", GET_GAME_TIMER()) ENDIF ScriptInfoArray = DATADICT_CREATE_ARRAY(DataFileDict, "ScriptThreadTimes") ENDIF ENDIF // reset totals iTotal = 0 iTotalNoPlayers = 0 iTotalNoBots = 0 iTotalPlayerNumber = 0 iTotalPlayerTeam = 0 iTotalNetworkTime = 0 iTotalThreadDuration = 0 fTotalCurrentTime2 = 0.0 fTotalAverageTime2 = 0.0 fTotalPeakTime2 = 0.0 THREADID Thread_ID STRING strScriptName SCRIPT_THREAD_ITERATOR_RESET() Thread_ID = SCRIPT_THREAD_ITERATOR_GET_NEXT_THREAD_ID() WHILE IS_THREAD_ACTIVE(Thread_ID) IF NOT SHOULD_IGNORE_THREAD(Thread_ID) strScriptName = GET_NAME_OF_SCRIPT_WITH_THIS_ID(Thread_ID) // is player on mission and this is the mission script thread IF NETWORK_IS_GAME_IN_PROGRESS() PRINT_METRIC_DETAILS_FOR_THREAD(Thread_ID) // main lauch script is recorded for on and off mission IF (ARE_STRINGS_EQUAL(strScriptName, FREEMODE_SCRIPT()) OR ARE_STRINGS_EQUAL(strScriptName, "fmmc_launcher")) IF IS_PLAYER_ON_ANY_FM_MISSION(PLAYER_ID(), FALSE) PRINT_METRIC_DETAILS_FOR_THREAD(Thread_ID, SMF_ON_MISSION) ELSE PRINT_METRIC_DETAILS_FOR_THREAD(Thread_ID, SMF_OFF_MISSION) ENDIF ENDIF // ugc controller scripts get recorded with their content mission names IF IS_PLAYER_ON_ANY_FM_MISSION(PLAYER_ID(), FALSE) IF ARE_STRINGS_EQUAL(strScriptName, "fm_deathmatch_controler") PRINT_METRIC_DETAILS_FOR_THREAD(Thread_ID, SMF_DM) ELIF ARE_STRINGS_EQUAL(strScriptName, "fm_race_controler") PRINT_METRIC_DETAILS_FOR_THREAD(Thread_ID, SMF_RACE) ELIF ARE_STRINGS_EQUAL(strScriptName, GET_FM_MISSION_CONTROLLER_SCRIPT_NAME()) PRINT_METRIC_DETAILS_FOR_THREAD(Thread_ID, SMF_MISSION) ENDIF ENDIF ELSE PRINT_METRIC_DETAILS_FOR_THREAD(Thread_ID) ENDIF IF (bEnableCloudUploading) IF NOT (bUploadToCloud) DATAARRAY_ADD_STRING(ScriptInfoArray, GET_NAME_OF_SCRIPT_WITH_THIS_ID(Thread_ID)) DATAARRAY_ADD_FLOAT(ScriptInfoArray, fCurrentTime) DATAARRAY_ADD_FLOAT(ScriptInfoArray, fAverageTime) DATAARRAY_ADD_FLOAT(ScriptInfoArray, fPeakTime) ENDIF ENDIF ENDIF Thread_ID = SCRIPT_THREAD_ITERATOR_GET_NEXT_THREAD_ID() ENDWHILE PRINT_TOTAL_METRIC_DETAILS() // IF (bEnableCloudUploading) // IF NOT (bUploadToCloud) // CloudFilename = CloudPathName // CloudFilename += "SM_" // CloudFilename += GET_GAME_TIMER() // CloudFilename +=".json" // bUploadToCloud = TRUE // ENDIF // ENDIF ENDPROC SCRIPT #IF IS_DEBUG_BUILD PRINTSTRING("script_metrics.sc started...") PRINTNL() #ENDIF // This script needs to cleanup only when the game runs the MAGDEMO IF HAS_FORCE_CLEANUP_OCCURRED(FORCE_CLEANUP_FLAG_MAGDEMO) #IF IS_DEBUG_BUILD PRINTSTRING("...script_metrics.sc has been forced to cleanup (MAGDEMO)") PRINTNL() #ENDIF TERMINATE_THIS_THREAD() ENDIF //INT iCount INT iRowCount INT iNumberOfRows THREADID Thread_ID FLOAT fWindowH FLOAT fThisTime FLOAT fThisWidth FLOAT fThisPeakTime FLOAT fTextX FLOAT fTextY FLOAT fThisHeight INT i INT iThreadCount INIT_THREAD_METRIC_RECORDINGS() NETWORK_SET_SCRIPT_IS_SAFE_FOR_NETWORK_GAME() START_WIDGET_GROUP("Script Metrics") ADD_WIDGET_INT_SLIDER("Recording Interval", iRecordingInterval, 0 , HIGHEST_INT, 1) ADD_WIDGET_BOOL("Record All Threads", bRecordAllThreads) ADD_WIDGET_BOOL("Record Specific Script", bRecordSpecificThreadOnly) TextWidget = ADD_TEXT_WIDGET("Specific script to record") ADD_WIDGET_BOOL("Start / Stop Recording", bStartRecording) ADD_WIDGET_BOOL("bUploadingToCloud", bUploadingToCloud) ADD_WIDGET_BOOL("bDownloadFromCloud", bDownloadFromCloud) // ADD_WIDGET_BOOL("bEnableCloudUploading", bEnableCloudUploading) START_WIDGET_GROUP("Debug") ADD_WIDGET_BOOL("bRender", bRender) ADD_WIDGET_BOOL("bRenderNumbers", bRenderNumbers) ADD_WIDGET_BOOL("bRenderPeaks", bRenderPeaks) ADD_WIDGET_BOOL("bRenderStoredPeaks", bRenderStoredPeaks) ADD_WIDGET_FLOAT_SLIDER("fWindowX", fWindowX, -1.0, 1.0, 0.001) ADD_WIDGET_FLOAT_SLIDER("fWindowY", fWindowY, -1.0, 1.0, 0.001) ADD_WIDGET_FLOAT_SLIDER("fWindowMinH", fWindowMinH, -1.0, 1.0, 0.001) ADD_WIDGET_FLOAT_SLIDER("fWindowW", fWindowW, -1.0, 1.0, 0.001) ADD_WIDGET_FLOAT_SLIDER("fTextScale", fTextScale, -1.0, 1.0, 0.001) ADD_WIDGET_FLOAT_SLIDER("fTextIndentX", fTextIndentX, -1.0, 1.0, 0.001) ADD_WIDGET_FLOAT_SLIDER("fTextIndentY", fTextIndentY, -1.0, 1.0, 0.001) ADD_WIDGET_FLOAT_SLIDER("fLineSpacerY", fLineSpacerY, -1.0, 1.0, 0.001) ADD_WIDGET_FLOAT_SLIDER("fNoPlayersIntX", fNoPlayersIntX, -1.0, 1.0, 0.001) ADD_WIDGET_FLOAT_SLIDER("fNoBotsStringX", fNoBotsStringX, -1.0, 1.0, 0.001) ADD_WIDGET_FLOAT_SLIDER("fNoBotsIntX", fNoBotsIntX, -1.0, 1.0, 0.001) ADD_WIDGET_FLOAT_SLIDER("fBarWidthPerMS", fBarWidthPerMS, -1.0, 1.0, 0.001) ADD_WIDGET_FLOAT_SLIDER("fBarHeight", fBarHeight, -1.0, 1.0, 0.001) ADD_WIDGET_FLOAT_SLIDER("fTimeBarX", fTimeBarX, -1.0, 1.0, 0.001) ADD_WIDGET_FLOAT_SLIDER("fCurrentTimeX", fCurrentTimeX, -1.0, 1.0, 0.001) ADD_WIDGET_FLOAT_SLIDER("fAverageTimeX", fAverageTimeX, -1.0, 1.0, 0.001) ADD_WIDGET_FLOAT_SLIDER("fPeakTimeX", fPeakTimeX, -1.0, 1.0, 0.001) ADD_WIDGET_BOOL("bStartRecording", bStartRecording) ADD_WIDGET_BOOL("b_ScriptMetricsAreRecording", b_ScriptMetricsAreRecording) ADD_WIDGET_BOOL("bTurnOnFileWriting", bTurnOnFileWriting) STOP_WIDGET_GROUP() STOP_WIDGET_GROUP() // CloudPathName = "share/gta5/script_metrics/" // CloudPathName += GET_GAME_VERSION_NAME() // CloudPathName += "_" // CloudPathName += GET_GAME_TIMER() // CloudPathName += "/" WHILE (TRUE) // record a specific script only IF (bRecordSpecificThreadOnly) bRecordAllThreads = FALSE SpecificScript = GET_CONTENTS_OF_TEXT_WIDGET(TextWidget) bRecordSpecificThreadOnly = FALSE ENDIF // wait to be switched on IF IS_DEBUG_KEY_JUST_PRESSED(KEY_F12, KEYBOARD_MODIFIER_NONE, "Script Metrics") IF (bRender) bRender = FALSE ELSE bRender = TRUE ENDIF ENDIF // start recording IF IS_DEBUG_KEY_JUST_PRESSED(KEY_5,KEYBOARD_MODIFIER_SHIFT, "Start / Stop Recording Script Metrics") IF NOT NETWORK_IS_GAME_IN_PROGRESS() IF NOT (bStartRecording) bStartRecording = TRUE ELSE bStartRecording = FALSE PRINTSTRING("[SCRIPT METRICS] bStartRecording = FALSE, network game not in progress after KEY_5 press ") PRINTNL() ENDIF ELSE IF (b_ScriptMetricsAreRecording) BROADCAST_GENERAL_EVENT(GENERAL_EVENT_TYPE_STOP_RECORDING_METRICS, ALL_PLAYERS()) ELSE BROADCAST_GENERAL_EVENT(GENERAL_EVENT_TYPE_START_RECORDING_METRICS, ALL_PLAYERS()) ENDIF ENDIF ENDIF // render screen IF (bRender) fWindowH = TO_FLOAT(iNumberOfRows) * fLineSpacerY fWindowH += fWindowMinH fTextX = fWindowX + fTextIndentX fTextY = fWindowY + (fWindowMinH * 0.5) + fTextIndentY // back ground DRAW_RECT_FROM_CORNER(fWindowX, fWindowY , fWindowW, fWindowH, 0, 0, 0, 128) // title iRowCount = 0 SET_TEXT_SCALE(0.0000, fTextScale) SET_TEXT_COLOUR(128,128,128, 255) DISPLAY_TEXT_WITH_PLAYER_NAME(fTextX, fTextY + (iRowCount * fLineSpacerY), "STRING", "SCRIPT METRICS", HUD_COLOUR_GREY) iRowCount += 1 // Info SET_TEXT_SCALE(0.0000, fTextScale) SET_TEXT_COLOUR(128,128,128, 255) DISPLAY_TEXT_WITH_PLAYER_NAME(fTextX, fTextY + (iRowCount * fLineSpacerY), "STRING", "Number of Players: ", HUD_COLOUR_GREY) SET_TEXT_SCALE(0.0000, fTextScale) SET_TEXT_COLOUR(128,128,128, 255) DISPLAY_TEXT_WITH_NUMBER(fTextX + fNoPlayersIntX, fTextY + (iRowCount * fLineSpacerY), "NUMBER", GET_NUMBER_OF_REAL_PLAYERS()) SET_TEXT_SCALE(0.0000, fTextScale) SET_TEXT_COLOUR(128,128,128, 255) DISPLAY_TEXT_WITH_PLAYER_NAME(fTextX + fNoBotsStringX, fTextY + (iRowCount * fLineSpacerY), "STRING", "Number of Bots: ", HUD_COLOUR_GREY) SET_TEXT_SCALE(0.0000, fTextScale) SET_TEXT_COLOUR(128,128,128, 255) DISPLAY_TEXT_WITH_NUMBER(fTextX + fNoBotsIntX, fTextY + (iRowCount * fLineSpacerY), "NUMBER", GET_NUMBER_OF_BOTS()) iRowCount += 1 // draw time bars fThisHeight = ((iNumberOfRows - 2) * fLineSpacerY) SET_TEXT_SCALE(0.0000, fTextScale) SET_TEXT_COLOUR(128,128,128, 64) DISPLAY_TEXT_WITH_PLAYER_NAME(fTextX + fTimeBarX + (fBarWidthPerMS * -0.5), fTextY + ((iNumberOfRows+1)*fLineSpacerY), "STRING", "ms", HUD_COLOUR_GREY) REPEAT 21 i SET_TEXT_SCALE(0.0000, fTextScale) SET_TEXT_COLOUR(128,128,128, 128) DISPLAY_TEXT_WITH_NUMBER(fTextX + fTimeBarX + (fBarWidthPerMS * TO_FLOAT(i)), fTextY + ((iNumberOfRows+1)*fLineSpacerY), "NUMBER", i) DRAW_RECT_FROM_CORNER(fTextX + fTimeBarX + (fBarWidthPerMS * TO_FLOAT(i)), fTextY + (2*fLineSpacerY) , 0.001, fThisHeight, 128, 128, 128, 64) ENDREPEAT // each script fTotalCurrentTime = 0.0 fTotalAverageTime = 0.0 iThreadCount = 0 // iterate through each script SCRIPT_THREAD_ITERATOR_RESET() Thread_ID = SCRIPT_THREAD_ITERATOR_GET_NEXT_THREAD_ID() WHILE IS_THREAD_ACTIVE(Thread_ID) IF NOT SHOULD_IGNORE_THREAD(Thread_ID) // thread name ScriptName = GET_NAME_OF_SCRIPT_WITH_THIS_ID(Thread_ID) SET_TEXT_SCALE(0.0000, fTextScale) SET_TEXT_COLOUR(128,128,128, 255) DISPLAY_TEXT_WITH_PLAYER_NAME(fTextX, fTextY + (iRowCount * fLineSpacerY), "STRING", ScriptName, HUD_COLOUR_GREY) // current time - bar fThisTime = METRICS_GET_UPDATE_TIME_FOR_THREAD(Thread_ID) fTotalCurrentTime += fThisTime fThisWidth = fThisTime * fBarWidthPerMS DRAW_RECT_FROM_CORNER(fTextX + fTimeBarX, fTextY + (iRowCount * fLineSpacerY) + (fBarHeight * 0.5), fThisWidth, fBarHeight, 255, 216, 0, 255) // average time SET_TEXT_SCALE(0.0000, fTextScale) SET_TEXT_COLOUR(255, 255, 0, 255) fThisTime = METRICS_GET_AVERAGE_UPDATE_TIME_FOR_THREAD(Thread_ID) fTotalAverageTime += fThisTime IF (bRenderNumbers) DISPLAY_TEXT_WITH_FLOAT(fTextX + fAverageTimeX, fTextY + (iRowCount * fLineSpacerY), "NUMBER", fThisTime, 2) ENDIF // Peak time fThisPeakTime = METRICS_GET_PEAK_UPDATE_TIME_FOR_THREAD(Thread_ID) fThisWidth = fThisPeakTime * fBarWidthPerMS SET_TEXT_SCALE(0.0000, fTextScale) IF ((fThisPeakTime - fThisTime) > 1.0) SET_TEXT_COLOUR(255, 0, 0, 255) DRAW_RECT_FROM_CORNER(fTextX + fTimeBarX + fThisWidth, fTextY + (iRowCount * fLineSpacerY) + (fBarHeight * 0.5), 0.001, fBarHeight, 255, 0, 0, 255) IF (bRenderPeaks) DISPLAY_TEXT_WITH_FLOAT(fTextX + fPeakTimeX , fTextY + (iRowCount * fLineSpacerY), "NUMBER", fThisPeakTime, 2) ENDIF ELSE SET_TEXT_COLOUR(255, 106, 0, 255) DRAW_RECT_FROM_CORNER(fTextX + fTimeBarX + fThisWidth, fTextY + (iRowCount * fLineSpacerY) + (fBarHeight * 0.5), 0.001, fBarHeight, 255, 106, 0, 255) IF (bRenderNumbers) //DISPLAY_TEXT_WITH_FLOAT(fTextX + fPeakTimeX , fTextY + (iRowCount * fLineSpacerY), "NUMBER", fThisPeakTime, 2) ENDIF ENDIF // stored peak time IF (bRenderStoredPeaks) IF (fThisPeakTime > fStoredPeakTime[iThreadCount]) PRINTSTRING("[SCRIPT METRICS] New highest peak recorded for ") PRINTSTRING(ScriptName) PRINTSTRING(" of ") PRINTFLOAT(fThisPeakTime) PRINTNL() fStoredPeakTime[iThreadCount] = fThisPeakTime ENDIF IF (fStoredPeakTime[iThreadCount] > 0.0) fThisWidth = fStoredPeakTime[iThreadCount] * fBarWidthPerMS DRAW_RECT_FROM_CORNER(fTextX + fTimeBarX + fThisWidth, fTextY + (iRowCount * fLineSpacerY) + (fBarHeight * 0.5), 0.001, fBarHeight, 255, 0, 255, 255) ENDIF ENDIF iRowCount += 1 iThreadCount += 1 ENDIF Thread_ID = SCRIPT_THREAD_ITERATOR_GET_NEXT_THREAD_ID() ENDWHILE IF (bRenderStoredPeaks) IF NOT (iTotalThreadsLastFrame = 0) IF NOT (iTotalThreadsLastFrame = iThreadCount) REPEAT MAX_NO_THREADS i fStoredPeakTime[i] = 0.0 ENDREPEAT ENDIF ENDIF IF IS_KEYBOARD_KEY_JUST_PRESSED(KEY_NUMPAD5) REPEAT MAX_NO_THREADS i fStoredPeakTime[i] = 0.0 ENDREPEAT ENDIF iTotalThreadsLastFrame = iThreadCount ENDIF // draw totals IF (fTotalCurrentTime > fTotalPeakTime) fTotalPeakTime = fTotalCurrentTime SETTIMERB(0) ELSE IF TIMERB() > 10000 fTotalPeakTime = fTotalCurrentTime ENDIF ENDIF // current SET_TEXT_SCALE(0.0000, fTextScale) SET_TEXT_COLOUR(128,128,128, 255) fThisWidth = fTotalCurrentTime * fBarWidthPerMS DISPLAY_TEXT_WITH_PLAYER_NAME(fTextX, fTextY + (iRowCount * fLineSpacerY), "STRING", "TOTAL", HUD_COLOUR_GREY) DRAW_RECT_FROM_CORNER(fTextX + fTimeBarX, fTextY + (iRowCount * fLineSpacerY) + (fBarHeight * 0.5), fThisWidth, fBarHeight, 255, 216, 0, 255) // average SET_TEXT_SCALE(0.0000, fTextScale) SET_TEXT_COLOUR(255, 255, 0, 255) IF (bRenderNumbers) DISPLAY_TEXT_WITH_FLOAT(fTextX + fTotalAverageTime, fTextY + (iRowCount * fLineSpacerY), "NUMBER", fTotalAverageTime, 2) ENDIF // peak time fThisWidth = fTotalPeakTime * fBarWidthPerMS SET_TEXT_SCALE(0.0000, fTextScale) IF ((fTotalPeakTime - fTotalAverageTime) > 1.0) SET_TEXT_COLOUR(255, 0, 0, 255) DRAW_RECT_FROM_CORNER(fTextX + fTimeBarX + fThisWidth, fTextY + (iRowCount * fLineSpacerY) + (fBarHeight * 0.5), 0.001, fBarHeight, 255, 0, 0, 255) IF (bRenderPeaks) DISPLAY_TEXT_WITH_FLOAT(fTextX + fPeakTimeX , fTextY + (iRowCount * fLineSpacerY), "NUMBER", fTotalPeakTime, 2) ENDIF ELSE SET_TEXT_COLOUR(255, 106, 0, 255) DRAW_RECT_FROM_CORNER(fTextX + fTimeBarX + fThisWidth, fTextY + (iRowCount * fLineSpacerY) + (fBarHeight * 0.5), 0.001, fBarHeight, 255, 106, 0, 255) IF (bRenderNumbers) //DISPLAY_TEXT_WITH_FLOAT(fTextX + fPeakTimeX , fTextY + (iRowCount * fLineSpacerY), "NUMBER", fTotalPeakTime, 2) ENDIF ENDIF iRowCount += 1 iNumberOfRows = iRowCount ENDIF // check if sever wants us to record IF NETWORK_IS_GAME_IN_PROGRESS() IF (GlobalServerBD.g_bRecordScriptMetrics) IF NOT (bStartRecording) bStartRecording = TRUE ENDIF ELSE IF NOT IS_TRANSITION_SESSION_LAUNCHING() AND NOT IS_TRANSITION_SESSION_KILLING_SESSION() IF (bStartRecording) bStartRecording = FALSE PRINTSTRING("[SCRIPT METRICS] bStartRecording = FALSE, network game not in progress ") PRINTNL() ENDIF ENDIF ENDIF ENDIF // output IF NOT (bStartRecording) IF (b_ScriptMetricsAreRecording) PRINTSTRING("script_metrics - stopping recording") PRINTNL() PRINT_NOW("SM_STOP", 5000, 1) b_ScriptMetricsAreRecording = FALSE CLOSE_DEBUG_FILE() ENDIF ELSE IF NOT (b_ScriptMetricsAreRecording) PRINT_ALL_METRIC_INFO_TO_CHANNEL() b_ScriptMetricsAreRecording = TRUE PRINT_NOW("SM_START", 5000, 1) SETTIMERA(0) OPEN_NAMED_DEBUG_FILE(DebugFilePath, DebugFileName) CLEAR_NAMED_DEBUG_FILE(DebugFilePath, DebugFileName) ELSE IF (iRecordingInterval > 0) IF (TIMERA() > iRecordingInterval) IF (bTurnOnFileWriting) ADD_SCRIPT_METRIC_MARKER("Grabbing metric info") ENDIF PRINT_ALL_METRIC_INFO_TO_CHANNEL() SETTIMERA(0) ENDIF ELSE PRINT_ALL_METRIC_INFO_TO_CHANNEL() ENDIF ENDIF ENDIF // IF (bEnableCloudUploading) // IF (bUploadToCloud) // // IF NOT (bUploadingToCloud) // IF DATAFILE_START_SAVE_TO_CLOUD(CloudFilename) // bUploadingToCloud = TRUE // NET_PRINT("[script_metrics] Started to upload to cloud") NET_NL() // ELSE // NET_PRINT("[script_metrics] Starting to upload to cloud...") NET_NL() // ENDIF // ELSE // NET_PRINT("[script_metrics] Uploading to cloud...") NET_NL() // IF DATAFILE_UPDATE_SAVE_TO_CLOUD(bSuccessfulUploadToCloud) // IF (bSuccessfulUploadToCloud) // NET_PRINT("[script_metrics] Successfully uploaded to cloud") NET_NL() // ELSE // NET_PRINT("[script_metrics] Failed uploading to cloud") NET_NL() // ENDIF // IF DATAFILE_GET_FILE_DICT() != NULL // DATAFILE_DELETE() // ENDIF // bUploadToCloud = FALSE // bUploadingToCloud = FALSE // bDownloadFromCloud = TRUE // ENDIF // ENDIF // // ENDIF // // IF (bDownloadFromCloud) // // IF NOT (bDownloadingFromCloud) // IF DATAFILE_GET_FILE_DICT() != NULL // NET_PRINT("[script_metrics] deleting existing datfile...") NET_NL() // DATAFILE_DELETE() // ELSE // IF DATAFILE_START_LOAD_FROM_CLOUD(CloudFilename) // bDownloadingFromCloud = TRUE // NET_PRINT("[script_metrics] Started to download from cloud") NET_NL() // ELSE // NET_PRINT("[script_metrics] Starting to download from cloud...") NET_NL() // ENDIF // ENDIF // ELSE // IF DATAFILE_UPDATE_LOAD_FROM_CLOUD(bSuccessfulDowloadFromCloud) // IF (bSuccessfulDowloadFromCloud) // NET_PRINT("[script_metrics] Successful download from cloud.") NET_NL() // ELSE // NET_PRINT("[script_metrics] Failed to download from cloud.") NET_NL() // ENDIF // bDownloadFromCloud = FALSE // bDownloadingFromCloud = FALSE // ELSE // NET_PRINT("[script_metrics] Downloading from cloud...") NET_NL() // ENDIF // ENDIF // ENDIF // ENDIF WAIT(0) ENDWHILE ENDSCRIPT #ENDIF