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