From 510fcdd88937cab0f36954048ea728c44c98b9de Mon Sep 17 00:00:00 2001 From: Jackz Date: Fri, 19 Jun 2020 13:28:22 -0500 Subject: [PATCH] Added multiple stats & fixes - door_open, finale wins, tank damage, witch damage, lots of shit --- plugins/l4d2_stats_recorder.smx | Bin 10741 -> 13278 bytes scripting/l4d2_stats_recorder.sp | 211 ++++++++++++++++++++++++------- 2 files changed, 162 insertions(+), 49 deletions(-) diff --git a/plugins/l4d2_stats_recorder.smx b/plugins/l4d2_stats_recorder.smx index c77f0d19d09d5ff0d3d7c397c241aa534b7fb9e1..4814d12e2cc52d38b8b0e6530d164a429a5eb7e5 100644 GIT binary patch literal 13278 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 0 || damageSurvivorRec[i] > 0 || damageInfectedGiven[i] > 0 || damageInfectedRec[i] > 0) { + FlushQueuedStats(i); + updated++; + } } } + if(updated > 0) PrintToServer("Flush stats for %d clients", updated); +} +///////////////////////////////// +// CONVAR CHANGES +///////////////////////////////// +public void CVC_GamemodeChange(ConVar convar, const char[] oldValue, const char[] newValue) { + if(StrEqual(newValue, "realism")) { + bRealism = true; + bVersus = false; + }else if(StrEqual(newValue, "versus")) { + bVersus = true; + bRealism = false; + }else { + bRealism = false; + bVersus = false; + } } ///////////////////////////////// // PLAYER AUTH ///////////////////////////////// -public void OnClientPutInServer(int client) { - char steamid[18]; - GetClientAuthId(client, AuthId_Steam2, steamid, sizeof(steamid)); - steamidcache[client] = steamid; - //TODO: Fetch latest alias & store. - //Initalize user if they do not exist in db - +public void OnClientAuthorized(int client, const char[] auth) { if(!IsFakeClient(client)) { - CreateDBUser(client, steamid); + strcopy(steamidcache[client], 18, auth); + CreateDBUser(client, steamidcache[client]); IncrementStat(client, "connections", 1); + startedPlaying[client] = GetTime(); } } public void OnClientDisconnect(int client) { @@ -163,29 +192,57 @@ void IncrementStat(int client, const char[] name, int amount = 1, bool lowPriori #if defined debug LogError("Incrementing stat (%s) for client %d failure: No steamid", name, client); #endif + if(!IsFakeClient(client)) { + //attempt to fetch it + char steamid[18]; + GetClientAuthId(client, AuthId_Steam2, steamid, sizeof(steamid)); + steamidcache[client] = steamid; + } + } +} +void IncrementMapStat(int client, const char[] mapname, int difficulty) { + if (steamidcache[client][0] && !IsFakeClient(client)) { + char query[255], difficultyName[16]; + int realism_amount = bRealism ? 1 : 0; + switch(difficulty) { + case 0: strcopy(difficultyName, sizeof(difficultyName), "easy"); + case 1: strcopy(difficultyName, sizeof(difficultyName), "normal"); + case 2: strcopy(difficultyName, sizeof(difficultyName), "advanced"); + case 3: strcopy(difficultyName, sizeof(difficultyName), "expert"); + } + + Format(query, sizeof(query), "INSERT INTO stats_maps (steamid, map_name, wins, `difficulty_%s`, realism)\nVALUES ('%s', '%s', 1, 1, %d)\n ON DUPLICATE KEY UPDATE wins=wins+1,`difficulty_%s`=`difficulty_%s`+1,realism=realism+%d", + difficultyName, steamidcache[client], mapname, realism_amount, difficultyName, difficultyName, realism_amount); + PrintToServer("[Debug] Updated Map Stat %s for %s", mapname, steamidcache[client]); + g_db.Query(DBC_Generic, query, _); + }else{ + #if defined debug + LogError("Incrementing stat (%s) for client %d failure: No steamid", mapname, client); + #endif } } public void FlushQueuedStats(int client) { - if(meleeKills[client] > 0) { - IncrementStat(client, "melee_kills", meleeKills[client]); - meleeKills[client] = 0; - } //Update stats (don't bother checking if 0.) - IncrementStat(client, "survivor_damage_give", damageSurvivorGiven[client]); - IncrementStat(client, "survivor_damage_rec",damageSurvivorRec[client]); - IncrementStat(client, "infected_damage_give", damageInfectedGiven[client]); - IncrementStat(client, "infected_damage_rec", damageInfectedRec[client]); - IncrementStat(client, "survivor_ff", damageSurvivorFF[client]); - IncrementStat(client, "common_kills", infectedKills[client]); - IncrementStat(client, "common_headshots", infectedHeadshots[client]); + char query[512]; + int minutes_played = (GetTime() - startedPlaying[client]) / 60; + Format(query, sizeof(query), "UPDATE stats SET survivor_damage_give=survivor_damage_give+%d,survivor_damage_rec=survivor_damage_rec+%d, infected_damage_give=infected_damage_give+%d,infected_damage_rec=infected_damage_rec+%d,survivor_ff=survivor_ff+%d,common_kills=common_kills+%d,common_headshots=common_headshots+%d,melee_kills=melee_kills+%d,door_opens=door_opens+%d,damage_to_tank=damage_to_tank+%d, damage_witch=damage_witch+%d,minutes_played=minutes_played+%d WHERE steamid='%s'", + damageSurvivorGiven[client], + damageSurvivorRec[client], + damageInfectedGiven[client], + damageInfectedRec[client], + damageSurvivorFF[client], + infectedKills[client], + infectedHeadshots[client], + meleeKills[client], + doorOpens[client], + damageToTank[client], + damageWitch[client], + minutes_played, + steamidcache[client][0] + ); + g_db.Query(DBC_FlushQueuedStats, query, client); //And clear them. - damageSurvivorGiven[client] = 0; - damageSurvivorRec[client] = 0; - damageInfectedGiven[client] = 0; - damageInfectedRec[client] = 0; - damageSurvivorFF[client] = 0; - infectedKills[client] = 0; - infectedHeadshots[client] = 0; + steamidcache[client][0] = '\0'; } @@ -193,8 +250,7 @@ public void FlushQueuedStats(int client) { //DATABASE CALLBACKS ///////////////////////////////// public void DBC_CheckUserExistance(Database db, DBResultSet results, const char[] error, any data) { - if(db == null || results == null) - { + if(db == null || results == null) { LogError("DBC_CheckUserExistance returned error: %s", error); return; } @@ -205,23 +261,16 @@ public void DBC_CheckUserExistance(Database db, DBResultSet results, const char[ //user does not exist in db, create now char query[255]; - Format(query, sizeof(query), "INSERT INTO `stats` (`steamid`, `last_alias`) VALUES ('%s', '%s')", steamidcache[client], alias); + Format(query, sizeof(query), "INSERT INTO `stats` (`steamid`, `last_alias`, `last_join_date`) VALUES ('%s', '%s', NOW())", steamidcache[client], alias); g_db.Query(DBC_Generic, query); PrintToServer("Created new database entry for %N (%s)", client, steamidcache[client]); }else{ //User does exist, check if alias is outdated and update if needed - int last_alias_size = results.FetchSize(1); - char[] db_last_alias = new char[last_alias_size]; - results.FetchString(1, db_last_alias, last_alias_size); - if(!StrEqual(db_last_alias, alias, true)) { - char query[255]; - char safe_alias[67]; - db.Escape(alias, safe_alias, 67); + char safe_alias[67], query[255]; + db.Escape(alias, safe_alias, 67); - Format(query, sizeof(query), "UPDATE `stats` SET `last_alias`='%s' WHERE `steamid`='%s'",safe_alias, steamidcache[client]); - g_db.Query(DBC_Generic, query); - PrintToServer("Alias for '%s' updated to '%s' (%s)", db_last_alias, alias, steamidcache[client]); - } + Format(query, sizeof(query), "UPDATE `stats` SET `last_alias`='%s', `last_join_date`=NOW() WHERE `steamid`='%s'",safe_alias, steamidcache[client]); + g_db.Query(DBC_Generic, query); } } public void DBC_Generic(Database db, DBResultSet results, const char[] error, any data) @@ -231,6 +280,25 @@ public void DBC_Generic(Database db, DBResultSet results, const char[] error, an return; } } +public void DBC_FlushQueuedStats(Database db, DBResultSet results, const char[] error, any data) { + if(db == null || results == null) { + LogError("DBC_FlushQueued returne derror: %S", error); + }else{ + int client = data; + meleeKills[client] = 0; + damageSurvivorGiven[client] = 0; + damageSurvivorRec[client] = 0; + damageInfectedGiven[client] = 0; + damageInfectedRec[client] = 0; + damageSurvivorFF[client] = 0; + infectedKills[client] = 0; + infectedHeadshots[client] = 0; + doorOpens[client] = 0; + damageToTank[client] = 0; + damageWitch[client] = 0; + startedPlaying[client] = GetTime(); + } +} //////////////////////////// // COMMANDS /////////////////////////// @@ -245,6 +313,15 @@ public Action Command_DebugStats(int client, int args) { ReplyToCommand(client, "infectedHeadshots = %d", infectedHeadshots[client]); return Plugin_Handled; } +public Action Command_DebugCache(int client, int args) { + ReplyToCommand(client, "Cache:"); + for(int i=1; i<=MaxClients;i++) { + if(IsClientConnected(i) && IsClientInGame(i)) { + ReplyToCommand(client, "#%d (%N) steamid: %s", i, i, steamidcache[i]); + } + } + return Plugin_Handled; +} //////////////////////////// // EVENTS @@ -262,15 +339,22 @@ public void Event_PlayerDeath(Event event, const char[] name, bool dontBroadcast } } public void Event_InfectedHurt(Event event, const char[] name, bool dontBroadcast) { + //TODO: Record damage done to a tank, and a witch. int attacker = GetClientOfUserId(event.GetInt("attacker")); int dmg = event.GetInt("amount"); if(attacker > 0 && !IsFakeClient(attacker)) { damageSurvivorGiven[attacker] += dmg; + int target_id = event.GetInt("entityid"); + char entity_name[32]; + GetEntityClassname(target_id, entity_name, sizeof(entity_name)); + if(StrEqual(entity_name, "witch", false)) { + damageWitch[attacker]++; + } } } public void Event_InfectedDeath(Event event, const char[] name, bool dontBroadcast) { int attacker = GetClientOfUserId(event.GetInt("attacker")); - if(!IsFakeClient(attacker)) { + if(attacker > 0 && !IsFakeClient(attacker)) { bool headshot = event.GetBool("headshot"); if(headshot) { infectedHeadshots[attacker]++; @@ -279,13 +363,12 @@ public void Event_InfectedDeath(Event event, const char[] name, bool dontBroadca } } public void Event_PlayerHurt(Event event, const char[] name, bool dontBroadcast) { - //TODO: Record damage done to a tank, and a witch. int victim = GetClientOfUserId(event.GetInt("userid")); int attacker = GetClientOfUserId(event.GetInt("attacker")); int victim_team = GetClientTeam(victim); int dmg = event.GetInt("dmg_health"); if(dmg <= 0) return; - if(!IsFakeClient(victim)) { + if(victim > 0 && !IsFakeClient(victim)) { if(victim_team == 2) { damageSurvivorRec[victim] += dmg; }else if(victim_team == 3) { @@ -296,6 +379,12 @@ public void Event_PlayerHurt(Event event, const char[] name, bool dontBroadcast) int attacker_team = GetClientTeam(attacker); if(attacker_team == 2) { damageSurvivorGiven[attacker] += dmg; + + char victim_name[64]; + GetClientName(victim, victim_name, sizeof(victim_name)); + if(IsFakeClient(victim) && StrContains(victim_name, "Tank", true) > -1) { + damageToTank[attacker] += dmg; + } }else if(attacker_team == 3) { damageInfectedGiven[attacker] += dmg; } @@ -305,9 +394,7 @@ public void Event_PlayerHurt(Event event, const char[] name, bool dontBroadcast) } } public void Event_ItemPickup(Event event, const char[] name, bool dontBroadcast) { - //TODO: Record damage done to a tank, and a witch. - char item[64]; - char statname[72]; + char statname[72], item[64]; int client = GetClientOfUserId(event.GetInt("userid")); if(!IsFakeClient(client)) { @@ -365,4 +452,30 @@ public void Event_TankKilled(Event event, const char[] name, bool dontBroadcast) } IncrementStat(attacker, "tanks_killed", 1); } +} +public void Event_DoorOpened(Event event, const char[] name, bool dontBroadcast) { + int client = GetClientOfUserId(event.GetInt("userid")); + if(event.GetBool("closed") && !IsFakeClient(client)) { + doorOpens[client]++; + + } +} + +public void Event_UpgradePackUsed(Event event, const char[] name, bool dontBroadcast) { + int upgradeid = event.GetInt("upgradeid"); + PrintToServer("upgradepackused: %d", upgradeid); +} +public void Event_FinaleWin(Event event, const char[] name, bool dontBroadcast) { + char map_name[128]; + int difficulty = event.GetInt("difficulty"); + event.GetString("map_name", map_name, sizeof(map_name)); + for(int i=1; i <= MaxClients; i++) { + if(IsClientConnected(i) && IsClientInGame(i) && !IsFakeClient(i) && steamidcache[i][0]) { + int team = GetClientTeam(i); + if(team == 2) { + IncrementMapStat(i, map_name, difficulty); + IncrementStat(i, "finales_won",1); + } + } + } } \ No newline at end of file