· 8 years ago · Dec 18, 2017, 11:50 AM
1#pragma semicolon 1
2
3#define PLUGIN_VERSION "1.0"
4#include <sourcemod>
5#include <adminmenu>
6#include <demoan_csgocolors>
7#include <demoan_rankme/rankme>
8#include <geoip>
9#include <sdktools>
10#include <cstrike>
11#include <clientprefs>
12
13//TOGs SourcePawn Syntax Converter
14//https://forums.alliedmods.net/showthread.php?p=2472379
15
16
17#define MSG "\x04 [] \x01\x0B\x01"
18#define SPEC 1
19#define TR 2
20#define CT 3
21
22#define SENDER_WORLD 0
23#define MAX_LENGTH_MENU 470
24
25static const char g_sSqliteCreate[] = "CREATE TABLE IF NOT EXISTS `%s` (id INTEGER PRIMARY KEY, steam TEXT, name TEXT, lastip TEXT, score NUMERIC, kills NUMERIC, deaths NUMERIC, assists NUMERIC, suicides NUMERIC, tk NUMERIC, shots NUMERIC, hits NUMERIC, headshots NUMERIC, connected NUMERIC, rounds_tr NUMERIC, rounds_ct NUMERIC, lastconnect NUMERIC,knife NUMERIC,glock NUMERIC,hkp2000 NUMERIC,usp_silencer NUMERIC,p250 NUMERIC,deagle NUMERIC,elite NUMERIC,fiveseven NUMERIC,tec9 NUMERIC,cz75a NUMERIC,revolver NUMERIC,nova NUMERIC,xm1014 NUMERIC,mag7 NUMERIC,sawedoff NUMERIC,bizon NUMERIC,mac10 NUMERIC,mp9 NUMERIC,mp7 NUMERIC,ump45 NUMERIC,p90 NUMERIC,galilar NUMERIC,ak47 NUMERIC,scar20 NUMERIC,famas NUMERIC,m4a1 NUMERIC,m4a1_silencer NUMERIC,aug NUMERIC,ssg08 NUMERIC,sg556 NUMERIC,awp NUMERIC,g3sg1 NUMERIC,m249 NUMERIC,negev NUMERIC,hegrenade NUMERIC,flashbang NUMERIC,smokegrenade NUMERIC,inferno NUMERIC,decoy NUMERIC,taser NUMERIC,head NUMERIC, chest NUMERIC, stomach NUMERIC, left_arm NUMERIC, right_arm NUMERIC, left_leg NUMERIC, right_leg NUMERIC,c4_planted NUMERIC,c4_exploded NUMERIC,c4_defused NUMERIC,ct_win NUMERIC, tr_win NUMERIC, hostages_rescued NUMERIC, vip_killed NUMERIC, vip_escaped NUMERIC, vip_played NUMERIC, mvp NUMERIC, damage NUMERIC)";
26static const char g_sMysqlCreate[] = "CREATE TABLE IF NOT EXISTS `%s` (id INTEGER PRIMARY KEY, steam TEXT, name TEXT, lastip TEXT, score NUMERIC, kills NUMERIC, deaths NUMERIC, assists NUMERIC, suicides NUMERIC, tk NUMERIC, shots NUMERIC, hits NUMERIC, headshots NUMERIC, connected NUMERIC, rounds_tr NUMERIC, rounds_ct NUMERIC, lastconnect NUMERIC,knife NUMERIC,glock NUMERIC,hkp2000 NUMERIC,usp_silencer NUMERIC,p250 NUMERIC,deagle NUMERIC,elite NUMERIC,fiveseven NUMERIC,tec9 NUMERIC,cz75a NUMERIC,revolver NUMERIC,nova NUMERIC,xm1014 NUMERIC,mag7 NUMERIC,sawedoff NUMERIC,bizon NUMERIC,mac10 NUMERIC,mp9 NUMERIC,mp7 NUMERIC,ump45 NUMERIC,p90 NUMERIC,galilar NUMERIC,ak47 NUMERIC,scar20 NUMERIC,famas NUMERIC,m4a1 NUMERIC,m4a1_silencer NUMERIC,aug NUMERIC,ssg08 NUMERIC,sg556 NUMERIC,awp NUMERIC,g3sg1 NUMERIC,m249 NUMERIC,negev NUMERIC,hegrenade NUMERIC,flashbang NUMERIC,smokegrenade NUMERIC,inferno NUMERIC,decoy NUMERIC,taser NUMERIC,head NUMERIC, chest NUMERIC, stomach NUMERIC, left_arm NUMERIC, right_arm NUMERIC, left_leg NUMERIC, right_leg NUMERIC,c4_planted NUMERIC,c4_exploded NUMERIC,c4_defused NUMERIC,ct_win NUMERIC, tr_win NUMERIC, hostages_rescued NUMERIC, vip_killed NUMERIC, vip_escaped NUMERIC, vip_played NUMERIC, mvp NUMERIC, damage NUMERIC) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci";
27static const char g_sSqlInsert[] = "INSERT INTO `%s` VALUES (NULL,'%s','%s','%s','%d','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0','0');";
28
29/* Old
30new String:g_sSqlSave[] = "UPDATE `%s` SET score = '%i', kills = '%i', deaths='%i', assists='%i',suicides='%i',tk='%i',shots='%i',hits='%i',headshots='%i', rounds_tr = '%i', rounds_ct = '%i',lastip='%s',name='%s'%s,head='%i',chest='%i', stomach='%i',left_arm='%i',right_arm='%i',left_leg='%i',right_leg='%i',c4_planted='%i',c4_exploded='%i',c4_defused='%i',ct_win='%i',tr_win='%i', hostages_rescued='%i',vip_killed = '%d',vip_escaped = '%d',vip_played = '%d', mvp='%i', damage='%i', lastconnect='%i', connected='%i' WHERE steam = '%s';";
31new String:g_sSqlSaveName[] = "UPDATE `%s` SET score = '%i', kills = '%i', deaths='%i', assists='%i',suicides='%i',tk='%i',shots='%i',hits='%i',headshots='%i', rounds_tr = '%i', rounds_ct = '%i',lastip='%s',name='%s'%s,head='%i',chest='%i', stomach='%i',left_arm='%i',right_arm='%i',left_leg='%i',right_leg='%i',c4_planted='%i',c4_exploded='%i',c4_defused='%i',ct_win='%i',tr_win='%i', hostages_rescued='%i',vip_killed = '%d',vip_escaped = '%d',vip_played = '%d', mvp='%i', damage='%i', lastconnect='%i', connected='%i' WHERE name = '%s';";
32new String:g_sSqlSaveIp[] = "UPDATE `%s` SET score = '%i', kills = '%i', deaths='%i', assists='%i',suicides='%i',tk='%i',shots='%i',hits='%i',headshots='%i', rounds_tr = '%i', rounds_ct = '%i',lastip='%s',name='%s'%s,head='%i',chest='%i', stomach='%i',left_arm='%i',right_arm='%i',left_leg='%i',right_leg='%i',c4_planted='%i',c4_exploded='%i',c4_defused='%i',ct_win='%i',tr_win='%i', hostages_rescued='%i',vip_killed = '%d',vip_escaped = '%d',vip_played = '%d', mvp='%i', damage='%i', lastconnect='%i', connected='%i' WHERE lastip = '%s';";
33*/
34
35/* SM1.9 Fix */
36static const char g_sSqlSave[] = "UPDATE `%s` SET score = '%i', kills = '%i', deaths='%i', assists='%i',suicides='%i',tk='%i',shots='%i',hits='%i',headshots='%i', rounds_tr = '%i', rounds_ct = '%i',lastip='%s',name='%s'%s,head='%i',chest='%i', stomach='%i',left_arm='%i',right_arm='%i',left_leg='%i',right_leg='%i' WHERE steam = '%s';";
37static const char g_sSqlSaveName[] = "UPDATE `%s` SET score = '%i', kills = '%i', deaths='%i', assists='%i',suicides='%i',tk='%i',shots='%i',hits='%i',headshots='%i', rounds_tr = '%i', rounds_ct = '%i',lastip='%s',name='%s'%s,head='%i',chest='%i', stomach='%i',left_arm='%i',right_arm='%i',left_leg='%i',right_leg='%i' WHERE name = '%s';";
38static const char g_sSqlSaveIp[] = "UPDATE `%s` SET score = '%i', kills = '%i', deaths='%i', assists='%i',suicides='%i',tk='%i',shots='%i',hits='%i',headshots='%i', rounds_tr = '%i', rounds_ct = '%i',lastip='%s',name='%s'%s,head='%i',chest='%i', stomach='%i',left_arm='%i',right_arm='%i',left_leg='%i',right_leg='%i' WHERE lastip = '%s';";
39static const char g_sSqlSave2[] = "UPDATE `%s` SET c4_planted='%i',c4_exploded='%i',c4_defused='%i',ct_win='%i',tr_win='%i', hostages_rescued='%i',vip_killed = '%d',vip_escaped = '%d',vip_played = '%d', mvp='%i', damage='%i', lastconnect='%i', connected='%i' WHERE steam = '%s';";
40static const char g_sSqlSaveName2[] = "UPDATE `%s` SET c4_planted='%i',c4_exploded='%i',c4_defused='%i',ct_win='%i',tr_win='%i', hostages_rescued='%i',vip_killed = '%d',vip_escaped = '%d',vip_played = '%d', mvp='%i', damage='%i', lastconnect='%i', connected='%i' WHERE name = '%s';";
41static const char g_sSqlSaveIp2[] = "UPDATE `%s` SET c4_planted='%i',c4_exploded='%i',c4_defused='%i',ct_win='%i',tr_win='%i', hostages_rescued='%i',vip_killed = '%d',vip_escaped = '%d',vip_played = '%d', mvp='%i', damage='%i', lastconnect='%i', connected='%i' WHERE lastip = '%s';";
42
43static const char g_sSqlRetrieveClient[] = "SELECT * FROM `%s` WHERE steam='%s';";
44static const char g_sSqlRetrieveClientName[] = "SELECT * FROM `%s` WHERE name='%s';";
45static const char g_sSqlRetrieveClientIp[] = "SELECT * FROM `%s` WHERE lastip='%s';";
46static const char g_sSqlRemoveDuplicateSQLite[] = "delete from `%s` where `%s`.id > (SELECT min(id) from `%s` as t2 WHERE t2.steam=`%s`.steam);";
47static const char g_sSqlRemoveDuplicateNameSQLite[] = "delete from `%s` where `%s`.id > (SELECT min(id) from `%s` as t2 WHERE t2.name=`%s`.name);";
48static const char g_sSqlRemoveDuplicateIpSQLite[] = "delete from `%s` where `%s`.id > (SELECT min(id) from `%s` as t2 WHERE t2.lastip=`%s`.lastip);";
49static const char g_sSqlRemoveDuplicateMySQL[] = "delete from `%s` USING `%s`, `%s` as vtable WHERE (`%s`.id>vtable.id) AND (`%s`.steam=vtable.steam);";
50static const char g_sSqlRemoveDuplicateNameMySQL[] = "delete from `%s` USING `%s`, `%s` as vtable WHERE (`%s`.id>vtable.id) AND (`%s`.name=vtable.name);";
51static const char g_sSqlRemoveDuplicateIpMySQL[] = "delete from `%s` USING `%s`, `%s` as vtable WHERE (`%s`.id>vtable.id) AND (`%s`.ip=vtable.ip);";
52stock const char g_sWeaponsNamesGame[40][] = { "knife", "glock", "hkp2000", "usp_silencer", "p250", "deagle", "elite", "fiveseven", "tec9", "cz75a", "revolver", "nova", "xm1014", "mag7", "sawedoff", "bizon", "mac10", "mp9", "mp7", "ump45", "p90", "galilar", "ak47", "scar20", "famas", "m4a1", "m4a1_silencer", "aug", "ssg08", "sg556", "awp", "g3sg1", "m249", "negev", "hegrenade", "flashbang", "smokegrenade", "inferno", "decoy", "taser" };
53stock const char g_sWeaponsNamesFull[40][] = { "Knife", "Glock", "P2000", "USP-S", "P250", "Desert Eagle", "Dual Berettas", "Five-Seven", "Tec 9", "CZ75-Auto", "R8 Revolver", "Nova", "XM1014", "Mag 7", "Sawed-off", "PP-Bizon", "MAC-10", "MP9", "MP7", "UMP45", "P90", "Galil AR", "AK-47", "SCAR-20", "Famas", "M4A4", "M4A1-S", "AUG", "SSG 08", "SG 553", "AWP", "G3SG1", "M249", "Negev", "HE Grenade", "Flashbang", "Smoke Grenade", "Inferno", "Decoy", "Zeus x27" };
54Handle g_cvarEnabled;
55Handle g_cvarChatChange;
56Handle g_cvarRankbots;
57Handle g_cvarAutopurge;
58Handle g_cvarDumpDB;
59Handle g_cvarPointsBombDefusedTeam;
60Handle g_cvarPointsBombDefusedPlayer;
61Handle g_cvarPointsBombPlantedTeam;
62Handle g_cvarPointsBombPlantedPlayer;
63Handle g_cvarPointsBombExplodeTeam;
64Handle g_cvarPointsBombExplodePlayer;
65Handle g_cvarPointsBombPickup;
66Handle g_cvarPointsBombDropped;
67Handle g_cvarPointsHostageRescTeam;
68Handle g_cvarPointsHostageRescPlayer;
69Handle g_cvarPointsVipEscapedTeam;
70Handle g_cvarPointsVipEscapedPlayer;
71Handle g_cvarPointsVipKilledTeam;
72Handle g_cvarPointsVipKilledPlayer;
73Handle g_cvarPointsHs;
74Handle g_cvarPointsKillCt;
75Handle g_cvarPointsKillTr;
76Handle g_cvarPointsKillBonusCt;
77Handle g_cvarPointsKillBonusTr;
78Handle g_cvarPointsKillBonusDifCt;
79Handle g_cvarPointsKillBonusDifTr;
80Handle g_cvarPointsStart;
81Handle g_cvarPointsKnifeMultiplier;
82Handle g_cvarPointsTaserMultiplier;
83Handle g_cvarPointsTrRoundWin;
84Handle g_cvarPointsCtRoundWin;
85Handle g_cvarPointsMvpCt;
86Handle g_cvarPointsMvpTr;
87Handle g_cvarMinimalKills;
88Handle g_cvarPercentPointsLose;
89Handle g_cvarPointsLoseRoundCeil;
90Handle g_cvarShowRankAll;
91Handle g_cvarResetOwnRank;
92Handle g_cvarMinimumPlayers;
93Handle g_cvarVipEnabled;
94Handle g_cvarPointsLoseTk;
95Handle g_cvarPointsLoseSuicide;
96Handle g_cvarShowBotsOnRank;
97Handle g_cvarRankBy;
98Handle g_cvarFfa;
99Handle g_cvarMysql;
100Handle g_cvarGatherStats;
101Handle g_cvarDaysToNotShowOnRank;
102Handle g_cvarRankMode;
103Handle g_cvarSQLTable;
104Handle g_cvarChatTriggers;
105
106bool g_bEnabled;
107bool g_bResetOwnRank;
108bool g_bChatChange;
109bool g_bRankBots;
110bool g_bPointsLoseRoundCeil;
111bool g_bShowRankAll;
112bool g_bVipEnabled;
113bool g_bShowBotsOnRank;
114bool g_bFfa;
115bool g_bMysql;
116bool g_bGatherStats;
117bool g_bDumpDB;
118bool g_bChatTriggers;
119int g_RankBy;
120int g_PointsBombDefusedTeam;
121int g_PointsBombDefusedPlayer;
122int g_PointsBombPlantedTeam;
123int g_PointsBombPlantedPlayer;
124int g_PointsBombExplodeTeam;
125int g_PointsBombExplodePlayer;
126int g_PointsBombPickup;
127int g_PointsBombDropped;
128int g_PointsHostageRescTeam;
129int g_PointsHostageRescPlayer;
130int g_PointsHs;
131// Size = 4 -> for using client team for points
132int g_PointsKill[4];
133int g_PointsKillBonus[4];
134int g_PointsKillBonusDif[4];
135int g_PointsMvpTr;
136int g_PointsMvpCt;
137int g_MinimalKills;
138int g_PointsStart;
139float g_fPointsKnifeMultiplier;
140float g_fPointsTaserMultiplier;
141float g_fPercentPointsLose;
142int g_PointsRoundWin[4];
143int g_MinimumPlayers;
144int g_PointsLoseTk;
145int g_PointsLoseSuicide;
146int g_PointsVipEscapedTeam;
147int g_PointsVipEscapedPlayer;
148int g_PointsVipKilledTeam;
149int g_PointsVipKilledPlayer;
150int g_DaysToNotShowOnRank;
151int g_RankMode;
152char g_sSQLTable[200];
153Handle g_hStatsDb;
154bool OnDB[MAXPLAYERS + 1];
155int g_aSession[MAXPLAYERS + 1][STATS_NAMES];
156int g_aStats[MAXPLAYERS + 1][STATS_NAMES];
157int g_aWeapons[MAXPLAYERS + 1][WEAPONS_ENUM];
158int g_aHitBox[MAXPLAYERS + 1][HITBOXES];
159int g_TotalPlayers;
160
161Handle g_fwdOnPlayerLoaded;
162Handle g_fwdOnPlayerSaved;
163
164bool DEBUGGING = false;
165int g_C4PlantedBy;
166char g_sC4PlantedByName[MAX_NAME_LENGTH];
167
168// Preventing duplicates
169char g_aClientSteam[MAXPLAYERS + 1][64];
170char g_aClientName[MAXPLAYERS + 1][MAX_NAME_LENGTH];
171char g_aClientIp[MAXPLAYERS + 1][64];
172
173/* Rank cache */
174Handle g_cvarRankCache;
175Handle g_arrayRankCache[3];
176bool g_bRankCache;
177
178
179/*RankMe Connect Announcer*/
180Handle g_cvarAnnounceConnect;
181Handle g_cvarAnnounceConnectChat;
182Handle g_cvarAnnounceConnectHint;
183Handle g_cvarAnnounceDisconnect;
184Handle g_cvarAnnounceTopConnect;
185Handle g_cvarAnnounceTopPosConnect;
186Handle g_cvarAnnounceTopConnectChat;
187Handle g_cvarAnnounceTopConnectHint;
188
189bool g_bAnnounceConnect;
190bool g_bAnnounceConnectChat;
191bool g_bAnnounceConnectHint;
192bool g_bAnnounceDisconnect;
193bool g_bAnnounceTopConnect;
194bool g_bAnnounceTopConnectChat;
195bool g_bAnnounceTopConnectHint;
196
197int g_AnnounceTopPosConnect;
198
199int g_aPointsOnConnect[MAXPLAYERS+1];
200int g_aPointsOnDisconnect[MAXPLAYERS+1];
201int g_aRankOnConnect[MAXPLAYERS+1];
202char g_sBufferClientName[MAXPLAYERS+1][MAX_NAME_LENGTH];
203
204/* Assist */
205Handle g_cvarPointsAssistKill;
206int g_PointsAssistKill;
207
208/* Enable Or Disable Points In Warmup */
209Handle g_cvarGatherStatsWarmup;
210bool g_bGatherStatsWarmup;
211
212/* Min points */
213Handle g_cvarPointsMin;
214int g_PointsMin;
215Handle g_cvarPointsMinEnabled;
216bool g_bPointsMinEnabled;
217
218/* Hide Chat */
219Handle hidechatcookie;
220bool hidechat[MAXPLAYERS+1];
221
222#include <demoan_rankme/cmds>
223#pragma newdecls required
224
225public Plugin myinfo = {
226 name = "[D]emoan Rank",
227 author = "lok1, Scooby, pracc, Kento, Kxnrl, [D]emoan",
228 description = "Csgo Ranking",
229 version = PLUGIN_VERSION,
230 url = ""
231};
232
233public void OnPluginStart() {
234
235 // CREATE CVARS
236 g_cvarEnabled = CreateConVar("rankme_enabled", "1", "Is RankMe enabled? 1 = true 0 = false", _, true, 0.0, true, 1.0);
237 g_cvarRankbots = CreateConVar("rankme_rankbots", "0", "Rank bots? 1 = true 0 = false", _, true, 0.0, true, 1.0);
238 g_cvarAutopurge = CreateConVar("rankme_autopurge", "0", "Auto-Purge inactive players? X = Days 0 = Off", _, true, 0.0);
239 g_cvarPointsBombDefusedTeam = CreateConVar("rankme_points_bomb_defused_team", "2", "How many points CTs got for defusing the C4?", _, true, 0.0);
240 g_cvarPointsBombDefusedPlayer = CreateConVar("rankme_points_bomb_defused_player", "2", "How many points the CT who defused got additional?", _, true, 0.0);
241 g_cvarPointsBombPlantedTeam = CreateConVar("rankme_points_bomb_planted_team", "2", "How many points TRs got for planting the C4?", _, true, 0.0);
242 g_cvarPointsBombPlantedPlayer = CreateConVar("rankme_points_bomb_planted_player", "2", "How many points the TR who planted got additional?", _, true, 0.0);
243 g_cvarPointsBombExplodeTeam = CreateConVar("rankme_points_bomb_exploded_team", "2", "How many points TRs got for exploding the C4?", _, true, 0.0);
244 g_cvarPointsBombExplodePlayer = CreateConVar("rankme_points_bomb_exploded_player", "2", "How many points the TR who planted got additional?", _, true, 0.0);
245 g_cvarPointsHostageRescTeam = CreateConVar("rankme_points_hostage_rescued_team", "2", "How many points CTs got for rescuing the hostage?", _, true, 0.0);
246 g_cvarPointsHostageRescPlayer = CreateConVar("rankme_points_hostage_rescued_player", "2", "How many points the CT who rescued got additional?", _, true, 0.0);
247 g_cvarPointsHs = CreateConVar("rankme_points_hs", "1", "How many additional points a player got for a HeadShot?", _, true, 0.0);
248 g_cvarPointsKillCt = CreateConVar("rankme_points_kill_ct", "2", "How many points a CT got for killing?", _, true, 0.0);
249 g_cvarPointsKillTr = CreateConVar("rankme_points_kill_tr", "2", "How many points a TR got for killing?", _, true, 0.0);
250 g_cvarPointsKillBonusCt = CreateConVar("rankme_points_kill_bonus_ct", "1", "How many points a CT got for killing additional by the diffrence of points?", _, true, 0.0);
251 g_cvarPointsKillBonusTr = CreateConVar("rankme_points_kill_bonus_tr", "1", "How many points a TR got for killing additional by the diffrence of points?", _, true, 0.0);
252 g_cvarPointsKillBonusDifCt = CreateConVar("rankme_points_kill_bonus_dif_ct", "100", "How many points of diffrence is needed for a CT to got the bonus?", _, true, 0.0);
253 g_cvarPointsKillBonusDifTr = CreateConVar("rankme_points_kill_bonus_dif_tr", "100", "How many points of diffrence is needed for a TR to got the bonus?", _, true, 0.0);
254 g_cvarPointsCtRoundWin = CreateConVar("rankme_points_ct_round_win", "0", "How many points an alive CT got for winning the round?", _, true, 0.0);
255 g_cvarPointsTrRoundWin = CreateConVar("rankme_points_tr_round_win", "0", "How many points an alive TR got for winning the round?", _, true, 0.0);
256 g_cvarPointsKnifeMultiplier = CreateConVar("rankme_points_knife_multiplier", "2.0", "Multiplier of points by knife", _, true, 0.0);
257 g_cvarPointsTaserMultiplier = CreateConVar("rankme_points_taser_multiplier", "2.0", "Multiplier of points by taser", _, true, 0.0);
258 g_cvarPointsStart = CreateConVar("rankme_points_start", "1000", "Starting points", _, true, 0.0);
259 g_cvarMinimalKills = CreateConVar("rankme_minimal_kills", "0", "Minimal kills for entering the rank", _, true, 0.0);
260 g_cvarPercentPointsLose = CreateConVar("rankme_percent_points_lose", "1.0", "Multiplier of losing points. (WARNING: MAKE SURE TO INPUT IT AS FLOAT) 1.0 equals lose same amount as won by the killer, 0.0 equals no lose", _, true, 0.0);
261 g_cvarPointsLoseRoundCeil = CreateConVar("rankme_points_lose_round_ceil", "1", "If the points is f1oat, round it to next the highest or lowest? 1 = highest 0 = lowest", _, true, 0.0, true, 1.0);
262 g_cvarChatChange = CreateConVar("rankme_changes_chat", "1", "Show points changes on chat? 1 = true 0 = false", _, true, 0.0, true, 1.0);
263 g_cvarShowRankAll = CreateConVar("rankme_show_rank_all", "0", "When rank command is used, show for all the rank of the player? 1 = true 0 = false", _, true, 0.0, true, 1.0);
264 g_cvarShowBotsOnRank = CreateConVar("rankme_show_bots_on_rank", "0", "Show bots on rank/top/etc? 1 = true 0 = false", _, true, 0.0, true, 1.0);
265 g_cvarResetOwnRank = CreateConVar("rankme_resetownrank", "0", "Allow player to reset his own rank? 1 = true 0 = false", _, true, 0.0, true, 1.0);
266 g_cvarMinimumPlayers = CreateConVar("rankme_minimumplayers", "2", "Minimum players to start giving points", _, true, 0.0);
267 g_cvarVipEnabled = CreateConVar("rankme_vip_enabled", "0", "Show AS_ maps statiscs (VIP mod) on statsme and session?", _, true, 0.0, true, 1.0);
268 g_cvarPointsVipEscapedTeam = CreateConVar("rankme_points_vip_escaped_team", "2", "How many points CTs got helping the VIP to escaping?", _, true, 0.0);
269 g_cvarPointsVipEscapedPlayer = CreateConVar("rankme_points_vip_escaped_player", "2", "How many points the VIP got for escaping?", _, true, 0.0);
270 g_cvarPointsVipKilledTeam = CreateConVar("rankme_points_vip_killed_team", "2", "How many points TRs got for killing the VIP?", _, true, 0.0);
271 g_cvarPointsVipKilledPlayer = CreateConVar("rankme_points_vip_killed_player", "2", "How many points the TR who killed the VIP got additional?", _, true, 0.0);
272 g_cvarPointsLoseTk = CreateConVar("rankme_points_lose_tk", "0", "How many points a player lose for Team Killing?", _, true, 0.0);
273 g_cvarPointsLoseSuicide = CreateConVar("rankme_points_lose_suicide", "0", "How many points a player lose for Suiciding?", _, true, 0.0);
274 g_cvarRankBy = CreateConVar("rankme_rank_by", "0", "Rank players by? 0 = STEAM:ID 1 = Name 2 = IP", _, true, 0.0, true, 2.0);
275 g_cvarFfa = CreateConVar("rankme_ffa", "0", "Free-For-All (FFA) mode? 1 = true 0 = false", _, true, 0.0, true, 1.0);
276 g_cvarMysql = CreateConVar("rankme_mysql", "0", "Using MySQL? 1 = true 0 = false (SQLite)", _, true, 0.0, true, 1.0);
277 g_cvarDumpDB = CreateConVar("rankme_dump_db", "0", "Dump the Database to SQL file? (required to be 1 if using the web interface and SQLite, case MySQL, it won't be dumped) 1 = true 0 = false", _, true, 0.0, true, 1.0);
278 g_cvarGatherStats = CreateConVar("rankme_gather_stats", "1", "Gather Statistics (a.k.a count points)? (turning this off won't disallow to see the stats already gathered) 1 = true 0 = false", _, true, 0.0, true, 1.0);
279 g_cvarDaysToNotShowOnRank = CreateConVar("rankme_days_to_not_show_on_rank", "0", "Days inactive to not be shown on rank? X = days 0 = off", _, true, 0.0);
280 g_cvarRankMode = CreateConVar("rankme_rank_mode", "1", "Rank by what? 1 = by points 2 = by KDR ", _, true, 1.0, true, 2.0);
281 g_cvarSQLTable = CreateConVar("rankme_sql_table", "rankme", "The name of the table that will be used. (Max: 100)");
282 g_cvarChatTriggers = CreateConVar("rankme_chat_triggers", "1", "Enable (non-command) chat triggers. (e.g: rank, statsme, top) Recommended to be set to 0 when running with EventScripts for avoiding double responses. 1 = true 0 = false", _, true, 0.0, true, 1.0);
283 g_cvarPointsMvpCt = CreateConVar("rankme_points_mvp_ct", "1", "How many points a CT got for being the MVP?", _, true, 0.0);
284 g_cvarPointsMvpTr = CreateConVar("rankme_points_mvp_tr", "1", "How many points a TR got for being the MVP?", _, true, 0.0);
285 g_cvarPointsBombPickup = CreateConVar("rankme_points_bomb_pickup", "0", "How many points a player gets for picking up the bomb?", _, true, 0.0);
286 g_cvarPointsBombDropped = CreateConVar("rankme_points_bomb_dropped", "0", "How many points a player loess for dropping the bomb?", _, true, 0.0);
287
288 /* Assist */
289 g_cvarPointsAssistKill = CreateConVar("rankme_points_assiist_kill","1","How many points a player gets for assist kill?",_,true,0.0);
290
291 /* Enable Or Disable Points In Warmup */
292 g_cvarGatherStatsWarmup = CreateConVar("rankme_gather_stats_warmup","1","Gather Statistics In Warmup?", _, true, 0.0, true, 1.0);
293
294 /* Min points */
295 g_cvarPointsMinEnabled = CreateConVar("rankme_points_min_enabled", "1", "Is minimum points enabled? 1 = true 0 = false", _, true, 0.0, true, 1.0);
296 g_cvarPointsMin = CreateConVar("rankme_points_min", "0", "Minimum points", _, true, 0.0);
297
298 /* Rank cache */
299 g_cvarRankCache = CreateConVar("rankme_rank_cache", "0", "Get player rank via cache, auto build cache on every OnMapStart.", _, true, 0.0, true, 1.0);
300 g_arrayRankCache[0] = CreateArray(ByteCountToCells(128));
301 g_arrayRankCache[1] = CreateArray(ByteCountToCells(128));
302 g_arrayRankCache[2] = CreateArray(ByteCountToCells(128));
303
304 // CVAR HOOK
305 HookConVarChange(g_cvarEnabled, OnConVarChanged);
306 HookConVarChange(g_cvarChatChange, OnConVarChanged);
307 HookConVarChange(g_cvarShowBotsOnRank, OnConVarChanged);
308 HookConVarChange(g_cvarShowRankAll, OnConVarChanged);
309 HookConVarChange(g_cvarResetOwnRank, OnConVarChanged);
310 HookConVarChange(g_cvarMinimumPlayers, OnConVarChanged);
311 HookConVarChange(g_cvarRankbots, OnConVarChanged);
312 HookConVarChange(g_cvarAutopurge, OnConVarChanged);
313 HookConVarChange(g_cvarPointsBombDefusedTeam, OnConVarChanged);
314 HookConVarChange(g_cvarPointsBombDefusedPlayer, OnConVarChanged);
315 HookConVarChange(g_cvarPointsBombPlantedTeam, OnConVarChanged);
316 HookConVarChange(g_cvarPointsBombPlantedPlayer, OnConVarChanged);
317 HookConVarChange(g_cvarPointsBombExplodeTeam, OnConVarChanged);
318 HookConVarChange(g_cvarPointsBombExplodePlayer, OnConVarChanged);
319 HookConVarChange(g_cvarPointsHostageRescTeam, OnConVarChanged);
320 HookConVarChange(g_cvarPointsHostageRescPlayer, OnConVarChanged);
321 HookConVarChange(g_cvarPointsHs, OnConVarChanged);
322 HookConVarChange(g_cvarPointsKillCt, OnConVarChanged);
323 HookConVarChange(g_cvarPointsKillTr, OnConVarChanged);
324 HookConVarChange(g_cvarPointsKillBonusCt, OnConVarChanged);
325 HookConVarChange(g_cvarPointsKillBonusTr, OnConVarChanged);
326 HookConVarChange(g_cvarPointsKillBonusDifCt, OnConVarChanged);
327 HookConVarChange(g_cvarPointsKillBonusDifTr, OnConVarChanged);
328 HookConVarChange(g_cvarPointsCtRoundWin, OnConVarChanged);
329 HookConVarChange(g_cvarPointsTrRoundWin, OnConVarChanged);
330 HookConVarChange(g_cvarPointsKnifeMultiplier, OnConVarChanged);
331 HookConVarChange(g_cvarPointsTaserMultiplier, OnConVarChanged);
332 HookConVarChange(g_cvarPointsStart, OnConVarChanged);
333 HookConVarChange(g_cvarMinimalKills, OnConVarChanged);
334 HookConVarChange(g_cvarPercentPointsLose, OnConVarChanged);
335 HookConVarChange(g_cvarPointsLoseRoundCeil, OnConVarChanged);
336 HookConVarChange(g_cvarVipEnabled, OnConVarChanged);
337 HookConVarChange(g_cvarPointsVipEscapedTeam, OnConVarChanged);
338 HookConVarChange(g_cvarPointsVipEscapedPlayer, OnConVarChanged);
339 HookConVarChange(g_cvarPointsVipKilledTeam, OnConVarChanged);
340 HookConVarChange(g_cvarPointsVipKilledPlayer, OnConVarChanged);
341 HookConVarChange(g_cvarPointsLoseTk, OnConVarChanged);
342 HookConVarChange(g_cvarPointsLoseSuicide, OnConVarChanged);
343 HookConVarChange(g_cvarRankBy, OnConVarChanged);
344 HookConVarChange(g_cvarFfa, OnConVarChanged);
345 HookConVarChange(g_cvarDumpDB, OnConVarChanged);
346 HookConVarChange(g_cvarGatherStats, OnConVarChanged);
347 HookConVarChange(g_cvarDaysToNotShowOnRank, OnConVarChanged);
348 HookConVarChange(g_cvarRankMode, OnConVarChanged);
349 HookConVarChange(g_cvarMysql, OnConVarChanged_MySQL);
350 HookConVarChange(g_cvarSQLTable, OnConVarChanged_SQLTable);
351 HookConVarChange(g_cvarChatTriggers, OnConVarChanged);
352 HookConVarChange(g_cvarPointsMvpCt, OnConVarChanged);
353 HookConVarChange(g_cvarPointsMvpTr, OnConVarChanged);
354 HookConVarChange(g_cvarPointsBombPickup, OnConVarChanged);
355 HookConVarChange(g_cvarPointsBombDropped, OnConVarChanged);
356
357 /* Assist */
358 HookConVarChange(g_cvarPointsAssistKill,OnConVarChanged);
359
360 /* Enable Or Disable Points In Warmup */
361 HookConVarChange(g_cvarGatherStatsWarmup,OnConVarChanged);
362
363 /* Min points */
364 HookConVarChange(g_cvarPointsMinEnabled, OnConVarChanged);
365 HookConVarChange(g_cvarPointsMin, OnConVarChanged);
366
367 // EVENTS
368 HookEventEx("player_death", EventPlayerDeath);
369 HookEvent("player_spawn", EventPlayerSpawn);
370 HookEventEx("player_hurt", EventPlayerHurt);
371 HookEventEx("weapon_fire", EventWeaponFire);
372 HookEventEx("bomb_planted", Event_BombPlanted);
373 HookEventEx("bomb_defused", Event_BombDefused);
374 HookEventEx("bomb_exploded", Event_BombExploded);
375 HookEventEx("bomb_dropped", Event_BombDropped);
376 HookEventEx("bomb_pickup", Event_BombPickup);
377 HookEventEx("hostage_rescued", Event_HostageRescued);
378 HookEventEx("vip_killed", Event_VipKilled);
379 HookEventEx("vip_escaped", Event_VipEscaped);
380 HookEventEx("round_end", Event_RoundEnd);
381 HookEventEx("round_start", Event_RoundStart);
382 HookEventEx("round_mvp", Event_RoundMVP);
383 HookEventEx("player_changename", OnClientChangeName, EventHookMode_Pre);
384 HookEventEx("player_disconnect", Event_PlayerDisconnect, EventHookMode_Pre);
385 //HookEvent("player_team", Event_PlayerTeam);
386
387 // ADMNIN COMMANDS
388 RegAdminCmd("sm_resetrank", CMD_ResetRank, ADMFLAG_ROOT, "RankMe: Resets the rank of a player");
389 RegAdminCmd("sm_rankme_remove_duplicate", CMD_Duplicate, ADMFLAG_ROOT, "RankMe: Removes the duplicated rows on the database");
390 RegAdminCmd("sm_rankpurge", CMD_Purge, ADMFLAG_ROOT, "RankMe: Purges from the rank players that didn't connected for X days");
391 RegAdminCmd("sm_resetrank_all", CMD_ResetRankAll, ADMFLAG_ROOT, "RankMe: Resets the rank of all players");
392
393 // PLAYER COMMANDS
394 RegConsoleCmd("sm_session", CMD_Session, "RankMe: Shows the stats of your current session");
395 RegConsoleCmd("sm_rank", CMD_Rank, "RankMe: Shows your rank");
396 RegConsoleCmd("sm_top", CMD_Top, "RankMe: Shows the TOP");
397
398 /*
399 RegConsoleCmd("sm_topknife", CMD_TopKnife, "RankMe: Shows the TOP ordered by knife kills");
400 RegConsoleCmd("sm_toptaser", CMD_TopTaser, "RankMe: Shows the TOP ordered by taser kills");
401 RegConsoleCmd("sm_topnade", CMD_TopNade, "RankMe: Shows the TOP ordered by grenade kills");
402 */
403
404 RegConsoleCmd("sm_topweapon", CMD_TopWeapon, "RankMe: Shows the TOP ordered by kills with a specific weapon");
405 RegConsoleCmd("sm_topacc", CMD_TopAcc, "RankMe: Shows the TOP ordered by accuracy");
406 RegConsoleCmd("sm_tophs", CMD_TopHS, "RankMe: Shows the TOP ordered by HeadShots");
407 RegConsoleCmd("sm_toptime", CMD_TopTime, "RankMe: Shows the TOP ordered by Connected Time");
408 RegConsoleCmd("sm_topkills", CMD_TopKills, "RankMe: Shows the TOP ordered by kills");
409 RegConsoleCmd("sm_topdeaths", CMD_TopDeaths, "RankMe: Shows the TOP ordered by deaths");
410 RegConsoleCmd("sm_hitboxme", CMD_HitBox, "RankMe: Shows the HitBox stats");
411 RegConsoleCmd("sm_weaponme", CMD_WeaponMe, "RankMe: Shows the kills with each weapon");
412 RegConsoleCmd("sm_resetmyrank", CMD_ResetOwnRank, "RankMe: Resets your own rank");
413 RegConsoleCmd("sm_statsme", CMD_StatsMe, "RankMe: Shows your stats");
414 RegConsoleCmd("sm_next", CMD_Next, "RankMe: Shows the next 9 players above you on the TOP");
415 RegConsoleCmd("sm_statsme2", CMD_StatsMe2, "RankMe: Shows the stats from a player");
416 RegConsoleCmd("sm_rankme", CMD_RankMe, "RankMe: Shows a menu with the basic commands");
417
418 RegConsoleCmd("sm_topassists", CMD_TopAssists, "RankMe: Shows the TOP ordered by Assists");
419 RegConsoleCmd("sm_toptk", CMD_TopTK, "RankMe: Shows the TOP ordered by TKs");
420 RegConsoleCmd("sm_topmvp", CMD_TopMVP, "RankMe: Shows the TOP ordered by MVPs");
421 RegConsoleCmd("sm_topdamage", CMD_TopDamage, "RankMe: Shows the TOP ordered by damage");
422
423 /*RankMe Connect Announcer*/
424 g_cvarAnnounceConnect = CreateConVar("rankme_announcer_player_connect","1","Announce when a player connect with position and points?",_,true,0.0,true,1.0);
425 g_cvarAnnounceConnectChat = CreateConVar("rankme_announcer_player_connect_chat","1","Announce when a player connect at chat?",_,true,0.0,true,1.0);
426 g_cvarAnnounceConnectHint = CreateConVar("rankme_announcer_player_connect_hint","0","Announce when a player connect at hintbox?",_,true,0.0,true,1.0);
427 g_cvarAnnounceDisconnect = CreateConVar("rankme_announcer_player_disconnect","1","Announce when a player disconnect with position and points?",_,true,0.0,true,1.0);
428 g_cvarAnnounceTopConnect = CreateConVar("rankme_announcer_top_player_connect","1","Announce when a top player connect?",_,true,0.0,true,1.0);
429 g_cvarAnnounceTopPosConnect = CreateConVar("rankme_announcer_top_pos_player_connect","10","Max position to announce that a top player connect?",_,true,0.0);
430 g_cvarAnnounceTopConnectChat = CreateConVar("rankme_announcer_top_player_connect_chat","1","Announce when a top player connect at chat?",_,true,0.0,true,1.0);
431 g_cvarAnnounceTopConnectHint = CreateConVar("rankme_announcer_top_player_connect_hint","0","Announce when a top player connect at hintbox?",_,true,0.0,true,1.0);
432
433 HookConVarChange(g_cvarAnnounceConnect,OnConVarChanged);
434 HookConVarChange(g_cvarAnnounceConnectChat,OnConVarChanged);
435 HookConVarChange(g_cvarAnnounceConnectHint,OnConVarChanged);
436 HookConVarChange(g_cvarAnnounceDisconnect,OnConVarChanged);
437 HookConVarChange(g_cvarAnnounceTopConnect,OnConVarChanged);
438 HookConVarChange(g_cvarAnnounceTopPosConnect,OnConVarChanged);
439 HookConVarChange(g_cvarAnnounceTopConnectChat,OnConVarChanged);
440 HookConVarChange(g_cvarAnnounceTopConnectHint,OnConVarChanged);
441
442 // LOAD RANKME.CFG
443 AutoExecConfig(true, "kento.rankme");
444
445 // LOAD TRANSLATIONS
446 LoadTranslations("kento.rankme.phrases");
447
448 // Hook the say and say_team for chat triggers
449 AddCommandListener(OnSayText, "say");
450 AddCommandListener(OnSayText, "say_team");
451
452 Handle cvarVersion = CreateConVar("rankme_version", PLUGIN_VERSION, "RankMe Version", FCVAR_REPLICATED | FCVAR_NOTIFY | FCVAR_DONTRECORD);
453 // UPDATE THE CVAR IF NEEDED
454 char sVersionOnCvar[10];
455 GetConVarString(cvarVersion, sVersionOnCvar, sizeof(sVersionOnCvar));
456 if (!StrEqual(PLUGIN_VERSION, sVersionOnCvar))
457 SetConVarString(cvarVersion, PLUGIN_VERSION, true, true);
458
459 // Create the forwards
460 g_fwdOnPlayerLoaded = CreateGlobalForward("RankMe_OnPlayerLoaded", ET_Hook, Param_Cell);
461 g_fwdOnPlayerSaved = CreateGlobalForward("RankMe_OnPlayerSaved", ET_Hook, Param_Cell);
462
463 /* Hide chat */
464 RegConsoleCmd("sm_rankmechat", CMD_HideChat, "Disable rankme chat messages");
465 hidechatcookie = RegClientCookie("rankme_hidechat", "Hide rankme chat messages", CookieAccess_Private);
466}
467
468public void OnConVarChanged_SQLTable(Handle convar, const char[] oldValue, const char[] newValue) {
469
470 GetConVarString(g_cvarSQLTable, g_sSQLTable, sizeof(g_sSQLTable));
471 DB_Connect(true); // Force reloading the stats
472}
473
474public void OnConVarChanged_MySQL(Handle convar, const char[] oldValue, const char[] newValue) {
475 DB_Connect(false);
476}
477
478public void DB_Connect(bool firstload) {
479
480 if (g_bMysql != GetConVarBool(g_cvarMysql) || firstload) { // NEEDS TO CONNECT IF CHANGED MYSQL CVAR OR NEVER CONNECTED
481 g_bMysql = GetConVarBool(g_cvarMysql);
482 GetConVarString(g_cvarSQLTable, g_sSQLTable, sizeof(g_sSQLTable));
483 char sError[256];
484 if (g_bMysql) {
485 g_hStatsDb = SQL_Connect("rankme", false, sError, sizeof(sError));
486 } else {
487 g_hStatsDb = SQLite_UseDatabase("rankme", sError, sizeof(sError));
488 }
489 if (g_hStatsDb == INVALID_HANDLE)
490 {
491 SetFailState("[RankMe] Unable to connect to the database (%s)", sError);
492 }
493 SQL_LockDatabase(g_hStatsDb);
494 char sQuery[9999];
495
496 if(g_bMysql)
497 {
498 Format(sQuery, sizeof(sQuery), g_sMysqlCreate, g_sSQLTable);
499 SQL_FastQuery(g_hStatsDb, sQuery);
500 }
501 if(!g_bMysql)
502 {
503 Format(sQuery, sizeof(sQuery), g_sSqliteCreate, g_sSQLTable);
504 SQL_FastQuery(g_hStatsDb, sQuery);
505 }
506
507 Format(sQuery, sizeof(sQuery), "ALTER TABLE `%s` MODIFY id INTEGER AUTO_INCREMENT", g_sSQLTable);
508 SQL_FastQuery(g_hStatsDb, sQuery);
509 Format(sQuery, sizeof(sQuery), "ALTER TABLE `%s` ADD COLUMN vip_killed NUMERIC", g_sSQLTable);
510 SQL_FastQuery(g_hStatsDb, sQuery);
511 Format(sQuery, sizeof(sQuery), "ALTER TABLE `%s` ADD COLUMN vip_escaped NUMERIC", g_sSQLTable);
512 SQL_FastQuery(g_hStatsDb, sQuery);
513 Format(sQuery, sizeof(sQuery), "ALTER TABLE `%s` ADD COLUMN vip_played NUMERIC", g_sSQLTable);
514 SQL_FastQuery(g_hStatsDb, sQuery);
515 SQL_UnlockDatabase(g_hStatsDb);
516
517 for (int i = 1; i <= MaxClients; i++) {
518 if (IsClientInGame(i))
519 OnClientPutInServer(i);
520 }
521 }
522
523}
524public void OnConfigsExecuted() {
525
526 if (g_hStatsDb == INVALID_HANDLE)
527 DB_Connect(true);
528 else
529 DB_Connect(false);
530 int AutoPurge = GetConVarInt(g_cvarAutopurge);
531 char sQuery[1000];
532 if (AutoPurge > 0) {
533 int DeleteBefore = GetTime() - (AutoPurge * 86400);
534 Format(sQuery, sizeof(sQuery), "DELETE FROM `%s` WHERE lastconnect < '%d'", g_sSQLTable, DeleteBefore);
535 SQL_TQuery(g_hStatsDb, SQL_PurgeCallback, sQuery);
536 }
537
538 g_bShowBotsOnRank = GetConVarBool(g_cvarShowBotsOnRank);
539 g_RankBy = GetConVarInt(g_cvarRankBy);
540 g_bEnabled = GetConVarBool(g_cvarEnabled);
541 g_bChatChange = GetConVarBool(g_cvarChatChange);
542 g_bShowRankAll = GetConVarBool(g_cvarShowRankAll);
543 g_bRankBots = GetConVarBool(g_cvarRankbots);
544 g_bFfa = GetConVarBool(g_cvarFfa);
545 g_bDumpDB = GetConVarBool(g_cvarDumpDB);
546 g_PointsBombDefusedTeam = GetConVarInt(g_cvarPointsBombDefusedTeam);
547 g_PointsBombDefusedPlayer = GetConVarInt(g_cvarPointsBombDefusedPlayer);
548 g_PointsBombPlantedTeam = GetConVarInt(g_cvarPointsBombPlantedTeam);
549 g_PointsBombPlantedPlayer = GetConVarInt(g_cvarPointsBombPlantedPlayer);
550 g_PointsBombExplodeTeam = GetConVarInt(g_cvarPointsBombExplodeTeam);
551 g_PointsBombExplodePlayer = GetConVarInt(g_cvarPointsBombExplodePlayer);
552 g_PointsHostageRescTeam = GetConVarInt(g_cvarPointsHostageRescTeam);
553 g_PointsHostageRescPlayer = GetConVarInt(g_cvarPointsHostageRescPlayer);
554 g_PointsHs = GetConVarInt(g_cvarPointsHs);
555 g_PointsKill[CT] = GetConVarInt(g_cvarPointsKillCt);
556 g_PointsKill[TR] = GetConVarInt(g_cvarPointsKillTr);
557 g_PointsKillBonus[CT] = GetConVarInt(g_cvarPointsKillBonusCt);
558 g_PointsKillBonus[TR] = GetConVarInt(g_cvarPointsKillBonusTr);
559 g_PointsKillBonusDif[CT] = GetConVarInt(g_cvarPointsKillBonusDifCt);
560 g_PointsKillBonusDif[TR] = GetConVarInt(g_cvarPointsKillBonusDifTr);
561 g_PointsStart = GetConVarInt(g_cvarPointsStart);
562 g_fPointsKnifeMultiplier = GetConVarFloat(g_cvarPointsKnifeMultiplier);
563 g_fPointsTaserMultiplier = GetConVarFloat(g_cvarPointsTaserMultiplier);
564 g_PointsRoundWin[TR] = GetConVarInt(g_cvarPointsTrRoundWin);
565 g_PointsRoundWin[CT] = GetConVarInt(g_cvarPointsCtRoundWin);
566 g_MinimalKills = GetConVarInt(g_cvarMinimalKills);
567 g_fPercentPointsLose = GetConVarFloat(g_cvarPercentPointsLose);
568 g_bPointsLoseRoundCeil = GetConVarBool(g_cvarPointsLoseRoundCeil);
569 g_MinimumPlayers = GetConVarInt(g_cvarMinimumPlayers);
570 g_bResetOwnRank = GetConVarBool(g_cvarResetOwnRank);
571 g_PointsVipEscapedTeam = GetConVarInt(g_cvarPointsVipEscapedTeam);
572 g_PointsVipEscapedPlayer = GetConVarInt(g_cvarPointsVipEscapedPlayer);
573 g_PointsVipKilledTeam = GetConVarInt(g_cvarPointsVipKilledTeam);
574 g_PointsVipKilledPlayer = GetConVarInt(g_cvarPointsVipKilledPlayer);
575 g_bVipEnabled = GetConVarBool(g_cvarVipEnabled);
576 g_PointsLoseTk = GetConVarInt(g_cvarPointsLoseTk);
577 g_PointsLoseSuicide = GetConVarInt(g_cvarPointsLoseSuicide);
578 g_DaysToNotShowOnRank = GetConVarInt(g_cvarDaysToNotShowOnRank);
579 g_bGatherStats = GetConVarBool(g_cvarGatherStats);
580 g_RankMode = GetConVarInt(g_cvarRankMode);
581 g_bChatTriggers = GetConVarBool(g_cvarChatTriggers);
582 g_PointsMvpCt = GetConVarInt(g_cvarPointsMvpCt);
583 g_PointsMvpTr = GetConVarInt(g_cvarPointsMvpTr);
584 g_PointsBombDropped = GetConVarInt(g_cvarPointsBombDropped);
585 g_PointsBombPickup = GetConVarInt(g_cvarPointsBombPickup);
586
587 /* Assist */
588 g_PointsAssistKill = GetConVarInt(g_cvarPointsAssistKill);
589
590 /* Enable Or Disable Points In Warmup */
591 g_bGatherStatsWarmup = GetConVarBool(g_cvarGatherStatsWarmup);
592
593 /* Min points */
594 g_PointsMin = GetConVarInt(g_cvarPointsMin);
595 g_bPointsMinEnabled = GetConVarBool(g_cvarPointsMin);
596
597 /*RankMe Connect Announcer*/
598 g_bAnnounceConnect = GetConVarBool(g_cvarAnnounceConnect);
599 g_bAnnounceConnectChat = GetConVarBool(g_cvarAnnounceConnectChat);
600 g_bAnnounceConnectHint = GetConVarBool(g_cvarAnnounceConnectHint);
601 g_bAnnounceDisconnect = GetConVarBool(g_cvarAnnounceDisconnect);
602 g_bAnnounceTopConnect = GetConVarBool(g_cvarAnnounceTopConnect);
603 g_AnnounceTopPosConnect = GetConVarInt(g_cvarAnnounceTopPosConnect);
604 g_bAnnounceTopConnectChat = GetConVarBool(g_cvarAnnounceTopConnectChat);
605 g_bAnnounceTopConnectHint = GetConVarBool(g_cvarAnnounceTopConnectHint);
606
607 if (g_bRankBots)
608 Format(sQuery, sizeof(sQuery), "SELECT * FROM `%s` WHERE kills >= '%d'", g_sSQLTable, g_MinimalKills);
609 else
610 Format(sQuery, sizeof(sQuery), "SELECT * FROM `%s` WHERE kills >= '%d' AND steam <> 'BOT'", g_sSQLTable, g_MinimalKills);
611
612 SQL_TQuery(g_hStatsDb, SQL_GetPlayersCallback, sQuery);
613
614 BuildRankCache();
615}
616void BuildRankCache()
617{
618 if(!g_bRankCache)
619 return;
620
621 ClearArray(g_arrayRankCache[0]);
622 ClearArray(g_arrayRankCache[1]);
623 ClearArray(g_arrayRankCache[2]);
624
625 PushArrayString(g_arrayRankCache[0], "Rank By SteamId: This is First Line in Array");
626 PushArrayString(g_arrayRankCache[1], "Rank By Name: This is First Line in Array");
627 PushArrayString(g_arrayRankCache[2], "Rank By IP: This is First Line in Array");
628
629 char query[1000];
630 MakeSelectQuery(query, sizeof(query));
631
632 if (g_RankMode == 1)
633 Format(query, sizeof(query), "%s ORDER BY score DESC", query);
634 else if(g_RankMode == 2)
635 Format(query, sizeof(query), "%s ORDER BY CAST(CAST(kills as float)/CAST (deaths as float) as float) DESC", query);
636
637 SQL_TQuery(g_hStatsDb, SQL_BuildRankCache, query);
638}
639public void SQL_BuildRankCache(Handle owner, Handle hndl, const char[] error, any unuse)
640{
641 if (hndl == INVALID_HANDLE)
642 {
643 LogError("[RankMe] : build rank cache failed", error);
644 return;
645 }
646
647 if(SQL_GetRowCount(hndl))
648 {
649 char steamid[32];
650 char name[128];
651 char ip[32];
652 while(SQL_FetchRow(hndl))
653 {
654 SQL_FetchString(hndl, 1, steamid, 32);
655 SQL_FetchString(hndl, 2, name, 128);
656 SQL_FetchString(hndl, 3, ip, 32);
657 PushArrayString(g_arrayRankCache[0], steamid);
658 PushArrayString(g_arrayRankCache[1], name);
659 PushArrayString(g_arrayRankCache[2], ip);
660 }
661 }
662 else
663 LogMessage("[RankMe] : No mork rank");
664}
665public Action CMD_Duplicate(int client, int args) {
666 char sQuery[400];
667
668 if (g_bMysql) {
669
670 if (g_RankBy == 0)
671 FormatEx(sQuery, sizeof(sQuery), g_sSqlRemoveDuplicateMySQL, g_sSQLTable, g_sSQLTable, g_sSQLTable, g_sSQLTable, g_sSQLTable);
672
673 else if (g_RankBy == 1)
674 FormatEx(sQuery, sizeof(sQuery), g_sSqlRemoveDuplicateNameMySQL, g_sSQLTable, g_sSQLTable, g_sSQLTable, g_sSQLTable, g_sSQLTable);
675
676 else if (g_RankBy == 2)
677 FormatEx(sQuery, sizeof(sQuery), g_sSqlRemoveDuplicateIpMySQL, g_sSQLTable, g_sSQLTable, g_sSQLTable, g_sSQLTable, g_sSQLTable);
678
679 } else {
680
681 if (g_RankBy == 0)
682 FormatEx(sQuery, sizeof(sQuery), g_sSqlRemoveDuplicateSQLite, g_sSQLTable, g_sSQLTable, g_sSQLTable, g_sSQLTable);
683
684 else if (g_RankBy == 1)
685 FormatEx(sQuery, sizeof(sQuery), g_sSqlRemoveDuplicateNameSQLite, g_sSQLTable, g_sSQLTable, g_sSQLTable, g_sSQLTable);
686
687 else if (g_RankBy == 2)
688 FormatEx(sQuery, sizeof(sQuery), g_sSqlRemoveDuplicateIpSQLite, g_sSQLTable, g_sSQLTable, g_sSQLTable, g_sSQLTable);
689
690 }
691
692 SQL_TQuery(g_hStatsDb, SQL_DuplicateCallback, sQuery, client);
693
694 return Plugin_Handled;
695}
696
697public void SQL_DuplicateCallback(Handle owner, Handle hndl, const char[] error, any client)
698{
699 if (hndl == INVALID_HANDLE)
700 {
701 LogError("[RankMe] Query Fail: %s", error);
702 return;
703 }
704
705 PrintToServer("[RankMe]: %d duplicated rows removed", SQL_GetAffectedRows(owner));
706 if (client != 0) {
707 PrintToChat(client, "[RankMe]: %d duplicated rows removed", SQL_GetAffectedRows(owner));
708 }
709 //LogAction(-1,-1,"[RankMe]: %d players purged by inactivity",SQL_GetAffectedRows(owner));
710
711}
712
713public APLRes AskPluginLoad2(Handle myself, bool late, char[] error, int err_max)
714{
715 CreateNative("RankMe_GivePoint", Native_GivePoint);
716 CreateNative("RankMe_GetRank", Native_GetRank);
717 CreateNative("RankMe_GetPoints", Native_GetPoints);
718 CreateNative("RankMe_GetStats", Native_GetStats);
719 CreateNative("RankMe_GetSession", Native_GetSession);
720 CreateNative("RankMe_GetWeaponStats", Native_GetWeaponStats);
721 CreateNative("RankMe_GetHitbox", Native_GetHitbox);
722
723 RegPluginLibrary("rankme");
724
725 return APLRes_Success;
726}
727public int Native_GivePoint(Handle plugin, int numParams)
728{
729 int iClient = GetNativeCell(1);
730 int iPoints = GetNativeCell(2);
731
732 int len;
733 GetNativeStringLength(3, len);
734
735 if (len <= 0)
736 {
737 return;
738 }
739
740
741 char[] Reason = new char[len + 1];
742 char Name[MAX_NAME_LENGTH];
743 GetNativeString(3, Reason, len + 1);
744 int iPrintToPlayer = GetNativeCell(4);
745 int iPrintToAll = GetNativeCell(5);
746 g_aStats[iClient][SCORE] += iPoints;
747 g_aSession[iClient][SCORE] += iPoints;
748 GetClientName(iClient, Name, sizeof(Name));
749 if (!g_bChatChange)
750 return;
751 if (iPrintToAll == 1) {
752 for (int i = 1; i <= MaxClients; i++)
753 if (IsClientInGame(i))
754 //CPrintToChatEx(i,i,"%s %t",MSG,"GotPointsBy",Name,g_aStats[iClient][SCORE],iPoints,Reason);
755 if(!hidechat[i]) CPrintToChat(i, "%s %t", MSG, "GotPointsBy", Name, g_aStats[iClient][SCORE], iPoints, Reason);
756 } else if (iPrintToPlayer == 1) {
757 //CPrintToChatEx(iClient,iClient,"%s %t",MSG,"GotPointsBy",Name,g_aStats[iClient][SCORE],iPoints,Reason);
758 if(!hidechat[iClient]) CPrintToChat(iClient, "%s %t", MSG, "GotPointsBy", Name, g_aStats[iClient][SCORE], iPoints, Reason);
759 }
760}
761
762public int Native_GetRank(Handle plugin, int numParams)
763{
764 int client = GetNativeCell(1);
765 Function callback = GetNativeCell(2);
766 any data = GetNativeCell(3);
767
768 Handle pack = CreateDataPack();
769
770 WritePackCell(pack, client);
771 WritePackFunction(pack, callback);
772 WritePackCell(pack, data);
773 WritePackCell(pack, _:plugin);
774
775 if(g_bRankCache)
776 {
777 GetClientRank(pack);
778 return;
779 }
780
781 char query[10000];
782 MakeSelectQuery(query, sizeof(query));
783
784 if (g_RankMode == 1)
785 Format(query, sizeof(query), "%s ORDER BY score DESC", query);
786 else if (g_RankMode == 2)
787 Format(query, sizeof(query), "%s ORDER BY CAST(CAST(kills as float)/CAST (deaths as float) as float) DESC", query);
788
789 SQL_TQuery(g_hStatsDb, SQL_GetRankCallback, query, pack);
790}
791
792void GetClientRank(Handle pack)
793{
794 ResetPack(pack);
795 int client = ReadPackCell(pack);
796 Handle callback = ReadPackFunction(pack);
797 any args = ReadPackCell(pack);
798 Handle plugin = ReadPackCell(pack);
799 CloseHandle(pack);
800
801 int rank;
802 switch(g_RankBy)
803 {
804 case 0:
805 {
806 char steamid[32];
807 GetClientAuthId(client, AuthId_Steam2, steamid, 32, true);
808 rank = FindStringInArray(g_arrayRankCache[0], steamid);
809 }
810 case 1:
811 {
812 char name[128];
813 GetClientName(client, name, 128);
814 rank = FindStringInArray(g_arrayRankCache[1], name);
815 }
816 case 2:
817 {
818 char ip[128];
819 GetClientIP(client, ip, 128);
820 rank = FindStringInArray(g_arrayRankCache[2], ip);
821 }
822 }
823
824 if(rank > 0)
825 CallRankCallback(client, rank, callback, args, plugin);
826 else
827 CallRankCallback(client, 0, callback, args, plugin);
828}
829
830public void SQL_GetRankCallback(Handle owner, Handle hndl, const char[] error, any data)
831{
832 Handle pack = data;
833 ResetPack(pack);
834 int client = ReadPackCell(pack);
835 Handle callback = ReadPackFunction(pack);
836 any args = ReadPackCell(pack);
837 Handle plugin = ReadPackCell(pack);
838 CloseHandle(pack);
839
840 if (hndl == INVALID_HANDLE)
841 {
842 LogError("[RankMe] Query Fail: %s", error);
843 CallRankCallback(0, 0, Function callback, 0, plugin);
844 return;
845 }
846 int i;
847 g_TotalPlayers = SQL_GetRowCount(hndl);
848
849 char Receive[64];
850
851 while (SQL_HasResultSet(hndl) && SQL_FetchRow(hndl))
852 {
853 i++;
854
855 if (g_RankBy == 0) {
856 SQL_FetchString(hndl, 1, Receive, sizeof(Receive));
857 if (StrEqual(Receive, g_aClientSteam[client], false))
858 {
859 CallRankCallback(client, i, callback, args, plugin);
860 break;
861 }
862 } else if (g_RankBy == 1) {
863 SQL_FetchString(hndl, 2, Receive, sizeof(Receive));
864 if (StrEqual(Receive, g_aClientName[client], false))
865 {
866 CallRankCallback(client, i, callback, args, plugin);
867 break;
868 }
869 } else if (g_RankBy == 2) {
870 SQL_FetchString(hndl, 3, Receive, sizeof(Receive));
871 if (StrEqual(Receive, g_aClientIp[client], false))
872 {
873 CallRankCallback(client, i, callback, args, plugin);
874 break;
875 }
876 }
877 }
878}
879
880void CallRankCallback(int client, int rank, Handle callback, any data, Handle plugin)
881{
882 Call_StartFunction(plugin, callback);
883 Call_PushCell(client);
884 Call_PushCell(rank);
885 Call_PushCell(data);
886 Call_Finish();
887 CloseHandle(plugin);
888}
889
890public int Native_GetPoints(Handle plugin, int numParams)
891{
892 int Client = GetNativeCell(1);
893 return g_aStats[Client][SCORE];
894}
895
896public int Native_GetStats(Handle plugin, int numParams)
897{
898 int iClient = GetNativeCell(1);
899 int array[20];
900 for (int i = 0; i < 20; i++)
901 array[i] = g_aStats[iClient][i];
902
903 SetNativeArray(2, array, 20);
904}
905
906public int Native_GetSession(Handle plugin, int numParams)
907{
908 int iClient = GetNativeCell(1);
909 int array[20];
910 for (int i = 0; i < 20; i++)
911 array[i] = g_aSession[iClient][i];
912
913 SetNativeArray(2, array, 20);
914}
915
916public int Native_GetWeaponStats(Handle plugin, int numParams)
917{
918 int iClient = GetNativeCell(1);
919 int array[40];
920 for (int i = 0; i < 40; i++)
921 array[i] = g_aWeapons[iClient][i];
922
923 SetNativeArray(2, array, 40);
924}
925
926public int Native_GetHitbox(Handle plugin, int numParams)
927{
928 int iClient = GetNativeCell(1);
929 int array[8];
930 for (int i = 0; i < 8; i++)
931 array[i] = g_aHitBox[iClient][i];
932
933 SetNativeArray(2, array, 8);
934}
935
936public void DumpDB() {
937 if (!g_bDumpDB || g_bMysql)
938 return;
939 char sQuery[1000];
940 FormatEx(sQuery, sizeof(sQuery), "SELECT * from `%s`", g_sSQLTable);
941 SQL_TQuery(g_hStatsDb, SQL_DumpCallback, sQuery);
942}
943
944public Action OnClientChangeName(Handle event, const char[] name, bool dontBroadcast)
945{
946 if (!g_bEnabled)
947 return Plugin_Continue;
948 int client = GetClientOfUserId(GetEventInt(event, "userid"));
949 if (!g_bRankBots && (!IsValidClient(client) || IsFakeClient(client)))
950 return Plugin_Continue;
951 if (IsClientConnected(client))
952 {
953 char clientnewname[MAX_NAME_LENGTH];
954 GetEventString(event, "newname", clientnewname, sizeof(clientnewname));
955 if (client == g_C4PlantedBy)
956 strcopy(g_sC4PlantedByName, sizeof(g_sC4PlantedByName), clientnewname);
957 char Eclientnewname[MAX_NAME_LENGTH * 2 + 1];
958 SQL_EscapeString(g_hStatsDb, clientnewname, Eclientnewname, sizeof(Eclientnewname));
959
960 //ReplaceString(clientnewname, sizeof(clientnewname), "'", "");
961 char query[10000];
962 if (g_RankBy == 1) {
963 OnDB[client] = false;
964 for (int i = 0; i <= 19; i++) {
965 g_aSession[client][i] = 0;
966 g_aStats[client][i] = 0;
967 }
968 g_aStats[client][SCORE] = g_PointsStart;
969 for (int i = 0; i <= 39; i++) {
970 g_aWeapons[client][i] = 0;
971 }
972 g_aSession[client][CONNECTED] = GetTime();
973
974 strcopy(g_aClientName[client], MAX_NAME_LENGTH, clientnewname);
975
976 Format(query, sizeof(query), g_sSqlRetrieveClientName, g_sSQLTable, Eclientnewname);
977 if (DEBUGGING) {
978 PrintToServer(query);
979 LogError("%s", query);
980 }
981 SQL_TQuery(g_hStatsDb, SQL_LoadPlayerCallback, query, client);
982
983 } else {
984
985 if (g_RankBy == 0)
986 Format(query, sizeof(query), "UPDATE `%s` SET name='%s' WHERE steam = '%s';", g_sSQLTable, Eclientnewname, g_aClientSteam[client]);
987 else
988 Format(query, sizeof(query), "UPDATE `%s` SET name='%s' WHERE lastip = '%s';", g_sSQLTable, Eclientnewname, g_aClientIp[client]);
989
990 SQL_TQuery(g_hStatsDb, SQL_NothingCallback, query);
991 }
992 }
993 return Plugin_Continue;
994}
995
996// Code made by Antithasys
997public Action OnSayText(int client, const char[] command, int argc)
998{
999 if (!g_bEnabled || !g_bChatTriggers || client == SENDER_WORLD || IsChatTrigger())
1000 { // Don't parse if plugin is disabled or if is from the console or a chat trigger (e.g: ! or /)
1001 return Plugin_Continue;
1002 }
1003
1004 char cpMessage[256];
1005 char sWords[64][256];
1006 GetCmdArgString(cpMessage, sizeof(cpMessage)); // Get the message
1007 StripQuotes(cpMessage); // Text come inside quotes
1008 //ReplaceString(cpMessage,sizeof(cpMessage),"\"","");
1009 ExplodeString(cpMessage, " ", sWords, sizeof(sWords), sizeof(sWords[])); // Explode it for use at top, topknife, topnade and topweapon
1010
1011 // Proccess the text
1012 if (StrEqual(cpMessage, "rank", false))
1013 {
1014 //LogToFile("rankme.debug.log","\"rank\" chat hook called by client %d.",client);
1015 CMD_Rank(client, 0);
1016 }
1017 else if (StrEqual(cpMessage, "statsme", false))
1018 {
1019 CMD_StatsMe(client, 0);
1020 }
1021 else if (StrEqual(cpMessage, "hitboxme", false))
1022 {
1023 CMD_HitBox(client, 0);
1024 }
1025 else if (StrEqual(cpMessage, "weaponme", false))
1026 {
1027 CMD_WeaponMe(client, 0);
1028 }
1029 else if (StrEqual(cpMessage, "session", false))
1030 {
1031 CMD_Session(client, 0);
1032 }
1033 else if (StrEqual(cpMessage[0], "next", false))
1034 {
1035 CMD_Next(client, 0);
1036 }
1037 else if (StrContains(sWords[0], "toptk", false) == 0)
1038 {
1039 CMD_TopTK(client, 0);
1040 }
1041 else if (StrContains(sWords[0], "topmvp", false) == 0)
1042 {
1043 CMD_TopMVP(client, 0);
1044 }
1045 else if (StrContains(sWords[0], "topdamage", false) == 0)
1046 {
1047 CMD_TopDamage(client, 0);
1048 }
1049
1050 /*
1051 else if (StrContains(sWords[0], "topknife", false) == 0)
1052 {
1053 if (strcmp(cpMessage, "topknife") == 0)
1054 {
1055 ShowTOPKnife(client, 0);
1056 }
1057 else
1058 {
1059 ShowTOPKnife(client, StringToInt(cpMessage[8]));
1060 }
1061 }
1062 else if (StrContains(sWords[0], "toptaser", false) == 0)
1063 {
1064 if (strcmp(cpMessage, "toptaser") == 0)
1065 {
1066 ShowTOPTaser(client, 0);
1067 }
1068 else
1069 {
1070 ShowTOPTaser(client, StringToInt(cpMessage[8]));
1071 }
1072 }
1073 else if (StrContains(sWords[0], "topnade", false) == 0)
1074 {
1075 if (strcmp(cpMessage, "topnade") == 0)
1076 {
1077 ShowTOPNade(client, 0);
1078 }
1079 else
1080 {
1081 ShowTOPNade(client, StringToInt(cpMessage[7]));
1082 }
1083 }
1084 */
1085
1086 else if (StrContains(sWords[0], "tophs", false) == 0)
1087 {
1088 if (strcmp(cpMessage, "tophs") == 0)
1089 {
1090 ShowTopHS(client, 0);
1091 }
1092 else
1093 {
1094 ShowTopHS(client, StringToInt(cpMessage[7]));
1095 }
1096 }
1097 else if (StrContains(sWords[0], "topkills", false) == 0)
1098 {
1099 if (strcmp(cpMessage, "topkills") == 0)
1100 {
1101 ShowTopKills(client, 0);
1102 }
1103 else
1104 {
1105 ShowTopKills(client, StringToInt(cpMessage[7]));
1106 }
1107 }
1108 else if (StrContains(sWords[0], "topdeaths", false) == 0)
1109 {
1110 if (strcmp(cpMessage, "topdeaths") == 0)
1111 {
1112 ShowTopDeaths(client, 0);
1113 }
1114 else
1115 {
1116 ShowTopDeaths(client, StringToInt(cpMessage[7]));
1117 }
1118 }
1119 else if (StrContains(sWords[0], "topassists", false) == 0)
1120 {
1121 if (strcmp(cpMessage, "topassists") == 0)
1122 {
1123 ShowTopAssists(client, 0);
1124 }
1125 else
1126 {
1127 ShowTopAssists(client, StringToInt(cpMessage[7]));
1128 }
1129 }
1130 else if (StrContains(sWords[0], "topacc", false) == 0)
1131 {
1132 if (strcmp(cpMessage, "topacc") == 0)
1133 {
1134 ShowTopAcc(client, 0);
1135 }
1136 else
1137 {
1138 ShowTopAcc(client, StringToInt(cpMessage[7]));
1139 }
1140 }
1141 else if (StrContains(sWords[0], "toptime", false) == 0)
1142 {
1143 if (strcmp(cpMessage, "toptime") == 0)
1144 {
1145 ShowTopTime(client, 0);
1146 }
1147 else
1148 {
1149 ShowTopTime(client, StringToInt(cpMessage[7]));
1150 }
1151 }
1152 else if (StrContains(sWords[0], "topweapon", false) == 0)
1153 {
1154 if (strcmp(cpMessage, "topweapon") == 0)
1155 {
1156 CMD_TopWeapon(client, 0); // Build the menu on the next frame
1157 }
1158 else
1159 {
1160 if (GetWeaponNum(sWords[1]) == 30)
1161 {
1162 CMD_TopWeapon(client, 0);
1163 }
1164 else
1165 {
1166 ShowTOPWeapon(client, GetWeaponNum(sWords[1]), StringToInt(sWords[2]));
1167 }
1168 }
1169 }
1170 else if (StrContains(sWords[0], "top", false) == 0)
1171 {
1172 if (strcmp(cpMessage, "top") == 0)
1173 {
1174 ShowTOP(client, 0);
1175 }
1176 else
1177 {
1178 ShowTOP(client, StringToInt(cpMessage[3]));
1179 }
1180 }
1181 return Plugin_Continue;
1182}
1183
1184public void GetCurrentPlayers() {
1185 int count;
1186 for (int i = 1; i <= MaxClients; i++) {
1187 if (IsClientInGame(i) && (!IsFakeClient(i) || g_bRankBots)) {
1188 count++;
1189 }
1190 }
1191 return count;
1192}
1193
1194public void OnPluginEnd() {
1195 if (!g_bEnabled)
1196 return;
1197 SQL_LockDatabase(g_hStatsDb);
1198 for (int client = 1; client <= MaxClients; client++) {
1199 if (IsClientInGame(client)) {
1200 if (!g_bRankBots && (!IsValidClient(client) || IsFakeClient(client)))
1201 return;
1202 char name[MAX_NAME_LENGTH];
1203 GetClientName(client, name, sizeof(name));
1204 char sEscapeName[MAX_NAME_LENGTH * 2 + 1];
1205 SQL_EscapeString(g_hStatsDb, name, sEscapeName, sizeof(sEscapeName));
1206
1207 // Make SQL-safe
1208 //ReplaceString(name, sizeof(name), "'", "");
1209
1210
1211 char weapons_query[1000] = "";
1212 for (int i = 0; i <= 39; i++) {
1213 Format(weapons_query, sizeof(weapons_query), "%s,%s='%d'", weapons_query, g_sWeaponsNamesGame[i], g_aWeapons[client][i]);
1214 }
1215
1216 // Old query
1217 /*
1218 new String:query[2000];
1219 if (g_RankBy == 1) {
1220 Format(query, sizeof(query), g_sSqlSaveName, g_sSQLTable, g_aStats[client][SCORE], g_aStats[client][KILLS], g_aStats[client][DEATHS], g_aStats[client][ASSISTS], g_aStats[client][SUICIDES], g_aStats[client][TK],
1221 g_aStats[client][SHOTS], g_aStats[client][HITS], g_aStats[client][HEADSHOTS], g_aStats[client][ROUNDS_TR], g_aStats[client][ROUNDS_CT], g_aClientIp[client], sEscapeName, weapons_query,
1222 g_aHitBox[client][1], g_aHitBox[client][2], g_aHitBox[client][3], g_aHitBox[client][4], g_aHitBox[client][5], g_aHitBox[client][6], g_aHitBox[client][7], g_aStats[client][C4_PLANTED], g_aStats[client][C4_EXPLODED], g_aStats[client][C4_DEFUSED], g_aStats[client][CT_WIN], g_aStats[client][TR_WIN], g_aStats[client][HOSTAGES_RESCUED], g_aStats[client][VIP_KILLED], g_aStats[client][VIP_ESCAPED], g_aStats[client][VIP_PLAYED], g_aStats[client][MVP], g_aStats[client][DAMAGE], GetTime(), g_aStats[client][CONNECTED] + GetTime() - g_aSession[client][CONNECTED], sEscapeName);
1223 } else if (g_RankBy == 0) {
1224 Format(query, sizeof(query), g_sSqlSave, g_sSQLTable, g_aStats[client][SCORE], g_aStats[client][KILLS], g_aStats[client][DEATHS], g_aStats[client][ASSISTS], g_aStats[client][SUICIDES], g_aStats[client][TK],
1225 g_aStats[client][SHOTS], g_aStats[client][HITS], g_aStats[client][HEADSHOTS], g_aStats[client][ROUNDS_TR], g_aStats[client][ROUNDS_CT], g_aClientIp[client], sEscapeName, weapons_query,
1226 g_aHitBox[client][1], g_aHitBox[client][2], g_aHitBox[client][3], g_aHitBox[client][4], g_aHitBox[client][5], g_aHitBox[client][6], g_aHitBox[client][7], g_aStats[client][C4_PLANTED], g_aStats[client][C4_EXPLODED], g_aStats[client][C4_DEFUSED], g_aStats[client][CT_WIN], g_aStats[client][TR_WIN], g_aStats[client][HOSTAGES_RESCUED], g_aStats[client][VIP_KILLED], g_aStats[client][VIP_ESCAPED], g_aStats[client][VIP_PLAYED], g_aStats[client][MVP], g_aStats[client][DAMAGE], GetTime(), g_aStats[client][CONNECTED] + GetTime() - g_aSession[client][CONNECTED], g_aClientSteam[client]);
1227 } else if (g_RankBy == 2) {
1228 Format(query, sizeof(query), g_sSqlSaveIp, g_sSQLTable, g_aStats[client][SCORE], g_aStats[client][KILLS], g_aStats[client][DEATHS], g_aStats[client][ASSISTS], g_aStats[client][SUICIDES], g_aStats[client][TK],
1229 g_aStats[client][SHOTS], g_aStats[client][HITS], g_aStats[client][HEADSHOTS], g_aStats[client][ROUNDS_TR], g_aStats[client][ROUNDS_CT], g_aClientIp[client], sEscapeName, weapons_query,
1230 g_aHitBox[client][1], g_aHitBox[client][2], g_aHitBox[client][3], g_aHitBox[client][4], g_aHitBox[client][5], g_aHitBox[client][6], g_aHitBox[client][7], g_aStats[client][C4_PLANTED], g_aStats[client][C4_EXPLODED], g_aStats[client][C4_DEFUSED], g_aStats[client][CT_WIN], g_aStats[client][TR_WIN], g_aStats[client][HOSTAGES_RESCUED], g_aStats[client][VIP_KILLED], g_aStats[client][VIP_ESCAPED], g_aStats[client][VIP_PLAYED], g_aStats[client][MVP], g_aStats[client][DAMAGE], GetTime(), g_aStats[client][CONNECTED] + GetTime() - g_aSession[client][CONNECTED], g_aClientIp[client]);
1231 }
1232 */
1233
1234 /* SM1.9 Fix */
1235 char query[2000];
1236 char query2[2000];
1237
1238 if (g_RankBy == 0)
1239 {
1240 Format(query, sizeof(query), g_sSqlSave, g_sSQLTable, g_aStats[client][SCORE], g_aStats[client][KILLS], g_aStats[client][DEATHS], g_aStats[client][ASSISTS], g_aStats[client][SUICIDES], g_aStats[client][TK],
1241 g_aStats[client][SHOTS], g_aStats[client][HITS], g_aStats[client][HEADSHOTS], g_aStats[client][ROUNDS_TR], g_aStats[client][ROUNDS_CT], g_aClientIp[client], sEscapeName, weapons_query,
1242 g_aHitBox[client][1], g_aHitBox[client][2], g_aHitBox[client][3], g_aHitBox[client][4], g_aHitBox[client][5], g_aHitBox[client][6], g_aHitBox[client][7], g_aClientSteam[client]);
1243
1244 Format(query2, sizeof(query2), g_sSqlSave2, g_sSQLTable, g_aStats[client][C4_PLANTED], g_aStats[client][C4_EXPLODED], g_aStats[client][C4_DEFUSED], g_aStats[client][CT_WIN], g_aStats[client][TR_WIN],
1245 g_aStats[client][HOSTAGES_RESCUED], g_aStats[client][VIP_KILLED], g_aStats[client][VIP_ESCAPED], g_aStats[client][VIP_PLAYED], g_aStats[client][MVP], g_aStats[client][DAMAGE], GetTime(), g_aStats[client][CONNECTED] + GetTime() - g_aSession[client][CONNECTED], g_aClientSteam[client]);
1246 }
1247
1248 else if (g_RankBy == 1)
1249 {
1250 Format(query, sizeof(query), g_sSqlSaveName, g_sSQLTable, g_aStats[client][SCORE], g_aStats[client][KILLS], g_aStats[client][DEATHS], g_aStats[client][ASSISTS], g_aStats[client][SUICIDES], g_aStats[client][TK],
1251 g_aStats[client][SHOTS], g_aStats[client][HITS], g_aStats[client][HEADSHOTS], g_aStats[client][ROUNDS_TR], g_aStats[client][ROUNDS_CT], g_aClientIp[client], sEscapeName, weapons_query,
1252 g_aHitBox[client][1], g_aHitBox[client][2], g_aHitBox[client][3], g_aHitBox[client][4], g_aHitBox[client][5], g_aHitBox[client][6], g_aHitBox[client][7], sEscapeName);
1253
1254 Format(query2, sizeof(query2), g_sSqlSaveName2, g_sSQLTable, g_aStats[client][C4_PLANTED], g_aStats[client][C4_EXPLODED], g_aStats[client][C4_DEFUSED], g_aStats[client][CT_WIN], g_aStats[client][TR_WIN],
1255 g_aStats[client][HOSTAGES_RESCUED], g_aStats[client][VIP_KILLED], g_aStats[client][VIP_ESCAPED], g_aStats[client][VIP_PLAYED], g_aStats[client][MVP], g_aStats[client][DAMAGE], GetTime(), g_aStats[client][CONNECTED] + GetTime() - g_aSession[client][CONNECTED], sEscapeName);
1256 }
1257
1258 else if (g_RankBy == 2)
1259 {
1260 Format(query, sizeof(query), g_sSqlSaveIp, g_sSQLTable, g_aStats[client][SCORE], g_aStats[client][KILLS], g_aStats[client][DEATHS], g_aStats[client][ASSISTS], g_aStats[client][SUICIDES], g_aStats[client][TK],
1261 g_aStats[client][SHOTS], g_aStats[client][HITS], g_aStats[client][HEADSHOTS], g_aStats[client][ROUNDS_TR], g_aStats[client][ROUNDS_CT], g_aClientIp[client], sEscapeName, weapons_query,
1262 g_aHitBox[client][1], g_aHitBox[client][2], g_aHitBox[client][3], g_aHitBox[client][4], g_aHitBox[client][5], g_aHitBox[client][6], g_aHitBox[client][7], g_aClientIp[client]);
1263
1264 Format(query2, sizeof(query2), g_sSqlSaveIp2, g_aStats[client][C4_PLANTED], g_aStats[client][C4_EXPLODED], g_aStats[client][C4_DEFUSED], g_aStats[client][CT_WIN], g_aStats[client][TR_WIN],
1265 g_aStats[client][HOSTAGES_RESCUED], g_aStats[client][VIP_KILLED], g_aStats[client][VIP_ESCAPED], g_aStats[client][VIP_PLAYED], g_aStats[client][MVP], g_aStats[client][DAMAGE], GetTime(), g_aStats[client][CONNECTED] + GetTime() - g_aSession[client][CONNECTED], g_aClientIp[client]);
1266 }
1267
1268 SQL_FastQuery(g_hStatsDb, query);
1269 SQL_FastQuery(g_hStatsDb, query2);
1270
1271 /**
1272 Start the forward OnPlayerSaved
1273 */
1274 Action fResult;
1275 Call_StartForward(g_fwdOnPlayerSaved);
1276 Call_PushCell(client);
1277 int fError = Call_Finish(fResult);
1278
1279 if (fError != SP_ERROR_NONE)
1280 {
1281 ThrowNativeError(fError, "Forward failed");
1282 }
1283 }
1284 }
1285 SQL_UnlockDatabase(g_hStatsDb);
1286}
1287
1288public int GetWeaponNum(char[] weaponname) {
1289
1290
1291 for (int i = 0; i <= 39; i++) {
1292 if (StrEqual(weaponname, g_sWeaponsNamesGame[i]))
1293 return i;
1294 }
1295 return 39;
1296}
1297
1298public Action Event_VipEscaped(Handle event, const char[] name, bool dontBroadcast) {
1299 if (!g_bEnabled || !g_bGatherStats || g_MinimumPlayers > GetCurrentPlayers())
1300 return;
1301 int client = GetClientOfUserId(GetEventInt(event, "userid"));
1302
1303 for (int i = 1; i <= MaxClients; i++) {
1304
1305 if (IsClientInGame(i) && GetClientTeam(i) == CT) {
1306 g_aStats[i][SCORE] += g_PointsVipEscapedTeam;
1307 g_aSession[i][SCORE] += g_PointsVipEscapedTeam;
1308
1309 }
1310
1311 }
1312 g_aStats[client][VIP_PLAYED]++;
1313 g_aSession[client][VIP_PLAYED]++;
1314 g_aStats[client][VIP_ESCAPED]++;
1315 g_aSession[client][VIP_ESCAPED]++;
1316 g_aStats[client][SCORE] += g_PointsVipEscapedPlayer;
1317 g_aSession[client][SCORE] += g_PointsVipEscapedPlayer;
1318
1319 if (!g_bChatChange)
1320 return;
1321 for (int i = 1; i <= MaxClients; i++)
1322 if (IsClientInGame(i))
1323 if(!hidechat[i]) CPrintToChat(i, "%s %t", MSG, "CT_VIPEscaped", g_PointsVipEscapedTeam);
1324 if (client != 0 && (g_bRankBots && !IsFakeClient(client)))
1325 for (int i = 1; i <= MaxClients; i++)
1326 if (IsClientInGame(i))
1327 if(!hidechat[i]) CPrintToChat(i, "%s %t", MSG, "VIPEscaped", g_aClientName[client], g_aStats[client][SCORE], g_PointsVipEscapedTeam + g_PointsVipEscapedPlayer);
1328}
1329
1330public Action Event_VipKilled(Handle event, const char[] name, bool dontBroadcast) {
1331 if (!g_bEnabled || !g_bGatherStats || g_MinimumPlayers > GetCurrentPlayers())
1332 return;
1333 int client = GetClientOfUserId(GetEventInt(event, "userid"));
1334 int killer = GetClientOfUserId(GetEventInt(event, "attacker"));
1335
1336 for (int i = 1; i <= MaxClients; i++) {
1337
1338 if (IsClientInGame(i) && GetClientTeam(i) == TR) {
1339 g_aStats[i][SCORE] += g_PointsVipKilledTeam;
1340 g_aSession[i][SCORE] += g_PointsVipKilledTeam;
1341
1342 }
1343
1344 }
1345 g_aStats[client][VIP_PLAYED]++;
1346 g_aSession[client][VIP_PLAYED]++;
1347 g_aStats[killer][VIP_KILLED]++;
1348 g_aSession[killer][VIP_KILLED]++;
1349 g_aStats[killer][SCORE] += g_PointsVipKilledPlayer;
1350 g_aSession[killer][SCORE] += g_PointsVipKilledPlayer;
1351
1352 if (!g_bChatChange)
1353 return;
1354 for (int i = 1; i <= MaxClients; i++)
1355 if (IsClientInGame(i))
1356 if(!hidechat[i]) CPrintToChat(i, "%s %t", MSG, "TR_VIPKilled", g_PointsVipKilledTeam);
1357 if (client != 0 && (g_bRankBots && !IsFakeClient(client)))
1358 for (int i = 1; i <= MaxClients; i++)
1359 if (IsClientInGame(i))
1360 if(!hidechat[i]) CPrintToChat(i, "%s %t", MSG, "VIPKilled", g_aClientName[client], g_aStats[client][SCORE], g_PointsVipKilledTeam + g_PointsVipKilledPlayer);
1361}
1362
1363public Action Event_HostageRescued(Handle event, const char[] name, bool dontBroadcast) {
1364 if (!g_bEnabled || !g_bGatherStats || g_MinimumPlayers > GetCurrentPlayers())
1365 return;
1366 int client = GetClientOfUserId(GetEventInt(event, "userid"));
1367
1368
1369 for (int i = 1; i <= MaxClients; i++) {
1370
1371 if (IsClientInGame(i) && GetClientTeam(i) == CT) {
1372 g_aStats[i][SCORE] += g_PointsHostageRescTeam;
1373 g_aSession[i][SCORE] += g_PointsHostageRescTeam;
1374
1375 }
1376
1377 }
1378 g_aSession[client][HOSTAGES_RESCUED]++;
1379 g_aStats[client][HOSTAGES_RESCUED]++;
1380 g_aStats[client][SCORE] += g_PointsHostageRescPlayer;
1381 g_aSession[client][SCORE] += g_PointsHostageRescPlayer;
1382
1383 if (!g_bChatChange)
1384 return;
1385 if (g_PointsHostageRescTeam > 0)
1386 for (int i = 1; i <= MaxClients; i++)
1387 if (IsClientInGame(i))
1388 if(!hidechat[i]) CPrintToChat(i, "%s %t", MSG, "CT_Hostage", g_PointsHostageRescTeam);
1389
1390 if (g_PointsHostageRescPlayer > 0 && client != 0 && (g_bRankBots && !IsFakeClient(client)))
1391 for (int i = 1; i <= MaxClients; i++)
1392 if (IsClientInGame(i))
1393 if(!hidechat[i]) CPrintToChat(i, "%s %t", MSG, "Hostage", g_aClientName[client], g_aStats[client][SCORE], g_PointsHostageRescPlayer + g_PointsHostageRescTeam);
1394
1395}
1396
1397public Action Event_RoundMVP(Handle event, const char[] name, bool dontBroadcast) {
1398 if (!g_bEnabled || !g_bGatherStats || g_MinimumPlayers > GetCurrentPlayers())
1399 return;
1400
1401 int client = GetClientOfUserId(GetEventInt(event, "userid"));
1402 if (!IsClientInGame(client))
1403 return;
1404 int team = GetClientTeam(client);
1405
1406 if (((team == 2 && g_PointsMvpTr > 0) || (team == 3 && g_PointsMvpCt > 0)) && client != 0 && (g_bRankBots && !IsFakeClient(client))) {
1407
1408 if (team == 2) {
1409
1410 g_aStats[client][SCORE] += g_PointsMvpTr;
1411 g_aSession[client][SCORE] += g_PointsMvpTr;
1412 for (int i = 1; i <= MaxClients; i++)
1413 if (IsClientInGame(i))
1414 if(!hidechat[i]) CPrintToChat(i, "%s %t", MSG, "MVP", g_aClientName[client], g_aStats[client][SCORE], g_PointsMvpTr);
1415
1416 } else {
1417
1418 g_aStats[client][SCORE] += g_PointsMvpCt;
1419 g_aSession[client][SCORE] += g_PointsMvpCt;
1420 for (int i = 1; i <= MaxClients; i++)
1421 if (IsClientInGame(i))
1422 if(!hidechat[i]) CPrintToChat(i, "%s %t", MSG, "MVP", g_aClientName[client], g_aStats[client][SCORE], g_PointsMvpCt);
1423 }
1424 }
1425 g_aStats[client][MVP]++;
1426 g_aSession[client][MVP]++;
1427}
1428public Action Event_RoundEnd(Handle event, const char[] name, bool dontBroadcast) {
1429 if (!g_bEnabled || !g_bGatherStats || g_MinimumPlayers > GetCurrentPlayers())
1430 return;
1431 int i;
1432 int Winner = GetEventInt(event, "winner");
1433 bool announced = false;
1434 for (i = 1; i <= MaxClients; i++)
1435 {
1436 if (IsClientInGame(i) && (g_bRankBots || !IsFakeClient(i))) {
1437 if (Winner == TR && GetClientTeam(i) == TR) {
1438 g_aSession[i][TR_WIN]++;
1439 g_aStats[i][TR_WIN]++;
1440 if (g_PointsRoundWin[TR] > 0 && IsPlayerAlive(i)) {
1441 g_aSession[i][SCORE] += g_PointsRoundWin[TR];
1442 g_aStats[i][SCORE] += g_PointsRoundWin[TR];
1443 if (!announced && g_bChatChange) {
1444 for (int j = 1; j <= MaxClients; j++)
1445 if (IsClientInGame(j))
1446 if(!hidechat[j]) CPrintToChat(j, "%s %t", MSG, "TR_Round", g_PointsRoundWin[TR]);
1447 announced = true;
1448 }
1449 }
1450 } else if (Winner == CT && GetClientTeam(i) == CT) {
1451 g_aSession[i][CT_WIN]++;
1452 g_aStats[i][CT_WIN]++;
1453 if (g_PointsRoundWin[CT] > 0 && IsPlayerAlive(i)) {
1454 g_aSession[i][SCORE] += g_PointsRoundWin[CT];
1455 g_aStats[i][SCORE] += g_PointsRoundWin[CT];
1456 if (!announced && g_bChatChange) {
1457 for (int j = 1; j <= MaxClients; j++)
1458 if (IsClientInGame(j))
1459 if(!hidechat[j]) CPrintToChat(j, "%s %t", MSG, "CT_Round", g_PointsRoundWin[CT]);
1460 announced = true;
1461 }
1462 }
1463 }
1464 SalvarPlayer(i);
1465 }
1466 }
1467
1468 DumpDB();
1469}
1470
1471
1472public void EventPlayerSpawn(Handle event, const char[] name, bool dontBroadcast)
1473{
1474 /* Old rounds played, this have been moved to round start.
1475 if (!g_bEnabled || !g_bGatherStats || g_MinimumPlayers > GetCurrentPlayers())
1476 return;
1477
1478 new client = GetClientOfUserId(GetEventInt(event, "userid"));
1479 if (!g_bRankBots && IsFakeClient(client))
1480 return;
1481 if (GetClientTeam(client) == TR) {
1482 g_aStats[client][ROUNDS_TR]++;
1483 g_aSession[client][ROUNDS_TR]++;
1484 } else if (GetClientTeam(client) == CT) {
1485 g_aStats[client][ROUNDS_CT]++;
1486 g_aSession[client][ROUNDS_CT]++;
1487 }
1488 */
1489}
1490
1491
1492public void Event_RoundStart(Handle event, const char[] name, bool dontBroadcast)
1493{
1494 if (!g_bEnabled || !g_bGatherStats || g_MinimumPlayers > GetCurrentPlayers())
1495 return;
1496
1497 int i;
1498 for(i=1;i<=MaxClients;i++)
1499 {
1500 if (IsClientInGame(i) && GetClientTeam(i) == TR)
1501 {
1502 g_aStats[i][ROUNDS_TR]++;
1503 g_aSession[i][ROUNDS_TR]++;
1504 }
1505 else if (IsClientInGame(i) && GetClientTeam(i) == CT)
1506 {
1507 g_aStats[i][ROUNDS_CT]++;
1508 g_aSession[i][ROUNDS_CT]++;
1509 }
1510 }
1511}
1512
1513public Action Event_BombPlanted(Handle event, const char[] name, bool dontBroadcast)
1514{
1515 if (!g_bEnabled || !g_bGatherStats || g_MinimumPlayers > GetCurrentPlayers())
1516 return;
1517
1518 int client = GetClientOfUserId(GetEventInt(event, "userid"));
1519
1520 g_C4PlantedBy = client;
1521
1522 for (int i = 1; i <= MaxClients; i++) {
1523
1524 if (IsClientInGame(i) && GetClientTeam(i) == TR) {
1525 g_aStats[i][SCORE] += g_PointsBombPlantedTeam;
1526 g_aSession[i][SCORE] += g_PointsBombPlantedTeam;
1527
1528 }
1529
1530 }
1531 g_aStats[client][C4_PLANTED]++;
1532 g_aSession[client][C4_PLANTED]++;
1533 g_aStats[client][SCORE] += g_PointsBombPlantedPlayer;
1534 g_aSession[client][SCORE] += g_PointsBombPlantedPlayer;
1535
1536 strcopy(g_sC4PlantedByName, sizeof(g_sC4PlantedByName), g_aClientName[client]);
1537 if (!g_bChatChange)
1538 return;
1539 if (g_PointsBombPlantedTeam > 0)
1540 for (int i = 1; i <= MaxClients; i++)
1541 if (IsClientInGame(i))
1542 if(!hidechat[i]) CPrintToChat(i, "%s %t", MSG, "TR_Planting", g_PointsBombPlantedTeam);
1543 if (g_PointsBombPlantedPlayer > 0 && client != 0 && (g_bRankBots || !IsFakeClient(client)))
1544 for (int i = 1; i <= MaxClients; i++)
1545 if (IsClientInGame(i))
1546 if(!hidechat[i]) CPrintToChat(i, "%s %t", MSG, "Planting", g_aClientName[client], g_aStats[client][SCORE], g_PointsBombPlantedTeam + g_PointsBombPlantedPlayer);
1547
1548}
1549
1550public Action Event_BombDefused(Handle event, const char[] name, bool dontBroadcast)
1551{
1552 if (!g_bEnabled || !g_bGatherStats || g_MinimumPlayers > GetCurrentPlayers())
1553 return;
1554 int client = GetClientOfUserId(GetEventInt(event, "userid"));
1555
1556 for (int i = 1; i <= MaxClients; i++) {
1557
1558 if (IsClientInGame(i) && GetClientTeam(i) == CT) {
1559 g_aStats[i][SCORE] += g_PointsBombDefusedTeam;
1560 g_aSession[i][SCORE] += g_PointsBombDefusedTeam;
1561
1562 }
1563
1564 }
1565 g_aStats[client][C4_DEFUSED]++;
1566 g_aSession[client][C4_DEFUSED]++;
1567 g_aStats[client][SCORE] += g_PointsBombDefusedPlayer;
1568 g_aSession[client][SCORE] += g_PointsBombDefusedPlayer;
1569
1570 if (!g_bChatChange)
1571 return;
1572 if (g_PointsBombDefusedTeam > 0)
1573 for (int i = 1; i <= MaxClients; i++)
1574 if (IsClientInGame(i))
1575 if(!hidechat[i]) CPrintToChat(i, "%s %t", MSG, "CT_Defusing", g_PointsBombDefusedTeam);
1576 if (g_PointsBombDefusedPlayer > 0 && client != 0 && (g_bRankBots || !IsFakeClient(client)))
1577 for (int i = 1; i <= MaxClients; i++)
1578 if (IsClientInGame(i))
1579 if(!hidechat[i]) CPrintToChat(i, "%s %t", MSG, "Defusing", g_aClientName[client], g_aStats[client][SCORE], g_PointsBombDefusedTeam + g_PointsBombDefusedPlayer);
1580}
1581
1582public Action Event_BombExploded(Handle event, const char[] name, bool dontBroadcast)
1583{
1584 if (!g_bEnabled || !g_bGatherStats || g_MinimumPlayers > GetCurrentPlayers())
1585 return;
1586
1587 int client = g_C4PlantedBy;
1588
1589 if (!g_bRankBots && (!IsValidClient(client) || IsFakeClient(client)))
1590 return;
1591
1592 for (int i = 1; i <= MaxClients; i++) {
1593
1594 if (IsClientInGame(i) && GetClientTeam(i) == TR) {
1595 g_aStats[i][SCORE] += g_PointsBombExplodeTeam;
1596 g_aSession[i][SCORE] += g_PointsBombExplodeTeam;
1597
1598 }
1599
1600 }
1601 g_aStats[client][C4_EXPLODED]++;
1602 g_aSession[client][C4_EXPLODED]++;
1603 g_aStats[client][SCORE] += g_PointsBombExplodePlayer;
1604 g_aSession[client][SCORE] += g_PointsBombExplodePlayer;
1605
1606 if (!g_bChatChange)
1607 return;
1608 if (g_PointsBombExplodeTeam > 0)
1609 for (int i = 1; i <= MaxClients; i++)
1610 if (IsClientInGame(i))
1611 if(!hidechat[i]) CPrintToChat(i, "%s %t", MSG, "TR_Exploding", g_PointsBombExplodeTeam);
1612 if (g_PointsBombExplodePlayer > 0 && client != 0 && (g_bRankBots || !IsFakeClient(client)))
1613 for (int i = 1; i <= MaxClients; i++)
1614 if (IsClientInGame(i))
1615 if(!hidechat[i]) CPrintToChat(i, "%s %t", MSG, "Exploding", g_sC4PlantedByName, g_aStats[client][SCORE], g_PointsBombExplodeTeam + g_PointsBombExplodePlayer);
1616}
1617
1618public Action Event_BombPickup(Handle event, const char[] name, bool dontBroadcast)
1619{
1620 if (!g_bEnabled || !g_bGatherStats || g_MinimumPlayers > GetCurrentPlayers())
1621 return;
1622
1623 int client = GetClientOfUserId(GetEventInt(event, "userid"));
1624
1625 g_aStats[client][SCORE] += g_PointsBombPickup;
1626 g_aSession[client][SCORE] += g_PointsBombPickup;
1627
1628 if (!g_bChatChange)
1629 return;
1630 if (g_PointsBombPickup > 0)
1631 if(!hidechat[client]) CPrintToChat(client, "%s %t", MSG, "BombPickup", g_aClientName[client], g_aStats[client][SCORE], g_PointsBombPickup);
1632
1633}
1634
1635public Action Event_BombDropped(Handle event, const char[] name, bool dontBroadcast)
1636{
1637 if (!g_bEnabled || !g_bGatherStats || g_MinimumPlayers > GetCurrentPlayers())
1638 return;
1639
1640 int client = GetClientOfUserId(GetEventInt(event, "userid"));
1641
1642 g_aStats[client][SCORE] -= g_PointsBombDropped;
1643 g_aSession[client][SCORE] -= g_PointsBombDropped;
1644
1645 if (!g_bChatChange)
1646 return;
1647 if (g_PointsBombDropped > 0 && client == 0)
1648 if(!hidechat[client]) CPrintToChat(client, "%s %t", MSG, "BombDropped", g_aClientName[client], g_aStats[client][SCORE], g_PointsBombDropped);
1649
1650}
1651
1652public Action EventPlayerDeath(Handle event, const char name[], bool dontBroadcast)
1653// ----------------------------------------------------------------------------
1654{
1655 if (!g_bEnabled || !g_bGatherStats || g_MinimumPlayers > GetCurrentPlayers())
1656 return;
1657
1658 int victim = GetClientOfUserId(GetEventInt(event, "userid"));
1659 int attacker = GetClientOfUserId(GetEventInt(event, "attacker"));
1660 int assist = GetClientOfUserId(GetEventInt(event, "assister"));
1661
1662 if (!g_bRankBots && attacker != 0 && (IsFakeClient(victim) || IsFakeClient(attacker)))
1663 return;
1664
1665 if (victim == attacker || attacker == 0) {
1666 g_aStats[victim][SUICIDES]++;
1667 g_aSession[victim][SUICIDES]++;
1668 g_aStats[victim][SCORE] -= g_PointsLoseSuicide;
1669 g_aSession[victim][SCORE] -= g_PointsLoseSuicide;
1670
1671 /* Min points */
1672 if (g_bPointsMinEnabled)
1673 {
1674 if (g_aStats[victim][SCORE] < g_PointsMin)
1675 {
1676 g_aStats[victim][SCORE] = g_PointsMin;
1677 }
1678 }
1679
1680 if (g_PointsLoseSuicide > 0 && g_bChatChange) {
1681 if(!hidechat[victim]) CPrintToChat(victim, "%s %t", MSG, "LostSuicide", g_aClientName[victim], g_aStats[victim][SCORE], g_PointsLoseSuicide);
1682 }
1683
1684 } else if (!g_bFfa && (GetClientTeam(victim) == GetClientTeam(attacker))) {
1685 if (attacker < MAXPLAYERS) {
1686 g_aStats[attacker][TK]++;
1687 g_aSession[attacker][TK]++;
1688 g_aStats[attacker][SCORE] -= g_PointsLoseTk;
1689 g_aSession[attacker][SCORE] -= g_PointsLoseTk;
1690
1691 /* Min points */
1692 if (g_bPointsMinEnabled)
1693 {
1694 if (g_aStats[victim][SCORE] < g_PointsMin)
1695 {
1696 g_aStats[victim][SCORE] = g_PointsMin;
1697 }
1698 }
1699
1700 if (g_PointsLoseTk > 0 && g_bChatChange) {
1701 if(!hidechat[victim]) CPrintToChat(victim, "%s %t", MSG, "LostTK", g_aClientName[attacker], g_aStats[attacker][SCORE], g_PointsLoseTk, g_aClientName[victim]);
1702 if(!hidechat[attacker]) CPrintToChat(attacker, "%s %t", MSG, "LostTK", g_aClientName[attacker], g_aStats[attacker][SCORE], g_PointsLoseTk, g_aClientName[victim]);
1703 }
1704 }
1705 } else {
1706 int team = GetClientTeam(attacker);
1707 bool headshot = GetEventBool(event, "headshot");
1708 char weapon[64];
1709 GetEventString(event, "weapon", weapon, sizeof(weapon));
1710 ReplaceString(weapon, sizeof(weapon), "weapon_", "");
1711
1712 if (StrEqual(weapon, "knife_default_ct") || StrEqual(weapon, "knife_default_t") || StrEqual(weapon, "knife_t") || StrEqual(weapon, "knifegg") || StrEqual(weapon, "knife_flip") || StrEqual(weapon, "knife_gut") || StrEqual(weapon, "knife_karambit") || StrEqual(weapon, "bayonet") || StrEqual(weapon, "knife_m9_bayonet") || StrEqual(weapon, "knife_butterfly") || StrEqual(weapon, "knife_tactical") || StrEqual(weapon, "knife_falchion") || StrEqual(weapon, "knife_push") || StrEqual(weapon, "knife_survival_bowie")) {
1713 weapon = "knife";
1714 }
1715
1716 int score_dif;
1717 if (attacker < MAXPLAYERS)
1718 score_dif = g_aStats[victim][SCORE] - g_aStats[attacker][SCORE];
1719
1720 if (score_dif < 0 || attacker >= MAXPLAYERS) {
1721 score_dif = g_PointsKill[team];
1722 } else {
1723 if (g_PointsKillBonusDif[team] == 0)
1724 score_dif = g_PointsKill[team] + ((g_aStats[victim][SCORE] - g_aStats[attacker][SCORE]) * g_PointsKillBonus[team]);
1725 else
1726 score_dif = g_PointsKill[team] + (((g_aStats[victim][SCORE] - g_aStats[attacker][SCORE]) / g_PointsKillBonusDif[team]) * g_PointsKillBonus[team]);
1727 }
1728 if (StrEqual(weapon, "knife")) {
1729 score_dif = RoundToCeil(score_dif * g_fPointsKnifeMultiplier);
1730 }
1731 else if (StrEqual(weapon, "taser")) {
1732 score_dif = RoundToCeil(score_dif * g_fPointsTaserMultiplier);
1733 }
1734 if (headshot && attacker < MAXPLAYERS) {
1735 g_aStats[attacker][HEADSHOTS]++;
1736 g_aSession[attacker][HEADSHOTS]++;
1737 }
1738
1739 g_aStats[victim][DEATHS]++;
1740 g_aSession[victim][DEATHS]++;
1741 if (attacker < MAXPLAYERS) {
1742 g_aStats[attacker][KILLS]++;
1743 g_aSession[attacker][KILLS]++;
1744 }
1745 if (g_bPointsLoseRoundCeil)
1746 {
1747 g_aStats[victim][SCORE] -= RoundToCeil(score_dif * g_fPercentPointsLose);
1748 g_aSession[victim][SCORE] -= RoundToCeil(score_dif * g_fPercentPointsLose);
1749
1750 /* Min points */
1751 if (g_bPointsMinEnabled)
1752 {
1753 if (g_aStats[victim][SCORE] < g_PointsMin)
1754 {
1755 g_aStats[victim][SCORE] = g_PointsMin;
1756 }
1757 }
1758
1759 }
1760 else
1761 {
1762 g_aStats[victim][SCORE] -= RoundToFloor(score_dif * g_fPercentPointsLose);
1763 g_aSession[victim][SCORE] -= RoundToFloor(score_dif * g_fPercentPointsLose);
1764
1765 /* Min points */
1766 if (g_bPointsMinEnabled)
1767 {
1768 if (g_aStats[victim][SCORE] < g_PointsMin)
1769 {
1770 g_aStats[victim][SCORE] = g_PointsMin;
1771 }
1772 }
1773 }
1774 if (attacker < MAXPLAYERS) {
1775 g_aStats[attacker][SCORE] += score_dif;
1776 g_aSession[attacker][SCORE] += score_dif;
1777 if (GetWeaponNum(weapon) < 40)
1778 g_aWeapons[attacker][GetWeaponNum(weapon)]++;
1779 }
1780
1781 if (g_MinimalKills == 0 || (g_aStats[victim][KILLS] >= g_MinimalKills && g_aStats[attacker][KILLS] >= g_MinimalKills)) {
1782 if (g_bChatChange) {
1783 //PrintToServer("%s %t",MSG,"Killing",g_aClientName[attacker],g_aStats[attacker][SCORE],score_dif,g_aClientName[victim],g_aStats[victim][SCORE]);
1784 if(!hidechat[victim]) CPrintToChat(victim, "%s %t", MSG, "Killing", g_aClientName[attacker], g_aStats[attacker][SCORE], score_dif, g_aClientName[victim], g_aStats[victim][SCORE]);
1785 if (attacker < MAXPLAYERS)
1786 if(!hidechat[attacker]) CPrintToChat(attacker, "%s %t", MSG, "Killing", g_aClientName[attacker], g_aStats[attacker][SCORE], score_dif, g_aClientName[victim], g_aStats[victim][SCORE]);
1787 }
1788 } else {
1789 if (g_aStats[victim][KILLS] < g_MinimalKills && g_aStats[attacker][KILLS] < g_MinimalKills) {
1790 if (g_bChatChange) {
1791 if(!hidechat[victim]) CPrintToChat(victim, "%s %t", MSG, "KillingBothNotRanked", g_aClientName[attacker], g_aStats[attacker][SCORE], score_dif, g_aClientName[victim], g_aStats[victim][SCORE], g_aStats[attacker][KILLS], g_MinimalKills, g_aStats[victim][KILLS], g_MinimalKills);
1792 if (attacker < MAXPLAYERS)
1793 if(!hidechat[attacker]) CPrintToChat(attacker, "%s %t", MSG, "KillingBothNotRanked", g_aClientName[attacker], g_aStats[attacker][SCORE], score_dif, g_aClientName[victim], g_aStats[victim][SCORE], g_aStats[attacker][KILLS], g_MinimalKills, g_aStats[victim][KILLS], g_MinimalKills);
1794 }
1795 } else if (g_aStats[victim][KILLS] < g_MinimalKills) {
1796 if (g_bChatChange) {
1797 if(!hidechat[victim]) CPrintToChat(victim, "%s %t", MSG, "KillingVictimNotRanked", g_aClientName[attacker], g_aStats[attacker][SCORE], score_dif, g_aClientName[victim], g_aStats[victim][SCORE], g_aStats[victim][KILLS], g_MinimalKills);
1798 if (attacker < MAXPLAYERS)
1799 if(!hidechat[victim]) CPrintToChat(victim, "%s %t", MSG, "KillingVictimNotRanked", g_aClientName[attacker], g_aStats[attacker][SCORE], score_dif, g_aClientName[victim], g_aStats[victim][SCORE], g_aStats[victim][KILLS], g_MinimalKills);
1800 }
1801 } else {
1802 if (g_bChatChange) {
1803 if(!hidechat[victim]) CPrintToChat(victim, "%s %t", MSG, "KillingKillerNotRanked", g_aClientName[attacker], g_aStats[attacker][SCORE], score_dif, g_aClientName[victim], g_aStats[victim][SCORE], g_aStats[attacker][KILLS], g_MinimalKills);
1804 if (attacker < MAXPLAYERS)
1805 if(!hidechat[attacker]) CPrintToChat(attacker, "%s %t", MSG, "KillingKillerNotRanked", g_aClientName[attacker], g_aStats[attacker][SCORE], score_dif, g_aClientName[victim], g_aStats[victim][SCORE], g_aStats[attacker][KILLS], g_MinimalKills);
1806 }
1807 }
1808 }
1809 if (headshot && attacker < MAXPLAYERS) {
1810
1811 g_aStats[attacker][SCORE] += g_PointsHs;
1812 g_aSession[attacker][SCORE] += g_PointsHs;
1813 if (g_bChatChange && g_PointsHs > 0)
1814 if(!hidechat[attacker]) CPrintToChat(attacker, "%s %t", MSG, "Headshot", g_aClientName[attacker], g_aStats[attacker][SCORE], g_PointsHs);
1815 }
1816 }
1817
1818 /* Assist */
1819 if(assist && attacker < MAXPLAYERS){
1820
1821 //Do not attack your teammate, my friend
1822 if(GetClientTeam(victim) == GetClientTeam(assist)){
1823 return;
1824 }
1825
1826 else{
1827 g_aStats[assist][SCORE]+= g_PointsAssistKill;
1828 g_aSession[assist][SCORE]+= g_PointsAssistKill;
1829 g_aStats[assist][ASSISTS]++;
1830 g_aSession[assist][ASSISTS]++;
1831
1832 if(g_bChatChange && g_PointsAssistKill > 0){
1833 if(!hidechat[assist]) CPrintToChat(assist, "%s %t", MSG, "AssistKill", g_aClientName[assist], g_aStats[assist][SCORE], g_PointsAssistKill, g_aClientName[attacker], g_aClientName[victim]);
1834 }
1835 }
1836 }
1837
1838 if (attacker < MAXPLAYERS)
1839 if (g_aStats[attacker][KILLS] == 50)
1840 g_TotalPlayers++;
1841}
1842
1843public Action EventPlayerHurt(Handle event, const char name[], bool dontBroadcast)
1844// ----------------------------------------------------------------------------
1845{
1846 if (!g_bEnabled || !g_bGatherStats || g_MinimumPlayers > GetCurrentPlayers())
1847 return;
1848 int victim = GetClientOfUserId(GetEventInt(event, "userid"));
1849 int attacker = GetClientOfUserId(GetEventInt(event, "attacker"));
1850 if (!g_bRankBots && (attacker == 0 || IsFakeClient(victim) || IsFakeClient(attacker)))
1851 return;
1852 if (victim != attacker && attacker > 0 && attacker < MAXPLAYERS) {
1853 int hitgroup = GetEventInt(event, "hitgroup");
1854 if (hitgroup == 0) // Player was hit by knife, he, flashbang, or smokegrenade.
1855 return;
1856 g_aStats[attacker][HITS]++;
1857 g_aSession[attacker][HITS]++;
1858 g_aHitBox[attacker][hitgroup]++;
1859
1860 int damage = GetEventInt(event, "dmg_health");
1861 g_aStats[attacker][DAMAGE] += damage;
1862 g_aSession[attacker][DAMAGE] += damage;
1863
1864 //PrintToChat(attacker, "Hitgroup %i: %i hits", hitgroup, g_aHitBox[attacker][hitgroup]);
1865 //PrintToServer("Stats Hits: %i\nSession Hits: %i\nHitBox %i -> %i",g_aStats[attacker][HITS],g_aSession[attacker][HITS],hitgroup,g_aHitBox[attacker][hitgroup]);
1866 }
1867}
1868
1869public Action EventWeaponFire(Handle event, const char[] name, bool dontBroadcast)
1870{
1871 if (!g_bEnabled || !g_bGatherStats || g_MinimumPlayers > GetCurrentPlayers())
1872 return;
1873 int client = GetClientOfUserId(GetEventInt(event, "userid"));
1874 if (!g_bRankBots && (!IsValidClient(client) || IsFakeClient(client)))
1875 return;
1876 char sWeaponUsed[50];
1877 GetEventString(event, "weapon", sWeaponUsed, sizeof(sWeaponUsed));
1878 if (StrEqual(sWeaponUsed, "knife") || StrEqual(sWeaponUsed, "hegrenade") || StrEqual(sWeaponUsed, "flashbang") || StrEqual(sWeaponUsed, "smokegrenade") || StrEqual(sWeaponUsed, "inferno") || StrEqual(sWeaponUsed, "molotov") || StrEqual(sWeaponUsed, "incgrenade") || StrEqual(sWeaponUsed, "decoy"))
1879 return; // Don't count knife being used neither hegrenade, flashbang and smokegrenade being threw
1880 g_aStats[client][SHOTS]++;
1881 g_aSession[client][SHOTS]++;
1882
1883}
1884
1885public void SalvarPlayer(int client) {
1886 if (!g_bEnabled || !g_bGatherStats || g_MinimumPlayers > GetCurrentPlayers())
1887 return;
1888 if (!g_bRankBots && (!IsValidClient(client) || IsFakeClient(client)))
1889 return;
1890 if (!OnDB[client])
1891 return;
1892
1893 char sEscapeName[MAX_NAME_LENGTH * 2 + 1];
1894 SQL_EscapeString(g_hStatsDb, g_aClientName[client], sEscapeName, sizeof(sEscapeName));
1895 //SQL_EscapeString(g_hStatsDb,name,name,sizeof(name));
1896
1897 // Make SQL-safe
1898 //ReplaceString(name, sizeof(name), "'", "");
1899
1900 char weapons_query[1000] = "";
1901 for (int i = 0; i <= 39; i++) {
1902 Format(weapons_query, sizeof(weapons_query), "%s,%s='%d'", weapons_query, g_sWeaponsNamesGame[i], g_aWeapons[client][i]);
1903 }
1904
1905 // Old query
1906 /*
1907 new String:query[2000];
1908 if (g_RankBy == 1) {
1909 Format(query, sizeof(query), g_sSqlSaveName, g_sSQLTable, g_aStats[client][SCORE], g_aStats[client][KILLS], g_aStats[client][DEATHS], g_aStats[client][ASSISTS], g_aStats[client][SUICIDES], g_aStats[client][TK],
1910 g_aStats[client][SHOTS], g_aStats[client][HITS], g_aStats[client][HEADSHOTS], g_aStats[client][ROUNDS_TR], g_aStats[client][ROUNDS_CT], g_aClientIp[client], sEscapeName, weapons_query,
1911 g_aHitBox[client][1], g_aHitBox[client][2], g_aHitBox[client][3], g_aHitBox[client][4], g_aHitBox[client][5], g_aHitBox[client][6], g_aHitBox[client][7], g_aStats[client][C4_PLANTED], g_aStats[client][C4_EXPLODED], g_aStats[client][C4_DEFUSED], g_aStats[client][CT_WIN], g_aStats[client][TR_WIN], g_aStats[client][HOSTAGES_RESCUED], g_aStats[client][VIP_KILLED], g_aStats[client][VIP_ESCAPED], g_aStats[client][VIP_PLAYED], g_aStats[client][MVP], g_aStats[client][DAMAGE], GetTime(), g_aStats[client][CONNECTED] + GetTime() - g_aSession[client][CONNECTED], sEscapeName);
1912 } else if (g_RankBy == 0) {
1913 Format(query, sizeof(query), g_sSqlSave, g_sSQLTable, g_aStats[client][SCORE], g_aStats[client][KILLS], g_aStats[client][DEATHS], g_aStats[client][ASSISTS], g_aStats[client][SUICIDES], g_aStats[client][TK],
1914 g_aStats[client][SHOTS], g_aStats[client][HITS], g_aStats[client][HEADSHOTS], g_aStats[client][ROUNDS_TR], g_aStats[client][ROUNDS_CT], g_aClientIp[client], sEscapeName, weapons_query,
1915 g_aHitBox[client][1], g_aHitBox[client][2], g_aHitBox[client][3], g_aHitBox[client][4], g_aHitBox[client][5], g_aHitBox[client][6], g_aHitBox[client][7], g_aStats[client][C4_PLANTED], g_aStats[client][C4_EXPLODED], g_aStats[client][C4_DEFUSED], g_aStats[client][CT_WIN], g_aStats[client][TR_WIN], g_aStats[client][HOSTAGES_RESCUED], g_aStats[client][VIP_KILLED], g_aStats[client][VIP_ESCAPED], g_aStats[client][VIP_PLAYED], g_aStats[client][MVP], g_aStats[client][DAMAGE], GetTime(), g_aStats[client][CONNECTED] + GetTime() - g_aSession[client][CONNECTED], g_aClientSteam[client]);
1916 } else if (g_RankBy == 2) {
1917 Format(query, sizeof(query), g_sSqlSaveIp, g_sSQLTable, g_aStats[client][SCORE], g_aStats[client][KILLS], g_aStats[client][DEATHS], g_aStats[client][ASSISTS], g_aStats[client][SUICIDES], g_aStats[client][TK],
1918 g_aStats[client][SHOTS], g_aStats[client][HITS], g_aStats[client][HEADSHOTS], g_aStats[client][ROUNDS_TR], g_aStats[client][ROUNDS_CT], g_aClientIp[client], sEscapeName, weapons_query,
1919 g_aHitBox[client][1], g_aHitBox[client][2], g_aHitBox[client][3], g_aHitBox[client][4], g_aHitBox[client][5], g_aHitBox[client][6], g_aHitBox[client][7], g_aStats[client][C4_PLANTED], g_aStats[client][C4_EXPLODED], g_aStats[client][C4_DEFUSED], g_aStats[client][CT_WIN], g_aStats[client][TR_WIN], g_aStats[client][HOSTAGES_RESCUED], g_aStats[client][VIP_KILLED], g_aStats[client][VIP_ESCAPED], g_aStats[client][VIP_PLAYED], g_aStats[client][MVP], g_aStats[client][DAMAGE], GetTime(), g_aStats[client][CONNECTED] + GetTime() - g_aSession[client][CONNECTED], g_aClientIp[client]);
1920 }
1921 SQL_TQuery(g_hStatsDb, SQL_SaveCallback, query, client, DBPrio_High);
1922 */
1923
1924 /* SM1.9 Fix*/
1925 char query[2000];
1926 char query2[2000];
1927
1928 if (g_RankBy == 0)
1929 {
1930 FormatEx(query, sizeof(query), g_sSqlSave, g_sSQLTable, g_aStats[client][SCORE], g_aStats[client][KILLS], g_aStats[client][DEATHS], g_aStats[client][ASSISTS], g_aStats[client][SUICIDES], g_aStats[client][TK],
1931 g_aStats[client][SHOTS], g_aStats[client][HITS], g_aStats[client][HEADSHOTS], g_aStats[client][ROUNDS_TR], g_aStats[client][ROUNDS_CT], g_aClientIp[client], sEscapeName, weapons_query,
1932 g_aHitBox[client][1], g_aHitBox[client][2], g_aHitBox[client][3], g_aHitBox[client][4], g_aHitBox[client][5], g_aHitBox[client][6], g_aHitBox[client][7], g_aClientSteam[client]);
1933
1934 FormatEx(query2, sizeof(query2), g_sSqlSave2, g_sSQLTable, g_aStats[client][C4_PLANTED], g_aStats[client][C4_EXPLODED], g_aStats[client][C4_DEFUSED], g_aStats[client][CT_WIN], g_aStats[client][TR_WIN],
1935 g_aStats[client][HOSTAGES_RESCUED], g_aStats[client][VIP_KILLED], g_aStats[client][VIP_ESCAPED], g_aStats[client][VIP_PLAYED], g_aStats[client][MVP], g_aStats[client][DAMAGE], GetTime(), g_aStats[client][CONNECTED] + GetTime() - g_aSession[client][CONNECTED], g_aClientSteam[client]);
1936 }
1937
1938 else if (g_RankBy == 1)
1939 {
1940 FormatEx(query, sizeof(query), g_sSqlSaveName, g_sSQLTable, g_aStats[client][SCORE], g_aStats[client][KILLS], g_aStats[client][DEATHS], g_aStats[client][ASSISTS], g_aStats[client][SUICIDES], g_aStats[client][TK],
1941 g_aStats[client][SHOTS], g_aStats[client][HITS], g_aStats[client][HEADSHOTS], g_aStats[client][ROUNDS_TR], g_aStats[client][ROUNDS_CT], g_aClientIp[client], sEscapeName, weapons_query,
1942 g_aHitBox[client][1], g_aHitBox[client][2], g_aHitBox[client][3], g_aHitBox[client][4], g_aHitBox[client][5], g_aHitBox[client][6], g_aHitBox[client][7], sEscapeName);
1943
1944 FormatEx(query2, sizeof(query2), g_sSqlSaveName2, g_sSQLTable, g_aStats[client][C4_PLANTED], g_aStats[client][C4_EXPLODED], g_aStats[client][C4_DEFUSED], g_aStats[client][CT_WIN], g_aStats[client][TR_WIN],
1945 g_aStats[client][HOSTAGES_RESCUED], g_aStats[client][VIP_KILLED], g_aStats[client][VIP_ESCAPED], g_aStats[client][VIP_PLAYED], g_aStats[client][MVP], g_aStats[client][DAMAGE], GetTime(), g_aStats[client][CONNECTED] + GetTime() - g_aSession[client][CONNECTED], sEscapeName);
1946 }
1947
1948 else if (g_RankBy == 2)
1949 {
1950 FormatEx(query, sizeof(query), g_sSqlSaveIp, g_sSQLTable, g_aStats[client][SCORE], g_aStats[client][KILLS], g_aStats[client][DEATHS], g_aStats[client][ASSISTS], g_aStats[client][SUICIDES], g_aStats[client][TK],
1951 g_aStats[client][SHOTS], g_aStats[client][HITS], g_aStats[client][HEADSHOTS], g_aStats[client][ROUNDS_TR], g_aStats[client][ROUNDS_CT], g_aClientIp[client], sEscapeName, weapons_query,
1952 g_aHitBox[client][1], g_aHitBox[client][2], g_aHitBox[client][3], g_aHitBox[client][4], g_aHitBox[client][5], g_aHitBox[client][6], g_aHitBox[client][7], g_aClientIp[client]);
1953
1954 FormatEx(query2, sizeof(query2), g_sSqlSaveIp2, g_aStats[client][C4_PLANTED], g_aStats[client][C4_EXPLODED], g_aStats[client][C4_DEFUSED], g_aStats[client][CT_WIN], g_aStats[client][TR_WIN],
1955 g_aStats[client][HOSTAGES_RESCUED], g_aStats[client][VIP_KILLED], g_aStats[client][VIP_ESCAPED], g_aStats[client][VIP_PLAYED], g_aStats[client][MVP], g_aStats[client][DAMAGE], GetTime(), g_aStats[client][CONNECTED] + GetTime() - g_aSession[client][CONNECTED], g_aClientIp[client]);
1956 }
1957
1958 SQL_TQuery(g_hStatsDb, SQL_SaveCallback, query, client, DBPrio_High);
1959 SQL_TQuery(g_hStatsDb, SQL_SaveCallback, query2, client, DBPrio_High);
1960
1961 if (DEBUGGING) {
1962 PrintToServer(query);
1963
1964 LogError("%s", query);
1965 }
1966}
1967
1968
1969public void SQL_SaveCallback(Handle owner, Handle hndl, const char[] error, any client)
1970{
1971 if (hndl == INVALID_HANDLE)
1972 {
1973 LogError("[RankMe] Save Player Fail: %s", error);
1974 return;
1975 }
1976
1977 /**
1978 Start the forward OnPlayerSaved
1979 */
1980 Action fResult;
1981 Call_StartForward(g_fwdOnPlayerSaved);
1982 Call_PushCell(client);
1983 int fError = Call_Finish(fResult);
1984
1985 if (fError != SP_ERROR_NONE)
1986 {
1987 ThrowNativeError(fError, "Forward failed");
1988 }
1989
1990}
1991
1992public void OnClientPutInServer(int client) {
1993
1994 // If the database isn't connected, you can't run SQL_EscapeString.
1995 if (g_hStatsDb != INVALID_HANDLE)
1996 LoadPlayer(client);
1997
1998 // Cookie
1999 if(IsValidClient(client) && !IsFakeClient(client)){
2000 char buffer[5];
2001 GetClientCookie(client, hidechatcookie, buffer, sizeof(buffer));
2002 if(StrEqual(buffer, "") || StrEqual(buffer,"0")) hidechat[client] = false;
2003 else if(StrEqual(buffer,"1")) hidechat[client] = true;
2004 }
2005}
2006
2007public void LoadPlayer(int client) {
2008
2009 OnDB[client] = false;
2010 for (int i = 0; i <= 19; i++) {
2011 g_aSession[client][i] = 0;
2012 g_aStats[client][i] = 0;
2013 }
2014 g_aStats[client][SCORE] = g_PointsStart;
2015 for (int i = 0; i <= 39; i++) {
2016 g_aWeapons[client][i] = 0;
2017 }
2018 g_aSession[client][CONNECTED] = GetTime();
2019
2020 char name[MAX_NAME_LENGTH];
2021 GetClientName(client, name, sizeof(name));
2022 strcopy(g_aClientName[client], MAX_NAME_LENGTH, name);
2023 char sEscapeName[MAX_NAME_LENGTH * 2 + 1];
2024 SQL_EscapeString(g_hStatsDb, name, sEscapeName, sizeof(sEscapeName));
2025 //ReplaceString(name, sizeof(name), "'", "");
2026 char auth[32];
2027 GetClientAuthId(client, AuthId_Steam2, auth, sizeof(auth));
2028 strcopy(g_aClientSteam[client], sizeof(g_aClientSteam[]), auth);
2029 char ip[32];
2030 GetClientIP(client, ip, sizeof(ip));
2031 strcopy(g_aClientIp[client], sizeof(g_aClientIp[]), ip);
2032 char query[10000];
2033 if (g_RankBy == 1)
2034 FormatEx(query, sizeof(query), g_sSqlRetrieveClientName, g_sSQLTable, sEscapeName);
2035 else if (g_RankBy == 0)
2036 FormatEx(query, sizeof(query), g_sSqlRetrieveClient, g_sSQLTable, auth);
2037 else if (g_RankBy == 2)
2038 FormatEx(query, sizeof(query), g_sSqlRetrieveClientIp, g_sSQLTable, ip);
2039
2040 if (DEBUGGING) {
2041 PrintToServer(query);
2042 LogError("%s", query);
2043 }
2044 if (g_hStatsDb != INVALID_HANDLE)
2045 SQL_TQuery(g_hStatsDb, SQL_LoadPlayerCallback, query, client);
2046
2047}
2048
2049public void SQL_LoadPlayerCallback(Handle owner, Handle hndl, const char[] error, any client)
2050{
2051 if (!g_bRankBots && (!IsValidClient(client) || IsFakeClient(client)))
2052 return;
2053
2054 if (hndl == INVALID_HANDLE)
2055 {
2056 LogError("[RankMe] Load Player Fail: %s", error);
2057 return;
2058 }
2059 if (!IsClientInGame(client))
2060 return;
2061
2062 if (g_RankBy == 1) {
2063 char name[MAX_NAME_LENGTH];
2064 GetClientName(client, name, sizeof(name));
2065 if (!StrEqual(name, g_aClientName[client]))
2066 return;
2067 } else if (g_RankBy == 0) {
2068 char auth[64];
2069 GetClientAuthId(client, AuthId_Steam2, auth, sizeof(auth));
2070 if (!StrEqual(auth, g_aClientSteam[client]))
2071 return;
2072 } else if (g_RankBy == 2) {
2073 char ip[64];
2074 GetClientIP(client, ip, sizeof(ip));
2075 if (!StrEqual(ip, g_aClientIp[client]))
2076 return;
2077 }
2078 if (SQL_HasResultSet(hndl) && SQL_FetchRow(hndl))
2079 {
2080 //Player infos
2081 for (int i = 0; i <= 11; i++) {
2082 g_aStats[client][i] = SQL_FetchInt(hndl, 4 + i);
2083 }
2084
2085 //ALL 40 Weapons
2086 for (int i = 0; i <= 39; i++) {
2087 g_aWeapons[client][i] = SQL_FetchInt(hndl, 17 + i);
2088 }
2089
2090 //ALL 8 Hitboxes
2091 for (int i = 1; i <= 7; i++) {
2092 g_aHitBox[client][i] = SQL_FetchInt(hndl, 56 + i);
2093 }
2094
2095 g_aStats[client][C4_PLANTED] = SQL_FetchInt(hndl, 64);
2096 g_aStats[client][C4_EXPLODED] = SQL_FetchInt(hndl, 65);
2097 g_aStats[client][C4_DEFUSED] = SQL_FetchInt(hndl, 66);
2098 g_aStats[client][CT_WIN] = SQL_FetchInt(hndl, 67);
2099 g_aStats[client][TR_WIN] = SQL_FetchInt(hndl, 68);
2100 g_aStats[client][HOSTAGES_RESCUED] = SQL_FetchInt(hndl, 69);
2101 g_aStats[client][VIP_KILLED] = SQL_FetchInt(hndl, 70);
2102 g_aStats[client][VIP_ESCAPED] = SQL_FetchInt(hndl, 71);
2103 g_aStats[client][VIP_PLAYED] = SQL_FetchInt(hndl, 72);
2104 g_aStats[client][MVP] = SQL_FetchInt(hndl, 73);
2105 g_aStats[client][DAMAGE] = SQL_FetchInt(hndl, 74);
2106 } else {
2107 char query[10000];
2108
2109 char sEscapeName[MAX_NAME_LENGTH * 2 + 1];
2110 SQL_EscapeString(g_hStatsDb, g_aClientName[client], sEscapeName, sizeof(sEscapeName));
2111 //SQL_EscapeString(g_hStatsDb,name,name,sizeof(name));
2112 //ReplaceString(name, sizeof(name), "'", "");
2113
2114 Format(query, sizeof(query), g_sSqlInsert, g_sSQLTable, g_aClientSteam[client], sEscapeName, g_aClientIp[client], g_PointsStart);
2115 SQL_TQuery(g_hStatsDb, SQL_NothingCallback, query, _, DBPrio_High);
2116
2117 if (DEBUGGING) {
2118 PrintToServer(query);
2119
2120 LogError("%s", query);
2121 }
2122 }
2123 OnDB[client] = true;
2124 /**
2125 Start the forward OnPlayerLoaded
2126 */
2127 Action fResult;
2128 Call_StartForward(g_fwdOnPlayerLoaded);
2129 Call_PushCell(client);
2130 int fError = Call_Finish(fResult);
2131
2132 if (fError != SP_ERROR_NONE)
2133 {
2134 ThrowNativeError(fError, "Forward failed");
2135 }
2136}
2137
2138public void SQL_PurgeCallback(Handle owner, Handle hndl, const char[] error, any client)
2139{
2140 if (hndl == INVALID_HANDLE)
2141 {
2142 LogError("[RankMe] Query Fail: %s", error);
2143 return;
2144 }
2145
2146 PrintToServer("[RankMe]: %d players purged by inactivity", SQL_GetAffectedRows(owner));
2147 if (client != 0) {
2148 PrintToChat(client, "[RankMe]: %d players purged by inactivity", SQL_GetAffectedRows(owner));
2149 }
2150 //LogAction(-1,-1,"[RankMe]: %d players purged by inactivity",SQL_GetAffectedRows(owner));
2151
2152}
2153
2154public void SQL_NothingCallback(Handle owner, Handle hndl, const char[] error, any client)
2155{
2156 if (hndl == INVALID_HANDLE)
2157 {
2158 LogError("[RankMe] Query Fail: %s", error);
2159 return;
2160 }
2161
2162
2163}
2164
2165public void OnClientDisconnect(int client) {
2166 if (!g_bEnabled)
2167 return;
2168 if (!g_bRankBots && (!IsValidClient(client) || IsFakeClient(client)))
2169 return;
2170 SalvarPlayer(client);
2171 OnDB[client] = false;
2172}
2173
2174public void SQL_DumpCallback(Handle owner, Handle hndl, const char[] error, any Datapack) {
2175
2176 if (hndl == INVALID_HANDLE)
2177 {
2178 LogError("[RankMe] Query Fail: %s", error);
2179 PrintToServer(error);
2180 return;
2181 }
2182
2183 Handle File1;
2184 char fields_values[600];
2185 char field[100];
2186 char prepared_field[200];
2187
2188 fields_values[0] = 0;
2189
2190 File1 = OpenFile("rank.sql", "w");
2191 if (File1 == INVALID_HANDLE) {
2192
2193 LogError("[RankMe] Unable to open dump file.");
2194
2195 }
2196 int fields = SQL_GetFieldCount(hndl);
2197 bool first;
2198
2199 if(g_bMysql)
2200 {
2201 WriteFileLine(File1, g_sMysqlCreate, g_sSQLTable);
2202 WriteFileLine(File1, "");
2203 }
2204
2205 if(!g_bMysql)
2206 {
2207 WriteFileLine(File1, g_sSqliteCreate, g_sSQLTable);
2208 WriteFileLine(File1, "");
2209 }
2210
2211 while (SQL_HasResultSet(hndl) && SQL_FetchRow(hndl))
2212 {
2213 field = "";
2214 fields_values = "";
2215 first = true;
2216 for (int i = 0; i <= fields - 1; i++) {
2217 SQL_FetchString(hndl, i, field, sizeof(field));
2218 // ReplaceString(field, sizeof(field), "\\","\\\\",false);
2219 // ReplaceString(field,sizeof(field),"\"", "\\\"", false);
2220 SQL_EscapeString(g_hStatsDb, field, prepared_field, sizeof(prepared_field));
2221
2222 if (first) {
2223 Format(fields_values, sizeof(fields_values), "\"%s\"", prepared_field);
2224 first = false;
2225 }
2226 else
2227 Format(fields_values, sizeof(fields_values), "%s,\"%s\"", fields_values, prepared_field);
2228 }
2229
2230 WriteFileLine(File1, "INSERT INTO `%s` VALUES (%s);", g_sSQLTable, fields_values);
2231 }
2232 CloseHandle(File1);
2233}
2234
2235public void OnConVarChanged(Handle convar, const char[] oldValue, const char[] newValue) {
2236 int g_bQueryPlayerCount;
2237
2238 if (convar == g_cvarShowBotsOnRank) {
2239 g_bShowBotsOnRank = GetConVarBool(g_cvarShowBotsOnRank);
2240 g_bQueryPlayerCount = true;
2241 }
2242 else if (convar == g_cvarRankBy) {
2243 g_RankBy = GetConVarBool(g_cvarRankBy);
2244 }
2245 else if (convar == g_cvarEnabled) {
2246 g_bEnabled = GetConVarBool(g_cvarEnabled);
2247 }
2248 else if (convar == g_cvarShowRankAll) {
2249 g_bShowRankAll = GetConVarBool(g_cvarShowRankAll);
2250 }
2251 else if (convar == g_cvarChatChange) {
2252 g_bChatChange = GetConVarBool(g_cvarChatChange);
2253 }
2254 else if (convar == g_cvarRankbots) {
2255 g_bRankBots = GetConVarBool(g_cvarRankbots);
2256 g_bQueryPlayerCount = true;
2257 }
2258 else if (convar == g_cvarFfa) {
2259 g_bFfa = GetConVarBool(g_cvarFfa);
2260 }
2261 else if (convar == g_cvarDumpDB) {
2262 g_bDumpDB = GetConVarBool(g_cvarDumpDB);
2263 }
2264 else if (convar == g_cvarPointsBombDefusedTeam) {
2265 g_PointsBombDefusedTeam = GetConVarInt(g_cvarPointsBombDefusedTeam);
2266 }
2267 else if (convar == g_cvarPointsBombDefusedPlayer) {
2268 g_PointsBombDefusedPlayer = GetConVarInt(g_cvarPointsBombDefusedPlayer);
2269 }
2270 else if (convar == g_cvarPointsBombPlantedTeam) {
2271 g_PointsBombPlantedTeam = GetConVarInt(g_cvarPointsBombPlantedTeam);
2272 }
2273 else if (convar == g_cvarPointsBombPlantedPlayer) {
2274 g_PointsBombPlantedPlayer = GetConVarInt(g_cvarPointsBombPlantedPlayer);
2275 }
2276 else if (convar == g_cvarPointsBombExplodeTeam) {
2277 g_PointsBombExplodeTeam = GetConVarInt(g_cvarPointsBombExplodeTeam);
2278 }
2279 else if (convar == g_cvarPointsBombExplodePlayer) {
2280 g_PointsBombExplodePlayer = GetConVarInt(g_cvarPointsBombExplodePlayer);
2281 }
2282 else if (convar == g_cvarPointsHostageRescTeam) {
2283 g_PointsHostageRescTeam = GetConVarInt(g_cvarPointsHostageRescTeam);
2284 }
2285 else if (convar == g_cvarPointsHostageRescPlayer) {
2286 g_PointsHostageRescPlayer = GetConVarInt(g_cvarPointsHostageRescPlayer);
2287 }
2288 else if (convar == g_cvarPointsHs) {
2289 g_PointsHs = GetConVarInt(g_cvarPointsHs);
2290 }
2291 else if (convar == g_cvarPointsKillCt) {
2292 g_PointsKill[CT] = GetConVarInt(g_cvarPointsKillCt);
2293 }
2294 else if (convar == g_cvarPointsKillTr) {
2295 g_PointsKill[TR] = GetConVarInt(g_cvarPointsKillTr);
2296 }
2297 else if (convar == g_cvarPointsKillBonusCt) {
2298 g_PointsKillBonus[CT] = GetConVarInt(g_cvarPointsKillBonusCt);
2299 }
2300 else if (convar == g_cvarPointsKillBonusTr) {
2301 g_PointsKillBonus[TR] = GetConVarInt(g_cvarPointsKillBonusTr);
2302 }
2303 else if (convar == g_cvarPointsKillBonusDifCt) {
2304 g_PointsKillBonusDif[CT] = GetConVarInt(g_cvarPointsKillBonusDifCt);
2305 }
2306 else if (convar == g_cvarPointsKillBonusDifTr) {
2307 g_PointsKillBonusDif[TR] = GetConVarInt(g_cvarPointsKillBonusDifTr);
2308 }
2309 else if (convar == g_cvarPointsStart) {
2310 g_PointsStart = GetConVarInt(g_cvarPointsStart);
2311 }
2312 else if (convar == g_cvarPointsKnifeMultiplier) {
2313 g_fPointsKnifeMultiplier = GetConVarFloat(g_cvarPointsKnifeMultiplier);
2314 }
2315 else if (convar == g_cvarPointsTaserMultiplier) {
2316 g_fPointsTaserMultiplier = GetConVarFloat(g_cvarPointsTaserMultiplier);
2317 }
2318 else if (convar == g_cvarPointsTrRoundWin) {
2319 g_PointsRoundWin[TR] = GetConVarInt(g_cvarPointsTrRoundWin);
2320 }
2321 else if (convar == g_cvarPointsCtRoundWin) {
2322 g_PointsRoundWin[CT] = GetConVarInt(g_cvarPointsCtRoundWin);
2323 }
2324 else if (convar == g_cvarMinimalKills) {
2325 g_MinimalKills = GetConVarInt(g_cvarMinimalKills);
2326 }
2327 else if (convar == g_cvarPercentPointsLose) {
2328 g_fPercentPointsLose = GetConVarFloat(g_cvarPercentPointsLose);
2329 }
2330 else if (convar == g_cvarPointsLoseRoundCeil) {
2331 g_bPointsLoseRoundCeil = GetConVarBool(g_cvarPointsLoseRoundCeil);
2332 }
2333 else if (convar == g_cvarMinimumPlayers) {
2334 g_MinimumPlayers = GetConVarInt(g_cvarMinimumPlayers);
2335 }
2336 else if (convar == g_cvarResetOwnRank) {
2337 g_bResetOwnRank = GetConVarBool(g_cvarResetOwnRank);
2338 }
2339 else if (convar == g_cvarPointsVipEscapedTeam) {
2340 g_PointsVipEscapedTeam = GetConVarInt(g_cvarPointsVipEscapedTeam);
2341 }
2342 else if (convar == g_cvarPointsVipEscapedPlayer) {
2343 g_PointsVipEscapedPlayer = GetConVarInt(g_cvarPointsVipEscapedPlayer);
2344 }
2345 else if (convar == g_cvarPointsVipKilledTeam) {
2346 g_PointsVipKilledTeam = GetConVarInt(g_cvarPointsVipKilledTeam);
2347 }
2348 else if (convar == g_cvarPointsVipKilledPlayer) {
2349 g_PointsVipKilledPlayer = GetConVarInt(g_cvarPointsVipKilledPlayer);
2350 }
2351 else if (convar == g_cvarVipEnabled) {
2352 g_bVipEnabled = GetConVarBool(g_cvarVipEnabled);
2353 }
2354 else if (convar == g_cvarDaysToNotShowOnRank) {
2355 g_DaysToNotShowOnRank = GetConVarInt(g_cvarDaysToNotShowOnRank);
2356 g_bQueryPlayerCount = true;
2357 }
2358 else if (convar == g_cvarGatherStats) {
2359 g_bGatherStats = GetConVarBool(g_cvarGatherStats);
2360 }
2361 else if (convar == g_cvarRankMode) {
2362 g_RankMode = GetConVarInt(g_cvarRankMode);
2363 BuildRankCache();
2364 }
2365 else if (convar == g_cvarChatTriggers) {
2366 g_bChatTriggers = GetConVarBool(g_cvarChatTriggers);
2367 }
2368 else if (convar == g_cvarPointsMvpCt) {
2369 g_PointsMvpCt = GetConVarInt(g_cvarPointsMvpCt);
2370 }
2371 else if (convar == g_cvarPointsMvpTr) {
2372 g_PointsMvpTr = GetConVarInt(g_cvarPointsMvpTr);
2373 }
2374 else if (convar == g_cvarPointsBombPickup) {
2375 g_PointsBombDropped = GetConVarInt(g_cvarPointsBombPickup);
2376 }
2377 else if (convar == g_cvarPointsBombDropped) {
2378 g_PointsBombDropped = GetConVarInt(g_cvarPointsBombDropped);
2379 }
2380
2381 /*RankMe Connect Announcer*/
2382 else if(convar == g_cvarAnnounceConnect) {
2383 g_bAnnounceConnect = GetConVarBool(g_cvarAnnounceConnect);
2384 }
2385
2386 else if(convar == g_cvarAnnounceConnectChat) {
2387 g_bAnnounceConnectChat = GetConVarBool(g_cvarAnnounceConnectChat);
2388 }
2389
2390 else if(convar == g_cvarAnnounceConnectHint) {
2391 g_bAnnounceConnectHint = GetConVarBool(g_cvarAnnounceConnectHint);
2392 }
2393
2394 else if(convar == g_cvarAnnounceDisconnect) {
2395 g_bAnnounceDisconnect = GetConVarBool(g_cvarAnnounceDisconnect);
2396 }
2397
2398 else if(convar == g_cvarAnnounceTopConnect) {
2399 g_bAnnounceTopConnect = GetConVarBool(g_cvarAnnounceTopConnect);
2400 }
2401
2402 else if(convar == g_cvarAnnounceTopPosConnect) {
2403 g_AnnounceTopPosConnect = GetConVarInt(g_cvarAnnounceTopPosConnect);
2404 }
2405
2406 else if(convar == g_cvarAnnounceTopConnectChat) {
2407 g_bAnnounceTopConnectChat = GetConVarBool(g_cvarAnnounceTopConnectChat);
2408 }
2409
2410 else if(convar == g_cvarAnnounceTopConnectHint) {
2411 g_bAnnounceTopConnectHint = GetConVarBool(g_cvarAnnounceTopConnectHint);
2412 }
2413
2414 /* Assist */
2415 else if (convar == g_cvarPointsAssistKill){
2416 g_PointsAssistKill = GetConVarInt(g_cvarPointsAssistKill);
2417 }
2418
2419 /* Enable Or Disable Points In Warmup */
2420 else if (convar == g_cvarGatherStatsWarmup){
2421 g_bGatherStatsWarmup = GetConVarBool(g_cvarGatherStatsWarmup);
2422 }
2423
2424 /* Min points */
2425 else if (convar == g_cvarPointsMin){
2426 g_PointsMin = GetConVarInt(g_cvarPointsMin);
2427 }
2428
2429 else if (convar == g_cvarPointsMinEnabled){
2430 g_bPointsMinEnabled = GetConVarBool(g_cvarPointsMinEnabled);
2431 }
2432
2433 /* Rank Cache */
2434 else if (convar == g_cvarRankCache) {
2435 g_bRankCache = GetConVarBool(g_cvarRankCache);
2436 }
2437
2438 if (g_bQueryPlayerCount && g_hStatsDb != INVALID_HANDLE) {
2439 char query[10000];
2440 MakeSelectQuery(query, sizeof(query));
2441 SQL_TQuery(g_hStatsDb, SQL_GetPlayersCallback, query);
2442 }
2443}
2444
2445stock bool IsValidClient(int client, bool nobots = true)
2446{
2447 if (client <= 0 || client > MaxClients || !IsClientConnected(client) || (nobots && IsFakeClient(client)))
2448 {
2449 return false;
2450 }
2451 return IsClientInGame(client);
2452}
2453
2454stock void MakeSelectQuery(char[] sQuery, int strsize) {
2455
2456 // Make basic query
2457 Format(sQuery, strsize, "SELECT * FROM `%s` WHERE kills >= '%d'", g_sSQLTable, g_MinimalKills);
2458
2459 // Append check for bots
2460 if (!g_bShowBotsOnRank)
2461 Format(sQuery, strsize, "%s AND steam <> 'BOT'", sQuery);
2462
2463 // Append check for inactivity
2464 if (g_DaysToNotShowOnRank > 0)
2465 Format(sQuery, strsize, "%s AND lastconnect >= '%d'", sQuery, GetTime() - (g_DaysToNotShowOnRank * 86400));
2466}
2467
2468public Action RankMe_OnPlayerLoaded(int client){
2469
2470 /*RankMe Connect Announcer*/
2471 if(!g_bAnnounceConnect && !g_bAnnounceTopConnect)
2472 return Plugin_Handled;
2473
2474 if (!g_bRankBots && (!IsValidClient(client) || IsFakeClient(client)))
2475 return Plugin_Handled;
2476
2477 RankMe_GetRank(client,RankConnectCallback);
2478
2479 return Plugin_Continue;
2480}
2481
2482public void RankConnectCallback(int client, int rank, any data){
2483
2484 if (!g_bRankBots && (!IsValidClient(client) || IsFakeClient(client)))
2485 return;
2486
2487 g_aPointsOnConnect[client] = RankMe_GetPoints(client);
2488
2489 g_aRankOnConnect[client] = rank;
2490
2491 char sClientName[MAX_NAME_LENGTH];
2492 GetClientName(client,sClientName,sizeof(sClientName));
2493
2494 /* Geoip, code from cksurf */
2495 char s_Country[32];
2496 char s_address[32];
2497 GetClientIP(client, s_address, 32);
2498 Format(s_Country, sizeof(s_Country), "Unknown");
2499 GeoipCountry(s_address, s_Country, sizeof(s_Country));
2500 // if(!strcmp(s_Country, NULL_STRING))
2501 if (s_Country[0] == 0)
2502 Format( s_Country, sizeof(s_Country), "Unknown", s_Country );
2503 else
2504 if( StrContains( s_Country, "United", false ) != -1 ||
2505 StrContains( s_Country, "Republic", false ) != -1 ||
2506 StrContains( s_Country, "Federation", false ) != -1 ||
2507 StrContains( s_Country, "Island", false ) != -1 ||
2508 StrContains( s_Country, "Netherlands", false ) != -1 ||
2509 StrContains( s_Country, "Isle", false ) != -1 ||
2510 StrContains( s_Country, "Bahamas", false ) != -1 ||
2511 StrContains( s_Country, "Maldives", false ) != -1 ||
2512 StrContains( s_Country, "Philippines", false ) != -1 ||
2513 StrContains( s_Country, "Vatican", false ) != -1 )
2514 {
2515 Format( s_Country, sizeof(s_Country), "The %s", s_Country );
2516 }
2517
2518 if(g_bAnnounceConnect){
2519
2520 if(g_bAnnounceConnectChat){
2521 CPrintToChatAll("%s %t",MSG,"PlayerJoinedChat",sClientName,g_aRankOnConnect[client],g_aPointsOnConnect[client],s_Country);
2522 }
2523
2524 if(g_bAnnounceConnectHint){
2525 PrintHintTextToAll("%t","PlayerJoinedHint",sClientName,g_aRankOnConnect[client],g_aPointsOnConnect[client],s_Country);
2526 }
2527
2528 }
2529
2530 if(g_bAnnounceTopConnect && rank <= g_AnnounceTopPosConnect){
2531
2532 if(g_bAnnounceTopConnectChat){
2533 CPrintToChatAll("%s %t",MSG,"TopPlayerJoinedChat",g_AnnounceTopPosConnect,sClientName,g_aRankOnConnect[client],s_Country);
2534 }
2535
2536 if(g_bAnnounceTopConnectHint){
2537 PrintHintTextToAll("%t","TopPlayerJoinedHint",g_AnnounceTopPosConnect,sClientName,g_aRankOnConnect[client],s_Country);
2538 }
2539 }
2540}
2541
2542public Action Event_PlayerDisconnect(Handle event, const char[] name, bool dontBroadcast)
2543{
2544 if(!g_bAnnounceDisconnect)
2545 return;
2546
2547 int client = GetClientOfUserId(GetEventInt(event, "userid"));
2548
2549 if (client <= 0 || client > MaxClients || !IsClientConnected(client) || !g_bRankBots)
2550 return;
2551
2552 char sName[MAX_NAME_LENGTH];
2553 GetClientName(client,sName,MAX_NAME_LENGTH);
2554 strcopy(g_sBufferClientName[client],MAX_NAME_LENGTH,sName);
2555
2556 g_aPointsOnDisconnect[client] = RankMe_GetPoints(client);
2557
2558 char disconnectReason[64];
2559 GetEventString(event, "reason", disconnectReason, sizeof(disconnectReason));
2560
2561 CPrintToChatAll("%s %t",MSG,"PlayerLeft",g_sBufferClientName[client], g_aPointsOnDisconnect[client], disconnectReason);
2562}
2563
2564/* Enable Or Disable Points In Warmup */
2565public void OnGameFrame()
2566{
2567 //If cvar disable
2568 if(!g_bGatherStatsWarmup)
2569 {
2570 //In Warmup
2571 if(GameRules_GetProp("m_bWarmupPeriod") == 1)
2572 {
2573 g_bGatherStats = false;
2574 }
2575
2576 //Not in warmup
2577 else
2578 {
2579 g_bGatherStats = true;
2580 }
2581 }
2582}
2583
2584/* Hide Chat */
2585public Action CMD_HideChat(int client, int args){
2586 if(!hidechat[client]){
2587 SetClientCookie(client, hidechatcookie, "1");
2588 CPrintToChat(client, "%s %t Hide Rankme Chat", MSG);
2589 hidechat[client] = true;
2590 }
2591 else if(hidechat[client]){
2592 SetClientCookie(client, hidechatcookie, "0");
2593 CPrintToChat(client, "%s %t Show Rankme Chat", MSG);
2594 hidechat[client] = false;
2595 }
2596}