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