diff options
| author | navewindre <nw@moneybot.cc> | 2023-12-04 18:06:10 +0100 |
|---|---|---|
| committer | navewindre <nw@moneybot.cc> | 2023-12-04 18:06:10 +0100 |
| commit | aef0d1c1268ab7d4bc18996c9c6b4da16a40aadc (patch) | |
| tree | 43e766b51704f4ab8b383583bdc1871eeeb9c698 /sourcemod-1.5-dev/scripting | |
| parent | 38f1140c11724da05a23a10385061200b907cf6e (diff) | |
bbbbbbbbwaaaaaaaaaaa
Diffstat (limited to 'sourcemod-1.5-dev/scripting')
| -rw-r--r-- | sourcemod-1.5-dev/scripting/ljstats.sp | 218 | ||||
| -rw-r--r-- | sourcemod-1.5-dev/scripting/stats.sp | 168 |
2 files changed, 296 insertions, 90 deletions
diff --git a/sourcemod-1.5-dev/scripting/ljstats.sp b/sourcemod-1.5-dev/scripting/ljstats.sp index 8167430..f220d39 100644 --- a/sourcemod-1.5-dev/scripting/ljstats.sp +++ b/sourcemod-1.5-dev/scripting/ljstats.sp @@ -14,6 +14,7 @@ #define MAX(%0,%1) (%0 < %1 ? %1 : %0) #define LJSTATS_VERSION "2.0.1" +#define MAX_JUMP_TICKS 132 // 2 sec #define LJTOP_DIR "configs/ljstats/" #define LJTOP_FILE "ljtop.txt" @@ -33,8 +34,8 @@ #define BJ_HEIGHT_DELTA_MAX 2.0 #define LAJ_HEIGHT_DELTA_MIN -6.0 #define LAJ_HEIGHT_DELTA_MAX 0.0 -#define JB_HEIGHT_DELTA_MIN -4.0 -#define JB_HEIGHT_DELTA_MAX 1.0 +#define JB_HEIGHT_DELTA_MIN -1.0 +#define JB_HEIGHT_DELTA_MAX 1.5 #define HUD_HINT_SIZE 256 #define STRAFE_TRAINER_TICKS 9 @@ -57,6 +58,7 @@ enum PlayerState bool:bBeam, bool:bDeadstrafe, bool:bSound, + bool:bSyncStats, bool:bBlockMode, nVerbosity, bool:bShowAllJumps, @@ -110,6 +112,8 @@ enum PlayerState Float:fStrafeSync[MAX_STRAFES], nStrafeTicks[MAX_STRAFES], nStrafeTicksSynced[MAX_STRAFES], + nMoveDir[MAX_JUMP_TICKS], + nMouseDir[MAX_JUMP_TICKS], nTotalTicks, Float:fTotalAngle, Float:fSyncedAngle, @@ -405,6 +409,7 @@ new Handle:g_hCookieShowPrestrafeHint = INVALID_HANDLE; new Handle:g_hCookiePersonalBest = INVALID_HANDLE; new Handle:g_hCookieStrafeTrainer = INVALID_HANDLE; new Handle:g_hCookieSpeedometer = INVALID_HANDLE; +new Handle:g_hCookieSyncStats = INVALID_HANDLE; new g_ColorMin[3] = {0xAD, 0xD8, 0xE6}; // Lightblue! new g_ColorMax[3] = {0x00, 0x00, 0xFF}; @@ -528,6 +533,7 @@ public OnPluginStart() RegConsoleCmd("sm_ljsound", Command_LJSound); RegConsoleCmd("sm_ljver", Command_LJVersion); RegConsoleCmd("sm_ljversion", Command_LJVersion); + RegConsoleCmd("sm_syncstats", Command_SyncStats); RegConsoleCmd("sm_ljtop", Command_LJTop); #if defined LJSERV RegConsoleCmd("sm_wr", Command_LJTop); @@ -564,7 +570,8 @@ public OnPluginStart() g_hCookiePersonalBest = RegClientCookie("ljstats_personalbest", "ljstats_personalbest", CookieAccess_Private); g_hCookieStrafeTrainer = RegClientCookie("ljstats_strafetrainer", "ljstats_strafetrainer", CookieAccess_Private); g_hCookieSpeedometer = RegClientCookie("ljstats_speedometer", "ljstats_speedometer", CookieAccess_Private); - + g_hCookieSyncStats = RegClientCookie("ljstats_syncstats", "ljstats_syncstats", CookieAccess_Private); + for(new i = 1; i < MaxClients; i++) { if(IsClientInGame(i)) @@ -1053,6 +1060,19 @@ public Action:Command_Delete(client, args) return Plugin_Handled; } +public Action:Command_SyncStats( client, args ) { + if ( g_PlayerStates[client][bSyncStats] ) { + g_PlayerStates[client][bSyncStats] = false; + PrintToChat( client, "\x04Sync stats are now : DISABLED" ); + } else { + g_PlayerStates[client][bSyncStats] = true; + PrintToChat( client, "\x04Sync stats are now : ENABLED" ); + } + + SetCookie( client, g_hCookieSyncStats, g_PlayerStates[client][bSyncStats] ); + return Plugin_Handled; +} + public Action:Command_LJHelp(client, args) { new Handle:hHelpPanel = CreatePanel(); @@ -1166,6 +1186,9 @@ public OnClientCookiesCached(client) GetClientCookie(client, g_hCookieStrafeTrainer, strCookie, sizeof(strCookie)); g_PlayerStates[client][bStrafeTrainer] = bool:StringToInt(strCookie); + + GetClientCookie(client, g_hCookieSyncStats, strCookie, sizeof(strCookie)); + g_PlayerStates[client][bSyncStats] = bool:StringToInt(strCookie); GetClientCookie(client, g_hCookieBeam, strCookie, sizeof(strCookie)); g_PlayerStates[client][bBeam] = bool:StringToInt(strCookie); @@ -1253,6 +1276,9 @@ ShowSettingsPanel(client) Format(buf, sizeof(buf), "Strafe trainer: %s", g_PlayerStates[client][bStrafeTrainer] ? "On" : "Off"); AddMenuItem(hMenu, "strafetrainer", buf); + + Format(buf, sizeof(buf), "Sync stats: %s", g_PlayerStates[client][bSyncStats] ? "On" : "Off"); + AddMenuItem(hMenu, "syncstats", buf); DisplayMenu(hMenu, client, 0); } @@ -1356,6 +1382,9 @@ public SettingsMenuHandler(Handle:hMenu, MenuAction:ma, client, nItem) PrintToChat( client, "Strafe trainer is now %s", g_PlayerStates[client][bStrafeTrainer] ? "ENABLED" : "DISABLED" ); ShowSettingsPanel(client); } + else if(!strcmp(strInfo, "syncstats")) { + Command_SyncStats( client, 0 ); + } } case MenuAction_End: @@ -2473,13 +2502,8 @@ StrafeTrainer( client, bool: onGround, Float:angles[3], Float:velocity[3] ) { b = 0; } - new Handle:hText = CreateHudSynchronizer(); - if(hText != INVALID_HANDLE) - { - SetHudTextParams(-1.0, 0.2, GetTickInterval() * (STRAFE_TRAINER_TICKS+1), r, g, b, 255, 0, 0.0, 0.0, 0.1); - ShowSyncHudText(client, hText, msg); - CloseHandle(hText); - } + SetHudTextParams(-1.0, 0.2, GetTickInterval() * (STRAFE_TRAINER_TICKS+1), r, g, b, 255, 0, 0.0, 0.0, 0.1); + ShowHudText(client, 0, msg); g_PlayerStates[client][nTrainerTicks] = 0; } @@ -2538,12 +2562,12 @@ Speedometer( client, bool: bJump, bool: bGround, bool: bIsDucking, Float:velocit switch( g_PlayerStates[client][nSpeedometer] ) { case 1: { - SetHudTextParams(-1.0, 0.325, 0.05, r, g, b, 255, 0, 0.0, 0.0, 0.0); + SetHudTextParams(-1.0, 0.325, 0.1, r, g, b, 255, 0, 0.0, 0.0, 0.0); ShowHudText(client, 1, sBuffer); } case 2: { - SetHudTextParams(-1.0, 0.85, 0.05, r, g, b, 255, 0, 0.0, 0.0, 0.0); + SetHudTextParams(-1.0, 0.85, 0.1, r, g, b, 255, 0, 0.0, 0.0, 0.0); ShowHudText(client, 1, sBuffer); } } @@ -2723,6 +2747,11 @@ PlayerJump(client, JUMP_TYPE:JumpType2 = JT_LONGJUMP) g_PlayerStates[client][nStrafeTicks][i] = 0; g_PlayerStates[client][nStrafeTicksSynced][i] = 0; } + + for( new i = 0; i < MAX_JUMP_TICKS; ++i ) { + g_PlayerStates[client][nMouseDir][i] = 0; + g_PlayerStates[client][nMoveDir][i] = 0; + } // Reset stuff g_PlayerStates[client][JumpDir] = JD_NONE; @@ -2812,7 +2841,9 @@ PlayerJump(client, JUMP_TYPE:JumpType2 = JT_LONGJUMP) new Float:vVel[3]; GetEntPropVector(client, Prop_Data, "m_vecVelocity", vVel); - vOrigin[2] += vVel[2] * GetTickInterval(); + // ducking lowers u by 8.5 units + if( GetEntProp(client, Prop_Send, "m_bDucking", 1) ) + vOrigin[2] -= 8.5; } Array_Copy(vOrigin, g_PlayerStates[client][vJumpOrigin], 3); @@ -3358,11 +3389,11 @@ _OnPlayerRunCmd(client, buttons, const Float:vOrigin[3], const Float:vAngles[3], new Float:fVelDelta = GetSpeed(client) - GetVSpeed(v); new Float:fAngleDelta = fmod((FloatAbs(vAngles[1] - v2[1]) + 180.0), 360.0) - 180.0; - g_PlayerStates[client][nStrafeTicks][g_PlayerStates[client][nStrafes] - 1]++; g_PlayerStates[client][fTotalAngle] += fAngleDelta; + new tick = g_PlayerStates[client][nTotalTicks]; if(fVelDelta > 0.0) { g_PlayerStates[client][fStrafeGain][g_PlayerStates[client][nStrafes] - 1] += fVelDelta; @@ -3371,11 +3402,44 @@ _OnPlayerRunCmd(client, buttons, const Float:vOrigin[3], const Float:vAngles[3], g_PlayerStates[client][nStrafeTicksSynced][g_PlayerStates[client][nStrafes] - 1]++; g_PlayerStates[client][fSyncedAngle] += fAngleDelta; + new Float:delta = vAngles[1] - v2[1]; + while(delta < -180.0) + delta += 360.0; + while(delta > 180.0) + delta -= 360.0; + + if( tick < MAX_JUMP_TICKS ) + g_PlayerStates[client][nMouseDir][tick] = delta > 0.0 ? -1 : 1; } else { g_PlayerStates[client][fStrafeLoss][g_PlayerStates[client][nStrafes] - 1] -= fVelDelta; g_PlayerStates[client][fLoss] -= fVelDelta; + if( tick < MAX_JUMP_TICKS ) + g_PlayerStates[client][nMouseDir][tick] = 0; + } + + if( tick < MAX_JUMP_TICKS ) { + if( g_PlayerStates[client][JumpDir] == JD_SIDEWAYS ) { + if( !nButtonCount ) + g_PlayerStates[client][nMoveDir][tick] = 0; + else if( g_PlayerStates[client][CurStrafeDir] == SD_W ) + g_PlayerStates[client][nMoveDir][tick] = -1; + else if( g_PlayerStates[client][CurStrafeDir] == SD_S ) + g_PlayerStates[client][nMoveDir][tick] = 1; + else + g_PlayerStates[client][nMoveDir][tick] = 0; + } + else { + if( !nButtonCount ) + g_PlayerStates[client][nMoveDir][tick] = 0; + else if( g_PlayerStates[client][CurStrafeDir] == SD_A ) + g_PlayerStates[client][nMoveDir][tick] = -1; + else if( g_PlayerStates[client][CurStrafeDir] == SD_D ) + g_PlayerStates[client][nMoveDir][tick] = 1; + else + g_PlayerStates[client][nMoveDir][tick] = 0; + } } } @@ -3454,6 +3518,130 @@ PrintPrestrafeHint(client) PrintHintText(client, strHint); } +public PrintSyncStats(client) { + new String:strLeft[256]; + new String:strRight[256]; + new String:strMouseLeft[256]; + new String:strMouseRight[256]; + + new String:strFull[1024]; + + if( g_PlayerStates[client][nStrafes] == 0 ) + return; + if( g_PlayerStates[client][nTotalTicks] < 10 ) + return; + + Format( strLeft, sizeof( strLeft ), "[ " ); + Format( strRight, sizeof( strRight ), "[ " ); + Format( strMouseLeft, sizeof( strMouseLeft ), "[ " ); + Format( strMouseRight, sizeof( strMouseRight ), "[ " ); + + for( new i = 0; i < g_PlayerStates[client][nTotalTicks]; ++i ) { + if( g_PlayerStates[client][nMouseDir][i] == -1 ) { + Append( strMouseLeft, sizeof( strMouseLeft ), "|" ); + Append( strMouseRight, sizeof( strMouseRight ), " " ); + } + else if( g_PlayerStates[client][nMouseDir][i] == 1 ) { + Append( strMouseLeft, sizeof( strMouseLeft ), " " ); + Append( strMouseRight, sizeof( strMouseRight ), "|" ); + } + else { + Append( strMouseLeft, sizeof( strMouseLeft ), " " ); + Append( strMouseRight, sizeof( strMouseRight ), " " ); + } + + if( g_PlayerStates[client][nMoveDir][i] == -1 ) { + Append( strLeft, sizeof( strLeft ), "|" ); + Append( strRight, sizeof( strRight ), " " ); + } + else if( g_PlayerStates[client][nMoveDir][i] == 1 ) { + Append( strLeft, sizeof( strLeft ), " " ); + Append( strRight, sizeof( strRight ), "|" ); + } + else { + Append( strLeft, sizeof( strLeft ), " " ); + Append( strRight, sizeof( strRight ), " " ); + } + } + + Format( strLeft, sizeof( strLeft ), "%s ]", strLeft ); + Format( strRight, sizeof( strRight ), "%s ]", strRight ); + Format( strMouseLeft, sizeof( strMouseLeft ), "%s ]", strMouseLeft ); + Format( strMouseRight, sizeof( strMouseRight ), "%s ]", strMouseRight ); + + if( g_PlayerStates[client][JumpDir] == JD_SIDEWAYS ) { + Format( strFull, sizeof( strFull ), "W: %s\nS: %s\nL: %s\nR: %s", strLeft, strRight, strMouseLeft, strMouseRight ); + } + else { + Format( strFull, sizeof( strFull ), "A: %s\nD: %s\nL: %s\nR: %s", strLeft, strRight, strMouseLeft, strMouseRight ); + } + + PrintToConsole( client, strFull ); + + if( g_PlayerStates[client][bSyncStats] ) { + Format( strLeft, sizeof( strLeft ), "[ " ); + Format( strRight, sizeof( strRight ), "[ " ); + Format( strMouseLeft, sizeof( strMouseLeft ), "[ " ); + Format( strMouseRight, sizeof( strMouseRight ), "[ " ); + + new String:char1[] = "|"; + new String:char2[] = "_"; + new String:strFull2[1024]; + + for( new i = 0; i < g_PlayerStates[client][nTotalTicks]; ++i ) { + if( g_PlayerStates[client][nMouseDir][i] == -1 ) { + Append( strMouseLeft, sizeof( strMouseLeft ), char1 ); + Append( strMouseRight, sizeof( strMouseRight ), char2 ); + } + else if( g_PlayerStates[client][nMouseDir][i] == 1 ) { + Append( strMouseLeft, sizeof( strMouseLeft ), char2 ); + Append( strMouseRight, sizeof( strMouseRight ), char1 ); + } + else { + Append( strMouseLeft, sizeof( strMouseLeft ), char2 ); + Append( strMouseRight, sizeof( strMouseRight ), char2 ); + } + + if( g_PlayerStates[client][nMoveDir][i] == -1 ) { + Append( strLeft, sizeof( strLeft ), char1 ); + Append( strRight, sizeof( strRight ), char2 ); + } + else if( g_PlayerStates[client][nMoveDir][i] == 1 ) { + Append( strLeft, sizeof( strLeft ), char2 ); + Append( strRight, sizeof( strRight ), char1 ); + } + else { + Append( strLeft, sizeof( strLeft ), char2 ); + Append( strRight, sizeof( strRight ), char2 ); + } + } + + Format( strLeft, sizeof( strLeft ), "%s ]", strLeft ); + Format( strRight, sizeof( strRight ), "%s ]", strRight ); + Format( strMouseLeft, sizeof( strMouseLeft ), "%s ]", strMouseLeft ); + Format( strMouseRight, sizeof( strMouseRight ), "%s ]", strMouseRight ); + + if( g_PlayerStates[client][JumpDir] == JD_SIDEWAYS ) { + Format( strFull, sizeof( strFull ), "W: %s\nS: %s\n", strLeft, strRight ); + } + else { + Format( strFull, sizeof( strFull ), "A: %s\nD: %s\n", strLeft, strRight ); + } + + Format( strFull2, sizeof( strFull2 ), "L: %s\nR: %s", strMouseLeft, strMouseRight ); + + new Handle:hText = CreateHudSynchronizer(); + if(hText != INVALID_HANDLE) + { + SetHudTextParams(-1.0, 0.06, 3.0, 255, 255, 255, 255, 0, 0.0, 0.15, 0.5); + ShowHudText(client, 2, strFull); + SetHudTextParams(-1.0, 0.14, 3.0, 180, 180, 255, 255, 0, 0.0, 0.15, 0.5); + ShowHudText(client, 3, strFull2); + CloseHandle(hText); + } + } +} + PlayerLand(client) { g_PlayerStates[client][bOnGround] = true; @@ -3463,7 +3651,7 @@ PlayerLand(client) if(!g_PlayerStates[client][bLJEnabled] && !g_PlayerStates[client][nSpectators] || !g_PlayerStates[client][bShowBhopStats] && g_PlayerStates[client][nBhops] > 1) return; - + PrintSyncStats( client ); // Final CheckValidJump //CheckValidJump(client); diff --git a/sourcemod-1.5-dev/scripting/stats.sp b/sourcemod-1.5-dev/scripting/stats.sp index 47030d4..94f3598 100644 --- a/sourcemod-1.5-dev/scripting/stats.sp +++ b/sourcemod-1.5-dev/scripting/stats.sp @@ -143,13 +143,16 @@ new g_LJTopMax[LT_END] = { 0, ... }; new g_statsTOP = 0; new g_playerStats[MAXPLAYERS+1][PlayerStats]; new g_playerTop[STATSTOP_NUM_ENTRIES][PlayerStats]; +new g_displayedStats[MAXPLAYERS+1] = { false, ... }; public OnPluginStart() { CreateTimer( 1.0, Timer_PlaytimeTick, _ ); RegConsoleCmd( "sm_stats", Command_Stats, "shows stats" ); RegAdminCmd( "sm_savestats", Command_SaveStats, ADMFLAG_ROOT, "saves stats" ); ResetPlayerStates(); - + + HookEvent( "player_death", Event_PlayerDeath ); + CreateTimer( 1.0, Timer_PlaytimeTick, _, TIMER_REPEAT ); } @@ -172,37 +175,22 @@ public FindKDTopIndex( Float:kd ) { if( !kd ) return g_statsTOP; - if( kd > g_playerTop[0][plKDRatio] ) + if( kd >= g_playerTop[0][plKDRatio] ) return 0; - if( g_statsTOP > 0 && kd < g_playerTop[g_statsTOP - 1][plKDRatio] ) - return g_statsTOP; + new top = g_statsTOP; + if( top > STATSTOP_NUM_ENTRIES ) + top = STATSTOP_NUM_ENTRIES; - for( new i = 0; i < 3; ++i ) { - if( g_playerTop[i][plKDRatio] > kd ) + if( top >= 0 && kd < g_playerTop[top - 1][plKDRatio] ) + return g_statsTOP; + + for( new i = 0; i < top; ++i ) { + if( g_playerTop[i][plKDRatio] < kd ) return i; } - new i = g_statsTOP / 2; - new denominator = 4; - new bool:flip = false; - - for( ;; ) { - if( g_playerTop[i][plKDRatio] > kd && g_playerTop[i + 1][plKDRatio] < kd ) - return i; - else if( g_playerTop[i][plKDRatio] > kd ) - flip = false; - else - flip = true; - - if( denominator < g_statsTOP ) - denominator *= 2; - - if( flip ) - i += (g_statsTOP / denominator); - else - i -= (g_statsTOP / denominator); - } + return g_statsTOP; } public ResetPlayerState( i ) { @@ -396,10 +384,10 @@ public Float:GetLJScore( client, table ) { else if( pos == 3 ) score = 500.0; - new Float:div = Float:g_LJTopMax[table]; + new Float:div = float(g_LJTopMax[table]); if( div < 1.0 ) div = 1.0; - score += (500 - (Float:pos / div * 500)) * multiplier; + score += (500.0 - (float(pos) / div * 500.0)) * multiplier; return score; } @@ -409,28 +397,28 @@ public Float:GetKDScore( client ) { new Float:kd = g_playerStats[client][plKDRatio]; new kdPlacement = FindKDTopIndex( kd ) + 1; if( kdPlacement == 1 ) - points += 1000; + points += 1000.0; else if( kdPlacement == 2 ) - points += 750; - else if( kdPlacement == 3) - points += 500; + points += 750.0; + else if( kdPlacement == 3 ) + points += 500.0; - new Float:num = Float:kdPlacement; - new Float:den = Float:g_statsTOP; + new Float:num = float(kdPlacement); + new Float:den = float(g_statsTOP); if( den < 1.0 ) den = 1.0; - points += 500 - (num / den * 500); + points += 500.0 - ( num / den ) * 500.0; return points; } public Float:GetPlayerPoints( client ) { new Float:points = 0.0; - points += g_playerStats[client][plKills] * 1; - points -= g_playerStats[client][plDeaths] * 0.9; - points += g_playerStats[client][plRoundwins] * 0.5; - points -= g_playerStats[client][plRoundlosses] * 0.5; + points += float(g_playerStats[client][plKills]) * 1; + points -= float(g_playerStats[client][plDeaths]) * 0.9; + points += float(g_playerStats[client][plRoundwins]) * 0.5; + points -= float(g_playerStats[client][plRoundlosses]) * 0.5; points += GetLJScore( client, _:LT_LJ ); points += GetLJScore( client, _:LT_CJ ); points += GetLJScore( client, _:LT_BJ ); @@ -550,7 +538,7 @@ public SaveStatsForTop( iClient, Handle:hndl ) { SQL_FetchStringByName( hndl, "name", name, sizeof(name) ); strcopy( g_playerTop[iClient][plName], sizeof(name), name ); decl String:steamid[32]; - SQL_FetchStringByName( hndl, "steamid", steamid, sizeof(steamid) );dd + SQL_FetchStringByName( hndl, "steamid", steamid, sizeof(steamid) ); strcopy( g_playerTop[iClient][plSteamid], sizeof(steamid), steamid ); } @@ -560,15 +548,20 @@ public LoadStatsDBCallback( Handle:owner, Handle:hndl, String:error[], any:pack return; } - g_statsTOP = SQL_GetRowCount( hndl ); - for( new i = 0; i < g_statsTOP; i++ ) { + new rows = SQL_GetRowCount( hndl ); + new it = 0; + if( !pack ) + g_statsTOP = rows; + for( new i = 0; i < rows; i++ ) { SQL_FetchRow( hndl ); decl String:steamid[32]; SQL_FetchStringByName( hndl, "steamid", steamid, sizeof(steamid) ); + if( steamid[0] != 'S' ) + continue; new iClient = 0; for( new i2 = 1; i2 < GetMaxClients(); ++i2 ) { - if( !IsClientConnected( i2 ) || !IsClientInGame( i2 ) ) + if( !IsClientConnected( i2 ) ) continue; new String:playerSteamID[32]; @@ -582,16 +575,20 @@ public LoadStatsDBCallback( Handle:owner, Handle:hndl, String:error[], any:pack if( iClient != 0 ) { SaveStatsForClient( iClient, hndl ); strcopy( g_playerStats[iClient][plSteamid], sizeof(steamid), steamid ); - + LogMessage( "Loading db for client %s pack: %d", steamid, !!pack ); if( !pack ) - g_playerStats[iClient][plStatPos] = i; + g_playerStats[iClient][plStatPos] = it; } - if( i >= STATSTOP_NUM_ENTRIES - 1 || !!pack ) + if( i >= STATSTOP_NUM_ENTRIES - 1 || !!pack ) { + ++it; continue; + } - g_playerTop[i][plStatPos] = i; - SaveStatsForTop( i, hndl ); + g_playerTop[i][plStatPos] = it; + SaveStatsForTop( it, hndl ); + LogMessage( "Loading db for top %s (%s)", g_playerTop[it][plName], steamid ); + ++it; } } @@ -619,21 +616,17 @@ public LoadStatsDB() { SQL_TQuery(g_statsDB, CreateStatsDBCallback, "CREATE TABLE IF NOT EXISTS playerstats (steamid VARCHAR(32) NOT NULL, name VARCHAR(64) NOT NULL, kills INT NOT NULL, deaths INT NOT NULL, kdratio FLOAT NOT NULL, totalpoints INT NOT NULL, playtime INT NOT NULL, alivetime INT NOT NULL, deadtime INT NOT NULL, ljtop FLOAT NOT NULL, ljtoppos INT NOT NULL, swljtop FLOAT NOT NULL, swljtoppos INT NOT NULL, bwljtop FLOAT NOT NULL, bwljtoppos INT NOT NULL, cjtop FLOAT NOT NULL, cjtoppos INT NOT NULL, lajtop FLOAT NOT NULL, lajtoppos INT NOT NULL, wjtop FLOAT NOT NULL, wjtoppos INT NOT NULL, jbtop FLOAT NOT NULL, jbtoppos INT NOT NULL, roundwins INT NOT NULL, roundlosses INT NOT NULL, PRIMARY KEY (steamid))"); } -public LoadStatsDBForUser( client ) { - if( g_statsDB == INVALID_HANDLE ) { - LogMessage( "db invalid" ); - return; - } - - if( !IsClientConnected( client ) || !IsClientInGame( client ) || IsFakeClient( client ) ) { - LogMessage( "client not connected" ); - return; - } - - decl String:steamid[32]; +public FindEntryForUser( client, bool:update ) { + new String:steamid[32]; GetClientAuthString( client, steamid, sizeof(steamid) ); - for( new i = 0; i < g_statsTOP; ++i ) { - if( !strcmp( g_playerTop[i][plSteamid], steamid ) ) { + new top = g_statsTOP > STATSTOP_NUM_ENTRIES ? STATSTOP_NUM_ENTRIES : g_statsTOP; + for( new i = 0; i < top; ++i ) { + new cmp = strcmp( g_playerTop[i][plSteamid], steamid ); + if( cmp == 0 ) { + g_playerStats[client][plStatPos] = i; + if( !update ) + return; + g_playerStats[client][plKills] = g_playerTop[i][plKills]; g_playerStats[client][plDeaths] = g_playerTop[i][plDeaths]; g_playerStats[client][plKDRatio] = g_playerTop[i][plKDRatio]; @@ -660,10 +653,27 @@ public LoadStatsDBForUser( client ) { decl String:name[64]; strcopy( name, sizeof(name), g_playerTop[i][plName] ); strcopy( g_playerStats[client][plName], sizeof(name), name ); - - g_playerStats[client][plStatPos] = i; + + LogMessage( "found existing top: %d", i ); + break; } } +} + +public LoadStatsDBForUser( client ) { + if( g_statsDB == INVALID_HANDLE ) { + LogMessage( "db invalid" ); + return; + } + + if( !IsClientConnected( client ) || IsFakeClient( client ) ) { + return; + } + + FindEntryForUser( client, true ); + + new String:steamid[32]; + GetClientAuthString( client, steamid, sizeof(steamid) ); decl String:query[1024]; Format( query, sizeof(query), "SELECT * FROM playerstats WHERE steamid='%s'", steamid ); @@ -737,7 +747,7 @@ public SaveStatsDB() { return; for( new i = 1; i < MaxClients; ++i ) { - if( !IsClientConnected( i ) || !IsClientInGame( i ) || IsFakeClient( i ) ) + if( !IsClientConnected( i ) || IsFakeClient( i ) ) continue; SaveStatsDBForPlayer( i ); @@ -797,7 +807,7 @@ public Action:OnClientSayCommand( client, const String:command[], const String:a new String:color[16]; strcopy( color, sizeof(color), g_playerRankColors[rank] ); - Format( fullOut, sizeof(fullOut), "%s%s[%s%s%s]", fullOut, bracketColor, color, rankString, bracketColor ); + Format( fullOut, sizeof(fullOut), "%s%s[%s%s%s] ", fullOut, bracketColor, color, rankString, bracketColor ); } new String:name[64]; @@ -990,6 +1000,10 @@ public DisplayTopStats( client, target ) { new String:name[64]; new String:steamId[32]; new String:color[16]; + new top = g_statsTOP > STATSTOP_NUM_ENTRIES ? STATSTOP_NUM_ENTRIES : g_statsTOP; + if( target > top ) + CPrintToChat( client, "{fuchsia}There are only {default}%d {fuchsia}players in the database.", top ); + strcopy( name, sizeof(name), g_playerTop[client][plName] ); strcopy( steamId, sizeof(steamId), g_playerTop[client][plSteamid] ); @@ -1009,7 +1023,7 @@ public DisplayTopStats( client, target ) { Format( chatOutput, sizeof(chatOutput), "%s{white}%s {default}({green}%s{default}) is ranked %s#%d{default}/{green}%d {default}\n", chatOutput, name, steamId, color, pos + 1, g_statsTOP ); Format( chatOutput, sizeof(chatOutput), "%s{white}%s{default}'s points : {green}%d\n", chatOutput, name, g_playerTop[client][plTotalPoints] ); - CPrintToChat( target, chatOutput ); + CPrintToChatEx( target, target, chatOutput ); } public Action:Command_Stats( client, args ) { @@ -1061,7 +1075,10 @@ public Action:Timer_PlaytimeTick( Handle: timer, any: unused ) { for( new i = 1; i < MaxClients; ++i ) { if( !IsClientConnected( i ) || !IsClientInGame( i ) || IsFakeClient( i ) ) continue; - + + if( g_playerStats[i][plStatPos] == -1 ) + FindEntryForUser( i, g_playerStats[i][plSteamid][0] == '\0' ); + g_playerStats[i][plPlaytime]++; if( IsPlayerAlive( i ) ) g_playerStats[i][plAlivetime]++; @@ -1093,16 +1110,14 @@ public Action:Event_PlayerDeath( Handle:event, const String:name[], bool:dontBro new killer = GetClientOfUserId( killeruid ); new _target = GetClientOfUserId( targetuid ); - if( !killer || !_target ) + if( !killer || !_target || killer == _target ) return Plugin_Continue; if( killer && IsClientConnected( killer ) && !IsFakeClient( killer ) && !IsFakeClient( _target ) ) { - LogMessage( "killer kills: %d", g_playerStats[killer][plKills] ); g_playerStats[killer][plKills]++; } if( _target && IsClientConnected( _target ) && !IsFakeClient( _target ) ) { g_playerStats[_target][plDeaths]++; - LogMessage( "target deaths: %d", g_playerStats[_target][plDeaths] ); } new killerKills = g_playerStats[killer][plKills]; @@ -1110,13 +1125,16 @@ public Action:Event_PlayerDeath( Handle:event, const String:name[], bool:dontBro new targetKills = g_playerStats[_target][plKills]; new targetDeaths = g_playerStats[_target][plDeaths]; - if( targetDeaths <= 0 ) + if( targetDeaths <= 1 ) targetDeaths = 1; - if( killerDeaths <= 0 ) + if( killerDeaths <= 1 ) killerDeaths = 1; - g_playerStats[killer][plKDRatio] = Float:killerKills / Float:killerDeaths; - g_playerStats[_target][plKDRatio] = Float:targetKills / Float:targetDeaths; + new Float:killerKDRatio = float(killerKills) / float(killerDeaths); + new Float:targetKDRatio = float(targetKills) / float(targetDeaths); + + g_playerStats[killer][plKDRatio] = killerKDRatio; + g_playerStats[_target][plKDRatio] = targetKDRatio; if( !IsFakeClient( killer ) ) SaveStatsDBForPlayer( killer ); |
