· 4 years ago · Apr 23, 2021, 06:32 AM
1#include <amxmodx>
2#include <fakemeta>
3#include <hamsandwich>
4#include <cstrike>
5#include <nvault>
6#include <sqlx>
7#include <fun>
8#include <engine>
9#include <unixtime>
10
11#define PLUGIN "Ultimate Stats"
12#define VERSION "1.3"
13#define AUTHOR "O'Zone"
14
15#pragma dynamic 32768
16
17#define CSW_SHIELD 2
18
19#define WEAPONS_END CSW_P90 + 1
20#define HIT_END HIT_RIGHTLEG + 1
21#define STATS_END STATS_RANK + 1
22#define KILLER_END KILLER_DISTANCE + 1
23
24#define MAX_MONEY 16000
25
26#define TASK_LOAD 5449
27#define TASK_TIME 6701
28#define TASK_HUD 7834
29
30#define get_bit(%2,%1) (%1 & (1<<(%2&31)))
31#define set_bit(%2,%1) (%1 |= (1<<(%2&31)))
32#define rem_bit(%2,%1) (%1 &= ~(1 <<(%2&31)))
33
34#define is_user_valid(%1) (1 <= %1 <= MAX_PLAYERS)
35#define is_weapon_valid(%1) (0 < %1 < WEAPONS_END)
36
37#define get_skill(%1,%2) (1.0 / (1.0 + floatpower(10.0, ((%1 - %2) / 400.0))))
38#define set_skill(%1,%2,%3) (%1 + 20.0 * (%2 - %3))
39
40#define stat(%1) (%1 - HIT_END - 2)
41
42new const body[][] = { "kunas", "galva", "krutine", "pilvas", "kaire ranka", "desine ranka", "kaire koja", "desine koja" };
43
44enum _:forwards { FORWARD_DAMAGE, FORWARD_DEATH, FORWARD_ASSIST, FORWARD_REVENGE, FORWARD_PLANTING,
45 FORWARD_PLANTED, FORWARD_EXPLODE, FORWARD_DEFUSING, FORWARD_DEFUSED, FORWARD_THROW, FORWARD_LOADED };
46enum _:statsMenus { MENU_STATS, MENU_RANKSTATS };
47enum _:winer { THIRD, SECOND, FIRST };
48enum _:save { NORMAL = -1, ROUND, FINAL, MAP_END };
49enum _:types { STATS, ROUND_STATS, WEAPON_STATS, WEAPON_ROUND_STATS, ATTACKER_STATS, VICTIM_STATS };
50enum _:formulas { FORMULA_KD, FORMULA_KILLS, FORMULA_KILLS_HS };
51enum _:statsData { STATS_KILLS = HIT_END, STATS_DEATHS, STATS_HS, STATS_TK, STATS_SHOTS, STATS_HITS, STATS_DAMAGE, STATS_RANK };
52enum _:killerData { KILLER_ID = STATS_END, KILLER_HEALTH, KILLER_ARMOR, KILLER_TEAM, KILLER_DISTANCE };
53enum _:playerData{ BOMB_DEFUSIONS = STATS_END, BOMB_DEFUSED, BOMB_PLANTED, BOMB_EXPLODED, SPECT, HUD_INFO, PLAYER_ID,
54 FIRST_VISIT, LAST_VISIT, TIME, STATS_MENU, CONNECTS, ASSISTS, REVENGE, REVENGES, ROUNDS, ROUNDS_CT, ROUNDS_T, WIN_CT, WIN_T,
55 BRONZE, SILVER, GOLD, MEDALS, BEST_STATS, BEST_KILLS, BEST_DEATHS, BEST_HS, CURRENT_STATS, CURRENT_KILLS,
56 CURRENT_DEATHS, CURRENT_HS, ADMIN, ALIVE, Float:SKILL, NAME[32], SAFE_NAME[64], STEAMID[32], IP[16] };
57
58new const commands[][][] = {
59 { "cmd_menu", "\yMenu \rStatystyk", "menustaty", "say /menustaty", "say_team /menustaty", "say /statsmenu", "say_team /statsmenu", "say /statymenu", "say_team /statymenu", "", "" },
60 { "cmd_hp", "\wHP", "hp", "say /hp", "say_team /hp", "", "", "", "", "", "" },
61 { "cmd_me", "\wMe", "me", "say /me", "say_team /me", "", "", "", "", "", "" },
62 { "cmd_stats", "\wStats", "stats", "say /stats", "say_team /stats", "", "", "", "", "", "" },
63 { "cmd_statsme", "\wStats \rMe", "statsme", "say /statsme", "say_team /statsme", "", "", "", "", "", "" },
64 { "cmd_rank", "\wRank", "rank", "say /rank", "say_team /rank", "", "", "", "", "", "" },
65 { "cmd_rankstats", "\wRank \rStats", "rankstats", "say /rankstats", "say_team /rankstats", "", "", "", "", "", "" },
66 { "cmd_top15", "\wTop15", "top15", "say /top15", "say_team /top15", "", "", "", "", "", "" },
67 { "cmd_topme", "\wTop \rMe", "topme", "say /topme", "say_team /topme", "", "", "", "", "", "" },
68 { "cmd_time", "\wCzas \rGry", "czas", "say /czas", "say_team /czas", "say /time", "say_team /time", "", "", "", "" },
69 { "cmd_time_admin", "\wCzas \rAdminow", "czasadmin", "say /czasadmin", "say_team /czasadmin", "say /timeadmin", "say_team /timeadmin", "say /adminczas", "say_team /adminczas", "", "" },
70 { "cmd_time_top15", "\wCzas \rTop15", "czastop15", "say /ctop15", "say_team /ctop15", "say /czastop15", "say_team /czastop15", "say /ttop15", "say_team /ttop15", "say /topczas", "say_team /topczas" },
71 { "cmd_skill", "\wPunkty \rELO", "skill", "say /skill", "say_team /skill", "say /elo", "say_team /elo", "", "", "", "" },
72 { "cmd_skill_top15", "\wELO \rTop15", "elotop15", "say /etop15", "say_team /etop15", "say /elotop15", "say_team /elotop15", "say /skilltop15", "say_team /skilltop15", "say /topskill", "say_team /topskill" },
73 { "cmd_topstats", "\wNajlepsze \rStaty", "najlepszestaty", "say /staty", "say_team /staty", "say /beststats", "say_team /beststats", "say /najlepszestaty", "say_team /najlepszestaty", "", "" },
74 { "cmd_topstats_top15", "\wStaty \rTop15", "statytop15", "say /stop15", "say_team /stop15", "say /statstop15", "say_team /statstop15", "say /statytop15", "say_team /statytop15", "say /topstaty", "say_team /topstaty" },
75 { "cmd_medals", "\wZdobyte \rMedale", "medale", "say /dalys", "say_team /dalys", "", "", "", "", "", "" },
76 { "cmd_medals_top15", "\wMedale \rTop15", "medaletop15", "say /daliutop15", "say_team /daliutop15", "", "", "", "", "", "" },
77 { "cmd_sounds", "\wUstawienia \rDziekow", "dzwieki", "say /dzwiek", "say_team /dzwiek", "say /dzwieki", "say_team /dzwieki", "say /sound", "say_team /sound", "", "" },
78};
79
80new playerStats[MAX_PLAYERS + 1][playerData], playerRStats[MAX_PLAYERS + 1][playerData], playerWStats[MAX_PLAYERS + 1][WEAPONS_END][STATS_END], playerWRStats[MAX_PLAYERS + 1][WEAPONS_END][STATS_END],
81 playerAStats[MAX_PLAYERS + 1][MAX_PLAYERS + 1][KILLER_END], playerVStats[MAX_PLAYERS + 1][MAX_PLAYERS + 1][KILLER_END], weaponsAmmo[MAX_PLAYERS + 1][WEAPONS_END], statsForwards[forwards], statsNum,
82 Handle:sql, Handle:connection, bool:sqlConnection, bool:oneAndOnly, bool:block, bool:mapChange, round, sounds, statsLoaded, weaponStatsLoaded, visit, soundMayTheForce, soundOneAndOnly, soundPrepare,
83 soundHumiliation, soundLastLeft, ret, planter, defuser, hudSpectRank, hudEndRound;
84
85new sqlHost[64], sqlUser[64], sqlPassword[64], sqlDatabase[64], rankSaveType, rankFormula, assistEnabled, revengeEnabled, assistMinDamage, assistMoney, revengeMoney, assistInfoEnabled, revengeInfoEnabled,
86 leaderInfoEnabled, killerInfoEnabled, victimInfoEnabled, medalsEnabled, prefixEnabled, xvsxEnabled, soundsEnabled, hpEnabled, meEnabled, statsEnabled, statsMeEnabled, rankEnabled, rankStatsEnabled,
87 top15Enabled, topMeEnabled, skillEnabled, timeEnabled, spectRankEnabled, victimHudEnabled, attackerHudEnabled, hsHudEnabled, disruptiveHudEnabled, bestScoreHudEnabled;
88
89public plugin_init()
90{
91 register_plugin(PLUGIN, VERSION, AUTHOR);
92
93 register_cvar("stats_version", VERSION, FCVAR_SERVER);
94
95 bind_pcvar_string(create_cvar("ultimate_stats_host", "", FCVAR_SPONLY | FCVAR_PROTECTED), sqlHost, charsmax(sqlHost));
96 bind_pcvar_string(create_cvar("ultimate_stats_user", "", FCVAR_SPONLY | FCVAR_PROTECTED), sqlUser, charsmax(sqlUser));
97 bind_pcvar_string(create_cvar("ultimate_stats_pass", "", FCVAR_SPONLY | FCVAR_PROTECTED), sqlPassword, charsmax(sqlPassword));
98 bind_pcvar_string(create_cvar("ultimate_stats_db", "", FCVAR_SPONLY | FCVAR_PROTECTED), sqlDatabase, charsmax(sqlDatabase));
99
100 bind_pcvar_num(create_cvar("ultimate_stats_rank_save_type", "0"), rankSaveType); // 0 - nick | 1 - steamid | 2 - ip
101 bind_pcvar_num(create_cvar("ultimate_stats_rank_formula", "0"), rankFormula); // 0 - kills- deaths - tk | 1 - kills | 2 - kills + hs
102 bind_pcvar_num(create_cvar("ultimate_stats_assist_enabled", "1"), assistEnabled);
103 bind_pcvar_num(create_cvar("ultimate_stats_assist_min_damage", "65"), assistMinDamage);
104 bind_pcvar_num(create_cvar("ultimate_stats_assist_money", "300"), assistMoney);
105 bind_pcvar_num(create_cvar("ultimate_stats_assist_info_enabled", "1"), assistInfoEnabled);
106 bind_pcvar_num(create_cvar("ultimate_stats_revenge_enabled", "0"), revengeEnabled);
107 bind_pcvar_num(create_cvar("ultimate_stats_revenge_money", "300"), revengeMoney);
108 bind_pcvar_num(create_cvar("ultimate_stats_revenge_info_enabled", "1"), revengeInfoEnabled);
109 bind_pcvar_num(create_cvar("ultimate_stats_leader_info_enabled", "1"), leaderInfoEnabled);
110 bind_pcvar_num(create_cvar("ultimate_stats_killer_info_enabled", "1"), killerInfoEnabled);
111 bind_pcvar_num(create_cvar("ultimate_stats_victim_info_enabled", "1"), victimInfoEnabled);
112 bind_pcvar_num(create_cvar("ultimate_stats_medals_enabled", "1"), medalsEnabled);
113 bind_pcvar_num(create_cvar("ultimate_stats_skill_enabled", "1"), skillEnabled);
114 bind_pcvar_num(create_cvar("ultimate_stats_time_enabled", "1"), timeEnabled);
115 bind_pcvar_num(create_cvar("ultimate_stats_prefix_enabled", "1"), prefixEnabled);
116 bind_pcvar_num(create_cvar("ultimate_stats_xvsx_enabled", "1"), xvsxEnabled);
117 bind_pcvar_num(create_cvar("ultimate_stats_sounds_enabled", "1"), soundsEnabled);
118 bind_pcvar_num(create_cvar("ultimate_stats_hp_enabled", "1"), hpEnabled);
119 bind_pcvar_num(create_cvar("ultimate_stats_me_enabled", "1"), meEnabled);
120 bind_pcvar_num(create_cvar("ultimate_stats_stats_enabled", "1"), statsEnabled);
121 bind_pcvar_num(create_cvar("ultimate_stats_statsme_enabled", "1"), statsMeEnabled);
122 bind_pcvar_num(create_cvar("ultimate_stats_rank_enabled", "1"), rankEnabled);
123 bind_pcvar_num(create_cvar("ultimate_stats_rankstats_enabled", "1"), rankStatsEnabled);
124 bind_pcvar_num(create_cvar("ultimate_stats_top15_enabled", "1"), top15Enabled);
125 bind_pcvar_num(create_cvar("ultimate_stats_topme_enabled", "1"), topMeEnabled);
126 bind_pcvar_num(create_cvar("ultimate_stats_spectrank_enabled", "1"), spectRankEnabled);
127 bind_pcvar_num(create_cvar("ultimate_stats_victim_hud_enabled", "1"), victimHudEnabled);
128 bind_pcvar_num(create_cvar("ultimate_stats_attacker_hud_enabled", "1"), attackerHudEnabled);
129 bind_pcvar_num(create_cvar("ultimate_stats_hs_hud_enabled", "1"), hsHudEnabled);
130 bind_pcvar_num(create_cvar("ultimate_stats_disruptive_hud_enabled", "1"), disruptiveHudEnabled);
131 bind_pcvar_num(create_cvar("ultimate_stats_bestscore_hud_enabled", "1"), bestScoreHudEnabled);
132
133 for (new i; i < sizeof(commands); i++) {
134 for (new j = 2; j < sizeof(commands[]); j++) {
135 if (commands[i][j][0]) register_clcmd(commands[i][j], commands[i][0]);
136 }
137 }
138
139 register_clcmd("say", "weapons_top15_handle");
140 register_clcmd("say_team", "weapons_top15_handle");
141
142 statsForwards[FORWARD_DAMAGE] = CreateMultiForward("client_damage", ET_IGNORE, FP_CELL, FP_CELL, FP_CELL, FP_CELL, FP_CELL, FP_CELL);
143 statsForwards[FORWARD_DEATH] = CreateMultiForward("client_death", ET_IGNORE, FP_CELL, FP_CELL, FP_CELL, FP_CELL, FP_CELL);
144 statsForwards[FORWARD_ASSIST] = CreateMultiForward("client_assist", ET_IGNORE, FP_CELL, FP_CELL, FP_CELL);
145 statsForwards[FORWARD_REVENGE] = CreateMultiForward("client_revenge", ET_IGNORE, FP_CELL, FP_CELL);
146 statsForwards[FORWARD_PLANTING] = CreateMultiForward("bomb_planting", ET_IGNORE, FP_CELL);
147 statsForwards[FORWARD_PLANTED] = CreateMultiForward("bomb_planted", ET_IGNORE, FP_CELL);
148 statsForwards[FORWARD_EXPLODE] = CreateMultiForward("bomb_explode", ET_IGNORE, FP_CELL, FP_CELL);
149 statsForwards[FORWARD_DEFUSING] = CreateMultiForward("bomb_defusing", ET_IGNORE, FP_CELL);
150 statsForwards[FORWARD_DEFUSED] = CreateMultiForward("bomb_defused", ET_IGNORE, FP_CELL);
151 statsForwards[FORWARD_THROW] = CreateMultiForward("grenade_throw", ET_IGNORE, FP_CELL, FP_CELL, FP_CELL);
152 statsForwards[FORWARD_LOADED] = CreateMultiForward("stats_loaded", ET_IGNORE, FP_CELL);
153
154 RegisterHam(Ham_Spawn, "player", "player_spawned", 1);
155
156 register_logevent("round_end", 2, "1=Round_End");
157 register_logevent("planted_bomb", 3, "2=Planted_The_Bomb");
158 register_logevent("defused_bomb", 3, "2=Defused_The_Bomb");
159 register_logevent("defusing_bomb", 3, "2=Begin_Bomb_Defuse_Without_Kit");
160 register_logevent("defusing_bomb", 3, "2=Begin_Bomb_Defuse_With_Kit");
161 register_logevent("explode_bomb", 6, "3=Target_Bombed");
162
163 register_event("HLTV", "new_round", "a", "1=0", "2=0");
164 register_event("TextMsg", "round_restart", "a", "2&#Game_C", "2&#Game_w");
165 register_event("TextMsg", "spectator_mode", "bd", "2&ec_Mod")
166 register_event("SendAudio", "win_t" , "a", "2&%!MRAD_terwin");
167 register_event("SendAudio", "win_ct", "a", "2&%!MRAD_ctwin");
168 register_event("23", "planted_bomb_no_round", "a", "1=17", "6=-105", "7=17");
169 register_event("BarTime", "planting_bomb", "be", "1=3");
170 register_event("CurWeapon", "cur_weapon", "b" ,"1=1");
171 register_event("Damage", "damage", "b", "2!0");
172 register_event("StatusValue", "show_rank", "bd", "1=2");
173
174 register_forward(FM_SetModel, "set_model", true);
175
176 register_message(SVC_INTERMISSION, "message_intermission");
177 register_message(get_user_msgid("SayText"), "say_text");
178
179 hudEndRound = CreateHudSyncObj();
180 hudSpectRank = CreateHudSyncObj();
181
182 sounds = nvault_open("stats_sound");
183}
184
185public plugin_natives()
186{
187 register_library("ultimate_stats");
188
189 register_native("get_statsnum", "native_get_statsnum");
190 register_native("get_stats", "native_get_stats");
191 register_native("get_stats2", "native_get_stats2");
192 register_native("get_user_stats", "native_get_user_stats");
193 register_native("get_user_stats2", "native_get_user_stats2");
194 register_native("get_user_rank", "native_get_user_rank");
195 register_native("get_user_wstats", "native_get_user_wstats");
196 register_native("get_user_rstats", "native_get_user_rstats");
197 register_native("get_user_wrstats", "native_get_user_wrstats");
198 register_native("get_user_vstats", "native_get_user_vstats");
199 register_native("get_user_astats", "native_get_user_astats");
200 register_native("reset_user_wstats", "native_reset_user_wstats");
201
202 register_native("get_map_objectives", "native_get_map_objectives");
203 register_native("xmod_get_maxweapons", "native_xmod_get_maxweapons");
204 register_native("xmod_get_stats_size", "native_xmod_get_stats_size");
205 register_native("xmod_is_melee_wpn", "native_xmod_is_melee_wpn");
206 register_native("xmod_is_custom_wpn", "native_xmod_is_custom_wpn");
207 register_native("xmod_get_wpnname", "native_xmod_get_wpnname");
208 register_native("xmod_get_wpnlogname", "native_xmod_get_wpnlogname");
209 register_native("custom_weapon_add", "native_not_supported");
210 register_native("custom_weapon_dmg", "native_not_supported");
211 register_native("custom_weapon_shot", "native_not_supported");
212 register_native("register_statsfwd", "native_not_supported");
213 register_native("ts_weaponspawn", "native_not_supported");
214
215 register_native("get_user_total_time", "native_get_user_total_time");
216 register_native("get_user_elo", "native_get_user_elo");
217 register_native("add_user_elo", "native_add_user_elo");
218}
219
220public plugin_cfg()
221{
222 new configPath[64];
223
224 get_localinfo("amxx_configsdir", configPath, charsmax(configPath));
225
226 server_cmd("exec %s/ultimate_stats.cfg", configPath);
227 server_exec();
228
229 sql_init();
230}
231
232public plugin_precache()
233{
234 precache_sound("misc/maytheforce.wav");
235 precache_sound("misc/oneandonly.wav");
236 precache_sound("misc/prepare.wav");
237 precache_sound("misc/humiliation.wav");
238 precache_sound("misc/lastleft.wav");
239}
240
241public plugin_end()
242{
243 SQL_FreeHandle(sql);
244 SQL_FreeHandle(connection);
245}
246
247public client_connect(id)
248{
249 clear_stats(id);
250
251 if (is_user_bot(id) || is_user_hltv(id)) return;
252
253 set_task(1.0, "load_stats", id + TASK_LOAD);
254}
255
256public client_putinserver(id)
257 playerStats[id][CONNECTS]++;
258
259public client_authorized(id)
260 playerStats[id][ADMIN] = get_user_flags(id) & ADMIN_BAN ? 1 : 0;
261
262public client_disconnected(id)
263{
264 remove_task(id + TASK_LOAD);
265 remove_task(id + TASK_TIME);
266
267 save_stats(id, mapChange ? MAP_END : FINAL);
268}
269
270public amxbans_admin_connect(id)
271 client_authorized(id, "");
272
273public player_spawned(id)
274{
275 if (!get_bit(id, visit)) set_task(3.0, "check_time", id + TASK_TIME);
276
277 playerStats[id][ALIVE] = true;
278}
279
280public check_time(id)
281{
282 id -= TASK_TIME;
283
284 if (!get_bit(id, visit)) return;
285
286 if (!get_bit(id, statsLoaded)) {
287 set_task(3.0, "check_time", id + TASK_TIME);
288
289 return;
290 }
291
292 set_bit(id, visit);
293
294 new time = get_systime(), visitYear, Year, visitMonth, Month, visitDay, Day, visitHour, visitMinutes, visitSeconds;
295
296 UnixToTime(time, visitYear, visitMonth, visitDay, visitHour, visitMinutes, visitSeconds);
297
298 client_print_color(id, id, "* Aktualnie jest godzina^x03 %02d:%02d:%02d (Data: %02d.%02d.%02d)^x01. *", visitHour, visitMinutes, visitSeconds, visitDay, visitMonth, visitYear);
299
300 if (playerStats[id][FIRST_VISIT] == playerStats[id][LAST_VISIT]) client_print_color(id, id, "* To twoja^x04 pierwsza wizyta^x01 na serwerze. Zyczymy milej gry! *");
301 else {
302 UnixToTime(playerStats[id][LAST_VISIT], Year, Month, Day, visitHour, visitMinutes, visitSeconds);
303
304 if (visitYear == Year && visitMonth == Month && visitDay == Day) client_print_color(id, id, "* Twoja ostatnia wizyta miala miejsce^x03 dzisiaj^x01 o^x03 %02d:%02d:%02d^x01. Zyczymy milej gry! *", visitHour, visitMinutes, visitSeconds);
305 else if (visitYear == Year && visitMonth == Month && (visitDay - 1) == Day) client_print_color(id, id, "* Twoja ostatnia wizyta miala miejsce^x03 wczoraj^x01 o^x03 %02d:%02d:%02d^x01. Zyczymy milej gry! *", visitHour, visitMinutes, visitSeconds);
306 else client_print_color(id, id, "* Twoja ostatnia wizyta:^x03 %02d:%02d:%02d (Data: %02d.%02d.%02d)^x01. Zyczymy milej gry! *", visitHour, visitMinutes, visitSeconds, Day, Month, Year);
307 }
308}
309
310public round_end()
311{
312 for (new id = 1; id <= MAX_PLAYERS; id++) {
313 if (!is_user_connected(id)) continue;
314
315 if (get_user_team(id) == 1 || get_user_team(id) == 2) {
316 playerStats[id][ROUNDS]++;
317 playerStats[id][get_user_team(id) == 1 ? ROUNDS_T : ROUNDS_CT]++;
318 }
319
320 save_stats(id, ROUND);
321 }
322
323 set_task(0.5, "show_hud_info", TASK_HUD);
324}
325
326public first_round()
327 block = false;
328
329public round_restart()
330 round = 0;
331
332public new_round()
333{
334 remove_task(TASK_HUD);
335
336 show_hud_info(true);
337
338 clear_stats();
339
340 planter = 0;
341 defuser = 0;
342
343 oneAndOnly = false;
344
345 if (!round) {
346 set_task(30.0, "first_round");
347
348 block = true;
349 }
350
351 round++;
352
353 if (!leaderInfoEnabled) return;
354
355 new bestId, bestFrags, tempFrags, bestDeaths, tempDeaths;
356
357 for (new id = 1; id <= MAX_PLAYERS; id++) {
358 if (!is_user_connected(id) || is_user_bot(id) || is_user_hltv(id)) continue;
359
360 tempFrags = get_user_frags(id);
361 tempDeaths = get_user_deaths(id);
362
363 if (tempFrags > 0 && (tempFrags > bestFrags || (tempFrags == bestFrags && tempDeaths < bestDeaths))) {
364 bestFrags = tempFrags;
365 bestDeaths = tempDeaths;
366 bestId = id;
367 }
368 }
369
370 if (is_user_connected(bestId)) client_print_color(0, bestId, "* MVP:^x03 %s^x01 su^x04 %i^x01 nužudymų ir^x04 %i^x01 mirĨių. *", playerStats[bestId][NAME], bestFrags, bestDeaths);
371}
372
373public spectator_mode(id)
374{
375 new spectData[12];
376
377 read_data(2, spectData, charsmax(spectData));
378
379 playerStats[id][SPECT] = (spectData[10] == '2');
380}
381
382public show_rank(id)
383{
384 if (!spectRankEnabled || !playerStats[id][SPECT]) return;
385
386 new player = read_data(2);
387
388 if (is_user_connected(player)) {
389 set_hudmessage(255, 255, 255, 0.02, 0.96, 2, 0.05, 0.1, 0.01, 3.0, -1);
390
391 ShowSyncHudMsg(id, hudSpectRank, "%s reitingas yra %d is %d", playerStats[player][NAME], playerStats[player][STATS_RANK], statsNum);
392 }
393}
394
395public planting_bomb(planter)
396 ExecuteForward(statsForwards[FORWARD_PLANTING], ret, planter);
397
398public planted_bomb()
399{
400 planter = get_loguser_index();
401
402 playerStats[planter][BOMB_PLANTED]++;
403
404 ExecuteForward(statsForwards[FORWARD_PLANTED], ret, planter);
405
406 if (!soundsEnabled) return;
407
408 for (new i = 1; i <= MAX_PLAYERS; i++) {
409 if(!is_user_connected(i)) continue;
410
411 if(((is_user_alive(i) && get_user_team(i) == 2) || (!is_user_alive(i) && get_user_team(pev(i, pev_iuser2)) == 2)) && get_bit(i, soundPrepare)) client_cmd(i, "spk misc/prepare");
412 }
413}
414
415public planted_bomb_no_round(planter)
416{
417 playerStats[planter][BOMB_PLANTED]++;
418
419 ExecuteForward(statsForwards[FORWARD_PLANTED], ret, planter);
420}
421
422public defused_bomb()
423{
424 defuser = get_loguser_index();
425
426 playerStats[defuser][BOMB_DEFUSED]++;
427
428 ExecuteForward(statsForwards[FORWARD_DEFUSED], ret, defuser);
429}
430
431public defusing_bomb()
432{
433 defuser = get_loguser_index();
434
435 playerStats[defuser][BOMB_DEFUSIONS]++;
436}
437
438public explode_bomb()
439{
440 if (is_user_connected(planter)) playerStats[planter][BOMB_EXPLODED]++;
441
442 ExecuteForward(statsForwards[FORWARD_EXPLODE], ret, planter, defuser);
443}
444
445public cur_weapon(id)
446{
447 static weapon, ammo;
448
449 weapon = read_data(2);
450 ammo = read_data(3);
451
452 if (weaponsAmmo[id][weapon] != ammo) {
453 if (weaponsAmmo[id][weapon] > ammo) {
454 playerStats[id][STATS_SHOTS]++;
455 playerRStats[id][STATS_SHOTS]++;
456 playerWStats[id][weapon][STATS_SHOTS]++;
457 playerWRStats[id][weapon][STATS_SHOTS]++;
458 }
459
460 weaponsAmmo[id][weapon] = ammo;
461 }
462}
463
464public damage(victim)
465{
466 if (!playerStats[victim][ALIVE]) return;
467
468 static damage, inflictor;
469
470 damage = read_data(2);
471
472 inflictor = pev(victim, pev_dmg_inflictor);
473
474 if (!pev_valid(inflictor)) return;
475
476 new attacker, weapon, hitPlace, sameTeam;
477
478 attacker = get_user_attacker(victim, weapon, hitPlace);
479
480 if (!(0 <= attacker <= MAX_PLAYERS)) return;
481
482 sameTeam = get_user_team(victim) == get_user_team(attacker) ? true : false;
483
484 if (!(0 < inflictor <= MAX_PLAYERS)) weapon = CSW_HEGRENADE;
485
486 if (0 <= hitPlace < HIT_END) {
487 ExecuteForward(statsForwards[FORWARD_DAMAGE], ret, attacker, victim, damage, weapon, hitPlace, sameTeam);
488
489 playerStats[attacker][STATS_DAMAGE] += damage;
490 playerRStats[attacker][STATS_DAMAGE] += damage;
491 playerWStats[attacker][weapon][STATS_DAMAGE] += damage;
492 playerWRStats[attacker][weapon][STATS_DAMAGE] += damage;
493 playerVStats[attacker][victim][STATS_DAMAGE] += damage;
494 playerAStats[victim][attacker][STATS_DAMAGE] += damage;
495 playerVStats[attacker][0][STATS_DAMAGE] += damage;
496 playerAStats[victim][0][STATS_DAMAGE] += damage;
497
498 playerStats[attacker][STATS_HITS]++;
499 playerRStats[attacker][STATS_HITS]++;
500 playerWStats[attacker][weapon][STATS_HITS]++;
501 playerWRStats[attacker][weapon][STATS_HITS]++;
502 playerVStats[attacker][victim][STATS_HITS]++;
503 playerAStats[victim][attacker][STATS_HITS]++;
504 playerVStats[attacker][0][STATS_HITS]++;
505 playerAStats[victim][0][STATS_HITS]++;
506
507 playerStats[attacker][HIT_GENERIC]++;
508 playerRStats[attacker][HIT_GENERIC]++;
509 playerWStats[attacker][weapon][HIT_GENERIC]++;
510 playerWRStats[attacker][weapon][HIT_GENERIC]++;
511 playerVStats[attacker][victim][HIT_GENERIC]++;
512 playerAStats[victim][attacker][HIT_GENERIC]++;
513 playerVStats[attacker][0][HIT_GENERIC]++;
514 playerAStats[victim][0][HIT_GENERIC]++;
515
516 playerVStats[attacker][victim][STATS_RANK] = weapon;
517 playerAStats[victim][attacker][STATS_RANK] = weapon;
518
519 if (hitPlace) {
520 playerStats[attacker][hitPlace]++;
521 playerRStats[attacker][hitPlace]++;
522 playerWStats[attacker][weapon][hitPlace]++;
523 playerWRStats[attacker][weapon][hitPlace]++;
524 playerVStats[attacker][victim][hitPlace]++;
525 playerAStats[victim][attacker][hitPlace]++;
526 playerVStats[attacker][0][hitPlace]++;
527 playerAStats[victim][0][hitPlace]++;
528 }
529
530 if (!is_user_alive(victim)) {
531 playerStats[victim][ALIVE] = false;
532
533 death(attacker, victim, weapon, hitPlace, sameTeam);
534 }
535 }
536}
537
538public death(killer, victim, weapon, hitPlace, teamKill)
539{
540 ExecuteForward(statsForwards[FORWARD_DEATH], ret, killer, victim, weapon, hitPlace, teamKill);
541
542 playerStats[victim][CURRENT_DEATHS]++;
543 playerStats[victim][STATS_DEATHS]++;
544 playerRStats[victim][STATS_DEATHS]++;
545 playerWStats[victim][weapon][STATS_DEATHS]++;
546 playerWRStats[victim][weapon][STATS_DEATHS]++;
547
548 if (is_user_connected(killer)) playerAStats[victim][0][KILLER_TEAM] = get_user_team(killer);
549
550 save_stats(victim, NORMAL);
551
552 if (is_user_connected(killer) && killer != victim) {
553 new killerOrigin[3], victimOrigin[3];
554
555 playerStats[victim][REVENGE] = killer;
556
557 playerStats[killer][SKILL] = _:set_skill(playerStats[killer][SKILL], 1.0, get_skill(playerStats[victim][SKILL], playerStats[killer][SKILL]));
558 playerStats[victim][SKILL] = floatmax(1.0, set_skill(playerStats[victim][SKILL], 0.0, get_skill(playerStats[killer][SKILL], playerStats[victim][SKILL])));
559
560 playerAStats[victim][0][KILLER_ID] = killer;
561 playerAStats[victim][0][KILLER_HEALTH] = get_user_health(killer);
562 playerAStats[victim][0][KILLER_ARMOR] = get_user_armor(killer);
563
564 playerAStats[killer][victim][KILLER_DISTANCE] = playerVStats[victim][0][KILLER_DISTANCE] = get_distance(victimOrigin, killerOrigin);
565
566 playerStats[killer][CURRENT_KILLS]++;
567 playerStats[killer][STATS_KILLS]++;
568 playerRStats[killer][STATS_KILLS]++;
569 playerWStats[killer][weapon][STATS_KILLS]++;
570 playerWRStats[killer][weapon][STATS_KILLS]++;
571 playerVStats[killer][victim][STATS_KILLS]++;
572 playerAStats[victim][killer][STATS_KILLS]++;
573 playerVStats[killer][0][STATS_KILLS]++;
574 playerAStats[victim][0][STATS_KILLS]++;
575
576 if (hitPlace == HIT_HEAD) {
577 playerStats[killer][CURRENT_HS]++;
578 playerStats[killer][STATS_HS]++;
579 playerRStats[killer][STATS_HS]++;
580 playerWStats[killer][weapon][STATS_HS]++;
581 playerWRStats[killer][weapon][STATS_HS]++;
582 playerVStats[killer][victim][STATS_HS]++;
583 playerAStats[victim][killer][STATS_HS]++;
584 playerVStats[killer][0][STATS_HS]++;
585 playerAStats[victim][0][STATS_HS]++;
586 }
587
588 if (teamKill) {
589 playerStats[killer][STATS_TK]++;
590 playerRStats[killer][STATS_TK]++;
591 playerWStats[killer][weapon][STATS_TK]++;
592 playerWRStats[killer][weapon][STATS_TK]++;
593 playerVStats[killer][victim][STATS_TK]++;
594 playerAStats[victim][killer][STATS_TK]++;
595 playerVStats[killer][0][STATS_TK]++;
596 playerAStats[victim][0][STATS_TK]++;
597 }
598
599 save_stats(killer, NORMAL);
600
601 if (killerInfoEnabled) client_print_color(killer, victim, "* Zabiles^x03 %s^x01. *", playerStats[victim][NAME]);
602 if (victimInfoEnabled) client_print_color(victim, killer, "* Nuzude^x03 %s^x01, kuriam yra^x04 %i^x01 HP. *", playerStats[killer][NAME], get_user_health(killer));
603
604 if (assistEnabled) {
605 new assistKiller, assistDamage;
606
607 for (new i = 1; i <= MAX_PLAYERS; i++) {
608 if(!is_user_connected(i) || i == killer || i == victim) continue;
609
610 if(playerAStats[victim][i][STATS_DAMAGE] >= assistMinDamage && playerAStats[victim][i][STATS_DAMAGE] > assistDamage) {
611 assistKiller = i;
612 assistDamage = playerAStats[victim][i][STATS_DAMAGE];
613 }
614 }
615
616 if (assistKiller) {
617 playerStats[assistKiller][STATS_KILLS]++;
618 playerStats[assistKiller][CURRENT_KILLS]++;
619 playerStats[assistKiller][ASSISTS]++;
620
621 ExecuteForward(statsForwards[FORWARD_ASSIST], ret, killer, victim, assistKiller);
622
623 save_stats(assistKiller, NORMAL);
624
625 set_user_frags(assistKiller, get_user_frags(assistKiller) + 1);
626 cs_set_user_deaths(assistKiller, cs_get_user_deaths(assistKiller));
627
628 new money = min(cs_get_user_money(assistKiller) + assistMoney, MAX_MONEY);
629
630 cs_set_user_money(assistKiller, money);
631
632 if (is_user_alive(assistKiller)) {
633 static msgMoney;
634
635 if (!msgMoney) msgMoney = get_user_msgid("Money");
636
637 message_begin(MSG_ONE_UNRELIABLE, msgMoney, _, assistKiller);
638 write_long(money);
639 write_byte(1);
640 message_end();
641 }
642
643 if (assistInfoEnabled) client_print_color(assistKiller, killer, "* Padėjai^x04 %s^x01 nužudyti^x04 %s^x01! *", playerStats[killer][NAME], playerStats[victim][NAME]);
644 }
645 }
646
647 if (playerStats[killer][REVENGE] == victim && revengeEnabled) {
648 playerStats[killer][STATS_KILLS]++;
649 playerStats[killer][CURRENT_KILLS]++;
650 playerStats[killer][REVENGES]++;
651
652 playerStats[killer][REVENGE] = 0;
653
654 ExecuteForward(statsForwards[FORWARD_REVENGE], ret, killer, victim);
655
656 save_stats(killer, NORMAL);
657
658 set_user_frags(killer, get_user_frags(killer) + 1);
659 cs_set_user_deaths(killer, cs_get_user_deaths(killer));
660
661 new money = min(cs_get_user_money(killer) + revengeMoney, MAX_MONEY);
662
663 cs_set_user_money(killer, money);
664
665 if (is_user_alive(killer)) {
666 static msgMoney;
667
668 if (!msgMoney) msgMoney = get_user_msgid("Money");
669
670 message_begin(MSG_ONE_UNRELIABLE, msgMoney, _, killer);
671 write_long(money);
672 write_byte(1);
673 message_end();
674 }
675
676 if (revengeInfoEnabled) client_print_color(killer, victim, "* Zemsciles sie zabijajac^x04 %s^x01. *", playerStats[victim][NAME]);
677 }
678 }
679
680 show_user_hud_info(victim, false);
681
682 if (!soundsEnabled && !xvsxEnabled) return;
683
684 if (weapon == CSW_KNIFE && soundsEnabled) {
685 for (new i = 1; i <= MAX_PLAYERS; i++) {
686 if (!is_user_connected(i)) continue;
687
688 if ((pev(i, pev_iuser2) == victim || i == victim) && get_bit(i, soundHumiliation)) client_cmd(i, "spk misc/humiliation");
689 }
690 }
691
692 if (block) return;
693
694 new tCount, ctCount, lastT, lastCT;
695
696 for (new i = 1; i <= MAX_PLAYERS; i++) {
697 if (!is_user_alive(i)) continue;
698
699 switch(get_user_team(i)) {
700 case 1: {
701 tCount++;
702 lastT = i;
703 } case 2: {
704 ctCount++;
705 lastCT = i;
706 }
707 }
708 }
709
710 if (tCount == 1 && ctCount == 1) {
711 if (soundsEnabled) {
712 for (new i = 1; i <= MAX_PLAYERS; i++) {
713 if (!is_user_connected(i)) continue;
714
715 if ((pev(i, pev_iuser2) == lastT || pev(i, pev_iuser2) == lastCT || i == lastT || i == lastCT) && get_bit(i, soundMayTheForce)) client_cmd(i, "spk misc/maytheforce");
716 }
717 }
718
719 if (xvsxEnabled) {
720 new nameT[32], nameCT[32];
721
722 get_user_name(lastT, nameT, charsmax(nameT));
723 get_user_name(lastCT, nameCT, charsmax(nameCT));
724
725 set_dhudmessage(255, 128, 0, -1.0, 0.30, 0, 3.0, 3.0, 0.5, 0.15);
726 show_dhudmessage(0, "%s vs. %s", nameT, nameCT);
727 }
728 }
729
730 if (tCount == 1 && ctCount > 1) {
731 if (!oneAndOnly && soundsEnabled) {
732 for (new i = 1; i <= MAX_PLAYERS; i++) {
733 if (!is_user_connected(i)) continue;
734
735 if (((is_user_alive(i) && get_user_team(i) == 2) || (!is_user_alive(i) && pev(i, pev_iuser2) != lastT)) && get_bit(i, soundLastLeft)) client_cmd(i, "spk misc/lastleft");
736
737 if ((pev(i, pev_iuser2) == lastT || i == lastT) && get_bit(i, soundOneAndOnly)) client_cmd(i, "spk misc/oneandonly");
738 }
739 }
740
741 oneAndOnly = true;
742
743 if (xvsxEnabled) {
744 set_dhudmessage(255, 128, 0, -1.0, 0.30, 0, 3.0, 3.0, 0.5, 0.15);
745 show_dhudmessage(0, "%i vs %i", tCount, ctCount);
746 }
747 }
748
749 if (tCount > 1 && ctCount == 1) {
750 if (!oneAndOnly && soundsEnabled) {
751 for (new i = 1; i <= MAX_PLAYERS; i++) {
752 if (!is_user_connected(i)) continue;
753
754 if (((is_user_alive(i) && get_user_team(i) == 1) || (!is_user_alive(i) && pev(i, pev_iuser2) != lastCT)) && get_bit(i, soundLastLeft)) client_cmd(i, "spk misc/lastleft");
755
756 if ((pev(i, pev_iuser2) == lastCT || i == lastCT) && get_bit(i, soundOneAndOnly)) client_cmd(i, "spk misc/oneandonly");
757 }
758 }
759
760 oneAndOnly = true;
761
762 if (xvsxEnabled) {
763 set_dhudmessage(255, 128, 0, -1.0, 0.30, 0, 3.0, 3.0, 0.5, 0.15);
764 show_dhudmessage(0, "%i vs %i", ctCount, tCount);
765 }
766 }
767}
768
769public win_t()
770 round_winner(1);
771
772public win_ct()
773 round_winner(2);
774
775public round_winner(team)
776{
777 for (new id = 1; id <= MAX_PLAYERS; id++) {
778 if (!is_user_connected(id) || get_user_team(id) != team) continue;
779
780 playerStats[id][team == 1 ? WIN_T : WIN_CT]++;
781 }
782}
783
784public set_model(ent, model[])
785{
786 static className[32], id, weapon; id = pev(ent, pev_owner);
787
788 if (!is_user_connected(id)) return FMRES_IGNORED;
789
790 pev(ent, pev_classname, className, charsmax(className));
791
792 if (strcmp(className, "grenade") != 0) return FMRES_IGNORED;
793
794 switch (model[9]) {
795 case 'f': weapon = CSW_FLASHBANG;
796 case 'h': weapon = CSW_HEGRENADE;
797 case 's': weapon = CSW_SMOKEGRENADE;
798 }
799
800 ExecuteForward(statsForwards[FORWARD_THROW], ret, id, ent, weapon);
801
802 return FMRES_IGNORED;
803}
804
805public message_intermission()
806{
807 mapChange = true;
808
809 if (medalsEnabled) {
810 new playerName[32], winnersId[3], winnersFrags[3], tempFrags, swapFrags, swapId;
811
812 for (new id = 1; id <= MAX_PLAYERS; id++) {
813 if (!is_user_connected(id) || is_user_hltv(id) || is_user_bot(id)) continue;
814
815 tempFrags = get_user_frags(id);
816
817 if (tempFrags > winnersFrags[THIRD]) {
818 winnersFrags[THIRD] = tempFrags;
819 winnersId[THIRD] = id;
820
821 if (tempFrags > winnersFrags[SECOND]) {
822 swapFrags = winnersFrags[SECOND];
823 swapId = winnersId[SECOND];
824 winnersFrags[SECOND] = tempFrags;
825 winnersId[SECOND] = id;
826 winnersFrags[THIRD] = swapFrags;
827 winnersId[THIRD] = swapId;
828
829 if (tempFrags > winnersFrags[FIRST]) {
830 swapFrags = winnersFrags[FIRST];
831 swapId = winnersId[FIRST];
832 winnersFrags[FIRST] = tempFrags;
833 winnersId[FIRST] = id;
834 winnersFrags[SECOND] = swapFrags;
835 winnersId[SECOND] = swapId;
836 }
837 }
838 }
839 }
840
841 if (!winnersId[FIRST]) return PLUGIN_CONTINUE;
842
843 new const medals[][] = { "Gems", "Tickets", "Powder" };
844
845 client_print_color(0, 0, "* Sveikiname^x03 Geriausius Žaidėjus^x01! *");
846
847 for (new i = 2; i >= 0; i--) {
848 switch(i) {
849 case THIRD: playerStats[winnersId[i]][BRONZE]++;
850 case SECOND: playerStats[winnersId[i]][SILVER]++;
851 case FIRST: playerStats[winnersId[i]][GOLD]++;
852 }
853
854 save_stats(winnersId[i], FINAL);
855
856 get_user_name(winnersId[i], playerName, charsmax(playerName));
857
858 client_print_color(0, 0, "* ^x03 %s^x01 -^x03 %i^x01 Nuzudymu. Prizas - %s. *", playerName, winnersFrags[i], medals[i]);
859 }
860 }
861
862 for (new id = 1; id <= MAX_PLAYERS; id++) {
863 if (!is_user_connected(id) || is_user_hltv(id) || is_user_bot(id)) continue;
864
865 save_stats(id, FINAL);
866 }
867
868 return PLUGIN_CONTINUE;
869}
870
871public say_text(msgId, msgDest, msgEnt)
872{
873 new id = get_msg_arg_int(1);
874
875 if (is_user_connected(id)) {
876 new tempMessage[192], message[192], chatPrefix[16];
877
878 get_msg_arg_string(2, tempMessage, charsmax(tempMessage));
879
880 if (playerStats[id][STATS_RANK] > 3 || !prefixEnabled) return PLUGIN_CONTINUE;
881
882 switch (playerStats[id][STATS_RANK]) {
883 case 1: formatex(chatPrefix, charsmax(chatPrefix), "^x04[TOP1]");
884 case 2: formatex(chatPrefix, charsmax(chatPrefix), "^x04[TOP2]");
885 case 3: formatex(chatPrefix, charsmax(chatPrefix), "^x04[TOP3]");
886 }
887
888 if (!equal(tempMessage, "#Cstrike_Chat_All")) {
889 add(message, charsmax(message), chatPrefix);
890 add(message, charsmax(message), " ");
891 add(message, charsmax(message), tempMessage);
892 } else {
893 get_msg_arg_string(4, tempMessage, charsmax(tempMessage));
894 set_msg_arg_string(4, "");
895
896 add(message, charsmax(message), chatPrefix);
897 add(message, charsmax(message), "^x03 ");
898 add(message, charsmax(message), playerStats[id][NAME]);
899 add(message, charsmax(message), "^x01 : ");
900 add(message, charsmax(message), tempMessage);
901 }
902
903 set_msg_arg_string(2, message);
904 }
905
906 return PLUGIN_CONTINUE;
907}
908
909public show_hud_info(start)
910{
911 static hudInfo[512], hudTemp[256];
912
913 hudInfo = "";
914
915 if (disruptiveHudEnabled) {
916 new disruptiveId, disruptiveDamage, disruptiveHits;
917
918 for (new player = 1; player <= MAX_PLAYERS; player++) {
919 if (!is_user_connected(player)) continue;
920
921 if (playerRStats[player][STATS_DAMAGE] >= disruptiveDamage && (playerRStats[player][STATS_DAMAGE] > disruptiveDamage || playerRStats[player][STATS_HITS] > disruptiveHits)) {
922 disruptiveId = player;
923 disruptiveDamage = playerRStats[player][STATS_DAMAGE];
924 disruptiveHits = playerRStats[player][STATS_HITS];
925 }
926 }
927
928 if (disruptiveId) {
929 formatex(hudTemp, charsmax(hudTemp), "Daugiausiai zalos: %s^n%d pataikymu / %d zalos -- %0.2f%% ef. / %0.2f%% taikl.^n", playerStats[disruptiveId][NAME], disruptiveHits, disruptiveDamage,
930 effec(playerRStats[disruptiveId][STATS_KILLS], playerRStats[disruptiveId][STATS_DEATHS]), accuracy(playerRStats[disruptiveId][STATS_SHOTS], playerRStats[disruptiveId][STATS_HITS]));
931
932 add(hudInfo, charsmax(hudInfo), hudTemp);
933 }
934 }
935
936 if (bestScoreHudEnabled) {
937 new bestScoreId, bestScoreKills, bestScoreHS;
938
939 for (new player = 1; player <= MAX_PLAYERS; player++) {
940 if (!is_user_connected(player)) continue;
941
942 if (playerRStats[player][STATS_KILLS] >= bestScoreKills && (playerRStats[player][STATS_KILLS] > bestScoreKills || playerRStats[player][STATS_HS] > bestScoreHS)) {
943 bestScoreId = player;
944 bestScoreKills = playerRStats[player][STATS_KILLS];
945 bestScoreHS = playerRStats[player][STATS_HS];
946 }
947 }
948
949 if (bestScoreId) {
950 formatex(hudTemp, charsmax(hudTemp), "Geriausias rezultatas: %s^n%d nuzudymu / %d hs -- %0.2f%% ef. / %0.2f%% taikl.^n", playerStats[bestScoreId][NAME], bestScoreKills, bestScoreHS,
951 effec(playerRStats[bestScoreId][STATS_KILLS], playerRStats[bestScoreId][STATS_DEATHS]), accuracy(playerRStats[bestScoreId][STATS_SHOTS], playerRStats[bestScoreId][STATS_HITS]));
952
953 add(hudInfo, charsmax(hudInfo), hudTemp);
954 }
955 }
956
957 if (hudInfo[0]) {
958 set_hudmessage(100, 200, 0, 0.05, 0.55, 0, 0.0, 6.0, start ? 0.0 : 1.0, 1.0);
959 ShowSyncHudMsg(0, hudEndRound, "%s", hudInfo);
960 }
961
962 for (new id = 1; id <= MAX_PLAYERS; id++) {
963 if (!is_user_connected(id)) continue;
964
965 show_user_hud_info(id, start);
966 }
967}
968
969public show_user_hud_info(id, start)
970{
971 if (playerStats[id][HUD_INFO]) return;
972
973 static hudInfo[1024], weaponName[32], stats[8], hits[8], length;
974
975 new const victims[] = "Auka:^n", attackers[] = "Puolejas:^n";
976
977 playerStats[id][HUD_INFO] = true;
978
979 if (victimHudEnabled) {
980 hudInfo = "";
981
982 copy_stats(id, hits, sizeof(hits), _, VICTIM_STATS, _, 0);
983 copy_stats(id, stats, charsmax(stats), HIT_END, VICTIM_STATS, _, 0);
984
985 if (stats[stat(STATS_SHOTS)]) length = formatex(hudInfo, charsmax(hudInfo), "Auka -- %0.2f%% taikl.:^n", accuracy(stats[stat(STATS_SHOTS)], stats[stat(STATS_HITS)]));
986 else length = formatex(hudInfo, charsmax(hudInfo), victims);
987
988 for (new player = 1; player <= MAX_PLAYERS; player++) {
989 if (!is_user_connected(player) || is_user_hltv(player)) continue;
990
991 copy_stats(id, hits, sizeof(hits), _, VICTIM_STATS, _, player);
992
993 if (!hits[HIT_GENERIC]) continue;
994
995 copy_stats(id, stats, sizeof(stats), HIT_END, VICTIM_STATS, _, player);
996
997 if (stats[stat(STATS_DEATHS)]) {
998 if (stats[stat(STATS_RANK)] > 0) {
999 get_weaponname(stats[stat(STATS_RANK)], weaponName, charsmax(weaponName));
1000
1001 replace_all(weaponName, charsmax(weaponName), "weapon_", "");
1002
1003 length += formatex(hudInfo[length], charsmax(hudInfo) - length, "%s -- %d pataikymu / %d zalos / %s%s^n", playerStats[player][NAME], stats[stat(STATS_HITS)], stats[stat(STATS_DAMAGE)], weaponName, (stats[stat(STATS_HS)] && hsHudEnabled) ? " / hs" : "");
1004 } else length += formatex(hudInfo[length], charsmax(hudInfo) - length, "%s -- %d pataikymu / %d zalos%s^n", playerStats[player][NAME], stats[stat(STATS_HITS)], stats[stat(STATS_DAMAGE)], (stats[stat(STATS_HS)] && hsHudEnabled) ? " / hs" : "");
1005 } else length += formatex(hudInfo[length], charsmax(hudInfo) - length, "%s -- %d pataikymu / %d zalos^n", playerStats[player][NAME], stats[stat(STATS_HITS)], stats[stat(STATS_DAMAGE)]);
1006 }
1007
1008 if (strlen(hudInfo) > strlen(victims)) {
1009 set_hudmessage(0, 80, 220, 0.55, 0.60, 0, 0.0, 6.0, start ? 0.0 : 1.0, 1.0, -1);
1010 show_hudmessage(id, "%s", hudInfo);
1011 }
1012 }
1013
1014 if (attackerHudEnabled) {
1015 hudInfo = "";
1016
1017 copy_stats(id, hits, sizeof(hits), _, ATTACKER_STATS, _, 0);
1018 copy_stats(id, stats, charsmax(stats), HIT_END, ATTACKER_STATS, _, 0);
1019
1020 if (stats[stat(STATS_SHOTS)]) length = formatex(hudInfo, charsmax(hudInfo), "Puolejas -- %0.2f%% taikl.:^n", accuracy(stats[stat(STATS_SHOTS)], stats[stat(STATS_HITS)]));
1021 else length = formatex(hudInfo, charsmax(hudInfo), attackers);
1022
1023 for (new player = 1; player <= MAX_PLAYERS; player++) {
1024 if (!is_user_connected(player) || is_user_hltv(player)) continue;
1025
1026 copy_stats(id, hits, sizeof(hits), _, ATTACKER_STATS, _, player);
1027
1028 if (!hits[HIT_GENERIC]) continue;
1029
1030 copy_stats(id, stats, sizeof(stats), HIT_END, ATTACKER_STATS, _, player);
1031
1032 if (stats[stat(STATS_KILLS)]) {
1033 if (stats[stat(STATS_RANK)] > 0) {
1034 get_weaponname(stats[stat(STATS_RANK)], weaponName, charsmax(weaponName));
1035
1036 replace_all(weaponName, charsmax(weaponName), "weapon_", "");
1037
1038 length += formatex(hudInfo[length], charsmax(hudInfo) - length, "%s -- %d pataikymu / %d zalos / %s%s^n", playerStats[player][NAME], stats[stat(STATS_HITS)], stats[stat(STATS_DAMAGE)], weaponName, (stats[stat(STATS_HS)] && hsHudEnabled) ? " / hs" : "");
1039 } else length += formatex(hudInfo[length], charsmax(hudInfo) - length, "%s -- %d pataikymu / %d zalos%s^n", playerStats[player][NAME], stats[stat(STATS_HITS)], stats[stat(STATS_DAMAGE)], (stats[stat(STATS_HS)] && hsHudEnabled) ? " / hs" : "");
1040 } else length += formatex(hudInfo[length], charsmax(hudInfo) - length, "%s -- %d pataikymu / %d zalos^n", playerStats[player][NAME], stats[stat(STATS_HITS)], stats[stat(STATS_DAMAGE)]);
1041 }
1042
1043 if (strlen(hudInfo) > strlen(attackers)) {
1044 set_hudmessage(220, 80, 0, 0.55, 0.35, 0, 0.0, 6.0, start ? 0.0 : 1.0, 1.0, -1);
1045 show_hudmessage(id, "%s", hudInfo);
1046 }
1047 }
1048}
1049
1050public cmd_menu(id)
1051{
1052 new menuData[64], weaponName[32], shortWeaponName[32], weaponCommand[32],
1053 menu = menu_create("\yStatistikos \rMeniu\w:", "cmd_menu_handle");
1054
1055 for (new i = 1; i < sizeof(commands); i++) {
1056 if (equal(commands[i][0], "cmd_time_admin") && !(get_user_flags(id) & ADMIN_BAN)) continue;
1057
1058 formatex(menuData, charsmax(menuData), "%s \y(%s)", commands[i][1], commands[i][3]);
1059
1060 replace_all(menuData, charsmax(menuData), "say ", "");
1061
1062 menu_additem(menu, menuData, commands[i][2]);
1063 }
1064
1065 for (new i = 1; i < WEAPONS_END; i++) {
1066 if (i == CSW_SHIELD || i == CSW_C4 || i == CSW_FLASHBANG || i == CSW_SMOKEGRENADE) continue;
1067
1068 get_weaponname(i, weaponName, charsmax(weaponName));
1069 copy(shortWeaponName, charsmax(shortWeaponName), weaponName);
1070
1071 if (i == CSW_HEGRENADE) replace_all(weaponName, charsmax(weaponName), "hegrenade", "he");
1072 else if (i == CSW_UMP45) replace_all(weaponName, charsmax(weaponName), "mp5navy", "mp5");
1073 else if (i == CSW_MP5NAVY) replace_all(weaponName, charsmax(weaponName), "ump45", "ump");
1074
1075 replace_all(shortWeaponName, charsmax(shortWeaponName), "weapon_", "");
1076
1077 formatex(weaponCommand, charsmax(weaponCommand), "/%stop15", shortWeaponName);
1078
1079 ucfirst(shortWeaponName);
1080
1081 formatex(menuData, charsmax(menuData), "%s \rTop15 \y(%s)", shortWeaponName, weaponCommand);
1082
1083 menu_additem(menu, menuData, weaponName);
1084 }
1085
1086 menu_setprop(menu, MPROP_EXITNAME, "Wyjscie");
1087 menu_setprop(menu, MPROP_BACKNAME, "Poprzednie");
1088 menu_setprop(menu, MPROP_NEXTNAME, "Nastepne");
1089
1090 menu_display(id, menu);
1091
1092 return PLUGIN_HANDLED;
1093}
1094
1095public cmd_menu_handle(id, menu, item)
1096{
1097 if (!is_user_connected(id)) return PLUGIN_HANDLED;
1098
1099 if (item == MENU_EXIT) {
1100 menu_destroy(menu);
1101
1102 return PLUGIN_HANDLED;
1103 }
1104
1105 new itemData[32], itemAccess, menuCallback;
1106
1107 menu_item_getinfo(menu, item, itemAccess, itemData, charsmax(itemData), _, _, menuCallback);
1108
1109 if (contain(itemData, "weapon_") != -1) {
1110 cmd_weapon_top15(id, get_weaponid(itemData));
1111 } else {
1112 cmd_execute(id, itemData);
1113 }
1114
1115 menu_destroy(menu);
1116
1117 return PLUGIN_HANDLED;
1118}
1119
1120public cmd_hp(id)
1121{
1122 if (!hpEnabled) return PLUGIN_CONTINUE;
1123
1124 new killer = playerAStats[id][0][KILLER_ID];
1125
1126 static message[192];
1127
1128 if (killer && killer != id) {
1129 new weaponName[32], stats[8], hits[8], length;
1130
1131 copy_stats(id, hits, sizeof(hits), _, ATTACKER_STATS, _, killer);
1132 copy_stats(id, stats, sizeof(stats), HIT_END, ATTACKER_STATS, _, killer);
1133
1134 if (stats[stat(STATS_RANK)] > 0) {
1135 get_weaponname(stats[stat(STATS_RANK)], weaponName, charsmax(weaponName));
1136
1137 replace_all(weaponName, charsmax(weaponName), "weapon_", "");
1138
1139 length = formatex(message, charsmax(message), "Nuzude^x03 %s^x01 su %s is %0.0fm atstumo (^x04 %d HP^x01,^x04 %d AP^x01). Vietos: ", playerStats[killer][NAME], weaponName, distance(playerAStats[id][0][KILLER_DISTANCE]), playerAStats[id][0][KILLER_HEALTH], playerAStats[id][0][KILLER_ARMOR]);
1140 } else length = formatex(message, charsmax(message), "Nuzude^x03 %s^x01 is %0.0fm atstumo (^x04 %d HP^x01,^x04 %d AP^x01). Vietos: ", playerStats[killer][NAME], distance(playerAStats[id][0][KILLER_DISTANCE]), playerAStats[id][0][KILLER_HEALTH], playerAStats[id][0][KILLER_ARMOR]);
1141
1142 if (stats[stat(STATS_HITS)]) {
1143 for (new i = 1, hit = 0; i < sizeof(hits); i++) {
1144 if (!hits[i]) continue;
1145
1146 if (hit) length += formatex(message[length], charsmax(message) - length, ", ");
1147
1148 length += formatex(message[length], charsmax(message) - length, "%s: %d", body[i], hits[i]);
1149
1150 hit++;
1151 }
1152 } else length += formatex(message[length], charsmax(message) - length, "zadnych trafien");
1153 } else formatex(message, charsmax(message), "Turi būti negyvas.");
1154
1155 client_print_color(id, killer, "* %s. *", message);
1156
1157 return PLUGIN_HANDLED;
1158}
1159
1160public cmd_me(id)
1161{
1162 if (!meEnabled) return PLUGIN_CONTINUE;
1163
1164 static message[192];
1165
1166 new stats[8], hits[8], length;
1167
1168 copy_stats(id, hits, sizeof(hits), _, VICTIM_STATS, _, 0);
1169 copy_stats(id, stats, charsmax(stats), HIT_END, VICTIM_STATS, _, 0);
1170
1171 length = formatex(message, charsmax(message), "Rezultatas:^x04 %d^x01 pataikymu,^x04 %d^x01 zalos. ", stats[stat(STATS_HITS)], stats[stat(STATS_DAMAGE)]);
1172
1173 if (stats[stat(STATS_HITS)]) {
1174 for (new i = 1, hit = 0; i < sizeof(hits); i++) {
1175 if (!hits[i]) continue;
1176
1177 if (hit) length += formatex(message[length], charsmax(message) - length, ", ");
1178
1179 length += formatex(message[length], charsmax(message) - length, "%s: %d", body[i], hits[i]);
1180
1181 hit++;
1182 }
1183 } else length += formatex(message[length], charsmax(message) - length, "Nera pataikymu");
1184
1185 client_print_color(id, id, "* %s. *", message);
1186
1187 return PLUGIN_HANDLED;
1188}
1189
1190public cmd_stats(id)
1191{
1192 if (!statsEnabled) return PLUGIN_CONTINUE;
1193
1194 new tempId[3], menu = menu_create("\yZaideju \rStatistika\w:", "cmd_stats_handle");
1195
1196 menu_additem(menu, playerStats[id][STATS_MENU] ? "Rodymas: \yRank Statsai" : "Rodymas: \yStatsai");
1197 menu_addblank(menu, false);
1198
1199 for (new i = 1; i <= MAX_PLAYERS; i++) {
1200 if (!is_user_connected(i)) continue;
1201
1202 num_to_str(i, tempId, charsmax(tempId));
1203
1204 menu_additem(menu, playerStats[i][NAME], tempId);
1205 }
1206
1207 menu_setprop(menu, MPROP_EXITNAME, "Uzdaryti");
1208 menu_setprop(menu, MPROP_BACKNAME, "Atgal");
1209 menu_setprop(menu, MPROP_NEXTNAME, "Kitas");
1210
1211 menu_display(id, menu);
1212
1213 return PLUGIN_HANDLED;
1214}
1215
1216public cmd_stats_handle(id, menu, item)
1217{
1218 if (!is_user_connected(id)) return PLUGIN_HANDLED;
1219
1220 if (item == MENU_EXIT) {
1221 menu_destroy(menu);
1222
1223 return PLUGIN_HANDLED;
1224 }
1225
1226 new itemData[3], itemAccess, menuCallback;
1227
1228 menu_item_getinfo(menu, item, itemAccess, itemData, charsmax(itemData), _, _, menuCallback);
1229
1230 if (!strlen(itemData)) {
1231 playerStats[id][STATS_MENU] = !playerStats[id][STATS_MENU];
1232 } else {
1233 new player = str_to_num(itemData);
1234
1235 if (!is_user_connected(player)) {
1236 client_print_color(id, id, "* Wybranego gracza nie ma juz na serwerze. *");
1237
1238 return PLUGIN_HANDLED;
1239 }
1240
1241 if (!playerStats[id][STATS_MENU]) {
1242 cmd_statsme(id, player);
1243 } else {
1244 cmd_rankstats(id, player);
1245 }
1246 }
1247
1248 menu_destroy(menu);
1249
1250 cmd_stats(id);
1251
1252 return PLUGIN_CONTINUE;
1253}
1254
1255public cmd_statsme(id, player)
1256{
1257 if (!statsMeEnabled) return PLUGIN_CONTINUE;
1258
1259 static motdData[2048], weaponName[32], motdLength, target;
1260
1261 motdLength = 0;
1262
1263 target = player ? player : id;
1264
1265 motdLength = formatex(motdData, charsmax(motdData), "<meta charset=utf-8><body bgcolor=#000000><font color=#FFB000><pre>");
1266
1267 motdLength += formatex(motdData[motdLength], charsmax(motdData) - motdLength, "%16s: %d (%d HS)^n%16s: %d^n%16s: %d^n%16s: %d^n%16s: %d^n%16s: %0.2f%%^n%16s: %0.2f%%^n^n", "Nuzudymai", playerStats[target][STATS_KILLS], playerStats[target][STATS_HS], "Mirtys", playerStats[target][STATS_DEATHS], "Pataikymai",
1268 playerStats[target][STATS_HITS], "Suviai", playerStats[target][STATS_SHOTS], "Zala", playerStats[target][STATS_DAMAGE], "Efektyvumas", effec(playerStats[target][STATS_KILLS], playerStats[target][STATS_DEATHS]), "Taiklumas", accuracy(playerStats[target][STATS_SHOTS], playerStats[target][STATS_HITS]));
1269
1270 motdLength += format(motdData[motdLength], charsmax(motdData) - motdLength, "%8s %6s %7s %2s %6s %4s %4s %4s^n", "Ginklas", "Nuzudymai", "Mirtys", "HS", "Pataikymai", "Suviai", "Ef.", "Taikl.");
1271
1272 for (new i = 1; i < WEAPONS_END; i++) {
1273 if ((i == CSW_SHIELD || i == CSW_C4 || i == CSW_FLASHBANG || i == CSW_SMOKEGRENADE) || (!playerWStats[target][i][STATS_SHOTS] && !playerWStats[target][i][STATS_DEATHS])) continue;
1274
1275 get_weaponname(i, weaponName, charsmax(weaponName));
1276
1277 replace_all(weaponName, charsmax(weaponName), "weapon_", "");
1278
1279 motdLength += format(motdData[motdLength], charsmax(motdData) - motdLength, "%8s %6d %6d %5d %7d %9d %3.0f%% %3.0f%%^n", weaponName, playerWStats[target][i][STATS_KILLS], playerWStats[target][i][STATS_DEATHS], playerWStats[target][i][STATS_HS],
1280 playerWStats[target][i][STATS_HITS], playerWStats[target][i][STATS_SHOTS], effec(playerWStats[target][i][STATS_KILLS], playerWStats[target][i][STATS_DEATHS]), accuracy(playerWStats[target][i][STATS_SHOTS], playerWStats[target][i][STATS_HITS]));
1281 }
1282
1283 show_motd(id, motdData, playerStats[target][NAME]);
1284
1285 return PLUGIN_HANDLED;
1286}
1287
1288public cmd_rank(id)
1289{
1290 if (!rankEnabled) return PLUGIN_CONTINUE;
1291
1292 client_print_color(id, id, "* Tavo rank yra^x03 %d^x01 /^x03 %d^x01. *", playerStats[id][STATS_RANK], statsNum);
1293 client_print_color(id, id, "* Nužudymai:^x04 %d^x01, mirtys:^x04 %d^x01, efektyvumas:^x04 %.2f^x01%%, taiklumas:^x04 %.2f^x01%% *", playerStats[id][STATS_KILLS], playerStats[id][STATS_HITS], effec(playerStats[id][STATS_KILLS], playerStats[id][STATS_DEATHS]), accuracy(playerStats[id][STATS_SHOTS], playerStats[id][STATS_HITS]));
1294
1295 return PLUGIN_HANDLED;
1296}
1297
1298public cmd_rankstats(id, player)
1299{
1300 if (!rankStatsEnabled) return PLUGIN_CONTINUE;
1301
1302 static motdData[4096], motdLength, target;
1303
1304 motdLength = 0;
1305
1306 target = player ? player : id;
1307
1308 motdLength = formatex(motdData, charsmax(motdData), "<meta charset=utf-8><body bgcolor=#000000><font color=#FFB000><pre>");
1309
1310 if (player) motdLength += formatex(motdData[motdLength], charsmax(motdData) - motdLength, "Reitinge %s uzima %i pozicija is %i^n^n", playerStats[target][NAME], playerStats[target][STATS_RANK], statsNum);
1311 else motdLength += formatex(motdData[motdLength], charsmax(motdData) - motdLength, "Tavo uzimama pozicija %i is %i^n^n", playerStats[target][STATS_RANK], statsNum);
1312
1313 motdLength += formatex(motdData[motdLength], charsmax(motdData) - motdLength, "%16s: %d (%d HS)^n%16s: %d^n%16s: %d^n%16s: %d^n%16s: %d^n%16s: %0.2f%%^n%16s: %0.2f%%^n^n", "Nuzudymai", playerStats[target][STATS_KILLS], playerStats[target][STATS_HS], "Mirtys", playerStats[target][STATS_DEATHS], "Pataikymai",
1314 playerStats[target][STATS_HITS], "Suviai", playerStats[target][STATS_SHOTS], "Zala", playerStats[target][STATS_DAMAGE], "Efektyvumas", effec(playerStats[target][STATS_KILLS], playerStats[target][STATS_DEATHS]), "Taiklumas", accuracy(playerStats[target][STATS_SHOTS], playerStats[target][STATS_HITS]));
1315
1316 motdLength += formatex(motdData[motdLength], charsmax(motdData) - motdLength, "PATAIKYMAI^n%16s: %d^n%16s: %d^n%16s: %d^n%16s: %d^n%16s: %d^n%16s: %d^n%16s: %d", body[HIT_HEAD], playerStats[target][HIT_HEAD], body[HIT_CHEST], playerStats[target][HIT_CHEST],
1317 body[HIT_STOMACH], playerStats[target][HIT_STOMACH], body[HIT_LEFTARM], playerStats[target][HIT_LEFTARM], body[HIT_RIGHTARM], playerStats[target][HIT_RIGHTARM], body[HIT_LEFTLEG], playerStats[target][HIT_LEFTLEG], body[HIT_RIGHTLEG], playerStats[target][HIT_RIGHTLEG]);
1318
1319 show_motd(id, motdData, playerStats[target][NAME]);
1320
1321 return PLUGIN_HANDLED;
1322}
1323
1324public cmd_top15(id)
1325{
1326 if (!top15Enabled) return PLUGIN_CONTINUE;
1327
1328 new queryData[256], queryTemp[96], playerId[1];
1329
1330 playerId[0] = id;
1331
1332 get_rank_formula(queryTemp, charsmax(queryTemp), false);
1333
1334 formatex(queryData, charsmax(queryData), "SELECT a.name, a.kills, a.deaths, a.hs_kills, a.shots, a.hits, a.skill FROM `ultimate_stats` a ORDER BY %s LIMIT 15", queryTemp);
1335
1336 SQL_ThreadQuery(sql, "show_top15", queryData, playerId, sizeof(playerId));
1337
1338 return PLUGIN_HANDLED;
1339}
1340
1341public show_top15(failState, Handle:query, error[], errorNum, playerId[], dataSize)
1342{
1343 if (failState) {
1344 log_to_file("ultimate_stats.log", "Top15 SQL Error: %s (%d)", error, errorNum);
1345
1346 return PLUGIN_HANDLED;
1347 }
1348
1349 static motdData[2048], name[32], motdLength, place, kills, deaths, hs, shots, hits;
1350
1351 motdLength = 0, place = 0;
1352
1353 new id = playerId[0];
1354
1355 motdLength = format(motdData, charsmax(motdData), "<body bgcolor=#000000><font color=#FFB000><pre>");
1356
1357 motdLength += format(motdData[motdLength], charsmax(motdData) - motdLength, "%2s %-22.22s %5s %7s %2s %6s %4s %4s %4s^n", "#", "Nick", "Nuzudymai", "Mirtys", "HS", "Pataikymai", "Suviai", "Ef.", "Taikl.");
1358
1359 while (SQL_MoreResults(query)) {
1360 place++;
1361
1362 SQL_ReadResult(query, 0, name, charsmax(name));
1363
1364 replace_all(name, charsmax(name), "<", "");
1365 replace_all(name, charsmax(name), ">", "");
1366
1367 kills = SQL_ReadResult(query, 1);
1368 deaths = SQL_ReadResult(query, 2);
1369 hs = SQL_ReadResult(query, 3);
1370 shots = SQL_ReadResult(query, 4);
1371 hits = SQL_ReadResult(query, 5);
1372
1373 motdLength += format(motdData[motdLength], charsmax(motdData) - motdLength, "%2d %-22.22s %6d %7d %6d %7d %7d %3.0f%% %3.0f%%^n", place, name, kills, deaths, hs, hits, shots, effec(kills, deaths), accuracy(shots, hits));
1374
1375 SQL_NextRow(query);
1376 }
1377
1378 show_motd(id, motdData, "Top15");
1379
1380 return PLUGIN_HANDLED;
1381}
1382
1383public cmd_topme(id)
1384{
1385 if (!topMeEnabled) return PLUGIN_CONTINUE;
1386
1387 new queryData[256], queryTemp[96], playerId[2], start = 0;
1388
1389 if (playerStats[id][STATS_RANK] > 7) start = max(0, playerStats[id][STATS_RANK] - 7);
1390 else if (playerStats[id][STATS_RANK] + 8 >= statsNum) start = max(0, statsNum - 15);
1391
1392 playerId[0] = id;
1393 playerId[1] = start;
1394
1395 get_rank_formula(queryTemp, charsmax(queryTemp), false);
1396
1397 formatex(queryData, charsmax(queryData), "SELECT a.name, a.kills, a.deaths, a.hs_kills, a.shots, a.hits, a.skill FROM `ultimate_stats` a ORDER BY %s LIMIT %i, 15", queryTemp, start);
1398
1399 SQL_ThreadQuery(sql, "show_topme", queryData, playerId, sizeof(playerId));
1400
1401 return PLUGIN_HANDLED;
1402}
1403
1404public show_topme(failState, Handle:query, error[], errorNum, playerId[], dataSize)
1405{
1406 if (failState) {
1407 log_to_file("ultimate_stats.log", "TopMe SQL Error: %s (%d)", error, errorNum);
1408
1409 return PLUGIN_HANDLED;
1410 }
1411
1412 static motdData[2048], name[32], motdLength, kills, deaths, hs, shots, hits;
1413
1414 motdLength = 0;
1415
1416 new id = playerId[0], place = playerId[1];
1417
1418 motdLength = format(motdData, charsmax(motdData), "<body bgcolor=#000000><font color=#FFB000><pre>");
1419
1420 motdLength += format(motdData[motdLength], charsmax(motdData) - motdLength, "%2s %-22.22s %5s %7s %2s %6s %4s %4s %4s^n", "#", "Nick", "Nuzudymai", "Mirtys", "HS", "Pataikymai", "Suviai", "Ef.", "Taikl.");
1421
1422 while (SQL_MoreResults(query)) {
1423 place++;
1424
1425 SQL_ReadResult(query, 0, name, charsmax(name));
1426
1427 replace_all(name, charsmax(name), "<", "");
1428 replace_all(name, charsmax(name), ">", "");
1429
1430 kills = SQL_ReadResult(query, 1);
1431 deaths = SQL_ReadResult(query, 2);
1432 hs = SQL_ReadResult(query, 3);
1433 shots = SQL_ReadResult(query, 4);
1434 hits = SQL_ReadResult(query, 5);
1435
1436 motdLength += format(motdData[motdLength], charsmax(motdData) - motdLength, "%2d %-22.22s %6d %7d %6d %7d %7d %3.0f%% %3.0f%%^n", place, name, kills, deaths, hs, hits, shots, effec(kills, deaths), accuracy(shots, hits));
1437
1438 SQL_NextRow(query);
1439 }
1440
1441 show_motd(id, motdData, "Top15");
1442
1443 return PLUGIN_HANDLED;
1444}
1445
1446public cmd_weapon_top15(id, weapon)
1447{
1448 if (!top15Enabled) return PLUGIN_CONTINUE;
1449
1450 new queryData[512], weaponName[32], playerId[2];
1451
1452 get_weaponname(weapon, weaponName, charsmax(weaponName));
1453
1454 playerId[0] = id;
1455 playerId[1] = weapon;
1456
1457 if(weapon == CSW_KNIFE) formatex(queryData, charsmax(queryData), "SELECT a.name, b.kills, b.hs_kills FROM `ultimate_stats` a JOIN `ultimate_stats_weapons` b ON a.id = b.player_id WHERE b.weapon = 'weapon_knife' ORDER BY b.kills DESC, b.hs_kills DESC LIMIT 15");
1458 else if(weapon == CSW_HEGRENADE) formatex(queryData, charsmax(queryData), "SELECT a.name, b.kills FROM `ultimate_stats` a JOIN `ultimate_stats_weapons` b ON a.id = b.player_id WHERE b.weapon = 'weapon_hegrenade' ORDER BY b.kills DESC LIMIT 15");
1459 else {
1460 new queryTemp[96];
1461
1462 get_rank_formula(queryTemp, charsmax(queryTemp), false);
1463
1464 formatex(queryData, charsmax(queryData), "SELECT b.name, a.kills, a.deaths, a.hs_kills, a.shots, a.hits FROM `ultimate_stats` b JOIN `ultimate_stats_weapons` a ON b.id = a.player_id WHERE a.weapon = '%s' ORDER BY %s LIMIT 15", weaponName, queryTemp);
1465 }
1466
1467 SQL_ThreadQuery(sql, "show_weapon_top15", queryData, playerId, sizeof(playerId));
1468
1469 return PLUGIN_HANDLED;
1470}
1471
1472public show_weapon_top15(failState, Handle:query, error[], errorNum, playerId[], dataSize)
1473{
1474 if (failState) {
1475 log_to_file("ultimate_stats.log", "Weapon Top15 SQL Error: %s (%d)", error, errorNum);
1476
1477 return PLUGIN_HANDLED;
1478 }
1479
1480 static motdData[2048], topName[64], name[32], motdLength, place, kills, deaths, hs, shots, hits;
1481
1482 motdLength = 0, place = 0;
1483
1484 new id = playerId[0], weapon = playerId[1];
1485
1486 get_weaponname(weapon, topName, charsmax(topName));
1487
1488 replace_all(topName, charsmax(topName), "weapon_", "");
1489
1490 ucfirst(topName);
1491
1492 add(topName, charsmax(topName), " Top15");
1493
1494 motdLength = format(motdData, charsmax(motdData), "<body bgcolor=#000000><font color=#FFB000><pre>");
1495
1496 if(weapon == CSW_KNIFE) {
1497 motdLength += format(motdData[motdLength], charsmax(motdData) - motdLength, "%2s %-22.22s %10s %13s^n", "#", "Nick", "Nuzudymai", "HS");
1498
1499 while (SQL_MoreResults(query)) {
1500 place++;
1501
1502 SQL_ReadResult(query, 0, name, charsmax(name));
1503
1504 replace_all(name, charsmax(name), "<", "");
1505 replace_all(name, charsmax(name), ">", "");
1506
1507 kills = SQL_ReadResult(query, 1);
1508 hs = SQL_ReadResult(query, 2);
1509
1510 motdLength += format(motdData[motdLength], charsmax(motdData) - motdLength, "%2i %-22.22s %5d %7d^n", place, name, kills, hs);
1511
1512 SQL_NextRow(query);
1513 }
1514 } else if(weapon == CSW_HEGRENADE) {
1515 motdLength += format(motdData[motdLength], charsmax(motdData) - motdLength, "%2s %-22.22s %13s^n", "#", "Nick", "Nuzudymai");
1516
1517 while (SQL_MoreResults(query)) {
1518 place++;
1519
1520 SQL_ReadResult(query, 0, name, charsmax(name));
1521
1522 replace_all(name, charsmax(name), "<", "");
1523 replace_all(name, charsmax(name), ">", "");
1524
1525 kills = SQL_ReadResult(query, 1);
1526
1527 motdLength += format(motdData[motdLength], charsmax(motdData) - motdLength, "%2i %-22.22s %6d^n", place, name, kills);
1528
1529 SQL_NextRow(query);
1530 }
1531 } else {
1532 motdLength += format(motdData[motdLength], charsmax(motdData) - motdLength, "%2s %-22.22s %5s %7s %2s %6s %4s %4s %4s^n", "#", "Nick", "Nuzudymai", "Mirtys", "HS", "Pataikymai", "Suviai", "Ef.", "Taikl.");
1533
1534 while (SQL_MoreResults(query)) {
1535 place++;
1536
1537 SQL_ReadResult(query, 0, name, charsmax(name));
1538
1539 replace_all(name, charsmax(name), "<", "");
1540 replace_all(name, charsmax(name), ">", "");
1541
1542 kills = SQL_ReadResult(query, 1);
1543 deaths = SQL_ReadResult(query, 2);
1544 hs = SQL_ReadResult(query, 3);
1545 shots = SQL_ReadResult(query, 4);
1546 hits = SQL_ReadResult(query, 5);
1547
1548 motdLength += format(motdData[motdLength], charsmax(motdData) - motdLength, "%2d %-22.22s %6d %7d %6d %7d %7d %3.0f%% %3.0f%%^n", place, name, kills, deaths, hs, hits, shots, effec(kills, deaths), accuracy(shots, hits));
1549
1550 SQL_NextRow(query);
1551 }
1552 }
1553
1554 show_motd(id, motdData, topName);
1555
1556 return PLUGIN_HANDLED;
1557}
1558
1559public cmd_time(id)
1560{
1561 if (!timeEnabled) return PLUGIN_CONTINUE;
1562
1563 new queryData[192], playerId[1];
1564
1565 playerId[0] = id;
1566
1567 formatex(queryData, charsmax(queryData), "SELECT `rank`, `all` FROM (SELECT COUNT(*) AS `all` FROM `ultimate_stats`) a JOIN (SELECT COUNT(*) + 1 AS `rank` FROM `ultimate_stats` WHERE time > %i ORDER BY time DESC) b", playerStats[id][TIME] + get_user_time(id));
1568
1569 SQL_ThreadQuery(sql, "show_time", queryData, playerId, sizeof(playerId));
1570
1571 return PLUGIN_HANDLED;
1572}
1573
1574public show_time(failState, Handle:query, error[], errorNum, playerId[], dataSize)
1575{
1576 if (failState) {
1577 log_to_file("ultimate_stats.log", "Time SQL Error: %s (%d)", error, errorNum);
1578
1579 return PLUGIN_HANDLED;
1580 }
1581
1582 new id = playerId[0], rank = SQL_ReadResult(query, 0), players = SQL_ReadResult(query, 1), seconds = (playerStats[id][TIME] + get_user_time(id)), minutes, hours;
1583
1584 while (seconds >= 60) {
1585 seconds -= 60;
1586 minutes++;
1587 }
1588
1589 while (minutes >= 60) {
1590 minutes -= 60;
1591 hours++;
1592 }
1593
1594 client_print_color(id, id, "* Spedziles na serwerze lacznie^x04 %i h %i min %i s^x01. *", hours, minutes, seconds);
1595 client_print_color(id, id, "* Zajmujesz^x03 %i^x01 na^x03 %i^x01 miejsce w rankingu czasu gry. *", rank, players);
1596
1597 return PLUGIN_HANDLED;
1598}
1599
1600public cmd_time_admin(id)
1601{
1602 if (!(get_user_flags(id) & ADMIN_BAN) || !timeEnabled) return PLUGIN_CONTINUE;
1603
1604 new queryData[128], playerId[1];
1605
1606 playerId[0] = id;
1607
1608 formatex(queryData, charsmax(queryData), "SELECT name, time FROM `ultimate_stats` WHERE admin = 1 ORDER BY time DESC");
1609
1610 SQL_ThreadQuery(sql, "show_time_admin", queryData, playerId, sizeof(playerId));
1611
1612 return PLUGIN_HANDLED;
1613}
1614
1615public show_time_admin(failState, Handle:query, error[], errorNum, playerId[], dataSize)
1616{
1617 if (failState) {
1618 log_to_file("ultimate_stats.log", "Time Admin SQL Error: %s (%d)", error, errorNum);
1619
1620 return PLUGIN_HANDLED;
1621 }
1622
1623 static motdData[2048], name[32], motdLength, place, seconds, minutes, hours;
1624
1625 motdLength = 0, place = 0;
1626
1627 new id = playerId[0];
1628
1629 motdLength = format(motdData, charsmax(motdData), "<body bgcolor=#000000><font color=#FFB000><pre>");
1630 motdLength += format(motdData[motdLength], charsmax(motdData) - motdLength, "%2s %-22.22s %9s^n", "#", "Nick", "Czas Gry");
1631
1632 while (SQL_MoreResults(query)) {
1633 place++;
1634
1635 SQL_ReadResult(query, 0, name, charsmax(name));
1636
1637 replace_all(name, charsmax(name), "<", "");
1638 replace_all(name, charsmax(name), ">", "");
1639
1640 seconds = SQL_ReadResult(query, 1);
1641 minutes = 0;
1642 hours = 0;
1643
1644 while (seconds >= 60) {
1645 seconds -= 60;
1646 minutes++;
1647 }
1648
1649 while (minutes >= 60) {
1650 minutes -= 60;
1651 hours++;
1652 }
1653
1654 motdLength += format(motdData[motdLength], charsmax(motdData) - motdLength, "%2i %-22.22s %0ih %1imin %1is^n", place, name, hours, minutes, seconds);
1655
1656 SQL_NextRow(query);
1657 }
1658
1659 show_motd(id, motdData, "Czas Gry Adminow");
1660
1661 return PLUGIN_HANDLED;
1662}
1663
1664public cmd_time_top15(id)
1665{
1666 if (!timeEnabled) return PLUGIN_CONTINUE;
1667
1668 new queryData[128], playerId[1];
1669
1670 playerId[0] = id;
1671
1672 formatex(queryData, charsmax(queryData), "SELECT name, time FROM `ultimate_stats` ORDER BY time DESC LIMIT 15");
1673
1674 SQL_ThreadQuery(sql, "show_time_top15", queryData, playerId, sizeof(playerId));
1675
1676 return PLUGIN_HANDLED;
1677}
1678
1679public show_time_top15(failState, Handle:query, error[], errorNum, playerId[], dataSize)
1680{
1681 if (failState) {
1682 log_to_file("ultimate_stats.log", "Time Top15 SQL Error: %s (%d)", error, errorNum);
1683
1684 return PLUGIN_HANDLED;
1685 }
1686
1687 static motdData[2048], name[32], motdLength, place, seconds, minutes, hours;
1688
1689 motdLength = 0, place = 0;
1690
1691 new id = playerId[0];
1692
1693 motdLength = format(motdData, charsmax(motdData), "<body bgcolor=#000000><font color=#FFB000><pre>");
1694 motdLength += format(motdData[motdLength], charsmax(motdData) - motdLength, "%2s %-22.22s %9s^n", "#", "Nick", "Czas Gry");
1695
1696 while (SQL_MoreResults(query)) {
1697 place++;
1698
1699 SQL_ReadResult(query, 0, name, charsmax(name));
1700
1701 replace_all(name, charsmax(name), "<", "");
1702 replace_all(name, charsmax(name), ">", "");
1703
1704 seconds = SQL_ReadResult(query, 1);
1705 minutes = 0;
1706 hours = 0;
1707
1708 while (seconds >= 60) {
1709 seconds -= 60;
1710 minutes++;
1711 }
1712
1713 while (minutes >= 60) {
1714 minutes -= 60;
1715 hours++;
1716 }
1717
1718 motdLength += format(motdData[motdLength], charsmax(motdData) - motdLength, "%2i %-22.22s %0ih %1imin %1is^n", place, name, hours, minutes, seconds);
1719
1720 SQL_NextRow(query);
1721 }
1722
1723 show_motd(id, motdData, "Top15 Czasu Gry");
1724
1725 return PLUGIN_HANDLED;
1726}
1727
1728public cmd_skill(id)
1729{
1730 if (!skillEnabled) return PLUGIN_CONTINUE;
1731
1732 new queryData[192], playerId[1];
1733
1734 playerId[0] = id;
1735
1736 formatex(queryData, charsmax(queryData), "SELECT `rank`, `all` FROM (SELECT COUNT(*) AS `all` FROM `ultimate_stats`) a JOIN (SELECT COUNT(*) + 1 AS `rank` FROM `ultimate_stats` WHERE skill > %f ORDER BY time DESC) b", playerStats[id][SKILL]);
1737
1738 SQL_ThreadQuery(sql, "show_skill", queryData, playerId, sizeof(playerId));
1739
1740 return PLUGIN_HANDLED;
1741}
1742
1743public show_skill(failState, Handle:query, error[], errorNum, playerId[], dataSize)
1744{
1745 if (failState) {
1746 log_to_file("ultimate_stats.log", "Skill SQL Error: %s (%d)", error, errorNum);
1747
1748 return PLUGIN_HANDLED;
1749 }
1750
1751 new id = playerId[0], rank = SQL_ReadResult(query, 0), players = SQL_ReadResult(query, 1);
1752
1753 client_print_color(id, id, "* Tavo skill yra^x04 %.2f^x01 (ELO tasku). *", playerStats[id][SKILL]);
1754 client_print_color(id, id, "* ELO reitinge uzimi^x03 %i^x01 vieta is^x03 %i^x01. *", rank, players);
1755
1756 return PLUGIN_HANDLED;
1757}
1758
1759public cmd_skill_top15(id)
1760{
1761 if (!skillEnabled) return PLUGIN_CONTINUE;
1762
1763 new queryData[128], playerId[1];
1764
1765 playerId[0] = id;
1766
1767 formatex(queryData, charsmax(queryData), "SELECT name, skill FROM `ultimate_stats` ORDER BY skill DESC LIMIT 15");
1768
1769 SQL_ThreadQuery(sql, "show_skill_top15", queryData, playerId, sizeof(playerId));
1770
1771 return PLUGIN_HANDLED;
1772}
1773
1774public show_skill_top15(failState, Handle:query, error[], errorNum, playerId[], dataSize)
1775{
1776 if (failState) {
1777 log_to_file("ultimate_stats.log", "Skill Top15 SQL Error: %s (%d)", error, errorNum);
1778
1779 return PLUGIN_HANDLED;
1780 }
1781
1782 static motdData[2048], name[32], Float:elo, motdLength, place;
1783
1784 motdLength = 0, place = 0;
1785
1786 new id = playerId[0];
1787
1788 motdLength = format(motdData, charsmax(motdData), "<body bgcolor=#000000><font color=#FFB000><pre>");
1789 motdLength += format(motdData[motdLength], charsmax(motdData) - motdLength, "%2s %-22.22s %9s^n", "#", "Nick", "Skill (ELO)");
1790
1791 while (SQL_MoreResults(query)) {
1792 place++;
1793
1794 SQL_ReadResult(query, 0, name, charsmax(name));
1795 SQL_ReadResult(query, 1, elo);
1796
1797 replace_all(name, charsmax(name), "<", "");
1798 replace_all(name, charsmax(name), ">", "");
1799
1800 motdLength += format(motdData[motdLength], charsmax(motdData) - motdLength, "%2i %-22.22s %.2f^n", place, name, elo);
1801
1802 SQL_NextRow(query);
1803 }
1804
1805 show_motd(id, motdData, "Top15 Skilla");
1806
1807 return PLUGIN_HANDLED;
1808}
1809
1810public cmd_topstats(id)
1811{
1812 new queryData[192], playerId[1];
1813
1814 playerId[0] = id;
1815
1816 playerStats[id][CURRENT_STATS] = playerStats[id][CURRENT_KILLS] * 2 + playerStats[id][CURRENT_HS] - playerStats[id][CURRENT_DEATHS] * 2;
1817
1818 formatex(queryData, charsmax(queryData), "SELECT `rank`, `all` FROM (SELECT COUNT(*) AS `all` FROM `ultimate_stats`) a JOIN (SELECT COUNT(*) + 1 AS `rank` FROM `ultimate_stats` WHERE best_stats > %i ORDER BY `best_stats` DESC) b",
1819 playerStats[id][CURRENT_STATS] > playerStats[id][BEST_STATS] ? playerStats[id][CURRENT_STATS] : playerStats[id][BEST_STATS]);
1820
1821 SQL_ThreadQuery(sql, "show_topstats", queryData, playerId, sizeof(playerId));
1822
1823 return PLUGIN_HANDLED;
1824}
1825
1826public show_topstats(failState, Handle:query, error[], errorNum, playerId[], dataSize)
1827{
1828 if (failState) {
1829 log_to_file("ultimate_stats.log", "TopStats SQL Error: %s (%d)", error, errorNum);
1830
1831 return PLUGIN_HANDLED;
1832 }
1833
1834 new id = playerId[0], rank = SQL_ReadResult(query, 0), players = SQL_ReadResult(query, 1);
1835
1836 if (playerStats[id][CURRENT_STATS] > playerStats[id][BEST_STATS]) client_print_color(id, id, "* Twoje najlepsze staty to^x03 %i^x01 zabic (w tym^x03 %i^x01 HS) i^x03 %i^x01 zgonow^x01. *", playerStats[id][CURRENT_KILLS], playerStats[id][CURRENT_HS], playerStats[id][CURRENT_DEATHS]);
1837 else client_print_color(id, id, "* Twoje najlepsze staty to^x03 %i^x01 zabic (w tym^x03 %i^x01 z HS) i^x03 %i^x01 zgonow^x01. *", playerStats[id][BEST_KILLS], playerStats[id][BEST_HS], playerStats[id][BEST_DEATHS]);
1838
1839 client_print_color(id, id, "* Zajmujesz^x03 %i^x01 na^x03 %i^x01 miejsce w rankingu najlepszych statystyk. *", rank, players);
1840
1841 return PLUGIN_HANDLED;
1842}
1843
1844public cmd_topstats_top15(id)
1845{
1846 new queryData[128], playerId[1];
1847
1848 playerId[0] = id;
1849
1850 formatex(queryData, charsmax(queryData), "SELECT name, best_kills, best_hs, best_deaths FROM `ultimate_stats` ORDER BY best_stats DESC LIMIT 15");
1851
1852 SQL_ThreadQuery(sql, "show_topstats_top15", queryData, playerId, sizeof(playerId));
1853
1854 return PLUGIN_HANDLED;
1855}
1856
1857public show_topstats_top15(failState, Handle:query, error[], errorNum, playerId[], dataSize)
1858{
1859 if (failState) {
1860 log_to_file("ultimate_stats.log", "TopStats Top15 SQL Error: %s (%d)", error, errorNum);
1861
1862 return PLUGIN_HANDLED;
1863 }
1864
1865 static motdData[2048], name[32], motdLength, place, kills, headShots, deaths;
1866
1867 motdLength = 0, place = 0;
1868
1869 new id = playerId[0];
1870
1871 motdLength = format(motdData, charsmax(motdData), "<body bgcolor=#000000><font color=#FFB000><pre>");
1872 motdLength += format(motdData[motdLength], charsmax(motdData) - motdLength, "%2s %-22.22s %19s %4s^n", "#", "Nick", "Nuzudymai", "Mirtys");
1873
1874 while (SQL_MoreResults(query))
1875 {
1876 place++;
1877
1878 SQL_ReadResult(query, 0, name, charsmax(name));
1879
1880 replace_all(name, charsmax(name), "<", "");
1881 replace_all(name, charsmax(name), ">", "");
1882
1883 kills = SQL_ReadResult(query, 1);
1884 headShots = SQL_ReadResult(query, 2);
1885 deaths = SQL_ReadResult(query, 3);
1886
1887 motdLength += format(motdData[motdLength], charsmax(motdData) - motdLength, "%2i %-22.22s %1d (%i HS) %12d^n", place, name, kills, headShots, deaths);
1888
1889 SQL_NextRow(query);
1890 }
1891
1892 show_motd(id, motdData, "Top15 Statystyk");
1893
1894 return PLUGIN_HANDLED;
1895}
1896
1897public cmd_medals(id)
1898{
1899 if (!medalsEnabled) return PLUGIN_CONTINUE;
1900
1901 new queryData[192], playerId[1];
1902
1903 playerId[0] = id;
1904
1905 formatex(queryData, charsmax(queryData), "SELECT `rank`, `all` FROM (SELECT COUNT(*) AS `all` FROM `ultimate_stats`) a JOIN (SELECT COUNT(*) + 1 AS `rank` FROM `ultimate_stats` WHERE medals > %i ORDER BY `medals` DESC) b", playerStats[id][MEDALS]);
1906
1907 SQL_ThreadQuery(sql, "show_medals", queryData, playerId, sizeof(playerId));
1908
1909 return PLUGIN_HANDLED;
1910}
1911
1912public show_medals(failState, Handle:query, error[], errorNum, playerId[], dataSize)
1913{
1914 if (failState) {
1915 log_to_file("ultimate_stats.log", "Medals SQL Error: %s (%d)", error, errorNum);
1916
1917 return PLUGIN_HANDLED;
1918 }
1919
1920 new id = playerId[0], rank = SQL_ReadResult(query, 0), players = SQL_ReadResult(query, 1);
1921
1922 client_print_color(id, id, "* Tavo dalys prizui:^x04 %i Gems^x01,^x04 %i Tickets^x01,^x04 %i Powder^x01. *", playerStats[id][GOLD], playerStats[id][SILVER], playerStats[id][BRONZE]);
1923 client_print_color(id, id, "* Daliu reitinge uzimi^x03 %i^x01 vieta is^x03 %i^x01. *", rank, players);
1924
1925 return PLUGIN_HANDLED;
1926}
1927
1928public cmd_medals_top15(id)
1929{
1930 if (!medalsEnabled) return PLUGIN_CONTINUE;
1931
1932 new queryData[128], playerId[1];
1933
1934 playerId[0] = id;
1935
1936 formatex(queryData, charsmax(queryData), "SELECT name, gold, silver, bronze, medals FROM `ultimate_stats` ORDER BY medals DESC LIMIT 15");
1937
1938 SQL_ThreadQuery(sql, "show_medals_top15", queryData, playerId, sizeof(playerId));
1939
1940 return PLUGIN_HANDLED;
1941}
1942
1943public show_medals_top15(failState, Handle:query, error[], errorNum, playerId[], dataSize)
1944{
1945 if (failState) {
1946 log_to_file("ultimate_stats.log", "Medals Top15 SQL Error: %s (%d)", error, errorNum);
1947
1948 return PLUGIN_HANDLED;
1949 }
1950
1951 static motdData[2048], name[32], motdLength, place, gold, silver, bronze, medals;
1952
1953 motdLength = 0, place = 0;
1954
1955 new id = playerId[0];
1956
1957 motdLength = format(motdData, charsmax(motdData), "<body bgcolor=#000000><font color=#FFB000><pre>");
1958 motdLength += format(motdData[motdLength], charsmax(motdData) - motdLength, "%2s %-22.22s %6s %8s %8s %5s^n", "#", "Nick", "Gems", "Tickets", "Powder", "Koef.");
1959
1960 while (SQL_MoreResults(query)) {
1961 place++;
1962
1963 SQL_ReadResult(query, 0, name, charsmax(name));
1964
1965 replace_all(name, charsmax(name), "<", "");
1966 replace_all(name, charsmax(name), ">", "");
1967
1968 gold = SQL_ReadResult(query, 1);
1969 silver = SQL_ReadResult(query, 2);
1970 bronze = SQL_ReadResult(query, 3);
1971 medals = SQL_ReadResult(query, 4);
1972
1973 motdLength += format(motdData[motdLength], charsmax(motdData) - motdLength, "%2i %-22.22s %2d %7d %8d %7d^n", place, name, gold, silver, bronze, medals);
1974
1975 SQL_NextRow(query);
1976 }
1977
1978 show_motd(id, motdData, "Prizininku Top15");
1979
1980 return PLUGIN_HANDLED;
1981}
1982
1983public cmd_sounds(id)
1984{
1985 if (!soundsEnabled) return PLUGIN_HANDLED;
1986
1987 new menuData[64], menu = menu_create("\yUstawienia \rDzwiekow\w:", "cmd_sounds_handle");
1988
1989 formatex(menuData, charsmax(menuData), "\wThe Force Will Be With You \w[\r%s\w]", get_bit(id, soundMayTheForce) ? "Wlaczony" : "Wylaczony");
1990 menu_additem(menu, menuData);
1991
1992 formatex(menuData, charsmax(menuData), "\wI Am The One And Only \w[\r%s\w]", get_bit(id, soundOneAndOnly) ? "Wlaczony" : "Wylaczony");
1993 menu_additem(menu, menuData);
1994
1995 formatex(menuData, charsmax(menuData), "\wDziabnal Mnie \w[\r%s\w]", get_bit(id, soundHumiliation) ? "Wlaczony" : "Wylaczony");
1996 menu_additem(menu, menuData);
1997
1998 formatex(menuData, charsmax(menuData), "\wKici Kici Tas Tas \w[\r%s\w]", get_bit(id, soundLastLeft) ? "Wlaczony" : "Wylaczony");
1999 menu_additem(menu, menuData);
2000
2001 formatex(menuData, charsmax(menuData), "\wNie Obijac Sie \w[\r%s\w]", get_bit(id, soundPrepare) ? "Wlaczony" : "Wylaczony");
2002 menu_additem(menu, menuData);
2003
2004 menu_setprop(menu, MPROP_EXITNAME, "Wyjscie");
2005
2006 menu_display(id, menu);
2007
2008 return PLUGIN_HANDLED;
2009}
2010
2011public cmd_sounds_handle(id, menu, item)
2012{
2013 if (!is_user_connected(id)) return PLUGIN_HANDLED;
2014
2015 if (item == MENU_EXIT) {
2016 menu_destroy(menu);
2017
2018 return PLUGIN_HANDLED;
2019 }
2020
2021 switch (item) {
2022 case 0: get_bit(id, soundMayTheForce) ? rem_bit(id, soundMayTheForce) : set_bit(id, soundMayTheForce);
2023 case 1: get_bit(id, soundOneAndOnly) ? rem_bit(id, soundOneAndOnly) : set_bit(id, soundOneAndOnly);
2024 case 2: get_bit(id, soundHumiliation) ? rem_bit(id, soundHumiliation) : set_bit(id, soundHumiliation);
2025 case 3: get_bit(id, soundLastLeft) ? rem_bit(id, soundLastLeft) : set_bit(id, soundLastLeft);
2026 case 4: get_bit(id, soundPrepare) ? rem_bit(id, soundPrepare) : set_bit(id, soundPrepare);
2027 }
2028
2029 save_sounds(id);
2030
2031 cmd_sounds(id);
2032
2033 menu_destroy(menu);
2034
2035 return PLUGIN_HANDLED;
2036}
2037
2038public weapons_top15_handle(id)
2039{
2040 if (!top15Enabled) return PLUGIN_CONTINUE;
2041
2042 static message[32], command[32], weaponName[32];
2043
2044 read_argv(1, message, charsmax(message));
2045 trim(message);
2046
2047 if (message[0] != '/') return PLUGIN_CONTINUE;
2048
2049 for (new i = 1; i < WEAPONS_END; i++) {
2050 if (i == CSW_SHIELD || i == CSW_C4 || i == CSW_FLASHBANG || i == CSW_SMOKEGRENADE) continue;
2051
2052 get_weaponname(i, weaponName, charsmax(weaponName));
2053
2054 if (i == CSW_HEGRENADE) replace_all(weaponName, charsmax(weaponName), "hegrenade", "he");
2055 else if (i == CSW_UMP45) replace_all(weaponName, charsmax(weaponName), "mp5navy", "mp5");
2056 else if (i == CSW_MP5NAVY) replace_all(weaponName, charsmax(weaponName), "ump45", "ump");
2057
2058 replace_all(weaponName, charsmax(weaponName), "weapon_", "");
2059
2060 formatex(command, charsmax(command), "/%stop15", weaponName);
2061
2062 if (equali(message, command)) {
2063 cmd_weapon_top15(id, i);
2064
2065 return PLUGIN_HANDLED;
2066 }
2067 }
2068
2069 return PLUGIN_CONTINUE;
2070}
2071
2072public sql_init()
2073{
2074 new error[128], errorNum;
2075
2076 sql = SQL_MakeDbTuple(sqlHost, sqlUser, sqlPassword, sqlDatabase);
2077
2078 connection = SQL_Connect(sql, errorNum, error, charsmax(error));
2079
2080 if (errorNum) {
2081 log_to_file("ultimate_stats.log", "SQL Query Error: %s", error);
2082
2083 return;
2084 }
2085
2086 new queryData[2048];
2087
2088 formatex(queryData, charsmax(queryData), "CREATE TABLE IF NOT EXISTS `ultimate_stats` (`id` INT(11) AUTO_INCREMENT, `name` VARCHAR(64) NOT NULL, `steamid` VARCHAR(32) NOT NULL, `ip` VARCHAR(16) NOT NULL, `admin` INT NOT NULL DEFAULT 0, `kills` INT NOT NULL DEFAULT 0, ");
2089 add(queryData, charsmax(queryData), "`deaths` INT NOT NULL DEFAULT 0, `hs_kills` INT NOT NULL DEFAULT 0, `assists` INT NOT NULL DEFAULT 0, `revenges` INT NOT NULL DEFAULT 0, `team_kills` INT NOT NULL DEFAULT 0, `shots` INT NOT NULL DEFAULT 0, `hits` INT NOT NULL DEFAULT 0, ");
2090 add(queryData, charsmax(queryData), "`damage` INT NOT NULL DEFAULT 0, `rounds` INT NOT NULL DEFAULT 0, `rounds_ct` INT NOT NULL DEFAULT 0, `rounds_t` INT NOT NULL DEFAULT 0, `wins_ct` INT NOT NULL DEFAULT 0, `wins_t` INT NOT NULL DEFAULT 0, ");
2091 add(queryData, charsmax(queryData), "`connects` INT NOT NULL DEFAULT 0, `time` INT NOT NULL DEFAULT 0, `gold` INT NOT NULL DEFAULT 0, `silver` INT NOT NULL DEFAULT 0, `bronze` INT NOT NULL DEFAULT 0, `medals` INT NOT NULL DEFAULT 0, ");
2092 add(queryData, charsmax(queryData), "`best_kills` INT NOT NULL DEFAULT 0, `best_deaths` INT NOT NULL DEFAULT 0, `best_hs` INT NOT NULL DEFAULT 0, `best_stats` INT NOT NULL DEFAULT 0, `defusions` INT NOT NULL DEFAULT 0, `defused` INT NOT NULL DEFAULT 0, ");
2093 add(queryData, charsmax(queryData), "`planted` INT NOT NULL DEFAULT 0, `exploded` INT NOT NULL DEFAULT 0, `skill` DOUBLE NOT NULL DEFAULT 100, `h_0` INT NOT NULL DEFAULT 0, `h_1` INT NOT NULL DEFAULT 0, `h_2` INT NOT NULL DEFAULT 0, `h_3` INT NOT NULL DEFAULT 0, ");
2094 add(queryData, charsmax(queryData), "`h_4` INT NOT NULL DEFAULT 0, `h_5` INT NOT NULL DEFAULT 0, `h_6` INT NOT NULL DEFAULT 0, `h_7` INT NOT NULL DEFAULT 0, `first_visit` BIGINT NOT NULL DEFAULT 0, `last_visit` BIGINT NOT NULL DEFAULT 0, PRIMARY KEY(`id`), UNIQUE KEY `name` (`name`));");
2095
2096 new Handle:query = SQL_PrepareQuery(connection, queryData);
2097
2098 SQL_Execute(query);
2099
2100 formatex(queryData, charsmax(queryData), "CREATE TABLE IF NOT EXISTS `ultimate_stats_weapons` (`player_id` INT(11), `weapon` VARCHAR(32) NOT NULL, `kills` INT NOT NULL DEFAULT 0, `deaths` INT NOT NULL DEFAULT 0, `hs_kills` INT NOT NULL DEFAULT 0, `team_kills` INT NOT NULL DEFAULT 0, ");
2101 add(queryData, charsmax(queryData), "`shots` INT NOT NULL DEFAULT 0, `hits` INT NOT NULL DEFAULT 0, `damage` INT NOT NULL DEFAULT 0, `h_0` INT NOT NULL DEFAULT 0, `h_1` INT NOT NULL DEFAULT 0, `h_2` INT NOT NULL DEFAULT 0, ");
2102 add(queryData, charsmax(queryData), "`h_3` INT NOT NULL DEFAULT 0, `h_4` INT NOT NULL DEFAULT 0, `h_5` INT NOT NULL DEFAULT 0, `h_6` INT NOT NULL DEFAULT 0, `h_7` INT NOT NULL DEFAULT 0, PRIMARY KEY(`player_id`, `weapon`));");
2103
2104 query = SQL_PrepareQuery(connection, queryData);
2105
2106 SQL_Execute(query);
2107
2108 formatex(queryData, charsmax(queryData), "SELECT COUNT(*) FROM `ultimate_stats`");
2109
2110 query = SQL_PrepareQuery(connection, queryData);
2111
2112 SQL_Execute(query);
2113
2114 if (SQL_NumResults(query)) statsNum = SQL_ReadResult(query, 0);
2115
2116 SQL_FreeHandle(query);
2117
2118 sqlConnection = true;
2119}
2120
2121public ignore_handle(failState, Handle:query, error[], errorCode, data[], dataSize)
2122{
2123 if (failState == TQUERY_CONNECT_FAILED) log_to_file("ultimate_stats.log", "Could not connect to SQL database. [%d] %s", errorCode, error);
2124 else if (failState == TQUERY_QUERY_FAILED) log_to_file("ultimate_stats.log", "Query failed. [%d] %s", errorCode, error);
2125}
2126
2127public load_stats(id)
2128{
2129 id -= TASK_LOAD;
2130
2131 if (!sqlConnection) {
2132 set_task(1.0, "load_stats", id + TASK_LOAD);
2133
2134 return;
2135 }
2136
2137 get_user_name(id, playerStats[id][NAME], charsmax(playerStats[][NAME]));
2138 get_user_authid(id, playerStats[id][STEAMID], charsmax(playerStats[][STEAMID]));
2139 get_user_ip(id, playerStats[id][IP], charsmax(playerStats[][IP]), 1);
2140
2141 sql_safe_string(playerStats[id][NAME], playerStats[id][SAFE_NAME], charsmax(playerStats[][SAFE_NAME]));
2142
2143 new playerId[1], queryData[256], queryTemp[96];
2144
2145 playerId[0] = id;
2146
2147 get_rank_formula(queryTemp, charsmax(queryTemp));
2148
2149 formatex(queryData, charsmax(queryData), "SELECT a.*, (SELECT COUNT(*) FROM `ultimate_stats` WHERE %s) + 1 AS `rank` FROM `ultimate_stats` a WHERE ", queryTemp);
2150
2151 switch (rankSaveType) {
2152 case 0: formatex(queryTemp, charsmax(queryTemp), "`name` = ^"%s^"", playerStats[id][SAFE_NAME]);
2153 case 1: formatex(queryTemp, charsmax(queryTemp), "`steamid` = ^"%s^"", playerStats[id][STEAMID]);
2154 case 2: formatex(queryTemp, charsmax(queryTemp), "`ip` = ^"%s^"", playerStats[id][IP]);
2155 }
2156
2157 add(queryData, charsmax(queryData), queryTemp);
2158
2159 SQL_ThreadQuery(sql, "load_stats_handle", queryData, playerId, sizeof(playerId));
2160}
2161
2162public load_stats_handle(failState, Handle:query, error[], errorNum, playerId[], dataSize)
2163{
2164 if (failState) {
2165 log_to_file("ultimate_stats.log", "Load SQL Error: %s (%d)", error, errorNum);
2166
2167 return;
2168 }
2169
2170 new id = playerId[0];
2171
2172 if (SQL_NumResults(query)) {
2173 playerStats[id][PLAYER_ID] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "id"));
2174 playerStats[id][STATS_KILLS] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "kills"));
2175 playerStats[id][STATS_DEATHS] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "deaths"));
2176 playerStats[id][STATS_HS] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "hs_kills"));
2177 playerStats[id][STATS_TK] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "team_kills"));
2178 playerStats[id][STATS_SHOTS] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "shots"));
2179 playerStats[id][STATS_HITS] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "hits"));
2180 playerStats[id][STATS_DAMAGE] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "damage"));
2181 playerStats[id][STATS_RANK] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "rank"));
2182 playerStats[id][HIT_GENERIC] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "h_0"));
2183 playerStats[id][HIT_HEAD] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "h_1"));
2184 playerStats[id][HIT_CHEST] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "h_2"));
2185 playerStats[id][HIT_STOMACH] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "h_3"));
2186 playerStats[id][HIT_LEFTARM] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "h_4"));
2187 playerStats[id][HIT_RIGHTARM] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "h_5"));
2188 playerStats[id][HIT_LEFTLEG] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "h_6"));
2189 playerStats[id][HIT_RIGHTLEG] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "h_7"));
2190 playerStats[id][BOMB_DEFUSIONS] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "defusions"));
2191 playerStats[id][BOMB_DEFUSED] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "defused"));
2192 playerStats[id][BOMB_PLANTED] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "planted"));
2193 playerStats[id][BOMB_EXPLODED] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "exploded"));
2194 playerStats[id][ROUNDS] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "rounds"));
2195 playerStats[id][ROUNDS_CT] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "rounds_ct"));
2196 playerStats[id][ROUNDS_T] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "rounds_t"));
2197 playerStats[id][WIN_CT] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "wins_ct"));
2198 playerStats[id][WIN_T] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "wins_t"));
2199 playerStats[id][TIME] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "time"));
2200 playerStats[id][CONNECTS] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "connects"));
2201 playerStats[id][ASSISTS] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "assists"));
2202 playerStats[id][REVENGES] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "revenges"));
2203 playerStats[id][BRONZE] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "bronze"));
2204 playerStats[id][SILVER] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "silver"));
2205 playerStats[id][GOLD] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "gold"));
2206 playerStats[id][MEDALS] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "medals"));
2207 playerStats[id][BEST_STATS] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "best_stats"));
2208 playerStats[id][BEST_KILLS] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "best_kills"));
2209 playerStats[id][BEST_HS] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "best_hs"));
2210 playerStats[id][BEST_DEATHS] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "best_deaths"));
2211 playerStats[id][FIRST_VISIT] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "first_visit"));
2212 playerStats[id][LAST_VISIT] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "last_visit"));
2213
2214 SQL_ReadResult(query, SQL_FieldNameToNum(query, "skill"), playerStats[id][SKILL]);
2215 } else {
2216 statsNum++;
2217
2218 new queryData[256];
2219
2220 formatex(queryData, charsmax(queryData), "INSERT IGNORE INTO `ultimate_stats` (`name`, `steamid`, `ip`, `first_visit`) VALUES (^"%s^", '%s', '%s', UNIX_TIMESTAMP())", playerStats[id][SAFE_NAME], playerStats[id][STEAMID], playerStats[id][IP]);
2221
2222 SQL_ThreadQuery(sql, "ignore_handle", queryData);
2223
2224 get_rank(id);
2225 }
2226
2227 set_bit(id, statsLoaded);
2228
2229 set_task(0.1, "load_weapons_stats", id + TASK_LOAD);
2230}
2231
2232public get_rank(id)
2233{
2234 new queryData[256], queryTemp[96], playerId[1];
2235
2236 playerId[0] = id;
2237
2238 get_rank_formula(queryTemp, charsmax(queryTemp));
2239
2240 formatex(queryData, charsmax(queryData), "SELECT (SELECT COUNT(*) FROM `ultimate_stats` WHERE %s) + 1 AS `rank` FROM `ultimate_stats` a WHERE ", queryTemp);
2241
2242 switch (rankSaveType) {
2243 case 0: formatex(queryTemp, charsmax(queryTemp), "name = ^"%s^"", playerStats[id][SAFE_NAME]);
2244 case 1: formatex(queryTemp, charsmax(queryTemp), "steamid = ^"%s^"", playerStats[id][STEAMID]);
2245 case 2: formatex(queryTemp, charsmax(queryTemp), "ip = ^"%s^"", playerStats[id][IP]);
2246 }
2247
2248 add(queryData, charsmax(queryData), queryTemp);
2249
2250 SQL_ThreadQuery(sql, "get_rank_handle", queryData, playerId, sizeof(playerId));
2251}
2252
2253public get_rank_handle(failState, Handle:query, error[], errorNum, playerId[], dataSize)
2254{
2255 if (failState) {
2256 log_to_file("ultimate_stats.log", "Get Rank SQL Error: %s (%d)", error, errorNum);
2257
2258 return;
2259 }
2260
2261 new id = playerId[0];
2262
2263 if (SQL_NumResults(query)) playerStats[id][STATS_RANK] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "rank"));
2264}
2265
2266public load_weapons_stats(id)
2267{
2268 id -= TASK_LOAD;
2269
2270 new queryData[256], queryTemp[96], playerId[1];
2271
2272 playerId[0] = id;
2273
2274 if (!playerStats[id][PLAYER_ID]) playerStats[id][PLAYER_ID] = get_player_id(id);
2275
2276 if (!playerStats[id][PLAYER_ID]) {
2277 set_task(0.5, "load_weapons_stats", id + TASK_LOAD);
2278
2279 return;
2280 }
2281
2282 get_rank_formula(queryTemp, charsmax(queryTemp));
2283
2284 formatex(queryData, charsmax(queryData), "SELECT a.*, (SELECT COUNT(*) FROM `ultimate_stats_weapons` WHERE %s AND weapon = a.weapon) + 1 AS `rank` FROM `ultimate_stats_weapons` a WHERE `player_id` = '%i'", queryTemp, playerStats[id][PLAYER_ID]);
2285
2286 SQL_ThreadQuery(sql, "load_weapons_stats_handle", queryData, playerId, sizeof(playerId));
2287}
2288
2289public load_weapons_stats_handle(failState, Handle:query, error[], errorNum, playerId[], dataSize)
2290{
2291 if (failState) {
2292 log_to_file("ultimate_stats.log", "Load Weapons SQL Error: %s (%d)", error, errorNum);
2293
2294 return;
2295 }
2296
2297 new id = playerId[0], weaponName[32], weapon, ret;
2298
2299 while (SQL_MoreResults(query)) {
2300 SQL_ReadResult(query, SQL_FieldNameToNum(query, "weapon"), weaponName, charsmax(weaponName));
2301
2302 weapon = get_weaponid(weaponName);
2303
2304 playerWStats[id][weapon][STATS_KILLS] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "kills"));
2305 playerWStats[id][weapon][STATS_DEATHS] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "deaths"));
2306 playerWStats[id][weapon][STATS_TK] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "team_kills"));
2307 playerWStats[id][weapon][STATS_HS] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "hs_kills"));
2308 playerWStats[id][weapon][STATS_SHOTS] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "shots"));
2309 playerWStats[id][weapon][STATS_HITS] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "hits"));
2310 playerWStats[id][weapon][STATS_DAMAGE] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "damage"));
2311 playerWStats[id][weapon][STATS_RANK] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "rank"));
2312 playerWStats[id][weapon][HIT_GENERIC] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "h_0"));
2313 playerWStats[id][weapon][HIT_HEAD] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "h_1"));
2314 playerWStats[id][weapon][HIT_CHEST] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "h_2"));
2315 playerWStats[id][weapon][HIT_STOMACH] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "h_3"));
2316 playerWStats[id][weapon][HIT_LEFTARM] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "h_4"));
2317 playerWStats[id][weapon][HIT_RIGHTARM] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "h_5"));
2318 playerWStats[id][weapon][HIT_LEFTLEG] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "h_6"));
2319 playerWStats[id][weapon][HIT_RIGHTLEG] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "h_7"));
2320
2321 SQL_NextRow(query);
2322 }
2323
2324 set_bit(id, weaponStatsLoaded);
2325
2326 ExecuteForward(statsForwards[FORWARD_LOADED], ret, id);
2327}
2328
2329stock save_stats(id, type = 0)
2330{
2331 if (!get_bit(id, statsLoaded)) return;
2332
2333 new queryData[2048], queryTemp[256];
2334
2335 formatex(queryData, charsmax(queryData), "UPDATE `ultimate_stats` SET name = ^"%s^", steamid = ^"%s^", ip = ^"%s^", admin = %d, kills = %d, deaths = %d, hs_kills = %d, ",
2336 playerStats[id][SAFE_NAME], playerStats[id][STEAMID], playerStats[id][IP], playerStats[id][ADMIN], playerStats[id][STATS_KILLS], playerStats[id][STATS_DEATHS], playerStats[id][STATS_HS]);
2337
2338 formatex(queryTemp, charsmax(queryTemp), "assists = %d, revenges = %d, team_kills = %d, shots = %d, hits = %d, damage = %d, rounds = %d, rounds_ct = %d, rounds_t = %d, ",
2339 playerStats[id][ASSISTS], playerStats[id][REVENGES], playerStats[id][STATS_TK], playerStats[id][STATS_SHOTS], playerStats[id][STATS_HITS], playerStats[id][STATS_DAMAGE], playerStats[id][ROUNDS], playerStats[id][ROUNDS_CT], playerStats[id][ROUNDS_T]);
2340 add(queryData, charsmax(queryData), queryTemp);
2341
2342 formatex(queryTemp, charsmax(queryTemp), "wins_ct = %d, wins_t = %d, connects = %d, time = %d, defusions = %d, defused = %d, planted = %d, exploded = %d, ",
2343 playerStats[id][WIN_CT], playerStats[id][WIN_T], playerStats[id][CONNECTS], playerStats[id][TIME] + get_user_time(id), playerStats[id][BOMB_DEFUSIONS], playerStats[id][BOMB_DEFUSED], playerStats[id][BOMB_PLANTED], playerStats[id][BOMB_EXPLODED]);
2344 add(queryData, charsmax(queryData), queryTemp);
2345
2346 formatex(queryTemp, charsmax(queryTemp), "skill = %.2f, h_0 = %d, h_1 = %d, h_2 = %d, h_3 = %d, h_4 = %d, h_5 = %d, h_6 = %d, h_7 = %d, last_visit = UNIX_TIMESTAMP()",
2347 playerStats[id][SKILL], playerStats[id][HIT_GENERIC], playerStats[id][HIT_HEAD], playerStats[id][HIT_CHEST], playerStats[id][HIT_STOMACH], playerStats[id][HIT_RIGHTARM], playerStats[id][HIT_LEFTARM], playerStats[id][HIT_RIGHTLEG], playerStats[id][HIT_LEFTLEG]);
2348 add(queryData, charsmax(queryData), queryTemp);
2349
2350 playerStats[id][CURRENT_STATS] = playerStats[id][CURRENT_KILLS] * 2 + playerStats[id][CURRENT_HS] - playerStats[id][CURRENT_DEATHS] * 2;
2351
2352 if (playerStats[id][CURRENT_STATS] > playerStats[id][BEST_STATS]) {
2353 formatex(queryTemp, charsmax(queryTemp), ", best_stats = %d, best_kills = %d, best_hs = %d, best_deaths = %d",
2354 playerStats[id][CURRENT_STATS], playerStats[id][CURRENT_KILLS], playerStats[id][CURRENT_HS], playerStats[id][CURRENT_DEATHS]);
2355 add(queryData, charsmax(queryData), queryTemp);
2356 }
2357
2358 new medals = playerStats[id][GOLD] * 3 + playerStats[id][SILVER] * 2 + playerStats[id][BRONZE];
2359
2360 if (medals > playerStats[id][MEDALS]) {
2361 formatex(queryTemp, charsmax(queryTemp), ", gold = %d, silver = %d, bronze = %d, medals = '%d'",
2362 playerStats[id][GOLD], playerStats[id][SILVER], playerStats[id][BRONZE], medals);
2363 add(queryData, charsmax(queryData), queryTemp);
2364 }
2365
2366 switch(rankSaveType) {
2367 case 0: formatex(queryTemp, charsmax(queryTemp), " WHERE name = ^"%s^"", playerStats[id][SAFE_NAME]);
2368 case 1: formatex(queryTemp, charsmax(queryTemp), " WHERE steamid = ^"%s^"", playerStats[id][STEAMID]);
2369 case 2: formatex(queryTemp, charsmax(queryTemp), " WHERE ip = ^"%s^"", playerStats[id][IP]);
2370 }
2371
2372 add(queryData, charsmax(queryData), queryTemp);
2373
2374 if (type == MAP_END) {
2375 static error[128], errorNum, Handle:query;
2376
2377 query = SQL_PrepareQuery(connection, queryData);
2378
2379 if (!SQL_Execute(query)) {
2380 errorNum = SQL_QueryError(query, error, charsmax(error));
2381
2382 log_to_file("ultimate_stats.log", "SQL Query Error. [%d] %s", errorNum, error);
2383 }
2384
2385 SQL_FreeHandle(query);
2386 } else SQL_ThreadQuery(sql, "ignore_handle", queryData);
2387
2388 if (type == ROUND) get_rank(id);
2389 else if (type > ROUND) rem_bit(id, statsLoaded);
2390
2391 save_weapons_stats(id, type);
2392}
2393
2394stock save_weapons_stats(id, type = 0)
2395{
2396 if (!get_bit(id, weaponStatsLoaded)) return;
2397
2398 new queryData[4096], queryTemp[512], weaponName[32];
2399 queryData = "";
2400
2401 for (new i = 1; i < WEAPONS_END; i++) {
2402 if ((i == CSW_SHIELD || i == CSW_C4 || i == CSW_FLASHBANG || i == CSW_SMOKEGRENADE) || (!playerWRStats[id][i][STATS_SHOTS] && !playerWRStats[id][i][STATS_DEATHS])) continue;
2403
2404 get_weaponname(i, weaponName, charsmax(weaponName));
2405
2406 formatex(queryTemp, charsmax(queryTemp), "INSERT INTO `ultimate_stats_weapons` VALUES (%d, '%s', %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d) ON DUPLICATE KEY UPDATE kills = %d, deaths = %d, hs_kills = %d, team_kills = %d, shots = %d, hits = %d, damage = %d, h_0 = %d, h_1 = %d, h_2 = %d, h_3 = %d, h_4 = %d, h_5 = %d, h_6 = %d, h_7 = %d; ",
2407 playerStats[id][PLAYER_ID], weaponName, playerWStats[id][i][STATS_KILLS], playerWStats[id][i][STATS_DEATHS], playerWStats[id][i][STATS_HS], playerWStats[id][i][STATS_TK], playerWStats[id][i][STATS_SHOTS], playerWStats[id][i][STATS_HITS], playerWStats[id][i][STATS_DAMAGE], playerWStats[id][i][HIT_GENERIC], playerWStats[id][i][HIT_HEAD], playerWStats[id][i][HIT_CHEST],
2408 playerWStats[id][i][HIT_STOMACH], playerWStats[id][i][HIT_LEFTARM], playerWStats[id][i][HIT_RIGHTARM], playerWStats[id][i][HIT_LEFTLEG], playerWStats[id][i][HIT_RIGHTLEG], playerWStats[id][i][STATS_KILLS], playerWStats[id][i][STATS_DEATHS], playerWStats[id][i][STATS_HS], playerWStats[id][i][STATS_TK], playerWStats[id][i][STATS_SHOTS], playerWStats[id][i][STATS_HITS],
2409 playerWStats[id][i][STATS_DAMAGE], playerWStats[id][i][HIT_GENERIC], playerWStats[id][i][HIT_HEAD], playerWStats[id][i][HIT_CHEST], playerWStats[id][i][HIT_STOMACH], playerWStats[id][i][HIT_LEFTARM], playerWStats[id][i][HIT_RIGHTARM], playerWStats[id][i][HIT_LEFTLEG], playerWStats[id][i][HIT_RIGHTLEG]);
2410
2411 add(queryData, charsmax(queryData), queryTemp);
2412 }
2413
2414 if (queryData[0]) {
2415 if (type == MAP_END) {
2416 static error[128], errorNum, Handle:query;
2417
2418 query = SQL_PrepareQuery(connection, queryData);
2419
2420 if (!SQL_Execute(query)) {
2421 errorNum = SQL_QueryError(query, error, charsmax(error));
2422
2423 log_to_file("ultimate_stats.log", "SQL Query Error. [%d] %s", errorNum, error);
2424 }
2425
2426 SQL_FreeHandle(query);
2427 } else SQL_ThreadQuery(sql, "ignore_handle", queryData);
2428 }
2429
2430 if (type > ROUND) {
2431 rem_bit(id, weaponStatsLoaded);
2432
2433 clear_stats(id);
2434 }
2435}
2436
2437public load_sounds(id)
2438{
2439 if (!soundsEnabled) return;
2440
2441 new vaultKey[64], vaultData[16], soundsData[5][5];
2442
2443 formatex(vaultKey, charsmax(vaultKey), "%s-sounds", playerStats[id][NAME]);
2444
2445 if (nvault_get(sounds, vaultKey, vaultData, charsmax(vaultData))) {
2446 parse(vaultData, soundsData[0], charsmax(soundsData), soundsData[1], charsmax(soundsData), soundsData[2], charsmax(soundsData), soundsData[3], charsmax(soundsData), soundsData[4], charsmax(soundsData));
2447
2448 if (str_to_num(soundsData[0])) set_bit(id, soundMayTheForce);
2449 if (str_to_num(soundsData[1])) set_bit(id, soundOneAndOnly);
2450 if (str_to_num(soundsData[2])) set_bit(id, soundHumiliation);
2451 if (str_to_num(soundsData[3])) set_bit(id, soundPrepare);
2452 if (str_to_num(soundsData[4])) set_bit(id, soundLastLeft);
2453 }
2454}
2455
2456public save_sounds(id)
2457{
2458 if (!soundsEnabled) return;
2459
2460 new vaultKey[64], vaultData[16];
2461
2462 formatex(vaultKey, charsmax(vaultKey), "%s-sounds", playerStats[id][NAME]);
2463 formatex(vaultData, charsmax(vaultData), "%d %d %d %d %d", get_bit(id, soundMayTheForce), get_bit(id, soundOneAndOnly), get_bit(id, soundHumiliation), get_bit(id, soundPrepare), get_bit(id, soundLastLeft));
2464
2465 nvault_set(sounds, vaultKey, vaultData);
2466}
2467
2468stock get_player_id(id)
2469{
2470 new queryData[128], error[128], Handle:query, errorNum, playerId;
2471
2472 switch (rankSaveType) {
2473 case 0: formatex(queryData, charsmax(queryData), "SELECT id FROM `ultimate_stats` WHERE name = ^"%s^"", playerStats[id][SAFE_NAME]);
2474 case 1: formatex(queryData, charsmax(queryData), "SELECT id FROM `ultimate_stats` WHERE steamid = ^"%s^"", playerStats[id][STEAMID]);
2475 case 2: formatex(queryData, charsmax(queryData), "SELECT id FROM `ultimate_stats` WHERE ip = ^"%s^"", playerStats[id][IP]);
2476 }
2477
2478 query = SQL_PrepareQuery(connection, queryData);
2479
2480 if (SQL_Execute(query)) {
2481 if (SQL_NumResults(query)) playerId = SQL_ReadResult(query, 0);
2482 } else {
2483 errorNum = SQL_QueryError(query, error, charsmax(error));
2484
2485 log_to_file("ultimate_stats.log", "SQL Query Error. [%d] %s", errorNum, error);
2486 }
2487
2488 SQL_FreeHandle(query);
2489
2490 return playerId;
2491}
2492
2493stock get_rank_formula(dest[], length, where = true)
2494{
2495 switch (rankFormula) {
2496 case FORMULA_KD: formatex(dest, length, "(a.kills - a.deaths - a.team_kills)%s", where ? " < (kills - deaths - team_kills)" : " DESC, a.kills DESC, a.hs_kills DESC");
2497 case FORMULA_KILLS: formatex(dest, length, "(a.kills)%s", where ? " < (kills)" : " DESC, a.kills, a.hs_kills DESC");
2498 case FORMULA_KILLS_HS: formatex(dest, length, "(a.kills + a.hs_kills)%s", where ? " < (kills + hs_kills)" : " DESC, a.kills, a.hs_kills DESC");
2499 }
2500}
2501
2502stock clear_stats(player = 0, reset = 0)
2503{
2504 new limit = player ? player : MAX_PLAYERS;
2505
2506 if (reset) {
2507 new queryData[128];
2508
2509 formatex(queryData, charsmax(queryData), "DELETE FROM `ultimate_stats_weapons` WHERE player_id = '%i'", playerStats[player][PLAYER_ID]);
2510
2511 SQL_ThreadQuery(sql, "ignore_handle", queryData);
2512 }
2513
2514 if (player && !reset) {
2515 rem_bit(player, statsLoaded);
2516 rem_bit(player, weaponStatsLoaded);
2517 rem_bit(player, soundMayTheForce);
2518 rem_bit(player, soundOneAndOnly);
2519 rem_bit(player, soundHumiliation);
2520 rem_bit(player, soundLastLeft);
2521 rem_bit(player, soundPrepare);
2522 rem_bit(player, visit);
2523 }
2524
2525 for (new id = player; id <= limit; id++) {
2526 playerStats[id][HUD_INFO] = false;
2527
2528 if (player) playerStats[id][SKILL] = _:100.0;
2529
2530 for (new i = HIT_GENERIC; i <= CURRENT_HS; i++) {
2531 if (player) playerStats[id][i] = 0;
2532 if (!reset) playerRStats[id][i] = 0;
2533 }
2534
2535 for (new i = 0; i < WEAPONS_END; i++) {
2536 for (new j = 0; j < STATS_END; j++) {
2537 if (player) playerWStats[id][i][j] = 0;
2538
2539 playerWRStats[id][i][j] = 0;
2540 }
2541 }
2542
2543 for (new i = 0; i <= MAX_PLAYERS; i++) {
2544 for (new j = 0; j < KILLER_END; j++) {
2545 playerAStats[id][i][j] = 0;
2546 playerVStats[id][i][j] = 0;
2547 }
2548 }
2549 }
2550
2551 if (reset) save_stats(player);
2552}
2553
2554stock copy_stats(id, dest[], length, stats = 0, type = 0, weapon = 0, player = 0)
2555{
2556 for (new i = 0; i < length; i++) {
2557 switch (type) {
2558 case STATS: dest[i] = playerStats[id][i + stats];
2559 case ROUND_STATS: dest[i] = playerRStats[id][i + stats];
2560 case WEAPON_STATS: dest[i] = playerWStats[id][weapon][i + stats];
2561 case WEAPON_ROUND_STATS: dest[i] = playerWRStats[id][weapon][i + stats];
2562 case ATTACKER_STATS: dest[i] = playerAStats[id][player][i + stats];
2563 case VICTIM_STATS: dest[i] = playerVStats[id][player][i + stats];
2564 }
2565 }
2566}
2567
2568stock Float:accuracy(shots, hits)
2569{
2570 if (!shots) return (0.0);
2571
2572 return (100.0 * float(hits) / float(shots));
2573}
2574
2575stock Float:effec(kills, deaths)
2576{
2577 if (!kills) return (0.0);
2578
2579 return (100.0 * float(kills) / float(kills + deaths));
2580}
2581
2582stock Float:distance(distance)
2583 return float(distance) * 0.0254;
2584
2585stock get_loguser_index()
2586{
2587 new userLog[96], userName[32];
2588
2589 read_logargv(0, userLog, charsmax(userLog));
2590 parse_loguser(userLog, userName, charsmax(userName));
2591
2592 return get_user_index(userName);
2593}
2594
2595stock sql_safe_string(const source[], dest[], length)
2596{
2597 copy(dest, length, source);
2598
2599 replace_all(dest, length, "\\", "\\\\");
2600 replace_all(dest, length, "\0", "\\0");
2601 replace_all(dest, length, "\n", "\\n");
2602 replace_all(dest, length, "\r", "\\r");
2603 replace_all(dest, length, "\x1a", "\Z");
2604 replace_all(dest, length, "'", "\'");
2605 replace_all(dest, length, "`", "\`");
2606 replace_all(dest, length, "^"", "\^"");
2607}
2608
2609stock cmd_execute(id, const text[], any:...)
2610{
2611 message_begin(MSG_ONE, SVC_DIRECTOR, _, id);
2612 write_byte(strlen(text) + 2);
2613 write_byte(10);
2614 write_string(text);
2615 message_end();
2616
2617 #pragma unused text
2618
2619 new message[256];
2620
2621 format_args(message, charsmax(message), 1);
2622
2623 message_begin(id == 0 ? MSG_ALL : MSG_ONE, 51, _, id);
2624 write_byte(strlen(message) + 2);
2625 write_byte(10);
2626 write_string(message);
2627 message_end();
2628}
2629
2630public native_get_statsnum()
2631 return statsNum;
2632
2633public native_get_stats(plugin, params)
2634{
2635 if (params < 5) {
2636 log_error(AMX_ERR_NATIVE, "Bad arguments num, expected 5, passed %d.", params);
2637
2638 return 0;
2639 } else if (params > 5 && params != 7) {
2640 log_error(AMX_ERR_NATIVE, "Bad arguments num, expected 7, passed %d.", params);
2641
2642 return 0;
2643 }
2644
2645 new index = get_param(1);
2646
2647 static queryData[256], error[128], queryTemp[96], name[32], steamId[32], stats[8], hits[8], Handle:query, errorNum;
2648
2649 get_rank_formula(queryTemp, charsmax(queryTemp), false);
2650
2651 formatex(queryData, charsmax(queryData), "SELECT kills, deaths, hs_kills, team_kills, shots, hits, damage, assists, h_0, h_1, h_2, h_3, h_4, h_5, h_6, h_7, name, steamid FROM `ultimate_stats` ORDER BY %s LIMIT %d, %d", queryTemp, index, index);
2652
2653 query = SQL_PrepareQuery(connection, queryData);
2654
2655 if (SQL_Execute(query)) {
2656 if (SQL_NumResults(query)) {
2657 for (new i = 0; i < 8; i++) stats[i] = SQL_ReadResult(query, i);
2658 for (new i = 0; i < 8; i++) hits[i] = SQL_ReadResult(query, i + 8);
2659
2660 SQL_ReadResult(query, SQL_FieldNameToNum(query, "name"), name, charsmax(name));
2661 SQL_ReadResult(query, SQL_FieldNameToNum(query, "steamid"), steamId, charsmax(steamId));
2662 }
2663 } else {
2664 errorNum = SQL_QueryError(query, error, charsmax(error));
2665
2666 log_to_file("ultimate_stats.log", "SQL Query Error. [%d] %s", errorNum, error);
2667 }
2668
2669 SQL_FreeHandle(query);
2670
2671 set_array(2, stats, sizeof(stats));
2672 set_array(3, hits, sizeof(stats));
2673
2674 set_string(4, name, charsmax(name));
2675
2676 if (params == 5) set_string(4, steamId, charsmax(steamId));
2677
2678 return max(0, index - 1);
2679}
2680
2681public native_get_stats2(plugin, params)
2682{
2683 if (params < 5) {
2684 log_error(AMX_ERR_NATIVE, "Bad arguments num, expected 5, passed %d.", params);
2685
2686 return 0;
2687 } else if (params > 5 && params != 7) {
2688 log_error(AMX_ERR_NATIVE, "Bad arguments num, expected 7, passed %d.", params);
2689
2690 return 0;
2691 }
2692
2693 new index = get_param(1);
2694
2695 static queryData[192], error[128], queryTemp[96], steamId[32], objectives[4], Handle:query, errorNum;
2696
2697 get_rank_formula(queryTemp, charsmax(queryTemp), false);
2698
2699 formatex(queryData, charsmax(queryData), "SELECT defusions, defused, planted, exploded, steamid FROM `ultimate_stats` ORDER BY %s LIMIT %d, %d", queryTemp, index, index);
2700
2701 query = SQL_PrepareQuery(connection, queryData);
2702
2703 if (SQL_Execute(query)) {
2704 if (SQL_NumResults(query)) {
2705 for (new i = 0; i < 4; i++) objectives[i] = SQL_ReadResult(query, i);
2706
2707 SQL_ReadResult(query, SQL_FieldNameToNum(query, "steamid"), steamId, charsmax(steamId));
2708 }
2709 } else {
2710 errorNum = SQL_QueryError(query, error, charsmax(error));
2711
2712 log_to_file("ultimate_stats.log", "SQL Query Error. [%d] %s", errorNum, error);
2713 }
2714
2715 SQL_FreeHandle(query);
2716
2717 set_array(2, objectives, sizeof(objectives));
2718
2719 if (params == 3) set_string(3, steamId, charsmax(steamId));
2720
2721 return max(0, index - 1);
2722}
2723
2724public native_get_user_stats(plugin, params)
2725{
2726 if (params < 3) {
2727 log_error(AMX_ERR_NATIVE, "Bad arguments num, expected 3, passed %d.", params);
2728
2729 return 0;
2730 }
2731
2732 new id = get_param(1);
2733
2734 if (!is_user_valid(id)) {
2735 log_error(AMX_ERR_NATIVE, "Invalid player - %i.", id);
2736
2737 return 0;
2738 }
2739
2740 static stats[8], hits[8];
2741
2742 copy_stats(id, hits, sizeof(hits), _, STATS);
2743 copy_stats(id, stats, sizeof(stats), HIT_END, STATS);
2744
2745 set_array(2, stats, sizeof(stats));
2746 set_array(3, hits, sizeof(hits));
2747
2748 return playerStats[id][STATS_RANK];
2749}
2750
2751public native_get_user_stats2(plugin, params)
2752{
2753 if (params < 2) {
2754 log_error(AMX_ERR_NATIVE, "Bad arguments num, expected 2, passed %d.", params);
2755
2756 return 0;
2757 }
2758
2759 new id = get_param(1);
2760
2761 if (!is_user_valid(id)) {
2762 log_error(AMX_ERR_NATIVE, "Invalid player - %i.", id);
2763
2764 return 0;
2765 }
2766
2767 static objectives[4];
2768
2769 copy_stats(id, objectives, sizeof(objectives), STATS_END, STATS);
2770
2771 set_array(2, objectives, sizeof(objectives));
2772
2773 return playerStats[id][STATS_RANK];
2774}
2775
2776public native_get_user_rank(plugin, params)
2777{
2778 if (params < 1) {
2779 log_error(AMX_ERR_NATIVE, "Bad arguments num, expected 1, passed %d.", params);
2780
2781 return 0;
2782 }
2783
2784 new id = get_param(1);
2785
2786 if (!is_user_valid(id)) {
2787 log_error(AMX_ERR_NATIVE, "Invalid player - %i.", id);
2788
2789 return 0;
2790 }
2791
2792 return playerStats[id][STATS_RANK];
2793}
2794
2795public native_get_user_wstats(plugin, params)
2796{
2797 if (params < 4) {
2798 log_error(AMX_ERR_NATIVE, "Bad arguments num, expected 4, passed %d.", params);
2799
2800 return 0;
2801 }
2802
2803 new id = get_param(1), weapon = get_param(2);
2804
2805 if (!is_user_valid(id)) {
2806 log_error(AMX_ERR_NATIVE, "Invalid player - %i.", id);
2807
2808 return 0;
2809 } else if (!is_weapon_valid(id)) {
2810 log_error(AMX_ERR_NATIVE, "Invalid weapon - %i.", weapon);
2811
2812 return 0;
2813 }
2814
2815 static stats[8], hits[8];
2816
2817 copy_stats(id, hits, sizeof(hits), _, WEAPON_STATS, weapon);
2818 copy_stats(id, stats, charsmax(stats), HIT_END, WEAPON_STATS, weapon);
2819
2820 set_array(3, stats, sizeof(stats));
2821 set_array(4, hits, sizeof(stats));
2822
2823 return 1;
2824}
2825
2826public native_get_user_rstats(plugin, params)
2827{
2828 if (params < 3) {
2829 log_error(AMX_ERR_NATIVE, "Bad arguments num, expected 3, passed %d.", params);
2830
2831 return 0;
2832 }
2833
2834 new id = get_param(1);
2835
2836 if (!is_user_valid(id)) {
2837 log_error(AMX_ERR_NATIVE, "Invalid player - %i.", id);
2838
2839 return 0;
2840 }
2841
2842 static stats[8], hits[8];
2843
2844 copy_stats(id, hits, sizeof(hits), _, ROUND_STATS);
2845 copy_stats(id, stats, charsmax(stats), HIT_END, ROUND_STATS);
2846
2847 set_array(2, stats, sizeof(stats));
2848 set_array(3, hits, sizeof(stats));
2849
2850 return 1;
2851}
2852
2853public native_get_user_wrstats(plugin, params)
2854{
2855 if (params < 4) {
2856 log_error(AMX_ERR_NATIVE, "Bad arguments num, expected 4, passed %d.", params);
2857
2858 return 0;
2859 }
2860
2861 new id = get_param(1), weapon = get_param(2);
2862
2863 if (!is_user_valid(id)) {
2864 log_error(AMX_ERR_NATIVE, "Invalid player - %i.", id);
2865
2866 return 0;
2867 } else if (!is_weapon_valid(id)) {
2868 log_error(AMX_ERR_NATIVE, "Invalid weapon - %i.", weapon);
2869
2870 return 0;
2871 }
2872
2873 static stats[8], hits[8];
2874
2875 copy_stats(id, hits, sizeof(hits), _, WEAPON_ROUND_STATS, weapon);
2876 copy_stats(id, stats, charsmax(stats), HIT_END, WEAPON_ROUND_STATS, weapon);
2877
2878 set_array(3, stats, sizeof(stats));
2879 set_array(4, hits, sizeof(stats));
2880
2881 return 1;
2882}
2883
2884public native_get_user_astats(plugin, params)
2885{
2886 if (params < 4) {
2887 log_error(AMX_ERR_NATIVE, "Bad arguments num, expected 4, passed %d.", params);
2888
2889 return 0;
2890 } else if (params > 4 && params < 6) {
2891 log_error(AMX_ERR_NATIVE, "Bad arguments num, expected 6, passed %d.", params);
2892
2893 return 0;
2894 }
2895
2896 new id = get_param(1), player = get_param(2);
2897
2898 if (!is_user_valid(id) || (!is_user_valid(player) && player != 0)) {
2899 log_error(AMX_ERR_NATIVE, "Invalid player - %i.", is_user_valid(id) ? player : id);
2900
2901 return 0;
2902 }
2903
2904 static weaponName[32], stats[8], hits[8];
2905
2906 copy_stats(id, hits, sizeof(hits), _, ATTACKER_STATS, _, player);
2907 copy_stats(id, stats, sizeof(stats), HIT_END, ATTACKER_STATS, _, player);
2908
2909 set_array(3, stats, sizeof(stats));
2910 set_array(4, hits, sizeof(hits));
2911
2912 if (params > 4) {
2913 get_weaponname(stats[stat(STATS_RANK)], weaponName, charsmax(weaponName));
2914
2915 set_string(5, weaponName, get_param(6));
2916 }
2917
2918 return hits[HIT_GENERIC];
2919}
2920
2921public native_get_user_vstats(plugin, params)
2922{
2923 if (params < 4) {
2924 log_error(AMX_ERR_NATIVE, "Bad arguments num, expected 4, passed %d.", params);
2925
2926 return 0;
2927 } else if (params > 4 && params < 6) {
2928 log_error(AMX_ERR_NATIVE, "Bad arguments num, expected 6, passed %d.", params);
2929
2930 return 0;
2931 }
2932
2933 new id = get_param(1), player = get_param(2);
2934
2935 if (!is_user_valid(id) || (!is_user_valid(player) && player != 0)) {
2936 log_error(AMX_ERR_NATIVE, "Invalid player - %i.", is_user_valid(id) ? player : id);
2937
2938 return 0;
2939 }
2940
2941 static weaponName[32], stats[8], hits[8];
2942
2943 copy_stats(id, hits, sizeof(hits), _, VICTIM_STATS, _, player);
2944 copy_stats(id, stats, sizeof(stats), HIT_END, VICTIM_STATS, _, player);
2945
2946 set_array(3, stats, sizeof(stats));
2947 set_array(4, hits, sizeof(hits));
2948
2949 if (params > 4) {
2950 get_weaponname(stats[stat(STATS_RANK)], weaponName, charsmax(weaponName));
2951
2952 set_string(5, weaponName, get_param(6));
2953 }
2954
2955 return hits[HIT_GENERIC];
2956}
2957
2958public native_get_map_objectives(plugin, params)
2959{
2960 if (params != 0) {
2961 log_error(AMX_ERR_NATIVE, "Bad arguments num, expected 0, passed %d.", params);
2962
2963 return 0;
2964 }
2965
2966 enum { MapObjective_Bomb = (1<<0), MapObjective_Hostage = (1<<1) };
2967
2968 new const bombSites[][] = { "func_bomb_target", "info_bomb_target" };
2969
2970 new bombSite = -1;
2971
2972 for (new i = 0; i < sizeof bombSites; i++) {
2973 bombSite = find_ent_by_class(-1, bombSites[i]);
2974
2975 if (bombSite != -1) {
2976 return MapObjective_Bomb;
2977 }
2978 }
2979
2980 new const hostZones[][] = { "func_hostage_rescue", "info_hostage_rescue" };
2981
2982 new hostZone = -1;
2983
2984 for (new i = 0; i < sizeof hostZones; i++) {
2985 hostZone = find_ent_by_class(-1, hostZones[i]);
2986
2987 if (hostZone != -1) {
2988 return MapObjective_Hostage;
2989 }
2990 }
2991
2992 return 0;
2993}
2994
2995public native_get_user_total_time(plugin, params)
2996{
2997 if (params < 1) {
2998 log_error(AMX_ERR_NATIVE, "Bad arguments num, expected 1, passed %d.", params);
2999
3000 return 0;
3001 }
3002
3003 new id = get_param(1);
3004
3005 if (!is_user_valid(id)) {
3006 log_error(AMX_ERR_NATIVE, "Invalid player - %i.", id);
3007
3008 return 0;
3009 }
3010
3011 return playerStats[id][TIME] + get_user_time(id);
3012}
3013
3014public Float:native_get_user_elo(plugin, params)
3015{
3016 if (params < 1) {
3017 log_error(AMX_ERR_NATIVE, "Bad arguments num, expected 1, passed %d.", params);
3018
3019 return 0.0;
3020 }
3021
3022 new id = get_param(1);
3023
3024 if (!is_user_valid(id)) {
3025 log_error(AMX_ERR_NATIVE, "Invalid player - %i.", id);
3026
3027 return 0.0;
3028 }
3029
3030 return playerStats[id][SKILL];
3031}
3032
3033public native_add_user_elo(plugin, params)
3034{
3035 if (params < 2) {
3036 log_error(AMX_ERR_NATIVE, "Bad arguments num, expected 2, passed %d.", params);
3037
3038 return 0;
3039 }
3040
3041 new id = get_param(1);
3042
3043 if (!is_user_valid(id)) {
3044 log_error(AMX_ERR_NATIVE, "Invalid player - %i.", id);
3045
3046 return 0;
3047 }
3048
3049 playerStats[id][SKILL] += get_param_f(2);
3050
3051 save_stats(id, NORMAL);
3052
3053 return 1;
3054}
3055
3056public native_reset_user_wstats(plugin, params)
3057{
3058 if (params != 1) {
3059 log_error(AMX_ERR_NATIVE, "Bad arguments num, expected 1, passed %d.", params);
3060
3061 return 0;
3062 }
3063
3064 new id = get_param(1);
3065
3066 if (!is_user_valid(id) || !is_user_connected(id)) {
3067 log_error(AMX_ERR_NATIVE, "Invalid player - %i.", id);
3068
3069 return 0;
3070 }
3071
3072 clear_stats(id, 1);
3073
3074 return 1;
3075}
3076
3077public native_not_supported(plugin, params)
3078{
3079 log_error(AMX_ERR_NATIVE, "Native not supported!");
3080
3081 return 0;
3082}
3083
3084public native_xmod_get_maxweapons(plugin, params)
3085{
3086 if (params != 0) {
3087 log_error(AMX_ERR_NATIVE, "Bad arguments num, expected 0, passed %d.", params);
3088
3089 return 0;
3090 }
3091
3092 return WEAPONS_END;
3093}
3094
3095public native_xmod_get_stats_size(plugin, params)
3096{
3097 if (params != 0) {
3098 log_error(AMX_ERR_NATIVE, "Bad arguments num, expected 0, passed %d.", params);
3099
3100 return 0;
3101 }
3102
3103 return HIT_END;
3104}
3105
3106public native_xmod_is_melee_wpn(plugin, params)
3107{
3108 if (params != 0) {
3109 log_error(AMX_ERR_NATIVE, "Bad arguments num, expected 0, passed %d.", params);
3110
3111 return 0;
3112 }
3113
3114 new weapon = get_param(1);
3115
3116 if (weapon >= WEAPONS_END) {
3117 log_error(AMX_ERR_NATIVE, "Invalid weapon index.");
3118
3119 return 0;
3120 }
3121
3122 return weapon == CSW_KNIFE ? 1 : 0;
3123}
3124
3125public native_xmod_is_custom_wpn(plugin, params)
3126{
3127 if (params != 1) {
3128 log_error(AMX_ERR_NATIVE, "Bad arguments num, expected 0, passed %d.", params);
3129
3130 return 0;
3131 }
3132
3133 return 0;
3134}
3135
3136public native_xmod_get_wpnname(plugin, params)
3137{
3138 if (params != 0) {
3139 log_error(AMX_ERR_NATIVE, "Bad arguments num, expected 0, passed %d.", params);
3140
3141 return;
3142 }
3143
3144 new weapon = get_param(1);
3145
3146 if (weapon >= WEAPONS_END) {
3147 log_error(AMX_ERR_NATIVE, "Invalid weapon index.");
3148
3149 return;
3150 }
3151
3152 static weaponName[32];
3153
3154 get_weaponname(weapon, weaponName, charsmax(weaponName));
3155
3156 replace(weaponName, charsmax(weaponName), "weapon_", "");
3157
3158 set_string(2, weaponName, get_param(3));
3159}
3160
3161public native_xmod_get_wpnlogname(plugin, params)
3162{
3163 if (params != 0) {
3164 log_error(AMX_ERR_NATIVE, "Bad arguments num, expected 0, passed %d.", params);
3165
3166 return;
3167 }
3168
3169 new weapon = get_param(1);
3170
3171 if (weapon >= WEAPONS_END) {
3172 log_error(AMX_ERR_NATIVE, "Invalid weapon index.");
3173
3174 return;
3175 }
3176
3177 static weaponName[32];
3178
3179 get_weaponname(weapon, weaponName, charsmax(weaponName));
3180
3181 set_string(2, weaponName, get_param(3));
3182}