Merge pull request #9 from Nextra/statsx-lang

StatsX Language/Translation Update (bug 3040)
This commit is contained in:
Vincent Herbet 2014-05-04 20:15:22 +02:00
commit 60f54ee691

View File

@ -36,6 +36,7 @@
#include <amxmodx> #include <amxmodx>
#include <amxmisc> #include <amxmisc>
#include <csx> #include <csx>
#include <hamsandwich>
//-------------------------------- //--------------------------------
// Uncomment to activate log debug messages. // Uncomment to activate log debug messages.
@ -54,7 +55,7 @@
#define HUD_MIN_DURATION 0.2 #define HUD_MIN_DURATION 0.2
// Config plugin constants. // Config plugin constants.
#define MODE_HUD_DELAY 0 // Make a 0.01 sec delay on HUD reset process. #define MODE_HUD_DELAY 0 // Make a 0.1 sec delay on HUD reset process.
// You can also manualy enable or disable these options by setting them to 1 // You can also manualy enable or disable these options by setting them to 1
// For example: // For example:
@ -155,6 +156,11 @@ new Float:g_fHUDDuration = 0.0
new g_iRoundEndTriggered = 0 new g_iRoundEndTriggered = 0
new g_iRoundEndProcessed = 0 new g_iRoundEndProcessed = 0
new g_pFreezeTime = 0
new g_pRoundTime = 0
new g_pHudDuration = 0
new g_pHudFreezeLimit = 0
new Float:g_fStartGame = 0.0 new Float:g_fStartGame = 0.0
new g_izTeamScore[MAX_TEAMS] = {0, ...} new g_izTeamScore[MAX_TEAMS] = {0, ...}
new g_izTeamEventScore[MAX_TEAMS] = {0, ...} new g_izTeamEventScore[MAX_TEAMS] = {0, ...}
@ -190,7 +196,7 @@ public plugin_init()
// Register events. // Register events.
register_event("TextMsg", "eventStartGame", "a", "2=#Game_Commencing", "2=#Game_will_restart_in") register_event("TextMsg", "eventStartGame", "a", "2=#Game_Commencing", "2=#Game_will_restart_in")
register_event("ResetHUD", "eventResetHud", "be") RegisterHamPlayer(Ham_Spawn, "eventSpawn", 1)
register_event("RoundTime", "eventStartRound", "bc") register_event("RoundTime", "eventStartRound", "bc")
register_event("SendAudio", "eventEndRound", "a", "2=%!MRAD_terwin", "2=%!MRAD_ctwin", "2=%!MRAD_rounddraw") register_event("SendAudio", "eventEndRound", "a", "2=%!MRAD_terwin", "2=%!MRAD_ctwin", "2=%!MRAD_rounddraw")
register_event("TeamScore", "eventTeamScore", "a") register_event("TeamScore", "eventTeamScore", "a")
@ -230,12 +236,14 @@ public plugin_init()
register_clcmd("say /hudtest", "cmdHudTest") register_clcmd("say /hudtest", "cmdHudTest")
#endif #endif
register_cvar(HUD_DURATION_CVAR, HUD_DURATION) g_pHudDuration = register_cvar(HUD_DURATION_CVAR, HUD_DURATION)
register_cvar(HUD_FREEZE_LIMIT_CVAR, HUD_FREEZE_LIMIT) g_pHudFreezeLimit = register_cvar(HUD_FREEZE_LIMIT_CVAR, HUD_FREEZE_LIMIT)
g_pFreezeTime = get_cvar_pointer("mp_freezetime")
g_pRoundTime = get_cvar_pointer("mp_roundtime")
// Init buffers and some global vars. // Init buffers and some global vars.
g_sBuffer[0] = 0 g_sBuffer[0] = 0
save_team_chatscore()
g_HudSync_EndRound = CreateHudSyncObj() g_HudSync_EndRound = CreateHudSyncObj()
g_HudSync_SpecInfo = CreateHudSyncObj() g_HudSync_SpecInfo = CreateHudSyncObj()
@ -299,7 +307,7 @@ public cmdHudTest(id)
iLen = 0 iLen = 0
for (i = 1; i < 20; i++) for (i = 1; i < 20; i++)
iLen += format(g_sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "....x....1....x....2....x....3....x....4....x....^n") iLen += formatex(g_sBuffer[iLen], charsmax(g_sBuffer) - iLen, "....x....1....x....2....x....3....x....4....x....^n")
set_hudtype_killer(50.0) set_hudtype_killer(50.0)
show_hudmessage(id, "%s", g_sBuffer) show_hudmessage(id, "%s", g_sBuffer)
@ -335,7 +343,7 @@ set_plugin_mode(id, sFlags[])
if (sFlags[0]) if (sFlags[0])
g_iPluginMode = read_flags(sFlags) g_iPluginMode = read_flags(sFlags)
get_flags(g_iPluginMode, t_sText, MAX_TEXT_LENGTH) get_flags(g_iPluginMode, t_sText, charsmax(t_sText))
console_print(id, "%L", id, "MODE_SET_TO", t_sText) console_print(id, "%L", id, "MODE_SET_TO", t_sText)
return g_iPluginMode return g_iPluginMode
@ -344,17 +352,17 @@ set_plugin_mode(id, sFlags[])
// Get config parameters. // Get config parameters.
get_config_cvars() get_config_cvars()
{ {
g_fFreezeTime = get_cvar_float("mp_freezetime") g_fFreezeTime = get_pcvar_float(g_pFreezeTime)
if (g_fFreezeTime < 0.0) if (g_fFreezeTime < 0.0)
g_fFreezeTime = 0.0 g_fFreezeTime = 0.0
g_fHUDDuration = get_cvar_float(HUD_DURATION_CVAR) g_fHUDDuration = get_pcvar_float(g_pHudDuration)
if (g_fHUDDuration < 1.0) if (g_fHUDDuration < 1.0)
g_fHUDDuration = 1.0 g_fHUDDuration = 1.0
g_fFreezeLimitTime = get_cvar_float(HUD_FREEZE_LIMIT_CVAR) g_fFreezeLimitTime = get_pcvar_float(g_pHudFreezeLimit)
} }
// Get and format attackers header and list. // Get and format attackers header and list.
@ -379,34 +387,34 @@ get_attackers(id, sBuffer[MAX_BUFFER_LENGTH + 1])
if (izStats[STATS_SHOTS] && ShowFullStats) if (izStats[STATS_SHOTS] && ShowFullStats)
{ {
get_user_name(iAttacker, t_sName, MAX_NAME_LENGTH) get_user_name(iAttacker, t_sName, charsmax(t_sName))
iLen = format(sBuffer, MAX_BUFFER_LENGTH, "%L -- %s -- %0.2f%% %L:^n", id, "ATTACKERS", t_sName, accuracy(izStats), id, "ACC") iLen = formatex(sBuffer, charsmax(sBuffer), "%L -- %s -- %0.2f%% %L:^n", id, "ATTACKERS", t_sName, accuracy(izStats), id, "ACC")
} }
else else
iLen = format(sBuffer, MAX_BUFFER_LENGTH, "%L:^n", id, "ATTACKERS") iLen = formatex(sBuffer, charsmax(sBuffer), "%L:^n", id, "ATTACKERS")
// Get and format attacker list. // Get and format attacker list.
for (iAttacker = 1; iAttacker <= iMaxPlayer; iAttacker++) for (iAttacker = 1; iAttacker <= iMaxPlayer; iAttacker++)
{ {
if (get_user_astats(id, iAttacker, izStats, izBody, t_sWpn, MAX_WEAPON_LENGTH)) if (get_user_astats(id, iAttacker, izStats, izBody, t_sWpn, charsmax(t_sWpn)))
{ {
iFound = 1 iFound = 1
get_user_name(iAttacker, t_sName, MAX_NAME_LENGTH) get_user_name(iAttacker, t_sName, charsmax(t_sName))
if (izStats[STATS_KILLS]) if (izStats[STATS_KILLS])
{ {
if (!ShowDistHS) if (!ShowDistHS)
iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "%s -- %d %L / %d %L / %s^n", t_sName, izStats[STATS_HITS], id, "HIT_S", iLen += formatex(sBuffer[iLen], charsmax(sBuffer) - iLen, "%s -- %d %L / %d %L / %s^n", t_sName, izStats[STATS_HITS], id, "HIT_S",
izStats[STATS_DAMAGE], id, "DMG", t_sWpn) izStats[STATS_DAMAGE], id, "DMG", t_sWpn)
else if (izStats[STATS_HS]) else if (izStats[STATS_HS])
iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "%s -- %d %L / %d %L / %s / %0.0f m / HS^n", t_sName, izStats[STATS_HITS], id, "HIT_S", iLen += formatex(sBuffer[iLen], charsmax(sBuffer) - iLen, "%s -- %d %L / %d %L / %s / %0.0f m / HS^n", t_sName, izStats[STATS_HITS], id, "HIT_S",
izStats[STATS_DAMAGE], id, "DMG", t_sWpn, distance(g_izUserAttackerDistance[id])) izStats[STATS_DAMAGE], id, "DMG", t_sWpn, distance(g_izUserAttackerDistance[id]))
else else
iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "%s -- %d %L / %d %L / %s / %0.0f m^n", t_sName, izStats[STATS_HITS], id, "HIT_S", iLen += formatex(sBuffer[iLen], charsmax(sBuffer) - iLen, "%s -- %d %L / %d %L / %s / %0.0f m^n", t_sName, izStats[STATS_HITS], id, "HIT_S",
izStats[STATS_DAMAGE], id, "DMG", t_sWpn, distance(g_izUserAttackerDistance[id])) izStats[STATS_DAMAGE], id, "DMG", t_sWpn, distance(g_izUserAttackerDistance[id]))
} }
else else
iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "%s -- %d %L / %d %L^n", t_sName, izStats[STATS_HITS], id, "HIT_S", izStats[STATS_DAMAGE], id, "DMG") iLen += formatex(sBuffer[iLen], charsmax(sBuffer) - iLen, "%s -- %d %L / %d %L^n", t_sName, izStats[STATS_HITS], id, "HIT_S", izStats[STATS_DAMAGE], id, "DMG")
} }
} }
@ -434,31 +442,31 @@ get_victims(id, sBuffer[MAX_BUFFER_LENGTH + 1])
get_user_vstats(id, 0, izStats, izBody) get_user_vstats(id, 0, izStats, izBody)
if (izStats[STATS_SHOTS]) if (izStats[STATS_SHOTS])
iLen = format(sBuffer, MAX_BUFFER_LENGTH, "%L -- %0.2f%% %L:^n", id, "VICTIMS", accuracy(izStats), id, "ACC") iLen = formatex(sBuffer, charsmax(sBuffer), "%L -- %0.2f%% %L:^n", id, "VICTIMS", accuracy(izStats), id, "ACC")
else else
iLen = format(sBuffer, MAX_BUFFER_LENGTH, "%L:^n", id, "VICTIMS") iLen = formatex(sBuffer, charsmax(sBuffer), "%L:^n", id, "VICTIMS")
for (iVictim = 1; iVictim <= iMaxPlayer; iVictim++) for (iVictim = 1; iVictim <= iMaxPlayer; iVictim++)
{ {
if (get_user_vstats(id, iVictim, izStats, izBody, t_sWpn, MAX_WEAPON_LENGTH)) if (get_user_vstats(id, iVictim, izStats, izBody, t_sWpn, charsmax(t_sWpn)))
{ {
iFound = 1 iFound = 1
get_user_name(iVictim, t_sName, MAX_NAME_LENGTH) get_user_name(iVictim, t_sName, charsmax(t_sName))
if (izStats[STATS_DEATHS]) if (izStats[STATS_DEATHS])
{ {
if (!ShowDistHS) if (!ShowDistHS)
iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "%s -- %d %L / %d %L / %s^n", t_sName, izStats[STATS_HITS], id, "HIT_S", iLen += formatex(sBuffer[iLen], charsmax(sBuffer) - iLen, "%s -- %d %L / %d %L / %s^n", t_sName, izStats[STATS_HITS], id, "HIT_S",
izStats[STATS_DAMAGE], id, "DMG", t_sWpn) izStats[STATS_DAMAGE], id, "DMG", t_sWpn)
else if (izStats[STATS_HS]) else if (izStats[STATS_HS])
iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "%s -- %d %L / %d %L / %s / %0.0f m / HS^n", t_sName, izStats[STATS_HITS], id, "HIT_S", iLen += formatex(sBuffer[iLen], charsmax(sBuffer) - iLen, "%s -- %d %L / %d %L / %s / %0.0f m / HS^n", t_sName, izStats[STATS_HITS], id, "HIT_S",
izStats[STATS_DAMAGE], id, "DMG", t_sWpn, distance(g_izUserVictimDistance[id][iVictim])) izStats[STATS_DAMAGE], id, "DMG", t_sWpn, distance(g_izUserVictimDistance[id][iVictim]))
else else
iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "%s -- %d %L / %d %L / %s / %0.0f m^n", t_sName, izStats[STATS_HITS], id, "HIT_S", iLen += formatex(sBuffer[iLen], charsmax(sBuffer) - iLen, "%s -- %d %L / %d %L / %s / %0.0f m^n", t_sName, izStats[STATS_HITS], id, "HIT_S",
izStats[STATS_DAMAGE], id, "DMG", t_sWpn, distance(g_izUserVictimDistance[id][iVictim])) izStats[STATS_DAMAGE], id, "DMG", t_sWpn, distance(g_izUserVictimDistance[id][iVictim]))
} }
else else
iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "%s -- %d %L / %d %L^n", t_sName, izStats[STATS_HITS], id, "HIT_S", izStats[STATS_DAMAGE], id, "DMG") iLen += formatex(sBuffer[iLen], charsmax(sBuffer) - iLen, "%s -- %d %L / %d %L^n", t_sName, izStats[STATS_HITS], id, "HIT_S", izStats[STATS_DAMAGE], id, "DMG")
} }
} }
@ -481,99 +489,99 @@ get_kill_info(id, iKiller, sBuffer[MAX_BUFFER_LENGTH + 1])
new izAStats[8], izABody[8], izVStats[8], iaVBody[8] new izAStats[8], izABody[8], izVStats[8], iaVBody[8]
iFound = 1 iFound = 1
get_user_name(iKiller, t_sName, MAX_NAME_LENGTH) get_user_name(iKiller, t_sName, charsmax(t_sName))
izAStats[STATS_HITS] = 0 izAStats[STATS_HITS] = 0
izAStats[STATS_DAMAGE] = 0 izAStats[STATS_DAMAGE] = 0
t_sWpn[0] = 0 t_sWpn[0] = 0
get_user_astats(id, iKiller, izAStats, izABody, t_sWpn, MAX_WEAPON_LENGTH) get_user_astats(id, iKiller, izAStats, izABody, t_sWpn, charsmax(t_sWpn))
izVStats[STATS_HITS] = 0 izVStats[STATS_HITS] = 0
izVStats[STATS_DAMAGE] = 0 izVStats[STATS_DAMAGE] = 0
get_user_vstats(id, iKiller, izVStats, iaVBody) get_user_vstats(id, iKiller, izVStats, iaVBody)
iLen = format(sBuffer, MAX_BUFFER_LENGTH, "%L^n", id, "KILLED_YOU_DIST", t_sName, t_sWpn, distance(g_izUserAttackerDistance[id])) iLen = formatex(sBuffer, charsmax(sBuffer), "%L^n", id, "KILLED_YOU_DIST", t_sName, t_sWpn, distance(g_izUserAttackerDistance[id]))
iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "%L^n", id, "DID_DMG_HITS", izAStats[STATS_DAMAGE], izAStats[STATS_HITS], g_izKilled[id][KILLED_KILLER_HEALTH], g_izKilled[id][KILLED_KILLER_ARMOUR]) iLen += formatex(sBuffer[iLen], charsmax(sBuffer) - iLen, "%L^n", id, "DID_DMG_HITS", izAStats[STATS_DAMAGE], izAStats[STATS_HITS], g_izKilled[id][KILLED_KILLER_HEALTH], g_izKilled[id][KILLED_KILLER_ARMOUR])
iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "%L^n", id, "YOU_DID_DMG", izVStats[STATS_DAMAGE], izVStats[STATS_HITS]) iLen += formatex(sBuffer[iLen], charsmax(sBuffer) - iLen, "%L^n", id, "YOU_DID_DMG", izVStats[STATS_DAMAGE], izVStats[STATS_HITS])
} }
return iFound return iFound
} }
// Get and format most disruptive. // Get and format most disruptive.
add_most_disruptive(sBuffer[MAX_BUFFER_LENGTH + 1]) add_most_disruptive(id, sBuffer[MAX_BUFFER_LENGTH + 1])
{ {
new id, iMaxDamageId, iMaxDamage, iMaxHeadShots new iPlayer, iMaxDamageId, iMaxDamage, iMaxHeadShots
iMaxDamageId = 0 iMaxDamageId = 0
iMaxDamage = 0 iMaxDamage = 0
iMaxHeadShots = 0 iMaxHeadShots = 0
// Find player. // Find player.
for (id = 1; id < MAX_PLAYERS; id++) for (iPlayer = 1; iPlayer < MAX_PLAYERS; iPlayer++)
{ {
if (g_izUserRndStats[id][STATS_DAMAGE] >= iMaxDamage && (g_izUserRndStats[id][STATS_DAMAGE] > iMaxDamage || g_izUserRndStats[id][STATS_HS] > iMaxHeadShots)) if (g_izUserRndStats[iPlayer][STATS_DAMAGE] >= iMaxDamage && (g_izUserRndStats[iPlayer][STATS_DAMAGE] > iMaxDamage || g_izUserRndStats[iPlayer][STATS_HS] > iMaxHeadShots))
{ {
iMaxDamageId = id iMaxDamageId = iPlayer
iMaxDamage = g_izUserRndStats[id][STATS_DAMAGE] iMaxDamage = g_izUserRndStats[iPlayer][STATS_DAMAGE]
iMaxHeadShots = g_izUserRndStats[id][STATS_HS] iMaxHeadShots = g_izUserRndStats[iPlayer][STATS_HS]
} }
} }
// Format statistics. // Format statistics.
if (iMaxDamageId) if (iMaxDamageId)
{ {
id = iMaxDamageId iPlayer = iMaxDamageId
new Float:fGameEff = effec(g_izUserGameStats[id]) new Float:fGameEff = effec(g_izUserGameStats[iPlayer])
new Float:fRndAcc = accuracy(g_izUserRndStats[id]) new Float:fRndAcc = accuracy(g_izUserRndStats[iPlayer])
format(t_sText, MAX_TEXT_LENGTH, "%L: %s^n%d %L / %d %L -- %0.2f%% %L / %0.2f%% %L^n", LANG_SERVER, "MOST_DMG", g_izUserRndName[id], formatex(t_sText, charsmax(t_sText), "%L: %s^n%d %L / %d %L -- %0.2f%% %L / %0.2f%% %L^n", id, "MOST_DMG", g_izUserRndName[iPlayer],
g_izUserRndStats[id][STATS_HITS], LANG_SERVER, "HIT_S", iMaxDamage, LANG_SERVER, "DMG", fGameEff, LANG_SERVER, "EFF", fRndAcc, LANG_SERVER, "ACC") g_izUserRndStats[iPlayer][STATS_HITS], id, "HIT_S", iMaxDamage, id, "DMG", fGameEff, id, "EFF", fRndAcc, id, "ACC")
add(sBuffer, MAX_BUFFER_LENGTH, t_sText) add(sBuffer, charsmax(sBuffer), t_sText)
} }
return iMaxDamageId return iMaxDamageId
} }
// Get and format best score. // Get and format best score.
add_best_score(sBuffer[MAX_BUFFER_LENGTH + 1]) add_best_score(id, sBuffer[MAX_BUFFER_LENGTH + 1])
{ {
new id, iMaxKillsId, iMaxKills, iMaxHeadShots new iPlayer, iMaxKillsId, iMaxKills, iMaxHeadShots
iMaxKillsId = 0 iMaxKillsId = 0
iMaxKills = 0 iMaxKills = 0
iMaxHeadShots = 0 iMaxHeadShots = 0
// Find player // Find player
for (id = 1; id < MAX_PLAYERS; id++) for (iPlayer = 1; iPlayer < MAX_PLAYERS; iPlayer++)
{ {
if (g_izUserRndStats[id][STATS_KILLS] >= iMaxKills && (g_izUserRndStats[id][STATS_KILLS] > iMaxKills || g_izUserRndStats[id][STATS_HS] > iMaxHeadShots)) if (g_izUserRndStats[iPlayer][STATS_KILLS] >= iMaxKills && (g_izUserRndStats[iPlayer][STATS_KILLS] > iMaxKills || g_izUserRndStats[iPlayer][STATS_HS] > iMaxHeadShots))
{ {
iMaxKillsId = id iMaxKillsId = iPlayer
iMaxKills = g_izUserRndStats[id][STATS_KILLS] iMaxKills = g_izUserRndStats[iPlayer][STATS_KILLS]
iMaxHeadShots = g_izUserRndStats[id][STATS_HS] iMaxHeadShots = g_izUserRndStats[iPlayer][STATS_HS]
} }
} }
// Format statistics. // Format statistics.
if (iMaxKillsId) if (iMaxKillsId)
{ {
id = iMaxKillsId iPlayer = iMaxKillsId
new Float:fGameEff = effec(g_izUserGameStats[id]) new Float:fGameEff = effec(g_izUserGameStats[iPlayer])
new Float:fRndAcc = accuracy(g_izUserRndStats[id]) new Float:fRndAcc = accuracy(g_izUserRndStats[iPlayer])
format(t_sText, MAX_TEXT_LENGTH, "%L: %s^n%d %L / %d hs -- %0.2f%% %L / %0.2f%% %L^n", LANG_SERVER, "BEST_SCORE", g_izUserRndName[id], formatex(t_sText, charsmax(t_sText), "%L: %s^n%d %L / %d hs -- %0.2f%% %L / %0.2f%% %L^n", id, "BEST_SCORE", g_izUserRndName[iPlayer],
iMaxKills, LANG_SERVER, "KILL_S", iMaxHeadShots, fGameEff, LANG_SERVER, "EFF", fRndAcc, LANG_SERVER, "ACC") iMaxKills, id, "KILL_S", iMaxHeadShots, fGameEff, id, "EFF", fRndAcc, id, "ACC")
add(sBuffer, MAX_BUFFER_LENGTH, t_sText) add(sBuffer, charsmax(sBuffer), t_sText)
} }
return iMaxKillsId return iMaxKillsId
} }
// Get and format team score. // Get and format team score.
add_team_score(sBuffer[MAX_BUFFER_LENGTH + 1]) add_team_score(id, sBuffer[MAX_BUFFER_LENGTH + 1])
{ {
new Float:fzMapEff[MAX_TEAMS], Float:fzMapAcc[MAX_TEAMS], Float:fzRndAcc[MAX_TEAMS] new Float:fzMapEff[MAX_TEAMS], Float:fzMapAcc[MAX_TEAMS], Float:fzRndAcc[MAX_TEAMS]
@ -586,13 +594,13 @@ add_team_score(sBuffer[MAX_BUFFER_LENGTH + 1])
} }
// Format round team stats, MOTD // Format round team stats, MOTD
format(t_sText, MAX_TEXT_LENGTH, "TERRORIST %d / %0.2f%% %L / %0.2f%% %L^nCT %d / %0.2f%% %L / %0.2f%% %L^n", g_izTeamScore[0], formatex(t_sText, charsmax(t_sText), "TERRORIST %d / %0.2f%% %L / %0.2f%% %L^nCT %d / %0.2f%% %L / %0.2f%% %L^n", g_izTeamScore[0],
fzMapEff[0], LANG_SERVER, "EFF", fzRndAcc[0], LANG_SERVER, "ACC", g_izTeamScore[1], fzMapEff[1], LANG_SERVER, "EFF", fzRndAcc[1], LANG_SERVER, "ACC") fzMapEff[0], id, "EFF", fzRndAcc[0], id, "ACC", g_izTeamScore[1], fzMapEff[1], id, "EFF", fzRndAcc[1], id, "ACC")
add(sBuffer, MAX_BUFFER_LENGTH, t_sText) add(sBuffer, charsmax(sBuffer), t_sText)
} }
// Get and format team stats, chat version // Get and format team stats, chat version
save_team_chatscore() save_team_chatscore(id, sBuffer[MAX_TEXT_LENGTH + 1])
{ {
new Float:fzMapEff[MAX_TEAMS], Float:fzMapAcc[MAX_TEAMS], Float:fzRndAcc[MAX_TEAMS] new Float:fzMapEff[MAX_TEAMS], Float:fzMapAcc[MAX_TEAMS], Float:fzRndAcc[MAX_TEAMS]
@ -605,16 +613,16 @@ save_team_chatscore()
} }
// Format game team stats, chat // Format game team stats, chat
format(g_sScore, MAX_BUFFER_LENGTH, "TERRORIST %d / %0.2f%% %L / %0.2f%% %L -- CT %d / %0.2f%% %L / %0.2f%% %L", g_izTeamScore[0], formatex(sBuffer, charsmax(sBuffer), "TERRORIST %d / %0.2f%% %L / %0.2f%% %L -- CT %d / %0.2f%% %L / %0.2f%% %L", g_izTeamScore[0],
fzMapEff[0], LANG_SERVER, "EFF", fzMapAcc[0], LANG_SERVER, "ACC", g_izTeamScore[1], fzMapEff[1], LANG_SERVER, "EFF", fzMapAcc[1], LANG_SERVER, "ACC") fzMapEff[0], id, "EFF", fzMapAcc[0], id, "ACC", g_izTeamScore[1], fzMapEff[1], id, "EFF", fzMapAcc[1], id, "ACC")
} }
// Get and format total stats. // Get and format total stats.
add_total_stats(sBuffer[MAX_BUFFER_LENGTH + 1]) add_total_stats(id, sBuffer[MAX_BUFFER_LENGTH + 1])
{ {
format(t_sText, MAX_TEXT_LENGTH, "%L: %d %L / %d hs -- %d %L / %d %L^n", LANG_SERVER, "TOTAL", g_izUserRndStats[0][STATS_KILLS], LANG_SERVER, "KILL_S", formatex(t_sText, charsmax(t_sText), "%L: %d %L / %d hs -- %d %L / %d %L^n", id, "TOTAL", g_izUserRndStats[0][STATS_KILLS], id, "KILL_S",
g_izUserRndStats[0][STATS_HS], g_izUserRndStats[0][STATS_HITS], LANG_SERVER, "HITS", g_izUserRndStats[0][STATS_SHOTS], LANG_SERVER, "SHOT_S") g_izUserRndStats[0][STATS_HS], g_izUserRndStats[0][STATS_HITS], id, "HITS", g_izUserRndStats[0][STATS_SHOTS], id, "SHOT_S")
add(sBuffer, MAX_BUFFER_LENGTH, t_sText) add(sBuffer, charsmax(sBuffer), t_sText)
} }
// Get and format a user's list of body hits from an attacker. // Get and format a user's list of body hits from an attacker.
@ -633,16 +641,16 @@ add_attacker_hits(id, iAttacker, sBuffer[MAX_BUFFER_LENGTH + 1])
{ {
iFound = 1 iFound = 1
iLen = strlen(sBuffer) iLen = strlen(sBuffer)
get_user_name(iAttacker, t_sName, MAX_NAME_LENGTH) get_user_name(iAttacker, t_sName, charsmax(t_sName))
iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "%L:^n", id, "HITS_YOU_IN", t_sName) iLen += formatex(sBuffer[iLen], charsmax(sBuffer) - iLen, "%L:^n", id, "HITS_YOU_IN", t_sName)
for (new i = 1; i < 8; i++) for (new i = 1; i < 8; i++)
{ {
if (!izBody[i]) if (!izBody[i])
continue continue
iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "%L: %d^n", id, BODY_PART[i], izBody[i]) iLen += formatex(sBuffer[iLen], charsmax(sBuffer) - iLen, "%L: %d^n", id, BODY_PART[i], izBody[i])
} }
} }
} }
@ -661,11 +669,11 @@ format_kill_ainfo(id, iKiller, sBuffer[MAX_BUFFER_LENGTH + 1])
new iLen new iLen
iFound = 1 iFound = 1
get_user_name(iKiller, t_sName, MAX_NAME_LENGTH) get_user_name(iKiller, t_sName, charsmax(t_sName))
izStats[STATS_HITS] = 0 izStats[STATS_HITS] = 0
get_user_astats(id, iKiller, izStats, izBody, t_sWpn, MAX_WEAPON_LENGTH) get_user_astats(id, iKiller, izStats, izBody, t_sWpn, charsmax(t_sWpn))
iLen = format(sBuffer, MAX_BUFFER_LENGTH, "%L (%dhp, %dap) >>", id, "KILLED_BY_WITH", t_sName, t_sWpn, distance(g_izUserAttackerDistance[id]), iLen = formatex(sBuffer, charsmax(sBuffer), "%L (%dhp, %dap) >>", id, "KILLED_BY_WITH", t_sName, t_sWpn, distance(g_izUserAttackerDistance[id]),
g_izKilled[id][KILLED_KILLER_HEALTH], g_izKilled[id][KILLED_KILLER_ARMOUR]) g_izKilled[id][KILLED_KILLER_HEALTH], g_izKilled[id][KILLED_KILLER_ARMOUR])
if (izStats[STATS_HITS]) if (izStats[STATS_HITS])
@ -675,14 +683,14 @@ format_kill_ainfo(id, iKiller, sBuffer[MAX_BUFFER_LENGTH + 1])
if (!izBody[i]) if (!izBody[i])
continue continue
iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, " %L: %d", id, BODY_PART[i], izBody[i]) iLen += formatex(sBuffer[iLen], charsmax(sBuffer) - iLen, " %L: %d", id, BODY_PART[i], izBody[i])
} }
} }
else else
iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, " %L", id, "NO_HITS") iLen += formatex(sBuffer[iLen], charsmax(sBuffer) - iLen, " %L", id, "NO_HITS")
} }
else else
format(sBuffer, MAX_BUFFER_LENGTH, "%L", id, "YOU_NO_KILLER") formatex(sBuffer, charsmax(sBuffer), "%L", id, "YOU_NO_KILLER")
return iFound return iFound
} }
@ -702,11 +710,11 @@ format_kill_vinfo(id, iKiller, sBuffer[MAX_BUFFER_LENGTH + 1])
if (iKiller && iKiller != id) if (iKiller && iKiller != id)
{ {
iFound = 1 iFound = 1
get_user_name(iKiller, t_sName, MAX_NAME_LENGTH) get_user_name(iKiller, t_sName, charsmax(t_sName))
iLen = format(sBuffer, MAX_BUFFER_LENGTH, "%L >>", id, "YOU_HIT", t_sName, izStats[STATS_HITS], izStats[STATS_DAMAGE]) iLen = formatex(sBuffer, charsmax(sBuffer), "%L >>", id, "YOU_HIT", t_sName, izStats[STATS_HITS], izStats[STATS_DAMAGE])
} }
else else
iLen = format(sBuffer, MAX_BUFFER_LENGTH, "%L >>", id, "LAST_RES", izStats[STATS_HITS], izStats[STATS_DAMAGE]) iLen = formatex(sBuffer, charsmax(sBuffer), "%L >>", id, "LAST_RES", izStats[STATS_HITS], izStats[STATS_DAMAGE])
if (izStats[STATS_HITS]) if (izStats[STATS_HITS])
{ {
@ -715,17 +723,17 @@ format_kill_vinfo(id, iKiller, sBuffer[MAX_BUFFER_LENGTH + 1])
if (!izBody[i]) if (!izBody[i])
continue continue
iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, " %L: %d", id, BODY_PART[i], izBody[i]) iLen += formatex(sBuffer[iLen], charsmax(sBuffer) - iLen, " %L: %d", id, BODY_PART[i], izBody[i])
} }
} }
else else
iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, " %L", id, "NO_HITS") iLen += formatex(sBuffer[iLen], charsmax(sBuffer) - iLen, " %L", id, "NO_HITS")
return iFound return iFound
} }
// Get and format top 15. // Get and format top 15.
format_top15(sBuffer[MAX_BUFFER_LENGTH + 1]) format_top15(id, sBuffer[MAX_BUFFER_LENGTH + 1])
{ {
new iMax = get_statsnum() new iMax = get_statsnum()
new izStats[8], izBody[8] new izStats[8], izBody[8]
@ -736,25 +744,25 @@ format_top15(sBuffer[MAX_BUFFER_LENGTH + 1])
new lKills[16], lDeaths[16], lHits[16], lShots[16], lEff[16], lAcc[16] new lKills[16], lDeaths[16], lHits[16], lShots[16], lEff[16], lAcc[16]
format(lKills, 15, "%L", LANG_SERVER, "KILLS") formatex(lKills, charsmax(lKills), "%L", id, "KILLS")
format(lDeaths, 15, "%L", LANG_SERVER, "DEATHS") formatex(lDeaths, charsmax(lDeaths), "%L", id, "DEATHS")
format(lHits, 15, "%L", LANG_SERVER, "HITS") formatex(lHits, charsmax(lHits), "%L", id, "HITS")
format(lShots, 15, "%L", LANG_SERVER, "SHOTS") formatex(lShots, charsmax(lShots), "%L", id, "SHOTS")
format(lEff, 15, "%L", LANG_SERVER, "EFF") formatex(lEff, charsmax(lEff), "%L", id, "EFF")
format(lAcc, 15, "%L", LANG_SERVER, "ACC") formatex(lAcc, charsmax(lAcc), "%L", id, "ACC")
ucfirst(lEff) ucfirst(lEff)
ucfirst(lAcc) ucfirst(lAcc)
iLen = format(sBuffer, MAX_BUFFER_LENGTH, "<meta charset=utf-8><body bgcolor=#000000><font color=#FFB000><pre>") iLen = formatex(sBuffer, charsmax(sBuffer), "<meta charset=utf-8><body bgcolor=#000000><font color=#FFB000><pre>")
iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "%2s %-22.22s %6s %6s %6s %6s %4s %4s %4s^n", "#", "Nick", lKills, lDeaths, lHits, lShots, "HS", lEff, lAcc) iLen += formatex(sBuffer[iLen], charsmax(sBuffer) - iLen, "%2s %-22.22s %6s %6s %6s %6s %4s %4s %4s^n", "#", "Nick", lKills, lDeaths, lHits, lShots, "HS", lEff, lAcc)
for (new i = 0; i < iMax && MAX_BUFFER_LENGTH - iLen > 0; i++) for (new i = 0; i < iMax && charsmax(sBuffer) - iLen > 0; i++)
{ {
get_stats(i, izStats, izBody, t_sName, MAX_NAME_LENGTH) get_stats(i, izStats, izBody, t_sName, charsmax(t_sName))
replace_all(t_sName, MAX_NAME_LENGTH, "<", "[") replace_string(t_sName, charsmax(t_sName), "<", "[")
replace_all(t_sName, MAX_NAME_LENGTH, ">", "]") replace_string(t_sName, charsmax(t_sName), ">", "]")
iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "%2d %-22.22s %6d %6d %6d %6d %4d %3.0f%% %3.0f%%^n", i + 1, t_sName, izStats[STATS_KILLS], iLen += formatex(sBuffer[iLen], charsmax(sBuffer) - iLen, "%2d %-22.22s %6d %6d %6d %6d %4d %3.0f%% %3.0f%%^n", i + 1, t_sName, izStats[STATS_KILLS],
izStats[STATS_DEATHS], izStats[STATS_HITS], izStats[STATS_SHOTS], izStats[STATS_HS], effec(izStats), accuracy(izStats)) izStats[STATS_DEATHS], izStats[STATS_HITS], izStats[STATS_SHOTS], izStats[STATS_HS], effec(izStats), accuracy(izStats))
} }
} }
@ -767,21 +775,21 @@ format_rankstats(id, sBuffer[MAX_BUFFER_LENGTH + 1], iMyId = 0)
new iRankPos, iLen new iRankPos, iLen
new lKills[16], lDeaths[16], lHits[16], lShots[16], lDamage[16], lEff[16], lAcc[16] new lKills[16], lDeaths[16], lHits[16], lShots[16], lDamage[16], lEff[16], lAcc[16]
format(lKills, 15, "%L", id, "KILLS") formatex(lKills, charsmax(lKills), "%L", id, "KILLS")
format(lDeaths, 15, "%L", id, "DEATHS") formatex(lDeaths, charsmax(lDeaths), "%L", id, "DEATHS")
format(lHits, 15, "%L", id, "HITS") formatex(lHits, charsmax(lHits), "%L", id, "HITS")
format(lShots, 15, "%L", id, "SHOTS") formatex(lShots, charsmax(lShots), "%L", id, "SHOTS")
format(lDamage, 15, "%L", id, "DAMAGE") formatex(lDamage, charsmax(lDamage), "%L", id, "DAMAGE")
format(lEff, 15, "%L", id, "EFF") formatex(lEff, charsmax(lEff), "%L", id, "EFF")
format(lAcc, 15, "%L", id, "ACC") formatex(lAcc, charsmax(lAcc), "%L", id, "ACC")
ucfirst(lEff) ucfirst(lEff)
ucfirst(lAcc) ucfirst(lAcc)
iRankPos = get_user_stats(id, izStats, izBody) iRankPos = get_user_stats(id, izStats, izBody)
iLen = format(sBuffer, MAX_BUFFER_LENGTH, "<body bgcolor=#000000><font color=#FFB000><pre>") iLen = formatex(sBuffer, charsmax(sBuffer), "<body bgcolor=#000000><font color=#FFB000><pre>")
iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "%L %L^n^n", id, (!iMyId || iMyId == id) ? "YOUR" : "PLAYERS", id, "RANK_IS", iRankPos, get_statsnum()) iLen += formatex(sBuffer[iLen], charsmax(sBuffer) - iLen, "%L %L^n^n", id, (!iMyId || iMyId == id) ? "YOUR" : "PLAYERS", id, "RANK_IS", iRankPos, get_statsnum())
iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "%6s: %d (%d with hs)^n%6s: %d^n%6s: %d^n%6s: %d^n%6s: %d^n%6s: %0.2f%%^n%6s: %0.2f%%^n^n", iLen += formatex(sBuffer[iLen], charsmax(sBuffer) - iLen, "%6s: %d (%d with hs)^n%6s: %d^n%6s: %d^n%6s: %d^n%6s: %d^n%6s: %0.2f%%^n%6s: %0.2f%%^n^n",
lKills, izStats[STATS_KILLS], izStats[STATS_HS], lDeaths, izStats[STATS_DEATHS], lHits, izStats[STATS_HITS], lShots, izStats[STATS_SHOTS], lKills, izStats[STATS_KILLS], izStats[STATS_HS], lDeaths, izStats[STATS_DEATHS], lHits, izStats[STATS_HITS], lShots, izStats[STATS_SHOTS],
lDamage, izStats[STATS_DAMAGE], lEff, effec(izStats), lAcc, accuracy(izStats)) lDamage, izStats[STATS_DAMAGE], lEff, effec(izStats), lAcc, accuracy(izStats))
@ -789,10 +797,10 @@ format_rankstats(id, sBuffer[MAX_BUFFER_LENGTH + 1], iMyId = 0)
for (new i = 1; i < 8; i++) for (new i = 1; i < 8; i++)
{ {
format(L_BODY_PART[i], 31, "%L", id, BODY_PART[i]) formatex(L_BODY_PART[i], charsmax(L_BODY_PART[]), "%L", id, BODY_PART[i])
} }
iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "%10s:^n%10s: %d^n%10s: %d^n%10s: %d^n%10s: %d^n%10s: %d^n%10s: %d^n%10s: %d", "HITS", iLen += formatex(sBuffer[iLen], charsmax(sBuffer) - iLen, "%10s:^n%10s: %d^n%10s: %d^n%10s: %d^n%10s: %d^n%10s: %d^n%10s: %d^n%10s: %d", "HITS",
L_BODY_PART[1], izBody[1], L_BODY_PART[2], izBody[2], L_BODY_PART[3], izBody[3], L_BODY_PART[4], izBody[4], L_BODY_PART[5], L_BODY_PART[1], izBody[1], L_BODY_PART[2], izBody[2], L_BODY_PART[3], izBody[3], L_BODY_PART[4], izBody[4], L_BODY_PART[5],
izBody[5], L_BODY_PART[6], izBody[6], L_BODY_PART[7], izBody[7]) izBody[5], L_BODY_PART[6], izBody[6], L_BODY_PART[7], izBody[7])
} }
@ -805,44 +813,74 @@ format_stats(id, sBuffer[MAX_BUFFER_LENGTH + 1])
new iWeapon, iLen new iWeapon, iLen
new lKills[16], lDeaths[16], lHits[16], lShots[16], lDamage[16], lEff[16], lAcc[16], lWeapon[16] new lKills[16], lDeaths[16], lHits[16], lShots[16], lDamage[16], lEff[16], lAcc[16], lWeapon[16]
format(lKills, 15, "%L", id, "KILLS") formatex(lKills, charsmax(lKills), "%L", id, "KILLS")
format(lDeaths, 15, "%L", id, "DEATHS") formatex(lDeaths, charsmax(lDeaths), "%L", id, "DEATHS")
format(lHits, 15, "%L", id, "HITS") formatex(lHits, charsmax(lHits), "%L", id, "HITS")
format(lShots, 15, "%L", id, "SHOTS") formatex(lShots, charsmax(lShots), "%L", id, "SHOTS")
format(lDamage, 15, "%L", id, "DAMAGE") formatex(lDamage, charsmax(lDamage), "%L", id, "DAMAGE")
format(lEff, 15, "%L", id, "EFF") formatex(lEff, charsmax(lEff), "%L", id, "EFF")
format(lAcc, 15, "%L", id, "ACC") formatex(lAcc, charsmax(lAcc), "%L", id, "ACC")
format(lWeapon, 15, "%L", id, "WEAPON") formatex(lWeapon, charsmax(lWeapon), "%L", id, "WEAPON")
ucfirst(lEff) ucfirst(lEff)
ucfirst(lAcc) ucfirst(lAcc)
get_user_wstats(id, 0, izStats, izBody) get_user_wstats(id, 0, izStats, izBody)
iLen = format(sBuffer, MAX_BUFFER_LENGTH, "<body bgcolor=#000000><font color=#FFB000><pre>") iLen = formatex(sBuffer, charsmax(sBuffer), "<body bgcolor=#000000><font color=#FFB000><pre>")
iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "%6s: %d (%d with hs)^n%6s: %d^n%6s: %d^n%6s: %d^n%6s: %d^n%6s: %0.2f%%^n%6s: %0.2f%%^n^n", iLen += formatex(sBuffer[iLen], charsmax(sBuffer) - iLen, "%6s: %d (%d with hs)^n%6s: %d^n%6s: %d^n%6s: %d^n%6s: %d^n%6s: %0.2f%%^n%6s: %0.2f%%^n^n",
lKills, izStats[STATS_KILLS], izStats[STATS_HS], lDeaths, izStats[STATS_DEATHS], lHits, izStats[STATS_HITS], lShots, izStats[STATS_SHOTS], lKills, izStats[STATS_KILLS], izStats[STATS_HS], lDeaths, izStats[STATS_DEATHS], lHits, izStats[STATS_HITS], lShots, izStats[STATS_SHOTS],
lDamage, izStats[STATS_DAMAGE], lEff, effec(izStats), lAcc, accuracy(izStats)) lDamage, izStats[STATS_DAMAGE], lEff, effec(izStats), lAcc, accuracy(izStats))
iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "%-12.12s %6s %6s %6s %6s %6s %4s^n", lWeapon, lKills, lDeaths, lHits, lShots, lDamage, lAcc) iLen += formatex(sBuffer[iLen], charsmax(sBuffer) - iLen, "%-12.12s %6s %6s %6s %6s %6s %4s^n", lWeapon, lKills, lDeaths, lHits, lShots, lDamage, lAcc)
for (iWeapon = 1; iWeapon < xmod_get_maxweapons() && MAX_BUFFER_LENGTH - iLen > 0 ; iWeapon++) for (iWeapon = 1; iWeapon < xmod_get_maxweapons() && charsmax(sBuffer) - iLen > 0 ; iWeapon++)
{ {
if (get_user_wstats(id, iWeapon, izStats, izBody)) if (get_user_wstats(id, iWeapon, izStats, izBody))
{ {
xmod_get_wpnname(iWeapon, t_sWpn, MAX_WEAPON_LENGTH) xmod_get_wpnname(iWeapon, t_sWpn, charsmax(t_sWpn))
iLen += format(sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "%-12.12s %6d %6d %6d %6d %6d %3.0f%%^n", t_sWpn, izStats[STATS_KILLS], izStats[STATS_DEATHS], iLen += formatex(sBuffer[iLen], charsmax(sBuffer) - iLen, "%-12.12s %6d %6d %6d %6d %6d %3.0f%%^n", t_sWpn, izStats[STATS_KILLS], izStats[STATS_DEATHS],
izStats[STATS_HITS], izStats[STATS_SHOTS], izStats[STATS_DAMAGE], accuracy(izStats)) izStats[STATS_HITS], izStats[STATS_SHOTS], izStats[STATS_DAMAGE], accuracy(izStats))
} }
} }
} }
// Format round end stats
format_roundend_hudstats(id, sBuffer[MAX_BUFFER_LENGTH + 1])
{
sBuffer[0] = 0
// Create round awards.
if (ShowMostDisruptive)
add_most_disruptive(id, sBuffer)
if (ShowBestScore)
add_best_score(id, sBuffer)
// Create round score.
// Compensate HUD message if awards are disabled.
if (ShowTeamScore || ShowTotalStats)
{
if (ShowMostDisruptive && ShowBestScore)
add(sBuffer, charsmax(sBuffer), "^n^n")
else if (ShowMostDisruptive || ShowBestScore)
add(sBuffer, charsmax(sBuffer), "^n^n^n^n")
else
add(sBuffer, charsmax(sBuffer), "^n^n^n^n^n^n")
if (ShowTeamScore)
add_team_score(id, sBuffer)
if (ShowTotalStats)
add_total_stats(id, sBuffer)
}
}
// Show round end stats. If gametime is zero then use default duration time. // Show round end stats. If gametime is zero then use default duration time.
show_roundend_hudstats(id, Float:fGameTime) show_roundend_hudstats(id, Float:fGameTime, sBuffer[MAX_BUFFER_LENGTH + 1])
{ {
// Bail out if there no HUD stats should be shown // Bail out if there no HUD stats should be shown
// for this player or end round stats not created. // for this player or end round stats not created.
if (!g_izStatsSwitch[id]) return if (!g_izStatsSwitch[id]) return
if (!g_sAwardAndScore[0]) return if (!sBuffer[0]) return
// If round end timer is zero clear round end stats. // If round end timer is zero clear round end stats.
if (g_fShowStatsTime == 0.0) if (g_fShowStatsTime == 0.0)
@ -870,7 +908,7 @@ show_roundend_hudstats(id, Float:fGameTime)
if (fDuration >= HUD_MIN_DURATION) if (fDuration >= HUD_MIN_DURATION)
{ {
set_hudtype_endround(fDuration) set_hudtype_endround(fDuration)
ShowSyncHudMsg(id, g_HudSync_EndRound, "%s", g_sAwardAndScore) ShowSyncHudMsg(id, g_HudSync_EndRound, "%s", sBuffer)
#if defined STATSX_DEBUG #if defined STATSX_DEBUG
log_amx("Show %1.2fs round end HUD stats for #%d", fDuration, id) log_amx("Show %1.2fs round end HUD stats for #%d", fDuration, id)
#endif #endif
@ -948,7 +986,7 @@ public cmdPluginMode(id, level, cid)
return PLUGIN_HANDLED return PLUGIN_HANDLED
if (read_argc() > 1) if (read_argc() > 1)
read_argv(1, g_sBuffer, MAX_BUFFER_LENGTH) read_argv(1, g_sBuffer, charsmax(g_sBuffer))
else else
g_sBuffer[0] = 0 g_sBuffer[0] = 0
@ -967,7 +1005,7 @@ public cmdStatsMe(id)
} }
format_stats(id, g_sBuffer) format_stats(id, g_sBuffer)
get_user_name(id, t_sName, MAX_NAME_LENGTH) get_user_name(id, t_sName, charsmax(t_sName))
show_motd(id, g_sBuffer, t_sName) show_motd(id, g_sBuffer, t_sName)
return PLUGIN_CONTINUE return PLUGIN_CONTINUE
@ -983,7 +1021,7 @@ public cmdRankStats(id)
} }
format_rankstats(id, g_sBuffer) format_rankstats(id, g_sBuffer)
get_user_name(id, t_sName, MAX_NAME_LENGTH) get_user_name(id, t_sName, charsmax(t_sName))
show_motd(id, g_sBuffer, t_sName) show_motd(id, g_sBuffer, t_sName)
return PLUGIN_CONTINUE return PLUGIN_CONTINUE
@ -998,7 +1036,7 @@ public cmdTop15(id)
return PLUGIN_HANDLED return PLUGIN_HANDLED
} }
format_top15(g_sBuffer) format_top15(id, g_sBuffer)
show_motd(id, g_sBuffer, "Top 15") show_motd(id, g_sBuffer, "Top 15")
return PLUGIN_CONTINUE return PLUGIN_CONTINUE
@ -1074,22 +1112,22 @@ public cmdReport(id)
iWeapon = get_user_weapon(id, iClip, iAmmo) iWeapon = get_user_weapon(id, iClip, iAmmo)
if (iWeapon != 0) if (iWeapon != 0)
xmod_get_wpnname(iWeapon, t_sWpn, MAX_WEAPON_LENGTH) xmod_get_wpnname(iWeapon, t_sWpn, charsmax(t_sWpn))
iHealth = get_user_health(id) iHealth = get_user_health(id)
iArmor = get_user_armor(id) iArmor = get_user_armor(id)
new lWeapon[16] new lWeapon[16]
format(lWeapon, 15, "%L", id, "WEAPON") formatex(lWeapon, charsmax(lWeapon), "%L", LANG_SERVER, "WEAPON")
strtolower(lWeapon) strtolower(lWeapon)
if (iClip >= 0) if (iClip >= 0)
{ {
format(g_sBuffer, MAX_BUFFER_LENGTH, "%s: %s, %L: %d/%d, %L: %d, %L: %d", lWeapon, t_sWpn, LANG_SERVER, "AMMO", iClip, iAmmo, LANG_SERVER, "HEALTH", iHealth, LANG_SERVER, "ARMOR", iArmor) formatex(g_sBuffer, charsmax(g_sBuffer), "%s: %s, %L: %d/%d, %L: %d, %L: %d", lWeapon, t_sWpn, LANG_SERVER, "AMMO", iClip, iAmmo, LANG_SERVER, "HEALTH", iHealth, LANG_SERVER, "ARMOR", iArmor)
} }
else else
format(g_sBuffer, MAX_BUFFER_LENGTH, "%s: %s, %L: %d, %L: %d", lWeapon, t_sWpn[7], LANG_SERVER, "HEALTH", iHealth, LANG_SERVER, "ARMOR", iArmor) formatex(g_sBuffer, charsmax(g_sBuffer), "%s: %s, %L: %d, %L: %d", lWeapon, t_sWpn[7], LANG_SERVER, "HEALTH", iHealth, LANG_SERVER, "ARMOR", iArmor)
engclient_cmd(id, "say_team", g_sBuffer) engclient_cmd(id, "say_team", g_sBuffer)
@ -1105,6 +1143,7 @@ public cmdScore(id)
return PLUGIN_HANDLED return PLUGIN_HANDLED
} }
save_team_chatscore(id, g_sScore)
client_print(id, print_chat, "%L: %s", id, "GAME_SCORE", g_sScore) client_print(id, print_chat, "%L: %s", id, "GAME_SCORE", g_sScore)
return PLUGIN_CONTINUE return PLUGIN_CONTINUE
@ -1114,12 +1153,12 @@ public cmdScore(id)
public cmdSwitch(id) public cmdSwitch(id)
{ {
g_izStatsSwitch[id] = (g_izStatsSwitch[id]) ? 0 : -1 g_izStatsSwitch[id] = (g_izStatsSwitch[id]) ? 0 : -1
num_to_str(g_izStatsSwitch[id], t_sText, MAX_TEXT_LENGTH) num_to_str(g_izStatsSwitch[id], t_sText, charsmax(t_sText))
client_cmd(id, "setinfo _amxstatsx %s", t_sText) client_cmd(id, "setinfo _amxstatsx %s", t_sText)
new lEnDis[32] new lEnDis[32]
format(lEnDis, 31, "%L", id, g_izStatsSwitch[id] ? "ENABLED" : "DISABLED") formatex(lEnDis, charsmax(lEnDis), "%L", id, g_izStatsSwitch[id] ? "ENABLED" : "DISABLED")
client_print(id, print_chat, "* %L", id, "STATS_ANNOUNCE", lEnDis) client_print(id, print_chat, "* %L", id, "STATS_ANNOUNCE", lEnDis)
return PLUGIN_CONTINUE return PLUGIN_CONTINUE
@ -1168,7 +1207,7 @@ public actionStatsMenu(id, key)
if (g_sBuffer[0]) if (g_sBuffer[0])
{ {
get_user_name(iIndex, t_sName, MAX_NAME_LENGTH) get_user_name(iIndex, t_sName, charsmax(t_sName))
show_motd(id, g_sBuffer, t_sName) show_motd(id, g_sBuffer, t_sName)
} }
} }
@ -1214,7 +1253,7 @@ showStatsMenu(id, iMenuPos)
iMenuPos = iMenuPosMax - 1 iMenuPos = iMenuPosMax - 1
iUserIndex = iMenuPos * PPL_MENU_OPTIONS iUserIndex = iMenuPos * PPL_MENU_OPTIONS
iLen = format(g_sBuffer, MAX_BUFFER_LENGTH, "\y%L\R%d/%d^n\w^n", id, "SERVER_STATS", iMenuPos + 1, iMenuPosMax) iLen = formatex(g_sBuffer, charsmax(g_sBuffer), "\y%L\R%d/%d^n\w^n", id, "SERVER_STATS", iMenuPos + 1, iMenuPosMax)
iMenuOptionMax = iPlayers - iUserIndex iMenuOptionMax = iPlayers - iUserIndex
if (iMenuOptionMax > PPL_MENU_OPTIONS) if (iMenuOptionMax > PPL_MENU_OPTIONS)
@ -1222,24 +1261,24 @@ showStatsMenu(id, iMenuPos)
for (iMenuOption = 0; iMenuOption < iMenuOptionMax; iMenuOption++) for (iMenuOption = 0; iMenuOption < iMenuOptionMax; iMenuOption++)
{ {
get_user_name(g_izUserMenuPlayers[id][iUserIndex++], t_sName, MAX_NAME_LENGTH) get_user_name(g_izUserMenuPlayers[id][iUserIndex++], t_sName, charsmax(t_sName))
iKeyMask |= (1<<iMenuOption) iKeyMask |= (1<<iMenuOption)
iLen += format(g_sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "%d. %s^n\w", iMenuOption + 1, t_sName) iLen += formatex(g_sBuffer[iLen], charsmax(g_sBuffer) - iLen, "%d. %s^n\w", iMenuOption + 1, t_sName)
} }
iKeyMask |= MENU_KEY_8|MENU_KEY_0 iKeyMask |= MENU_KEY_8|MENU_KEY_0
iLen += format(g_sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "^n8. %s^n\w", g_izUserMenuActionText[g_izUserMenuAction[id]]) iLen += formatex(g_sBuffer[iLen], charsmax(g_sBuffer) - iLen, "^n8. %s^n\w", g_izUserMenuActionText[g_izUserMenuAction[id]])
if (iPlayers > iUserIndex) if (iPlayers > iUserIndex)
{ {
iLen += format(g_sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "^n9. %L...", id, "MORE") iLen += formatex(g_sBuffer[iLen], charsmax(g_sBuffer) - iLen, "^n9. %L...", id, "MORE")
iKeyMask |= MENU_KEY_9 iKeyMask |= MENU_KEY_9
} }
if (iMenuPos > 0) if (iMenuPos > 0)
iLen += format(g_sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "^n0. %L", id, "BACK") iLen += formatex(g_sBuffer[iLen], charsmax(g_sBuffer) - iLen, "^n0. %L", id, "BACK")
else else
iLen += format(g_sBuffer[iLen], MAX_BUFFER_LENGTH - iLen, "^n0. %L", id, "EXIT") iLen += formatex(g_sBuffer[iLen], charsmax(g_sBuffer) - iLen, "^n0. %L", id, "EXIT")
show_menu(id, iKeyMask, g_sBuffer, -1, "Server Stats") show_menu(id, iKeyMask, g_sBuffer, -1, "Server Stats")
@ -1253,11 +1292,11 @@ showStatsMenu(id, iMenuPos)
// Reset game stats on game start and restart. // Reset game stats on game start and restart.
public eventStartGame() public eventStartGame()
{ {
read_data(2, t_sText, MAX_TEXT_LENGTH) read_data(2, t_sText, charsmax(t_sText))
if (t_sText[6] == 'w') if (t_sText[6] == 'w')
{ {
read_data(3, t_sText, MAX_TEXT_LENGTH) read_data(3, t_sText, charsmax(t_sText))
g_fStartGame = get_gametime() + float(str_to_num(t_sText)) g_fStartGame = get_gametime() + float(str_to_num(t_sText))
} }
else else
@ -1271,7 +1310,7 @@ public eventStartRound()
{ {
new iTeam, id, i new iTeam, id, i
new Float:roundtime = get_cvar_float("mp_roundtime"); new Float:roundtime = get_pcvar_float(g_pRoundTime)
if (read_data(1) >= floatround(roundtime * 60.0,floatround_floor) || (roundtime == 2.3 && read_data(1) == 137)) // these round too weird for it to work through pawn, have to add an exception for it if (read_data(1) >= floatround(roundtime * 60.0,floatround_floor) || (roundtime == 2.3 && read_data(1) == 137)) // these round too weird for it to work through pawn, have to add an exception for it
{ {
#if defined STATSX_DEBUG #if defined STATSX_DEBUG
@ -1337,31 +1376,39 @@ public eventStartRound()
} }
// Reset killer info on round restart. // Reset killer info on round restart.
public eventResetHud(id) public eventSpawn(id)
{ {
if (!is_user_alive(id))
return HAM_IGNORED
new args[1] new args[1]
args[0] = id args[0] = id
if (g_iPluginMode & MODE_HUD_DELAY) if (g_iPluginMode & MODE_HUD_DELAY)
set_task(0.01, "delay_resethud", 200 + id, args, 1) set_task(0.1, "delay_spawn", 200 + id, args, 1)
else else
delay_resethud(args) delay_spawn(args)
return PLUGIN_CONTINUE return HAM_IGNORED
} }
public delay_resethud(args[]) public delay_spawn(args[])
{ {
new id = args[0] new id = args[0]
new Float:fGameTime new Float:fGameTime
// Show user and score round stats after HUD-reset // Show user and score round stats after spawn
#if defined STATSX_DEBUG #if defined STATSX_DEBUG
log_amx("Reset HUD for #%d", id) log_amx("Spawn for #%d", id)
#endif #endif
fGameTime = get_gametime() fGameTime = get_gametime()
show_user_hudstats(id, fGameTime) show_user_hudstats(id, fGameTime)
show_roundend_hudstats(id, fGameTime)
if (g_izStatsSwitch[id] && g_sAwardAndScore[0])
{
format_roundend_hudstats(id, g_sAwardAndScore)
show_roundend_hudstats(id, fGameTime, g_sAwardAndScore)
}
// Reset round stats // Reset round stats
g_izKilled[id][KILLED_KILLER_ID] = 0 g_izKilled[id][KILLED_KILLER_ID] = 0
@ -1446,7 +1493,7 @@ kill_stats(id)
else else
iTeam = get_user_team(id) - 1 iTeam = get_user_team(id) - 1
get_user_name(id, g_izUserRndName[id], MAX_NAME_LENGTH) get_user_name(id, g_izUserRndName[id], charsmax(g_izUserRndName[]))
if (get_user_rstats(id, izStats, izBody)) if (get_user_rstats(id, izStats, izBody))
{ {
@ -1509,7 +1556,7 @@ public eventEndRound()
// If first end round event in the round, calculate team score. // If first end round event in the round, calculate team score.
if (!g_iRoundEndTriggered) if (!g_iRoundEndTriggered)
{ {
read_data(2, t_sText, MAX_TEXT_LENGTH) read_data(2, t_sText, charsmax(t_sText))
if (t_sText[7] == 't') // Terrorist wins if (t_sText[7] == 't') // Terrorist wins
g_izTeamScore[0]++ g_izTeamScore[0]++
@ -1549,6 +1596,9 @@ endround_stats()
log_amx("End round stats") log_amx("End round stats")
#endif #endif
// Get and save round end stats time.
g_fShowStatsTime = get_gametime()
for (iPlayer = 0; iPlayer < iPlayers; iPlayer++) for (iPlayer = 0; iPlayer < iPlayers; iPlayer++)
{ {
id = iaPlayers[iPlayer] id = iaPlayers[iPlayer]
@ -1557,44 +1607,12 @@ endround_stats()
{ {
kill_stats(id) kill_stats(id)
} }
}
g_sAwardAndScore[0] = 0 if (!g_izStatsSwitch[id])
continue
// Create round awards. format_roundend_hudstats(id, g_sAwardAndScore)
if (ShowMostDisruptive) show_roundend_hudstats(id, 0.0, g_sAwardAndScore)
add_most_disruptive(g_sAwardAndScore)
if (ShowBestScore)
add_best_score(g_sAwardAndScore)
// Create round score.
// Compensate HUD message if awards are disabled.
if (ShowTeamScore || ShowTotalStats)
{
if (ShowMostDisruptive && ShowBestScore)
add(g_sAwardAndScore, MAX_BUFFER_LENGTH, "^n^n")
else if (ShowMostDisruptive || ShowBestScore)
add(g_sAwardAndScore, MAX_BUFFER_LENGTH, "^n^n^n^n")
else
add(g_sAwardAndScore, MAX_BUFFER_LENGTH, "^n^n^n^n^n^n")
if (ShowTeamScore)
add_team_score(g_sAwardAndScore)
if (ShowTotalStats)
add_total_stats(g_sAwardAndScore)
}
save_team_chatscore()
// Get and save round end stats time.
g_fShowStatsTime = get_gametime()
// Display round end stats to all players.
for (iPlayer = 0; iPlayer < iPlayers; iPlayer++)
{
id = iaPlayers[iPlayer]
show_roundend_hudstats(id, 0.0)
} }
// Flag round end processed. // Flag round end processed.
@ -1632,13 +1650,13 @@ public end_game_stats()
if (!g_izStatsSwitch[id]) if (!g_izStatsSwitch[id])
continue // Do not show any stats continue // Do not show any stats
cmdStatsMe(iaPlayers[iPlayer]) cmdStatsMe(id)
} }
} }
else if (EndTop15) else if (EndTop15)
{ {
get_players(iaPlayers, iPlayers) get_players(iaPlayers, iPlayers)
format_top15(g_sBuffer) format_top15(0, g_sBuffer)
for (iPlayer = 0; iPlayer < iPlayers; iPlayer++) for (iPlayer = 0; iPlayer < iPlayers; iPlayer++)
{ {
@ -1647,7 +1665,7 @@ public end_game_stats()
if (!g_izStatsSwitch[id]) if (!g_izStatsSwitch[id])
continue // Do not show any stats continue // Do not show any stats
show_motd(iaPlayers[iPlayer], g_sBuffer, "Top 15") show_motd(id, g_sBuffer, "Top 15")
} }
} }
@ -1674,7 +1692,7 @@ public eventShowRank(id)
new izStats[8], izBody[8] new izStats[8], izBody[8]
new iRankPos, iRankMax new iRankPos, iRankMax
get_user_name(iPlayer, t_sName, MAX_NAME_LENGTH) get_user_name(iPlayer, t_sName, charsmax(t_sName))
iRankPos = get_user_stats(iPlayer, izStats, izBody) iRankPos = get_user_stats(iPlayer, izStats, izBody)
iRankMax = get_statsnum() iRankMax = get_statsnum()
@ -1691,7 +1709,7 @@ public client_connect(id)
{ {
if (ShowStats) if (ShowStats)
{ {
get_user_info(id, "_amxstatsx", t_sText, MAX_TEXT_LENGTH) get_user_info(id, "_amxstatsx", t_sText, charsmax(t_sText))
g_izStatsSwitch[id] = (t_sText[0]) ? str_to_num(t_sText) : -1 g_izStatsSwitch[id] = (t_sText[0]) ? str_to_num(t_sText) : -1
} }
else else