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