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