· 9 years ago · Jan 27, 2017, 03:56 AM
1#pragma semicolon 1
2#define PLUGIN_VERSION "3.0.0"
3#include <sourcemod>
4#include <adminmenu>
5#include <colors>
6#include <rankme>
7
8#define WHITE 0x01
9#define DARKRED 0x02
10#define PURPLE 0x03
11#define GREEN 0x04
12#define MOSSGREEN 0x05
13#define LIMEGREEN 0x06
14#define RED 0x07
15#define ORANGE 0x10
16#define GRAY 0x08
17#define YELLOW 0x09
18#define DARKGREY 0x0A
19#define BLUE 0x0B
20#define DARKBLUE 0x0C
21#define LIGHTBLUE 0x0D
22#define PINK 0x0E
23#define LIGHTRED 0x0F
24
25#define MSG "\x01[\x04Matrix\x01] "
26#define SPEC 1
27#define TR 2
28#define CT 3
29
30#define SENDER_WORLD 0
31#define MAX_LENGTH_MENU 470
32
33new String:g_sSqlCreate[] = "CREATE TABLE IF NOT EXISTS `%s` (id INTEGER PRIMARY KEY, steam TEXT, name TEXT, lastip TEXT, score NUMERIC, kills NUMERIC, deaths 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,p250 NUMERIC,deagle NUMERIC,elite NUMERIC,fiveseven NUMERIC,tec9 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,aug NUMERIC,ssg08 NUMERIC,sg556 NUMERIC,awp NUMERIC,g3sg1 NUMERIC,m249 NUMERIC,negev NUMERIC,hegrenade NUMERIC,flashbang NUMERIC,smokegrenade NUMERIC,incgrenade NUMERIC,molotov NUMERIC,taser NUMERIC,decoy 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)";
34new 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');";
35new String:g_sSqlSave[] = "UPDATE `%s` SET score = '%i', kills = '%i', deaths='%i',suicides='%i',tk='%i',shots='%i',hits='%i',headshots='%i', rounds_tr = '%i', rounds_ct = '%i',lastip='%s',name='%s'%s,head='%i',chest='%i', stomach='%i',left_arm='%i',right_arm='%i',left_leg='%i',right_leg='%i',c4_planted='%i',c4_exploded='%i',c4_defused='%i',ct_win='%i',tr_win='%i', hostages_rescued='%i',vip_killed = '%d',vip_escaped = '%d',vip_played = '%d', lastconnect='%i', connected='%i' WHERE steam = '%s';";
36new String:g_sSqlSaveName[] = "UPDATE `%s` SET score = '%i', kills = '%i', deaths='%i',suicides='%i',tk='%i',shots='%i',hits='%i',headshots='%i', rounds_tr = '%i', rounds_ct = '%i',lastip='%s',name='%s'%s,head='%i',chest='%i', stomach='%i',left_arm='%i',right_arm='%i',left_leg='%i',right_leg='%i',c4_planted='%i',c4_exploded='%i',c4_defused='%i',ct_win='%i',tr_win='%i', hostages_rescued='%i',vip_killed = '%d',vip_escaped = '%d',vip_played = '%d', lastconnect='%i', connected='%i' WHERE name = '%s';";
37new String:g_sSqlSaveIp[] = "UPDATE `%s` SET score = '%i', kills = '%i', deaths='%i',suicides='%i',tk='%i',shots='%i',hits='%i',headshots='%i', rounds_tr = '%i', rounds_ct = '%i',lastip='%s',name='%s'%s,head='%i',chest='%i', stomach='%i',left_arm='%i',right_arm='%i',left_leg='%i',right_leg='%i',c4_planted='%i',c4_exploded='%i',c4_defused='%i',ct_win='%i',tr_win='%i', hostages_rescued='%i',vip_killed = '%d',vip_escaped = '%d',vip_played = '%d', lastconnect='%i', connected='%i' WHERE lastip = '%s';";
38new String:g_sSqlRetrieveClient[] = "SELECT * FROM `%s` WHERE steam='%s';";
39new String:g_sSqlRetrieveClientName[] = "SELECT * FROM `%s` WHERE name='%s';";
40new String:g_sSqlRetrieveClientIp[] = "SELECT * FROM `%s` WHERE lastip='%s';";
41new String:g_sSqlRemoveDuplicateSQLite[] = "delete from `%s` where `%s`.id > (SELECT min(id) from `%s` as t2 WHERE t2.steam=`%s`.steam);";
42new String:g_sSqlRemoveDuplicateNameSQLite[] = "delete from `%s` where `%s`.id > (SELECT min(id) from `%s` as t2 WHERE t2.name=`%s`.name);";
43new String:g_sSqlRemoveDuplicateIpSQLite[] = "delete from `%s` where `%s`.id > (SELECT min(id) from `%s` as t2 WHERE t2.lastip=`%s`.lastip);";
44new String:g_sSqlRemoveDuplicateMySQL[] = "delete from `%s` USING `%s`, `%s` as vtable WHERE (`%s`.id>vtable.id) AND (`%s`.steam=vtable.steam);";
45new String:g_sSqlRemoveDuplicateNameMySQL[] = "delete from `%s` USING `%s`, `%s` as vtable WHERE (`%s`.id>vtable.id) AND (`%s`.name=vtable.name);";
46new String:g_sSqlRemoveDuplicateIpMySQL[] = "delete from `%s` USING `%s`, `%s` as vtable WHERE (`%s`.id>vtable.id) AND (`%s`.ip=vtable.ip);";
47new String:g_sWeaponsNamesGame[37][] = {"knife","glock","hkp2000","p250","deagle","elite","fiveseven","tec9","nova","xm1014","mag7","bizon","sawedoff","mac10","mp9","mp7","ump45","p90","galilar","ak47","scar20","famas","m4a1","aug","ssg08","sg556","awp","g3sg1","m249","negev","hegrenade","flashbang","smokegrenade","incgrenade","molotov","taser","decoy"};
48new String:g_sWeaponsNamesFull[37][] = {"Knife","9x19 mm Sidearm (Glock)","KM .45 Tactical (P9000)","250 Compact","Knighthawk .50C (Desert Eagle)",".40 Dual Elites","ES Five-Seven","Tec 9","Leone 12 Gauge Super","Leone YG1265 Auto Shotgun","Mag 7","Sawed-off Shotgun","PP-Bizon","Ingram MAC-10","MP9","KM Submachine Gun (MP7)","KM UMP45","ES C90 (P90)","IDF Defender","CV-47 (AK-47)","SCAR-20","Clarion 5.56","Maverick M4A1 Carbine (Colt)","Bullpup (AUG)","Schmidt Scout","Kreig 558","Magnum Sniper Rifle (AWP)","D3/AU-1 (G3)","M249","Negev","HE Grenade","Flashbang","Smoke Grenade","Incendiary Grenade","Molotove Cocktail","Zeus x27","Decoy"};
49new Handle:g_cvarEnabled;
50new Handle:g_cvarChatChange;
51new Handle:g_cvarRankbots;
52new Handle:g_cvarAutopurge;
53new Handle:g_cvarDumpDB;
54new Handle:g_cvarPointsBombDefusedTeam;
55new Handle:g_cvarPointsBombDefusedPlayer;
56new Handle:g_cvarPointsBombPlantedTeam;
57new Handle:g_cvarPointsBombPlantedPlayer;
58new Handle:g_cvarPointsBombExplodeTeam;
59new Handle:g_cvarPointsBombExplodePlayer;
60new Handle:g_cvarPointsBombPickup;
61new Handle:g_cvarPointsBombDropped;
62new Handle:g_cvarPointsHostageRescTeam;
63new Handle:g_cvarPointsHostageRescPlayer;
64new Handle:g_cvarPointsVipEscapedTeam;
65new Handle:g_cvarPointsVipEscapedPlayer;
66new Handle:g_cvarPointsVipKilledTeam;
67new Handle:g_cvarPointsVipKilledPlayer;
68new Handle:g_cvarPointsHs;
69new Handle:g_cvarPointsKillCt;
70new Handle:g_cvarPointsKillTr;
71new Handle:g_cvarPointsKillBonusCt;
72new Handle:g_cvarPointsKillBonusTr;
73new Handle:g_cvarPointsKillBonusDifCt;
74new Handle:g_cvarPointsKillBonusDifTr;
75new Handle:g_cvarPointsStart;
76new Handle:g_cvarPointsKnifeMultiplier;
77new Handle:g_cvarPointsTaserMultiplier;
78new Handle:g_cvarPointsTrRoundWin;
79new Handle:g_cvarPointsCtRoundWin;
80new Handle:g_cvarPointsMvpCt;
81new Handle:g_cvarPointsMvpTr;
82new Handle:g_cvarMinimalKills;
83new Handle:g_cvarPercentPointsLose;
84new Handle:g_cvarPointsLoseRoundCeil;
85new Handle:g_cvarShowRankAll;
86new Handle:g_cvarResetOwnRank;
87new Handle:g_cvarMinimumPlayers;
88new Handle:g_cvarVipEnabled;
89new Handle:g_cvarPointsLoseTk;
90new Handle:g_cvarPointsLoseSuicide;
91new Handle:g_cvarShowBotsOnRank;
92new Handle:g_cvarRankBy;
93new Handle:g_cvarFfa;
94new Handle:g_cvarMysql;
95new Handle:g_cvarGatherStats;
96new Handle:g_cvarDaysToNotShowOnRank;
97new Handle:g_cvarRankMode;
98new Handle:g_cvarSQLTable;
99new Handle:g_cvarChatTriggers;
100
101new bool:g_bEnabled;
102new bool:g_bResetOwnRank;
103new bool:g_bChatChange;
104new bool:g_bRankBots;
105new bool:g_bPointsLoseRoundCeil;
106new bool:g_bShowRankAll;
107new bool:g_bVipEnabled;
108new bool:g_bShowBotsOnRank;
109new bool:g_bFfa;
110new bool:g_bMysql;
111new bool:g_bGatherStats;
112new bool:g_bDumpDB;
113new bool:g_bChatTriggers;
114new g_RankBy;
115new g_PointsBombDefusedTeam;
116new g_PointsBombDefusedPlayer;
117new g_PointsBombPlantedTeam;
118new g_PointsBombPlantedPlayer;
119new g_PointsBombExplodeTeam;
120new g_PointsBombExplodePlayer;
121new g_PointsBombPickup;
122new g_PointsBombDropped;
123new g_PointsHostageRescTeam;
124new g_PointsHostageRescPlayer;
125new g_PointsHs;
126// Size = 4 -> for using client team for points
127new g_PointsKill[4];
128new g_PointsKillBonus[4];
129new g_PointsKillBonusDif[4];
130new g_PointsMvpTr;
131new g_PointsMvpCt;
132new g_MinimalKills;
133new g_PointsStart;
134new Float:g_fPointsKnifeMultiplier;
135new Float:g_fPointsTaserMultiplier;
136new Float:g_fPercentPointsLose;
137new g_PointsRoundWin[4];
138new g_MinimumPlayers;
139new g_PointsLoseTk;
140new g_PointsLoseSuicide;
141new g_PointsVipEscapedTeam;
142new g_PointsVipEscapedPlayer;
143new g_PointsVipKilledTeam;
144new g_PointsVipKilledPlayer;
145new g_DaysToNotShowOnRank;
146new g_RankMode;
147new String:g_sSQLTable[100];
148new Handle:g_hStatsDb;
149new bool:OnDB[MAXPLAYERS+1];
150new g_aSession[MAXPLAYERS+1][STATS_NAMES];
151new g_aStats[MAXPLAYERS+1][STATS_NAMES];
152new g_aWeapons[MAXPLAYERS+1][WEAPONS_ENUM];
153new g_aHitBox[MAXPLAYERS+1][HITBOXES];
154new g_TotalPlayers;
155
156new Handle:g_fwdOnPlayerLoaded;
157new Handle:g_fwdOnPlayerSaved;
158
159new bool:DEBUGGING=false;
160new g_C4PlantedBy;
161new String:g_sC4PlantedByName[MAX_NAME_LENGTH];
162
163// Preventing duplicates
164new String:g_aClientSteam[MAXPLAYERS+1][64];
165new String:g_aClientName[MAXPLAYERS+1][MAX_NAME_LENGTH];
166new String:g_aClientIp[MAXPLAYERS+1][64];
167
168#include rankme/cmds
169
170public Plugin:myinfo = {
171 name = "RankMe",
172 author = "lok1 edited by [D]emoan",
173 description = "",
174 version = PLUGIN_VERSION,
175 url = ""
176};
177
178public OnPluginStart(){
179
180 //LoadTranslations("common.phrases");
181
182 // CREATE CVARS
183 g_cvarEnabled = CreateConVar("rankme_enabled","1","Is RankMe enabled? 1 = true 0 = false",_,true,0.0,true,1.0);
184 g_cvarRankbots = CreateConVar("rankme_rankbots","0","Rank bots? 1 = true 0 = false",_,true,0.0,true,1.0);
185 g_cvarAutopurge = CreateConVar("rankme_autopurge","0","Auto-Purge inactive players? X = Days 0 = Off",_,true,0.0);
186 g_cvarPointsBombDefusedTeam = CreateConVar("rankme_points_bomb_defused_team","2","How many points CTs got for defusing the C4?",_,true,0.0);
187 g_cvarPointsBombDefusedPlayer = CreateConVar("rankme_points_bomb_defused_player","2","How many points the CT who defused got additional?",_,true,0.0);
188 g_cvarPointsBombPlantedTeam = CreateConVar("rankme_points_bomb_planted_team","2","How many points TRs got for planting the C4?",_,true,0.0);
189 g_cvarPointsBombPlantedPlayer = CreateConVar("rankme_points_bomb_planted_player","2","How many points the TR who planted got additional?",_,true,0.0);
190 g_cvarPointsBombExplodeTeam = CreateConVar("rankme_points_bomb_exploded_team","2","How many points TRs got for exploding the C4?",_,true,0.0);
191 g_cvarPointsBombExplodePlayer = CreateConVar("rankme_points_bomb_exploded_player","2","How many points the TR who planted got additional?",_,true,0.0);
192 g_cvarPointsHostageRescTeam = CreateConVar("rankme_points_hostage_rescued_team","2","How many points CTs got for rescuing the hostage?",_,true,0.0);
193 g_cvarPointsHostageRescPlayer = CreateConVar("rankme_points_hostage_rescued_player","2","How many points the CT who rescued got additional?",_,true,0.0);
194 g_cvarPointsHs = CreateConVar("rankme_points_hs","1","How many additional points a player got for a HeadShot?",_,true,0.0);
195 g_cvarPointsKillCt = CreateConVar("rankme_points_kill_ct","2","How many points a CT got for killing?",_,true,0.0);
196 g_cvarPointsKillTr = CreateConVar("rankme_points_kill_tr","2","How many points a TR got for killing?",_,true,0.0);
197 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);
198 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);
199 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);
200 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);
201 g_cvarPointsCtRoundWin = CreateConVar("rankme_points_ct_round_win","0","How many points an alive CT got for winning the round?",_,true,0.0);
202 g_cvarPointsTrRoundWin = CreateConVar("rankme_points_tr_round_win","0","How many points an alive TR got for winning the round?",_,true,0.0);
203 g_cvarPointsKnifeMultiplier = CreateConVar("rankme_points_knife_multiplier","2.0","Multiplier of points by knife",_,true,0.0);
204 g_cvarPointsTaserMultiplier = CreateConVar("rankme_points_taser_multiplier","2.0","Multiplier of points by taser",_,true,0.0);
205 g_cvarPointsStart = CreateConVar("rankme_points_start","1000","Starting points",_,true,0.0);
206 g_cvarMinimalKills = CreateConVar("rankme_minimal_kills","0","Minimal kills for entering the rank",_,true,0.0);
207 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);
208 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);
209 g_cvarChatChange = CreateConVar("rankme_changes_chat","1","Show points changes on chat? 1 = true 0 = false",_,true,0.0,true,1.0);
210 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);
211 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);
212 g_cvarResetOwnRank = CreateConVar("rankme_resetownrank","0","Allow player to reset his own rank? 1 = true 0 = false",_,true,0.0,true,1.0);
213 g_cvarMinimumPlayers = CreateConVar("rankme_minimumplayers","2","Minimum players to start giving points",_,true,0.0);
214 g_cvarVipEnabled = CreateConVar("rankme_vip_enabled","0","Show AS_ maps statiscs (VIP mod) on statsme and session?",_,true,0.0,true,1.0);
215 g_cvarPointsVipEscapedTeam = CreateConVar("rankme_points_vip_escaped_team","2","How many points CTs got helping the VIP to escaping?",_,true,0.0);
216 g_cvarPointsVipEscapedPlayer = CreateConVar("rankme_points_vip_escaped_player","2","How many points the VIP got for escaping?",_,true,0.0);
217 g_cvarPointsVipKilledTeam = CreateConVar("rankme_points_vip_killed_team","2","How many points TRs got for killing the VIP?",_,true,0.0);
218 g_cvarPointsVipKilledPlayer = CreateConVar("rankme_points_vip_killed_player","2","How many points the TR who killed the VIP got additional?",_,true,0.0);
219 g_cvarPointsLoseTk = CreateConVar("rankme_points_lose_tk","0","How many points a player lose for Team Killing?",_,true,0.0);
220 g_cvarPointsLoseSuicide = CreateConVar("rankme_points_lose_suicide","0","How many points a player lose for Suiciding?",_,true,0.0);
221 g_cvarRankBy = CreateConVar("rankme_rank_by","0","Rank players by? 0 = STEAM:ID 1 = Name 2 = IP",_,true,0.0,true,2.0);
222 g_cvarFfa = CreateConVar("rankme_ffa","0","Free-For-All (FFA) mode? 1 = true 0 = false",_,true,0.0,true,1.0);
223 g_cvarMysql = CreateConVar("rankme_mysql","0","Using MySQL? 1 = true 0 = false (SQLite)",_,true,0.0,true,1.0);
224 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);
225 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);
226 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);
227 g_cvarRankMode = CreateConVar("rankme_rank_mode","1","Rank by what? 1 = by points 2 = by KDR ",_,true,1.0,true,2.0);
228 g_cvarSQLTable = CreateConVar("rankme_sql_table","rankme","The name of the table that will be used. (Max: 100)");
229 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);
230 g_cvarPointsMvpCt = CreateConVar("rankme_points_mvp_ct","1","How many points a CT got for being the MVP?",_,true,0.0);
231 g_cvarPointsMvpTr = CreateConVar("rankme_points_mvp_tr","1","How many points a TR got for being the MVP?",_,true,0.0);
232 g_cvarPointsBombPickup = CreateConVar("rankme_points_bomb_pickup","0","How many points a player gets for picking up the bomb?",_,true,0.0);
233 g_cvarPointsBombDropped = CreateConVar("rankme_points_bomb_dropped","0","How many points a player loess for dropping the bomb?",_,true,0.0);
234
235 // LOAD RANKME.CFG
236 AutoExecConfig(true,"rankme");
237
238 // CVAR HOOK
239 HookConVarChange(g_cvarEnabled,OnConVarChanged);
240 HookConVarChange(g_cvarChatChange,OnConVarChanged);
241 HookConVarChange(g_cvarShowBotsOnRank,OnConVarChanged);
242 HookConVarChange(g_cvarShowRankAll,OnConVarChanged);
243 HookConVarChange(g_cvarResetOwnRank,OnConVarChanged);
244 HookConVarChange(g_cvarMinimumPlayers,OnConVarChanged);
245 HookConVarChange(g_cvarRankbots,OnConVarChanged);
246 HookConVarChange(g_cvarAutopurge,OnConVarChanged);
247 HookConVarChange(g_cvarPointsBombDefusedTeam,OnConVarChanged);
248 HookConVarChange(g_cvarPointsBombDefusedPlayer,OnConVarChanged);
249 HookConVarChange(g_cvarPointsBombPlantedTeam,OnConVarChanged);
250 HookConVarChange(g_cvarPointsBombPlantedPlayer,OnConVarChanged);
251 HookConVarChange(g_cvarPointsBombExplodeTeam,OnConVarChanged);
252 HookConVarChange(g_cvarPointsBombExplodePlayer,OnConVarChanged);
253 HookConVarChange(g_cvarPointsHostageRescTeam,OnConVarChanged);
254 HookConVarChange(g_cvarPointsHostageRescPlayer,OnConVarChanged);
255 HookConVarChange(g_cvarPointsHs,OnConVarChanged);
256 HookConVarChange(g_cvarPointsKillCt,OnConVarChanged);
257 HookConVarChange(g_cvarPointsKillTr,OnConVarChanged);
258 HookConVarChange(g_cvarPointsKillBonusCt,OnConVarChanged);
259 HookConVarChange(g_cvarPointsKillBonusTr,OnConVarChanged);
260 HookConVarChange(g_cvarPointsKillBonusDifCt,OnConVarChanged);
261 HookConVarChange(g_cvarPointsKillBonusDifTr,OnConVarChanged);
262 HookConVarChange(g_cvarPointsCtRoundWin,OnConVarChanged);
263 HookConVarChange(g_cvarPointsTrRoundWin,OnConVarChanged);
264 HookConVarChange(g_cvarPointsKnifeMultiplier,OnConVarChanged);
265 HookConVarChange(g_cvarPointsTaserMultiplier,OnConVarChanged);
266 HookConVarChange(g_cvarPointsStart,OnConVarChanged);
267 HookConVarChange(g_cvarMinimalKills,OnConVarChanged);
268 HookConVarChange(g_cvarPercentPointsLose,OnConVarChanged);
269 HookConVarChange(g_cvarPointsLoseRoundCeil,OnConVarChanged);
270 HookConVarChange(g_cvarVipEnabled,OnConVarChanged);
271 HookConVarChange(g_cvarPointsVipEscapedTeam,OnConVarChanged);
272 HookConVarChange(g_cvarPointsVipEscapedPlayer,OnConVarChanged);
273 HookConVarChange(g_cvarPointsVipKilledTeam,OnConVarChanged);
274 HookConVarChange(g_cvarPointsVipKilledPlayer,OnConVarChanged);
275 HookConVarChange(g_cvarPointsLoseTk,OnConVarChanged);
276 HookConVarChange(g_cvarPointsLoseSuicide,OnConVarChanged);
277 HookConVarChange(g_cvarRankBy,OnConVarChanged);
278 HookConVarChange(g_cvarFfa,OnConVarChanged);
279 HookConVarChange(g_cvarDumpDB,OnConVarChanged);
280 HookConVarChange(g_cvarGatherStats,OnConVarChanged);
281 HookConVarChange(g_cvarDaysToNotShowOnRank,OnConVarChanged);
282 HookConVarChange(g_cvarRankMode,OnConVarChanged);
283 HookConVarChange(g_cvarMysql,OnConVarChanged_MySQL);
284 HookConVarChange(g_cvarSQLTable,OnConVarChanged_MySQL);
285 HookConVarChange(g_cvarChatTriggers,OnConVarChanged);
286 HookConVarChange(g_cvarPointsMvpCt,OnConVarChanged);
287 HookConVarChange(g_cvarPointsMvpTr,OnConVarChanged);
288 HookConVarChange(g_cvarPointsBombPickup,OnConVarChanged);
289 HookConVarChange(g_cvarPointsBombDropped,OnConVarChanged);
290
291 // LOAD TRANSLATIONS
292 LoadTranslations("rankme.phrases");
293
294 // EVENTS
295 HookEventEx("player_death", EventPlayerDeath);
296 HookEventEx("player_spawn", EventPlayerSpawn);
297 HookEventEx("player_hurt", EventPlayerHurt);
298 HookEventEx("weapon_fire", EventWeaponFire);
299 HookEventEx( "bomb_planted", Event_BombPlanted );
300 HookEventEx( "bomb_defused", Event_BombDefused );
301 HookEventEx( "bomb_exploded", Event_BombExploded );
302 HookEventEx( "bomb_dropped", Event_BombDropped );
303 HookEventEx( "bomb_pickup", Event_BombPickup );
304 HookEventEx( "hostage_rescued", Event_HostageRescued );
305 HookEventEx( "vip_killed", Event_VipKilled );
306 HookEventEx( "vip_escaped", Event_VipEscaped );
307 HookEventEx("round_end", Event_RoundEnd);
308 HookEventEx("round_mvp", Event_RoundMVP);
309 HookEventEx("player_changename", OnClientChangeName, EventHookMode_Pre);
310
311 // ADMNIN COMMANDS
312 RegAdminCmd("sm_resetrank",CMD_ResetRank,ADMFLAG_ROOT,"RankMe: Resets the rank of a player");
313 RegAdminCmd("sm_rankme_remove_duplicate",CMD_Duplicate,ADMFLAG_ROOT, "RankMe: Removes the duplicated rows on the database");
314 RegAdminCmd("sm_rankpurge",CMD_Purge,ADMFLAG_ROOT, "RankMe: Purges from the rank players that didn't connected for X days");
315 RegAdminCmd("sm_resetrank_all",CMD_ResetRankAll,ADMFLAG_ROOT,"RankMe: Resets the rank of all players");
316 //RegAdminCmd("sm_rankme_import_mani",CMD_ManiImport,ADMFLAG_ROOT, "RankMe: Imports the Mani's rank data to RankMe");
317 RegAdminCmd("sm_statsme2",CMD_StatsMe2,ADMFLAG_GENERIC, "RankMe: Shows the stats from a player");
318
319 // PLAYER COMMANDS
320 RegConsoleCmd("sm_session",CMD_Session,"RankMe: Shows the stats of your current session");
321 RegConsoleCmd("sm_rank",CMD_Rank, "RankMe: Shows your rank");
322 RegConsoleCmd("sm_top",CMD_Top, "RankMe: Shows the TOP");
323 RegConsoleCmd("sm_topknife",CMD_TopKnife,"RankMe: Shows the TOP ordered by knife kills");
324 RegConsoleCmd("sm_toptaser",CMD_TopTaser,"RankMe: Shows the TOP ordered by taser kills");
325 RegConsoleCmd("sm_topnade",CMD_TopNade, "RankMe: Shows the TOP ordered by grenade kills");
326 RegConsoleCmd("sm_topweapon",CMD_TopWeapon, "RankMe: Shows the TOP ordered by kills with a specific weapon");
327 RegConsoleCmd("sm_topacc",CMD_TopAcc, "RankMe: Shows the TOP ordered by accuracy");
328 RegConsoleCmd("sm_tophs",CMD_TopHS, "RankMe: Shows the TOP ordered by HeadShots");
329 RegConsoleCmd("sm_toptime",CMD_TopTime, "RankMe: Shows the TOP ordered by Connected Time");
330 RegConsoleCmd("sm_topkills",CMD_TopKills, "RankMe: Shows the TOP ordered by kills");
331 RegConsoleCmd("sm_topdeaths",CMD_TopDeaths, "RankMe: Shows the TOP ordered by deaths");
332 RegConsoleCmd("sm_hitboxme",CMD_HitBox,"RankMe: Shows the HitBox stats");
333 RegConsoleCmd("sm_weaponme",CMD_WeaponMe,"RankMe: Shows the kills with each weapon");
334 RegConsoleCmd("sm_resetmyrank",CMD_ResetOwnRank, "RankMe: Resets your own rank");
335 RegConsoleCmd("sm_statsme",CMD_StatsMe, "RankMe: Shows your stats");
336 RegConsoleCmd("sm_next",CMD_Next, "RankMe: Shows the next 9 players above you on the TOP");
337
338 RegConsoleCmd("sm_rankme",CMD_RankMe, "RankMe: Shows a menu with the basic commands");
339
340 // Hook the say and say_team for chat triggers
341 AddCommandListener(OnSayText, "say");
342 AddCommandListener(OnSayText, "say_team");
343
344 new Handle:cvarVersion = CreateConVar("rankme_version",PLUGIN_VERSION,"RankMe Version",FCVAR_PLUGIN|FCVAR_REPLICATED|FCVAR_NOTIFY|FCVAR_DONTRECORD);
345 // UPDATE THE CVAR IF NEEDED
346 new String:sVersionOnCvar[10];
347 GetConVarString(cvarVersion,sVersionOnCvar,sizeof(sVersionOnCvar));
348 if(!StrEqual(PLUGIN_VERSION,sVersionOnCvar))
349 SetConVarString(cvarVersion,PLUGIN_VERSION,true,true);
350
351 // Create the forwards
352 g_fwdOnPlayerLoaded = CreateGlobalForward("RankMe_OnPlayerLoaded",ET_Hook,Param_Cell);
353 g_fwdOnPlayerSaved = CreateGlobalForward("RankMe_OnPlayerSaved",ET_Hook,Param_Cell);
354
355}
356
357public OnConVarChanged_SQLTable(Handle:convar, const String:oldValue[], const String:newValue[]){
358
359 GetConVarString(g_cvarSQLTable,g_sSQLTable,sizeof(g_sSQLTable));
360 DB_Connect(true); // Force reloading the stats
361}
362
363public OnConVarChanged_MySQL(Handle:convar, const String:oldValue[], const String:newValue[]){
364 DB_Connect(false);
365}
366
367public DB_Connect(bool:firstload){
368
369 if(g_bMysql != GetConVarBool(g_cvarMysql) || firstload){ // NEEDS TO CONNECT IF CHANGED MYSQL CVAR OR NEVER CONNECTED
370 g_bMysql = GetConVarBool(g_cvarMysql);
371 GetConVarString(g_cvarSQLTable,g_sSQLTable,sizeof(g_sSQLTable));
372 decl String:sError[256];
373 if(g_bMysql){
374 g_hStatsDb = SQL_Connect("rankme", false, sError, sizeof(sError));
375 } else {
376 g_hStatsDb = SQLite_UseDatabase("rankme",sError,sizeof(sError));
377 }
378 if(g_hStatsDb == INVALID_HANDLE)
379 {
380 SetFailState("[RankMe] Unable to connect to the database (%s)",sError);
381 }
382 SQL_LockDatabase(g_hStatsDb);
383 new String:sQuery[1200];
384 Format(sQuery,sizeof(sQuery),g_sSqlCreate,g_sSQLTable);
385 SQL_FastQuery(g_hStatsDb,sQuery);
386 Format(sQuery,sizeof(sQuery),"ALTER TABLE `%s` MODIFY id INTEGER AUTO_INCREMENT",g_sSQLTable);
387 SQL_FastQuery(g_hStatsDb,sQuery);
388 Format(sQuery,sizeof(sQuery),"ALTER TABLE `%s` ADD COLUMN vip_killed NUMERIC",g_sSQLTable);
389 SQL_FastQuery(g_hStatsDb,sQuery);
390 Format(sQuery,sizeof(sQuery),"ALTER TABLE `%s` ADD COLUMN vip_escaped NUMERIC",g_sSQLTable);
391 SQL_FastQuery(g_hStatsDb,sQuery);
392 Format(sQuery,sizeof(sQuery),"ALTER TABLE `%s` ADD COLUMN vip_played NUMERIC",g_sSQLTable);
393 SQL_FastQuery(g_hStatsDb,sQuery);
394 SQL_UnlockDatabase(g_hStatsDb);
395
396 for(new i=1;i<=MaxClients;i++){
397 if(IsClientInGame(i))
398 OnClientPutInServer(i);
399 }
400 }
401
402}
403public OnConfigsExecuted(){
404
405 if(g_hStatsDb == INVALID_HANDLE)
406 DB_Connect(true);
407 else
408 DB_Connect(false);
409 new AutoPurge = GetConVarInt(g_cvarAutopurge);
410 new String:sQuery[500];
411 if(AutoPurge > 0){
412 new DeleteBefore = GetTime() - (AutoPurge*86400);
413 Format(sQuery,sizeof(sQuery),"DELETE FROM `%s` WHERE lastconnect < '%d'",g_sSQLTable,DeleteBefore);
414 SQL_TQuery(g_hStatsDb,SQL_PurgeCallback,sQuery);
415 }
416
417 g_bShowBotsOnRank = GetConVarBool(g_cvarShowBotsOnRank);
418 g_RankBy = GetConVarInt(g_cvarRankBy);
419 g_bEnabled = GetConVarBool(g_cvarEnabled);
420 g_bChatChange = GetConVarBool(g_cvarChatChange);
421 g_bShowRankAll = GetConVarBool(g_cvarShowRankAll);
422 g_bRankBots = GetConVarBool(g_cvarRankbots);
423 g_bFfa = GetConVarBool(g_cvarFfa);
424 g_bDumpDB = GetConVarBool(g_cvarDumpDB);
425 g_PointsBombDefusedTeam = GetConVarInt(g_cvarPointsBombDefusedTeam);
426 g_PointsBombDefusedPlayer = GetConVarInt(g_cvarPointsBombDefusedPlayer);
427 g_PointsBombPlantedTeam = GetConVarInt(g_cvarPointsBombPlantedTeam);
428 g_PointsBombPlantedPlayer = GetConVarInt(g_cvarPointsBombPlantedPlayer);
429 g_PointsBombExplodeTeam = GetConVarInt(g_cvarPointsBombExplodeTeam);
430 g_PointsBombExplodePlayer = GetConVarInt(g_cvarPointsBombExplodePlayer);
431 g_PointsHostageRescTeam = GetConVarInt(g_cvarPointsHostageRescTeam);
432 g_PointsHostageRescPlayer = GetConVarInt(g_cvarPointsHostageRescPlayer);
433 g_PointsHs = GetConVarInt(g_cvarPointsHs);
434 g_PointsKill[CT] = GetConVarInt(g_cvarPointsKillCt);
435 g_PointsKill[TR] = GetConVarInt(g_cvarPointsKillTr);
436 g_PointsKillBonus[CT] = GetConVarInt(g_cvarPointsKillBonusCt);
437 g_PointsKillBonus[TR] = GetConVarInt(g_cvarPointsKillBonusTr);
438 g_PointsKillBonusDif[CT] = GetConVarInt(g_cvarPointsKillBonusDifCt);
439 g_PointsKillBonusDif[TR] = GetConVarInt(g_cvarPointsKillBonusDifTr);
440 g_PointsStart = GetConVarInt(g_cvarPointsStart);
441 g_fPointsKnifeMultiplier = GetConVarFloat(g_cvarPointsKnifeMultiplier);
442 g_fPointsTaserMultiplier = GetConVarFloat(g_cvarPointsTaserMultiplier);
443 g_PointsRoundWin[TR] = GetConVarInt(g_cvarPointsTrRoundWin);
444 g_PointsRoundWin[CT] = GetConVarInt(g_cvarPointsCtRoundWin);
445 g_MinimalKills = GetConVarInt(g_cvarMinimalKills);
446 g_fPercentPointsLose = GetConVarFloat(g_cvarPercentPointsLose);
447 g_bPointsLoseRoundCeil = GetConVarBool(g_cvarPointsLoseRoundCeil);
448 g_MinimumPlayers = GetConVarInt(g_cvarMinimumPlayers);
449 g_bResetOwnRank = GetConVarBool(g_cvarResetOwnRank);
450 g_PointsVipEscapedTeam = GetConVarInt(g_cvarPointsVipEscapedTeam);
451 g_PointsVipEscapedPlayer = GetConVarInt(g_cvarPointsVipEscapedPlayer);
452 g_PointsVipKilledTeam = GetConVarInt(g_cvarPointsVipKilledTeam);
453 g_PointsVipKilledPlayer = GetConVarInt(g_cvarPointsVipKilledPlayer);
454 g_bVipEnabled = GetConVarBool(g_cvarVipEnabled);
455 g_PointsLoseTk = GetConVarInt(g_cvarPointsLoseTk);
456 g_PointsLoseSuicide = GetConVarInt(g_cvarPointsLoseSuicide);
457 g_DaysToNotShowOnRank = GetConVarInt(g_cvarDaysToNotShowOnRank);
458 g_bGatherStats = GetConVarBool(g_cvarGatherStats);
459 g_RankMode = GetConVarInt(g_cvarRankMode);
460 g_bChatTriggers = GetConVarBool(g_cvarChatTriggers);
461 g_PointsMvpCt = GetConVarInt(g_cvarPointsMvpCt);
462 g_PointsMvpTr = GetConVarInt(g_cvarPointsMvpTr);
463 g_PointsBombDropped = GetConVarInt(g_cvarPointsBombDropped);
464 g_PointsBombPickup = GetConVarInt(g_cvarPointsBombPickup);
465
466 if(g_bRankBots)
467 Format(sQuery,sizeof(sQuery),"SELECT * FROM `%s` WHERE kills >= '%d'",g_sSQLTable,g_MinimalKills);
468 else
469 Format(sQuery,sizeof(sQuery),"SELECT * FROM `%s` WHERE kills >= '%d' AND steam <> 'BOT'",g_sSQLTable,g_MinimalKills);
470
471 SQL_TQuery(g_hStatsDb,SQL_GetPlayersCallback,sQuery);
472
473}
474public Action:CMD_Duplicate(client,args){
475 new String:sQuery[400];
476
477 if(g_bMysql){
478
479 if(g_RankBy == 0)
480 Format(sQuery,sizeof(sQuery),g_sSqlRemoveDuplicateMySQL,g_sSQLTable,g_sSQLTable,g_sSQLTable,g_sSQLTable,g_sSQLTable);
481
482 else if(g_RankBy == 1)
483 Format(sQuery,sizeof(sQuery),g_sSqlRemoveDuplicateNameMySQL,g_sSQLTable,g_sSQLTable,g_sSQLTable,g_sSQLTable,g_sSQLTable);
484
485 else if(g_RankBy == 2)
486 Format(sQuery,sizeof(sQuery),g_sSqlRemoveDuplicateIpMySQL,g_sSQLTable,g_sSQLTable,g_sSQLTable,g_sSQLTable,g_sSQLTable);
487
488 } else {
489
490 if(g_RankBy == 0)
491 Format(sQuery,sizeof(sQuery),g_sSqlRemoveDuplicateSQLite,g_sSQLTable,g_sSQLTable,g_sSQLTable,g_sSQLTable);
492
493 else if(g_RankBy == 1)
494 Format(sQuery,sizeof(sQuery),g_sSqlRemoveDuplicateNameSQLite,g_sSQLTable,g_sSQLTable,g_sSQLTable,g_sSQLTable);
495
496 else if(g_RankBy == 2)
497 Format(sQuery,sizeof(sQuery),g_sSqlRemoveDuplicateIpSQLite,g_sSQLTable,g_sSQLTable,g_sSQLTable,g_sSQLTable);
498
499 }
500
501 SQL_TQuery(g_hStatsDb,SQL_DuplicateCallback,sQuery,client);
502
503 return Plugin_Handled;
504}
505
506public SQL_DuplicateCallback(Handle:owner, Handle:hndl, const String:error[], any:client)
507{
508 if(hndl == INVALID_HANDLE)
509 {
510 LogError("[RankMe] Query Fail: %s", error);
511 return;
512 }
513
514 PrintToServer("[RankMe]: %d duplicated rows removed",SQL_GetAffectedRows(owner));
515 if(client != 0){
516 PrintToChat(client,"[RankMe]: %d duplicated rows removed",SQL_GetAffectedRows(owner));
517 }
518 //LogAction(-1,-1,"[RankMe]: %d players purged by inactivity",SQL_GetAffectedRows(owner));
519
520}
521/*
522public Action:CMD_ManiImport(client,args){
523 new String:sFile[PLATFORM_MAX_PATH];
524 BuildPath(Path_SM, sFile, sizeof(sFile), "../../cfg/mani_admin_plugin/data/mani_ranks.txt");
525 new Handle:hFile = OpenFile(sFile,"r");
526 new String:sBuffer[600];
527 new String:aData[74][MAX_NAME_LENGTH];
528 new String:sQuery[1500];
529 while (!IsEndOfFile(hFile)){
530 sBuffer = "";
531 ReadFileLine(hFile,sBuffer,sizeof(sBuffer));
532
533
534 if(StrContains(sBuffer,"/") == 0 || strlen(sBuffer) == 0){} else {
535 ExplodeString(sBuffer,",",aData,74,MAX_NAME_LENGTH);
536 Format(sQuery,sizeof(sQuery),"INSERT INTO `%s` (id,steam,name,lastip,score) SELECT NULL,'%s','%s','%s','%d' FROM `%s` WHERE NOT EXISTS (SELECT 1 FROM `%s` WHERE steam = '%s') LIMIT 1",g_sSQLTable,aData[0],aData[64],aData[01],g_PointsStart,g_sSQLTable,g_sSQLTable,aData[0]);
537 //Format(sQuery,sizeof(sQuery),"INSERT INTO `%s` (id,steam,name,lastip,score) SELECT NULL,'%s','%s','%s','%d' WHERE NOT EXISTS (SELECT 1 FROM `%s` WHERE steam = '%s')",g_sSQLTable,aData[0],aData[64],aData[01],g_PointsStart,g_sSQLTable,aData[0]);
538
539 ReplaceString(sQuery,sizeof(sQuery),"\n","");
540 SQL_TQuery(g_hStatsDb,SQL_NothingCallback,sQuery);
541
542 client =0;
543
544 new String:sWeaponsQuery[500] = "";
545
546 g_aWeapons[client][0]=StringToInt(aData[29]);
547 g_aWeapons[client][1]=StringToInt(aData[37]);
548 g_aWeapons[client][2]=StringToInt(aData[24]);
549 g_aWeapons[client][3]=StringToInt(aData[45]);
550 g_aWeapons[client][4]=StringToInt(aData[25]);
551 g_aWeapons[client][5]=StringToInt(aData[42]);
552 g_aWeapons[client][6]=StringToInt(aData[44]);
553 g_aWeapons[client][7]=StringToInt(aData[33]);
554 g_aWeapons[client][8]=StringToInt(aData[28]);
555 g_aWeapons[client][9]=StringToInt(aData[43]);
556 g_aWeapons[client][10]=StringToInt(aData[38]);
557 g_aWeapons[client][11]=StringToInt(aData[22]);
558 g_aWeapons[client][12]=StringToInt(aData[39]);
559 g_aWeapons[client][13]=StringToInt(aData[40]);
560 g_aWeapons[client][14]=StringToInt(aData[32]);
561 g_aWeapons[client][15]=StringToInt(aData[20]);
562 g_aWeapons[client][16]=StringToInt(aData[31]);
563 g_aWeapons[client][17]=StringToInt(aData[36]);
564 g_aWeapons[client][18]=StringToInt(aData[21]);
565 g_aWeapons[client][19]=StringToInt(aData[26]);
566 g_aWeapons[client][20]=StringToInt(aData[34]);
567 g_aWeapons[client][21]=StringToInt(aData[35]);
568 g_aWeapons[client][22]=StringToInt(aData[23]);
569 g_aWeapons[client][23]=StringToInt(aData[30]);
570 g_aWeapons[client][24]=StringToInt(aData[41]);
571 g_aWeapons[client][25]=StringToInt(aData[27]);
572 g_aWeapons[client][26]=StringToInt(aData[46]);
573 g_aWeapons[client][27]=StringToInt(aData[47]);
574 for(new i=0;i<=36;i++){
575 Format(sWeaponsQuery,sizeof(sWeaponsQuery),"%s,%s='%d'",sWeaponsQuery,g_sWeaponsNamesGame[i],g_aWeapons[client][i]);
576 }
577 Format(sQuery,sizeof(sQuery),"UPDATE `%s` SET score = '%s', kills = '%s', deaths='%s',suicides='%s',tk='%s',shots='%s',hits='%s',headshots='%s', rounds_tr = '%d', rounds_ct = '%d',lastip='%s',name='%s'%s,head='%s',chest='%s', stomach='%s',left_arm='%s',right_arm='%s',left_leg='%s',right_leg='%s',c4_planted='%s',c4_exploded='%s',c4_defused='%s',ct_win='%s',tr_win='%s', hostages_rescued='%s',vip_killed = '%s',vip_escaped = '%s',vip_played = '%s', lastconnect='%i', connected='%i' WHERE steam = '%s';",g_sSQLTable,aData[04],aData[07],aData[5],aData[8],aData[9],aData[57],aData[58],aData[06],StringToInt(aData[71])+StringToInt(aData[72]),StringToInt(aData[69])+StringToInt(aData[70]),aData[01],aData[73],sWeaponsQuery,aData[13],aData[14],aData[15],aData[16],aData[17],aData[18],aData[19],aData[59],aData[64],aData[60],aData[69],aData[71],aData[61],aData[68],aData[67],aData[67],StringToInt(aData[2]),StringToInt(aData[10]),aData[0]);
578 ReplaceString(sQuery,sizeof(sQuery),"\n","");
579 SQL_TQuery(g_hStatsDb,SQL_NothingCallback,sQuery);
580
581 }
582
583 }
584 for(new d=1;d<=MaxClients;d++){
585 if(IsClientInGame(d))
586 OnClientPutInServer(d);
587 }
588}*/
589public APLRes:AskPluginLoad2(Handle:myself, bool:late, String:error[], err_max)
590{
591 CreateNative("RankMe_GivePoint", Native_GivePoint);
592 CreateNative("RankMe_GetRank", Native_GetRank);
593 CreateNative("RankMe_GetPoints", Native_GetPoints);
594 CreateNative("RankMe_GetStats", Native_GetStats);
595 CreateNative("RankMe_GetSession", Native_GetSession);
596 CreateNative("RankMe_GetWeaponStats", Native_GetWeaponStats);
597 CreateNative("RankMe_GetHitbox", Native_GetHitbox);
598
599 RegPluginLibrary("rankme");
600
601 return APLRes_Success;
602}
603public Native_GivePoint(Handle:plugin, numParams)
604{
605 new iClient = GetNativeCell(1);
606 new iPoints = GetNativeCell(2);
607
608 new len;
609 GetNativeStringLength(3, len);
610
611 if (len <= 0)
612 {
613 return;
614 }
615
616
617 new String:Reason[len+1];
618 new String:Name[MAX_NAME_LENGTH];
619 GetNativeString(3, Reason, len+1);
620 new iPrintToPlayer=GetNativeCell(4);
621 new iPrintToAll=GetNativeCell(5);
622 g_aStats[iClient][SCORE] += iPoints;
623 g_aSession[iClient][SCORE] += iPoints;
624 SalvarPlayer(iClient);
625 GetClientName(iClient,Name,sizeof(Name));
626 if(!g_bChatChange)
627 return;
628 if(iPrintToAll == 1){
629 for(new i = 1; i <= MaxClients;i++)
630 if(IsClientInGame(i))
631 //CPrintToChatEx(i,i,"%s %t",MSG,"GotPointsBy",Name,g_aStats[iClient][SCORE],iPoints,Reason);
632 CPrintToChat(i,"%s %t",MSG,"GotPointsBy",Name,g_aStats[iClient][SCORE],iPoints,Reason);
633 } else if( iPrintToPlayer == 1) {
634 //CPrintToChatEx(iClient,iClient,"%s %t",MSG,"GotPointsBy",Name,g_aStats[iClient][SCORE],iPoints,Reason);
635 CPrintToChat(iClient,"%s %t",MSG,"GotPointsBy",Name,g_aStats[iClient][SCORE],iPoints,Reason);
636 }
637}
638
639public Native_GetRank(Handle:plugin, numParams)
640{
641 new client = GetNativeCell(1);
642 new Function:callback = GetNativeCell(2);
643 new any:data = GetNativeCell(3);
644
645 new Handle:pack = CreateDataPack();
646
647 WritePackCell(pack, client);
648 WritePackCell(pack, _:callback);
649 WritePackCell(pack, data);
650 WritePackCell(pack, _:plugin);
651
652 new String:query[500];
653 MakeSelectQuery(query,sizeof(query));
654
655 if(g_RankMode == 1)
656 Format(query,sizeof(query),"%s ORDER BY score DESC",query);
657 else if(g_RankMode == 2)
658 Format(query,sizeof(query),"%s ORDER BY CAST(CAST(kills as float)/CAST (deaths as float) as float) DESC",query);
659
660 SQL_TQuery(g_hStatsDb, SQL_GetRankCallback, query, pack);
661}
662
663public SQL_GetRankCallback(Handle:owner, Handle:hndl, const String:error[], any:data)
664{
665 new Handle:pack = data;
666 ResetPack(pack);
667 new client = ReadPackCell(pack);
668 new Function:callback = Function:ReadPackCell(pack);
669 new any:args = ReadPackCell(pack);
670 new Handle:plugin = Handle:ReadPackCell(pack);
671 CloseHandle(pack);
672
673 if(hndl == INVALID_HANDLE)
674 {
675 LogError("[RankMe] Query Fail: %s", error);
676 CallRankCallback(0, 0, Function:callback, 0, plugin);
677 return;
678 }
679 new i;
680 g_TotalPlayers =SQL_GetRowCount(hndl);
681
682 new String:Receive[64];
683
684 while(SQL_HasResultSet(hndl) && SQL_FetchRow(hndl))
685 {
686 i++;
687
688 if(g_RankBy==0){
689 SQL_FetchString(hndl,1,Receive,sizeof(Receive));
690 if(StrEqual(Receive,g_aClientSteam[client],false))
691 {
692 CallRankCallback(client, i, Function:callback, args, plugin);
693 break;
694 }
695 } else if(g_RankBy==1){
696 SQL_FetchString(hndl,2,Receive,sizeof(Receive));
697 if(StrEqual(Receive,g_aClientName[client],false))
698 {
699 CallRankCallback(client, i, Function:callback, args, plugin);
700 break;
701 }
702 } else if(g_RankBy==2){
703 SQL_FetchString(hndl,3,Receive,sizeof(Receive));
704 if(StrEqual(Receive,g_aClientIp[client],false))
705 {
706 CallRankCallback(client, i, Function:callback, args, plugin);
707 break;
708 }
709 }
710 }
711}
712
713CallRankCallback(client, rank, Function:callback, any:data, Handle:plugin)
714{
715 Call_StartFunction(plugin, callback);
716 Call_PushCell(client);
717 Call_PushCell(rank);
718 Call_PushCell(data);
719 Call_Finish();
720 CloseHandle(plugin);
721}
722
723public Native_GetPoints(Handle:plugin, numParams)
724{
725 new Client = GetNativeCell(1);
726 return g_aStats[Client][SCORE];
727}
728
729public Native_GetStats(Handle:plugin, numParams)
730{
731 new iClient = GetNativeCell(1);
732 new array[20];
733 for(new i=0;i<20;i++)
734 array[i] = g_aStats[iClient][i];
735
736 SetNativeArray(2,array,20);
737
738}
739public Native_GetSession(Handle:plugin, numParams)
740{
741 new iClient = GetNativeCell(1);
742 new array[20];
743 for(new i=0;i<20;i++)
744 array[i] = g_aSession[iClient][i];
745
746 SetNativeArray(2,array,20);
747
748}
749
750public Native_GetWeaponStats(Handle:plugin, numParams)
751{
752 new iClient = GetNativeCell(1);
753 new array[37];
754 for(new i=0;i<37;i++)
755 array[i] = g_aWeapons[iClient][i];
756
757 SetNativeArray(2,array,37);
758
759}
760
761public Native_GetHitbox(Handle:plugin, numParams)
762{
763 new iClient = GetNativeCell(1);
764 new array[8];
765 for(new i=0;i<8;i++)
766 array[i] = g_aHitBox[iClient][i];
767
768 SetNativeArray(2,array,8);
769}
770
771
772public DumpDB(){
773 if(!g_bDumpDB || g_bMysql)
774 return;
775 new String:sQuery[500];
776 Format(sQuery,sizeof(sQuery),"SELECT * from `%s`",g_sSQLTable);
777 SQL_TQuery(g_hStatsDb,SQL_DumpCallback,sQuery);
778}
779
780public Action:OnClientChangeName(Handle:event, const String:name[], bool:dontBroadcast)
781{
782 if(!g_bEnabled)
783 return Plugin_Continue;
784 new client = GetClientOfUserId(GetEventInt(event, "userid"));
785 if(!g_bRankBots && IsFakeClient(client))
786 return Plugin_Continue;
787 if(IsClientConnected(client))
788 {
789 decl String:clientnewname[MAX_NAME_LENGTH];
790 GetEventString(event, "newname", clientnewname, sizeof(clientnewname));
791 if(client==g_C4PlantedBy)
792 strcopy(g_sC4PlantedByName,sizeof(g_sC4PlantedByName),clientnewname);
793 decl String:Eclientnewname[MAX_NAME_LENGTH*2+1];
794 SQL_EscapeString(g_hStatsDb,clientnewname,Eclientnewname,sizeof(Eclientnewname));
795
796 //ReplaceString(clientnewname, sizeof(clientnewname), "'", "");
797 new String:query[500];
798 if(g_RankBy == 1){
799 OnDB[client]=false;
800 for(new i=0;i<=19;i++){
801 g_aSession[client][i] = 0;
802 g_aStats[client][i] = 0;
803 }
804 g_aStats[client][SCORE]=g_PointsStart;
805 for(new i=0;i<=36;i++){
806 g_aWeapons[client][i] = 0;
807 }
808 g_aSession[client][CONNECTED] = GetTime();
809
810 strcopy(g_aClientName[client],MAX_NAME_LENGTH,clientnewname);
811
812 Format(query,sizeof(query),g_sSqlRetrieveClientName,g_sSQLTable,Eclientnewname);
813 if(DEBUGGING){
814 PrintToServer(query);
815 LogError("%s",query);
816 }
817 SQL_TQuery(g_hStatsDb,SQL_LoadPlayerCallback,query,client);
818
819 } else {
820
821 if(g_RankBy == 0)
822 Format(query,sizeof(query),"UPDATE `%s` SET name='%s' WHERE steam = '%s';",g_sSQLTable,Eclientnewname,g_aClientSteam[client]);
823 else
824 Format(query,sizeof(query),"UPDATE `%s` SET name='%s' WHERE lastip = '%s';",g_sSQLTable,Eclientnewname,g_aClientIp[client]);
825
826 SQL_TQuery(g_hStatsDb,SQL_NothingCallback,query);
827 }
828 }
829 return Plugin_Continue;
830}
831
832// Code made by Antithasys
833public Action:OnSayText(client, const String:command[], argc)
834{
835 if(!g_bEnabled || !g_bChatTriggers || client == SENDER_WORLD || IsChatTrigger())
836 { // Don't parse if plugin is disabled or if is from the console or a chat trigger (e.g: ! or /)
837 return Plugin_Continue;
838 }
839
840 decl String:cpMessage[256];
841 decl String:sWords[64][256];
842 GetCmdArgString(cpMessage,sizeof(cpMessage)); // Get the message
843 StripQuotes(cpMessage); // Text come inside quotes
844 //ReplaceString(cpMessage,sizeof(cpMessage),"\"","");
845 ExplodeString(cpMessage, " ", sWords, sizeof(sWords), sizeof(sWords[])); // Explode it for use at top, topknife, topnade and topweapon
846
847 // Proccess the text
848 if (StrEqual(cpMessage, "rank", false))
849 {
850 //LogToFile("rankme.debug.log","\"rank\" chat hook called by client %d.",client);
851 CMD_Rank(client, 0);
852 }
853 else if (StrEqual(cpMessage, "statsme", false))
854 {
855 CMD_StatsMe(client, 0);
856 }
857 else if (StrEqual(cpMessage, "hitboxme", false))
858 {
859 CMD_HitBox(client,0);
860 }
861 else if (StrEqual(cpMessage, "weaponme", false))
862 {
863 CMD_WeaponMe(client,0);
864 }
865 else if (StrEqual(cpMessage, "session", false))
866 {
867 CMD_Session(client,0);
868 }
869 else if (StrEqual(cpMessage[0], "next", false))
870 {
871 CMD_Next(client, 0);
872 }
873 else if (StrContains(sWords[0], "topknife", false) == 0)
874 {
875 if (strcmp(cpMessage, "topknife") == 0)
876 {
877 ShowTOPKnife(client, 0);
878 }
879 else
880 {
881 ShowTOPKnife(client, StringToInt(cpMessage[8]));
882 }
883 }
884 else if (StrContains(sWords[0], "toptaser", false) == 0)
885 {
886 if (strcmp(cpMessage, "toptaser") == 0)
887 {
888 ShowTOPTaser(client, 0);
889 }
890 else
891 {
892 ShowTOPTaser(client, StringToInt(cpMessage[8]));
893 }
894 }
895 else if (StrContains(sWords[0], "topnade", false) == 0)
896 {
897 if (strcmp(cpMessage, "topnade") == 0)
898 {
899 ShowTOPNade(client, 0);
900 }
901 else
902 {
903 ShowTOPNade(client, StringToInt(cpMessage[7]));
904 }
905 }
906 else if (StrContains(sWords[0], "tophs", false) == 0)
907 {
908 if (strcmp(cpMessage, "tophs") == 0)
909 {
910 ShowTopHS(client, 0);
911 }
912 else
913 {
914 ShowTopHS(client, StringToInt(cpMessage[7]));
915 }
916 }
917 else if (StrContains(sWords[0], "topkills", false) == 0)
918 {
919 if (strcmp(cpMessage, "topkills") == 0)
920 {
921 ShowTopKills(client, 0);
922 }
923 else
924 {
925 ShowTopKills(client, StringToInt(cpMessage[7]));
926 }
927 }
928 else if (StrContains(sWords[0], "topdeaths", false) == 0)
929 {
930 if (strcmp(cpMessage, "topdeaths") == 0)
931 {
932 ShowTopDeaths(client, 0);
933 }
934 else
935 {
936 ShowTopDeaths(client, StringToInt(cpMessage[7]));
937 }
938 }
939 else if (StrContains(sWords[0], "topacc", false) == 0)
940 {
941 if (strcmp(cpMessage, "topacc") == 0)
942 {
943 ShowTopAcc(client, 0);
944 }
945 else
946 {
947 ShowTopAcc(client, StringToInt(cpMessage[7]));
948 }
949 }
950 else if (StrContains(sWords[0], "toptime", false) == 0)
951 {
952 if (strcmp(cpMessage, "toptime") == 0)
953 {
954 ShowTopTime(client, 0);
955 }
956 else
957 {
958 ShowTopTime(client, StringToInt(cpMessage[7]));
959 }
960 }
961 else if (StrContains(sWords[0], "topweapon", false) == 0)
962 {
963 if (strcmp(cpMessage, "topweapon") == 0)
964 {
965 CMD_TopWeapon(client,0); // Build the menu on the next frame
966 }
967 else
968 {
969 if (GetWeaponNum(sWords[1]) == 30)
970 {
971 CMD_TopWeapon(client,0);
972 }
973 else
974 {
975 ShowTOPWeapon(client, GetWeaponNum(sWords[1]), StringToInt(sWords[2]));
976 }
977 }
978 }
979 else if (StrContains(sWords[0],"top", false) == 0)
980 {
981 if (strcmp(cpMessage,"top") == 0)
982 {
983 ShowTOP(client, 0);
984 }
985 else
986 {
987 ShowTOP(client, StringToInt(cpMessage[3]));
988 }
989 }
990 return Plugin_Continue;
991}
992
993public GetCurrentPlayers(){
994 new count;
995 for(new i=1;i<=MaxClients;i++){
996 if(IsClientInGame(i) && (!IsFakeClient(i) || g_bRankBots)){
997 count++;
998 }
999 }
1000 return count;
1001}
1002
1003public OnPluginEnd(){
1004 if(!g_bEnabled)
1005 return;
1006 SQL_LockDatabase(g_hStatsDb);
1007 for(new client=1;client<=MaxClients;client++){
1008 if(IsClientInGame(client)){
1009 if(!g_bRankBots && IsFakeClient(client))
1010 return;
1011 new String:name[MAX_NAME_LENGTH];
1012 GetClientName(client, name, sizeof(name));
1013 new String:sEscapeName[MAX_NAME_LENGTH*2+1];
1014 SQL_EscapeString(g_hStatsDb,name,sEscapeName,sizeof(sEscapeName));
1015
1016 // Make SQL-safe
1017 //ReplaceString(name, sizeof(name), "'", "");
1018
1019
1020 new String:weapons_query[500] = "";
1021 for(new i=0;i<=36;i++){
1022 Format(weapons_query,sizeof(weapons_query),"%s,%s='%d'",weapons_query,g_sWeaponsNamesGame[i],g_aWeapons[client][i]);
1023 }
1024
1025 new String:query[1500];
1026 if(g_RankBy == 1){
1027 Format(query,sizeof(query),g_sSqlSaveName,g_sSQLTable,g_aStats[client][SCORE],g_aStats[client][KILLS],g_aStats[client][DEATHS],g_aStats[client][SUICIDES],g_aStats[client][TK],
1028 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,
1029 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],GetTime(),g_aStats[client][CONNECTED] + GetTime()-g_aSession[client][CONNECTED],sEscapeName);
1030 } else if (g_RankBy == 0) {
1031 Format(query,sizeof(query),g_sSqlSave,g_sSQLTable,g_aStats[client][SCORE],g_aStats[client][KILLS],g_aStats[client][DEATHS],g_aStats[client][SUICIDES],g_aStats[client][TK],
1032 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,
1033 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],GetTime(),g_aStats[client][CONNECTED] + GetTime()-g_aSession[client][CONNECTED],g_aClientSteam[client]);
1034 } else if (g_RankBy == 2) {
1035 Format(query,sizeof(query),g_sSqlSaveIp,g_sSQLTable,g_aStats[client][SCORE],g_aStats[client][KILLS],g_aStats[client][DEATHS],g_aStats[client][SUICIDES],g_aStats[client][TK],
1036 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,
1037 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],GetTime(),g_aStats[client][CONNECTED] + GetTime()-g_aSession[client][CONNECTED],g_aClientIp[client]);
1038 }
1039
1040 SQL_FastQuery(g_hStatsDb,query);
1041
1042 /**
1043 Start the forward OnPlayerSaved
1044 */
1045 new Action:fResult;
1046 Call_StartForward(g_fwdOnPlayerSaved);
1047 Call_PushCell(client);
1048 new fError = Call_Finish(fResult);
1049
1050 if (fError != SP_ERROR_NONE)
1051 {
1052 ThrowNativeError(fError, "Forward failed");
1053 }
1054 }
1055 }
1056 SQL_UnlockDatabase(g_hStatsDb);
1057}
1058
1059public GetWeaponNum(String:weaponname[]){
1060
1061
1062 for(new i=0;i<=36;i++){
1063 if(StrEqual(weaponname,g_sWeaponsNamesGame[i]))
1064 return i;
1065 }
1066 return 36;
1067}
1068
1069public Action: Event_VipEscaped(Handle:event, const String:name[], bool:dontBroadcast){
1070 if(!g_bEnabled || !g_bGatherStats || g_MinimumPlayers > GetCurrentPlayers())
1071 return;
1072 new client = GetClientOfUserId(GetEventInt(event,"userid"));
1073
1074 for(new i=1;i<=MaxClients;i++){
1075
1076 if(IsClientInGame(i) && GetClientTeam(i)==CT){
1077 g_aStats[i][SCORE]+=g_PointsVipEscapedTeam;
1078 g_aSession[i][SCORE]+=g_PointsVipEscapedTeam;
1079
1080 }
1081
1082 }
1083 g_aStats[client][VIP_PLAYED]++;
1084 g_aSession[client][VIP_PLAYED]++;
1085 g_aStats[client][VIP_ESCAPED]++;
1086 g_aSession[client][VIP_ESCAPED]++;
1087 g_aStats[client][SCORE]+=g_PointsVipEscapedPlayer;
1088 g_aSession[client][SCORE]+=g_PointsVipEscapedPlayer;
1089
1090 if(!g_bChatChange)
1091 return;
1092 for(new i = 1; i <= MaxClients;i++)
1093 if(IsClientInGame(i))
1094 CPrintToChat(i,"%s %t",MSG,"CT_VIPEscaped",g_PointsVipEscapedTeam);
1095 if(client != 0 && (g_bRankBots || !IsFakeClient(client)))
1096 for(new i = 1; i <= MaxClients;i++)
1097 if(IsClientInGame(i))
1098 CPrintToChat(i,"%s %t",MSG,"VIPEscaped",g_aClientName[client],g_aStats[client][SCORE],g_PointsVipEscapedTeam+g_PointsVipEscapedPlayer);
1099}
1100
1101public Action: Event_VipKilled(Handle:event, const String:name[], bool:dontBroadcast){
1102 if(!g_bEnabled || !g_bGatherStats || g_MinimumPlayers > GetCurrentPlayers())
1103 return;
1104 new client = GetClientOfUserId(GetEventInt(event,"userid"));
1105 new killer = GetClientOfUserId(GetEventInt(event,"attacker"));
1106
1107 for(new i=1;i<=MaxClients;i++){
1108
1109 if(IsClientInGame(i) && GetClientTeam(i)==TR){
1110 g_aStats[i][SCORE]+=g_PointsVipKilledTeam;
1111 g_aSession[i][SCORE]+=g_PointsVipKilledTeam;
1112
1113 }
1114
1115 }
1116 g_aStats[client][VIP_PLAYED]++;
1117 g_aSession[client][VIP_PLAYED]++;
1118 g_aStats[killer][VIP_KILLED]++;
1119 g_aSession[killer][VIP_KILLED]++;
1120 g_aStats[killer][SCORE]+=g_PointsVipKilledPlayer;
1121 g_aSession[killer][SCORE]+=g_PointsVipKilledPlayer;
1122
1123 if(!g_bChatChange)
1124 return;
1125 for(new i = 1; i <= MaxClients;i++)
1126 if(IsClientInGame(i))
1127 CPrintToChat(i,"%s %t",MSG,"TR_VIPKilled",g_PointsVipKilledTeam);
1128 if(client != 0 && (g_bRankBots || !IsFakeClient(client)))
1129 for(new i = 1; i <= MaxClients;i++)
1130 if(IsClientInGame(i))
1131 CPrintToChat(i,"%s %t",MSG,"VIPKilled",g_aClientName[client],g_aStats[client][SCORE],g_PointsVipKilledTeam+g_PointsVipKilledPlayer);
1132}
1133
1134public Action: Event_HostageRescued(Handle:event, const String:name[], bool:dontBroadcast){
1135 if(!g_bEnabled || !g_bGatherStats || g_MinimumPlayers > GetCurrentPlayers())
1136 return;
1137 new client = GetClientOfUserId(GetEventInt(event,"userid"));
1138
1139
1140 for(new i=1;i<=MaxClients;i++){
1141
1142 if(IsClientInGame(i) && GetClientTeam(i)==CT){
1143 g_aStats[i][SCORE]+=g_PointsHostageRescTeam;
1144 g_aSession[i][SCORE]+=g_PointsHostageRescTeam;
1145
1146 }
1147
1148 }
1149 g_aSession[client][HOSTAGES_RESCUED]++;
1150 g_aStats[client][HOSTAGES_RESCUED]++;
1151 g_aStats[client][SCORE]+=g_PointsHostageRescPlayer;
1152 g_aSession[client][SCORE]+=g_PointsHostageRescPlayer;
1153
1154 if(!g_bChatChange)
1155 return;
1156 if(g_PointsHostageRescTeam > 0)
1157 for(new i = 1; i <= MaxClients;i++)
1158 if(IsClientInGame(i))
1159 CPrintToChat(i,"%s %t",MSG,"CT_Hostage",g_PointsHostageRescTeam);
1160
1161 if(g_PointsHostageRescPlayer > 0 && client != 0 && (g_bRankBots || !IsFakeClient(client)))
1162 for(new i = 1; i <= MaxClients;i++)
1163 if(IsClientInGame(i))
1164 CPrintToChat(i,"%s %t",MSG,"Hostage",g_aClientName[client],g_aStats[client][SCORE],g_PointsHostageRescPlayer+g_PointsHostageRescTeam);
1165
1166}
1167
1168public Action: Event_RoundMVP(Handle:event, const String:name[], bool:dontBroadcast){
1169 if(!g_bEnabled || !g_bGatherStats || g_MinimumPlayers > GetCurrentPlayers())
1170 return;
1171
1172 new client = GetClientOfUserId(GetEventInt(event,"userid"));
1173 if(!IsClientInGame(client))
1174 return;
1175 new team = GetClientTeam(client);
1176
1177 if(((team == 2 && g_PointsMvpTr > 0) || (team == 3 && g_PointsMvpCt > 0)) && client != 0 && (g_bRankBots || !IsFakeClient(client))){
1178
1179 if(team == 2){
1180
1181 g_aStats[client][SCORE] += g_PointsMvpTr;
1182 g_aSession[client][SCORE] += g_PointsMvpTr;
1183 for(new i = 1; i <= MaxClients;i++)
1184 if(IsClientInGame(i))
1185 CPrintToChat(i,"%s %t",MSG,"MVP",g_aClientName[client],g_aStats[client][SCORE],g_PointsMvpTr);
1186
1187 } else {
1188
1189 g_aStats[client][SCORE] += g_PointsMvpCt;
1190 g_aSession[client][SCORE] += g_PointsMvpCt;
1191 for(new i = 1; i <= MaxClients;i++)
1192 if(IsClientInGame(i))
1193 CPrintToChat(i,"%s %t",MSG,"MVP",g_aClientName[client],g_aStats[client][SCORE],g_PointsMvpCt);
1194
1195 }
1196 }
1197
1198
1199}
1200public Action: Event_RoundEnd(Handle:event, const String:name[], bool:dontBroadcast){
1201 if(!g_bEnabled || !g_bGatherStats || g_MinimumPlayers > GetCurrentPlayers())
1202 return;
1203 new i;
1204 new Winner = GetEventInt(event,"winner");
1205 new bool:announced=false;
1206 for(i=1;i<=MaxClients;i++)
1207 {
1208 if(IsClientInGame(i) && (g_bRankBots || !IsFakeClient(i))){
1209 if(Winner == TR && GetClientTeam(i)==TR){
1210 g_aSession[i][TR_WIN]++;
1211 g_aStats[i][TR_WIN]++;
1212 if(g_PointsRoundWin[TR] >0 && IsPlayerAlive(i)){
1213 g_aSession[i][SCORE] += g_PointsRoundWin[TR];
1214 g_aStats[i][SCORE] += g_PointsRoundWin[TR];
1215 if(!announced && g_bChatChange){
1216 for(new j = 1; j <= MaxClients;j++)
1217 if(IsClientInGame(j))
1218 CPrintToChat(j,"%s %t",MSG,"TR_Round",g_PointsRoundWin[TR]);
1219 announced=true;
1220 }
1221 }
1222 } else if(Winner == CT && GetClientTeam(i)==CT){
1223 g_aSession[i][CT_WIN]++;
1224 g_aStats[i][CT_WIN]++;
1225 if(g_PointsRoundWin[CT] >0 && IsPlayerAlive(i)){
1226 g_aSession[i][SCORE] += g_PointsRoundWin[CT];
1227 g_aStats[i][SCORE] += g_PointsRoundWin[CT];
1228 if(!announced && g_bChatChange){
1229 for(new j = 1; j <= MaxClients;j++)
1230 if(IsClientInGame(j))
1231 CPrintToChat(j,"%s %t",MSG,"CT_Round",g_PointsRoundWin[CT]);
1232 announced=true;
1233 }
1234 }
1235 }
1236
1237 }
1238 }
1239
1240 DumpDB();
1241}
1242
1243public EventPlayerSpawn(Handle:event, const String:name[], bool:dontBroadcast)
1244{
1245 if(!g_bEnabled || !g_bGatherStats || g_MinimumPlayers > GetCurrentPlayers())
1246 return;
1247
1248 new client = GetClientOfUserId(GetEventInt(event,"userid"));
1249 if(!g_bRankBots && IsFakeClient(client))
1250 return;
1251 if(GetClientTeam(client) == TR){
1252 g_aStats[client][ROUNDS_TR]++;
1253 g_aSession[client][ROUNDS_TR]++;
1254 } else if(GetClientTeam(client) == CT){
1255 g_aStats[client][ROUNDS_CT]++;
1256 g_aSession[client][ROUNDS_CT]++;
1257 }
1258}
1259
1260public Action:Event_BombPlanted( Handle:event, const String:name[], bool:dontBroadcast )
1261{
1262 if(!g_bEnabled || !g_bGatherStats || g_MinimumPlayers > GetCurrentPlayers())
1263 return;
1264
1265 new client = GetClientOfUserId(GetEventInt(event,"userid"));
1266
1267 g_C4PlantedBy = client;
1268
1269 for(new i=1;i<=MaxClients;i++){
1270
1271 if(IsClientInGame(i) && GetClientTeam(i)==TR){
1272 g_aStats[i][SCORE]+=g_PointsBombPlantedTeam;
1273 g_aSession[i][SCORE]+=g_PointsBombPlantedTeam;
1274
1275 }
1276
1277 }
1278 g_aStats[client][C4_PLANTED]++;
1279 g_aSession[client][C4_PLANTED]++;
1280 g_aStats[client][SCORE]+=g_PointsBombPlantedPlayer;
1281 g_aSession[client][SCORE]+=g_PointsBombPlantedPlayer;
1282
1283 strcopy(g_sC4PlantedByName,sizeof(g_sC4PlantedByName),g_aClientName[client]);
1284 if(!g_bChatChange)
1285 return;
1286 if(g_PointsBombPlantedTeam > 0)
1287 for(new i = 1; i <= MaxClients;i++)
1288 if(IsClientInGame(i))
1289 CPrintToChat(i,"%s %t",MSG,"TR_Planting",g_PointsBombPlantedTeam);
1290 if(g_PointsBombPlantedPlayer > 0 && client != 0 && (g_bRankBots || !IsFakeClient(client)))
1291 for(new i = 1; i <= MaxClients;i++)
1292 if(IsClientInGame(i))
1293 CPrintToChat(i,"%s %t",MSG,"Planting",g_aClientName[client],g_aStats[client][SCORE],g_PointsBombPlantedTeam+g_PointsBombPlantedPlayer);
1294
1295}
1296
1297public Action:Event_BombDefused( Handle:event, const String:name[], bool:dontBroadcast )
1298{
1299 if(!g_bEnabled || !g_bGatherStats || g_MinimumPlayers > GetCurrentPlayers())
1300 return;
1301 new client = GetClientOfUserId(GetEventInt(event,"userid"));
1302
1303 for(new i=1;i<=MaxClients;i++){
1304
1305 if(IsClientInGame(i) && GetClientTeam(i)==CT){
1306 g_aStats[i][SCORE]+=g_PointsBombDefusedTeam;
1307 g_aSession[i][SCORE]+=g_PointsBombDefusedTeam;
1308
1309 }
1310
1311 }
1312 g_aStats[client][C4_DEFUSED]++;
1313 g_aSession[client][C4_DEFUSED]++;
1314 g_aStats[client][SCORE]+=g_PointsBombDefusedPlayer;
1315 g_aSession[client][SCORE]+=g_PointsBombDefusedPlayer;
1316
1317 if(!g_bChatChange)
1318 return;
1319 if(g_PointsBombDefusedTeam > 0)
1320 for(new i = 1; i <= MaxClients;i++)
1321 if(IsClientInGame(i))
1322 CPrintToChat(i,"%s %t",MSG,"CT_Defusing",g_PointsBombDefusedTeam);
1323 if(g_PointsBombDefusedPlayer > 0 && client != 0 && (g_bRankBots || !IsFakeClient(client)))
1324 for(new i = 1; i <= MaxClients;i++)
1325 if(IsClientInGame(i))
1326 CPrintToChat(i,"%s %t",MSG,"Defusing",g_aClientName[client],g_aStats[client][SCORE],g_PointsBombDefusedTeam+g_PointsBombDefusedPlayer);
1327}
1328
1329public Action:Event_BombExploded( Handle:event, const String:name[], bool:dontBroadcast )
1330{
1331 if(!g_bEnabled || !g_bGatherStats || g_MinimumPlayers > GetCurrentPlayers())
1332 return;
1333 new client =g_C4PlantedBy;
1334
1335 for(new i=1;i<=MaxClients;i++){
1336
1337 if(IsClientInGame(i) && GetClientTeam(i)==TR){
1338 g_aStats[i][SCORE]+=g_PointsBombExplodeTeam;
1339 g_aSession[i][SCORE]+=g_PointsBombExplodeTeam;
1340
1341 }
1342
1343 }
1344 g_aStats[client][C4_EXPLODED]++;
1345 g_aSession[client][C4_EXPLODED]++;
1346 g_aStats[client][SCORE]+=g_PointsBombExplodePlayer;
1347 g_aSession[client][SCORE]+=g_PointsBombExplodePlayer;
1348
1349 if(!g_bChatChange)
1350 return;
1351 if(g_PointsBombExplodeTeam > 0)
1352 for(new i = 1; i <= MaxClients;i++)
1353 if(IsClientInGame(i))
1354 CPrintToChat(i,"%s %t",MSG,"TR_Exploding",g_PointsBombExplodeTeam);
1355 if(g_PointsBombExplodePlayer > 0 && client != 0 && (g_bRankBots || (IsClientInGame(client) && !IsFakeClient(client))))
1356 for(new i = 1; i <= MaxClients;i++)
1357 if(IsClientInGame(i))
1358 CPrintToChat(i,"%s %t",MSG,"Exploding",g_sC4PlantedByName,g_aStats[client][SCORE],g_PointsBombExplodeTeam+g_PointsBombExplodePlayer);
1359}
1360
1361public Action:Event_BombPickup( Handle:event, const String:name[], bool:dontBroadcast )
1362{
1363 if(!g_bEnabled || !g_bGatherStats || g_MinimumPlayers > GetCurrentPlayers())
1364 return;
1365
1366 new client = GetClientOfUserId(GetEventInt(event,"userid"));
1367
1368 g_aStats[client][SCORE]+=g_PointsBombPickup;
1369 g_aSession[client][SCORE]+=g_PointsBombPickup;
1370
1371 if(!g_bChatChange)
1372 return;
1373 if(g_PointsBombPickup > 0)
1374 CPrintToChat(client,"%s %t",MSG,"BombPickup",g_aClientName[client],g_aStats[client][SCORE],g_PointsBombPickup);
1375
1376}
1377
1378public Action:Event_BombDropped( Handle:event, const String:name[], bool:dontBroadcast )
1379{
1380 if(!g_bEnabled || !g_bGatherStats || g_MinimumPlayers > GetCurrentPlayers())
1381 return;
1382
1383 new client = GetClientOfUserId(GetEventInt(event,"userid"));
1384
1385 g_aStats[client][SCORE]-=g_PointsBombDropped;
1386 g_aSession[client][SCORE]-=g_PointsBombDropped;
1387
1388 if(!g_bChatChange)
1389 return;
1390 if(g_PointsBombDropped > 0 && client == 0)
1391 CPrintToChat(client,"%s %t",MSG,"BombDropped",g_aClientName[client],g_aStats[client][SCORE],g_PointsBombDropped);
1392
1393}
1394
1395public Action:EventPlayerDeath(Handle:event, const String:name[], bool:dontBroadcast)
1396// ----------------------------------------------------------------------------
1397{
1398 if(!g_bEnabled || !g_bGatherStats || g_MinimumPlayers > GetCurrentPlayers())
1399 return;
1400
1401 new victim = GetClientOfUserId(GetEventInt(event,"userid"));
1402 new attacker = GetClientOfUserId(GetEventInt(event, "attacker"));
1403 if(!g_bRankBots && attacker != 0 && (IsFakeClient(victim) || IsFakeClient(attacker)))
1404 return;
1405
1406 if(victim == attacker || attacker == 0){
1407 g_aStats[victim][SUICIDES]++;
1408 g_aSession[victim][SUICIDES]++;
1409 g_aStats[victim][SCORE] -= g_PointsLoseSuicide;
1410 g_aSession[victim][SCORE] -= g_PointsLoseSuicide;
1411 SalvarPlayer(victim);
1412 if(g_PointsLoseSuicide > 0 && g_bChatChange){
1413
1414 CPrintToChat(victim,"%s %t",MSG,"LostSuicide",g_aClientName[victim],g_aStats[victim][SCORE],g_PointsLoseSuicide);
1415 }
1416 } else if(!g_bFfa && (GetClientTeam(victim) == GetClientTeam(attacker))){
1417 if(attacker < MAXPLAYERS){
1418 g_aStats[attacker][TK]++;
1419 g_aSession[attacker][TK]++;
1420 g_aStats[attacker][SCORE] -= g_PointsLoseTk;
1421 g_aSession[attacker][SCORE] -= g_PointsLoseTk;
1422 SalvarPlayer(attacker);
1423 if(g_PointsLoseTk > 0 && g_bChatChange){
1424
1425 CPrintToChat(victim,"%s %t",MSG,"LostTK",g_aClientName[attacker],g_aStats[attacker][SCORE],g_PointsLoseTk,g_aClientName[victim]);
1426 CPrintToChat(attacker,"%s %t",MSG,"LostTK",g_aClientName[attacker],g_aStats[attacker][SCORE],g_PointsLoseTk,g_aClientName[victim]);
1427 }
1428 }
1429 } else {
1430 new team =GetClientTeam(attacker);
1431 new bool:headshot = GetEventBool(event, "headshot");
1432 decl String:weapon[64];
1433 GetEventString(event, "weapon", weapon, sizeof(weapon));
1434 ReplaceString(weapon,sizeof(weapon),"weapon_","");
1435
1436 new score_dif;
1437 if(attacker < MAXPLAYERS)
1438 score_dif = g_aStats[victim][SCORE] - g_aStats[attacker][SCORE];
1439
1440 if(score_dif < 0 || attacker >= MAXPLAYERS) {
1441 score_dif = g_PointsKill[team];
1442 } else {
1443 if(g_PointsKillBonusDif[team] == 0)
1444 score_dif = g_PointsKill[team] + ((g_aStats[victim][SCORE] - g_aStats[attacker][SCORE])*g_PointsKillBonus[team]);
1445 else
1446 score_dif = g_PointsKill[team] + (((g_aStats[victim][SCORE] - g_aStats[attacker][SCORE])/g_PointsKillBonusDif[team])*g_PointsKillBonus[team]);
1447 }
1448 if(StrEqual(weapon,"knife")){
1449 score_dif = RoundToCeil(score_dif*g_fPointsKnifeMultiplier);
1450 }
1451 else if(StrEqual(weapon,"taser")){
1452 score_dif = RoundToCeil(score_dif*g_fPointsTaserMultiplier);
1453 }
1454 if(headshot && attacker < MAXPLAYERS){
1455 g_aStats[attacker][HEADSHOTS]++;
1456 g_aSession[attacker][HEADSHOTS]++;
1457 }
1458
1459 g_aStats[victim][DEATHS]++;
1460 g_aSession[victim][DEATHS]++;
1461 if(attacker < MAXPLAYERS){
1462 g_aStats[attacker][KILLS]++;
1463 g_aSession[attacker][KILLS]++;
1464 }
1465 if(g_bPointsLoseRoundCeil){
1466 g_aStats[victim][SCORE] -= RoundToCeil(score_dif*g_fPercentPointsLose);
1467 g_aSession[victim][SCORE] -= RoundToCeil(score_dif*g_fPercentPointsLose);
1468 } else {
1469 g_aStats[victim][SCORE] -= RoundToFloor(score_dif*g_fPercentPointsLose);
1470 g_aSession[victim][SCORE] -= RoundToFloor(score_dif*g_fPercentPointsLose);
1471 }
1472 if(attacker < MAXPLAYERS){
1473 g_aStats[attacker][SCORE] += score_dif;
1474 g_aSession[attacker][SCORE] += score_dif;
1475 if(GetWeaponNum(weapon) < 38)
1476 g_aWeapons[attacker][GetWeaponNum(weapon)]++;
1477 }
1478
1479 if(g_MinimalKills == 0 || (g_aStats[victim][KILLS] >= g_MinimalKills && g_aStats[attacker][KILLS] >= g_MinimalKills)){
1480 if(g_bChatChange){
1481 //PrintToServer("%s %t",MSG,"Killing",g_aClientName[attacker],g_aStats[attacker][SCORE],score_dif,g_aClientName[victim],g_aStats[victim][SCORE]);
1482 CPrintToChat(victim,"%s %t",MSG,"Killing",g_aClientName[attacker],g_aStats[attacker][SCORE],score_dif,g_aClientName[victim],g_aStats[victim][SCORE]);
1483 if(attacker < MAXPLAYERS)
1484 CPrintToChat(attacker,"%s %t",MSG,"Killing",g_aClientName[attacker],g_aStats[attacker][SCORE],score_dif,g_aClientName[victim],g_aStats[victim][SCORE]);
1485 }
1486 } else {
1487 if(g_aStats[victim][KILLS] < g_MinimalKills && g_aStats[attacker][KILLS] < g_MinimalKills){
1488 if(g_bChatChange){
1489 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);
1490 if(attacker < MAXPLAYERS)
1491 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);
1492 }
1493 } else if(g_aStats[victim][KILLS] < g_MinimalKills){
1494 if(g_bChatChange){
1495 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);
1496 if(attacker < MAXPLAYERS)
1497 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);
1498 }
1499 } else {
1500 if(g_bChatChange){
1501 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);
1502 if(attacker < MAXPLAYERS)
1503 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);
1504 }
1505 }
1506 }
1507 if(headshot && attacker < MAXPLAYERS){
1508
1509 g_aStats[attacker][SCORE]+=g_PointsHs;
1510 g_aSession[attacker][SCORE]+=g_PointsHs;
1511 if(g_bChatChange && g_PointsHs > 0)
1512 CPrintToChat(attacker,"%s %t",MSG,"Headshot",g_aClientName[attacker],g_aStats[attacker][SCORE],g_PointsHs);
1513 }
1514 if(attacker < MAXPLAYERS)
1515 SalvarPlayer(attacker);
1516 }
1517 SalvarPlayer(victim);
1518 if(attacker < MAXPLAYERS)
1519 if(g_aStats[attacker][KILLS] == 50)
1520 g_TotalPlayers++;
1521}
1522
1523public Action:EventPlayerHurt(Handle:event, const String:name[], bool:dontBroadcast)
1524// ----------------------------------------------------------------------------
1525{
1526 if(!g_bEnabled || !g_bGatherStats)
1527 return;
1528 new victim = GetClientOfUserId(GetEventInt(event,"userid"));
1529 new attacker = GetClientOfUserId(GetEventInt(event, "attacker"));
1530 if(!g_bRankBots && (attacker == 0 || IsFakeClient(victim) || IsFakeClient(attacker)))
1531 return;
1532 if(victim != attacker && attacker >0 && attacker <MAXPLAYERS){
1533 new hitgroup = GetEventInt(event,"hitgroup");
1534 if(hitgroup == 0) // Player was hit by knife, he, flashbang, or smokegrenade.
1535 return;
1536 g_aStats[attacker][HITS]++;
1537 g_aSession[attacker][HITS]++;
1538 g_aHitBox[attacker][hitgroup]++;
1539 //PrintToChat(attacker, "Hitgroup %i: %i hits", hitgroup, g_aHitBox[attacker][hitgroup]);
1540 //PrintToServer("Stats Hits: %i\nSession Hits: %i\nHitBox %i -> %i",g_aStats[attacker][HITS],g_aSession[attacker][HITS],hitgroup,g_aHitBox[attacker][hitgroup]);
1541 }
1542}
1543
1544public Action:EventWeaponFire(Handle:event,const String:name[],bool:dontBroadcast)
1545{
1546
1547 if(!g_bEnabled || !g_bGatherStats )
1548 return;
1549 new client = GetClientOfUserId(GetEventInt(event,"userid"));
1550 if(!g_bRankBots && IsFakeClient(client))
1551 return;
1552 new String:sWeaponUsed[50];
1553 GetEventString(event,"weapon",sWeaponUsed,sizeof(sWeaponUsed));
1554 if(StrEqual(sWeaponUsed,"knife") || StrEqual(sWeaponUsed,"hegrenade") || StrEqual(sWeaponUsed,"flashbang") || StrEqual(sWeaponUsed,"smokegrenade") || StrEqual(sWeaponUsed,"molotov") || StrEqual(sWeaponUsed,"incgrenade") || StrEqual(sWeaponUsed,"decoy"))
1555 return; // Don't count knife being used neither hegrenade, flashbang and smokegrenade being threw
1556 g_aStats[client][SHOTS]++;
1557 g_aSession[client][SHOTS]++;
1558
1559}
1560
1561public SalvarPlayer(client){
1562 if(!g_bEnabled || !g_bGatherStats)
1563 return;
1564 if(!g_bRankBots && IsFakeClient(client))
1565 return;
1566 if(!OnDB[client])
1567 return;
1568
1569 new String:sEscapeName[MAX_NAME_LENGTH*2+1];
1570 SQL_EscapeString(g_hStatsDb,g_aClientName[client],sEscapeName,sizeof(sEscapeName));
1571 //SQL_EscapeString(g_hStatsDb,name,name,sizeof(name));
1572
1573 // Make SQL-safe
1574 //ReplaceString(name, sizeof(name), "'", "");
1575
1576
1577 new String:weapons_query[500] = "";
1578 for(new i=0;i<=36;i++){
1579 Format(weapons_query,sizeof(weapons_query),"%s,%s='%d'",weapons_query,g_sWeaponsNamesGame[i],g_aWeapons[client][i]);
1580 }
1581 new String:query[1500];
1582 if(g_RankBy == 1){
1583 Format(query,sizeof(query),g_sSqlSaveName,g_sSQLTable,g_aStats[client][SCORE],g_aStats[client][KILLS],g_aStats[client][DEATHS],g_aStats[client][SUICIDES],g_aStats[client][TK],
1584 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,
1585 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],GetTime(),g_aStats[client][CONNECTED] + GetTime()-g_aSession[client][CONNECTED],sEscapeName);
1586 } else if(g_RankBy == 0){
1587 Format(query,sizeof(query),g_sSqlSave,g_sSQLTable,g_aStats[client][SCORE],g_aStats[client][KILLS],g_aStats[client][DEATHS],g_aStats[client][SUICIDES],g_aStats[client][TK],
1588 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,
1589 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],GetTime(),g_aStats[client][CONNECTED] + GetTime()-g_aSession[client][CONNECTED],g_aClientSteam[client]);
1590 } else if(g_RankBy == 2){
1591 Format(query,sizeof(query),g_sSqlSaveIp,g_sSQLTable,g_aStats[client][SCORE],g_aStats[client][KILLS],g_aStats[client][DEATHS],g_aStats[client][SUICIDES],g_aStats[client][TK],
1592 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,
1593 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],GetTime(),g_aStats[client][CONNECTED] + GetTime()-g_aSession[client][CONNECTED],g_aClientIp[client]);
1594 }
1595 SQL_TQuery(g_hStatsDb,SQL_SaveCallback,query,client,DBPrio_High);
1596
1597 if(DEBUGGING){
1598 PrintToServer(query);
1599
1600 LogError("%s",query);
1601 }
1602
1603}
1604
1605
1606public SQL_SaveCallback(Handle:owner, Handle:hndl, const String:error[], any:client)
1607{
1608
1609 if(hndl == INVALID_HANDLE)
1610 {
1611 LogError("[RankMe] Save Player Fail: %s", error);
1612 return;
1613 }
1614
1615 /**
1616 Start the forward OnPlayerSaved
1617 */
1618 new Action:fResult;
1619 Call_StartForward(g_fwdOnPlayerSaved);
1620 Call_PushCell(client);
1621 new fError = Call_Finish(fResult);
1622
1623 if (fError != SP_ERROR_NONE)
1624 {
1625 ThrowNativeError(fError, "Forward failed");
1626 }
1627
1628}
1629
1630public OnClientPutInServer(client){
1631
1632 // If the database isn't connected, you can't run SQL_EscapeString.
1633 if(g_hStatsDb != INVALID_HANDLE)
1634 LoadPlayer(client);
1635
1636}
1637
1638public LoadPlayer(client){
1639
1640 OnDB[client]=false;
1641 for(new i=0;i<=19;i++){
1642 g_aSession[client][i] = 0;
1643 g_aStats[client][i] = 0;
1644 }
1645 g_aStats[client][SCORE]=g_PointsStart;
1646 for(new i=0;i<=36;i++){
1647 g_aWeapons[client][i] = 0;
1648 }
1649 g_aSession[client][CONNECTED] = GetTime();
1650
1651 new String:name[MAX_NAME_LENGTH];
1652 GetClientName(client, name, sizeof(name));
1653 strcopy(g_aClientName[client],MAX_NAME_LENGTH,name);
1654 new String:sEscapeName[MAX_NAME_LENGTH*2+1];
1655 SQL_EscapeString(g_hStatsDb,name,sEscapeName,sizeof(sEscapeName));
1656 //ReplaceString(name, sizeof(name), "'", "");
1657 new String:auth[64];
1658 GetClientAuthString(client,auth,sizeof(auth));
1659 strcopy(g_aClientSteam[client],64,auth);
1660 new String:ip[64];
1661 GetClientIP(client,ip,sizeof(ip));
1662 strcopy(g_aClientIp[client],64,ip);
1663 new String:query[500];
1664 if(g_RankBy == 1)
1665 Format(query,sizeof(query),g_sSqlRetrieveClientName,g_sSQLTable,sEscapeName);
1666 else if (g_RankBy == 0)
1667 Format(query,sizeof(query),g_sSqlRetrieveClient,g_sSQLTable,auth);
1668 else if (g_RankBy == 2)
1669 Format(query,sizeof(query),g_sSqlRetrieveClientIp,g_sSQLTable,ip);
1670
1671 if(DEBUGGING){
1672 PrintToServer(query);
1673 LogError("%s",query);
1674 }
1675 if(g_hStatsDb != INVALID_HANDLE)
1676 SQL_TQuery(g_hStatsDb,SQL_LoadPlayerCallback,query,client);
1677
1678}
1679
1680public SQL_LoadPlayerCallback(Handle:owner, Handle:hndl, const String:error[], any:client)
1681{
1682
1683 if(hndl == INVALID_HANDLE)
1684 {
1685 LogError("[RankMe] Load Player Fail: %s", error);
1686 return;
1687 }
1688 if(!IsClientInGame(client))
1689 return;
1690
1691 if(g_RankBy == 1){
1692 new String:name[MAX_NAME_LENGTH];
1693 GetClientName(client, name, sizeof(name));
1694 if(!StrEqual(name,g_aClientName[client]))
1695 return;
1696 } else if(g_RankBy == 0){
1697 new String:auth[64];
1698 GetClientAuthString(client,auth,sizeof(auth));
1699 if(!StrEqual(auth,g_aClientSteam[client]))
1700 return;
1701 } else if(g_RankBy == 2){
1702 new String:ip[64];
1703 GetClientIP(client,ip,sizeof(ip));
1704 if(!StrEqual(ip,g_aClientIp[client]))
1705 return;
1706 }
1707 if(SQL_HasResultSet(hndl) && SQL_FetchRow(hndl))
1708 {
1709 for(new i=0;i<=10;i++){
1710 g_aStats[client][i]=SQL_FetchInt(hndl,4+i);
1711 }
1712 for(new i=0;i<=36;i++){
1713 g_aWeapons[client][i]=SQL_FetchInt(hndl,16+i);
1714 }
1715 for(new i=1;i<=7;i++){
1716 g_aHitBox[client][i]=SQL_FetchInt(hndl,52+i);
1717 }
1718 g_aStats[client][C4_PLANTED]=SQL_FetchInt(hndl,60);
1719 g_aStats[client][C4_EXPLODED]=SQL_FetchInt(hndl,61);
1720 g_aStats[client][C4_DEFUSED]=SQL_FetchInt(hndl,62);
1721 g_aStats[client][CT_WIN] = SQL_FetchInt(hndl,63);
1722 g_aStats[client][TR_WIN] = SQL_FetchInt(hndl,64);
1723 g_aStats[client][HOSTAGES_RESCUED] = SQL_FetchInt(hndl,65);
1724 g_aStats[client][VIP_KILLED] = SQL_FetchInt(hndl,66);
1725 g_aStats[client][VIP_ESCAPED] = SQL_FetchInt(hndl,67);
1726 g_aStats[client][VIP_PLAYED] = SQL_FetchInt(hndl,68);
1727 } else {
1728 new String:query[500];
1729
1730 new String:sEscapeName[MAX_NAME_LENGTH*2+1];
1731 SQL_EscapeString(g_hStatsDb,g_aClientName[client],sEscapeName,sizeof(sEscapeName));
1732 //SQL_EscapeString(g_hStatsDb,name,name,sizeof(name));
1733 //ReplaceString(name, sizeof(name), "'", "");
1734
1735 Format(query,sizeof(query),g_sSqlInsert ,g_sSQLTable,g_aClientSteam[client],sEscapeName,g_aClientIp[client],g_PointsStart);
1736 SQL_TQuery(g_hStatsDb,SQL_NothingCallback,query,_,DBPrio_High);
1737
1738 if(DEBUGGING){
1739 PrintToServer(query);
1740
1741 LogError("%s",query);
1742 }
1743 }
1744 OnDB[client] = true;
1745 /**
1746 Start the forward OnPlayerLoaded
1747 */
1748 new Action:fResult;
1749 Call_StartForward(g_fwdOnPlayerLoaded);
1750 Call_PushCell(client);
1751 new fError = Call_Finish(fResult);
1752
1753 if (fError != SP_ERROR_NONE)
1754 {
1755 ThrowNativeError(fError, "Forward failed");
1756 }
1757}
1758
1759public SQL_PurgeCallback(Handle:owner, Handle:hndl, const String:error[], any:client)
1760{
1761 if(hndl == INVALID_HANDLE)
1762 {
1763 LogError("[RankMe] Query Fail: %s", error);
1764 return;
1765 }
1766
1767 PrintToServer("[RankMe]: %d players purged by inactivity",SQL_GetAffectedRows(owner));
1768 if(client != 0){
1769 PrintToChat(client,"[RankMe]: %d players purged by inactivity",SQL_GetAffectedRows(owner));
1770 }
1771 //LogAction(-1,-1,"[RankMe]: %d players purged by inactivity",SQL_GetAffectedRows(owner));
1772
1773}
1774
1775public SQL_NothingCallback(Handle:owner, Handle:hndl, const String:error[], any:client)
1776{
1777 if(hndl == INVALID_HANDLE)
1778 {
1779 LogError("[RankMe] Query Fail: %s", error);
1780 return;
1781 }
1782
1783
1784}
1785
1786public OnClientDisconnect(client){
1787 if(!g_bEnabled)
1788 return;
1789 if(!g_bRankBots && IsFakeClient(client))
1790 return;
1791 SalvarPlayer(client);
1792 OnDB[client] = false;
1793}
1794
1795public SQL_DumpCallback(Handle:owner, Handle:hndl, const String:error[], any:Datapack){
1796
1797 if(hndl == INVALID_HANDLE)
1798 {
1799 LogError("[RankMe] Query Fail: %s", error);
1800 PrintToServer(error);
1801 return;
1802 }
1803
1804 new Handle:File1;
1805 new String:fields_values[600];
1806 new String:field[100];
1807
1808 File1 = OpenFile("rank.sql","w");
1809 if(File1==INVALID_HANDLE){
1810
1811 LogError("[RankMe] Unable to open dump file.");
1812
1813 }
1814 new fields = SQL_GetFieldCount(hndl);
1815 new bool:first;
1816 WriteFileLine(File1,g_sSqlCreate,g_sSQLTable);
1817 WriteFileLine(File1,"");
1818
1819 while(SQL_HasResultSet(hndl) && SQL_FetchRow(hndl))
1820 {
1821 field = "";
1822 fields_values = "";
1823 first=true;
1824 for(new i = 0;i<=fields-1;i++){
1825 SQL_FetchString(hndl,i,field,sizeof(field));
1826 ReplaceString(field,sizeof(field),"\\","\\\\",false);
1827 ReplaceString(field,sizeof(field),"\"","\\\"",false);
1828
1829 if(first){
1830 Format(fields_values,sizeof(fields_values),"\"%s\"",field);
1831 first=false;
1832 }
1833 else
1834 Format(fields_values,sizeof(fields_values),"%s,\"%s\"",fields_values,field);
1835 }
1836
1837 WriteFileLine(File1,"INSERT INTO `%s` VALUES (%s);",g_sSQLTable,fields_values);
1838 }
1839 CloseHandle(File1);
1840}
1841
1842public OnConVarChanged(Handle:convar, const String:oldValue[], const String:newValue[]){
1843 new g_bQueryPlayerCount;
1844
1845 if(convar == g_cvarShowBotsOnRank){
1846 g_bShowBotsOnRank = GetConVarBool(g_cvarShowBotsOnRank);
1847 g_bQueryPlayerCount = true;
1848 }
1849 else if (convar == g_cvarRankBy){
1850 g_RankBy = GetConVarBool(g_cvarRankBy);
1851 }
1852 else if (convar == g_cvarEnabled){
1853 g_bEnabled = GetConVarBool(g_cvarEnabled);
1854 }
1855 else if (convar == g_cvarShowRankAll){
1856 g_bShowRankAll = GetConVarBool(g_cvarShowRankAll);
1857 }
1858 else if (convar == g_cvarChatChange){
1859 g_bChatChange = GetConVarBool(g_cvarChatChange);
1860 }
1861 else if (convar == g_cvarRankbots){
1862 g_bRankBots = GetConVarBool(g_cvarRankbots);
1863 g_bQueryPlayerCount = true;
1864 }
1865 else if (convar == g_cvarFfa){
1866 g_bFfa = GetConVarBool(g_cvarFfa);
1867 }
1868 else if (convar == g_cvarDumpDB){
1869 g_bDumpDB = GetConVarBool(g_cvarDumpDB);
1870 }
1871 else if (convar == g_cvarPointsBombDefusedTeam){
1872 g_PointsBombDefusedTeam = GetConVarInt(g_cvarPointsBombDefusedTeam);
1873 }
1874 else if (convar == g_cvarPointsBombDefusedPlayer){
1875 g_PointsBombDefusedPlayer = GetConVarInt(g_cvarPointsBombDefusedPlayer);
1876 }
1877 else if (convar == g_cvarPointsBombPlantedTeam){
1878 g_PointsBombPlantedTeam = GetConVarInt(g_cvarPointsBombPlantedTeam);
1879 }
1880 else if (convar == g_cvarPointsBombPlantedPlayer){
1881 g_PointsBombPlantedPlayer = GetConVarInt(g_cvarPointsBombPlantedPlayer);
1882 }
1883 else if (convar == g_cvarPointsBombExplodeTeam){
1884 g_PointsBombExplodeTeam = GetConVarInt(g_cvarPointsBombExplodeTeam);
1885 }
1886 else if (convar == g_cvarPointsBombExplodePlayer){
1887 g_PointsBombExplodePlayer = GetConVarInt(g_cvarPointsBombExplodePlayer);
1888 }
1889 else if (convar == g_cvarPointsHostageRescTeam){
1890 g_PointsHostageRescTeam = GetConVarInt(g_cvarPointsHostageRescTeam);
1891 }
1892 else if (convar == g_cvarPointsHostageRescPlayer){
1893 g_PointsHostageRescPlayer = GetConVarInt(g_cvarPointsHostageRescPlayer);
1894 }
1895 else if (convar == g_cvarPointsHs){
1896 g_PointsHs = GetConVarInt(g_cvarPointsHs);
1897 }
1898 else if (convar == g_cvarPointsKillCt){
1899 g_PointsKill[CT] = GetConVarInt(g_cvarPointsKillCt);
1900 }
1901 else if (convar == g_cvarPointsKillTr){
1902 g_PointsKill[TR] = GetConVarInt(g_cvarPointsKillTr);
1903 }
1904 else if (convar == g_cvarPointsKillBonusCt){
1905 g_PointsKillBonus[CT] = GetConVarInt(g_cvarPointsKillBonusCt);
1906 }
1907 else if (convar == g_cvarPointsKillBonusTr){
1908 g_PointsKillBonus[TR] = GetConVarInt(g_cvarPointsKillBonusTr);
1909 }
1910 else if (convar == g_cvarPointsKillBonusDifCt){
1911 g_PointsKillBonusDif[CT] = GetConVarInt(g_cvarPointsKillBonusDifCt);
1912 }
1913 else if (convar == g_cvarPointsKillBonusDifTr){
1914 g_PointsKillBonusDif[TR] = GetConVarInt(g_cvarPointsKillBonusDifTr);
1915 }
1916 else if (convar == g_cvarPointsStart){
1917 g_PointsStart = GetConVarInt(g_cvarPointsStart);
1918 }
1919 else if (convar == g_cvarPointsKnifeMultiplier){
1920 g_fPointsKnifeMultiplier = GetConVarFloat(g_cvarPointsKnifeMultiplier);
1921 }
1922 else if (convar == g_cvarPointsTaserMultiplier){
1923 g_fPointsTaserMultiplier = GetConVarFloat(g_cvarPointsTaserMultiplier);
1924 }
1925 else if (convar == g_cvarPointsTrRoundWin){
1926 g_PointsRoundWin[TR] = GetConVarInt(g_cvarPointsTrRoundWin);
1927 }
1928 else if (convar == g_cvarPointsCtRoundWin){
1929 g_PointsRoundWin[CT] = GetConVarInt(g_cvarPointsCtRoundWin);
1930 }
1931 else if (convar == g_cvarMinimalKills){
1932 g_MinimalKills = GetConVarInt(g_cvarMinimalKills);
1933 }
1934 else if (convar == g_cvarPercentPointsLose){
1935 g_fPercentPointsLose = GetConVarFloat(g_cvarPercentPointsLose);
1936 }
1937 else if (convar == g_cvarPointsLoseRoundCeil){
1938 g_bPointsLoseRoundCeil = GetConVarBool(g_cvarPointsLoseRoundCeil);
1939 }
1940 else if (convar == g_cvarMinimumPlayers){
1941 g_MinimumPlayers = GetConVarInt(g_cvarMinimumPlayers);
1942 }
1943 else if (convar == g_cvarResetOwnRank){
1944 g_bResetOwnRank = GetConVarBool(g_cvarResetOwnRank);
1945 }
1946 else if (convar == g_cvarPointsVipEscapedTeam){
1947 g_PointsVipEscapedTeam = GetConVarInt(g_cvarPointsVipEscapedTeam);
1948 }
1949 else if (convar == g_cvarPointsVipEscapedPlayer){
1950 g_PointsVipEscapedPlayer = GetConVarInt(g_cvarPointsVipEscapedPlayer);
1951 }
1952 else if (convar == g_cvarPointsVipKilledTeam){
1953 g_PointsVipKilledTeam = GetConVarInt(g_cvarPointsVipKilledTeam);
1954 }
1955 else if (convar == g_cvarPointsVipKilledPlayer){
1956 g_PointsVipKilledPlayer = GetConVarInt(g_cvarPointsVipKilledPlayer);
1957 }
1958 else if (convar == g_cvarVipEnabled){
1959 g_bVipEnabled = GetConVarBool(g_cvarVipEnabled);
1960 }
1961 else if (convar == g_cvarDaysToNotShowOnRank){
1962 g_DaysToNotShowOnRank = GetConVarInt(g_cvarDaysToNotShowOnRank);
1963 g_bQueryPlayerCount = true;
1964 }
1965 else if (convar == g_cvarGatherStats){
1966 g_bGatherStats = GetConVarBool(g_cvarGatherStats);
1967 }
1968 else if (convar == g_cvarRankMode){
1969 g_RankMode = GetConVarInt(g_cvarRankMode);
1970 }
1971 else if (convar == g_cvarChatTriggers){
1972 g_bChatTriggers = GetConVarBool(g_cvarChatTriggers);
1973 }
1974 else if (convar == g_cvarPointsMvpCt){
1975 g_PointsMvpCt = GetConVarInt(g_cvarPointsMvpCt);
1976 }
1977 else if (convar == g_cvarPointsMvpTr){
1978 g_PointsMvpTr = GetConVarInt(g_cvarPointsMvpTr);
1979 }
1980 else if (convar == g_cvarPointsBombPickup){
1981 g_PointsBombDropped = GetConVarInt(g_cvarPointsBombPickup);
1982 }
1983 else if (convar == g_cvarPointsBombDropped){
1984 g_PointsBombDropped = GetConVarInt(g_cvarPointsBombDropped);
1985 }
1986
1987 if(g_bQueryPlayerCount && g_hStatsDb != INVALID_HANDLE){
1988 new String:query[500];
1989 MakeSelectQuery(query,sizeof(query));
1990 SQL_TQuery(g_hStatsDb,SQL_GetPlayersCallback,query);
1991 }
1992}
1993
1994stock bool:IsValidClient(client, bool:nobots = true)
1995{
1996 if (client <= 0 || client > MaxClients || !IsClientConnected(client) || (nobots && IsFakeClient(client)))
1997 {
1998 return false;
1999 }
2000 return IsClientInGame(client);
2001}
2002
2003stock MakeSelectQuery(String:sQuery[],strsize){
2004
2005 // Make basic query
2006 Format(sQuery,strsize,"SELECT * FROM `%s` WHERE kills >= '%d'",g_sSQLTable, g_MinimalKills);
2007
2008 // Append check for bots
2009 if(!g_bShowBotsOnRank)
2010 Format(sQuery,strsize,"%s AND steam <> 'BOT'",sQuery);
2011
2012 // Append check for inactivity
2013 if(g_DaysToNotShowOnRank > 0)
2014 Format(sQuery,strsize,"%s AND lastconnect >= '%d'",sQuery,GetTime()-(g_DaysToNotShowOnRank*86400));
2015
2016}