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

2863 lines
104 KiB
Python
Executable File

// *****************************************************************************************
// *****************************************************************************************
// *****************************************************************************************
//
// MISSION NAME : mission_stat_watcher.sc
// AUTHOR : Ak
// DESCRIPTION : Collects the mission metrics, and handles rendering the end of
// mission stat box
//
// *****************************************************************************************
// *****************************************************************************************
// *****************************************************************************************
USING "rage_builtins.sch"
USING "globals.sch"
USING "commands_script.sch"
USING "commands_cutscene.sch"
USING "commands_hud.sch"
USING "commands_cutscene.sch"
USING "mission_stat_public.sch"
USING "player_ped_public.sch"
USING "flow_public_core_override.sch"
USING "flow_help_public.sch"
USING "commands_stats.sch"
USING "help_at_location.sch"
USING "mission_stat_generated_lb_binds.sch"
USING "end_screen.sch"
USING "heist_end_screen.sch"
USING "minigame_midsized_message.sch"
USING "script_misc.sch"
//Set this to 1 to enable detailed debugging.
CONST_INT ENABLE_STAT_WATCHER_DEBUG 0
//Mission passed screen timing.
CONST_INT DELAY_BEFORE_DISPLAYING 1500
CONST_INT DISPLAY_DURATION 15000
//SCALEFORM_INDEX mov//the stat box // gone
//SCALEFORM_INDEX splash//the splash text //gone
END_SCREEN_DATASET esd
INT iTimeDeltaThisUpdate = 0
//INT iTimeToDisplayScreen = -1
INT visiblesucceeded = 0
INT visibleattempted = visiblesucceeded
INT iHealthThisTick = visibleattempted
INT iHealthLastTick = 0
INT iHealthDelta = 0
//FLOAT fUploadPercentage = 0.0
//INT succeeded = 0
//INT attempted = 0
MISSION_STAT_SYSTEM_INVALIDATION_REASON eLastInvalidationReasonShown = MSSIR_VALID
PED_BONETAG pbt
FLOAT overallAccuracyMetric = 100.0
INT overallBulletsMetric = 0
//BOOL bUSE_ASSASSIN_OR_CLF_DLC = FALSE
#IF IS_DEBUG_BUILD
BOOL bDrawWatchlist = FALSE
SCRIPT_SHARD_BIG_MESSAGE shardBigMessage
SCALEFORM_INDEX buttons = NULL
BOOL bTestShardMessage = FALSE
INT iTWEAK_endFlash = ENUM_TO_INT(HUD_COLOUR_BLACK)
#ENDIF
//INT iSplashCount = 0
//BOOL bSplashLock = FALSE
/*
*
// diff: [REQUIRED] Is this stat used as a differentiator //(do we add on the score from this stat to allow for differentiation between 2 people who both met the objective)? For example if 2 people got > -10 car damage, we can add on the actual damage they took which may place one player above another. (bool)
BOOL lb_include_in_calc
// weighting: [REQUIRED] The amount of points this value is worth. For example each 1% of car damage is worth 1 point, but we don't want each millisecond of action cam use to be worth 1 point as it isn't fairly weighted. Therefore each 1 millisecond of action cam use is worth 0.001 points - this is variable and TBD per mission (float)
FLOAT lb_weight_PPC
// min: [REQUIRED] The lowest/worst score the player can legally get, or the cut off point where we don't care anymore if they're lower - may be negated if required (int)
INT lb_min_legal
// max: [REQUIRED] The highest/best score the player can legally get, or the cut off point where we don't care anymore if they#re higher - may be negated if required. Cut off point is particularly useful for unbounded values like time, bullets fired, damage etc. We can record scores up to 30 minutes, and if they go above this, we only add 30 mins worth of bonus score to their time etc. (int)
INT lb_max_legal
// precedence: [REQUIRED for mission objectives] The order which the objectives take precedence. 1 is worth the most. Objectives can have the same precedence level if there is no way to rank one higher than another. (int)
INT lb_precedence
*
*
*/
PROC DO_LEADERBOARD_SCORE_CALCULATION_AND_SET()
//LEADERBOARDS_ENUM g_eTargetMissionScoreLeaderboardBestRun
//LEADERBOARDS_ENUM g_eTargetMissionScoreLeaderboardIndivRec
IF g_iMissionStatsBeingTracked = 0
CPRINTLN(DEBUG_MISSION_STATS, "DO_LEADEARBOARD_SCORE_CALCULATION_AND_SET no stats")
EXIT
ENDIF
IF g_LeaderboardLastMissionID = -1
CPRINTLN(DEBUG_MISSION_STATS, "DO_LEADEARBOARD_SCORE_CALCULATION_AND_SET invalid mission LB index")
EXIT
ENDIF
INT i= 0
REPEAT g_iMissionStatsBeingTracked i
IF g_MissionStatTrackingArray[i].invalidationReason != MSSIR_VALID
CPRINTLN(DEBUG_MISSION_STATS, "DO_LEADEARBOARD_SCORE_CALCULATION_AND_SET invalidated stat found, bailing out")
EXIT
ENDIF
ENDREPEAT
CPRINTLN(DEBUG_MISSION_STATS, "DO_LEADEARBOARD_SCORE_CALCULATION_AND_SET Attempting leaderboard calculation for mission")
INT score = 0
/*FLOAT magnitude = 100000000
//g_iMissionStatsBeingTracked
//g_MissionStatTrackingArray
var score = 0;
var magnitude = 1000000000; // this starts off HUGE. Will be modified by the precedence for each objective we loop through. The only way anyone could ever get a score greater than this would be if they completed the primary objective.
for(var i = 0; i < cols2.length; i++)
{
var col = cols2[i];
// If the current objective is a target (ie a mission objective)...
if(col.target)
{
// If the objective has been met/passed
if(col.val >= col.targetval)
{
// The divisor calculates the score to add based on the objective's precedence.
// The lower the precedence, the more score it's worth.
var divisor = Math.pow(10,col.precedence)/10;
// Add on their bonus score for completing this objective.
score += magnitude/divisor;
}
}
// If this objective is a differentiator...
if(col.diff)
{
// If their score is greater than the max allowed score set it to the max value
var val = (col.val > col.max) ? col.max : col.val;
// If their score is less than the min allowed value set it to the min value
val = (col.val < col.min) ? col.min : col.val;
// Add on their differentiation score
score += val * col.weighting;
}
console.log(col.name + " : " +score);
}
*/
CPRINTLN(DEBUG_MISSION_STATS, "-----------------------------------\nStarting mission score calculation")
i= 0
INT iDiffSum = 0
CPRINTLN(DEBUG_MISSION_STATS, "Gathering contributions from ", g_iMissionStatsBeingTracked)// " stats, magnitude is ",magnitude)
REPEAT g_iMissionStatsBeingTracked i
// #IF USE_CLF_DLC
// DLC_ASSASSINATION_STATS m = INT_TO_ENUM(DLC_ASSASSINATION_STATS, ENUM_TO_INT(g_MissionStatTrackingArray[i].target))
// BOOL target = !g_DLCMissionStatTrackingPrototypes[m].bHidden
// BOOL diff = g_MissionStatTrackingPrototypes[m].lb_differentiator
// INT precedence = g_MissionStatTrackingPrototypes[m].lb_precedence
// FLOAT weighting = g_MissionStatTrackingPrototypes[m].lb_weight_PPC
// #ENDIF
// #IF USE_NRM_DLC
// DLC_ASSASSINATION_STATS m = INT_TO_ENUM(DLC_ASSASSINATION_STATS, ENUM_TO_INT(g_MissionStatTrackingArray[i].target))
// BOOL target = !g_DLCMissionStatTrackingPrototypes[m].bHidden
// BOOL diff = g_MissionStatTrackingPrototypes[m].lb_differentiator
// INT precedence = g_MissionStatTrackingPrototypes[m].lb_precedence
// FLOAT weighting = g_MissionStatTrackingPrototypes[m].lb_weight_PPC
// #ENDIF
// #IF NOT USE_CLF_DLC
// #if not USE_NRM_DLC
ENUM_MISSION_STATS m = g_MissionStatTrackingArray[i].target
BOOL target = !g_MissionStatTrackingPrototypes[m].bHidden
BOOL diff = g_MissionStatTrackingPrototypes[m].lb_differentiator
INT precedence = g_MissionStatTrackingPrototypes[m].lb_precedence
FLOAT weighting = g_MissionStatTrackingPrototypes[m].lb_weight_PPC
// #ENDIF
// #endif
BOOL bPassed = FALSE
CPRINTLN(DEBUG_MISSION_STATS, "Target : ", target)
CPRINTLN(DEBUG_MISSION_STATS, "Diff : ", diff)
CPRINTLN(DEBUG_MISSION_STATS, "Precedence : ", precedence)
CPRINTLN(DEBUG_MISSION_STATS, "Weighting : ", weighting)
CPRINTLN(DEBUG_MISSION_STATS, "Raw value : ", g_MissionStatTrackingArray[i].ivalue )
bPassed = FALSE
// #IF USE_CLF_DLC
// IF GET_DLC_MISSION_STAT_PASS_STATUS_FOR_VALUE(m, g_MissionStatTrackingArray[i].ivalue)
// bPassed = TRUE
// ENDIF
// #ENDIF
// #IF NOT USE_CLF_DLC
// #if not USE_NRM_DLC
IF GET_MISSION_STAT_PASS_STATUS_FOR_VALUE(m, g_MissionStatTrackingArray[i].ivalue)
bPassed = TRUE
ENDIF
// #ENDIF
// #endif
CPRINTLN(DEBUG_MISSION_STATS, "Passed : ", bPassed )
IF target//is a target
IF bPassed
/*
FLOAT Divisor = POW(10.0,TO_FLOAT(precedence))/10.0
CPRINTLN(DEBUG_MISSION_STATS, "This target stat's contribution is ",magnitude/Divisor)
score += FLOOR(magnitude/Divisor)
*/
score += 100000000
#IF IS_DEBUG_BUILD
ELSE
CPRINTLN(DEBUG_MISSION_STATS, "This target stat failed, no contrib")
#ENDIF
ENDIF
ENDIF
IF(diff)//is a differentiator
//cap between the min and the max
//INT maxv = g_MissionStatTrackingPrototypes[m].lb_max_legal
//INT minv = g_MissionStatTrackingPrototypes[m].lb_max_legal
INT cval = g_MissionStatTrackingArray[i].ivalue
/*
IF cval > maxv
cval = maxv
ENDIF
IF cval < minv
cval = minv
ENDIF
*/
CPRINTLN(DEBUG_MISSION_STATS, "This differentiatior contribution is : ", cval * weighting, " this value is from cval * weighting (", cval," * ",weighting ,")" )
INT difso = FLOOR(cval * weighting)
iDiffSum += difso
score += difso
ENDIF
CPRINTLN(DEBUG_MISSION_STATS, "Score cumulative value is ",score)
ENDREPEAT
CPRINTLN(DEBUG_MISSION_STATS, "Mission score calculation complete\n-----------------------------------")
//score = score//for now to prevent the compiler freaking out before the next section gets put in place and fixed
g_LeaderboardLastMissionScore = score
g_LeaderboardLastMissionScore_Derivs = iDiffSum
CPRINTLN(DEBUG_MISSION_STATS, "Mission leaderboard score was: ", g_LeaderboardLastMissionScore," divsum ", g_LeaderboardLastMissionScore_Derivs)
IF NETWORK_IS_SIGNED_ONLINE() //AND (NOT NETWORK_PLAYER_IS_CHEATER())
IF g_LeaderboardLastMissionRCType = FALSE
SP_MISSIONS mi = INT_TO_ENUM(SP_MISSIONS, g_LeaderboardLastMissionID)
#IF USE_CLF_DLC
CERRORLN(DEBUG_MISSION_STATS, "DO_LEADERBOARD_SCORE_CALCULATION_AND_SET - ", GET_SP_MISSION_DISPLAY_STRING_FROM_ID(mi), " needs binding up for the leaderboard.")
EXIT
#ENDIF
#IF USE_NRM_DLC
CERRORLN(DEBUG_MISSION_STATS, "DO_LEADERBOARD_SCORE_CALCULATION_AND_SET - ", GET_SP_MISSION_DISPLAY_STRING_FROM_ID(mi), " needs binding up for the leaderboard.")
EXIT
#ENDIF
IF mi = SP_HEIST_JEWELRY_2
//717//best
//718//agg
IF g_savedGlobals.sFlow.controls.intIDs[Get_Heist_Choice_FlowInt_ID(HEIST_JEWEL)] = HEIST_CHOICE_JEWEL_HIGH_IMPACT
CPRINTLN(DEBUG_MISSION_STATS, "Alternate JH2 leaderboard upload")
LeaderboardUpdateData writeData
writeData.m_LeaderboardId = 716
LEADERBOARDS2_WRITE_DATA(writeData)
LEADERBOARDS_WRITE_ADD_COLUMN(LB_INPUT_COL_SCORE, g_LeaderboardLastMissionScore,0.0)
LEADERBOARDS_WRITE_ADD_COLUMN(LB_INPUT_COL_MISSION_SCORE, g_LeaderboardLastMissionScore_Derivs,0.0)
LEADERBOARDS_WRITE_ADD_COLUMN(LB_INPUT_COL_PASSES, 1,0.0)
LEADERBOARDS_WRITE_ADD_COLUMN(LB_INPUT_COL_OBJECTIVES_PASSED, g_LeaderboardLastObjectivesPassed,0.0)
LEADERBOARDS_WRITE_ADD_COLUMN(LB_INPUT_COL_SPECIAL_SCORE_3, GET_VALUE_OF_STAT_FROM_TRANSITORY_TRACKING_REGISTERS(JH2A_ACTUAL_TAKE), 0.0)
LEADERBOARDS_WRITE_ADD_COLUMN(LB_INPUT_COL_SPECIAL_SCORE_4, GET_VALUE_OF_STAT_FROM_TRANSITORY_TRACKING_REGISTERS(JH2A_PERSONAL_TAKE), 0.0)
LEADERBOARDS_WRITE_ADD_COLUMN(LB_INPUT_COL_SPECIAL_ABILITY_TIME, GET_VALUE_OF_STAT_FROM_TRANSITORY_TRACKING_REGISTERS(JH2A_SPECIAL_ABILITY_TIME), 0.0)
LEADERBOARDS_WRITE_ADD_COLUMN(LB_INPUT_COL_BEST_TIME, GET_VALUE_OF_STAT_FROM_TRANSITORY_TRACKING_REGISTERS(JH2A_TIME), 0.0)
LEADERBOARDS_WRITE_ADD_COLUMN(LB_INPUT_COL_SPECIAL_TIME_4, GET_VALUE_OF_STAT_FROM_TRANSITORY_TRACKING_REGISTERS(JH2A_CASE_GRAB_TIME), 0.0)
LEADERBOARDS_WRITE_ADD_COLUMN(LB_INPUT_COL_PLAYER_DAMAGE, GET_VALUE_OF_STAT_FROM_TRANSITORY_TRACKING_REGISTERS(JH2A_FRANKLIN_BIKE_DAMAGE), 0.0)
LEADERBOARDS_WRITE_ADD_COLUMN(LB_INPUT_COL_SPECIAL_SCORE_5, GET_VALUE_OF_STAT_FROM_TRANSITORY_TRACKING_REGISTERS(JH2A_CASES_SMASHED), 0.0)
LEADERBOARDS_WRITE_ADD_COLUMN(LB_INPUT_COL_CAR_DAMAGE, GET_VALUE_OF_STAT_FROM_TRANSITORY_TRACKING_REGISTERS(JH2A_CAR_DAMAGE), 0.0)
LEADERBOARDS_WRITE_ADD_COLUMN(LB_INPUT_COL_SPECIAL_SCORE_1, GET_VALUE_OF_STAT_FROM_TRANSITORY_TRACKING_REGISTERS(JH2A_MAX_SPEED), 0.0)
LEADERBOARDS_WRITE_ADD_COLUMN(LB_INPUT_COL_INNOCENTS_KILLED, GET_VALUE_OF_STAT_FROM_TRANSITORY_TRACKING_REGISTERS(JH2A_INNOCENTS_KILLED), 0.0)
writeData.m_LeaderboardId = 717
LEADERBOARDS2_WRITE_DATA(writeData)
LEADERBOARDS_WRITE_ADD_COLUMN(LB_INPUT_COL_SCORE, g_LeaderboardLastMissionScore,0.0)
LEADERBOARDS_WRITE_ADD_COLUMN(LB_INPUT_COL_MISSION_SCORE, g_LeaderboardLastMissionScore_Derivs,0.0)
LEADERBOARDS_WRITE_ADD_COLUMN(LB_INPUT_COL_PASSES, 1,0.0)
LEADERBOARDS_WRITE_ADD_COLUMN(LB_INPUT_COL_OBJECTIVES_PASSED, g_LeaderboardLastObjectivesPassed,0.0)
LEADERBOARDS_WRITE_ADD_COLUMN(LB_INPUT_COL_SPECIAL_SCORE_3, GET_VALUE_OF_STAT_FROM_TRANSITORY_TRACKING_REGISTERS(JH2A_ACTUAL_TAKE), 0.0)
LEADERBOARDS_WRITE_ADD_COLUMN(LB_INPUT_COL_SPECIAL_SCORE_4, GET_VALUE_OF_STAT_FROM_TRANSITORY_TRACKING_REGISTERS(JH2A_PERSONAL_TAKE), 0.0)
LEADERBOARDS_WRITE_ADD_COLUMN(LB_INPUT_COL_SPECIAL_ABILITY_TIME, GET_VALUE_OF_STAT_FROM_TRANSITORY_TRACKING_REGISTERS(JH2A_SPECIAL_ABILITY_TIME), 0.0)
LEADERBOARDS_WRITE_ADD_COLUMN(LB_INPUT_COL_BEST_TIME, GET_VALUE_OF_STAT_FROM_TRANSITORY_TRACKING_REGISTERS(JH2A_TIME), 0.0)
LEADERBOARDS_WRITE_ADD_COLUMN(LB_INPUT_COL_SPECIAL_TIME_4, GET_VALUE_OF_STAT_FROM_TRANSITORY_TRACKING_REGISTERS(JH2A_CASE_GRAB_TIME), 0.0)
LEADERBOARDS_WRITE_ADD_COLUMN(LB_INPUT_COL_PLAYER_DAMAGE, GET_VALUE_OF_STAT_FROM_TRANSITORY_TRACKING_REGISTERS(JH2A_FRANKLIN_BIKE_DAMAGE), 0.0)
LEADERBOARDS_WRITE_ADD_COLUMN(LB_INPUT_COL_SPECIAL_SCORE_5, GET_VALUE_OF_STAT_FROM_TRANSITORY_TRACKING_REGISTERS(JH2A_CASES_SMASHED), 0.0)
LEADERBOARDS_WRITE_ADD_COLUMN(LB_INPUT_COL_CAR_DAMAGE, GET_VALUE_OF_STAT_FROM_TRANSITORY_TRACKING_REGISTERS(JH2A_CAR_DAMAGE), 0.0)
LEADERBOARDS_WRITE_ADD_COLUMN(LB_INPUT_COL_SPECIAL_SCORE_1, GET_VALUE_OF_STAT_FROM_TRANSITORY_TRACKING_REGISTERS(JH2A_MAX_SPEED), 0.0)
LEADERBOARDS_WRITE_ADD_COLUMN(LB_INPUT_COL_INNOCENTS_KILLED, GET_VALUE_OF_STAT_FROM_TRANSITORY_TRACKING_REGISTERS(JH2A_INNOCENTS_KILLED), 0.0)
ELSE
GENERATED_TRY_WRITE_CURRENT_STAT_REGISTERS_TO_LEADERBOARD(mi)
ENDIF
ELIF mi = SP_MISSION_MICHAEL_2
CPRINTLN(DEBUG_MISSION_STATS, "Alternate Michael2 leaderboard upload")
LeaderboardUpdateData writeData
writeData.m_LeaderboardId = 673
LEADERBOARDS2_WRITE_DATA(writeData)
LEADERBOARDS_WRITE_ADD_COLUMN(LB_INPUT_COL_SCORE, g_LeaderboardLastMissionScore,0.0)
LEADERBOARDS_WRITE_ADD_COLUMN(LB_INPUT_COL_MISSION_SCORE, g_LeaderboardLastMissionScore_Derivs,0.0)
LEADERBOARDS_WRITE_ADD_COLUMN(LB_INPUT_COL_PASSES, 1,0.0)
LEADERBOARDS_WRITE_ADD_COLUMN(LB_INPUT_COL_OBJECTIVES_PASSED, g_LeaderboardLastObjectivesPassed,0.0)
LEADERBOARDS_WRITE_ADD_COLUMN(LB_INPUT_COL_SWITCHES, GET_VALUE_OF_STAT_FROM_TRANSITORY_TRACKING_REGISTERS(MIC2_TIMES_SWITCHED), 0.0)
LEADERBOARDS_WRITE_ADD_COLUMN(LB_INPUT_COL_ACCURACY, GET_VALUE_OF_STAT_FROM_TRANSITORY_TRACKING_REGISTERS(MIC2_ACCURACY), 0.0)
LEADERBOARDS_WRITE_ADD_COLUMN(LB_INPUT_COL_HEADSHOTS, GET_VALUE_OF_STAT_FROM_TRANSITORY_TRACKING_REGISTERS(MIC2_HEADSHOTS), 0.0)
LEADERBOARDS_WRITE_ADD_COLUMN(LB_INPUT_COL_SPECIAL_TIME_1, GET_VALUE_OF_STAT_FROM_TRANSITORY_TRACKING_REGISTERS(MIC2_MIKE_RESCUE_TIMER), 0.0)
LEADERBOARDS_WRITE_ADD_COLUMN(LB_INPUT_COL_SPECIAL_SCORE_1, GET_VALUE_OF_STAT_FROM_TRANSITORY_TRACKING_REGISTERS(MIC2_WAYPOINT_USED), 0.0)
LEADERBOARDS_WRITE_ADD_COLUMN(LB_INPUT_COL_CAR_DAMAGE, GET_VALUE_OF_STAT_FROM_TRANSITORY_TRACKING_REGISTERS(MIC2_CAR_DAMAGE), 0.0)
LEADERBOARDS_WRITE_ADD_COLUMN(LB_INPUT_COL_INNOCENTS_KILLED, GET_VALUE_OF_STAT_FROM_TRANSITORY_TRACKING_REGISTERS(MIC2_INNOCENTS_KILLED), 0.0)
LEADERBOARDS_WRITE_ADD_COLUMN(LB_INPUT_COL_KILLS, GET_VALUE_OF_STAT_FROM_TRANSITORY_TRACKING_REGISTERS(MIC2_KILLS), 0.0)
LEADERBOARDS_WRITE_ADD_COLUMN(LB_INPUT_COL_BULLETS_FIRED, GET_VALUE_OF_STAT_FROM_TRANSITORY_TRACKING_REGISTERS(MIC2_BULLETS_FIRED), 0.0)
LEADERBOARDS_WRITE_ADD_COLUMN(LB_INPUT_COL_PLAYER_DAMAGE, GET_VALUE_OF_STAT_FROM_TRANSITORY_TRACKING_REGISTERS(MIC2_DAMAGE), 0.0)
LEADERBOARDS_WRITE_ADD_COLUMN(LB_INPUT_COL_SPECIAL_TIME_2, GET_VALUE_OF_STAT_FROM_TRANSITORY_TRACKING_REGISTERS(MIC2_TIME_TO_LOSE_TRIADS), 0.0)
LEADERBOARDS_WRITE_ADD_COLUMN(LB_INPUT_COL_SPECIAL_SCORE_2, GET_VALUE_OF_STAT_FROM_TRANSITORY_TRACKING_REGISTERS(MIC2_MAX_SPEED), 0.0)
LEADERBOARDS_WRITE_ADD_COLUMN(LB_INPUT_COL_SPECIAL_TIME_4, GET_VALUE_OF_STAT_FROM_TRANSITORY_TRACKING_REGISTERS(MIC2_TIME_TO_SAVE_FRANKLIN), 0.0)
LEADERBOARDS_WRITE_ADD_COLUMN(LB_INPUT_COL_SPECIAL_SCORE_5, GET_VALUE_OF_STAT_FROM_TRANSITORY_TRACKING_REGISTERS(MIC2_UNIQUE_TRIAD_DEATHS), 0.0)
LEADERBOARDS_WRITE_ADD_COLUMN(LB_INPUT_COL_SPECIAL_ABILITY_TIME, GET_VALUE_OF_STAT_FROM_TRANSITORY_TRACKING_REGISTERS(MIC2_SPECIAL_ABILITY_TIME), 0.0)
LEADERBOARDS_WRITE_ADD_COLUMN(LB_INPUT_COL_BEST_TIME, GET_VALUE_OF_STAT_FROM_TRANSITORY_TRACKING_REGISTERS(MIC2_TIME), 0.0)
LEADERBOARDS_WRITE_ADD_COLUMN(LB_INPUT_COL_SPECIAL_TIME_3, 0, 0.0)
writeData.m_LeaderboardId = 672
LEADERBOARDS2_WRITE_DATA(writeData)
LEADERBOARDS_WRITE_ADD_COLUMN(LB_INPUT_COL_SCORE, g_LeaderboardLastMissionScore,0.0)
LEADERBOARDS_WRITE_ADD_COLUMN(LB_INPUT_COL_MISSION_SCORE, g_LeaderboardLastMissionScore_Derivs,0.0)
LEADERBOARDS_WRITE_ADD_COLUMN(LB_INPUT_COL_PASSES, 1,0.0)
LEADERBOARDS_WRITE_ADD_COLUMN(LB_INPUT_COL_OBJECTIVES_PASSED, g_LeaderboardLastObjectivesPassed,0.0)
LEADERBOARDS_WRITE_ADD_COLUMN(LB_INPUT_COL_SWITCHES, GET_VALUE_OF_STAT_FROM_TRANSITORY_TRACKING_REGISTERS(MIC2_TIMES_SWITCHED), 0.0)
LEADERBOARDS_WRITE_ADD_COLUMN(LB_INPUT_COL_ACCURACY, GET_VALUE_OF_STAT_FROM_TRANSITORY_TRACKING_REGISTERS(MIC2_ACCURACY), 0.0)
LEADERBOARDS_WRITE_ADD_COLUMN(LB_INPUT_COL_HEADSHOTS, GET_VALUE_OF_STAT_FROM_TRANSITORY_TRACKING_REGISTERS(MIC2_HEADSHOTS), 0.0)
LEADERBOARDS_WRITE_ADD_COLUMN(LB_INPUT_COL_SPECIAL_TIME_1, GET_VALUE_OF_STAT_FROM_TRANSITORY_TRACKING_REGISTERS(MIC2_MIKE_RESCUE_TIMER), 0.0)
LEADERBOARDS_WRITE_ADD_COLUMN(LB_INPUT_COL_SPECIAL_SCORE_1, GET_VALUE_OF_STAT_FROM_TRANSITORY_TRACKING_REGISTERS(MIC2_WAYPOINT_USED), 0.0)
LEADERBOARDS_WRITE_ADD_COLUMN(LB_INPUT_COL_CAR_DAMAGE, GET_VALUE_OF_STAT_FROM_TRANSITORY_TRACKING_REGISTERS(MIC2_CAR_DAMAGE), 0.0)
LEADERBOARDS_WRITE_ADD_COLUMN(LB_INPUT_COL_INNOCENTS_KILLED, GET_VALUE_OF_STAT_FROM_TRANSITORY_TRACKING_REGISTERS(MIC2_INNOCENTS_KILLED), 0.0)
LEADERBOARDS_WRITE_ADD_COLUMN(LB_INPUT_COL_KILLS, GET_VALUE_OF_STAT_FROM_TRANSITORY_TRACKING_REGISTERS(MIC2_KILLS), 0.0)
LEADERBOARDS_WRITE_ADD_COLUMN(LB_INPUT_COL_BULLETS_FIRED, GET_VALUE_OF_STAT_FROM_TRANSITORY_TRACKING_REGISTERS(MIC2_BULLETS_FIRED), 0.0)
LEADERBOARDS_WRITE_ADD_COLUMN(LB_INPUT_COL_PLAYER_DAMAGE, GET_VALUE_OF_STAT_FROM_TRANSITORY_TRACKING_REGISTERS(MIC2_DAMAGE), 0.0)
LEADERBOARDS_WRITE_ADD_COLUMN(LB_INPUT_COL_SPECIAL_TIME_2, GET_VALUE_OF_STAT_FROM_TRANSITORY_TRACKING_REGISTERS(MIC2_TIME_TO_LOSE_TRIADS), 0.0)
LEADERBOARDS_WRITE_ADD_COLUMN(LB_INPUT_COL_SPECIAL_SCORE_2, GET_VALUE_OF_STAT_FROM_TRANSITORY_TRACKING_REGISTERS(MIC2_MAX_SPEED), 0.0)
LEADERBOARDS_WRITE_ADD_COLUMN(LB_INPUT_COL_SPECIAL_TIME_4, GET_VALUE_OF_STAT_FROM_TRANSITORY_TRACKING_REGISTERS(MIC2_TIME_TO_SAVE_FRANKLIN), 0.0)
LEADERBOARDS_WRITE_ADD_COLUMN(LB_INPUT_COL_SPECIAL_SCORE_3, GET_VALUE_OF_STAT_FROM_TRANSITORY_TRACKING_REGISTERS(MIC2_UNIQUE_TRIAD_DEATHS), 0.0)
LEADERBOARDS_WRITE_ADD_COLUMN(LB_INPUT_COL_SPECIAL_ABILITY_TIME, GET_VALUE_OF_STAT_FROM_TRANSITORY_TRACKING_REGISTERS(MIC2_SPECIAL_ABILITY_TIME), 0.0)
LEADERBOARDS_WRITE_ADD_COLUMN(LB_INPUT_COL_BEST_TIME, GET_VALUE_OF_STAT_FROM_TRANSITORY_TRACKING_REGISTERS(MIC2_TIME), 0.0)
LEADERBOARDS_WRITE_ADD_COLUMN(LB_INPUT_COL_SPECIAL_TIME_3, 0, 0.0)
ELSE
GENERATED_TRY_WRITE_CURRENT_STAT_REGISTERS_TO_LEADERBOARD(mi)
ENDIF
g_savedGlobals.sFlow.missionSavedData[mi].iScore = g_LeaderboardLastMissionScore
ELSE
GENERATED_TRY_WRITE_CURRENT_STAT_REGISTERS_TO_LEADERBOARDRC( INT_TO_ENUM(g_eRC_MissionIDs, g_LeaderboardLastMissionID))
ENDIF
ENDIF
ENDPROC
PROC TALLY_ACCURACY_METRIC()
IF g_bMissionStatAccuracyTallied
CPRINTLN(DEBUG_MISSION_STATS, "DON'T Tallying accuracy metrics!!!!????!!!!")
EXIT
ENDIF
g_bMissionStatAccuracyTallied = TRUE
CPRINTLN(DEBUG_MISSION_STATS, "Tallying accuracy metrics:")
INT totalShots = 0
INT totalHits = 0
//INT g_iMissionStatsSP0Hits = 0
//INT g_iMissionStatsSP0Shots = 0
//INT g_iMissionStatsSP1Hits = 0
//INT g_iMissionStatsSP1Shots = 0
//INT g_iMissionStatsSP2Hits = 0
//INT g_iMissionStatsSP2Shots = 0
totalShots = (RETRIEVE_INT_STAT(SP0_SHOTS) - g_iMissionStatsSP0Shots)
totalHits = (RETRIEVE_INT_STAT(SP0_HITS) - g_iMissionStatsSP0Hits)
CPRINTLN(DEBUG_MISSION_STATS, "Sp 0 hits/shots : ", totalHits, "/", totalShots)
totalShots += (RETRIEVE_INT_STAT(SP1_SHOTS) -g_iMissionStatsSP1Shots)
totalHits += (RETRIEVE_INT_STAT(SP1_HITS) - g_iMissionStatsSP1Hits)
CPRINTLN(DEBUG_MISSION_STATS, "+Sp 1 hits/shots : ", totalHits, "/", totalShots)
totalShots += (RETRIEVE_INT_STAT(SP2_SHOTS) -g_iMissionStatsSP2Shots)
totalHits += (RETRIEVE_INT_STAT(SP2_HITS) - g_iMissionStatsSP2Hits)
CPRINTLN(DEBUG_MISSION_STATS, "+Sp 2 hits/shots : ", totalHits, "/", totalShots)
//SCRIPT_ASSERT("Accuracy metrics end")
//now use totalShots and totalHits to work out the mission accuracy
WAIT(0)
FLOAT fPercentage = 100.0
IF NOT (totalShots = 0)
CPRINTLN(DEBUG_MISSION_STATS, "totalHits/totalShots : ", totalHits, "/", totalShots)
FLOAT ftotal = TO_FLOAT(totalShots)
FLOAT fhits = TO_FLOAT(totalHits)
fPercentage = TO_FLOAT(FLOOR((fhits/ftotal)*100.0))
IF fPercentage > 100.0
fPercentage = 100.0
ENDIF
CPRINTLN(DEBUG_MISSION_STATS, " : ", fPercentage, " \% \n\n")
ENDIF
overallAccuracyMetric = fPercentage
overallBulletsMetric = totalShots
ENDPROC
PROC COMMUTE_FLOAT_STAT_REGISTERS_TO_INTS()
IF g_iMissionStatsBeingTracked > MAX_TRACKED_MISSION_STATS
CERRORLN(DEBUG_MISSION_STATS, "COMMUTE_FLOAT_STAT_REGISTERS_TO_INTS - g_iMissionStatsBeingTracked[", g_iMissionStatsBeingTracked, "] >= MAX_TRACKED_MISSION_STATS")
SCRIPT_ASSERT("COMMUTE_FLOAT_STAT_REGISTERS_TO_INTS - g_iMissionStatsBeingTracked >= MAX_TRACKED_MISSION_STATS")
EXIT
ENDIF
INT i = 0
//INT t = g_MissionStatTrackingArray[i].target
REPEAT g_iMissionStatsBeingTracked i
IF g_MissionStatTrackingArray[i].ivalue = 0
IF g_MissionStatTrackingArray[i].fvalue != 0.0
g_MissionStatTrackingArray[i].ivalue = FLOOR(g_MissionStatTrackingArray[i].fvalue)
ENDIF
ENDIF
ENUM_MISSION_STATS m = g_MissionStatTrackingArray[i].target
IF ENUM_TO_INT(m) > 0
//#IF NOT USE_CLF_DLC
IF g_MissionStatTrackingPrototypes[m].type = MISSION_STAT_TYPE_ACCURACY
g_MissionStatTrackingArray[i].ivalue = ROUND(overallAccuracyMetric)
ENDIF
IF g_MissionStatTrackingPrototypes[m].type = MISSION_STAT_TYPE_BULLETS_FIRED
g_MissionStatTrackingArray[i].ivalue = overallBulletsMetric
ENDIF
//#ENDIF
//#IF USE_CLF_DLC
// IF g_DLCMissionStatTrackingPrototypes[m].type = MISSION_STAT_TYPE_ACCURACY
// g_MissionStatTrackingArray[i].ivalue = ROUND(overallAccuracyMetric)
// CPRINTLN(DEBUG_MISSION_STATS, " incrament accuracy value ", i, " to ", g_MissionStatTrackingArray[i].ivalue, " [", m, "]")
// ENDIF
// IF g_DLCMissionStatTrackingPrototypes[m].type = MISSION_STAT_TYPE_BULLETS_FIRED
// g_MissionStatTrackingArray[i].ivalue = overallBulletsMetric
// CPRINTLN(DEBUG_MISSION_STATS, " incrament bullets fired value ", i, " to ", g_MissionStatTrackingArray[i].ivalue, " [", m, "]")
// ENDIF
//#ENDIF
ENDIF
ENDREPEAT
// IF bUSE_ASSASSIN_OR_CLF_DLC
// BOOL bFoundAccuracy = FALSE
// IF NOT bFoundAccuracy
// i= 0
//
// REPEAT g_iMissionStatsBeingTracked i
// ENUM_MISSION_STATS m
// REPEAT MAX_TRACKED_MISSION_STATS m
//#IF NOT USE_CLF_DLC
// IF g_MissionStatTrackingPrototypes[m].type = MISSION_STAT_TYPE_ACCURACY
//#ENDIF
//#IF USE_CLF_DLC
// IF g_DLCMissionStatTrackingPrototypes[m].type = MISSION_STAT_TYPE_ACCURACY
//#ENDIF
// g_MissionStatTrackingArray[i].ivalue = ROUND(overallAccuracyMetric)
// CPRINTLN(DEBUG_MISSION_STATS, " DLC incrament accuracy value ", i, " to ", g_MissionStatTrackingArray[i].ivalue, " [", m, "]")
//
// bFoundAccuracy = TRUE
// ENDIF
// ENDREPEAT
// ENDREPEAT
// ENDIF
// ENDIF
ENDPROC
FUNC INT IS_ENTITY_IN_WATCH_LIST(ENTITY_INDEX ei)
IF g_iEntityWatchListLoggedCount = 0
RETURN -1
ENDIF
INT i = 0
REPEAT MAX_ENTITY_WATCH_LIST_ENTRIES i
IF g_EntityWatchList[i].index = ei
RETURN i
ENDIF
ENDREPEAT
RETURN -1
ENDFUNC
PROC UPDATE_DAMAGE_TABLE_STATS(INT fiscalDamage)
INT i= 0
REPEAT g_iMissionStatsBeingTracked i
ENUM_MISSION_STATS m = g_MissionStatTrackingArray[i].target
//#IF NOT USE_CLF_DLC
IF g_MissionStatTrackingPrototypes[m].type = MISSION_STAT_TYPE_FINANCE_TABLE
//#ENDIF
//#IF USE_CLF_DLC
// IF g_DLCMissionStatTrackingPrototypes[m].type = MISSION_STAT_TYPE_FINANCE_TABLE
//#ENDIF
g_MissionStatTrackingArray[i].ivalue += fiscalDamage
CPRINTLN(DEBUG_MISSION_STATS, " incrament finance table value ", i, " to ", g_MissionStatTrackingArray[i].ivalue, " [", m, "]")
ENDIF
ENDREPEAT
ENDPROC
PROC HEADSHOT_KILL_DETECTED()
IF g_iEntityWatchListLoggedCount = 0
SCRIPT_ASSERT("HEADSHOT_KILL_DETECTED called with g_iEntityWatchListLoggedCount = 0")
EXIT
ENDIF
BOOL bFoundAHeadshot = FALSE
INT i
REPEAT g_iMissionStatsBeingTracked i
ENUM_MISSION_STATS m = g_MissionStatTrackingArray[i].target
IF g_MissionStatTrackingPrototypes[m].type = MISSION_STAT_TYPE_HEADSHOTS
g_MissionStatTrackingArray[i].ivalue += 1
bFoundAHeadshot = TRUE
CPRINTLN(DEBUG_MISSION_STATS, "Incrementing headshot value ", i, " to ", g_MissionStatTrackingArray[i].ivalue, " [", m, "]")
ENDIF
ENDREPEAT
IF NOT bFoundAHeadshot
SCRIPT_ASSERT("HEADSHOT_KILL_DETECTED called without finding valid stat")
ENDIF
ENDPROC
PROC INNOCENT_PED_KILLED()
INT i= 0
REPEAT g_iMissionStatsBeingTracked i
ENUM_MISSION_STATS m = g_MissionStatTrackingArray[i].target
//#IF NOT USE_CLF_DLC
IF g_MissionStatTrackingPrototypes[m].type = MISSION_STAT_TYPE_INNOCENTS_KILLED
//#ENDIF
//#IF USE_CLF_DLC
// IF g_DLCMissionStatTrackingPrototypes[m].type = MISSION_STAT_TYPE_INNOCENTS_KILLED
//#ENDIF
g_MissionStatTrackingArray[i].ivalue += 1
ENDIF
ENDREPEAT
ENDPROC
PROC UPDATE_DEATH_TRIGGERS()
//nothing to update
IF g_StatSystemWeponpoolEntries = 0
AND g_StatSystemDeadpoolEntries = 0
AND g_iFinanceLookupLogged = 0
AND g_iEntityWatchListLoggedCount = 0
AND !g_bTrackingInnocentsLogged
#IF IS_DEBUG_BUILD
bDrawWatchlist = FALSE
#ENDIF
EXIT
ENDIF
INT i,j,found
EVENT_NAMES eventType
STRUCT_ENTITY_ID sei
ENTITY_INDEX soi
WEAPON_TYPE wep
MODEL_NAMES mn
BOOL done
RELATIONSHIP_TYPE relgo
INT fiscalDamage = 0
INT ewlindex //ent watch list index for headshots
IF g_iEntityWatchListLoggedCount > 0
i = 0
REPEAT MAX_ENTITY_WATCH_LIST_ENTRIES i
IF g_EntityWatchList[i].index != NULL
IF NOT DOES_ENTITY_EXIST(g_EntityWatchList[i].index)
g_EntityWatchList[i].index = NULL
--g_iEntityWatchListLoggedCount
ENDIF
ENDIF
ENDREPEAT
ENDIF
PED_INDEX inped
PED_TYPE pedTypeValue
i = 0
REPEAT GET_NUMBER_OF_EVENTS(SCRIPT_EVENT_QUEUE_AI) i
eventType = GET_EVENT_AT_INDEX(SCRIPT_EVENT_QUEUE_AI, i)
SWITCH (eventType)
CASE EVENT_ENTITY_DESTROYED
GET_EVENT_DATA(SCRIPT_EVENT_QUEUE_AI,i, sei,SIZE_OF(STRUCT_ENTITY_ID))
IF DOES_ENTITY_EXIST(sei.EntityId)
IS_ENTITY_DEAD(sei.EntityId) //it is dead or it wouldn't be on the destroyed list
//but we have to check anyway to prevent assert
CPRINTLN(DEBUG_MISSION_STATS, "")
CPRINTLN(DEBUG_MISSION_STATS, "KILL STATS TRACKING - Dead entity on watch list")
IF g_iFinanceLookupLogged > 0
mn = GET_ENTITY_MODEL(sei.EntityId)
j = 0
REPEAT g_iFinanceLookupLogged j
IF g_FinanaceLookup[j].target = mn
fiscalDamage += g_FinanaceLookup[j].value
ENDIF
ENDREPEAT
ENDIF
IF IS_ENTITY_A_PED(sei.EntityId)//is a ped
AND GET_PED_INDEX_FROM_ENTITY_INDEX(sei.EntityId) != PLAYER_PED_ID()
soi = GET_PED_SOURCE_OF_DEATH(GET_PED_INDEX_FROM_ENTITY_INDEX(sei.EntityId))
//GET_PED_SOURCE_OF_DEATH (killer id)
//GET_PED_CAUSE_OF_DEATH (weapon enum)
//GET_PED_TIME_OF_DEATH (time)
BOOL bVehKill
bVehKill = FALSE
IF DOES_ENTITY_EXIST(soi)
IF IS_ENTITY_A_VEHICLE(soi)
VEHICLE_INDEX vehTemp
CPRINTLN(DEBUG_MISSION_STATS, "KILL STATS TRACKING - vehicle death detected")
IF IS_PED_IN_ANY_VEHICLE(PLAYER_PED_ID())
vehTemp = GET_VEHICLE_PED_IS_IN(PLAYER_PED_ID())
ELSE
vehTemp = GET_PLAYERS_LAST_VEHICLE()
ENDIF
IF DOES_ENTITY_EXIST(vehTemp)
AND GET_VEHICLE_INDEX_FROM_ENTITY_INDEX(soi) = vehTemp
CPRINTLN(DEBUG_MISSION_STATS, "KILL STATS TRACKING - vehicle death with players vehicle")
bVehKill = TRUE
ENDIF
ENDIF
ENDIF
IF (IS_ENTITY_A_PED(soi) AND GET_PLAYER_PED(GET_PLAYER_INDEX()) = GET_PED_INDEX_FROM_ENTITY_INDEX(soi))//ped vs ped and is player
OR bVehKill
IF IS_ENTITY_A_PED(soi)
//killed by a ped with a weapon
wep = GET_PED_CAUSE_OF_DEATH(GET_PED_INDEX_FROM_ENTITY_INDEX(sei.EntityId))
//check for headshot
IF g_iEntityWatchListLoggedCount > 0
ewlindex = IS_ENTITY_IN_WATCH_LIST(sei.EntityId)
IF ewlindex != -1
GET_PED_LAST_DAMAGE_BONE(GET_PED_INDEX_FROM_ENTITY_INDEX(g_EntityWatchList[ewlindex].index), pbt)
IF pbt = BONETAG_HEAD
OR pbt = BONETAG_NECK
IF wep != WEAPONTYPE_INVALID
AND wep != WEAPONTYPE_UNARMED
CPRINTLN(DEBUG_MISSION_STATS, "KILL STATS TRACKING - headshot detected with valid weapon ", GET_THE_WEAPON_NAME(wep))
HEADSHOT_KILL_DETECTED()
g_EntityWatchList[ewlindex].index = NULL
--g_iEntityWatchListLoggedCount
ELSE
CPRINTLN(DEBUG_MISSION_STATS, "KILL STATS TRACKING - headshot detected, but with INVALID weapon ", GET_THE_WEAPON_NAME(wep))
ENDIF
ENDIF
ENDIF
ENDIF
//do wepkill test
IF g_StatSystemWeponpoolEntries > 0
j = 0
REPEAT g_StatSystemWeponpoolEntries j//weppool is contiguous
IF g_StatSystemWeaponpool[j].weptar = wep
//auto increment
CPRINTLN(DEBUG_MISSION_STATS, "Weapon pool stat auto increment attempt. Wep: ",wep," stat: ", g_StatSystemWeaponpool[j].statar)
INFORM_MISSION_STATS_OF_INCREMENT(g_StatSystemWeaponpool[j].statar)
ENDIF
ENDREPEAT
ENDIF
ELSE
CPRINTLN(DEBUG_MISSION_STATS, "KILL STATS TRACKING - soi is not a ped")
ENDIF
//check for innocent
IF g_bTrackingInnocentsLogged
//"We would like to track the number of Innocent
//Pedestrians killed in every mission.
//We define innocent pedestrians by peds
//who are not hostile towards the player.
//Any enemies with red blips attached to
//them or any cops when on a wanted level
//should be considered enemies,
//anyone else should be innocent."
inped = GET_PED_INDEX_FROM_ENTITY_INDEX(sei.EntityId)
pedTypeValue = GET_PED_TYPE(inped)
//IF GET_PED_TYPE(GET_PED_INDEX_FROM_ENTITY_INDEX(sei.EntityId)) != PEDTYPE_MISSION//PEDTYPE_MISSION
IF NOT IS_ENTITY_A_MISSION_ENTITY(sei.EntityId)
/*AND (
GET_PED_TYPE(GET_PED_INDEX_FROM_ENTITY_INDEX(sei.EntityId)) = PEDTYPE_CIVFEMALE
OR GET_PED_TYPE(GET_PED_INDEX_FROM_ENTITY_INDEX(sei.EntityId)) = PEDTYPE_CIVMALE
OR GET_PED_TYPE(GET_PED_INDEX_FROM_ENTITY_INDEX(sei.EntityId)) = PEDTYPE_FIRE
OR GET_PED_TYPE(GET_PED_INDEX_FROM_ENTITY_INDEX(sei.EntityId)) = PEDTYPE_MEDIC
OR GET_PED_TYPE(GET_PED_INDEX_FROM_ENTITY_INDEX(sei.EntityId)) = PEDTYPE_PROSTITUTE
)*/
AND (
(NOT (pedTypeValue = PEDTYPE_CRIMINAL))
AND (NOT (pedTypeValue = PEDTYPE_DEALER))
AND (NOT (pedTypeValue = PEDTYPE_GANG_CHINESE_JAPANESE))
AND (NOT (pedTypeValue = PEDTYPE_GANG_PUERTO_RICAN))
AND (NOT (pedTypeValue = PEDTYPE_SWAT))
AND (NOT (pedTypeValue = PEDTYPE_ARMY))
AND (NOT (pedTypeValue = PEDTYPE_ANIMAL))
)
relgo = GET_RELATIONSHIP_BETWEEN_PEDS(GET_PLAYER_PED(GET_PLAYER_INDEX()), GET_PED_INDEX_FROM_ENTITY_INDEX(sei.EntityId))
SWITCH relgo
CASE ACQUAINTANCE_TYPE_PED_NONE FALLTHRU
CASE ACQUAINTANCE_TYPE_PED_RESPECT FALLTHRU
CASE ACQUAINTANCE_TYPE_PED_LIKE FALLTHRU
CASE ACQUAINTANCE_TYPE_PED_IGNORE
IF IS_PED_HUMAN(GET_PED_INDEX_FROM_ENTITY_INDEX(sei.EntityId))
//AND(NOT IS_ENTITY_A_MISSION_ENTITY(sei.EntityId))
CPRINTLN(DEBUG_MISSION_STATS, "KILL STATS TRACKING - innocent ped killed")
INNOCENT_PED_KILLED()
ENDIF
BREAK
DEFAULT
CPRINTLN(DEBUG_MISSION_STATS, "KILL STATS TRACKING - Ped was agressive towards player, not counted towards innocents killed")
BREAK
ENDSWITCH
#IF IS_DEBUG_BUILD
ELSE
CPRINTLN(DEBUG_MISSION_STATS, "KILL STATS TRACKING - Ped was invalid type for innocent check")
#ENDIF
ENDIF
ENDIF
//do deadpool test
IF g_StatSystemDeadpoolEntries > 0
j = 0
found = g_StatSystemDeadpoolEntries
done = FALSE
CPRINTLN(DEBUG_MISSION_STATS, "KILL STATS TRACKING - g_StatSystemDeadpoolEntries > 0")
WHILE !done
IF g_StatSystemDeadpool[j].entar != null
IF DOES_ENTITY_EXIST(g_StatSystemDeadpool[j].entar)
//it actually exists, was it killed?
IF IS_ENTITY_DEAD(g_StatSystemDeadpool[j].entar)
IF g_StatSystemDeadpool[j].entar = sei.EntityId
//it was the targeted ped!
//Remove from list and do increment
CPRINTLN(DEBUG_MISSION_STATS, "Dead pool stat auto increment attempt. stat: ", g_StatSystemDeadpool[j].statar)
INFORM_MISSION_STATS_OF_INCREMENT(g_StatSystemDeadpool[j].statar)
g_StatSystemDeadpool[j].entar = null
ENDIF
ENDIF
ELSE //doesn't exist, purge from dead list
g_StatSystemDeadpool[j].entar = null
ENDIF
--found
ENDIF
++j
IF j = STAT_DEADPOOL_DEPTH
OR found = 0
done = TRUE
ENDIF
ENDWHILE
//clean up the deadpool if needed
IF g_StatSystemDeadpoolEntries > 0
WHILE ((g_StatSystemDeadpool[g_StatSystemDeadpoolEntries-1].entar = null)
AND (g_StatSystemDeadpoolEntries > 1))
IF g_StatSystemDeadpoolEntries > 1
--g_StatSystemDeadpoolEntries
CPRINTLN(DEBUG_MISSION_STATS, "stat watcher cleanup deadpool list reduced to ", g_StatSystemDeadpoolEntries)
ENDIF
ENDWHILE
ENDIF
ELSE
CPRINTLN(DEBUG_MISSION_STATS, "KILL STATS TRACKING - g_StatSystemDeadpoolEntries <= 0")
ENDIF
ELSE //ELSE//hit by car
#IF IS_DEBUG_BUILD
IF IS_ENTITY_A_PED(soi)
IF GET_PLAYER_PED(GET_PLAYER_INDEX()) = GET_PED_INDEX_FROM_ENTITY_INDEX(soi)
CPRINTLN(DEBUG_MISSION_STATS, "KILL STATS TRACKING - soi is ped, soi is player??")
ELSE
CPRINTLN(DEBUG_MISSION_STATS, "KILL STATS TRACKING - soi is ped, soi is not player??")
ENDIF
ELIF IS_ENTITY_A_VEHICLE(soi)
CPRINTLN(DEBUG_MISSION_STATS, "KILL STATS TRACKING - soi is not ped [vehicle], soi cannot be player??")
ELIF IS_ENTITY_AN_OBJECT(soi)
CPRINTLN(DEBUG_MISSION_STATS, "KILL STATS TRACKING - soi is not ped [object], soi cannot be player??")
ELSE
CPRINTLN(DEBUG_MISSION_STATS, "KILL STATS TRACKING - soi is not ped [other], soi cannot be player??")
ENDIF
#ENDIF
ENDIF
ENDIF
ENDIF
BREAK
ENDSWITCH
ENDREPEAT
IF fiscalDamage > 0
//update damage table stats
UPDATE_DAMAGE_TABLE_STATS(fiscalDamage)
ENDIF
ENDPROC
//INT lam1ArmourDelta = 0
PROC UPDATE_TRACKER()
UPDATE_DEATH_TRIGGERS()
//IF (NOT IS_PLAYER_DEAD(GET_PLAYER_INDEX()))// AND (NOT )
//IF g_bMissionStatSystemSequenceStatus AND IS_PLAYER_SCRIPT_CONTROL_ON(GET_PLAYER_INDEX()) AND (NOT IS_CUTSCENE_ACTIVE()) AND (NOT IS_PAUSE_MENU_ACTIVE())
IF g_bMissionStatSystemSequenceStatus AND IS_PLAYER_PLAYING(GET_PLAYER_INDEX()) AND (NOT IS_CUTSCENE_ACTIVE()) AND (NOT IS_PAUSE_MENU_ACTIVE())
CPRINTLN(DEBUG_MISSION_STATS, "Mission_stat_watcher.sc: Mission timer is currently paused by script while the player has control, this should not be the case if a sequence is not running. Please call INFORM_MISSION_STATS_SYSTEM_OF_INGAME_CUTSCENE_END().\n")
g_bMissionStatSystemSequenceStatus = FALSE
ENDIF
//ENDIF
//ENDIF
IF g_bMissionStatTimeDeltaReset
g_bMissionStatTimeDeltaReset = FALSE
//iTimeLastUpdate = GET_GAME_TIMER()
//iTimeThisUpdate = iTimeLastUpdate
iTimeDeltaThisUpdate = 0
ELSE
ENDIF
BOOL bDoTimer = TRUE
BOOL bDoSpeed = TRUE
IF IS_PAUSE_MENU_ACTIVE()
bDoTimer = FALSE
ENDIF
IF NOT HAS_CUTSCENE_FINISHED()
bDoTimer = FALSE
bDoSpeed = FALSE
ENDIF
IF g_bMissionStatSystemSequenceStatus
bDoTimer = FALSE
bDoSpeed = FALSE
ENDIF
IF NOT IS_PLAYER_CONTROL_ON(GET_PLAYER_INDEX())
bDoTimer = FALSE
bDoSpeed = FALSE
ENDIF
IF bDoTimer //1522664
iTimeDeltaThisUpdate = ROUND(GET_FRAME_TIME() * 1000.0)
/*
iTimeThisUpdate = GET_GAME_TIMER()
IF iTimeThisUpdate > iTimeLastUpdate
iTimeDeltaThisUpdate = iTimeThisUpdate - iTimeLastUpdate
CPRINTLN(DEBUG_MISSION_STATS, "WINDOWED TIMER DEBUG - iTimeDeltaThisUpdate is: ", iTimeDeltaThisUpdate)
g_LeaderboardLastMissionBestTime += iTimeDeltaThisUpdate
ELSE
iTimeDeltaThisUpdate = 0
CPRINTLN(DEBUG_MISSION_STATS, "WINDOWED TIMER DEBUG - iTimeDeltaThisUpdate set to 0 as iTimeThisUpdate <= iTimeLastUpdate")
ENDIF
iTimeLastUpdate = iTimeThisUpdate
*/
//ELSE //stall
//iTimeThisUpdate = GET_GAME_TIMER()
//iTimeLastUpdate = iTimeThisUpdate
ENDIF
//IF NOT IS_PLAYER_DEAD(GET_PLAYER_INDEX())
//IS_CUTSCENE_ACTIVE()
/*
IF ((IS_PAUSE_MENU_ACTIVE() OR (NOT HAS_CUTSCENE_FINISHED()) OR g_bMissionStatSystemSequenceStatus))
//AND IS_PLAYER_CONTROL_ON(GET_PLAYER_INDEX())
INT ithis = iTimeThisUpdate
//GET_GAME_TIMER()
//iTimeLastUpdate = iTimeThisUpdate
iTimeThisUpdate = GET_GAME_TIMER()
IF iTimeThisUpdate > iTimeLastUpdate
iTimeLastUpdate = ithis
iTimeDeltaThisUpdate = iTimeThisUpdate - iTimeLastUpdate
g_LeaderboardLastMissionBestTime += iTimeDeltaThisUpdate
ELSE
iTimeDeltaThisUpdate = 0
ENDIF
ELSE
iTimeLastUpdate = GET_GAME_TIMER()
iTimeThisUpdate = iTimeLastUpdate
iTimeDeltaThisUpdate = 0
ENDIF
*/
//ENDIF
//single entity health delta
/*
REPEAT g_iMissionStatsBeingTracked i
IF specificTarget = UNSET_MISSION_STAT_ENUM
OR g_MissionStatTrackingArray[i].target = specificTarget
IF g_MissionStatTrackingArray[i].TrackingEntity != in
g_MissionStatTrackingArray[i].TrackingEntity = in
g_MissionStatTrackingArray[i].bTrackingEntityChanged = TRUE
g_MissionStatTrackingArray[index].iTrackingDelta = 0
ENDIF
ENDIF
*/
/*
IF NOT (g_MissionStatSingleDamageWatchEntity = NULL)
IF DOES_ENTITY_EXIST(g_MissionStatSingleDamageWatchEntity)
IF NOT (IS_ENTITY_DEAD(g_MissionStatSingleDamageWatchEntity))
AND (IS_CURRENTLY_ON_MISSION_TO_TYPE(MISSION_TYPE_STORY)
OR IS_CURRENTLY_ON_MISSION_TO_TYPE(MISSION_TYPE_RANDOM_CHAR))
IF g_bMissionDamageStatEntityChanged = FALSE
iHealthLastTick = iHealthThisTick
IF g_MissionStatSingleDamageWatchStat = LAM1_UNMARKED
IF IS_ENTITY_A_PED(g_MissionStatSingleDamageWatchEntity)
INT newarm = GET_PED_ARMOUR(GET_PED_INDEX_FROM_ENTITY_INDEX(g_MissionStatSingleDamageWatchEntity))
INT newhealth = GET_ENTITY_HEALTH(g_MissionStatSingleDamageWatchEntity)
IF newarm < lam1ArmourDelta
//some or all of the damage was taken to armour
INT armourchange = lam1ArmourDelta - newarm
INT healthchange =iHealthLastTick - newhealth
IF healthchange > armourchange
//damage was taken to health
iHealthThisTick = iHealthLastTick - (healthchange - armourchange)
CPRINTLN(DEBUG_MISSION_STATS, "Lam 1 specific health delta override is : t ", iHealthThisTick, " : l ", iHealthLastTick)
ENDIF
ELSE
iHealthThisTick = GET_ENTITY_HEALTH(g_MissionStatSingleDamageWatchEntity)
ENDIF
ELSE
iHealthThisTick = GET_ENTITY_HEALTH(g_MissionStatSingleDamageWatchEntity)
ENDIF
ELSE
iHealthThisTick = GET_ENTITY_HEALTH(g_MissionStatSingleDamageWatchEntity)
ENDIF
iHealthDelta = iHealthThisTick - iHealthLastTick
ELSE
iHealthThisTick = GET_ENTITY_HEALTH(g_MissionStatSingleDamageWatchEntity)
iHealthDelta = iHealthThisTick
IF g_MissionStatSingleDamageWatchStat = LAM1_UNMARKED
IF IS_ENTITY_A_PED(g_MissionStatSingleDamageWatchEntity)
//PED_INDEX pedarm = GET_PED_FROM_ENTITY()
lam1ArmourDelta = GET_PED_ARMOUR(GET_PED_INDEX_FROM_ENTITY_INDEX(g_MissionStatSingleDamageWatchEntity))
ENDIF
ENDIF
g_bMissionDamageStatEntityChanged = FALSE
ENDIF
ENDIF
ENDIF
ENDIF
*/
//for each registered stat
INT i = 0
FLOAT fSpeed = 0
REPEAT g_iMissionStatsBeingTracked i
IF ENUM_TO_INT(g_MissionStatTrackingArray[i].target) >= 0
ENUM_MISSION_STAT_TYPES eType = g_MissionStatTrackingPrototypes[g_MissionStatTrackingArray[i].target].type
// IF bUSE_ASSASSIN_OR_CLF_DLC
// #IF USE_CLF_DLC
// eType = g_DLCMissionStatTrackingPrototypes[g_MissionStatTrackingArray[i].target].type
// #ENDIF
// #IF NOT USE_CLF_DLC
// #if not USE_NRM_DLC
// eType = g_dlcAssasinationStatConfig.type[i]
// #ENDIF
// #endif
// ENDIF
SWITCH eType
CASE MISSION_STAT_TYPE_SINGLE_ENTITY_DAMAGE_THRESHOLD
IF g_MissionStatTrackingArray[i].TrackingEntity != NULL
IF g_MissionStatTrackingArray[i].bTrackingEntityChanged = TRUE
CDEBUG3LN(DEBUG_MISSION_STATS, "track damage entity [", SAFE_GET_MISSION_STAT_NAME(g_MissionStatTrackingArray[i].target), "] - bTrackingEntityChanged is TRUE")
g_MissionStatTrackingArray[i].iTrackingDelta = 0
g_MissionStatTrackingArray[i].ivalue = 0
g_MissionStatTrackingArray[i].bTrackingEntityChanged = FALSE
ELSE
IF DOES_ENTITY_EXIST(g_MissionStatTrackingArray[i].TrackingEntity)
IF NOT IS_ENTITY_DEAD(g_MissionStatTrackingArray[i].TrackingEntity)
iHealthLastTick = g_MissionStatTrackingArray[i].iTrackingDelta
iHealthThisTick = GET_ENTITY_HEALTH(g_MissionStatTrackingArray[i].TrackingEntity)
iHealthDelta = iHealthLastTick - iHealthThisTick
CDEBUG1LN(DEBUG_MISSION_STATS, "track damage ", GET_MODEL_NAME_FOR_DEBUG(GET_ENTITY_MODEL(g_MissionStatTrackingArray[i].TrackingEntity)), " [", SAFE_GET_MISSION_STAT_NAME(g_MissionStatTrackingArray[i].target),
"] - iTrackingDelta ", g_MissionStatTrackingArray[i].iTrackingDelta,
", ivalue ", g_MissionStatTrackingArray[i].ivalue,
", iHealthDelta ", iHealthDelta,
" [iHealthLastTick:", iHealthLastTick,
"- iHealthThisTick ", iHealthThisTick, "]")
IF iHealthDelta > 0 //health lost
g_MissionStatTrackingArray[i].ivalue += iHealthDelta
//B* 1717661: If the value is negative, flip the sign (should never get here though)
IF g_MissionStatTrackingArray[i].ivalue <0
CASSERTLN(debug_mission_stats,"Tracked entity damage very big, reached negative values: ",g_MissionStatTrackingArray[i].ivalue)
g_MissionStatTrackingArray[i].ivalue *= -1
ENDIF
ENDIF
g_MissionStatTrackingArray[i].iTrackingDelta = iHealthThisTick
ELSE
CDEBUG3LN(DEBUG_MISSION_STATS, "track damage entity [", SAFE_GET_MISSION_STAT_NAME(g_MissionStatTrackingArray[i].target), "] - TrackingEntity is DEAD")
ENDIF
ELSE
CDEBUG3LN(DEBUG_MISSION_STATS, "track damage entity [", SAFE_GET_MISSION_STAT_NAME(g_MissionStatTrackingArray[i].target), "] - TrackingEntity doesn't exist")
g_MissionStatTrackingArray[i].TrackingEntity = NULL
ENDIF
ENDIF
ELSE
CDEBUG3LN(DEBUG_MISSION_STATS, " track damage entity [", SAFE_GET_MISSION_STAT_NAME(g_MissionStatTrackingArray[i].target), "] - TrackingEntity is NULL")
ENDIF
/*
//Change this
//if the watch entity has taken damage
IF iHealthDelta < 0
//for damage health delta will be negative
IF g_MissionStatSingleDamageWatchStat = UNSET_MISSION_STAT_ENUM//general mode
g_MissionStatTrackingArray[i].ivalue += -iHealthDelta
ELIF g_MissionStatSingleDamageWatchStat = g_MissionStatTrackingArray[i].target
//specific mode
g_MissionStatTrackingArray[i].ivalue += -iHealthDelta
ENDIF
CDEBUG3LN(DEBUG_MISSION_STATS, "Damage tracking delta ", g_MissionStatTrackingArray[i].ivalue, " had ", iHealthDelta, "added" )
ENDIF
*/
BREAK
CASE MISSION_STAT_TYPE_TOTALTIME
//update timer value if needed
g_MissionStatTrackingArray[i].ivalue += iTimeDeltaThisUpdate
/*
CPRINTLN(DEBUG_MISSION_STATS, "Mission stat time track tick, total: ")
PRINTINT(g_MissionStatTrackingArray[i].ivalue)
PRINTNL()
CPRINTLN(DEBUG_MISSION_STATS, "Delta: ")
PRINTINT(iTimeDeltaThisUpdate)
PRINTNL()
*/
BREAK
CASE MISSION_STAT_TYPE_ACTION_CAM_USE
//update time value if action cam is active and being watched
IF g_bMissionStatSystemActionCamWatchStatus
g_MissionStatTrackingArray[i].ivalue += iTimeDeltaThisUpdate
ENDIF
BREAK
CASE MISSION_STAT_TYPE_UNIQUE_BOOL
//no tracking needed for this type, mission pushed
BREAK
CASE MISSION_STAT_TYPE_WINDOWED_TIMER
IF g_bMissionStatTimeWindowGate
IF g_eCurrentTimeWindowTarget = UNSET_MISSION_STAT_ENUM
OR g_MissionStatTrackingArray[i].target = g_eCurrentTimeWindowTarget
IF g_MissionStatTrackingArray[i].target = FRA0_DOGCAM
OR g_MissionStatTrackingArray[i].target = EXL2_TIME_AS_CHOP
OR g_MissionStatTrackingArray[i].target = FRA0_DOGGY_STYLE
OR g_MissionStatTrackingArray[i].target = FAM4_LAZLOW_CAM_USE
g_MissionStatTrackingArray[i].ivalue += ROUND(GET_FRAME_TIME() * 1000.0)
ELSE
g_MissionStatTrackingArray[i].ivalue += iTimeDeltaThisUpdate
ENDIF
ENDIF
ENDIF
BREAK
CASE MISSION_STAT_TYPE_SINGLE_ENTITY_SPEED_THRESHOLD
IF bDoSpeed
IF (g_MissionStatSpeedWatchEntitySpecific = UNSET_MISSION_STAT_ENUM)
OR (g_MissionStatSpeedWatchEntitySpecific = g_MissionStatTrackingArray[i].target)
IF NOT (g_MissionStatSingleSpeedWatchEntity = NULL)
IF DOES_ENTITY_EXIST(g_MissionStatSingleSpeedWatchEntity)
IF NOT (IS_ENTITY_DEAD(g_MissionStatSingleSpeedWatchEntity))
IF (IS_ENTITY_A_VEHICLE(g_MissionStatSingleSpeedWatchEntity))
fSpeed = GET_ENTITY_SPEED(g_MissionStatSingleSpeedWatchEntity)
IF fSpeed > g_MissionStatTrackingArray[i].fvalue
g_MissionStatTrackingArray[i].fvalue = fSpeed
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
BREAK
CASE MISSION_STAT_TYPE_HEADSHOTS
//parse for headshots since last time
//this is now done in UPDATE_DEATH_TRIGGERS
//PARSE_LISTS_FOR_HEADSHOTS(i)
BREAK
CASE MISSION_STAT_TYPE_FRACTION
//no tracking for this type, mission uploaded
BREAK
CASE MISSION_STAT_TYPE_ACCURACY
//Track accuracy percentage //do nothing since this is tallied at the start and the end now
//UPDATE_ACCURACY_METRIC()
//g_MissionStatTrackingArray[i].fvalue = AccuracyTracker
BREAK
CASE MISSION_STAT_TYPE_FINANCE_TABLE
//this is now done in UPDATE_DEATH_TRIGGERS
//g_MissionStatTrackingArray[i].fvalue += UPDATE_FINANCE_TABLE_METRIC()
BREAK
CASE MISSION_STAT_TYPE_FINANCE_DIRECT
//no tracking for this type, mission uploaded
BREAK
CASE MISSION_STAT_TYPE_PURE_COUNT
CASE MISSION_STAT_TYPE_PURE_COUNT_PERCENTAGE
CASE MISSION_STAT_TYPE_PURE_COUNT_DISTANCE
//no tracking for this type, mission uploaded
BREAK
CASE MISSION_STAT_TYPE_INNOCENTS_KILLED
//this is now done in UPDATE_DEATH_TRIGGERS
//g_MissionStatTrackingArray[i].ivalue += GET_INNOCENTS_KILLED_SINCE_LAST_CHECK()
BREAK
CASE MISSION_STAT_TYPE_SPECIAL_ABILITY_USE
IF IS_PLAYER_PED_PLAYABLE(GET_CURRENT_PLAYER_PED_ENUM())
IF IS_SPECIAL_ABILITY_ACTIVE(GET_PLAYER_INDEX())
AND IS_SPECIAL_ABILITY_ENABLED(GET_PLAYER_INDEX())
g_MissionStatTrackingArray[i].ivalue += iTimeDeltaThisUpdate
ENDIF
ENDIF
BREAK
CASE MISSION_STAT_TYPE_BULLETS_FIRED
//tracked at start and end
BREAK
DEFAULT
SCRIPT_ASSERT("mission_stat_watcher->UPDATE_TRACKER attempting to update an unrecognised type")
BREAK
ENDSWITCH
ENDIF
ENDREPEAT
ENDPROC
/// RETURNS:
/// TRUE if stat is hidden, and false otherwise
FUNC BOOL UPLOAD_DATA_FOR_TRACKED_STAT(END_SCREEN_DATASET &esdIN, INT index)
FLOAT fpassed = 0
FLOAT successPercentage = 0
IF ENUM_TO_INT(g_MissionStatTrackingArray[index].target) >= 0
ELSE
SCRIPT_ASSERT("UPLOAD_DATA_FOR_TRACKED_STAT - ENUM_TO_INT(g_MissionStatTrackingArray[index].target) < 0")
RETURN FALSE
ENDIF
MissionStatInfo sMissionStatTrackingPrototype
// #IF USE_CLF_DLC
// sMissionStatTrackingPrototype = g_DLCMissionStatTrackingPrototypes[g_MissionStatTrackingArray[index].target]
// #ENDIF
// #IF USE_NRM_DLC
// sMissionStatTrackingPrototype = g_DLCMissionStatTrackingPrototypes[g_MissionStatTrackingArray[index].target]
// #ENDIF
//
// #IF NOT USE_CLF_DLC
// #if not USE_NRM_DLC
sMissionStatTrackingPrototype = g_MissionStatTrackingPrototypes[g_MissionStatTrackingArray[index].target]
// #ENDIF
// #endif
IF sMissionStatTrackingPrototype.type = MISSION_STAT_TYPE_BULLETS_FIRED
g_MissionStatTrackingArray[index].ivalue = overallBulletsMetric
CPRINTLN(DEBUG_MISSION_STATS, "UPLOAD_DATA_FOR_TRACKED_STAT: bullet total upload: ", overallBulletsMetric)
ENDIF
//if this is an accuracy stat then override with the accuracy value
IF sMissionStatTrackingPrototype.type = MISSION_STAT_TYPE_ACCURACY
g_MissionStatTrackingArray[index].fvalue = overallAccuracyMetric
CPRINTLN(DEBUG_MISSION_STATS, "UPLOAD_DATA_FOR_TRACKED_STAT: Overall accuracy upload: ", overallAccuracyMetric)
ENDIF
IF sMissionStatTrackingPrototype.type = MISSION_STAT_TYPE_PURE_COUNT_DISTANCE
g_MissionStatTrackingArray[index].ivalue = FLOOR(g_MissionStatTrackingArray[index].fvalue)
ENDIF
//figure out if this stat passed
//++attempted
// #IF USE_CLF_DLC
// IF GET_DLC_MISSION_STAT_PASS_STATUS_FOR_VALUE(INT_TO_ENUM(DLC_ASSASSINATION_STATS, ENUM_TO_INT(g_MissionStatTrackingArray[index].target)), g_MissionStatTrackingArray[index].ivalue)
// fpassed = 1
// ENDIF
// #ENDIF
// #IF USE_NRM_DLC
// IF GET_DLC_MISSION_STAT_PASS_STATUS_FOR_VALUE(INT_TO_ENUM(DLC_ASSASSINATION_STATS, ENUM_TO_INT(g_MissionStatTrackingArray[index].target)), g_MissionStatTrackingArray[index].ivalue)
// fpassed = 1
// ENDIF
// #ENDIF
// #IF NOT USE_CLF_DLC
// #if not USE_NRM_DLC
IF GET_MISSION_STAT_PASS_STATUS_FOR_VALUE(g_MissionStatTrackingArray[index].target, g_MissionStatTrackingArray[index].ivalue)
fpassed = 1
ENDIF
// #ENDIF
// #endif
#IF IS_DEBUG_BUILD
IF fpassed = 1.0
IF sMissionStatTrackingPrototype.less_than_threshold
CPRINTLN(DEBUG_MISSION_STATS, "Stat register index ", index, "UPLOAD_DATA_FOR_TRACKED_STAT: passed: ", g_MissionStatTrackingArray[index].ivalue, "/", sMissionStatTrackingPrototype.success_threshold, " Inverted")
ELSE
CPRINTLN(DEBUG_MISSION_STATS, "Stat register index ", index, "UPLOAD_DATA_FOR_TRACKED_STAT: passed: ", g_MissionStatTrackingArray[index].ivalue, "/", sMissionStatTrackingPrototype.success_threshold, " NOT inverted")
ENDIF
ELSE
IF sMissionStatTrackingPrototype.less_than_threshold
CPRINTLN(DEBUG_MISSION_STATS, "Stat register index ", index, "UPLOAD_DATA_FOR_TRACKED_STAT: failed: ", g_MissionStatTrackingArray[index].ivalue, "/", sMissionStatTrackingPrototype.success_threshold, " Inverted")
ELSE
CPRINTLN(DEBUG_MISSION_STATS, "Stat register index ", index, "UPLOAD_DATA_FOR_TRACKED_STAT: failed: ", g_MissionStatTrackingArray[index].ivalue, "/", sMissionStatTrackingPrototype.success_threshold, " NOT inverted")
ENDIF
ENDIF
#ENDIF
//CPRINTLN(DEBUG_MISSION_STATS, "<STAT WATCHER> Index ",index," invalidated state : ", g_MissionStatTrackingArray[index].invalidated)
//BOOL bInvState = g_MissionStatTrackingArray[index].invalidated
IF g_MissionStatTrackingArray[index].invalidationReason != MSSIR_VALID
fpassed = 0
ENDIF
//work out success percentage
IF NOT (sMissionStatTrackingPrototype.success_threshold = 0)
successPercentage = TO_FLOAT(FLOOR((TO_FLOAT(g_MissionStatTrackingArray[index].ivalue)/TO_FLOAT(sMissionStatTrackingPrototype.success_threshold))*100.0))
IF successPercentage > 100.0
successPercentage = 100.0
ENDIF
ENDIF
CPRINTLN(DEBUG_MISSION_STATS, "Stat success percentage: ", successPercentage)
//if the stat is better than the one stored in the stats then upload the new value!
INT oldvalue = GET_MISSION_STAT_STORED_VALUE(sMissionStatTrackingPrototype.statname)
BOOL bDoAnyway = FALSE
SWITCH g_MissionStatTrackingArray[index].target
CASE ASS1_MIRROR_MEDAL
CASE ASS2_MIRROR_MEDAL
CASE ASS4_MIRROR_MEDAL
CASE ASS3_MIRROR_MEDAL
CASE ASS5_MIRROR_MEDAL
bDoAnyway = TRUE
BREAK
CASE ASS4_MIRROR_PERCENTAGE
CASE ASS5_MIRROR_PERCENT
CASE ASS3_MIRROR_PERCENTAGE
CASE ASS1_MIRROR_PERCENT
CASE ASS2_MIRROR_PERCENT
bDoAnyway = TRUE
BREAK
ENDSWITCH
//CPRINTLN(DEBUG_MISSION_STATS, "<STATSET> checking invalidation status")
IF g_MissionStatTrackingArray[index].invalidationReason = MSSIR_VALID OR bDoAnyway
//CPRINTLN(DEBUG_MISSION_STATS, "<STATSET> checking threshold")
IF(sMissionStatTrackingPrototype.less_than_threshold)
//CPRINTLN(DEBUG_MISSION_STATS, "<STATSET> lessthan check ",oldvalue," > ",g_MissionStatTrackingArray[index].ivalue)
//should we log the stat? is it a record, or has it never been set?
IF oldvalue > g_MissionStatTrackingArray[index].ivalue OR oldvalue < 0 OR oldvalue = -1
//CPRINTLN(DEBUG_MISSION_STATS, "<STATSET> lessthan record, setting")
SET_MISSION_STAT_STORED_VALUE(g_MissionStatTrackingArray[index].ivalue, g_MissionStatTrackingArray[index].target)
ENDIF
ELSE
//CPRINTLN(DEBUG_MISSION_STATS, "<STATSET> greaterthan check ",g_MissionStatTrackingArray[index].ivalue," > ",oldvalue)
IF g_MissionStatTrackingArray[index].ivalue > oldvalue OR oldvalue < 0 OR oldvalue = -1
//CPRINTLN(DEBUG_MISSION_STATS, "<STATSET> greaterthan record, setting")
SET_MISSION_STAT_STORED_VALUE(g_MissionStatTrackingArray[index].ivalue, g_MissionStatTrackingArray[index].target)
ENDIF
ENDIF
ENDIF
//CPRINTLN(DEBUG_MISSION_STATS, "<STATSET> set phase complete")
INT hsupload = g_MissionStatTrackingArray[index].ivalue
IF sMissionStatTrackingPrototype.bHidden
#IF IS_DEBUG_BUILD
AND (NOT g_DEBUG_show_hidden_stats_on_mission_complete)
#ENDIF
CPRINTLN(DEBUG_MISSION_STATS, "A stat hidden, skipped\n ")
RETURN TRUE
ENDIF
END_SCREEN_CHECK_MARK_STATUS checkState = ESCM_UNCHECKED
IF fpassed = 1.0
++visiblesucceeded
checkState = ESCM_CHECKED
ENDIF
STRING name
// #IF USE_CLF_DLC
// name = GET_DLC_MISSION_STAT_NAME(INT_TO_ENUM(DLC_ASSASSINATION_STATS, ENUM_TO_INT(g_MissionStatTrackingArray[index].target)))
// #ENDIF
// #IF USE_NRM_DLC
//// name = GET_DLC_MISSION_STAT_NAME(INT_TO_ENUM(DLC_ZOMBIE_STATS, ENUM_TO_INT(g_MissionStatTrackingArray[index].target)))
// #ENDIF
//
// #IF NOT USE_CLF_DLC
// #if not use_NRM_DLC
name = GET_MISSION_STAT_NAME(g_MissionStatTrackingArray[index].target)
// #ENDIF
// #endif
IF g_MissionStatTrackingArray[index].invalidationReason != MSSIR_VALID
//Store mission invalidated stat, see 1762462
IF NOT IS_REPEAT_PLAY_ACTIVE()
SET_MISSION_STAT_STORED_VALUE(-1, g_MissionStatTrackingArray[index].target)
CDEBUG1LN(debug_mission_stats,"Non-replay mission stat invalidated, setting stored stat to -1")
ENDIF
STRING invalidationReason = "MTPHPERRET"
SWITCH g_MissionStatTrackingArray[index].invalidationReason
CASE MSSIR_CHEAT_ACTIVE
invalidationReason = "MTPHPERCHE"
BREAK
CASE MSSIR_SKIP
invalidationReason = "MTPHPERSKI"
BREAK
CASE MSSIR_TAXI_USED
invalidationReason = "MTPHPERTAX"
BREAK
CASE MSSIR_NOT_SET
invalidationReason = "MTPHPERNOREC"
BREAK
ENDSWITCH
IF eLastInvalidationReasonShown = g_MissionStatTrackingArray[index].invalidationReason
invalidationReason = ""
ENDIF
eLastInvalidationReasonShown = g_MissionStatTrackingArray[index].invalidationReason
ADD_ENDSCREEN_DATASET_CONTENT_ELEMENT(esdIN,
ESEF_RAW_STRING,
name,
invalidationReason,
g_MissionStatTrackingArray[index].ivalue,
0,
ESCM_INVALIDATED)
ELSE
INT iTemp
eLastInvalidationReasonShown = MSSIR_VALID
SWITCH sMissionStatTrackingPrototype.type
CASE MISSION_STAT_TYPE_TOTALTIME
ADD_ENDSCREEN_DATASET_CONTENT_ELEMENT(esdIN,
ESEF_TIME_H_M_S,
name,
"",
g_MissionStatTrackingArray[index].ivalue,
0,
checkState)
BREAK
CASE MISSION_STAT_TYPE_ACTION_CAM_USE
//this is a time stat
//IF NOT sMissionStatTrackingPrototype[g_MissionStatTrackingArray[index].invalidated
//UPLOAD_TIME_STAT_FROM_MS(index,fpassed,g_MissionStatTrackingArray[index].ivalue,ACTION_CAM_STAT_NAMES(g_MissionStatTrackingArray[index].target))//g_MissionStatTrackingArray[index].target))
//ELSE
//Upload invalidation entry
//ENDIF
ADD_ENDSCREEN_DATASET_CONTENT_ELEMENT(esdIN,
ESEF_TIME_M_S,
name,
"",
g_MissionStatTrackingArray[index].ivalue,
0,
checkState)
BREAK
CASE MISSION_STAT_TYPE_UNIQUE_BOOL
ADD_ENDSCREEN_DATASET_CONTENT_ELEMENT(esdIN,
ESEF_NAME_ONLY,
name,
"",
g_MissionStatTrackingArray[index].ivalue,
0,
checkState)
BREAK
CASE MISSION_STAT_TYPE_WINDOWED_TIMER
CASE MISSION_STAT_TYPE_SPECIAL_ABILITY_USE
ADD_ENDSCREEN_DATASET_CONTENT_ELEMENT(esdIN,
ESEF_TIME_M_S,
name,
"",
g_MissionStatTrackingArray[index].ivalue,
0,
checkState)
BREAK
CASE MISSION_STAT_TYPE_SINGLE_ENTITY_SPEED_THRESHOLD
//upload as percentage for now
//g_MissionStatTrackingArray[index].target)
ADD_ENDSCREEN_DATASET_CONTENT_ELEMENT(esdIN,
ESEF_RAW_PERCENT,
name,
"",
CEIL(TO_FLOAT(g_MissionStatTrackingArray[index].ivalue)/TO_FLOAT(sMissionStatTrackingPrototype.success_threshold)*100),
0,
checkState)
BREAK
CASE MISSION_STAT_TYPE_SINGLE_ENTITY_DAMAGE_THRESHOLD
//upload as a bool for now
ADD_ENDSCREEN_DATASET_CONTENT_ELEMENT(esdIN,
ESEF_NAME_ONLY,
name,
"",
g_MissionStatTrackingArray[index].ivalue,
0,
checkState)
BREAK
CASE MISSION_STAT_TYPE_HEADSHOTS
IF hsupload > sMissionStatTrackingPrototype.success_threshold
hsupload = sMissionStatTrackingPrototype.success_threshold
ENDIF
ADD_ENDSCREEN_DATASET_CONTENT_ELEMENT(esdIN,
ESEF_FRACTION,
name,
"",
hsupload,
sMissionStatTrackingPrototype.success_threshold,
checkState)
BREAK
CASE MISSION_STAT_TYPE_FRACTION
iTemp = g_MissionStatTrackingArray[index].ivalue
IF iTemp > sMissionStatTrackingPrototype.success_threshold
iTemp = sMissionStatTrackingPrototype.success_threshold
ENDIF
ADD_ENDSCREEN_DATASET_CONTENT_ELEMENT(esdIN,
ESEF_FRACTION,
name,
"",
iTemp,
sMissionStatTrackingPrototype.success_threshold,
checkState)
BREAK
CASE MISSION_STAT_TYPE_ACCURACY
//g_MissionStatTrackingArray[index].target)
ADD_ENDSCREEN_DATASET_CONTENT_ELEMENT(esdIN,
ESEF_RAW_PERCENT,
name,
"",
ROUND(g_MissionStatTrackingArray[index].fvalue),
0,
checkState)
BREAK
CASE MISSION_STAT_TYPE_PURE_COUNT
CASE MISSION_STAT_TYPE_BULLETS_FIRED
CASE MISSION_STAT_TYPE_INNOCENTS_KILLED
ADD_ENDSCREEN_DATASET_CONTENT_ELEMENT(esdIN,
ESEF_RAW_INTEGER,
name,
"",
g_MissionStatTrackingArray[index].ivalue,
0,
checkState)
BREAK
CASE MISSION_STAT_TYPE_PURE_COUNT_PERCENTAGE
ADD_ENDSCREEN_DATASET_CONTENT_ELEMENT(esdIN,
ESEF_RAW_PERCENT,
name,
"",
g_MissionStatTrackingArray[index].ivalue,
0,
checkState)
BREAK
CASE MISSION_STAT_TYPE_PURE_COUNT_DISTANCE
ADD_ENDSCREEN_DATASET_CONTENT_ELEMENT(esdIN,
ESEF_DISTANCE_VALUE_METERS,
name,
"",
g_MissionStatTrackingArray[index].ivalue,
0,
checkState)
BREAK
CASE MISSION_STAT_TYPE_FINANCE_DIRECT
CASE MISSION_STAT_TYPE_FINANCE_TABLE
ADD_ENDSCREEN_DATASET_CONTENT_ELEMENT(esdIN,
ESEF_DOLLAR_VALUE,
name,
"",
g_MissionStatTrackingArray[index].ivalue,
0,
checkState)
BREAK
DEFAULT
SCRIPT_ASSERT("mission_stat_watcher->UPLOAD_DATA_FOR_TRACKED_STAT attempting to update an unrecognised type")
BREAK
ENDSWITCH
ENDIF
RETURN FALSE//not hidden
ENDFUNC
PROC UPLOAD_DATA_TO_SCALEFORM(END_SCREEN_DATASET &esdIN)
IF g_bMissionNoStatsNeedsSplashAndSting
g_bMissionStatSystemUploadPending = FALSE
EXIT
ENDIF
visiblesucceeded = 0
visibleattempted = 0
INT i = 0
IF IS_REPEAT_PLAY_ACTIVE()
CPRINTLN(DEBUG_MISSION_STATS, "<REPSTATS> Repeat play is active, logging results, CLEAR_REPLAY_STATS + BEGIN_REPLAY_STATS : indices ", g_iMissionStatsBeingTracked)
CLEAR_REPLAY_STATS()
g_bMissionStatSystemBuildingReplayStats = TRUE
BEGIN_REPLAY_STATS(33, 33) //denotes that it is the stat system lodging values
#IF IS_DEBUG_BUILD
ELSE
CPRINTLN(DEBUG_MISSION_STATS, "<REPSTATS> IS_REPEAT_PLAY_ACTIVE returned false, not logging for this mission")
#ENDIF
ENDIF
INT OverridePerc = -1
eLastInvalidationReasonShown = MSSIR_VALID
BOOL bSkipDetected = FALSE
REPEAT g_iMissionStatsBeingTracked i
SWITCH g_MissionStatTrackingArray[i].target
CASE FINB_KILLMIC // can't complete these without passing them
CASE FINA_KILLTREV
g_MissionStatTrackingArray[i].ivalue = 1
BREAK
ENDSWITCH
IF UPLOAD_DATA_FOR_TRACKED_STAT(esdIN,i)//,hshift)//increments visiblesucceeded if pass and visible
//yeah, probably not the best plan
//++hshift
ENDIF
IF ENUM_TO_INT(g_MissionStatTrackingArray[i].target) >= 0
//#IF NOT USE_CLF_DLC
IF !g_MissionStatTrackingPrototypes[g_MissionStatTrackingArray[i].target].bHidden
//#ENDIF
//#IF USE_CLF_DLC
// IF !g_DLCMissionStatTrackingPrototypes[g_MissionStatTrackingArray[i].target].bHidden
//#ENDIF
++visibleattempted
IF g_MissionStatTrackingArray[i].invalidationReason = MSSIR_SKIP
bSkipDetected = TRUE
ENDIF
ENDIF
ENDIF
//IF g_MissionStatTrackingArray[i].invalidated
//CPRINTLN(DEBUG_MISSION_STATS, "<STAT WATCHER> Index ",i," invalidated")
//reason = g_MissionStatTrackingArray[i].invalidationReason
//purerun = FALSE
//ENDIF
SWITCH g_MissionStatTrackingArray[i].target
CASE ASS4_MIRROR_PERCENTAGE
CASE ASS5_MIRROR_PERCENT
CASE ASS3_MIRROR_PERCENTAGE
CASE ASS1_MIRROR_PERCENT
CASE ASS2_MIRROR_PERCENT
OverridePerc = g_MissionStatTrackingArray[i].ivalue
BREAK
ENDSWITCH
ENDREPEAT
g_LeaderboardLastObjectivesPassed = visiblesucceeded
FLOAT fperc = SET_SCALEFORM_DATA_FOR_MISSION_STAT_TOTALS_ESD(esdIN,visiblesucceeded,visibleattempted,bSkipDetected)
IF IS_REPEAT_PLAY_ACTIVE()
CPRINTLN(DEBUG_MISSION_STATS, "<REPSTATS> Repeat play is active, logged results END_REPLAY_STATS.")
ADD_REPLAY_STAT_VALUE(g_LeaderboardLastMissionID)
ADD_REPLAY_STAT_VALUE(ROUND(fperc))
IF bSkipDetected
ADD_REPLAY_STAT_VALUE(1)
ELSE
ADD_REPLAY_STAT_VALUE(0)
ENDIF
IF g_LeaderboardLastMissionRCType
ADD_REPLAY_STAT_VALUE(1)
ELSE
ADD_REPLAY_STAT_VALUE(0)
ENDIF
END_REPLAY_STATS()
g_bMissionStatSystemBuildingReplayStats = FALSE
ENDIF
g_bMissionStatSystemUploadPending = FALSE
IF OverridePerc > -1
fperc = TO_FLOAT(OverridePerc)
ENDIF
//lodge fprec into mission data
//tally golds
LODGE_PERCENTAGE_FOR_CURRENT_MISSION(fperc, bSkipDetected)
ENDPROC
BOOL bStartedTrigger = FALSE
BOOL bWhatWasTheTriggerLastCheck = FALSE
BOOL StatSystemWasPrimed = FALSE
BOOL bMovieWasLoaded = FALSE
//BOOL bFirstMissionPassedHelpDisplayed = FALSE
PROC RESET_SYSTEM()
//prevention for 1537258
g_bResultScreenDisplaying = FALSE
g_bResultScreenPrepared = FALSE
g_bMissionStatSystemBlocker = FALSE
//IF g_bMissionStatSystemResponseToReplayNeeded
// CPRINTLN(DEBUG_MISSION_STATS, "RESET_SYSTEM:<STAT WATCHER> preventing full reset due to replay.")
// EXIT
//ENDIF
CPRINTLN(DEBUG_MISSION_STATS, "RESET_SYSTEM: <STAT WATCHER> Resetting system.")
SETTIMERA(0)
SETTIMERB(0)
THEFEED_RESUME()
//iTimeLastUpdate = 0
//iTimeThisUpdate = 0
iTimeDeltaThisUpdate = 0
g_bMissionStatSystemMissionStarted = FALSE
g_eCurrentTimeWindowTarget = UNSET_MISSION_STAT_ENUM
bStartedTrigger = FALSE
g_bMissionOverStatTrigger = FALSE
g_bMissionStatSystemPrimed = FALSE
StatSystemWasPrimed = FALSE
g_MissionStatSingleSpeedWatchEntity = NULL
g_bMissionStatTimeWindowClosedForGood = FALSE
g_bMissionNoStatsNeedsSplashAndSting = FALSE
g_StatSystemWeponpoolEntries = 0
g_StatSystemDeadpoolEntries = 0
RESET_STAT_SYSTEM_DEADPOOL()
RESET_STAT_SYSTEM_WEPPOOL()
IF bMovieWasLoaded
ENDSCREEN_SHUTDOWN(esd)
bMovieWasLoaded = FALSE
ENDIF
IF g_bMagDemoActive
CPRINTLN(DEBUG_MISSION_STATS, "<STAT WATCHER> Terminating for magdemo.")
TERMINATE_THIS_THREAD()
ENDIF
g_bMissionStatSystemUploadPending = FALSE
g_bMissionStatSystemResetFlag = FALSE
ENDPROC
FUNC BOOL GET_UNHIDDEN_IN_REGISTERS()
INT i = 0
REPEAT g_iMissionStatsBeingTracked i
IF ENUM_TO_INT(g_MissionStatTrackingArray[i].target) > 0
//#IF NOT USE_CLF_DLC
IF g_MissionStatTrackingPrototypes[g_MissionStatTrackingArray[i].target].bHidden = FALSE
//#ENDIF
//#IF USE_CLF_DLC
// IF g_DLCMissionStatTrackingPrototypes[g_MissionStatTrackingArray[i].target].bHidden = FALSE
//#ENDIF
RETURN TRUE
ENDIF
ENDIF
ENDREPEAT
RETURN FALSE
ENDFUNC
#IF IS_DEBUG_BUILD
INT vehspeed
#ENDIF
SCRIPT
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("mission_stat_watcher")) > 1
CPRINTLN(DEBUG_MISSION_STATS, "<STAT WATCHER> Detected multiples of itself, bailing")
TERMINATE_THIS_THREAD()
ENDIF
g_bMissionOverStatTrigger = FALSE // prevent immediate trigger from 1581885
g_bMissionStatSystemResetFlag = FALSE //prevent false positives shutdowns 1581499
INT iModeTimerMultiplier = 1
// #IF USE_CLF_DLC
// bUSE_ASSASSIN_OR_CLF_DLC = TRUE
// #ENDIF
IF HAS_FORCE_CLEANUP_OCCURRED( FORCE_CLEANUP_FLAG_SP_TO_MP | FORCE_CLEANUP_FLAG_DEBUG_MENU)// | FORCE_CLEANUP_FLAG_RANDOM_EVENTS | FORCE_CLEANUP_FLAG_MAGDEMO) //FORCE_CLEANUP_FLAG_PLAYER_KILLED_OR_ARRESTED
RESET_SYSTEM()
g_iMissionStatsBeingTracked = 0
g_bStatsInWatchingLoop = FALSE
g_bSuppressNextStatTrigger = FALSE
CPRINTLN(DEBUG_MISSION_STATS, "<STAT WATCHER> Force cleanup terminated")
TERMINATE_THIS_THREAD()
ENDIF
#IF IS_DEBUG_BUILD
IF NOT DOES_WIDGET_GROUP_EXIST(g_missionstatwidgetgroup)
//create the debug stat registers
g_missionstatwidgetgroup = START_WIDGET_GROUP("Mission Stat Tracking Registers")
ADD_WIDGET_INT_READ_ONLY("Current vehicle speed",vehspeed)
ADD_WIDGET_INT_READ_ONLY("Total used", g_iMissionStatsBeingTracked)
ADD_WIDGET_BOOL("Triggering bool, fire if primed", g_bMissionOverStatTrigger)
START_WIDGET_GROUP("g_MissionStatTrackingArray[]")
INT idbg = 0
REPEAT MAX_TRACKED_MISSION_STATS idbg
TEXT_LABEL dlbl = "Register_"
IF (idbg < 10) dlbl += "0" ENDIF
dlbl += idbg
START_WIDGET_GROUP(dlbl)
//ADD_WIDGET_INT_READ_ONLY("Type ENUM", ENUM_TO_INT(g_MissionStatTrackingArray[idbg].target))
//IF NOT bUSE_ASSASSIN_OR_CLF_DLC
g_MissionStatTrackingArray[idbg].target_textWidget = ADD_TEXT_WIDGET("target")
//ELSE
//g_MissionStatTrackingArray[idbg].target_textWidget = ADD_TEXT_WIDGET("DLC target")
//ENDIF
ADD_WIDGET_INT_READ_ONLY("iValue", g_MissionStatTrackingArray[idbg].ivalue)
ADD_WIDGET_FLOAT_READ_ONLY("fValue",g_MissionStatTrackingArray[idbg].fvalue)
START_NEW_WIDGET_COMBO()
ADD_TO_WIDGET_COMBO("MSSIR_VALID")
ADD_TO_WIDGET_COMBO("MSSIR_CHECKPOINT")
ADD_TO_WIDGET_COMBO("MSSIR_SKIP")
ADD_TO_WIDGET_COMBO("MSSIR_TAXI_USED")
ADD_TO_WIDGET_COMBO("MSSIR_CHEAT_ACTIVE")
ADD_TO_WIDGET_COMBO("MSSIR_NOT_SET")
STOP_WIDGET_COMBO("invalidationReason", g_MissionStatTrackingArray[idbg].invalidationReason_int)
ADD_WIDGET_BOOL("successshown",g_MissionStatTrackingArray[idbg].successshown)
//
ADD_WIDGET_BOOL("windowDeltaTracking",g_MissionStatTrackingArray[idbg].windowDeltaTracking)
//
// //New tracking entity
// ENTITY_INDEX TrackingEntity
ADD_WIDGET_BOOL("bTrackingEntityChanged",g_MissionStatTrackingArray[idbg].bTrackingEntityChanged)
ADD_WIDGET_INT_READ_ONLY("iTrackingDelta",g_MissionStatTrackingArray[idbg].iTrackingDelta)
// IF bUSE_ASSASSIN_OR_CLF_DLC
// IF idbg < DLC_ASSASSINATION_MAX_STATS
// SWITCH g_dlcAssasinationStatConfig.type[idbg]
// CASE MISSION_STAT_TYPE_SINGLE_ENTITY_DAMAGE_THRESHOLD
// ADD_WIDGET_STRING("Single Entity Damage Threshold")
// ADD_WIDGET_INT_SLIDER("iHealthThisTick", iHealthThisTick, -1, 2000, 1)
// ADD_WIDGET_INT_SLIDER("iHealthLastTick", iHealthLastTick, -1, 2000, 1)
// ADD_WIDGET_INT_SLIDER("iHealthDelta", iHealthDelta, -1, 2000, 1)
// BREAK
// CASE MISSION_STAT_TYPE_ACCURACY
// ADD_WIDGET_STRING("Accuracy")
// ADD_WIDGET_FLOAT_SLIDER("overallAccuracyMetric", overallAccuracyMetric, -1, 2000, 1)
// ADD_WIDGET_INT_SLIDER("overallBulletsMetric", overallBulletsMetric, -1, 2000, 1)
// BREAK
// ENDSWITCH
// ENDIF
// ENDIF
STOP_WIDGET_GROUP()
ENDREPEAT
STOP_WIDGET_GROUP()
// IF bUSE_ASSASSIN_OR_CLF_DLC
// g_dlcAssasinationStatConfig.d_widget = START_WIDGET_GROUP("PREP_DLC_ASSASSINATION_STAT_CONFIG")
// ADD_WIDGET_INT_READ_ONLY("dlcAssassinationIndex", g_dlcAssasinationStatConfig.dlcAssassinationIndex)
//
// INT iStat
// REPEAT g_dlcAssasinationStatConfig.iRegisteredStats iStat
// ADD_WIDGET_INT_READ_ONLY(GET_DLC_MISSION_STAT_DEBUG_NAME(g_dlcAssasinationStatConfig.target[iStat]) , g_dlcAssasinationStatConfig.StatCurrentValue[iStat])
// ENDREPEAT
//
// ADD_WIDGET_FLOAT_READ_ONLY("fCompletionPercent", g_dlcAssasinationStatConfig.fCompletionPercent)
// STOP_WIDGET_GROUP()
// ENDIF
ADD_WIDGET_BOOL("bDrawWatchlist", bDrawWatchlist)
ADD_WIDGET_FLOAT_SLIDER("END_SCREEN_CURSIVE_TITLE_SCALE", END_SCREEN_CURSIVE_TITLE_SCALE, 0.0, 1.0, 0.001)
ADD_WIDGET_FLOAT_SLIDER("END_SCREEN_CURSIVE_TITLE_Y_OFFSET", END_SCREEN_CURSIVE_TITLE_Y_OFFSET, -1.0, 1.0, 0.0001)
ADD_WIDGET_FLOAT_SLIDER("END_SCREEN_CURSIVE_COMP_SCALE", END_SCREEN_CURSIVE_COMP_SCALE, 0.0, 1.0, 0.001)
ADD_WIDGET_FLOAT_SLIDER("END_SCREEN_CURSIVE_COMP_X_OFFSET", END_SCREEN_CURSIVE_COMP_X_OFFSET, -1.0, 1.0, 0.001)
ADD_WIDGET_FLOAT_SLIDER("END_SCREEN_MEDAL_SCALE", END_SCREEN_MEDAL_SCALE, 0.0, 1.0, 0.001)
ADD_WIDGET_FLOAT_SLIDER("END_SCREEN_MEDAL_Y_OFFSET", END_SCREEN_MEDAL_Y_OFFSET, -20.0, 20.0, 1.0)
ADD_WIDGET_BOOL("g_bEnd_Screen_Display_Finish", g_bEnd_Screen_Display_Finish)
START_WIDGET_GROUP("SHARD")
ADD_WIDGET_BOOL("bTestShardMessage", bTestShardMessage)
START_NEW_WIDGET_COMBO()
INT iRepeat
REPEAT HUD_COLOUR_NET_PLAYER1 iRepeat
ADD_TO_WIDGET_COMBO(HUD_COLOUR_AS_STRING(INT_TO_ENUM(HUD_COLOURS, iRepeat)))
ENDREPEAT
STOP_WIDGET_COMBO("iEndFlash", iTWEAK_endFlash)
STOP_WIDGET_GROUP()
STOP_WIDGET_GROUP()
ENDIF
#ENDIF
BOOL bUnhiddenInRegisters = FALSE
WAIT(0)
CHECK_REPLAY_MISSION_STAT_STATE()
WHILE !g_bMissionStatSystemPrimed
CPRINTLN(DEBUG_MISSION_STATS, "<STAT WATCHER> Waiting for stat system to be primed.")
WAIT(200)
IF g_bMissionStatSystemResetFlag
CPRINTLN(DEBUG_MISSION_STATS, "<STAT WATCHER> Terminating out of waiting for primed due to reset flag")
RESET_SYSTEM()
TERMINATE_THIS_THREAD()
ENDIF
ENDWHILE
CPRINTLN(DEBUG_MISSION_STATS, "<STAT WATCHER> Primed for : ", g_sMissionStatsName)
CPRINTLN(DEBUG_MISSION_STATS, "<STAT WATCHER> Entering watching loop")
g_bMissionStatTimeWindowGate = FALSE//windowed timers can't be open while starting watching
g_bStatsInWatchingLoop = TRUE
WHILE !g_bMissionOverStatTrigger
//do on mission tracking.
#IF IS_DEBUG_BUILD //widget speed
IF IS_PLAYER_PED_PLAYABLE(GET_CURRENT_PLAYER_PED_ENUM())
PED_INDEX pii = GET_PLAYER_PED(GET_PLAYER_INDEX())
IF NOT IS_ENTITY_DEAD(pii)
IF IS_PED_IN_ANY_VEHICLE(pii)
VEHICLE_INDEX vii = GET_VEHICLE_PED_IS_USING(pii)
vehspeed = FLOOR(GET_ENTITY_SPEED(vii))
ELSE
vehspeed = 0
ENDIF
ENDIF
ENDIF
IF GET_GAME_TIMER()%1000 = 0
CPRINTLN(DEBUG_MISSION_STATS, "<STAT WATCHER> Still in watching loop")
ENDIF
int idbg = 0
REPEAT MAX_TRACKED_MISSION_STATS idbg
TEXT_LABEL_63 NewWidgetContents
// IF NOT bUSE_ASSASSIN_OR_AGENT_T_DLC
IF g_MissionStatTrackingArray[idbg].target = UNSET_MISSION_STAT_ENUM
NewWidgetContents = "none"
#IF USE_CLF_DLC
ELIF g_MissionStatTrackingArray[idbg].target >= MAX_MISSION_STATS_AGENT
#ENDIF
#IF NOT USE_CLF_DLC
ELIF g_MissionStatTrackingArray[idbg].target >= MAX_MISSION_STATS
#ENDIF
NewWidgetContents = "unknown stat "
NewWidgetContents += ENUM_TO_INT(g_MissionStatTrackingArray[idbg].target)
// ELSE
// NewWidgetContents = GET_MISSION_STAT_NAME(g_MissionStatTrackingArray[idbg].target)
ENDIF
// ELSE
// DLC_ASSASSINATION_STATS target = INT_TO_ENUM(DLC_ASSASSINATION_STATS, ENUM_TO_INT(g_MissionStatTrackingArray[idbg].target))
// IF target <= UNSET_DLC_MISSION_STAT_ENUM
// NewWidgetContents = "* unset"
// ELIF target < MAX_DLC_MISSION_STATS
// NewWidgetContents = "* "
// NewWidgetContents += GET_STRING_FROM_TEXT_FILE(GET_DLC_MISSION_STAT_NAME(target))
// ELSE
// NewWidgetContents = "* unknown stat "
// NewWidgetContents += ENUM_TO_INT(target)
//
// ENDIF
// ENDIF
SET_CONTENTS_OF_TEXT_WIDGET(g_MissionStatTrackingArray[idbg].target_textWidget, NewWidgetContents)
g_MissionStatTrackingArray[idbg].invalidationReason_int = ENUM_TO_INT(g_MissionStatTrackingArray[idbg].invalidationReason)
ENDREPEAT
IF bDrawWatchlist
IF g_iEntityWatchListLoggedCount > 0
INT i = 0
REPEAT MAX_ENTITY_WATCH_LIST_ENTRIES i
IF DOES_ENTITY_EXIST(g_EntityWatchList[i].index)
SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE(TRUE)
DRAW_DEBUG_LINE(GET_ENTITY_COORDS(g_EntityWatchList[i].index, FALSE), GET_ENTITY_COORDS(PLAYER_PED_ID(), FALSE))
ENDIF
ENDREPEAT
ELSE
bDrawWatchlist = FALSE
ENDIF
ENDIF
IF bTestShardMessage
shardBigMessage.siMovie = REQUEST_SCALEFORM_MOVIE("MP_BIG_MESSAGE_FREEMODE")
buttons = REQUEST_SCALEFORM_MOVIE_INSTANCE("INSTRUCTIONAL_BUTTONS") //DRAW_INSTRUCTIONAL_BUTTONS
REQUEST_ADDITIONAL_TEXT("MISHSTA", MINIGAME_TEXT_SLOT)
CONST_INT iCONST_TEST_0 0
CONST_INT iCONST_TEST_1 1
CONST_INT iCONST_TEST_2 2
CONST_INT iCONST_TEST_3 3
CONST_INT iCONST_TEST_4 4
CONST_INT iCONST_TEST_5 5
INT iTestone = iCONST_TEST_0
WHILE bTestShardMessage
SWITCH iTestone
CASE iCONST_TEST_0
IF HAS_SCALEFORM_MOVIE_LOADED(shardBigMessage.siMovie)
AND HAS_SCALEFORM_MOVIE_LOADED(buttons)
AND HAS_ADDITIONAL_TEXT_LOADED(MINIGAME_TEXT_SLOT)
AND ENDSCREEN_PREPARE(esd, FALSE, DEFAULT)
// SET_SHARD_BIG_MESSAGE(shardBigMessage, "MISHPA", g_sMissionStatsName, -1, SHARD_MESSAGE_CENTERED, INT_TO_ENUM(HUD_COLOURS, iTWEAK_endFlash))
START_TIMER_NOW(shardBigMessage.movieTimer)
IF g_iMissionStatsBeingTracked > 0
UPLOAD_DATA_TO_SCALEFORM(esd) // Normal upload
ENDIF
BEGIN_SCALEFORM_MOVIE_METHOD(buttons, "CLEAR_ALL")
END_SCALEFORM_MOVIE_METHOD()
iTestone = iCONST_TEST_1
ENDIF
BREAK
CASE iCONST_TEST_1
// IF NOT UPDATE_SHARD_BIG_MESSAGE(shardBigMessage, FALSE)
// RESET_SHARD_BIG_MESSAGE(shardBigMessage)
// iTestone = iCONST_TEST_3
// ENDIF
RENDER_ENDSCREEN(esd, DEFAULT, DEFAULT)
IF (GET_TIMER_IN_SECONDS(shardBigMessage.movieTimer) > 2.0)
// SET_SHARD_BIG_MESSAGE(shardBigMessage, "MISHPA", g_sMissionStatsName, -1, SHARD_MESSAGE_CENTERED_TOP, INT_TO_ENUM(HUD_COLOURS, iTWEAK_endFlash))
BEGIN_SCALEFORM_MOVIE_METHOD(buttons, "SET_DATA_SLOT")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(0)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INSTRUCTIONAL_BUTTONS(GET_CONTROL_INSTRUCTIONAL_BUTTONS_STRING(FRONTEND_CONTROL, INPUT_FRONTEND_ACCEPT))
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING("REPLAY_OK")
END_SCALEFORM_MOVIE_METHOD()
BEGIN_SCALEFORM_MOVIE_METHOD(buttons, "SET_DATA_SLOT")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(1)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INSTRUCTIONAL_BUTTONS(GET_CONTROL_INSTRUCTIONAL_BUTTONS_STRING(FRONTEND_CONTROL, INPUT_FRONTEND_CANCEL))
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING("REPLAY_NO")
END_SCALEFORM_MOVIE_METHOD()
BEGIN_SCALEFORM_MOVIE_METHOD(buttons, "SET_DATA_SLOT")
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INT(2)
SCALEFORM_MOVIE_METHOD_ADD_PARAM_INSTRUCTIONAL_BUTTONS(GET_CONTROL_INSTRUCTIONAL_BUTTONS_STRING(FRONTEND_CONTROL, INPUT_FRONTEND_X))
SCALEFORM_MOVIE_METHOD_ADD_PARAM_STRING("REPLAY_SKIP_S")
END_SCALEFORM_MOVIE_METHOD()
iTestone = iCONST_TEST_2
ENDIF
BREAK
CASE iCONST_TEST_2
IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_ACCEPT)
SET_SHARD_BIG_MESSAGE(shardBigMessage, "MISHPA", g_sMissionStatsName, -1, SHARD_MESSAGE_CENTERED_TOP, INT_TO_ENUM(HUD_COLOURS, iTWEAK_endFlash))
iTestone = iCONST_TEST_3
ENDIF
// IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_X)
// SET_SHARD_BIG_MESSAGE(shardBigMessage, "MISHPA", g_sMissionStatsName, -1, SHARD_MESSAGE_CENTERED_TOP, INT_TO_ENUM(HUD_COLOURS, iTWEAK_endFlash))
// iTestone = iCONST_TEST_2
// ENDIF
RENDER_ENDSCREEN(esd, DEFAULT, DEFAULT)
DRAW_SCALEFORM_MOVIE_FULLSCREEN(buttons, 255, 255, 255, 128)
// IF NOT UPDATE_SHARD_BIG_MESSAGE(shardBigMessage, TRUE)
// RESET_SHARD_BIG_MESSAGE(shardBigMessage)
// iTestone = iCONST_TEST_3
// ENDIF
BREAK
CASE iCONST_TEST_3
bTestShardMessage = FALSE
BREAK
ENDSWITCH
#IF IS_DEBUG_BUILD
SET_DEBUG_LINES_AND_SPHERES_DRAWING_ACTIVE(TRUE)
VECTOR vTextCoord = <<0.05, 0.35, 0>>, vTextOffset = <<0.00,0.02,0.0>>
TEXT_LABEL_63 str = "iTestone: "
str += iTestone
DRAW_DEBUG_TEXT_2D(str, vTextCoord+(vTextOffset*0.0), 0,0,255)
str = "iDuration: "
str += shardBigMessage.iDuration
DRAW_DEBUG_TEXT_2D(str, vTextCoord+(vTextOffset*1.0), 0,0,255)
str = "movieTimer: "
IF IS_TIMER_STARTED(shardBigMessage.movieTimer)
str += GET_STRING_FROM_FLOAT(GET_TIMER_IN_SECONDS(shardBigMessage.movieTimer))
ELSE
str += "NONE"
ENDIF
DRAW_DEBUG_TEXT_2D(str, vTextCoord+(vTextOffset*2.0), 0,0,255)
str = "animOutTimer: "
IF IS_TIMER_STARTED(shardBigMessage.animOutTimer)
str += GET_STRING_FROM_FLOAT(GET_TIMER_IN_SECONDS(shardBigMessage.animOutTimer))
ELSE
str += "NONE"
ENDIF
DRAW_DEBUG_TEXT_2D(str, vTextCoord+(vTextOffset*3.0), 0,0,255)
#ENDIF
WAIT(0)
ENDWHILE
ENDIF
#ENDIF
// Mission tracker primed, do tracking
IF g_iMissionStatsBeingTracked > 0
// Call tracker update
UPDATE_TRACKER()
IF g_iMissionStatsStartTime = -1
g_iMissionStatsStartTime = GET_GAME_TIMER()
ELIF GET_GAME_TIMER() - g_iMissionStatsStartTime > 1000
INVALIDATE_STATS_IF_CHEATS_ACTIVE()
ENDIF
//g_bMissionStatSystemResetFlag = FALSE
ENDIF
IF g_bMissionStatSystemResetFlag
CPRINTLN(DEBUG_MISSION_STATS, "<STAT WATCHER> Terminating out of tracking due to reset flag")
RESET_SYSTEM()
g_bStatsInWatchingLoop = FALSE
TERMINATE_THIS_THREAD()
ENDIF
//CPRINTLN(DEBUG_MISSION_STATS, "<STAT WATCHER> In watching loop, flag is ", g_bMissionStatSystemResetFlag)
WAIT(0)
ENDWHILE
g_bStatsInWatchingLoop = FALSE
CPRINTLN(DEBUG_MISSION_STATS, "<STAT WATCHER> Leaving watching loop")
IF IS_PLAYER_PED_SWITCH_IN_PROGRESS()
CPRINTLN(DEBUG_MISSION_STATS, "<STAT WATCHER> Switch in progress holding til complete waiting")
WHILE IS_PLAYER_PED_SWITCH_IN_PROGRESS()
#IF IS_DEBUG_BUILD
IF GET_GAME_TIMER() % 1000 = 0
CPRINTLN(DEBUG_MISSION_STATS, "<STAT WATCHER> Switch in progress holding til complete")
ENDIF
#ENDIF
WAIT(0)
ENDWHILE
ENDIF
BOOL bDone = FALSE
WHILE (!bDone)
IF NOT (g_bMissionStatSystemMissionStarted = bStartedTrigger)
IF g_bMissionStatSystemMissionStarted
SETTIMERB(0)
//iTimeLastUpdate = 0
//iTimeThisUpdate = 0
iTimeDeltaThisUpdate = 0
g_MissionStatSingleSpeedWatchEntity = NULL
ENDIF
bStartedTrigger = g_bMissionStatSystemMissionStarted
ENDIF
// If flow wants a delay then wait
WHILE g_bMissionStatSystemBlocker
CPRINTLN(DEBUG_MISSION_STATS, "<STAT WATCHER> Display process blocked by flow. Waiting 1 second.\n")
WAIT(1000)
ENDWHILE
IF g_bMissionOverStatTrigger AND (NOT g_bMissionStatSystemResetFlag)
// AND (g_bMissionStatSystemPrimed OR StatSystemWasPrimed)
CPRINTLN(DEBUG_MISSION_STATS, "<STAT WATCHER> Overlay triggered.")
//bWatchedAMission = TRUE
IF (g_bMissionStatSystemPrimed OR StatSystemWasPrimed)
g_bMissionStatSystemResponseToShitskipNeeded = FALSE
//OR g_bMissionStatRampageModeUpload
//OR g_bMissionStatBaseJumpModeUpload
IF bWhatWasTheTriggerLastCheck
CPRINTLN(DEBUG_MISSION_STATS, "<STAT WATCHER> bWhatWasTheTriggerLastCheck = TRUE")
ELSE
CPRINTLN(DEBUG_MISSION_STATS, "<STAT WATCHER> bWhatWasTheTriggerLastCheck = FALSE")
ENDIF
IF g_bMissionOverStatTrigger
CPRINTLN(DEBUG_MISSION_STATS, "<STAT WATCHER> g_bMissionOverStatTrigger = TRUE")
ELSE
CPRINTLN(DEBUG_MISSION_STATS, "<STAT WATCHER> g_bMissionOverStatTrigger = FALSE")
ENDIF
IF NOT (bWhatWasTheTriggerLastCheck = g_bMissionOverStatTrigger)
CPRINTLN(DEBUG_MISSION_STATS, "<STAT WATCHER> Init triggered.")
RESET_ENDSCREEN(esd)
esd.bShowSkipperPrompt = TRUE
TALLY_ACCURACY_METRIC()
COMMUTE_FLOAT_STAT_REGISTERS_TO_INTS()
INT arrgh = 0
REPEAT g_iMissionStatsBeingTracked arrgh
IF ENUM_TO_INT(g_MissionStatTrackingArray[arrgh].target) > 0
//#IF NOT USE_CLF_DLC
IF g_MissionStatTrackingPrototypes[g_MissionStatTrackingArray[arrgh].target].type = MISSION_STAT_TYPE_WINDOWED_TIMER
IF !g_MissionStatTrackingPrototypes[g_MissionStatTrackingArray[arrgh].target].bHidden
IF g_MissionStatTrackingPrototypes[g_MissionStatTrackingArray[arrgh].target].less_than_threshold
//#ENDIF
//#IF USE_CLF_DLC
// IF g_DLCMissionStatTrackingPrototypes[g_MissionStatTrackingArray[arrgh].target].type = MISSION_STAT_TYPE_WINDOWED_TIMER
// IF !g_DLCMissionStatTrackingPrototypes[g_MissionStatTrackingArray[arrgh].target].bHidden
// IF g_DLCMissionStatTrackingPrototypes[g_MissionStatTrackingArray[arrgh].target].less_than_threshold
//#ENDIF
IF g_MissionStatTrackingArray[arrgh].ivalue = 0
//unset time windows are invalidated
//g_MissionStatTrackingArray[arrgh].invalidated = TRUE
g_MissionStatTrackingArray[arrgh].invalidationReason = MSSIR_NOT_SET
CPRINTLN(DEBUG_MISSION_STATS, "<STAT WATCHER> Greater than threshold time window stat ", GET_MISSION_STAT_NAME(g_MissionStatTrackingArray[arrgh].target), "\" auto invalidated, assuming due to checkpoint.\n")
ENDIF
ENDIF
ENDIF
ENDIF
ENDIF
ENDREPEAT
BOOL bUISuppressed = FALSE
IF (g_bResultScreenDisplaying)//let heist end screen take front
AND (NOT g_bMissionNoStatsNeedsSplashAndSting)//splash only primes can show anyway
OR g_MissionStatSystemSuppressVisual
CPRINTLN(DEBUG_MISSION_STATS, "<STAT WATCHER> UI suppressed because, flags set to : ", g_bResultScreenDisplaying, ", ", g_bMissionNoStatsNeedsSplashAndSting, ", ", g_MissionStatSystemSuppressVisual, ".")
bUISuppressed = TRUE
ENDIF
BOOL fadeSetting = FALSE
IF IS_SCREEN_FADED_IN() OR IS_SCREEN_FADING_IN()
fadeSetting = TRUE
ELSE
IF g_sAutosaveData.bIgnoreScreenFade
fadeSetting = TRUE
ENDIF
IF g_MissionStatUIIgnoreFade
fadeSetting = TRUE
ENDIF
ENDIF
IF IS_REPEAT_PLAY_ACTIVE() // For 1532756
CPRINTLN(DEBUG_MISSION_STATS, "<STAT WATCHER> Stat screen about to display over fade due to IS_REPEAT_PLAY_ACTIVE")
fadeSetting = TRUE
g_MissionStatUIIgnoreFade = TRUE
ENDIF
////////////////////////////////////////////////////////////////////////////
///////////////////////heist and mission esd upload////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
SP_MISSIONS sa = INT_TO_ENUM(SP_MISSIONS,g_LeaderboardLastMissionID)
IF g_bMissionStatSystemHeistMode
PRIVATE_Heist_ES_CALCULATE_TOTALS_AND_UPLOAD_TO_SCALEFORM(g_iMissionStatSystemHeistIndex)
iModeTimerMultiplier =2
CPRINTLN(DEBUG_MISSION_STATS, "<STAT WATCHER> heist mode stat render")
SET_ENDSCREEN_DATASET_HEADER(esd,
"HISHPA",
g_sMissionStatsName)
//1. Show value actually grabbed during the heist.
IF sa = SP_HEIST_AGENCY_3A
OR sa = SP_HEIST_AGENCY_3B
//There is no take on the Agency Heist.
//The FIB provide a budget.
ADD_ENDSCREEN_DATASET_CONTENT_ELEMENT(esd,
ESEF_DOLLAR_VALUE,
"ACTATAKE_AG",
"",
g_savedGlobals.sHeistData.sEndScreenData[g_iMissionStatSystemHeistIndex].iPotentialTake,
0,
ESCM_NO_MARK,
FALSE)
ELSE
ADD_ENDSCREEN_DATASET_CONTENT_ELEMENT(esd,
ESEF_DOLLAR_VALUE,
"POTATAKE",
"",
g_savedGlobals.sHeistData.sEndScreenData[g_iMissionStatSystemHeistIndex].iPotentialTake,
0,
ESCM_NO_MARK)
ENDIF
//2. Show penalties deducted from picked up amount.
INT i = 0
REPEAT g_HeistNoneSavedDatas[g_iMissionStatSystemHeistIndex].iPenaltiesLogged i
IF g_HeistNoneSavedDatas[g_iMissionStatSystemHeistIndex].iPenaltiesValues[i] > 0
ADD_ENDSCREEN_DATASET_CONTENT_ELEMENT(esd,
ESEF_DOLLAR_VALUE,
PRIVATE_GET_HEIST_PENALTY_STRING(g_HeistNoneSavedDatas[g_iMissionStatSystemHeistIndex].Penalties[i]),
"",
-1 * g_HeistNoneSavedDatas[g_iMissionStatSystemHeistIndex].iPenaltiesValues[i],
0,
ESCM_NO_MARK)
ENDIF
ENDREPEAT
//3. Show Michael's cut of what remains.
IF g_savedGlobals.sHeistData.sEndScreenData[g_iMissionStatSystemHeistIndex].iPlayerTake[CHAR_MICHAEL] > 0
OR sa = SP_HEIST_DOCKS_2A OR sa = SP_HEIST_DOCKS_2B
OR sa = SP_HEIST_AGENCY_3A OR sa = SP_HEIST_AGENCY_3B
ADD_ENDSCREEN_DATASET_CONTENT_ELEMENT(esd,
ESEF_DOLLAR_VALUE,
"ACTATAKE_M",
"",
g_savedGlobals.sHeistData.sEndScreenData[g_iMissionStatSystemHeistIndex].iPlayerTake[CHAR_MICHAEL],
0,
ESCM_NO_MARK)
ENDIF
//4. Show Franklin's cut of what remains.
IF g_savedGlobals.sHeistData.sEndScreenData[g_iMissionStatSystemHeistIndex].iPlayerTake[CHAR_FRANKLIN] > 0
OR sa = SP_HEIST_DOCKS_2A OR sa = SP_HEIST_DOCKS_2B
ADD_ENDSCREEN_DATASET_CONTENT_ELEMENT(esd,
ESEF_DOLLAR_VALUE,
"ACTATAKE_F",
"",
g_savedGlobals.sHeistData.sEndScreenData[g_iMissionStatSystemHeistIndex].iPlayerTake[CHAR_FRANKLIN],
0,
ESCM_NO_MARK)
ENDIF
//5. Show Trevor's cut of what remains.
IF g_savedGlobals.sHeistData.sEndScreenData[g_iMissionStatSystemHeistIndex].iPlayerTake[CHAR_TREVOR] > 0
OR sa = SP_HEIST_DOCKS_2A OR sa = SP_HEIST_DOCKS_2B
ADD_ENDSCREEN_DATASET_CONTENT_ELEMENT(esd,
ESEF_DOLLAR_VALUE,
"ACTATAKE_T",
"",
g_savedGlobals.sHeistData.sEndScreenData[g_iMissionStatSystemHeistIndex].iPlayerTake[CHAR_TREVOR],
0,
ESCM_NO_MARK)
ENDIF
//6. Show Lester's cut of what remains.
IF sEndScreen.iLesterTotal > 0
ADD_ENDSCREEN_DATASET_CONTENT_ELEMENT(esd,
ESEF_DOLLAR_VALUE,
"ACTATAKE_L",
"",
sEndScreen.iLesterTotal,
0,
ESCM_NO_MARK)
ENDIF
//Calculate crew cut split. Alive take normal cuts. Dead add funeral costs.
INT iHeistChoice = GET_MISSION_FLOW_INT_VALUE(Get_Heist_Choice_FlowInt_For_Heist(g_iMissionStatSystemHeistIndex))
INT iCrewSum = 0
INT iFuneralSum = 0
REPEAT g_sHeistChoiceData[iHeistChoice].iCrewSize i
IF NOT IS_HEIST_CREW_MEMBER_DEAD(g_savedGlobals.sHeistData.eSelectedCrew[iHeistChoice][i])
iCrewSum += g_savedGlobals.sHeistData.sEndScreenData[g_iMissionStatSystemHeistIndex].iCrewMemberTake[i]
ELSE
iFuneralSum += g_savedGlobals.sHeistData.sEndScreenData[g_iMissionStatSystemHeistIndex].iCrewMemberTake[i]
ENDIF
ENDREPEAT
//7. Show alive crew member cuts.
IF sa = SP_HEIST_DOCKS_2A OR sa = SP_HEIST_DOCKS_2B
ADD_ENDSCREEN_DATASET_CONTENT_ELEMENT(esd,
ESEF_DOLLAR_VALUE,
"LACKTAKE",
"",
iCrewSum,
0,
ESCM_NO_MARK)
ELSE
ADD_ENDSCREEN_DATASET_CONTENT_ELEMENT(esd,
ESEF_DOLLAR_VALUE,
"CREWTAKE",
"",
iCrewSum,
0,
ESCM_NO_MARK)
ENDIF
//8. Show cut spent on funeral costs for dead crew members.
IF iFuneralSum > 0
//Update funeral bill penalty stats for social club.
IF NOT IS_REPEAT_PLAY_ACTIVE()
SWITCH sa
CASE SP_HEIST_JEWELRY_2
STAT_SET_INT(HCS_PENALTY_JEWEL_FUNERAL, iFuneralSum)
BREAK
CASE SP_HEIST_RURAL_2
STAT_SET_INT(HCS_PENALTY_PALETO_FUNERAL, iFuneralSum)
BREAK
CASE SP_HEIST_AGENCY_3A
CASE SP_HEIST_AGENCY_3B
STAT_SET_INT(HCS_PENALTY_BUREAU_FUNERAL, iFuneralSum)
BREAK
CASE SP_HEIST_FINALE_2A
CASE SP_HEIST_FINALE_2B
STAT_SET_INT(HCS_PENALTY_BIGS_FUNERAL, iFuneralSum)
BREAK
ENDSWITCH
ENDIF
ADD_ENDSCREEN_DATASET_CONTENT_ELEMENT(esd,
ESEF_DOLLAR_VALUE,
"HSTENDPFUN",
"",
iFuneralSum,
0,
ESCM_NO_MARK)
ENDIF
ELSE
CPRINTLN(DEBUG_MISSION_STATS, "<STAT WATCHER> normal mission mode stat render")
SET_ENDSCREEN_DATASET_HEADER(esd,
"MISHPA", g_sMissionStatsName)
ENDIF
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
IF g_iMissionStatsBeingTracked > 0
UPLOAD_DATA_TO_SCALEFORM(esd) // Normal upload
ENDIF
IF (NOT g_bMissionNoStatsNeedsSplashAndSting)
CPRINTLN(DEBUG_MISSION_STATS, "<STAT WATCHER> Doing leaderboard calculation")
DO_LEADERBOARD_SCORE_CALCULATION_AND_SET()
#IF IS_DEBUG_BUILD
ELSE
CPRINTLN(DEBUG_MISSION_STATS, "<STAT WATCHER> Skipping leaderboard calculation")
#ENDIF
ENDIF
WHILE NOT fadeSetting
CPRINTLN(DEBUG_MISSION_STATS, "<STAT WATCHER> Waiting for screen to be faded in or fading in")
IF IS_SCREEN_FADED_IN() OR IS_SCREEN_FADING_IN()
fadeSetting = TRUE
ENDIF
WAIT(0)
ENDWHILE
CPRINTLN(DEBUG_MISSION_STATS, "<STAT WATCHER> About to load movie, fade setting ", fadeSetting, " and ",g_MissionStatUIIgnoreFade, " : UI suppression -> ", bUISuppressed)
IF (fadeSetting
OR g_MissionStatUIIgnoreFade)//skip the movie load
AND (NOT bUISuppressed)
IF NOT g_MissionStatSystemSuppressVisual
ENDSCREEN_PREPARE(esd,FALSE)
ENDIF
BOOL bBlockForUISound = FALSE
IF NOT g_LeaderboardLastMissionRCType
SWITCH INT_TO_ENUM(SP_MISSIONS,g_LeaderboardLastMissionID)
CASE SP_MISSION_ME_AMANDA
CASE SP_MISSION_ME_JIMMY
CASE SP_MISSION_ME_TRACEY
SET_AUDIO_FLAG("HoldMissionCompleteWhenPrepared", TRUE)
MISSION_FLOW_PLAY_END_OF_MISSION_MUSIC(TRUE)
bBlockForUISound = TRUE
BREAK
DEFAULT
SET_AUDIO_FLAG("HoldMissionCompleteWhenPrepared", TRUE)
MISSION_FLOW_PLAY_END_OF_MISSION_MUSIC(FALSE)
bBlockForUISound = TRUE
BREAK
ENDSWITCH
ELSE
SET_AUDIO_FLAG("HoldMissionCompleteWhenPrepared", TRUE)
MISSION_FLOW_PLAY_END_OF_MISSION_MUSIC(TRUE)
bBlockForUISound = TRUE
ENDIF
bUnhiddenInRegisters = GET_UNHIDDEN_IN_REGISTERS()
REQUEST_ADDITIONAL_TEXT("MISHSTA", MINIGAME_TEXT_SLOT)
WHILE NOT HAS_ADDITIONAL_TEXT_LOADED(MINIGAME_TEXT_SLOT)
CPRINTLN(DEBUG_MISSION_STATS, "<STAT WATCHER> Waiting additional text to load.")
WAIT(0)
ENDWHILE
bMovieWasLoaded = TRUE
CPRINTLN(DEBUG_MISSION_STATS, "<STAT WATCHER> Finished loading mission_complete.gfx")
WHILE IS_CUTSCENE_PLAYING()
CPRINTLN(DEBUG_MISSION_STATS, "<STAT WATCHER> Waiting for cutscene to not be playing.")
WAIT(0)
ENDWHILE
WHILE IS_PLAYER_DEAD(GET_PLAYER_INDEX())
CPRINTLN(DEBUG_MISSION_STATS, "<STAT WATCHER> Waiting for player to not be dead.")
WAIT(0)
ENDWHILE
ENDSCREEN_PREPARE(esd,TRUE)
SET_AUDIO_FLAG("HoldMissionCompleteWhenPrepared", FALSE)
IF bBlockForUISound
WHILE NOT IS_MISSION_COMPLETE_READY_FOR_UI()
CPRINTLN(DEBUG_MISSION_STATS, "MISSION_FLOW_PLAY_END_OF_MISSION_MUSIC: holding for IS_MISSION_COMPLETE_READY_FOR_UI due to bBlockForUI flag")
WAIT(0)
ENDWHILE
ENDIF
UNREGISTER_SCRIPT_WITH_AUDIO()
//now trigger the effect
//WAIT(500) // so that the visual synchs with the pulse
//WAIT(0)
ENDIF
IF g_bMissionStatSystemPrimed
StatSystemWasPrimed = TRUE
g_bMissionStatSystemPrimed = FALSE
ENDIF
//bSplashLock = FALSE
//bSplashHidden = FALSE
SETTIMERA(0)
ENDIF
//SCRIPT_ASSERT("BLAH2")
// Draw the Mission Passed screen!
CPRINTLN(DEBUG_MISSION_STATS, "<STAT WATCHER> Movie loaded : ", bMovieWasLoaded, " - reset flag : ", g_bMissionStatSystemResetFlag)
IF bMovieWasLoaded
AND (NOT g_bMissionStatSystemResetFlag)
IF GET_NUMBER_OF_THREADS_RUNNING_THE_SCRIPT_WITH_THIS_HASH(HASH("appCamera"))> 0
HANG_UP_AND_PUT_AWAY_PHONE()
ENDIF
IF g_iMissionStatsBeingTracked > 0
OR g_bMissionNoStatsNeedsSplashAndSting
IF g_MissionStatUIIgnoreFade
SET_SCRIPT_GFX_DRAW_ORDER(GFX_ORDER_AFTER_FADE)
ENDIF
//IF (NOT splash_EXCLUSION_CONDITIONS())
//Display mission passed with no vertical offset.
IF bUnhiddenInRegisters AND (NOT g_bMissionNoStatsNeedsSplashAndSting)
b_SuppressContextHelpNextUpdate = TRUE
ENDIF
IF NOT g_MissionStatSystemSuppressVisual
CPRINTLN(DEBUG_MISSION_STATS, "<STAT WATCHER> Rendering endscreen")
IF RENDER_ENDSCREEN(esd, FALSE,TO_FLOAT(iModeTimerMultiplier))
g_bMissionStatSystemResetFlag = TRUE
CPRINTLN(DEBUG_MISSION_STATS, "<STAT WATCHER> end triggered by RENDER_ENDSCREEN return")
ENDIF
DISABLE_SELECTOR_THIS_FRAME()
ENDIF
IF g_MissionStatUIIgnoreFade
SET_SCRIPT_GFX_DRAW_ORDER(GFX_ORDER_AFTER_FADE)
ENDIF
//ENDIF
ELSE
CPRINTLN(DEBUG_MISSION_STATS, "<STAT WATCHER> No tracked stats or no splash and sting ")
ENDIF
//Inform flow components that a mission passed box is displaying.
SET_RESULT_SCREEN_DISPLAYING_STATE(TRUE)
IF NOT IS_SCREEN_FADED_IN()
REPLAY_PREVENT_RECORDING_AND_UI_THIS_FRAME() //Fix for bug 2159183
ENDIF
// THEFEED_PAUSE()
//Hide help text while the mission passed screen is visible.
// IF IS_HUD_COMPONENT_ACTIVE(NEW_HUD_FEED)
// HIDE_HUD_COMPONENT_THIS_FRAME(NEW_HUD_FEED)
// ENDIF
//Display floating help text if this is the first time
//the passed box has displayed.
IF NOT HAS_ONE_TIME_HELP_DISPLAYED(FHM_FIRST_MISSION_PASS)
SWITCH GET_FLOW_HELP_MESSAGE_STATUS("AM_H_PASS")
CASE FHS_EXPIRED
CPRINTLN(DEBUG_MISSION_STATS, "<STAT WATCHER> Display First Mission Passed ")
ADD_HELP_TO_FLOW_QUEUE("AM_H_PASS", FHP_VERY_HIGH,2000, 2500, DEFAULT_HELP_TEXT_TIME)
BREAK
CASE FHS_DISPLAYED
SET_ONE_TIME_HELP_MESSAGE_DISPLAYED(FHM_FIRST_MISSION_PASS)
BREAK
ENDSWITCH
ENDIF
ENDIF
bWhatWasTheTriggerLastCheck = g_bMissionOverStatTrigger
// Reset the system if it's been visible for long enough.
IF g_bHeistEndscreenDisplaying
CPRINTLN(DEBUG_MISSION_STATS, "<STAT WATCHER> Cleanup delayed by g_bHeistEndscreenDisplaying")
ELSE
IS_PLAYER_DEAD(GET_PLAYER_INDEX())
IF GET_ENTITY_HEALTH(GET_PLAYER_PED(GET_PLAYER_INDEX())) < 1
CPRINTLN(DEBUG_MISSION_STATS, "<STAT WATCHER> Overlay player dead, canceling out of overlay")
g_MissionStatSystemSuppressVisual = TRUE //not using the reset flag for the overlay cancel out
//prevents issues
ENDIF
//IF (TIMERA() > (DISPLAY_DURATION-7500)*iModeTimerMultiplier)
//IF IS_CONTROL_JUST_PRESSED(FRONTEND_CONTROL, INPUT_FRONTEND_ACCEPT )
// //g_bMissionStatSystemResetFlag = TRUE
/// //esd.iEndScreenDisplayFinish = GET_GAME_TIMER() + 1165
//ENDIF
//ENDIF
IF IS_PLAYER_PED_SWITCH_IN_PROGRESS()
OR IS_TRANSITION_ACTIVE()
OR g_bMissionStatSystemResetFlag
OR g_flowUnsaved.bUpdatingGameflow
OR g_MissionStatSystemSuppressVisual
OR !bMovieWasLoaded
g_bMissionNoStatsNeedsSplashAndSting = FALSE
CPRINTLN(DEBUG_MISSION_STATS, "<STAT WATCHER> Mission passed screen ended.")
g_bMissionOverStatTrigger = FALSE
StatSystemWasPrimed = FALSE
g_bMissionStatSystemResponseToReplayNeeded = FALSE
g_bMissionStatSystemResponseToShitskipNeeded = FALSE
g_bMissionStatTimeWindowGate = FALSE
g_MissionStatSingleSpeedWatchEntity = NULL
SET_RESULT_SCREEN_DISPLAYING_STATE(FALSE)
// THEFEED_RESUME()
//iTimeToDisplayScreen = -1
RESET_MISSION_STATS_SYSTEM()
g_bMissionStatSystemResetFlag = FALSE
bDone = TRUE
ENDIF
ENDIF
ENDIF
ENDIF
WAIT(0)
ENDWHILE
ENDSCREEN_SHUTDOWN(esd)
CPRINTLN(DEBUG_MISSION_STATS, "<STAT WATCHER> Terminated due to end of script")
g_bHasAnyCheatBeenUsed = FALSE
g_bMissionStatSystemUploadPending = FALSE
TERMINATE_THIS_THREAD()
ENDSCRIPT