· 8 years ago · Dec 18, 2017, 12:30 PM
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 //RankCallback callback = GetNativeFunction(2);
766 any data = GetNativeCell(3);
767
768 Handle pack = CreateDataPack();
769
770 WritePackCell(pack, client);
771 WritePackFunction(pack, GetNativeFunction(2));
772 //WritePackFunction(pack, callback);
773 WritePackCell(pack, data);
774 WritePackCell(pack, view_as<int>(plugin));
775
776 if(g_bRankCache)
777 {
778 GetClientRank(pack);
779 return;
780 }
781
782 char query[10000];
783 MakeSelectQuery(query, sizeof(query));
784
785 if (g_RankMode == 1)
786 Format(query, sizeof(query), "%s ORDER BY score DESC", query);
787 else if (g_RankMode == 2)
788 Format(query, sizeof(query), "%s ORDER BY CAST(CAST(kills as float)/CAST (deaths as float) as float) DESC", query);
789
790 SQL_TQuery(g_hStatsDb, SQL_GetRankCallback, query, pack);
791}
792
793void GetClientRank(Handle pack)
794{
795 ResetPack(pack);
796 int client = ReadPackCell(pack);
797 RankCallback callback = ReadPackFunction(pack);
798 any args = ReadPackCell(pack);
799 Handle plugin = ReadPackCell(pack);
800 CloseHandle(pack);
801
802 int rank;
803 switch(g_RankBy)
804 {
805 case 0:
806 {
807 char steamid[32];
808 GetClientAuthId(client, AuthId_Steam2, steamid, 32, true);
809 rank = FindStringInArray(g_arrayRankCache[0], steamid);
810 }
811 case 1:
812 {
813 char name[128];
814 GetClientName(client, name, 128);
815 rank = FindStringInArray(g_arrayRankCache[1], name);
816 }
817 case 2:
818 {
819 char ip[128];
820 GetClientIP(client, ip, 128);
821 rank = FindStringInArray(g_arrayRankCache[2], ip);
822 }
823 }
824
825 if(rank > 0)
826 CallRankCallback(client, rank, callback, args, plugin);
827 else
828 CallRankCallback(client, 0, callback, args, plugin);
829}
830
831public void SQL_GetRankCallback(Handle owner, Handle hndl, const char[] error, any data)
832{
833 Handle pack = data;
834 ResetPack(pack);
835 int client = ReadPackCell(pack);
836 RankCallback callback = ReadPackFunction(pack);
837 any args = ReadPackCell(pack);
838 Handle plugin = ReadPackCell(pack);
839 CloseHandle(pack);
840
841 if (hndl == INVALID_HANDLE)
842 {
843 LogError("[RankMe] Query Fail: %s", error);
844 CallRankCallback(0, 0, callback, 0, plugin);
845 return;
846 }
847 int i;
848 g_TotalPlayers = SQL_GetRowCount(hndl);
849
850 char Receive[64];
851
852 while (SQL_HasResultSet(hndl) && SQL_FetchRow(hndl))
853 {
854 i++;
855
856 if (g_RankBy == 0) {
857 SQL_FetchString(hndl, 1, Receive, sizeof(Receive));
858 if (StrEqual(Receive, g_aClientSteam[client], false))
859 {
860 CallRankCallback(client, i, callback, args, plugin);
861 break;
862 }
863 } else if (g_RankBy == 1) {
864 SQL_FetchString(hndl, 2, Receive, sizeof(Receive));
865 if (StrEqual(Receive, g_aClientName[client], false))
866 {
867 CallRankCallback(client, i, callback, args, plugin);
868 break;
869 }
870 } else if (g_RankBy == 2) {
871 SQL_FetchString(hndl, 3, Receive, sizeof(Receive));
872 if (StrEqual(Receive, g_aClientIp[client], false))
873 {
874 CallRankCallback(client, i, callback, args, plugin);
875 break;
876 }
877 }
878 }
879}
880
881void CallRankCallback(int client, int rank, RankCallback callback, any data, Handle plugin)
882{
883 Call_StartFunction(plugin, callback);
884 Call_PushCell(client);
885 Call_PushCell(rank);
886 Call_PushCell(data);
887 Call_Finish();
888 CloseHandle(plugin);
889}
890
891public int Native_GetPoints(Handle plugin, int numParams)
892{
893 int Client = GetNativeCell(1);
894 return g_aStats[Client][SCORE];
895}
896
897public int Native_GetStats(Handle plugin, int numParams)
898{
899 int iClient = GetNativeCell(1);
900 int array[20];
901 for (int i = 0; i < 20; i++)
902 array[i] = g_aStats[iClient][i];
903
904 SetNativeArray(2, array, 20);
905}
906
907public int Native_GetSession(Handle plugin, int numParams)
908{
909 int iClient = GetNativeCell(1);
910 int array[20];
911 for (int i = 0; i < 20; i++)
912 array[i] = g_aSession[iClient][i];
913
914 SetNativeArray(2, array, 20);
915}
916
917public int Native_GetWeaponStats(Handle plugin, int numParams)
918{
919 int iClient = GetNativeCell(1);
920 int array[40];
921 for (int i = 0; i < 40; i++)
922 array[i] = g_aWeapons[iClient][i];
923
924 SetNativeArray(2, array, 40);
925}
926
927public int Native_GetHitbox(Handle plugin, int numParams)
928{
929 int iClient = GetNativeCell(1);
930 int array[8];
931 for (int i = 0; i < 8; i++)
932 array[i] = g_aHitBox[iClient][i];
933
934 SetNativeArray(2, array, 8);
935}
936
937public void DumpDB() {
938 if (!g_bDumpDB || g_bMysql)
939 return;
940 char sQuery[1000];
941 FormatEx(sQuery, sizeof(sQuery), "SELECT * from `%s`", g_sSQLTable);
942 SQL_TQuery(g_hStatsDb, SQL_DumpCallback, sQuery);
943}
944
945public Action OnClientChangeName(Handle event, const char[] name, bool dontBroadcast)
946{
947 if (!g_bEnabled)
948 return Plugin_Continue;
949 int client = GetClientOfUserId(GetEventInt(event, "userid"));
950 if (!g_bRankBots && (!IsValidClient(client) || IsFakeClient(client)))
951 return Plugin_Continue;
952 if (IsClientConnected(client))
953 {
954 char clientnewname[MAX_NAME_LENGTH];
955 GetEventString(event, "newname", clientnewname, sizeof(clientnewname));
956 if (client == g_C4PlantedBy)
957 strcopy(g_sC4PlantedByName, sizeof(g_sC4PlantedByName), clientnewname);
958 char Eclientnewname[MAX_NAME_LENGTH * 2 + 1];
959 SQL_EscapeString(g_hStatsDb, clientnewname, Eclientnewname, sizeof(Eclientnewname));
960
961 //ReplaceString(clientnewname, sizeof(clientnewname), "'", "");
962 char query[10000];
963 if (g_RankBy == 1) {
964 OnDB[client] = false;
965 for (int i = 0; i <= 19; i++) {
966 g_aSession[client][i] = 0;
967 g_aStats[client][i] = 0;
968 }
969 g_aStats[client][SCORE] = g_PointsStart;
970 for (int i = 0; i <= 39; i++) {
971 g_aWeapons[client][i] = 0;
972 }
973 g_aSession[client][CONNECTED] = GetTime();
974
975 strcopy(g_aClientName[client], MAX_NAME_LENGTH, clientnewname);
976
977 Format(query, sizeof(query), g_sSqlRetrieveClientName, g_sSQLTable, Eclientnewname);
978 if (DEBUGGING) {
979 PrintToServer(query);
980 LogError("%s", query);
981 }
982 SQL_TQuery(g_hStatsDb, SQL_LoadPlayerCallback, query, client);
983
984 } else {
985
986 if (g_RankBy == 0)
987 Format(query, sizeof(query), "UPDATE `%s` SET name='%s' WHERE steam = '%s';", g_sSQLTable, Eclientnewname, g_aClientSteam[client]);
988 else
989 Format(query, sizeof(query), "UPDATE `%s` SET name='%s' WHERE lastip = '%s';", g_sSQLTable, Eclientnewname, g_aClientIp[client]);
990
991 SQL_TQuery(g_hStatsDb, SQL_NothingCallback, query);
992 }
993 }
994 return Plugin_Continue;
995}
996
997// Code made by Antithasys
998public Action OnSayText(int client, const char[] command, int argc)
999{
1000 if (!g_bEnabled || !g_bChatTriggers || client == SENDER_WORLD || IsChatTrigger())
1001 { // Don't parse if plugin is disabled or if is from the console or a chat trigger (e.g: ! or /)
1002 return Plugin_Continue;
1003 }
1004
1005 char cpMessage[256];
1006 char sWords[64][256];
1007 GetCmdArgString(cpMessage, sizeof(cpMessage)); // Get the message
1008 StripQuotes(cpMessage); // Text come inside quotes
1009 //ReplaceString(cpMessage,sizeof(cpMessage),"\"","");
1010 ExplodeString(cpMessage, " ", sWords, sizeof(sWords), sizeof(sWords[])); // Explode it for use at top, topknife, topnade and topweapon
1011
1012 // Proccess the text
1013 if (StrEqual(cpMessage, "rank", false))
1014 {
1015 //LogToFile("rankme.debug.log","\"rank\" chat hook called by client %d.",client);
1016 CMD_Rank(client, 0);
1017 }
1018 else if (StrEqual(cpMessage, "statsme", false))
1019 {
1020 CMD_StatsMe(client, 0);
1021 }
1022 else if (StrEqual(cpMessage, "hitboxme", false))
1023 {
1024 CMD_HitBox(client, 0);
1025 }
1026 else if (StrEqual(cpMessage, "weaponme", false))
1027 {
1028 CMD_WeaponMe(client, 0);
1029 }
1030 else if (StrEqual(cpMessage, "session", false))
1031 {
1032 CMD_Session(client, 0);
1033 }
1034 else if (StrEqual(cpMessage[0], "next", false))
1035 {
1036 CMD_Next(client, 0);
1037 }
1038 else if (StrContains(sWords[0], "toptk", false) == 0)
1039 {
1040 CMD_TopTK(client, 0);
1041 }
1042 else if (StrContains(sWords[0], "topmvp", false) == 0)
1043 {
1044 CMD_TopMVP(client, 0);
1045 }
1046 else if (StrContains(sWords[0], "topdamage", false) == 0)
1047 {
1048 CMD_TopDamage(client, 0);
1049 }
1050
1051 /*
1052 else if (StrContains(sWords[0], "topknife", false) == 0)
1053 {
1054 if (strcmp(cpMessage, "topknife") == 0)
1055 {
1056 ShowTOPKnife(client, 0);
1057 }
1058 else
1059 {
1060 ShowTOPKnife(client, StringToInt(cpMessage[8]));
1061 }
1062 }
1063 else if (StrContains(sWords[0], "toptaser", false) == 0)
1064 {
1065 if (strcmp(cpMessage, "toptaser") == 0)
1066 {
1067 ShowTOPTaser(client, 0);
1068 }
1069 else
1070 {
1071 ShowTOPTaser(client, StringToInt(cpMessage[8]));
1072 }
1073 }
1074 else if (StrContains(sWords[0], "topnade", false) == 0)
1075 {
1076 if (strcmp(cpMessage, "topnade") == 0)
1077 {
1078 ShowTOPNade(client, 0);
1079 }
1080 else
1081 {
1082 ShowTOPNade(client, StringToInt(cpMessage[7]));
1083 }
1084 }
1085 */
1086
1087 else if (StrContains(sWords[0], "tophs", false) == 0)
1088 {
1089 if (strcmp(cpMessage, "tophs") == 0)
1090 {
1091 ShowTopHS(client, 0);
1092 }
1093 else
1094 {
1095 ShowTopHS(client, StringToInt(cpMessage[7]));
1096 }
1097 }
1098 else if (StrContains(sWords[0], "topkills", false) == 0)
1099 {
1100 if (strcmp(cpMessage, "topkills") == 0)
1101 {
1102 ShowTopKills(client, 0);
1103 }
1104 else
1105 {
1106 ShowTopKills(client, StringToInt(cpMessage[7]));
1107 }
1108 }
1109 else if (StrContains(sWords[0], "topdeaths", false) == 0)
1110 {
1111 if (strcmp(cpMessage, "topdeaths") == 0)
1112 {
1113 ShowTopDeaths(client, 0);
1114 }
1115 else
1116 {
1117 ShowTopDeaths(client, StringToInt(cpMessage[7]));
1118 }
1119 }
1120 else if (StrContains(sWords[0], "topassists", false) == 0)
1121 {
1122 if (strcmp(cpMessage, "topassists") == 0)
1123 {
1124 ShowTopAssists(client, 0);
1125 }
1126 else
1127 {
1128 ShowTopAssists(client, StringToInt(cpMessage[7]));
1129 }
1130 }
1131 else if (StrContains(sWords[0], "topacc", false) == 0)
1132 {
1133 if (strcmp(cpMessage, "topacc") == 0)
1134 {
1135 ShowTopAcc(client, 0);
1136 }
1137 else
1138 {
1139 ShowTopAcc(client, StringToInt(cpMessage[7]));
1140 }
1141 }
1142 else if (StrContains(sWords[0], "toptime", false) == 0)
1143 {
1144 if (strcmp(cpMessage, "toptime") == 0)
1145 {
1146 ShowTopTime(client, 0);
1147 }
1148 else
1149 {
1150 ShowTopTime(client, StringToInt(cpMessage[7]));
1151 }
1152 }
1153 else if (StrContains(sWords[0], "topweapon", false) == 0)
1154 {
1155 if (strcmp(cpMessage, "topweapon") == 0)
1156 {
1157 CMD_TopWeapon(client, 0); // Build the menu on the next frame
1158 }
1159 else
1160 {
1161 if (GetWeaponNum(sWords[1]) == 30)
1162 {
1163 CMD_TopWeapon(client, 0);
1164 }
1165 else
1166 {
1167 ShowTOPWeapon(client, GetWeaponNum(sWords[1]), StringToInt(sWords[2]));
1168 }
1169 }
1170 }
1171 else if (StrContains(sWords[0], "top", false) == 0)
1172 {
1173 if (strcmp(cpMessage, "top") == 0)
1174 {
1175 ShowTOP(client, 0);
1176 }
1177 else
1178 {
1179 ShowTOP(client, StringToInt(cpMessage[3]));
1180 }
1181 }
1182 return Plugin_Continue;
1183}
1184
1185public void GetCurrentPlayers() {
1186 int count;
1187 for (int i = 1; i <= MaxClients; i++) {
1188 if (IsClientInGame(i) && (!IsFakeClient(i) || g_bRankBots)) {
1189 count++;
1190 }
1191 }
1192 return count;
1193}
1194
1195public void OnPluginEnd() {
1196 if (!g_bEnabled)
1197 return;
1198 SQL_LockDatabase(g_hStatsDb);
1199 for (int client = 1; client <= MaxClients; client++) {
1200 if (IsClientInGame(client)) {
1201 if (!g_bRankBots && (!IsValidClient(client) || IsFakeClient(client)))
1202 return;
1203 char name[MAX_NAME_LENGTH];
1204 GetClientName(client, name, sizeof(name));
1205 char sEscapeName[MAX_NAME_LENGTH * 2 + 1];
1206 SQL_EscapeString(g_hStatsDb, name, sEscapeName, sizeof(sEscapeName));
1207
1208 // Make SQL-safe
1209 //ReplaceString(name, sizeof(name), "'", "");
1210
1211
1212 char weapons_query[1000] = "";
1213 for (int i = 0; i <= 39; i++) {
1214 Format(weapons_query, sizeof(weapons_query), "%s,%s='%d'", weapons_query, g_sWeaponsNamesGame[i], g_aWeapons[client][i]);
1215 }
1216
1217 // Old query
1218 /*
1219 new String:query[2000];
1220 if (g_RankBy == 1) {
1221 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],
1222 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,
1223 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);
1224 } else if (g_RankBy == 0) {
1225 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],
1226 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,
1227 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]);
1228 } else if (g_RankBy == 2) {
1229 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],
1230 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,
1231 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]);
1232 }
1233 */
1234
1235 /* SM1.9 Fix */
1236 char query[2000];
1237 char query2[2000];
1238
1239 if (g_RankBy == 0)
1240 {
1241 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],
1242 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,
1243 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]);
1244
1245 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],
1246 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]);
1247 }
1248
1249 else if (g_RankBy == 1)
1250 {
1251 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],
1252 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,
1253 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);
1254
1255 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],
1256 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);
1257 }
1258
1259 else if (g_RankBy == 2)
1260 {
1261 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],
1262 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,
1263 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]);
1264
1265 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],
1266 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]);
1267 }
1268
1269 SQL_FastQuery(g_hStatsDb, query);
1270 SQL_FastQuery(g_hStatsDb, query2);
1271
1272 /**
1273 Start the forward OnPlayerSaved
1274 */
1275 Action fResult;
1276 Call_StartForward(g_fwdOnPlayerSaved);
1277 Call_PushCell(client);
1278 int fError = Call_Finish(fResult);
1279
1280 if (fError != SP_ERROR_NONE)
1281 {
1282 ThrowNativeError(fError, "Forward failed");
1283 }
1284 }
1285 }
1286 SQL_UnlockDatabase(g_hStatsDb);
1287}
1288
1289public int GetWeaponNum(char[] weaponname) {
1290
1291
1292 for (int i = 0; i <= 39; i++) {
1293 if (StrEqual(weaponname, g_sWeaponsNamesGame[i]))
1294 return i;
1295 }
1296 return 39;
1297}
1298
1299public Action Event_VipEscaped(Handle event, const char[] name, bool dontBroadcast) {
1300 if (!g_bEnabled || !g_bGatherStats || g_MinimumPlayers > GetCurrentPlayers())
1301 return;
1302 int client = GetClientOfUserId(GetEventInt(event, "userid"));
1303
1304 for (int i = 1; i <= MaxClients; i++) {
1305
1306 if (IsClientInGame(i) && GetClientTeam(i) == CT) {
1307 g_aStats[i][SCORE] += g_PointsVipEscapedTeam;
1308 g_aSession[i][SCORE] += g_PointsVipEscapedTeam;
1309
1310 }
1311
1312 }
1313 g_aStats[client][VIP_PLAYED]++;
1314 g_aSession[client][VIP_PLAYED]++;
1315 g_aStats[client][VIP_ESCAPED]++;
1316 g_aSession[client][VIP_ESCAPED]++;
1317 g_aStats[client][SCORE] += g_PointsVipEscapedPlayer;
1318 g_aSession[client][SCORE] += g_PointsVipEscapedPlayer;
1319
1320 if (!g_bChatChange)
1321 return;
1322 for (int i = 1; i <= MaxClients; i++)
1323 if (IsClientInGame(i))
1324 if(!hidechat[i]) CPrintToChat(i, "%s %t", MSG, "CT_VIPEscaped", g_PointsVipEscapedTeam);
1325 if (client != 0 && (g_bRankBots && !IsFakeClient(client)))
1326 for (int i = 1; i <= MaxClients; i++)
1327 if (IsClientInGame(i))
1328 if(!hidechat[i]) CPrintToChat(i, "%s %t", MSG, "VIPEscaped", g_aClientName[client], g_aStats[client][SCORE], g_PointsVipEscapedTeam + g_PointsVipEscapedPlayer);
1329}
1330
1331public Action Event_VipKilled(Handle event, const char[] name, bool dontBroadcast) {
1332 if (!g_bEnabled || !g_bGatherStats || g_MinimumPlayers > GetCurrentPlayers())
1333 return;
1334 int client = GetClientOfUserId(GetEventInt(event, "userid"));
1335 int killer = GetClientOfUserId(GetEventInt(event, "attacker"));
1336
1337 for (int i = 1; i <= MaxClients; i++) {
1338
1339 if (IsClientInGame(i) && GetClientTeam(i) == TR) {
1340 g_aStats[i][SCORE] += g_PointsVipKilledTeam;
1341 g_aSession[i][SCORE] += g_PointsVipKilledTeam;
1342
1343 }
1344
1345 }
1346 g_aStats[client][VIP_PLAYED]++;
1347 g_aSession[client][VIP_PLAYED]++;
1348 g_aStats[killer][VIP_KILLED]++;
1349 g_aSession[killer][VIP_KILLED]++;
1350 g_aStats[killer][SCORE] += g_PointsVipKilledPlayer;
1351 g_aSession[killer][SCORE] += g_PointsVipKilledPlayer;
1352
1353 if (!g_bChatChange)
1354 return;
1355 for (int i = 1; i <= MaxClients; i++)
1356 if (IsClientInGame(i))
1357 if(!hidechat[i]) CPrintToChat(i, "%s %t", MSG, "TR_VIPKilled", g_PointsVipKilledTeam);
1358 if (client != 0 && (g_bRankBots && !IsFakeClient(client)))
1359 for (int i = 1; i <= MaxClients; i++)
1360 if (IsClientInGame(i))
1361 if(!hidechat[i]) CPrintToChat(i, "%s %t", MSG, "VIPKilled", g_aClientName[client], g_aStats[client][SCORE], g_PointsVipKilledTeam + g_PointsVipKilledPlayer);
1362}
1363
1364public Action Event_HostageRescued(Handle event, const char[] name, bool dontBroadcast) {
1365 if (!g_bEnabled || !g_bGatherStats || g_MinimumPlayers > GetCurrentPlayers())
1366 return;
1367 int client = GetClientOfUserId(GetEventInt(event, "userid"));
1368
1369
1370 for (int i = 1; i <= MaxClients; i++) {
1371
1372 if (IsClientInGame(i) && GetClientTeam(i) == CT) {
1373 g_aStats[i][SCORE] += g_PointsHostageRescTeam;
1374 g_aSession[i][SCORE] += g_PointsHostageRescTeam;
1375
1376 }
1377
1378 }
1379 g_aSession[client][HOSTAGES_RESCUED]++;
1380 g_aStats[client][HOSTAGES_RESCUED]++;
1381 g_aStats[client][SCORE] += g_PointsHostageRescPlayer;
1382 g_aSession[client][SCORE] += g_PointsHostageRescPlayer;
1383
1384 if (!g_bChatChange)
1385 return;
1386 if (g_PointsHostageRescTeam > 0)
1387 for (int i = 1; i <= MaxClients; i++)
1388 if (IsClientInGame(i))
1389 if(!hidechat[i]) CPrintToChat(i, "%s %t", MSG, "CT_Hostage", g_PointsHostageRescTeam);
1390
1391 if (g_PointsHostageRescPlayer > 0 && client != 0 && (g_bRankBots && !IsFakeClient(client)))
1392 for (int i = 1; i <= MaxClients; i++)
1393 if (IsClientInGame(i))
1394 if(!hidechat[i]) CPrintToChat(i, "%s %t", MSG, "Hostage", g_aClientName[client], g_aStats[client][SCORE], g_PointsHostageRescPlayer + g_PointsHostageRescTeam);
1395
1396}
1397
1398public Action Event_RoundMVP(Handle event, const char[] name, bool dontBroadcast) {
1399 if (!g_bEnabled || !g_bGatherStats || g_MinimumPlayers > GetCurrentPlayers())
1400 return;
1401
1402 int client = GetClientOfUserId(GetEventInt(event, "userid"));
1403 if (!IsClientInGame(client))
1404 return;
1405 int team = GetClientTeam(client);
1406
1407 if (((team == 2 && g_PointsMvpTr > 0) || (team == 3 && g_PointsMvpCt > 0)) && client != 0 && (g_bRankBots && !IsFakeClient(client))) {
1408
1409 if (team == 2) {
1410
1411 g_aStats[client][SCORE] += g_PointsMvpTr;
1412 g_aSession[client][SCORE] += g_PointsMvpTr;
1413 for (int i = 1; i <= MaxClients; i++)
1414 if (IsClientInGame(i))
1415 if(!hidechat[i]) CPrintToChat(i, "%s %t", MSG, "MVP", g_aClientName[client], g_aStats[client][SCORE], g_PointsMvpTr);
1416
1417 } else {
1418
1419 g_aStats[client][SCORE] += g_PointsMvpCt;
1420 g_aSession[client][SCORE] += g_PointsMvpCt;
1421 for (int i = 1; i <= MaxClients; i++)
1422 if (IsClientInGame(i))
1423 if(!hidechat[i]) CPrintToChat(i, "%s %t", MSG, "MVP", g_aClientName[client], g_aStats[client][SCORE], g_PointsMvpCt);
1424 }
1425 }
1426 g_aStats[client][MVP]++;
1427 g_aSession[client][MVP]++;
1428}
1429public Action Event_RoundEnd(Handle event, const char[] name, bool dontBroadcast) {
1430 if (!g_bEnabled || !g_bGatherStats || g_MinimumPlayers > GetCurrentPlayers())
1431 return;
1432 int i;
1433 int Winner = GetEventInt(event, "winner");
1434 bool announced = false;
1435 for (i = 1; i <= MaxClients; i++)
1436 {
1437 if (IsClientInGame(i) && (g_bRankBots || !IsFakeClient(i))) {
1438 if (Winner == TR && GetClientTeam(i) == TR) {
1439 g_aSession[i][TR_WIN]++;
1440 g_aStats[i][TR_WIN]++;
1441 if (g_PointsRoundWin[TR] > 0 && IsPlayerAlive(i)) {
1442 g_aSession[i][SCORE] += g_PointsRoundWin[TR];
1443 g_aStats[i][SCORE] += g_PointsRoundWin[TR];
1444 if (!announced && g_bChatChange) {
1445 for (int j = 1; j <= MaxClients; j++)
1446 if (IsClientInGame(j))
1447 if(!hidechat[j]) CPrintToChat(j, "%s %t", MSG, "TR_Round", g_PointsRoundWin[TR]);
1448 announced = true;
1449 }
1450 }
1451 } else if (Winner == CT && GetClientTeam(i) == CT) {
1452 g_aSession[i][CT_WIN]++;
1453 g_aStats[i][CT_WIN]++;
1454 if (g_PointsRoundWin[CT] > 0 && IsPlayerAlive(i)) {
1455 g_aSession[i][SCORE] += g_PointsRoundWin[CT];
1456 g_aStats[i][SCORE] += g_PointsRoundWin[CT];
1457 if (!announced && g_bChatChange) {
1458 for (int j = 1; j <= MaxClients; j++)
1459 if (IsClientInGame(j))
1460 if(!hidechat[j]) CPrintToChat(j, "%s %t", MSG, "CT_Round", g_PointsRoundWin[CT]);
1461 announced = true;
1462 }
1463 }
1464 }
1465 SalvarPlayer(i);
1466 }
1467 }
1468
1469 DumpDB();
1470}
1471
1472
1473public void EventPlayerSpawn(Handle event, const char[] name, bool dontBroadcast)
1474{
1475 /* Old rounds played, this have been moved to round start.
1476 if (!g_bEnabled || !g_bGatherStats || g_MinimumPlayers > GetCurrentPlayers())
1477 return;
1478
1479 new client = GetClientOfUserId(GetEventInt(event, "userid"));
1480 if (!g_bRankBots && IsFakeClient(client))
1481 return;
1482 if (GetClientTeam(client) == TR) {
1483 g_aStats[client][ROUNDS_TR]++;
1484 g_aSession[client][ROUNDS_TR]++;
1485 } else if (GetClientTeam(client) == CT) {
1486 g_aStats[client][ROUNDS_CT]++;
1487 g_aSession[client][ROUNDS_CT]++;
1488 }
1489 */
1490}
1491
1492
1493public void Event_RoundStart(Handle event, const char[] name, bool dontBroadcast)
1494{
1495 if (!g_bEnabled || !g_bGatherStats || g_MinimumPlayers > GetCurrentPlayers())
1496 return;
1497
1498 int i;
1499 for(i=1;i<=MaxClients;i++)
1500 {
1501 if (IsClientInGame(i) && GetClientTeam(i) == TR)
1502 {
1503 g_aStats[i][ROUNDS_TR]++;
1504 g_aSession[i][ROUNDS_TR]++;
1505 }
1506 else if (IsClientInGame(i) && GetClientTeam(i) == CT)
1507 {
1508 g_aStats[i][ROUNDS_CT]++;
1509 g_aSession[i][ROUNDS_CT]++;
1510 }
1511 }
1512}
1513
1514public Action Event_BombPlanted(Handle event, const char[] name, bool dontBroadcast)
1515{
1516 if (!g_bEnabled || !g_bGatherStats || g_MinimumPlayers > GetCurrentPlayers())
1517 return;
1518
1519 int client = GetClientOfUserId(GetEventInt(event, "userid"));
1520
1521 g_C4PlantedBy = client;
1522
1523 for (int i = 1; i <= MaxClients; i++) {
1524
1525 if (IsClientInGame(i) && GetClientTeam(i) == TR) {
1526 g_aStats[i][SCORE] += g_PointsBombPlantedTeam;
1527 g_aSession[i][SCORE] += g_PointsBombPlantedTeam;
1528
1529 }
1530
1531 }
1532 g_aStats[client][C4_PLANTED]++;
1533 g_aSession[client][C4_PLANTED]++;
1534 g_aStats[client][SCORE] += g_PointsBombPlantedPlayer;
1535 g_aSession[client][SCORE] += g_PointsBombPlantedPlayer;
1536
1537 strcopy(g_sC4PlantedByName, sizeof(g_sC4PlantedByName), g_aClientName[client]);
1538 if (!g_bChatChange)
1539 return;
1540 if (g_PointsBombPlantedTeam > 0)
1541 for (int i = 1; i <= MaxClients; i++)
1542 if (IsClientInGame(i))
1543 if(!hidechat[i]) CPrintToChat(i, "%s %t", MSG, "TR_Planting", g_PointsBombPlantedTeam);
1544 if (g_PointsBombPlantedPlayer > 0 && client != 0 && (g_bRankBots || !IsFakeClient(client)))
1545 for (int i = 1; i <= MaxClients; i++)
1546 if (IsClientInGame(i))
1547 if(!hidechat[i]) CPrintToChat(i, "%s %t", MSG, "Planting", g_aClientName[client], g_aStats[client][SCORE], g_PointsBombPlantedTeam + g_PointsBombPlantedPlayer);
1548
1549}
1550
1551public Action Event_BombDefused(Handle event, const char[] name, bool dontBroadcast)
1552{
1553 if (!g_bEnabled || !g_bGatherStats || g_MinimumPlayers > GetCurrentPlayers())
1554 return;
1555 int client = GetClientOfUserId(GetEventInt(event, "userid"));
1556
1557 for (int i = 1; i <= MaxClients; i++) {
1558
1559 if (IsClientInGame(i) && GetClientTeam(i) == CT) {
1560 g_aStats[i][SCORE] += g_PointsBombDefusedTeam;
1561 g_aSession[i][SCORE] += g_PointsBombDefusedTeam;
1562
1563 }
1564
1565 }
1566 g_aStats[client][C4_DEFUSED]++;
1567 g_aSession[client][C4_DEFUSED]++;
1568 g_aStats[client][SCORE] += g_PointsBombDefusedPlayer;
1569 g_aSession[client][SCORE] += g_PointsBombDefusedPlayer;
1570
1571 if (!g_bChatChange)
1572 return;
1573 if (g_PointsBombDefusedTeam > 0)
1574 for (int i = 1; i <= MaxClients; i++)
1575 if (IsClientInGame(i))
1576 if(!hidechat[i]) CPrintToChat(i, "%s %t", MSG, "CT_Defusing", g_PointsBombDefusedTeam);
1577 if (g_PointsBombDefusedPlayer > 0 && client != 0 && (g_bRankBots || !IsFakeClient(client)))
1578 for (int i = 1; i <= MaxClients; i++)
1579 if (IsClientInGame(i))
1580 if(!hidechat[i]) CPrintToChat(i, "%s %t", MSG, "Defusing", g_aClientName[client], g_aStats[client][SCORE], g_PointsBombDefusedTeam + g_PointsBombDefusedPlayer);
1581}
1582
1583public Action Event_BombExploded(Handle event, const char[] name, bool dontBroadcast)
1584{
1585 if (!g_bEnabled || !g_bGatherStats || g_MinimumPlayers > GetCurrentPlayers())
1586 return;
1587
1588 int client = g_C4PlantedBy;
1589
1590 if (!g_bRankBots && (!IsValidClient(client) || IsFakeClient(client)))
1591 return;
1592
1593 for (int i = 1; i <= MaxClients; i++) {
1594
1595 if (IsClientInGame(i) && GetClientTeam(i) == TR) {
1596 g_aStats[i][SCORE] += g_PointsBombExplodeTeam;
1597 g_aSession[i][SCORE] += g_PointsBombExplodeTeam;
1598
1599 }
1600
1601 }
1602 g_aStats[client][C4_EXPLODED]++;
1603 g_aSession[client][C4_EXPLODED]++;
1604 g_aStats[client][SCORE] += g_PointsBombExplodePlayer;
1605 g_aSession[client][SCORE] += g_PointsBombExplodePlayer;
1606
1607 if (!g_bChatChange)
1608 return;
1609 if (g_PointsBombExplodeTeam > 0)
1610 for (int i = 1; i <= MaxClients; i++)
1611 if (IsClientInGame(i))
1612 if(!hidechat[i]) CPrintToChat(i, "%s %t", MSG, "TR_Exploding", g_PointsBombExplodeTeam);
1613 if (g_PointsBombExplodePlayer > 0 && client != 0 && (g_bRankBots || !IsFakeClient(client)))
1614 for (int i = 1; i <= MaxClients; i++)
1615 if (IsClientInGame(i))
1616 if(!hidechat[i]) CPrintToChat(i, "%s %t", MSG, "Exploding", g_sC4PlantedByName, g_aStats[client][SCORE], g_PointsBombExplodeTeam + g_PointsBombExplodePlayer);
1617}
1618
1619public Action Event_BombPickup(Handle event, const char[] name, bool dontBroadcast)
1620{
1621 if (!g_bEnabled || !g_bGatherStats || g_MinimumPlayers > GetCurrentPlayers())
1622 return;
1623
1624 int client = GetClientOfUserId(GetEventInt(event, "userid"));
1625
1626 g_aStats[client][SCORE] += g_PointsBombPickup;
1627 g_aSession[client][SCORE] += g_PointsBombPickup;
1628
1629 if (!g_bChatChange)
1630 return;
1631 if (g_PointsBombPickup > 0)
1632 if(!hidechat[client]) CPrintToChat(client, "%s %t", MSG, "BombPickup", g_aClientName[client], g_aStats[client][SCORE], g_PointsBombPickup);
1633
1634}
1635
1636public Action Event_BombDropped(Handle event, const char[] name, bool dontBroadcast)
1637{
1638 if (!g_bEnabled || !g_bGatherStats || g_MinimumPlayers > GetCurrentPlayers())
1639 return;
1640
1641 int client = GetClientOfUserId(GetEventInt(event, "userid"));
1642
1643 g_aStats[client][SCORE] -= g_PointsBombDropped;
1644 g_aSession[client][SCORE] -= g_PointsBombDropped;
1645
1646 if (!g_bChatChange)
1647 return;
1648 if (g_PointsBombDropped > 0 && client == 0)
1649 if(!hidechat[client]) CPrintToChat(client, "%s %t", MSG, "BombDropped", g_aClientName[client], g_aStats[client][SCORE], g_PointsBombDropped);
1650
1651}
1652
1653public Action EventPlayerDeath(Handle event, const char name[], bool dontBroadcast)
1654// ----------------------------------------------------------------------------
1655{
1656 if (!g_bEnabled || !g_bGatherStats || g_MinimumPlayers > GetCurrentPlayers())
1657 return;
1658
1659 int victim = GetClientOfUserId(GetEventInt(event, "userid"));
1660 int attacker = GetClientOfUserId(GetEventInt(event, "attacker"));
1661 int assist = GetClientOfUserId(GetEventInt(event, "assister"));
1662
1663 if (!g_bRankBots && attacker != 0 && (IsFakeClient(victim) || IsFakeClient(attacker)))
1664 return;
1665
1666 if (victim == attacker || attacker == 0) {
1667 g_aStats[victim][SUICIDES]++;
1668 g_aSession[victim][SUICIDES]++;
1669 g_aStats[victim][SCORE] -= g_PointsLoseSuicide;
1670 g_aSession[victim][SCORE] -= g_PointsLoseSuicide;
1671
1672 /* Min points */
1673 if (g_bPointsMinEnabled)
1674 {
1675 if (g_aStats[victim][SCORE] < g_PointsMin)
1676 {
1677 g_aStats[victim][SCORE] = g_PointsMin;
1678 }
1679 }
1680
1681 if (g_PointsLoseSuicide > 0 && g_bChatChange) {
1682 if(!hidechat[victim]) CPrintToChat(victim, "%s %t", MSG, "LostSuicide", g_aClientName[victim], g_aStats[victim][SCORE], g_PointsLoseSuicide);
1683 }
1684
1685 } else if (!g_bFfa && (GetClientTeam(victim) == GetClientTeam(attacker))) {
1686 if (attacker < MAXPLAYERS) {
1687 g_aStats[attacker][TK]++;
1688 g_aSession[attacker][TK]++;
1689 g_aStats[attacker][SCORE] -= g_PointsLoseTk;
1690 g_aSession[attacker][SCORE] -= g_PointsLoseTk;
1691
1692 /* Min points */
1693 if (g_bPointsMinEnabled)
1694 {
1695 if (g_aStats[victim][SCORE] < g_PointsMin)
1696 {
1697 g_aStats[victim][SCORE] = g_PointsMin;
1698 }
1699 }
1700
1701 if (g_PointsLoseTk > 0 && g_bChatChange) {
1702 if(!hidechat[victim]) CPrintToChat(victim, "%s %t", MSG, "LostTK", g_aClientName[attacker], g_aStats[attacker][SCORE], g_PointsLoseTk, g_aClientName[victim]);
1703 if(!hidechat[attacker]) CPrintToChat(attacker, "%s %t", MSG, "LostTK", g_aClientName[attacker], g_aStats[attacker][SCORE], g_PointsLoseTk, g_aClientName[victim]);
1704 }
1705 }
1706 } else {
1707 int team = GetClientTeam(attacker);
1708 bool headshot = GetEventBool(event, "headshot");
1709 char weapon[64];
1710 GetEventString(event, "weapon", weapon, sizeof(weapon));
1711 ReplaceString(weapon, sizeof(weapon), "weapon_", "");
1712
1713 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")) {
1714 weapon = "knife";
1715 }
1716
1717 int score_dif;
1718 if (attacker < MAXPLAYERS)
1719 score_dif = g_aStats[victim][SCORE] - g_aStats[attacker][SCORE];
1720
1721 if (score_dif < 0 || attacker >= MAXPLAYERS) {
1722 score_dif = g_PointsKill[team];
1723 } else {
1724 if (g_PointsKillBonusDif[team] == 0)
1725 score_dif = g_PointsKill[team] + ((g_aStats[victim][SCORE] - g_aStats[attacker][SCORE]) * g_PointsKillBonus[team]);
1726 else
1727 score_dif = g_PointsKill[team] + (((g_aStats[victim][SCORE] - g_aStats[attacker][SCORE]) / g_PointsKillBonusDif[team]) * g_PointsKillBonus[team]);
1728 }
1729 if (StrEqual(weapon, "knife")) {
1730 score_dif = RoundToCeil(score_dif * g_fPointsKnifeMultiplier);
1731 }
1732 else if (StrEqual(weapon, "taser")) {
1733 score_dif = RoundToCeil(score_dif * g_fPointsTaserMultiplier);
1734 }
1735 if (headshot && attacker < MAXPLAYERS) {
1736 g_aStats[attacker][HEADSHOTS]++;
1737 g_aSession[attacker][HEADSHOTS]++;
1738 }
1739
1740 g_aStats[victim][DEATHS]++;
1741 g_aSession[victim][DEATHS]++;
1742 if (attacker < MAXPLAYERS) {
1743 g_aStats[attacker][KILLS]++;
1744 g_aSession[attacker][KILLS]++;
1745 }
1746 if (g_bPointsLoseRoundCeil)
1747 {
1748 g_aStats[victim][SCORE] -= RoundToCeil(score_dif * g_fPercentPointsLose);
1749 g_aSession[victim][SCORE] -= RoundToCeil(score_dif * g_fPercentPointsLose);
1750
1751 /* Min points */
1752 if (g_bPointsMinEnabled)
1753 {
1754 if (g_aStats[victim][SCORE] < g_PointsMin)
1755 {
1756 g_aStats[victim][SCORE] = g_PointsMin;
1757 }
1758 }
1759
1760 }
1761 else
1762 {
1763 g_aStats[victim][SCORE] -= RoundToFloor(score_dif * g_fPercentPointsLose);
1764 g_aSession[victim][SCORE] -= RoundToFloor(score_dif * g_fPercentPointsLose);
1765
1766 /* Min points */
1767 if (g_bPointsMinEnabled)
1768 {
1769 if (g_aStats[victim][SCORE] < g_PointsMin)
1770 {
1771 g_aStats[victim][SCORE] = g_PointsMin;
1772 }
1773 }
1774 }
1775 if (attacker < MAXPLAYERS) {
1776 g_aStats[attacker][SCORE] += score_dif;
1777 g_aSession[attacker][SCORE] += score_dif;
1778 if (GetWeaponNum(weapon) < 40)
1779 g_aWeapons[attacker][GetWeaponNum(weapon)]++;
1780 }
1781
1782 if (g_MinimalKills == 0 || (g_aStats[victim][KILLS] >= g_MinimalKills && g_aStats[attacker][KILLS] >= g_MinimalKills)) {
1783 if (g_bChatChange) {
1784 //PrintToServer("%s %t",MSG,"Killing",g_aClientName[attacker],g_aStats[attacker][SCORE],score_dif,g_aClientName[victim],g_aStats[victim][SCORE]);
1785 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]);
1786 if (attacker < MAXPLAYERS)
1787 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]);
1788 }
1789 } else {
1790 if (g_aStats[victim][KILLS] < g_MinimalKills && g_aStats[attacker][KILLS] < g_MinimalKills) {
1791 if (g_bChatChange) {
1792 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);
1793 if (attacker < MAXPLAYERS)
1794 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);
1795 }
1796 } else if (g_aStats[victim][KILLS] < g_MinimalKills) {
1797 if (g_bChatChange) {
1798 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);
1799 if (attacker < MAXPLAYERS)
1800 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);
1801 }
1802 } else {
1803 if (g_bChatChange) {
1804 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);
1805 if (attacker < MAXPLAYERS)
1806 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);
1807 }
1808 }
1809 }
1810 if (headshot && attacker < MAXPLAYERS) {
1811
1812 g_aStats[attacker][SCORE] += g_PointsHs;
1813 g_aSession[attacker][SCORE] += g_PointsHs;
1814 if (g_bChatChange && g_PointsHs > 0)
1815 if(!hidechat[attacker]) CPrintToChat(attacker, "%s %t", MSG, "Headshot", g_aClientName[attacker], g_aStats[attacker][SCORE], g_PointsHs);
1816 }
1817 }
1818
1819 /* Assist */
1820 if(assist && attacker < MAXPLAYERS){
1821
1822 //Do not attack your teammate, my friend
1823 if(GetClientTeam(victim) == GetClientTeam(assist)){
1824 return;
1825 }
1826
1827 else{
1828 g_aStats[assist][SCORE]+= g_PointsAssistKill;
1829 g_aSession[assist][SCORE]+= g_PointsAssistKill;
1830 g_aStats[assist][ASSISTS]++;
1831 g_aSession[assist][ASSISTS]++;
1832
1833 if(g_bChatChange && g_PointsAssistKill > 0){
1834 if(!hidechat[assist]) CPrintToChat(assist, "%s %t", MSG, "AssistKill", g_aClientName[assist], g_aStats[assist][SCORE], g_PointsAssistKill, g_aClientName[attacker], g_aClientName[victim]);
1835 }
1836 }
1837 }
1838
1839 if (attacker < MAXPLAYERS)
1840 if (g_aStats[attacker][KILLS] == 50)
1841 g_TotalPlayers++;
1842}
1843
1844public Action EventPlayerHurt(Handle event, const char name[], bool dontBroadcast)
1845// ----------------------------------------------------------------------------
1846{
1847 if (!g_bEnabled || !g_bGatherStats || g_MinimumPlayers > GetCurrentPlayers())
1848 return;
1849 int victim = GetClientOfUserId(GetEventInt(event, "userid"));
1850 int attacker = GetClientOfUserId(GetEventInt(event, "attacker"));
1851 if (!g_bRankBots && (attacker == 0 || IsFakeClient(victim) || IsFakeClient(attacker)))
1852 return;
1853 if (victim != attacker && attacker > 0 && attacker < MAXPLAYERS) {
1854 int hitgroup = GetEventInt(event, "hitgroup");
1855 if (hitgroup == 0) // Player was hit by knife, he, flashbang, or smokegrenade.
1856 return;
1857 g_aStats[attacker][HITS]++;
1858 g_aSession[attacker][HITS]++;
1859 g_aHitBox[attacker][hitgroup]++;
1860
1861 int damage = GetEventInt(event, "dmg_health");
1862 g_aStats[attacker][DAMAGE] += damage;
1863 g_aSession[attacker][DAMAGE] += damage;
1864
1865 //PrintToChat(attacker, "Hitgroup %i: %i hits", hitgroup, g_aHitBox[attacker][hitgroup]);
1866 //PrintToServer("Stats Hits: %i\nSession Hits: %i\nHitBox %i -> %i",g_aStats[attacker][HITS],g_aSession[attacker][HITS],hitgroup,g_aHitBox[attacker][hitgroup]);
1867 }
1868}
1869
1870public Action EventWeaponFire(Handle event, const char[] name, bool dontBroadcast)
1871{
1872 if (!g_bEnabled || !g_bGatherStats || g_MinimumPlayers > GetCurrentPlayers())
1873 return;
1874 int client = GetClientOfUserId(GetEventInt(event, "userid"));
1875 if (!g_bRankBots && (!IsValidClient(client) || IsFakeClient(client)))
1876 return;
1877 char sWeaponUsed[50];
1878 GetEventString(event, "weapon", sWeaponUsed, sizeof(sWeaponUsed));
1879 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"))
1880 return; // Don't count knife being used neither hegrenade, flashbang and smokegrenade being threw
1881 g_aStats[client][SHOTS]++;
1882 g_aSession[client][SHOTS]++;
1883
1884}
1885
1886public void SalvarPlayer(int client) {
1887 if (!g_bEnabled || !g_bGatherStats || g_MinimumPlayers > GetCurrentPlayers())
1888 return;
1889 if (!g_bRankBots && (!IsValidClient(client) || IsFakeClient(client)))
1890 return;
1891 if (!OnDB[client])
1892 return;
1893
1894 char sEscapeName[MAX_NAME_LENGTH * 2 + 1];
1895 SQL_EscapeString(g_hStatsDb, g_aClientName[client], sEscapeName, sizeof(sEscapeName));
1896 //SQL_EscapeString(g_hStatsDb,name,name,sizeof(name));
1897
1898 // Make SQL-safe
1899 //ReplaceString(name, sizeof(name), "'", "");
1900
1901 char weapons_query[1000] = "";
1902 for (int i = 0; i <= 39; i++) {
1903 Format(weapons_query, sizeof(weapons_query), "%s,%s='%d'", weapons_query, g_sWeaponsNamesGame[i], g_aWeapons[client][i]);
1904 }
1905
1906 // Old query
1907 /*
1908 new String:query[2000];
1909 if (g_RankBy == 1) {
1910 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],
1911 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,
1912 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);
1913 } else if (g_RankBy == 0) {
1914 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],
1915 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,
1916 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]);
1917 } else if (g_RankBy == 2) {
1918 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],
1919 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,
1920 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]);
1921 }
1922 SQL_TQuery(g_hStatsDb, SQL_SaveCallback, query, client, DBPrio_High);
1923 */
1924
1925 /* SM1.9 Fix*/
1926 char query[2000];
1927 char query2[2000];
1928
1929 if (g_RankBy == 0)
1930 {
1931 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],
1932 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,
1933 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]);
1934
1935 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],
1936 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]);
1937 }
1938
1939 else if (g_RankBy == 1)
1940 {
1941 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],
1942 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,
1943 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);
1944
1945 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],
1946 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);
1947 }
1948
1949 else if (g_RankBy == 2)
1950 {
1951 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],
1952 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,
1953 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]);
1954
1955 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],
1956 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]);
1957 }
1958
1959 SQL_TQuery(g_hStatsDb, SQL_SaveCallback, query, client, DBPrio_High);
1960 SQL_TQuery(g_hStatsDb, SQL_SaveCallback, query2, client, DBPrio_High);
1961
1962 if (DEBUGGING) {
1963 PrintToServer(query);
1964
1965 LogError("%s", query);
1966 }
1967}
1968
1969
1970public void SQL_SaveCallback(Handle owner, Handle hndl, const char[] error, any client)
1971{
1972 if (hndl == INVALID_HANDLE)
1973 {
1974 LogError("[RankMe] Save Player Fail: %s", error);
1975 return;
1976 }
1977
1978 /**
1979 Start the forward OnPlayerSaved
1980 */
1981 Action fResult;
1982 Call_StartForward(g_fwdOnPlayerSaved);
1983 Call_PushCell(client);
1984 int fError = Call_Finish(fResult);
1985
1986 if (fError != SP_ERROR_NONE)
1987 {
1988 ThrowNativeError(fError, "Forward failed");
1989 }
1990
1991}
1992
1993public void OnClientPutInServer(int client) {
1994
1995 // If the database isn't connected, you can't run SQL_EscapeString.
1996 if (g_hStatsDb != INVALID_HANDLE)
1997 LoadPlayer(client);
1998
1999 // Cookie
2000 if(IsValidClient(client) && !IsFakeClient(client)){
2001 char buffer[5];
2002 GetClientCookie(client, hidechatcookie, buffer, sizeof(buffer));
2003 if(StrEqual(buffer, "") || StrEqual(buffer,"0")) hidechat[client] = false;
2004 else if(StrEqual(buffer,"1")) hidechat[client] = true;
2005 }
2006}
2007
2008public void LoadPlayer(int client) {
2009
2010 OnDB[client] = false;
2011 for (int i = 0; i <= 19; i++) {
2012 g_aSession[client][i] = 0;
2013 g_aStats[client][i] = 0;
2014 }
2015 g_aStats[client][SCORE] = g_PointsStart;
2016 for (int i = 0; i <= 39; i++) {
2017 g_aWeapons[client][i] = 0;
2018 }
2019 g_aSession[client][CONNECTED] = GetTime();
2020
2021 char name[MAX_NAME_LENGTH];
2022 GetClientName(client, name, sizeof(name));
2023 strcopy(g_aClientName[client], MAX_NAME_LENGTH, name);
2024 char sEscapeName[MAX_NAME_LENGTH * 2 + 1];
2025 SQL_EscapeString(g_hStatsDb, name, sEscapeName, sizeof(sEscapeName));
2026 //ReplaceString(name, sizeof(name), "'", "");
2027 char auth[32];
2028 GetClientAuthId(client, AuthId_Steam2, auth, sizeof(auth));
2029 strcopy(g_aClientSteam[client], sizeof(g_aClientSteam[]), auth);
2030 char ip[32];
2031 GetClientIP(client, ip, sizeof(ip));
2032 strcopy(g_aClientIp[client], sizeof(g_aClientIp[]), ip);
2033 char query[10000];
2034 if (g_RankBy == 1)
2035 FormatEx(query, sizeof(query), g_sSqlRetrieveClientName, g_sSQLTable, sEscapeName);
2036 else if (g_RankBy == 0)
2037 FormatEx(query, sizeof(query), g_sSqlRetrieveClient, g_sSQLTable, auth);
2038 else if (g_RankBy == 2)
2039 FormatEx(query, sizeof(query), g_sSqlRetrieveClientIp, g_sSQLTable, ip);
2040
2041 if (DEBUGGING) {
2042 PrintToServer(query);
2043 LogError("%s", query);
2044 }
2045 if (g_hStatsDb != INVALID_HANDLE)
2046 SQL_TQuery(g_hStatsDb, SQL_LoadPlayerCallback, query, client);
2047
2048}
2049
2050public void SQL_LoadPlayerCallback(Handle owner, Handle hndl, const char[] error, any client)
2051{
2052 if (!g_bRankBots && (!IsValidClient(client) || IsFakeClient(client)))
2053 return;
2054
2055 if (hndl == INVALID_HANDLE)
2056 {
2057 LogError("[RankMe] Load Player Fail: %s", error);
2058 return;
2059 }
2060 if (!IsClientInGame(client))
2061 return;
2062
2063 if (g_RankBy == 1) {
2064 char name[MAX_NAME_LENGTH];
2065 GetClientName(client, name, sizeof(name));
2066 if (!StrEqual(name, g_aClientName[client]))
2067 return;
2068 } else if (g_RankBy == 0) {
2069 char auth[64];
2070 GetClientAuthId(client, AuthId_Steam2, auth, sizeof(auth));
2071 if (!StrEqual(auth, g_aClientSteam[client]))
2072 return;
2073 } else if (g_RankBy == 2) {
2074 char ip[64];
2075 GetClientIP(client, ip, sizeof(ip));
2076 if (!StrEqual(ip, g_aClientIp[client]))
2077 return;
2078 }
2079 if (SQL_HasResultSet(hndl) && SQL_FetchRow(hndl))
2080 {
2081 //Player infos
2082 for (int i = 0; i <= 11; i++) {
2083 g_aStats[client][i] = SQL_FetchInt(hndl, 4 + i);
2084 }
2085
2086 //ALL 40 Weapons
2087 for (int i = 0; i <= 39; i++) {
2088 g_aWeapons[client][i] = SQL_FetchInt(hndl, 17 + i);
2089 }
2090
2091 //ALL 8 Hitboxes
2092 for (int i = 1; i <= 7; i++) {
2093 g_aHitBox[client][i] = SQL_FetchInt(hndl, 56 + i);
2094 }
2095
2096 g_aStats[client][C4_PLANTED] = SQL_FetchInt(hndl, 64);
2097 g_aStats[client][C4_EXPLODED] = SQL_FetchInt(hndl, 65);
2098 g_aStats[client][C4_DEFUSED] = SQL_FetchInt(hndl, 66);
2099 g_aStats[client][CT_WIN] = SQL_FetchInt(hndl, 67);
2100 g_aStats[client][TR_WIN] = SQL_FetchInt(hndl, 68);
2101 g_aStats[client][HOSTAGES_RESCUED] = SQL_FetchInt(hndl, 69);
2102 g_aStats[client][VIP_KILLED] = SQL_FetchInt(hndl, 70);
2103 g_aStats[client][VIP_ESCAPED] = SQL_FetchInt(hndl, 71);
2104 g_aStats[client][VIP_PLAYED] = SQL_FetchInt(hndl, 72);
2105 g_aStats[client][MVP] = SQL_FetchInt(hndl, 73);
2106 g_aStats[client][DAMAGE] = SQL_FetchInt(hndl, 74);
2107 } else {
2108 char query[10000];
2109
2110 char sEscapeName[MAX_NAME_LENGTH * 2 + 1];
2111 SQL_EscapeString(g_hStatsDb, g_aClientName[client], sEscapeName, sizeof(sEscapeName));
2112 //SQL_EscapeString(g_hStatsDb,name,name,sizeof(name));
2113 //ReplaceString(name, sizeof(name), "'", "");
2114
2115 Format(query, sizeof(query), g_sSqlInsert, g_sSQLTable, g_aClientSteam[client], sEscapeName, g_aClientIp[client], g_PointsStart);
2116 SQL_TQuery(g_hStatsDb, SQL_NothingCallback, query, _, DBPrio_High);
2117
2118 if (DEBUGGING) {
2119 PrintToServer(query);
2120
2121 LogError("%s", query);
2122 }
2123 }
2124 OnDB[client] = true;
2125 /**
2126 Start the forward OnPlayerLoaded
2127 */
2128 Action fResult;
2129 Call_StartForward(g_fwdOnPlayerLoaded);
2130 Call_PushCell(client);
2131 int fError = Call_Finish(fResult);
2132
2133 if (fError != SP_ERROR_NONE)
2134 {
2135 ThrowNativeError(fError, "Forward failed");
2136 }
2137}
2138
2139public void SQL_PurgeCallback(Handle owner, Handle hndl, const char[] error, any client)
2140{
2141 if (hndl == INVALID_HANDLE)
2142 {
2143 LogError("[RankMe] Query Fail: %s", error);
2144 return;
2145 }
2146
2147 PrintToServer("[RankMe]: %d players purged by inactivity", SQL_GetAffectedRows(owner));
2148 if (client != 0) {
2149 PrintToChat(client, "[RankMe]: %d players purged by inactivity", SQL_GetAffectedRows(owner));
2150 }
2151 //LogAction(-1,-1,"[RankMe]: %d players purged by inactivity",SQL_GetAffectedRows(owner));
2152
2153}
2154
2155public void SQL_NothingCallback(Handle owner, Handle hndl, const char[] error, any client)
2156{
2157 if (hndl == INVALID_HANDLE)
2158 {
2159 LogError("[RankMe] Query Fail: %s", error);
2160 return;
2161 }
2162
2163
2164}
2165
2166public void OnClientDisconnect(int client) {
2167 if (!g_bEnabled)
2168 return;
2169 if (!g_bRankBots && (!IsValidClient(client) || IsFakeClient(client)))
2170 return;
2171 SalvarPlayer(client);
2172 OnDB[client] = false;
2173}
2174
2175public void SQL_DumpCallback(Handle owner, Handle hndl, const char[] error, any Datapack) {
2176
2177 if (hndl == INVALID_HANDLE)
2178 {
2179 LogError("[RankMe] Query Fail: %s", error);
2180 PrintToServer(error);
2181 return;
2182 }
2183
2184 Handle File1;
2185 char fields_values[600];
2186 char field[100];
2187 char prepared_field[200];
2188
2189 fields_values[0] = 0;
2190
2191 File1 = OpenFile("rank.sql", "w");
2192 if (File1 == INVALID_HANDLE) {
2193
2194 LogError("[RankMe] Unable to open dump file.");
2195
2196 }
2197 int fields = SQL_GetFieldCount(hndl);
2198 bool first;
2199
2200 if(g_bMysql)
2201 {
2202 WriteFileLine(File1, g_sMysqlCreate, g_sSQLTable);
2203 WriteFileLine(File1, "");
2204 }
2205
2206 if(!g_bMysql)
2207 {
2208 WriteFileLine(File1, g_sSqliteCreate, g_sSQLTable);
2209 WriteFileLine(File1, "");
2210 }
2211
2212 while (SQL_HasResultSet(hndl) && SQL_FetchRow(hndl))
2213 {
2214 field = "";
2215 fields_values = "";
2216 first = true;
2217 for (int i = 0; i <= fields - 1; i++) {
2218 SQL_FetchString(hndl, i, field, sizeof(field));
2219 // ReplaceString(field, sizeof(field), "\\","\\\\",false);
2220 // ReplaceString(field,sizeof(field),"\"", "\\\"", false);
2221 SQL_EscapeString(g_hStatsDb, field, prepared_field, sizeof(prepared_field));
2222
2223 if (first) {
2224 Format(fields_values, sizeof(fields_values), "\"%s\"", prepared_field);
2225 first = false;
2226 }
2227 else
2228 Format(fields_values, sizeof(fields_values), "%s,\"%s\"", fields_values, prepared_field);
2229 }
2230
2231 WriteFileLine(File1, "INSERT INTO `%s` VALUES (%s);", g_sSQLTable, fields_values);
2232 }
2233 CloseHandle(File1);
2234}
2235
2236public void OnConVarChanged(Handle convar, const char[] oldValue, const char[] newValue) {
2237 int g_bQueryPlayerCount;
2238
2239 if (convar == g_cvarShowBotsOnRank) {
2240 g_bShowBotsOnRank = GetConVarBool(g_cvarShowBotsOnRank);
2241 g_bQueryPlayerCount = true;
2242 }
2243 else if (convar == g_cvarRankBy) {
2244 g_RankBy = GetConVarBool(g_cvarRankBy);
2245 }
2246 else if (convar == g_cvarEnabled) {
2247 g_bEnabled = GetConVarBool(g_cvarEnabled);
2248 }
2249 else if (convar == g_cvarShowRankAll) {
2250 g_bShowRankAll = GetConVarBool(g_cvarShowRankAll);
2251 }
2252 else if (convar == g_cvarChatChange) {
2253 g_bChatChange = GetConVarBool(g_cvarChatChange);
2254 }
2255 else if (convar == g_cvarRankbots) {
2256 g_bRankBots = GetConVarBool(g_cvarRankbots);
2257 g_bQueryPlayerCount = true;
2258 }
2259 else if (convar == g_cvarFfa) {
2260 g_bFfa = GetConVarBool(g_cvarFfa);
2261 }
2262 else if (convar == g_cvarDumpDB) {
2263 g_bDumpDB = GetConVarBool(g_cvarDumpDB);
2264 }
2265 else if (convar == g_cvarPointsBombDefusedTeam) {
2266 g_PointsBombDefusedTeam = GetConVarInt(g_cvarPointsBombDefusedTeam);
2267 }
2268 else if (convar == g_cvarPointsBombDefusedPlayer) {
2269 g_PointsBombDefusedPlayer = GetConVarInt(g_cvarPointsBombDefusedPlayer);
2270 }
2271 else if (convar == g_cvarPointsBombPlantedTeam) {
2272 g_PointsBombPlantedTeam = GetConVarInt(g_cvarPointsBombPlantedTeam);
2273 }
2274 else if (convar == g_cvarPointsBombPlantedPlayer) {
2275 g_PointsBombPlantedPlayer = GetConVarInt(g_cvarPointsBombPlantedPlayer);
2276 }
2277 else if (convar == g_cvarPointsBombExplodeTeam) {
2278 g_PointsBombExplodeTeam = GetConVarInt(g_cvarPointsBombExplodeTeam);
2279 }
2280 else if (convar == g_cvarPointsBombExplodePlayer) {
2281 g_PointsBombExplodePlayer = GetConVarInt(g_cvarPointsBombExplodePlayer);
2282 }
2283 else if (convar == g_cvarPointsHostageRescTeam) {
2284 g_PointsHostageRescTeam = GetConVarInt(g_cvarPointsHostageRescTeam);
2285 }
2286 else if (convar == g_cvarPointsHostageRescPlayer) {
2287 g_PointsHostageRescPlayer = GetConVarInt(g_cvarPointsHostageRescPlayer);
2288 }
2289 else if (convar == g_cvarPointsHs) {
2290 g_PointsHs = GetConVarInt(g_cvarPointsHs);
2291 }
2292 else if (convar == g_cvarPointsKillCt) {
2293 g_PointsKill[CT] = GetConVarInt(g_cvarPointsKillCt);
2294 }
2295 else if (convar == g_cvarPointsKillTr) {
2296 g_PointsKill[TR] = GetConVarInt(g_cvarPointsKillTr);
2297 }
2298 else if (convar == g_cvarPointsKillBonusCt) {
2299 g_PointsKillBonus[CT] = GetConVarInt(g_cvarPointsKillBonusCt);
2300 }
2301 else if (convar == g_cvarPointsKillBonusTr) {
2302 g_PointsKillBonus[TR] = GetConVarInt(g_cvarPointsKillBonusTr);
2303 }
2304 else if (convar == g_cvarPointsKillBonusDifCt) {
2305 g_PointsKillBonusDif[CT] = GetConVarInt(g_cvarPointsKillBonusDifCt);
2306 }
2307 else if (convar == g_cvarPointsKillBonusDifTr) {
2308 g_PointsKillBonusDif[TR] = GetConVarInt(g_cvarPointsKillBonusDifTr);
2309 }
2310 else if (convar == g_cvarPointsStart) {
2311 g_PointsStart = GetConVarInt(g_cvarPointsStart);
2312 }
2313 else if (convar == g_cvarPointsKnifeMultiplier) {
2314 g_fPointsKnifeMultiplier = GetConVarFloat(g_cvarPointsKnifeMultiplier);
2315 }
2316 else if (convar == g_cvarPointsTaserMultiplier) {
2317 g_fPointsTaserMultiplier = GetConVarFloat(g_cvarPointsTaserMultiplier);
2318 }
2319 else if (convar == g_cvarPointsTrRoundWin) {
2320 g_PointsRoundWin[TR] = GetConVarInt(g_cvarPointsTrRoundWin);
2321 }
2322 else if (convar == g_cvarPointsCtRoundWin) {
2323 g_PointsRoundWin[CT] = GetConVarInt(g_cvarPointsCtRoundWin);
2324 }
2325 else if (convar == g_cvarMinimalKills) {
2326 g_MinimalKills = GetConVarInt(g_cvarMinimalKills);
2327 }
2328 else if (convar == g_cvarPercentPointsLose) {
2329 g_fPercentPointsLose = GetConVarFloat(g_cvarPercentPointsLose);
2330 }
2331 else if (convar == g_cvarPointsLoseRoundCeil) {
2332 g_bPointsLoseRoundCeil = GetConVarBool(g_cvarPointsLoseRoundCeil);
2333 }
2334 else if (convar == g_cvarMinimumPlayers) {
2335 g_MinimumPlayers = GetConVarInt(g_cvarMinimumPlayers);
2336 }
2337 else if (convar == g_cvarResetOwnRank) {
2338 g_bResetOwnRank = GetConVarBool(g_cvarResetOwnRank);
2339 }
2340 else if (convar == g_cvarPointsVipEscapedTeam) {
2341 g_PointsVipEscapedTeam = GetConVarInt(g_cvarPointsVipEscapedTeam);
2342 }
2343 else if (convar == g_cvarPointsVipEscapedPlayer) {
2344 g_PointsVipEscapedPlayer = GetConVarInt(g_cvarPointsVipEscapedPlayer);
2345 }
2346 else if (convar == g_cvarPointsVipKilledTeam) {
2347 g_PointsVipKilledTeam = GetConVarInt(g_cvarPointsVipKilledTeam);
2348 }
2349 else if (convar == g_cvarPointsVipKilledPlayer) {
2350 g_PointsVipKilledPlayer = GetConVarInt(g_cvarPointsVipKilledPlayer);
2351 }
2352 else if (convar == g_cvarVipEnabled) {
2353 g_bVipEnabled = GetConVarBool(g_cvarVipEnabled);
2354 }
2355 else if (convar == g_cvarDaysToNotShowOnRank) {
2356 g_DaysToNotShowOnRank = GetConVarInt(g_cvarDaysToNotShowOnRank);
2357 g_bQueryPlayerCount = true;
2358 }
2359 else if (convar == g_cvarGatherStats) {
2360 g_bGatherStats = GetConVarBool(g_cvarGatherStats);
2361 }
2362 else if (convar == g_cvarRankMode) {
2363 g_RankMode = GetConVarInt(g_cvarRankMode);
2364 BuildRankCache();
2365 }
2366 else if (convar == g_cvarChatTriggers) {
2367 g_bChatTriggers = GetConVarBool(g_cvarChatTriggers);
2368 }
2369 else if (convar == g_cvarPointsMvpCt) {
2370 g_PointsMvpCt = GetConVarInt(g_cvarPointsMvpCt);
2371 }
2372 else if (convar == g_cvarPointsMvpTr) {
2373 g_PointsMvpTr = GetConVarInt(g_cvarPointsMvpTr);
2374 }
2375 else if (convar == g_cvarPointsBombPickup) {
2376 g_PointsBombDropped = GetConVarInt(g_cvarPointsBombPickup);
2377 }
2378 else if (convar == g_cvarPointsBombDropped) {
2379 g_PointsBombDropped = GetConVarInt(g_cvarPointsBombDropped);
2380 }
2381
2382 /*RankMe Connect Announcer*/
2383 else if(convar == g_cvarAnnounceConnect) {
2384 g_bAnnounceConnect = GetConVarBool(g_cvarAnnounceConnect);
2385 }
2386
2387 else if(convar == g_cvarAnnounceConnectChat) {
2388 g_bAnnounceConnectChat = GetConVarBool(g_cvarAnnounceConnectChat);
2389 }
2390
2391 else if(convar == g_cvarAnnounceConnectHint) {
2392 g_bAnnounceConnectHint = GetConVarBool(g_cvarAnnounceConnectHint);
2393 }
2394
2395 else if(convar == g_cvarAnnounceDisconnect) {
2396 g_bAnnounceDisconnect = GetConVarBool(g_cvarAnnounceDisconnect);
2397 }
2398
2399 else if(convar == g_cvarAnnounceTopConnect) {
2400 g_bAnnounceTopConnect = GetConVarBool(g_cvarAnnounceTopConnect);
2401 }
2402
2403 else if(convar == g_cvarAnnounceTopPosConnect) {
2404 g_AnnounceTopPosConnect = GetConVarInt(g_cvarAnnounceTopPosConnect);
2405 }
2406
2407 else if(convar == g_cvarAnnounceTopConnectChat) {
2408 g_bAnnounceTopConnectChat = GetConVarBool(g_cvarAnnounceTopConnectChat);
2409 }
2410
2411 else if(convar == g_cvarAnnounceTopConnectHint) {
2412 g_bAnnounceTopConnectHint = GetConVarBool(g_cvarAnnounceTopConnectHint);
2413 }
2414
2415 /* Assist */
2416 else if (convar == g_cvarPointsAssistKill){
2417 g_PointsAssistKill = GetConVarInt(g_cvarPointsAssistKill);
2418 }
2419
2420 /* Enable Or Disable Points In Warmup */
2421 else if (convar == g_cvarGatherStatsWarmup){
2422 g_bGatherStatsWarmup = GetConVarBool(g_cvarGatherStatsWarmup);
2423 }
2424
2425 /* Min points */
2426 else if (convar == g_cvarPointsMin){
2427 g_PointsMin = GetConVarInt(g_cvarPointsMin);
2428 }
2429
2430 else if (convar == g_cvarPointsMinEnabled){
2431 g_bPointsMinEnabled = GetConVarBool(g_cvarPointsMinEnabled);
2432 }
2433
2434 /* Rank Cache */
2435 else if (convar == g_cvarRankCache) {
2436 g_bRankCache = GetConVarBool(g_cvarRankCache);
2437 }
2438
2439 if (g_bQueryPlayerCount && g_hStatsDb != INVALID_HANDLE) {
2440 char query[10000];
2441 MakeSelectQuery(query, sizeof(query));
2442 SQL_TQuery(g_hStatsDb, SQL_GetPlayersCallback, query);
2443 }
2444}
2445
2446stock bool IsValidClient(int client, bool nobots = true)
2447{
2448 if (client <= 0 || client > MaxClients || !IsClientConnected(client) || (nobots && IsFakeClient(client)))
2449 {
2450 return false;
2451 }
2452 return IsClientInGame(client);
2453}
2454
2455stock void MakeSelectQuery(char[] sQuery, int strsize) {
2456
2457 // Make basic query
2458 Format(sQuery, strsize, "SELECT * FROM `%s` WHERE kills >= '%d'", g_sSQLTable, g_MinimalKills);
2459
2460 // Append check for bots
2461 if (!g_bShowBotsOnRank)
2462 Format(sQuery, strsize, "%s AND steam <> 'BOT'", sQuery);
2463
2464 // Append check for inactivity
2465 if (g_DaysToNotShowOnRank > 0)
2466 Format(sQuery, strsize, "%s AND lastconnect >= '%d'", sQuery, GetTime() - (g_DaysToNotShowOnRank * 86400));
2467}
2468
2469public Action RankMe_OnPlayerLoaded(int client){
2470
2471 /*RankMe Connect Announcer*/
2472 if(!g_bAnnounceConnect && !g_bAnnounceTopConnect)
2473 return Plugin_Handled;
2474
2475 if (!g_bRankBots && (!IsValidClient(client) || IsFakeClient(client)))
2476 return Plugin_Handled;
2477
2478 RankMe_GetRank(client,RankConnectCallback);
2479
2480 return Plugin_Continue;
2481}
2482
2483public void RankConnectCallback(int client, int rank, any data){
2484
2485 if (!g_bRankBots && (!IsValidClient(client) || IsFakeClient(client)))
2486 return;
2487
2488 g_aPointsOnConnect[client] = RankMe_GetPoints(client);
2489
2490 g_aRankOnConnect[client] = rank;
2491
2492 char sClientName[MAX_NAME_LENGTH];
2493 GetClientName(client,sClientName,sizeof(sClientName));
2494
2495 /* Geoip, code from cksurf */
2496 char s_Country[32];
2497 char s_address[32];
2498 GetClientIP(client, s_address, 32);
2499 Format(s_Country, sizeof(s_Country), "Unknown");
2500 GeoipCountry(s_address, s_Country, sizeof(s_Country));
2501 // if(!strcmp(s_Country, NULL_STRING))
2502 if (s_Country[0] == 0)
2503 Format( s_Country, sizeof(s_Country), "Unknown", s_Country );
2504 else
2505 if( StrContains( s_Country, "United", false ) != -1 ||
2506 StrContains( s_Country, "Republic", false ) != -1 ||
2507 StrContains( s_Country, "Federation", false ) != -1 ||
2508 StrContains( s_Country, "Island", false ) != -1 ||
2509 StrContains( s_Country, "Netherlands", false ) != -1 ||
2510 StrContains( s_Country, "Isle", false ) != -1 ||
2511 StrContains( s_Country, "Bahamas", false ) != -1 ||
2512 StrContains( s_Country, "Maldives", false ) != -1 ||
2513 StrContains( s_Country, "Philippines", false ) != -1 ||
2514 StrContains( s_Country, "Vatican", false ) != -1 )
2515 {
2516 Format( s_Country, sizeof(s_Country), "The %s", s_Country );
2517 }
2518
2519 if(g_bAnnounceConnect){
2520
2521 if(g_bAnnounceConnectChat){
2522 CPrintToChatAll("%s %t",MSG,"PlayerJoinedChat",sClientName,g_aRankOnConnect[client],g_aPointsOnConnect[client],s_Country);
2523 }
2524
2525 if(g_bAnnounceConnectHint){
2526 PrintHintTextToAll("%t","PlayerJoinedHint",sClientName,g_aRankOnConnect[client],g_aPointsOnConnect[client],s_Country);
2527 }
2528
2529 }
2530
2531 if(g_bAnnounceTopConnect && rank <= g_AnnounceTopPosConnect){
2532
2533 if(g_bAnnounceTopConnectChat){
2534 CPrintToChatAll("%s %t",MSG,"TopPlayerJoinedChat",g_AnnounceTopPosConnect,sClientName,g_aRankOnConnect[client],s_Country);
2535 }
2536
2537 if(g_bAnnounceTopConnectHint){
2538 PrintHintTextToAll("%t","TopPlayerJoinedHint",g_AnnounceTopPosConnect,sClientName,g_aRankOnConnect[client],s_Country);
2539 }
2540 }
2541}
2542
2543public Action Event_PlayerDisconnect(Handle event, const char[] name, bool dontBroadcast)
2544{
2545 if(!g_bAnnounceDisconnect)
2546 return;
2547
2548 int client = GetClientOfUserId(GetEventInt(event, "userid"));
2549
2550 if (client <= 0 || client > MaxClients || !IsClientConnected(client) || !g_bRankBots)
2551 return;
2552
2553 char sName[MAX_NAME_LENGTH];
2554 GetClientName(client,sName,MAX_NAME_LENGTH);
2555 strcopy(g_sBufferClientName[client],MAX_NAME_LENGTH,sName);
2556
2557 g_aPointsOnDisconnect[client] = RankMe_GetPoints(client);
2558
2559 char disconnectReason[64];
2560 GetEventString(event, "reason", disconnectReason, sizeof(disconnectReason));
2561
2562 CPrintToChatAll("%s %t",MSG,"PlayerLeft",g_sBufferClientName[client], g_aPointsOnDisconnect[client], disconnectReason);
2563}
2564
2565/* Enable Or Disable Points In Warmup */
2566public void OnGameFrame()
2567{
2568 //If cvar disable
2569 if(!g_bGatherStatsWarmup)
2570 {
2571 //In Warmup
2572 if(GameRules_GetProp("m_bWarmupPeriod") == 1)
2573 {
2574 g_bGatherStats = false;
2575 }
2576
2577 //Not in warmup
2578 else
2579 {
2580 g_bGatherStats = true;
2581 }
2582 }
2583}
2584
2585/* Hide Chat */
2586public Action CMD_HideChat(int client, int args){
2587 if(!hidechat[client]){
2588 SetClientCookie(client, hidechatcookie, "1");
2589 CPrintToChat(client, "%s %t Hide Rankme Chat", MSG);
2590 hidechat[client] = true;
2591 }
2592 else if(hidechat[client]){
2593 SetClientCookie(client, hidechatcookie, "0");
2594 CPrintToChat(client, "%s %t Show Rankme Chat", MSG);
2595 hidechat[client] = false;
2596 }
2597}