· 9 years ago · Jan 31, 2017, 10:58 AM
1#include <amxmodx>
2#include <amxmisc>
3#include <engine>
4#include <fakemeta>
5#include <fakemeta_util>
6#include <hamsandwich>
7#include <cstrike>
8#include <fun>
9#include <sqlx>
10
11new const PLUGIN[] = "Global Offensive";
12new const VERSION[] = "4.52";
13new const AUTHOR[] = "DeRoiD";
14
15/*================================================================================
16[MySQLx Vars, other]
17=================================================================================*/
18#define DB_HOST "IP"
19#define DB_USER "user"
20#define DB_PASS "pw"
21#define DB_DATA "db"
22
23#define TABLE_NAME "csgo_players_new"
24
25#define ACCESS_VIP ADMIN_LEVEL_H //VIP access
26#define ACCESS_ADMIN ADMIN_BAN //ADMIN access
27#define ACCESS_SADMIN ADMIN_IMMUNITY //SADMIN access
28
29#define SOUND_SOLD "ambience/quail1.wav"
30
31new Handle:g_hTuple;
32new g_msgid_ScreenFade, g_msgid_SyncHud;
33
34#define MAX 200 //Jei MAX 200 tai CHEST_ID = 201 ir KEY_ID = 202
35#define MAX_RANGS 30
36
37#define CHEST_ID 202
38#define CHEST_COUNT 9
39
40#define KEY_ID 212
41#define KEY_ID_TEXT "212"
42
43#define CONTRACT_ID 213
44#define CONTRACT_ID_TEXT "213"
45
46#define POINTSKILL_MIN 3
47#define POINTSKILL_MAX 8
48
49#define POINTSKILL_HS 3 //Jei HS, kiek prides prie normaliu tasku
50
51#define POINTSKILL_VIP_FLAG ACCESS_VIP
52#define POINTSKILL_MIN_VIP 2 //Pridedamas prie POINTSKILL_MIN
53#define POINTSKILL_MAX_VIP 5 //pridedamas prie POINTSKILL_MAX
54
55#define DROP_RATE_KILL 8
56#define DROP_RATE_PLANT 8
57#define DROP_RATE_DEF 8
58#define DROP_RATE_HOSTAGE 8
59
60#define MIN_PASSWORD_LENGTH 4
61#define MIN_CODE_LENGTH 6
62
63#define MARKET_MIN_PRICE 50
64#define MARKET_WAIT_ADD 3
65
66#define HOSTAGE_ESCAPE 5
67#define HOSTAGE_KILL_PENALTY 15 //Reduce points -
68
69#define BOMB_PLANTED_POINTS 5
70#define BOMB_DEFUSED_POINTS 7
71
72#define ROUND_WIN_POINTS 10
73
74#define NEED_MIN_PLAYERS 1
75
76new g_logfile[64];
77new bool:gEnd = false;
78
79#define TASKID_REMENU 100
80
81new csgo_password_field;
82
83new cvar_refill_spawn;
84
85
86new gWarnings[33] = 0;
87
88/*=========*/
89new bool:bTrade[33] = false;
90new bool:bTradeAccepted[33] = false;
91/*=========*/
92
93/*================================================================================
94=================================================================================*/
95
96new const g_weapons[] = {
97 CSW_P228, CSW_SCOUT, CSW_XM1014, CSW_MAC10, CSW_AUG, CSW_ELITE, CSW_FIVESEVEN, CSW_UMP45, CSW_SG550, CSW_GALI, CSW_GALIL, CSW_FAMAS, CSW_USP,
98 CSW_GLOCK18, CSW_AWP, CSW_MP5NAVY, CSW_M249, CSW_M3, CSW_M4A1, CSW_TMP, CSW_G3SG1, CSW_DEAGLE, CSW_SG552, CSW_AK47, CSW_P90
99}
100new const g_other_weapons[] = { CSW_KNIFE, CSW_HEGRENADE, CSW_C4 }
101new const g_max_clip[] = { 13, 10, 7, 30, 30, 30, 20, 25, 30, 35, 35, 25, 12, 20, 10, 30, 100, 8, 30, 30, 20, 7, 30, 30, 50 }
102enum _:AmmoIds { ammo_none, ammo_338magnum = 1, ammo_762nato, ammo_556natobox, ammo_556nato, ammo_buckshot, ammo_45acp, ammo_57mm, ammo_50ae, ammo_357sig, ammo_9mm }
103new g_iAmmoMax[AmmoIds] = { -1, 30, 90, 200, 90, 32, 100, 100, 35, 52, 120 }
104new const g_iAmmoWeaponSharedBitSum[AmmoIds] = { 0,
105 (1<<CSW_AWP), (1<<CSW_SCOUT)|(1<<CSW_G3SG1)|(1<<CSW_AK47), (1<<CSW_M249),
106 (1<<CSW_AUG)|(1<<CSW_SG550)|(1<<CSW_GALIL)|(1<<CSW_FAMAS)|(1<<CSW_M4A1)|(1<<CSW_SG552),
107 (1<<CSW_XM1014)|(1<<CSW_M3), (1<<CSW_MAC10)|(1<<CSW_UMP45)|(1<<CSW_USP),
108 (1<<CSW_P90)|(1<<CSW_FIVESEVEN), (1<<CSW_DEAGLE), (1<<CSW_P228),
109 (1<<CSW_MP5NAVY)|(1<<CSW_TMP)|(1<<CSW_ELITE)|(1<<CSW_GLOCK18)
110}
111new g_msgid_AmmoX;
112
113#pragma semicolon 1
114
115new WeaponNames[MAX][64], WeaponMdls[MAX][128], WeaponMdlsP[MAX][128], Weapons[MAX], WeaponDrop[MAX], AllWeapon;
116new uWeapon[MAX][33], uWeaponKills[MAX][33], Chest[33][CHEST_COUNT+1], pKey[33], Points[33], Rang[33], Kills[33],
117aThing[33], aTarget[33], aPoints[33], Prefix[32];
118new Folder[48], SkinFile[48], RangFile[48], DefaFile[48], MenuMod[33];
119new WeaponinMarket[33], inMarket[33], MarketPoints[33];
120new SavedPassword[33][32], bool:Loged[33], bool:gLogged[33], bool:gRegistered[33], Password[33][32];
121new DefaultSkin[33][32], DefaultSkinP[33][32], DefaultSkinW[33][32], NeedKills[MAX_RANGS], Rangs[MAX_RANGS][32];
122new gCanLoad, gCanSave;
123new bUsingGuns[33][CSW_VESTHELM];
124new gLastMarketTime[33] = 0;
125new chestsList[CHEST_COUNT+1][128][512];
126new chestsChance[CHEST_COUNT+1][128];
127
128new const eWeapon[][] =
129{
130 "", "weapon_p228", "", "weapon_scout", "weapon_hegrenade", "weapon_xm1014", "weapon_c4", "weapon_mac10",
131 "weapon_aug", "weapon_smokegrenade", "weapon_elite", "weapon_fiveseven", "weapon_ump45", "weapon_sg550",
132 "weapon_galil", "weapon_famas", "weapon_usp", "weapon_glock18", "weapon_awp",
133 "weapon_mp5navy", "weapon_m249", "weapon_m3", "weapon_m4a1", "weapon_tmp", "weapon_g3sg1",
134 "weapon_flashbang", "weapon_deagle", "weapon_sg552", "weapon_ak47", "weapon_knife", "weapon_p90"
135};
136
137new const szWeaponNames[][] =
138{
139 "", "P228", "", "Scout", "HE Granata", "XM1014", "C4", "MAC10", "Aug", "SG Granata", "Elite",
140 "Five Seven", "UMP45", "SG550", "Galil", "Famas", "USP", "Glock", "AWP", "MP5 Navy", "M249",
141 "M3", "M4A1", "TMP", "G3SG1", "FB Granata", "Deagle", "SG552", "AK47", "Knife", "P90"
142};
143
144public plugin_precache()
145{
146 register_dictionary("globaloffensive.txt");
147
148 get_time("csgo_%Y%m%d.log", g_logfile, charsmax(g_logfile));
149
150 log_errors("-------------------- == --------------------");
151 new Line[512], Data[9][128], Len;
152 AllWeapon++;
153 get_configsdir(Folder, 47);
154 format(SkinFile, 47, "%s/csgo/skins.cfg", Folder);
155 format(RangFile, 47, "%s/csgo/rangs.cfg", Folder);
156 format(DefaFile, 47, "%s/csgo/dskins.cfg", Folder);
157
158 if(file_exists(RangFile))
159 {
160 for(new i; i < file_size(RangFile, 1); i++)
161 {
162 if(i >= MAX_RANGS) {
163 log_errors("[plugin_precache] Increase your MAX_RANGS define.");
164 break;
165 }
166
167 read_file(RangFile, i, Line, 127, Len);
168 parse(Line, Data[0], 31, Data[1], 31);
169
170 copy(Rangs[i], 31, Data[0]);
171 NeedKills[i] = str_to_num(Data[1]);
172 }
173 }
174
175 if(file_exists(SkinFile))
176 {
177 for(new i; i < file_size(SkinFile, 1); i++)
178 {
179 if(AllWeapon >= MAX) {
180 log_errors("[plugin_precache] Increase your MAX define.");
181 break;
182 }
183
184 read_file(SkinFile, i, Line, 512, Len);
185
186 if(strlen(Line) < 5 || Line[0] == ';' || (Line[0] == '/' && Line[1] == '/'))
187 continue;
188
189 //ginklas, pavadinimas, v_, p_, chance - old
190 //ginklas, pavadinimas, v_, p_, chest, chance, number
191 parse(Line, Data[0], 31, Data[1], 31, Data[2], 128, Data[3], 128, Data[4], 31, Data[5], 31, Data[6], 31);
192
193 Weapons[AllWeapon] = str_to_num(Data[0]);
194 copy(WeaponNames[AllWeapon], 63, Data[1]);
195
196 if(ValidMdl(Data[2])) {
197 precache_model(Data[2]);
198 copy(WeaponMdls[AllWeapon], 128, Data[2]);
199
200 if(file_exists(Data[3]) && strlen(Data[3]) > 5) {
201 precache_model(Data[3]);
202 copy(WeaponMdlsP[AllWeapon], 128, Data[3]);
203 }
204 }
205
206 WeaponDrop[AllWeapon] = str_to_num(Data[4]);
207
208 chestsChance[str_to_num(Data[4])][str_to_num(Data[5])] += 1;
209 chestsList[str_to_num(Data[4])][str_to_num(Data[5])][str_to_num(Data[6])] = AllWeapon;
210 //log_amx("chestsList[%s][%s][%s] = %d", Data[4], Data[5], Data[6], AllWeapon);
211
212 AllWeapon++;
213 }
214 }
215 if(file_exists(DefaFile))
216 {
217 for(new i; i < file_size(DefaFile, 1); i++)
218 {
219 read_file(DefaFile, i, Line, 127, Len);
220
221 if(strlen(Line) < 5 || Line[0] == ';' || (Line[0] == '/' && Line[1] == '/'))
222 continue;
223
224 parse(Line, Data[0], 31, Data[1], 47, Data[2], 47);
225
226 if(ValidMdl(Data[1])) {
227 precache_model(Data[1]);
228 copy(DefaultSkin[str_to_num(Data[0])], 47, Data[1]);
229
230 if(file_exists(Data[2]) && strlen(Data[2]) > 5) {
231 precache_model(Data[2]);
232 copy(DefaultSkinP[str_to_num(Data[0])], 47, Data[2]);
233 }
234
235 if(file_exists(Data[3]) && strlen(Data[3]) > 5) {
236 precache_model(Data[3]);
237 copy(DefaultSkinW[str_to_num(Data[0])], 47, Data[3]);
238 }
239 }
240 }
241 }
242
243 precache_sound(SOUND_SOLD);
244
245 g_hTuple = SQL_MakeDbTuple(DB_HOST, DB_USER, DB_PASS, DB_DATA);
246
247 new szTables[640]; format(szTables, 640, "CREATE TABLE IF NOT EXISTS `%s` (`username` varchar(64) COLLATE utf8_lithuanian_ci NOT NULL, `password` varchar(64) COLLATE utf8_lithuanian_ci NOT NULL, `kills` int(11) NOT NULL, `points` int(11) NOT NULL, `keys` int(11) NOT NULL, `chests` int(11) NOT NULL, `rang` int(11) NOT NULL, `skins` varchar(512) COLLATE utf8_lithuanian_ci NOT NULL, PRIMARY KEY (`username`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_lithuanian_ci", TABLE_NAME);
248 SQL_ThreadQuery( g_hTuple, "QueryCreateTable", szTables);
249}
250
251public plugin_init()
252{
253 register_plugin(PLUGIN, VERSION, AUTHOR);
254 register_cvar(PLUGIN, VERSION, FCVAR_SERVER);
255
256 register_clcmd("say /menu", "MenuOpen");
257 register_clcmd("say /reg", "RegMenu");
258 register_clcmd("say /trade", "TradeMenu");
259 register_clcmd("say /register", "TradeMenu");
260
261 register_clcmd("say menu", "MenuOpen");
262 register_clcmd("say reg", "RegMenu");
263 register_clcmd("say trade", "TradeMenu");
264 register_clcmd("say register", "TradeMenu");
265
266 register_clcmd("say !menu", "MenuOpen");
267 register_clcmd("say !reg", "RegMenu");
268 register_clcmd("say !trade", "TradeMenu");
269 register_clcmd("say !register", "TradeMenu");
270
271 register_clcmd("say .menu", "MenuOpen");
272 register_clcmd("say .reg", "RegMenu");
273 register_clcmd("say .trade", "TradeMenu");
274 register_clcmd("say .register", "TradeMenu");
275
276 register_clcmd("say /savepass", "SavePassword");
277
278 register_clcmd("say /uniq", "cmdUniq");
279
280 register_clcmd("radio1", "MenuOpen");
281
282 register_concmd("Cost", "MarketCost");
283 register_concmd("Gift", "GiftPoint");
284 register_concmd("UserPassword", "PlayerPassword");
285
286 register_logevent("Hostage_Rescued", 3, "2=Rescued_A_Hostage");
287 register_event("TextMsg", "TextMsg_Killed_Hostage", "b", "1=4", "2=#Killed_Hostage");
288 register_event("HLTV", "RoundStart", "a", "1=0", "2=0");
289
290 register_forward(FM_ClientUserInfoChanged, "NameChange");
291 register_forward(FM_SetModel, "SetModel");
292
293 register_message(get_user_msgid("SendAudio"), "Message_SendAudio");
294
295 RegisterHam(Ham_Spawn, "player", "PlayerSpawn", 1);
296
297 for(new i; i < sizeof(eWeapon); i++) {
298 if(strlen(eWeapon[i]) > 3) {
299 RegisterHam(Ham_Item_Deploy, eWeapon[i], "WeaponSwitch", 1);
300 }
301 }
302 csgo_password_field = register_cvar("csgo_password_field", "_csgo");
303
304 g_msgid_ScreenFade = get_user_msgid("ScreenFade");
305 g_msgid_SyncHud = CreateHudSyncObj();
306 g_msgid_AmmoX = get_user_msgid("AmmoX");
307
308 cvar_refill_spawn = register_cvar("csgo_refill_onspawn", "1");
309
310 set_task(5.0, "LoadConnected");
311 gCanLoad = 0;
312 gCanSave = 0;
313
314 new iEnt = -1;
315 while((iEnt = find_ent_by_class(iEnt, "env_sound")))
316 {
317 DispatchKeyValue(iEnt, "roomtype", "0");
318 DispatchKeyValue(iEnt, "radius", "0");
319 }
320
321 format(Prefix, 31, "%L", LANG_PLAYER, "PREFIX");
322}
323
324public SavePassword(id)
325{
326 if(!Loged[id])
327 {
328 if(!gRegistered[id])
329 {
330 print_color(id, "%L", LANG_PLAYER, "NEED_REGISTER_1", Prefix);
331 print_color(id, "%L", LANG_PLAYER, "NEED_REGISTER_2", Prefix);
332 } else {
333 print_color(id, "%L", LANG_PLAYER, "LOGIN_FIRST", Prefix);
334 }
335 return PLUGIN_HANDLED;
336 }
337
338 new passfield[32]; get_pcvar_string(csgo_password_field, passfield, 31);
339 set_user_info(id, passfield, SavedPassword[id]);
340 client_cmd(id, "setinfo %s %s", passfield, SavedPassword[id]);
341
342 print_color(id, "%L", LANG_PLAYER, "SUCCESS_SAVED", Prefix);
343
344 return PLUGIN_HANDLED;
345}
346
347public TextMsg_Killed_Hostage(id)
348{
349 Points[id] -= HOSTAGE_KILL_PENALTY;
350
351 set_hudmessage(255, 0, 0, -1.0, 0.15, 0, 6.0, 2.0);
352 show_hudmessage(id, "%L", LANG_PLAYER, "POINT_REDUCE", HOSTAGE_KILL_PENALTY);
353
354 SavePoints(id);
355}
356
357public Hostage_Rescued()
358{
359 static loguser[80], name[32], id;
360 read_logargv(0, loguser, 79); parse_loguser(loguser, name, 31);
361 id = get_user_index(name);
362
363 if(is_user_connected(id))
364 {
365 Points[id] += HOSTAGE_ESCAPE;
366
367 set_hudmessage(255, 255, 255, -1.0, 0.15, 0, 6.0, 2.0);
368 show_hudmessage(id, "%L", LANG_PLAYER, "POINT", HOSTAGE_ESCAPE);
369
370 drop_item(id, DROP_RATE_HOSTAGE);
371
372 SavePoints(id);
373 }
374}
375
376public LoadConnected()
377{
378 gCanLoad = 1;
379 gCanSave = 1;
380
381 for(new i=1; i <= 32; i++) {
382 if(is_user_connected(i)) {
383 add_delay(i);
384 }
385 }
386}
387
388public plugin_end()
389{
390 SQL_FreeHandle(g_hTuple);
391}
392
393public bomb_planted(planter)
394{
395 if(is_user_connected(planter))
396 {
397 Points[planter] += BOMB_PLANTED_POINTS;
398
399 set_hudmessage(255, 255, 255, -1.0, 0.15, 0, 6.0, 2.0);
400 show_hudmessage(planter, "%L", LANG_PLAYER, "POINT", BOMB_PLANTED_POINTS);
401
402 drop_item(planter, DROP_RATE_PLANT);
403
404 SavePoints(planter);
405 }
406}
407
408public bomb_defused(defuser)
409{
410 if(is_user_connected(defuser))
411 {
412 Points[defuser] += BOMB_DEFUSED_POINTS;
413
414 set_hudmessage(255, 255, 255, -1.0, 0.15, 0, 6.0, 2.0);
415 show_hudmessage(defuser, "%L", LANG_PLAYER, "POINT", BOMB_DEFUSED_POINTS);
416
417 drop_item(defuser, DROP_RATE_DEF);
418
419 SavePoints(defuser);
420 }
421}
422
423public RoundStart() {
424 gEnd = false;
425}
426
427public Message_SendAudio(iMsgId, iMsgDest, id)
428{
429 if( !id && !gEnd)
430 {
431 new szSound[14]; get_msg_arg_string(2, szSound, charsmax(szSound));
432 new iPlayers[32], iNum, tId;
433
434 if(equal(szSound, "%!MRAD_ctwin"))
435 {
436 get_players(iPlayers, iNum, "ceh", "CT");
437 for(new i; i < iNum; i++)
438 {
439 tId = iPlayers[i];
440
441 if(!is_user_alive(tId) || cs_get_user_team(tId) != CS_TEAM_CT) {
442 continue;
443 }
444
445 Points[tId] += ROUND_WIN_POINTS;
446
447 set_hudmessage(255, 255, 255, -1.0, 0.15, 0, 6.0, 2.0);
448 show_hudmessage(tId, "%L", LANG_PLAYER, "POINT", ROUND_WIN_POINTS);
449
450 SavePoints(tId);
451 }
452 gEnd = true;
453 print_color(0, "%L", LANG_PLAYER, "CT_TEAM_WIN", Prefix, ROUND_WIN_POINTS);
454 }
455 else if( equal(szSound, "%!MRAD_terwin") )
456 {
457 get_players(iPlayers, iNum, "ceh", "TERRORIST");
458 for(new i; i < iNum; i++)
459 {
460 tId = iPlayers[i];
461
462 if(!is_user_alive(tId) || cs_get_user_team(tId) != CS_TEAM_T) {
463 continue;
464 }
465
466 Points[tId] += ROUND_WIN_POINTS;
467
468 set_hudmessage(255, 255, 255, -1.0, 0.15, 0, 6.0, 2.0);
469 show_hudmessage(tId, "%L", LANG_PLAYER, "POINT", ROUND_WIN_POINTS);
470
471 SavePoints(tId);
472 }
473 gEnd = true;
474 print_color(0, "%L", LANG_PLAYER, "T_TEAM_WIN", Prefix, ROUND_WIN_POINTS);
475 }
476 }
477}
478
479public PlayerSpawn(id)
480{
481 if(is_user_alive(id))
482 {
483 if(!Loged[id] && gRegistered[id])
484 {
485 RegMenu(id);
486 set_user_maxspeed(id, 1.0);
487
488 message_begin(MSG_ONE, g_msgid_ScreenFade, _, id);
489 write_short(60);
490 write_short(60);
491 write_short(0x0004);
492 write_byte(15);
493 write_byte(15);
494 write_byte(15);
495 write_byte(255);
496 message_end();
497
498 if(!equal(Password[id], SavedPassword[id]))
499 {
500 print_color(id, "%L", LANG_PLAYER, "LOGIN_FIRST", Prefix);
501 print_color(id, "%L", LANG_PLAYER, "LOGIN_FIRST", Prefix);
502 print_color(id, "%L", LANG_PLAYER, "LOGIN_FIRST", Prefix);
503 }
504 }
505
506 if(!gRegistered[id]) {
507 print_color(id, "%L", LANG_PLAYER, "NEED_REGISTER_1", Prefix);
508 print_color(id, "%L", LANG_PLAYER, "NEED_REGISTER_2", Prefix);
509 }
510
511 if(get_pcvar_num(cvar_refill_spawn))
512 {
513 static iWeapons[32], iNum, i, iGun; iNum = 0;
514 get_user_weapons(id, iWeapons, iNum);
515
516 for( i = 0; i < iNum; i++ ) {
517 for (new a = 0; a < sizeof (g_other_weapons); a++)
518 if (iWeapons[i] == g_other_weapons[a])
519 continue;
520
521 for (new a = 0; a < sizeof (g_weapons); a++) {
522
523 if(g_weapons[a] == iWeapons[i])
524 {
525 if (get_weapon_maxclip(iWeapons[i]))
526 {
527 iGun = has_user_weapon(id, iWeapons[i]);
528 client_cmd(id, "spk ^"items/9mmclip1.wav^"");
529 cs_set_weapon_ammo(iGun, get_weapon_maxclip(iWeapons[i]));
530 SetFullBpAmmo(id, iWeapons[i]);
531 }
532 }
533 }
534 }
535 }
536
537 if(cs_get_user_team(id) == CS_TEAM_CT) {
538 cs_set_user_defuse(id, 1);
539 }
540 }
541 return PLUGIN_CONTINUE;
542}
543
544public MenuOpen(id)
545{
546 if(!Loged[id]) { RegMenu(id); return PLUGIN_HANDLED; }
547
548 MenuMod[id] = 0;
549 Menu(id);
550 return PLUGIN_HANDLED;
551}
552
553public client_death(Killer, Victim, wpnindex, hitplace, TK)
554{
555 if(Killer == Victim) { return PLUGIN_HANDLED; }
556
557 if(!gRegistered[Victim]) {
558 print_color(Victim, "%L", LANG_PLAYER, "BLANK");
559 print_color(Victim, "%L", LANG_PLAYER, "NEED_REGISTER_1", Prefix);
560 print_color(Victim, "%L", LANG_PLAYER, "NEED_REGISTER_2", Prefix);
561 print_color(Victim, "%L", LANG_PLAYER, "BLANK");
562 }
563
564 if(!gRegistered[Killer]) {
565 print_color(Killer, "%L", LANG_PLAYER, "BLANK");
566 print_color(Killer, "%L", LANG_PLAYER, "NEED_REGISTER_1", Prefix);
567 print_color(Killer, "%L", LANG_PLAYER, "NEED_REGISTER_2", Prefix);
568 print_color(Killer, "%L", LANG_PLAYER, "BLANK");
569 }
570
571 Kills[Killer]++;
572 static kGun; kGun = get_user_weapon(Killer, _, _);
573
574 if(bUsingGuns[Killer][kGun]) {
575 uWeaponKills[bUsingGuns[Killer][kGun]][Killer]++;
576 SaveGunsKills(Killer);
577 set_task(0.1, "UpdateStatusText", Killer);
578 }
579
580 if(Rang[Killer] < sizeof(Rangs) && Rang[Killer] < file_size(RangFile, 1))
581 {
582 if(Kills[Killer] >= NeedKills[Rang[Killer]])
583 Rang[Killer]++;
584 }
585
586 new pPont, vPont, hsPont;
587 pPont += random_num(POINTSKILL_MIN, POINTSKILL_MAX);
588
589 if(hitplace == HIT_HEAD) { pPont += hsPont = POINTSKILL_HS; }
590
591 Points[Killer] += pPont;
592
593 if(get_user_flags(Killer) & POINTSKILL_VIP_FLAG)
594 {
595 vPont += random_num(POINTSKILL_MIN_VIP, POINTSKILL_MAX_VIP);
596 Points[Killer] += vPont;
597 }
598
599 set_hudmessage(255, 255, 255, -1.0, 0.15, 0, 6.0, 2.0);
600
601 if(get_user_flags(Killer) & POINTSKILL_VIP_FLAG) {
602 if(hitplace == HIT_HEAD) {
603 show_hudmessage(Killer, "%L +%d VIP +%d HS", LANG_PLAYER, "POINT", pPont, vPont, hsPont);
604 }
605 else {
606 show_hudmessage(Killer, "%L +%d VIP", LANG_PLAYER, "POINT", pPont, vPont);
607 }
608 }
609 else {
610 if(hitplace == HIT_HEAD) {
611 show_hudmessage(Killer, "%L +%d HS", LANG_PLAYER, "POINT", pPont, hsPont);
612 }
613 else {
614 show_hudmessage(Killer, "%L", LANG_PLAYER, "POINT", pPont);
615 }
616 }
617
618 drop_item(Killer, DROP_RATE_KILL);
619
620 SavePoints(Killer);
621 return PLUGIN_CONTINUE;
622}
623
624public SetModel(entity, model[])
625{
626 if(!pev_valid(entity))
627 return FMRES_IGNORED;
628
629 static Classname[32]; pev(entity, pev_classname, Classname, sizeof(Classname));
630
631 if(!equal(Classname, "weaponbox"))
632 return FMRES_IGNORED;
633
634 static iOwner; iOwner = pev(entity, pev_owner);
635 static iWeapon; iWeapon = get_user_weapon(iOwner, _, _);
636 static weapon; weapon = find_ent_by_owner(-1, eWeapon[iWeapon], entity);
637
638 if(bUsingGuns[iOwner][iWeapon] && !pev(weapon, pev_impulse))
639 {
640 if(!pev_valid(weapon))
641 return FMRES_IGNORED;
642
643 set_pev(weapon, pev_impulse, bUsingGuns[iOwner][iWeapon]);
644
645 if(strlen(DefaultSkinW[iWeapon]) > 5) {
646 entity_set_model(entity, DefaultSkinW[iWeapon]);
647
648 return FMRES_SUPERCEDE;
649 }
650 return FMRES_IGNORED;
651 }
652
653 return FMRES_IGNORED;
654}
655
656public MarketCost(id)
657{
658 if(inMarket[id] || !Loged[id])
659 return PLUGIN_HANDLED;
660
661 new Data[32], Cost;
662 read_args(Data, 31);
663 remove_quotes(Data);
664
665 Cost = str_to_num(Data);
666
667 if(Cost < 0)
668 {
669 client_cmd(id, "messagemode Cost");
670 return PLUGIN_HANDLED;
671 }
672 else if(MARKET_MIN_PRICE > Cost)
673 {
674 //print_color(id, "%L", LANG_PLAYER, "NOTENOUGHTMARKET", Prefix, MARKET_MIN_PRICE);
675 //client_cmd(id, "messagemode Cost");
676 MarketPoints[id] = MARKET_MIN_PRICE;
677 Menu(id);
678 MenuMod[id] = 3;
679
680 return PLUGIN_HANDLED;
681 }
682 else
683 {
684 MarketPoints[id] = Cost;
685 Menu(id);
686 MenuMod[id] = 3;
687 return PLUGIN_CONTINUE;
688 }
689}
690
691public GiftPoint(id)
692{
693 if(inMarket[id] || !Loged[id])
694 return PLUGIN_HANDLED;
695
696 new Data[32], Cost;
697 read_args(Data, 31);
698 remove_quotes(Data);
699
700 Cost = str_to_num(Data);
701
702 if(Cost < 0 || Points[id] < Cost)
703 {
704 client_cmd(id, "messagemode Gift");
705 return PLUGIN_HANDLED;
706 }
707 else
708 {
709 aPoints[id] = Cost;
710 Menu(id);
711 MenuMod[id] = 5;
712 return PLUGIN_CONTINUE;
713 }
714}
715
716public WeaponSwitch(Weapon)
717{
718 new id = get_pdata_cbase(Weapon, 41, 4);
719 new wid = cs_get_weapon_id(Weapon);
720
721 if(id > 32 || id < 1) {
722 return HAM_SUPERCEDE;
723 }
724
725 if(!is_user_connected(id)) {
726 return HAM_SUPERCEDE;
727 }
728
729 if(pev(Weapon, pev_impulse))
730 {
731 set_pev(id, pev_viewmodel2, WeaponMdls[pev(Weapon, pev_impulse)]);
732 if(strlen(WeaponMdlsP[pev(Weapon, pev_impulse)]) > 5) {
733 set_pev(id, pev_weaponmodel2, WeaponMdlsP[pev(Weapon, pev_impulse)]);
734 }
735 }
736 else if(bUsingGuns[id][wid])
737 {
738 set_pev(id, pev_viewmodel2, WeaponMdls[bUsingGuns[id][wid]]);
739 if(strlen(WeaponMdlsP[bUsingGuns[id][wid]]) > 5) {
740 set_pev(id, pev_weaponmodel2, WeaponMdlsP[bUsingGuns[id][wid]]);
741 }
742 set_task(0.1, "UpdateStatusText", id);
743 }
744 else if(strlen(DefaultSkin[wid]) > 5)
745 {
746 if(cs_get_user_team(id) == CS_TEAM_CT && wid == 29) { wid = 31; }
747
748 set_pev(id, pev_viewmodel2, DefaultSkin[wid]);
749 if(strlen(DefaultSkinP[wid]) > 5) {
750 set_pev(id, pev_weaponmodel2, DefaultSkinP[wid]);
751 }
752 set_task(0.1, "UpdateStatusText", id);
753 }
754 else {
755 set_task(0.1, "UpdateStatusText", id);
756 }
757
758 return HAM_IGNORED;
759}
760
761public Menu(id)
762{
763 if(!Loged[id]) { RegMenu(id); return; }
764
765 new sMenu, szText[256];
766
767 switch(MenuMod[id])
768 {
769 case -2: //Kazkas su dovanom
770 {
771 formatex(szText, sizeof(szText), "%s\r %L %L", Prefix, LANG_PLAYER, "GIFTCH", LANG_PLAYER, "YPOINT", Points[id]);
772 sMenu = menu_create(szText, "MenuHandler");
773
774 new String[32], All;
775 for(new i = 1; i < AllWeapon; i++)
776 {
777 if(uWeapon[i][id] <= 0)
778 continue;
779
780 num_to_str(i, String, 31);
781 formatex(szText, sizeof(szText), "%L", LANG_PLAYER, "SKINPIECE", (bUsingGuns[id][Weapons[i]] == i) ? "\w" : "\y", WeaponNames[i], szWeaponNames[Weapons[i]], uWeapon[i][id]);
782 menu_additem(sMenu, szText, String);
783 All++;
784 }
785
786 for(new i=1; i <=CHEST_COUNT; i++)
787 {
788 if(Chest[id][i] > 0)
789 {
790 formatex(szText, sizeof(szText), "%L", LANG_PLAYER, "CHESTPIECE", chest_name(i), Chest[id][i]);
791
792 new szButton[128]; formatex(szButton, charsmax(szButton), "%d", CHEST_ID+i);
793 menu_additem(sMenu, szText, szButton);
794
795 All++;
796 }
797 }
798
799 if(pKey[id] > 0)
800 {
801 formatex(szText, sizeof(szText), "%L", LANG_PLAYER, "KEYPIECE", pKey[id]);
802 menu_additem(sMenu, szText, KEY_ID_TEXT);
803 All++;
804 }
805
806 if(All == 0)
807 {
808 MenuMod[id] = 0;
809 Menu(id);
810 }
811 }
812 case -1: //Deti i turgu
813 {
814 formatex(szText, sizeof(szText), "%s\r %L %L", Prefix, LANG_PLAYER, "GIFTCH", LANG_PLAYER, "YPOINT", Points[id]);
815 sMenu = menu_create(szText, "MenuHandler");
816
817 new String[32], All;
818 for(new i = 1; i < AllWeapon; i++)
819 {
820 if(uWeapon[i][id] <= 0)
821 continue;
822
823 num_to_str(i, String, 31);
824 formatex(szText, sizeof(szText), "%L", LANG_PLAYER, "SKINPIECE", (bUsingGuns[id][Weapons[i]] == i) ? "\w" : "\y", WeaponNames[i], szWeaponNames[Weapons[i]], uWeapon[i][id]);
825 menu_additem(sMenu, szText, String);
826 All++;
827 }
828
829 for(new i=1; i <=CHEST_COUNT; i++)
830 {
831 if(Chest[id][i] > 0)
832 {
833 formatex(szText, sizeof(szText), "%L", LANG_PLAYER, "CHESTPIECE", chest_name(i), Chest[id][i]);
834
835 new szButton[128]; formatex(szButton, charsmax(szButton), "%d", CHEST_ID+i-1);
836 menu_additem(sMenu, szText, szButton);
837
838 All++;
839 }
840 }
841
842 if(pKey[id] > 0)
843 {
844 formatex(szText, sizeof(szText), "%L", LANG_PLAYER, "KEYPIECE", pKey[id]);
845 menu_additem(sMenu, szText, KEY_ID_TEXT);
846 All++;
847 }
848
849 if(All == 0)
850 {
851 MenuMod[id] = 0;
852 Menu(id);
853 }
854 }
855 case 0:
856 {
857 formatex(szText, sizeof(szText), "\r%L %L", LANG_PLAYER, "MAIN", LANG_PLAYER, "YPOINT", Points[id]);
858 sMenu = menu_create(szText, "MenuHandler");
859
860 formatex(szText, sizeof(szText), "%L^n---------", LANG_PLAYER, "MENUTOSKINS");
861 menu_additem(sMenu, szText, "1");
862
863 formatex(szText, sizeof(szText), "%L %L", LANG_PLAYER, "MENUTOCHESTOPEN", LANG_PLAYER, (!inMarket[id]) ? "BLANK" : "INMARKET");
864 menu_additem(sMenu, szText, (!inMarket[id]) ? "2" : "0");
865
866 formatex(szText, sizeof(szText), "%L^n---------", LANG_PLAYER, "MENUCHESTINFO");
867 menu_additem(sMenu, szText, "7");
868
869 formatex(szText, sizeof(szText), "%L", LANG_PLAYER, "MENUTOMARKET");
870 menu_additem(sMenu, szText, "3");
871
872 formatex(szText, sizeof(szText), "%L", LANG_PLAYER, "MENUTOSHOP");
873 menu_additem(sMenu, szText, "6");
874
875 formatex(szText, sizeof(szText), "%L %L", LANG_PLAYER, "MENUTODUSTBIN", LANG_PLAYER, (!inMarket[id]) ? "BLANK" : "INMARKET");
876 menu_additem(sMenu, szText, (!inMarket[id]) ? "4" : "0");
877
878 formatex(szText, sizeof(szText), "%L %L%L", LANG_PLAYER, "MENUTOGIFT", LANG_PLAYER, (!inMarket[id]) ? "BLANK" : "INMARKET", LANG_PLAYER, "MRANG", Rangs[Rang[id]+1], Kills[id], NeedKills[Rang[id]]);
879 menu_additem(sMenu, szText, (!inMarket[id]) ? "5" : "0");
880 }
881 case 1: //Skinai
882 {
883 formatex(szText, sizeof(szText), "%s\r %L %L", Prefix, LANG_PLAYER, "MENUTOSKINS", LANG_PLAYER, "YPOINT", Points[id]);
884 sMenu = menu_create(szText, "MenuHandler");
885
886 new String[32], All;
887 for(new i = 1; i < AllWeapon; i++)
888 {
889 if(uWeapon[i][id] <= 0)
890 continue;
891
892 formatex(String, 31, "%d %d", i, Weapons[i]);
893 formatex(szText, sizeof(szText), "%L", LANG_PLAYER, "SKINPIECE", (bUsingGuns[id][Weapons[i]] == i) ? "\w" : "\y", WeaponNames[i], szWeaponNames[Weapons[i]], uWeapon[i][id]);
894 menu_additem(sMenu, szText, String);
895
896 All++;
897 }
898
899 if(All == 0)
900 {
901 MenuMod[id] = 0;
902 Menu(id);
903 }
904 }
905 case 2: //Skrynios
906 {
907 formatex(szText, sizeof(szText), "%s\r %L^n^n%L", Prefix, LANG_PLAYER, "MENUTOCHESTOPEN", LANG_PLAYER, "KEYPIECE", pKey[id]);
908 sMenu = menu_create(szText, "MenuHandler");
909 new call = menu_makecallback("Call_Back");
910
911 for(new i=1; i <=CHEST_COUNT; i++)
912 {
913 formatex(szText, sizeof(szText), "%L", LANG_PLAYER, "CHESTPIECE", chest_name(i), Chest[id][i]);
914 menu_additem(sMenu, szText, _, _, (Chest[id][i] > 0 && pKey[id] > 0) ? -1 : call);
915 }
916 }
917 case 3: //Turgus
918 {
919 formatex(szText, sizeof(szText), "%s\r %L %L", Prefix, LANG_PLAYER, "MENUTOMARKET", LANG_PLAYER, "YPOINT", Points[id]);
920 sMenu = menu_create(szText, "MenuHandler");
921 new call = menu_makecallback("Call_Back");
922
923 new String[32], All;
924 if(!inMarket[id])
925 {
926 for(new i = 1; i < AllWeapon; i++) {
927 if(i == WeaponinMarket[id] && uWeapon[i][id] > 0) {
928 formatex(szText, sizeof(szText), "%L", LANG_PLAYER, "MARKETPLACES", WeaponNames[i], szWeaponNames[Weapons[i]], MarketPoints[id]);
929 All++;
930 }
931 }
932
933 //log_amx("Turgus. Rodo. %d <= %d <= %d && Chest[id][%d] > 0", CHEST_ID, WeaponinMarket[id], CHEST_ID+CHEST_COUNT, (WeaponinMarket[id]-CHEST_ID)+1);
934 if(CHEST_ID <= WeaponinMarket[id] <= CHEST_ID+CHEST_COUNT && Chest[id][(WeaponinMarket[id]-CHEST_ID)+1] > 0)
935 {
936 for(new i=1; i <=CHEST_COUNT; i++)
937 {
938 //log_amx("Chest[id][%d] && %d == %d", i, (CHEST_ID+i-1), WeaponinMarket[id]);
939 if(Chest[id][i] > 0 && ((CHEST_ID+i-1) == WeaponinMarket[id]))
940 {
941 formatex(szText, sizeof(szText), "%L", LANG_PLAYER, "MARKETPLACEC", chest_name(i), MarketPoints[id]);
942
943 All++;
944 break;
945 }
946 }
947 }
948
949 if(KEY_ID == WeaponinMarket[id] && pKey[id] > 0)
950 {
951 formatex(szText, sizeof(szText), "%L", LANG_PLAYER, "MARKETPLACEK", MarketPoints[id]);
952 All++;
953 }
954
955 if(All == 0)
956 formatex(szText, sizeof(szText), "%L", LANG_PLAYER, "MARKETPLACECH");
957
958 menu_additem(sMenu, szText, "-1");
959 }
960
961 formatex(szText, sizeof(szText), "%L", LANG_PLAYER, (!inMarket[id]) ? "TOMARKETM" : "BACKMARKET");
962 menu_additem(sMenu, szText, "0", _, ((get_systime()-gLastMarketTime[id]) > MARKET_WAIT_ADD) ? -1 : call);
963
964 for(new x; x < 32; x++)
965 {
966 if(!is_user_connected(x) || is_user_bot(x))
967 continue;
968
969 if(inMarket[x] && MarketPoints[x] > 0)
970 {
971 num_to_str(x, String, 31);
972
973 if(CHEST_ID <= WeaponinMarket[x] <= CHEST_ID+CHEST_COUNT)
974 {
975 //log_amx("Turgus. Rodo. (%d-%d) = %d", WeaponinMarket[x], CHEST_ID, WeaponinMarket[x]-CHEST_ID);
976 formatex(szText, sizeof(szText), "%L", LANG_PLAYER, "SELLERC", chest_name((WeaponinMarket[x]-CHEST_ID)+1), MarketPoints[x]);
977 menu_additem(sMenu, szText, String);
978 }
979 else if(KEY_ID == WeaponinMarket[x])
980 {
981 formatex(szText, sizeof(szText), "%L", LANG_PLAYER, "SELLERK", MarketPoints[x]);
982 menu_additem(sMenu, szText, String);
983 }
984 else
985 {
986 formatex(szText, sizeof(szText), "%L", LANG_PLAYER, "SELLERS", WeaponNames[WeaponinMarket[x]], szWeaponNames[Weapons[WeaponinMarket[x]]], MarketPoints[x]);
987 menu_additem(sMenu, szText, String);
988 }
989 }
990 }
991 }
992 case 4: //Siuksliadeze
993 {
994 formatex(szText, sizeof(szText), "%s\r %L %L", Prefix, LANG_PLAYER, "MENUTODUSTBIN", LANG_PLAYER, "YPOINT", Points[id]);
995 sMenu = menu_create(szText, "MenuHandler");
996
997 new String[32], All;
998 for(new i = 1; i < AllWeapon; i++)
999 {
1000 if(uWeapon[i][id] == 0)
1001 continue;
1002
1003 num_to_str(i, String, 31);
1004 formatex(szText, sizeof(szText), "%L", LANG_PLAYER, "SKINPIECE", (bUsingGuns[id][Weapons[i]] == i) ? "\w" : "\y", WeaponNames[i], szWeaponNames[Weapons[i]], uWeapon[i][id]);
1005 menu_additem(sMenu, szText, String);
1006 All++;
1007 }
1008
1009 if(All == 0)
1010 {
1011 MenuMod[id] = 0;
1012 Menu(id);
1013 }
1014 }
1015 case 5: //Dovanos
1016 {
1017 formatex(szText, sizeof(szText), "%s\r %L %L", Prefix, LANG_PLAYER, "MENUTOGIFT", LANG_PLAYER, "YPOINT", Points[id]);
1018 sMenu = menu_create(szText, "MenuHandler");
1019 new call = menu_makecallback("Call_Back");
1020
1021 new All, Name[126], String[32];
1022 get_user_name(aTarget[id], Name, 31);
1023
1024 if(aTarget[id] > 0)
1025 {
1026 formatex(szText, sizeof(szText), "%L", LANG_PLAYER, "GIFTT", Name);
1027 menu_additem(sMenu, szText, "-1");
1028
1029 for(new i = 1; i < AllWeapon; i++)
1030 {
1031 if(i == aThing[id] && uWeapon[i][id] > 0)
1032 {
1033 formatex(szText, sizeof(szText), "%L", LANG_PLAYER, "GIFTS", WeaponNames[i]);
1034 menu_additem(sMenu, szText, "-2");
1035 All++;
1036 }
1037 }
1038
1039 if(aThing[id] == 0 && All == 0)
1040 {
1041 formatex(szText, sizeof(szText), "%L", LANG_PLAYER, "GIFTCH");
1042 menu_additem(sMenu, szText, "-2");
1043 }
1044 else if(aThing[id] > MAX)
1045 {
1046 if(CHEST_ID <= aThing[id] <= CHEST_ID+CHEST_COUNT) { formatex(szText, sizeof(szText), "%L", LANG_PLAYER, "GIFTC", chest_name((aThing[id]-CHEST_ID))); }
1047 if(KEY_ID == aThing[id]) { formatex(szText, sizeof(szText), "%L", LANG_PLAYER, "GIFTK"); }
1048
1049 menu_additem(sMenu, szText, "-2");
1050 }
1051
1052 formatex(szText, sizeof(szText), "%L", LANG_PLAYER, "GIFTPOINTS", aPoints[id]);
1053 menu_additem(sMenu, szText, "-4");
1054
1055 formatex(szText, sizeof(szText), "%L", LANG_PLAYER, "SENDGIFT");
1056 menu_additem(sMenu, szText, "-3");
1057 }
1058 else
1059 {
1060 for(new i; i < 32; i++)
1061 {
1062 if(is_user_connected(i) && !is_user_bot(i))
1063 {
1064 get_user_name(i, Name, 31);
1065
1066 if(!Loged[i]) { format(Name, charsmax(Name), "%s \r[n.l]", Name); }
1067
1068 num_to_str(i, String, 31);
1069 menu_additem(sMenu, Name, String, _, (!Loged[i]) ? call : -1);
1070 }
1071 }
1072 }
1073 }
1074 case 6: //Parduotuve
1075 {
1076 formatex(szText, sizeof(szText), "\r%L %L", LANG_PLAYER, "MAIN", LANG_PLAYER, "YPOINT", Points[id]);
1077 sMenu = menu_create(szText, "MenuHandler");
1078 new call = menu_makecallback("Call_Back");
1079 new accesNum = get_access(id);
1080 new Float:gPercent = ((accesNum == 3) ? 0.9 : ((accesNum == 2) ? 0.94 : (accesNum == 1) ? 0.97 : 1.0));
1081
1082 new gPrice = floatround(1700*gPercent, floatround_floor);
1083 formatex(szText, sizeof(szText), "%L", LANG_PLAYER, "SHOPKEY_1", gPrice);
1084 menu_additem(sMenu, szText, _, _, (Points[id] < gPrice) ? call : -1);
1085
1086 gPrice = floatround(8000*gPercent, floatround_floor);
1087 formatex(szText, sizeof(szText), "%L", LANG_PLAYER, "SHOPKEY_5", gPrice);
1088 menu_additem(sMenu, szText, _, _, (Points[id] < gPrice) ? call : -1);
1089
1090 gPrice = floatround(14000*gPercent, floatround_floor);
1091 formatex(szText, sizeof(szText), "%L", LANG_PLAYER, "SHOPKEY_10", gPrice);
1092 menu_additem(sMenu, szText, _, _, (Points[id] < gPrice) ? call : -1);
1093
1094 for(new i=1; i <=CHEST_COUNT; i++)
1095 {
1096 formatex(szText, sizeof(szText), "%L", LANG_PLAYER, "SHOPCHEST_1", chest_name(i), 1400);
1097 menu_additem(sMenu, szText, _, _, (Points[id] < 1400) ? call : -1);
1098 }
1099 }
1100 case 7: //Skryniu info
1101 {
1102 formatex(szText, sizeof(szText), "\r%L %L", LANG_PLAYER, "MAIN", LANG_PLAYER, "YPOINT", Points[id]);
1103 sMenu = menu_create(szText, "MenuHandler");
1104
1105 for(new i=1; i <=CHEST_COUNT; i++)
1106 {
1107 formatex(szText, sizeof(szText), "%L", LANG_PLAYER, "CHESTINFOPIECE", chest_name(i));
1108 menu_additem(sMenu, szText);
1109 }
1110 }
1111 }
1112 menu_display(id, sMenu);
1113}
1114
1115public Call_Back(id, menu, item)
1116 return ITEM_DISABLED;
1117
1118public MenuHandler(id, gMenu, item)
1119{
1120 if(item == MENU_EXIT)
1121 {
1122 MenuMod[id] = 0;
1123 menu_destroy(gMenu);
1124 return PLUGIN_HANDLED;
1125 }
1126
1127 new aMenu[2], Data[4][32], sKey[32], Name[32], mName[32], Key;
1128 menu_item_getinfo(gMenu, item, aMenu[0], Data[0], 31, Data[1], 31, aMenu[1]);
1129
1130 parse(Data[0], sKey, 31);
1131 Key = str_to_num(sKey);
1132
1133 switch(MenuMod[id])
1134 {
1135 case -2:
1136 {
1137 MenuMod[id] = 5;
1138 aThing[id] = Key;
1139
1140 Menu(id);
1141 }
1142 case -1:
1143 {
1144 MenuMod[id] = 3;
1145 WeaponinMarket[id] = Key;
1146
1147 client_cmd(id, "messagemode Cost");
1148
1149 Menu(id);
1150 }
1151 case 0:
1152 {
1153 MenuMod[id] = Key;
1154 Menu(id);
1155 }
1156 case 1:
1157 {
1158 parse(Data[0], Data[2], 31, Data[3], 31);
1159
1160 if(bUsingGuns[id][str_to_num(Data[3])] == str_to_num(Data[2])) {
1161 bUsingGuns[id][str_to_num(Data[3])] = 0;
1162 print_color(id, "%L", LANG_PLAYER, "SKIN_REMOVED", Prefix, WeaponNames[str_to_num(Data[2])], szWeaponNames[str_to_num(Data[3])]);
1163 } else {
1164 bUsingGuns[id][str_to_num(Data[3])] = str_to_num(Data[2]);
1165 print_color(id, "%L", LANG_PLAYER, "SKIN_CHANGED", Prefix, WeaponNames[str_to_num(Data[2])], szWeaponNames[str_to_num(Data[3])]);
1166 set_task(0.1, "UpdateStatusText", id);
1167 }
1168
1169 static szQuery[512], szUGuns[128]; format(szUGuns, sizeof(szUGuns), "");
1170 for(new i; i < CSW_VESTHELM; i++) { format(szUGuns, sizeof(szUGuns), "%s%d ", szUGuns, bUsingGuns[id][i]); }
1171 formatex(szQuery, sizeof(szQuery), "UPDATE `%s` SET `using_skins` = '%s' WHERE `username` = '%s';", TABLE_NAME, szUGuns, get_user_name_ex(id));
1172 SQL_ThreadQuery(g_hTuple, "QuerySetData", szQuery);
1173 log_errors("[SKIN CHANGE] %s", szQuery);
1174
1175 MenuMod[id] = 1;
1176 Menu(id);
1177 }
1178 case 2:
1179 {
1180 if(Chest[id][(item+1)] <= 0)
1181 {
1182 Chest[id][(item+1)] = 0;
1183
1184 if(pKey[id] < 0)
1185 pKey[id] = 0;
1186
1187 return PLUGIN_CONTINUE;
1188 }
1189
1190 Chest[id][(item+1)]--;
1191 pKey[id]--;
1192
1193 new chest = item+1/*, kVar = floatround((random_float(0.0, 1.0) * 20), floatround_floor) + 10*/;
1194
1195 new Float:rNum = random_float((random(5)*1.0), 200.0);
1196 new chance = (rNum <= 1.0) ? 1 : ((rNum <= 5.0) ? 5 : ((rNum <= 25) ? 25 : 100));
1197
1198 new skinsCnt = chestsChance[chest][chance];
1199 new skinNum = random(skinsCnt);
1200 new skinId = chestsList[chest][chance][skinNum];
1201
1202 new szName[32]; get_user_name(id, szName, 31);
1203
1204 if(1 <= chance <= 5) { print_color(0, "%L", LANG_PLAYER, "FOUNDITEM_ALL", Prefix, szName, WeaponNames[skinId], szWeaponNames[Weapons[skinId]]); }
1205 else { print_color(id, "%L", LANG_PLAYER, "FOUNDITEM_SELF", Prefix, WeaponNames[skinId], szWeaponNames[Weapons[skinId]]); }
1206
1207 uWeapon[skinId][id]++;
1208 SaveData(id);
1209
1210
1211 Menu(id);
1212 }
1213 case 3:
1214 {
1215 if(Key == -1) { MenuMod[id] = -1; Menu(id); }
1216 else if(Key == 0)
1217 {
1218 if(inMarket[id]) { inMarket[id] = false; }
1219 else if(MarketPoints[id] > 0)
1220 {
1221 get_user_name(id, Name, 31);
1222
1223 switch(WeaponinMarket[id])
1224 {
1225 case CHEST_ID..(CHEST_ID+CHEST_COUNT): { print_color(0, "%L", LANG_PLAYER, "TOMARKET_CHEST", Prefix, Name, chest_name((WeaponinMarket[id]-CHEST_ID)+1), MarketPoints[id]); }
1226 case KEY_ID: { print_color(0, "%L", LANG_PLAYER, "TOMARKET_KEY", Prefix, Name, MarketPoints[id]); }
1227 default: { print_color(0, "%L", LANG_PLAYER, "TOMARKET_SKIN", Prefix, Name, WeaponNames[WeaponinMarket[id]], szWeaponNames[Weapons[WeaponinMarket[id]]], MarketPoints[id]); }
1228 }
1229
1230 inMarket[id] = true;
1231 }
1232 gLastMarketTime[id] = get_systime();
1233 Menu(id);
1234 }
1235 else if(inMarket[Key] && Points[id] >= MarketPoints[Key])
1236 {
1237 get_user_name(Key, Name, 31); get_user_name(id, mName, 31);
1238
1239 if(WeaponinMarket[Key] < CHEST_ID)
1240 {
1241 if(uWeapon[WeaponinMarket[Key]][Key] <= 0)
1242 {
1243 inMarket[Key] = false;
1244 MarketPoints[Key] = 0;
1245 WeaponinMarket[Key] = 0;
1246
1247 return PLUGIN_CONTINUE;
1248 }
1249
1250 print_color(0, "!g%s%L", Prefix, LANG_PLAYER, "BUYMARKETITEM", mName, WeaponNames[WeaponinMarket[Key]], MarketPoints[Key], Name);
1251 uWeapon[WeaponinMarket[Key]][id]++;
1252 uWeapon[WeaponinMarket[Key]][Key]--;
1253
1254 if(!uWeapon[WeaponinMarket[Key]][Key])
1255 for(new i; i < CSW_VESTHELM; i++) { if(bUsingGuns[Key][i] == WeaponinMarket[Key]) { bUsingGuns[Key][i] = 0; uWeaponKills[i][Key] = 0; break; } }
1256
1257 static szQuery[512], szUGuns[128];
1258 format(szUGuns, sizeof(szUGuns), "");
1259 for(new i; i < CSW_VESTHELM; i++) { format(szUGuns, sizeof(szUGuns), "%s%d ", szUGuns, bUsingGuns[id][i]); }
1260 formatex(szQuery, sizeof(szQuery), "UPDATE `%s` SET `using_skins` = '%s' WHERE `username` = '%s';", TABLE_NAME, szUGuns, get_user_name_ex(id));
1261 SQL_ThreadQuery(g_hTuple, "QuerySetData", szQuery);
1262 log_errors("[SKIN SHOP] %s", szQuery);
1263
1264 format(szUGuns, sizeof(szUGuns), "");
1265 for(new i; i < CSW_VESTHELM; i++) { format(szUGuns, sizeof(szUGuns), "%s%d ", szUGuns, bUsingGuns[Key][i]); }
1266 formatex(szQuery, sizeof(szQuery), "UPDATE `%s` SET `using_skins` = '%s' WHERE `username` = '%s';", TABLE_NAME, szUGuns, get_user_name_ex(Key));
1267 SQL_ThreadQuery(g_hTuple, "QuerySetData", szQuery);
1268
1269 log_errors("[SKIN SHOP] %s", szQuery);
1270 }
1271 else if(CHEST_ID <= WeaponinMarket[Key] <= CHEST_ID+CHEST_COUNT)
1272 {
1273 new chId = (WeaponinMarket[Key]-CHEST_ID)+1;
1274
1275 if(Chest[Key][chId] <= 0)
1276 {
1277 inMarket[Key] = false;
1278 MarketPoints[Key] = 0;
1279 WeaponinMarket[Key] = 0;
1280
1281 return PLUGIN_CONTINUE;
1282 }
1283
1284 print_color(0, "!g%s%L", Prefix, LANG_PLAYER, "BUYMARKETCHEST", mName, chest_name(chId), MarketPoints[Key], Name);
1285
1286 Chest[id][chId]++;
1287 Chest[Key][chId]--;
1288 }
1289 else if(WeaponinMarket[Key] == KEY_ID)
1290 {
1291 if(pKey[Key] <= 0)
1292 {
1293 inMarket[Key] = false;
1294 MarketPoints[Key] = 0;
1295 WeaponinMarket[Key] = 0;
1296
1297 return PLUGIN_CONTINUE;
1298 }
1299
1300 print_color(0, "!g%s%L", Prefix, LANG_PLAYER, "BUYMARKETKEY", mName, MarketPoints[Key], Name);
1301 pKey[id]++; pKey[Key]--;
1302 }
1303
1304 emit_sound(Key, CHAN_ITEM, SOUND_SOLD, VOL_NORM, ATTN_NORM ,0 , PITCH_NORM );
1305 Points[Key] += MarketPoints[Key];
1306 Points[id] -= MarketPoints[Key];
1307 SaveData(Key);
1308 SaveData(id);
1309 inMarket[Key] = false;
1310 MarketPoints[Key] = 0;
1311 WeaponinMarket[Key] = 0;
1312 MenuMod[id] = 0;
1313 }
1314 }
1315 case 4:
1316 {
1317 if(uWeapon[Key][id] > 0)
1318 {
1319 uWeapon[Key][id]--;
1320 Points[id] += random(15);
1321
1322 bUsingGuns[id][Weapons[Key]] = 0;
1323
1324 if(!uWeapon[Key][id])
1325 uWeaponKills[Key][id] = 0;
1326
1327 log_errors("[SKINLOG TRASH] %s ismete %s", get_user_name_ex(id), WeaponNames[Key]);
1328 SaveData(id);
1329 } else {
1330 uWeapon[Key][id] = 0;
1331 SaveData(id);
1332 }
1333
1334 Menu(id);
1335 }
1336 case 5:
1337 {
1338 if(Key == -1) { aTarget[id] = 0; }
1339 if(Key == -2) { MenuMod[id] = -2; }
1340 if(Key == -3)
1341 {
1342 if(!is_user_connected(aTarget[id])) {
1343 return PLUGIN_CONTINUE;
1344 }
1345
1346 if(aThing[id] < CHEST_ID)
1347 {
1348 if(uWeapon[aThing[id]][id] > 0)
1349 {
1350 uWeapon[aThing[id]][aTarget[id]]++;
1351 uWeapon[aThing[id]][id]--;
1352
1353 if(!uWeapon[aThing[id]][id])
1354 for(new i; i < CSW_VESTHELM; i++) { if(bUsingGuns[id][i] == aThing[id]) { bUsingGuns[id][i] = 0; uWeaponKills[i][id] = 0; break; } }
1355
1356 static szQuery[512], szUGuns[128]; format(szUGuns, sizeof(szUGuns), "");
1357 for(new i; i < CSW_VESTHELM; i++) { format(szUGuns, sizeof(szUGuns), "%s%d ", szUGuns, bUsingGuns[id][i]); }
1358 formatex(szQuery, sizeof(szQuery), "UPDATE `%s` SET `using_skins` = '%s' WHERE `username` = '%s';", TABLE_NAME, szUGuns, get_user_name_ex(id));
1359 SQL_ThreadQuery(g_hTuple, "QuerySetData", szQuery);
1360 log_errors("[SKIN GIFT] %s padovanojo %s - %s", get_user_name_ex(id), get_user_name_ex(aTarget[id]), WeaponNames[aThing[id]]);
1361 log_errors("[SKIN GIFT] %s", szQuery);
1362
1363 print_color(id, "!g%s %L", Prefix, LANG_PLAYER, "GIFTSUCCESS_SKIN");
1364 print_color(aTarget[id], "%L", LANG_PLAYER, "GIFTGOT_SKIN", Prefix, get_user_name_ex(id), WeaponNames[aThing[id]], szWeaponNames[Weapons[aThing[id]]]);
1365 }
1366 }
1367 else if(CHEST_ID <= aThing[id] <= CHEST_ID+CHEST_COUNT)
1368 {
1369 new cId = aThing[id]-CHEST_ID;
1370
1371 Chest[aTarget[id]][cId]++;
1372 Chest[id][cId]--;
1373
1374 print_color(id, "!g%s %L", Prefix, LANG_PLAYER, "GIFTSUCCESS_CHEST");
1375 print_color(aTarget[id], "%L", LANG_PLAYER, "GIFTGOT_CHEST", Prefix, get_user_name_ex(id));
1376 }
1377 else if(aThing[id] == KEY_ID)
1378 {
1379 pKey[aTarget[id]]++; pKey[id]--;
1380
1381 print_color(id, "!g%s %L", Prefix, LANG_PLAYER, "GIFTSUCCESS_KEY");
1382 print_color(aTarget[id], "%L", LANG_PLAYER, "GIFTGOT_KEY", Prefix, get_user_name_ex(id));
1383 }
1384
1385 if(aPoints[id] > 0 && Points[id] >= aPoints[id])
1386 {
1387 Points[aTarget[id]] += aPoints[id];
1388 Points[id] -= aPoints[id];
1389
1390 print_color(aTarget[id], "%L", LANG_PLAYER, "GIFTGOT_PTS", Prefix, get_user_name_ex(id), aPoints[id]);
1391 log_errors("[SKINLOG PTS] %s padovanojo %s - %d tasku", get_user_name_ex(id), get_user_name_ex(aTarget[id]), aPoints[id]);
1392 }
1393
1394 SaveData(aTarget[id]);
1395 SaveData(id);
1396
1397 MenuMod[id] = 0;
1398 aThing[id] = 0;
1399 aTarget[id] = 0;
1400 aPoints[id] = 0;
1401 }
1402 if(Key == -4) { client_cmd(id, "messagemode Gift"); }
1403 if(Key > 0) { aTarget[id] = Key; }
1404 Menu(id);
1405 }
1406 case 6:
1407 {
1408 new accesNum = get_access(id);
1409 new Float:gPercent = ((accesNum == 3) ? 0.9 : ((accesNum == 2) ? 0.94 : (accesNum == 1) ? 0.97 : 1.0));
1410
1411 switch(item)
1412 {
1413 case 0: {
1414 Points[id] -= floatround(1700*gPercent, floatround_floor);
1415 pKey[id]++;
1416
1417 print_color(id, "%L", LANG_PLAYER, "BOUGHTKEY_1", Prefix);
1418 SaveKeys(id);
1419 }
1420 case 1: {
1421 Points[id] -= floatround(8000*gPercent, floatround_floor);
1422 pKey[id] += 5;
1423
1424 print_color(id, "%L", LANG_PLAYER, "BOUGHTKEY_5", Prefix);
1425 SaveKeys(id);
1426 }
1427 case 2: {
1428 Points[id] -= floatround(14000*gPercent, floatround_floor);
1429 pKey[id] += 10;
1430
1431 print_color(id, "%L", LANG_PLAYER, "BOUGHTKEY_10", Prefix);
1432 SaveKeys(id);
1433 }
1434 case 3..(CHEST_COUNT+3):
1435 {
1436 Chest[id][item-2] += 1;
1437
1438 Points[id] -= 1400;
1439
1440 print_color(id, "%L", LANG_PLAYER, "BOUGHTCHEST_1", Prefix, chest_name(item-2));
1441
1442 SaveChests(id);
1443 }
1444 }
1445 }
1446 case 7:
1447 {
1448 new szMotd[126]; formatex(szMotd, charsmax(szMotd), "http://cs.rez.lt/pbgo/b.php?chest=%d", (item+1));
1449 show_motd(id, szMotd, chest_name((item+1)));
1450 Menu(id);
1451 }
1452 default: { MenuMod[id] = 0; }
1453 }
1454
1455 menu_destroy(gMenu);
1456 return PLUGIN_HANDLED;
1457}
1458
1459public client_disconnect(id)
1460{
1461 Kills[id] = 0, Rang[id] = 0, Points[id] = 0, pKey[id] = 0;
1462 for(new i; i <= CHEST_COUNT; i++) { Chest[id][i] = 0; }
1463 for(new i; i < AllWeapon; i++) { uWeapon[i][id] = 0; }
1464 for(new i; i < CSW_VESTHELM; i++) { bUsingGuns[id][i] = 0; }
1465
1466 gWarnings[id] = 0;
1467 WeaponinMarket[id] = 0;
1468 MarketPoints[id] = 0;
1469 inMarket[id] = 0;
1470 Password[id] = "";
1471 SavedPassword[id] = "";
1472 Loged[id] = false;
1473 gRegistered[id] = false;
1474 gLogged[id] = false;
1475 bTrade[id] = false;
1476 bTradeAccepted[id] = false;
1477}
1478
1479public client_putinserver(id)
1480{
1481 Kills[id] = 0, Rang[id] = 0, Points[id] = 0, pKey[id] = 0;
1482 for(new i; i <= CHEST_COUNT; i++) { Chest[id][i] = 0; }
1483 for(new i; i < AllWeapon; i++) { uWeapon[i][id] = 0; }
1484 for(new i; i < CSW_VESTHELM; i++) { bUsingGuns[id][i] = 0; }
1485
1486 gWarnings[id] = 0;
1487 Password[id] = "";
1488 SavedPassword[id] = "";
1489 Loged[id] = false;
1490 bTrade[id] = false;
1491 bTradeAccepted[id] = false;
1492 gRegistered[id] = false;
1493 gLogged[id] = false;
1494 gLastMarketTime[id] = get_systime();
1495
1496 if(gCanLoad) { set_task(0.5, "Registered", id); }
1497}
1498
1499public add_delay(id)
1500{
1501 switch(id)
1502 {
1503 case 1..8: set_task(0.1, "Registered", id);
1504 case 9..16: set_task(0.2, "Registered", id);
1505 case 17..24: set_task(0.3, "Registered", id);
1506 case 25..32: set_task(0.4, "Registered", id);
1507 }
1508}
1509
1510// ============================================================//
1511// [~ Saving / Loading datas ~] //
1512// ============================================================//
1513public QueryCreateTable(iFailState, Handle:hQuery, szError[], iError, iData[], iDataSize, Float:fQueueTime)
1514{
1515 if(iFailState == TQUERY_CONNECT_FAILED) { log_errors("Nepavyko prisijungti prie duomenu bazes. [%d] %s", iError, szError); return; }
1516 else if(iFailState == TQUERY_QUERY_FAILED) { log_errors("Neapyko apdoroti uzklausos. [%d] %s", iError, szError); return; }
1517}
1518
1519public Login(id)
1520{
1521 if(!is_user_connected(id) || is_user_bot(id))
1522 return;
1523
1524 static szQuery[256], iData[1]; iData[0] = id;
1525 formatex(szQuery, 255, "SELECT * FROM `%s` WHERE `username` = '%s' AND `password` = '%s'", TABLE_NAME, get_user_name_ex(id), Password[id]);
1526 SQL_ThreadQuery(g_hTuple, "QuerySelect", szQuery, iData, 1);
1527
1528 log_errors("[LOGIN] %s", szQuery);
1529}
1530
1531public QuerySelect(iFailState, Handle:hQuery, szError[ ], iError, iData[ ], iDataSize, Float:fQueueTime)
1532{
1533 if(iFailState == TQUERY_CONNECT_FAILED || iFailState == TQUERY_QUERY_FAILED) { log_errors("%s", szError); return; }
1534 else
1535 {
1536 new id = iData[0];
1537
1538 if(SQL_NumResults(hQuery))
1539 {
1540 new szSkins[512+MAX], szKSkins[512+MAX], szUGuns[256], szChests[128];
1541
1542 SQL_ReadResult(hQuery, 1, SavedPassword[id], 32);
1543 Kills[id] = SQL_ReadResult(hQuery, 2);
1544 Points[id] = SQL_ReadResult(hQuery, 3);
1545 pKey[id] = SQL_ReadResult(hQuery, 4);
1546 Rang[id] = SQL_ReadResult(hQuery, 6);
1547
1548 SQL_ReadResult(hQuery, 7, szSkins, sizeof(szSkins));
1549 SQL_ReadResult(hQuery, 8, szUGuns, sizeof(szUGuns));
1550 SQL_ReadResult(hQuery, 9, szKSkins, sizeof(szKSkins));
1551 SQL_ReadResult(hQuery, 5, szChests, sizeof(szChests));
1552
1553 SQL_NextRow(hQuery);
1554
1555 new myNumbers[512+MAX];
1556
1557 new count = ExplodeString(szSkins, myNumbers);
1558 if(count) { for(new i = 1; i < MAX; i++) { uWeapon[i][id] = myNumbers[i]; } }
1559
1560 count = ExplodeString(szKSkins, myNumbers);
1561 if(count) { for(new i = 1; i < MAX; i++) { uWeaponKills[i][id] = myNumbers[i]; } }
1562
1563 count = ExplodeString(szUGuns, myNumbers);
1564 if(count)
1565 {
1566 for(new i = 1; i < CSW_VESTHELM; i++)
1567 {
1568 if(myNumbers[i] <= MAX)
1569 {
1570 if(uWeapon[myNumbers[i]][id] && i == Weapons[myNumbers[i]])
1571 {
1572 bUsingGuns[id][i] = myNumbers[i];
1573 }
1574 }
1575 }
1576 }
1577
1578 count = ExplodeString(szChests, myNumbers);
1579 if(count) { for(new i = 1; i <= CHEST_COUNT; i++) { Chest[id][i] = myNumbers[i]; } }
1580
1581 if(!equal(Password[id], SavedPassword[id])) {
1582 print_color(id, "%L", LANG_PLAYER, "SAVE_PASS_ANNOUNCE", Prefix);
1583 }
1584 }
1585 Loged[id] = true;
1586 UnsetBlack(id);
1587 }
1588}
1589
1590public SaveData(id)
1591{
1592 if(Loged[id] && gRegistered[id] && gCanSave)
1593 {
1594 static szQuery[2048], szSkins[1024], szKSkins[1024], szUGuns[128], szChests[128];
1595 format(szSkins, sizeof(szSkins), "");
1596 format(szKSkins, sizeof(szKSkins), "");
1597 format(szUGuns, sizeof(szUGuns), "");
1598 format(szChests, sizeof(szChests), "");
1599
1600
1601 for(new i; i < MAX; i++)
1602 {
1603 format(szSkins, sizeof(szSkins), "%s%d ", szSkins, uWeapon[i][id]);
1604 format(szKSkins, sizeof(szKSkins), "%s%d ", szKSkins, uWeaponKills[i][id]);
1605 }
1606 for(new i; i < CSW_VESTHELM; i++) { format(szUGuns, sizeof(szUGuns), "%s%d ", szUGuns, bUsingGuns[id][i]); }
1607 for(new i; i <= CHEST_COUNT; i++) { format(szChests, sizeof(szChests), "%s%d ", szChests, Chest[id][i]); }
1608
1609 formatex( szQuery, sizeof(szQuery), "REPLACE INTO `%s` SET `username` = '%s', `password` = '%s', `kills` = '%d', `points` = '%d', `keys` = '%d', `chests` = '%s', `rang` = '%d', `skins` = '%s', `using_skins` = '%s', `skins_kills` = '%s';", TABLE_NAME, get_user_name_ex(id), SavedPassword[id], Kills[id], Points[id], pKey[id], szChests, Rang[id], szSkins, szUGuns, szKSkins);
1610 SQL_ThreadQuery( g_hTuple, "QuerySetData", szQuery);
1611
1612 log_errors("[SAVE] %s", szQuery);
1613 }
1614}
1615
1616public QuerySetData( iFailState, Handle:hQuery, szError[ ], iError, iData[ ], iDataSize, Float:fQueueTime )
1617{
1618 if(iFailState == TQUERY_CONNECT_FAILED) { log_errors("Nepavyko prisijungti prie duomenu bazes. [%d] %s", iError, szError); return; }
1619 else if(iFailState == TQUERY_QUERY_FAILED) { log_errors("Neapyko apdoroti uzklausos. [%d] %s", iError, szError); return; }
1620}
1621
1622public UnsetBlack(id)
1623{
1624 set_user_maxspeed(id, 250.0);
1625
1626 message_begin(MSG_ONE, g_msgid_ScreenFade, {0,0,0}, id);
1627 write_short(1<<10);
1628 write_short(1<<10);
1629 write_short(0x0000);
1630 write_byte(255);
1631 write_byte(255);
1632 write_byte(255);
1633 write_byte(50);
1634 message_end();
1635}
1636
1637public TradeMenu(id)
1638{
1639 if(!is_user_connected(id))
1640 return PLUGIN_CONTINUE;
1641
1642 if(bTrade[id])
1643 {
1644 if(bTradeAccepted[id])
1645 {
1646 client_print(id, 3, "[TRADE] Jus jau tradinate!");
1647 return PLUGIN_CONTINUE;
1648 }
1649
1650 client_print(id, 3, "[TRADE] Jums jau pasiulytas trade, jei sutinkate rasykita /sutinku arba /taccept");
1651 return PLUGIN_CONTINUE;
1652 }
1653
1654 /*new Name[32], String[32], sMenu;
1655 sMenu = menu_create("Trade Menu", "MenuHandler");
1656 new call = menu_makecallback("Call_Back");
1657 for(new i; i < 32; i++)
1658 {
1659 if(is_user_connected(i) && !is_user_bot(i))
1660 {
1661 get_user_name(i, Name, 31);
1662
1663 if(!Loged[i]) { format(Name, charsmax(Name), "%s \r[n.l]", Name); }
1664
1665 num_to_str(i, String, 31);
1666 menu_additem(sMenu, Name, String, _, (!Loged[i]) ? call : -1);
1667 }
1668 }
1669
1670 menu_display(id, sMenu);*/
1671
1672 return PLUGIN_CONTINUE;
1673}
1674
1675public RegMenu(id)
1676{
1677 static sId; sId = id;
1678 id = ((id - TASKID_REMENU) < 0) ? id : id-TASKID_REMENU;
1679
1680 if(Loged[id]) {
1681 print_color(id, "%L", LANG_PLAYER, "ALREADY_REGISTERED", Prefix);
1682 Menu(id);
1683 return PLUGIN_HANDLED;
1684 }
1685
1686 if(!gLogged[id] || !gCanLoad)
1687 {
1688 print_color(id, "%L", LANG_PLAYER, "WAIT_SYSTEM_LOADING", Prefix);
1689 remove_task(id+TASKID_REMENU);
1690 set_task(1.0, "RegMenu", id+TASKID_REMENU);
1691 return PLUGIN_HANDLED;
1692 }
1693 remove_task(id+TASKID_REMENU);
1694
1695 if(gLogged[id] && sId > 32 && gCanLoad && !gRegistered[id])
1696 {
1697 print_color(id, "%L", LANG_PLAYER, "BLANK");
1698 print_color(id, "%L", LANG_PLAYER, "NEED_REGISTER_1", Prefix);
1699 print_color(id, "%L", LANG_PLAYER, "NEED_REGISTER_2", Prefix);
1700 print_color(id, "%L", LANG_PLAYER, "BLANK");
1701
1702 UnsetBlack(id);
1703 return PLUGIN_HANDLED;
1704 }
1705
1706 if(equal(Password[id], SavedPassword[id]) && gRegistered[id])
1707 {
1708 Login(id);
1709 print_color(id, "%L", LANG_PLAYER, "AUTO_CONNECTED", Prefix);
1710
1711 return PLUGIN_HANDLED;
1712 }
1713
1714 new szString[128], Name[32];
1715 format(szString, sizeof(szString), "%s %L", Prefix, LANG_PLAYER, "RMMAIN");
1716 new rMenu = menu_create(szString, "rMenuHandler");
1717 get_user_name(id, Name, 31);
1718
1719 format(szString, sizeof(szString), "%L", LANG_PLAYER, "RMACCOUNT", Name); //Client name
1720 menu_additem(rMenu, szString, "0");
1721
1722 new szPassword[126];
1723 for(new i; i < strlen(Password[id]); i++) {
1724 format(szPassword, charsmax(szPassword), "%s*", szPassword);
1725 }
1726
1727 //format(szString, sizeof(szString), "%L", LANG_PLAYER, "RMP", Password[id]); //Client password
1728 format(szString, sizeof(szString), "%L", LANG_PLAYER, "RMP", szPassword); //Client password
1729 menu_additem(rMenu, szString, "1");
1730
1731 if(!gRegistered[id]) //Not registered
1732 {
1733 format(szString, sizeof(szString), "%s%L", (strlen(Password[id]) >= MIN_PASSWORD_LENGTH) ? "" :"\d", LANG_PLAYER, "RMR");
1734 menu_additem(rMenu, szString, (strlen(Password[id]) >= MIN_PASSWORD_LENGTH) ? "2" : "0");
1735 }
1736 else
1737 {
1738 if(!Loged[id]) //Registered, but not logged
1739 {
1740 new gPassCheck = equal(SavedPassword[id], Password[id]);
1741
1742 format(szString, sizeof(szString), "%s%L", (gPassCheck) ? "" : "\d", LANG_PLAYER, "RMLOGIN");
1743 menu_additem(rMenu, szString, (gPassCheck) ? "3" : "0");
1744 }
1745 else
1746 {
1747 Menu(id);
1748 }
1749 }
1750
1751 menu_display(id, rMenu);
1752 return PLUGIN_HANDLED;
1753}
1754
1755public rMenuHandler(id, gMenu, item)
1756{
1757 if(item == MENU_EXIT)
1758 {
1759 menu_destroy(gMenu);
1760 return PLUGIN_CONTINUE;
1761 }
1762
1763 new data[9], name[64], Key;
1764 new access, callback;
1765 menu_item_getinfo(gMenu, item, access, data, charsmax(data), name, charsmax(name), callback);
1766
1767 Key = str_to_num(data);
1768
1769 switch(Key)
1770 {
1771 case 0: { RegMenu(id); }
1772 case 1: { client_cmd(id, "messagemode UserPassword"); RegMenu(id); }
1773 case 2:
1774 {
1775 if(strlen(Password[id]) >= MIN_PASSWORD_LENGTH)
1776 {
1777 copy(SavedPassword[id], 31, Password[id]);
1778 Loged[id] = true;
1779 gRegistered[id] = true;
1780 SaveData(id);
1781 print_color(id, "%L", LANG_PLAYER, "REGISTERSUCCESS", Prefix, Password[id]);
1782 UnsetBlack(id);
1783
1784 new szName[32]; get_user_name(id, szName, 31);
1785 log_errors("%s ivede slaptazodi [prisiregistravo]", szName);
1786 gWarnings[id] = 0;
1787
1788 return PLUGIN_CONTINUE;
1789 } else {
1790 print_color(id, "%L", LANG_PLAYER, "REGISTERSHORT", Prefix);
1791
1792 return PLUGIN_HANDLED;
1793 }
1794 //Menu(id);
1795 }
1796 case 3:
1797 {
1798 if(!Loged[id]) {
1799 gWarnings[id] = 0;
1800 Login(id);
1801 }
1802 }
1803 }
1804 return PLUGIN_CONTINUE;
1805}
1806
1807public PlayerPassword(id)
1808{
1809 if(Loged[id]) {
1810 return PLUGIN_HANDLED;
1811 }
1812
1813 new Data[32]; read_args(Data, 31); remove_quotes(Data);
1814
1815 if(strlen(Data) < MIN_PASSWORD_LENGTH)
1816 {
1817 print_color(id, "%L", LANG_PLAYER, "REGISTERSHORT", Prefix);
1818 client_cmd(id, "messagemode UserPassword");
1819 return PLUGIN_HANDLED;
1820 }
1821 else if(!equal(SavedPassword[id], Data) && strlen(Data) > MIN_PASSWORD_LENGTH && !equal(Password[id], Data))
1822 {
1823 print_color(id, "%L", LANG_PLAYER, "BAD_PASSWORD", Prefix);
1824 gWarnings[id]++;
1825
1826 if(gWarnings[id] >= 3) {
1827 gWarnings[id] = 0;
1828
1829 server_cmd("amx_ban 1440 #%d ^"Trying to hack other account!^"", get_user_userid(id));
1830 }
1831 }
1832
1833 copy(Password[id], 31, Data);
1834 RegMenu(id);
1835 return PLUGIN_CONTINUE;
1836}
1837
1838public NameChange(id)
1839{
1840 if(get_cvar_num("csgo_nick_show"))
1841 return FMRES_IGNORED;
1842
1843 if(!is_user_connected(id) || is_user_bot(id))
1844 return FMRES_IGNORED;
1845
1846 new OldName[32], NewName[32], Name[32];
1847 get_user_name(id, Name, 31);
1848 pev(id, pev_netname, OldName, charsmax(OldName));
1849 if(OldName[0])
1850 {
1851 get_user_info(id, "name", NewName, charsmax(NewName));
1852 if(!equal(OldName, NewName))
1853 {
1854 set_user_info(id, "name", OldName);
1855 print_color(id, "%L", LANG_PLAYER, "REGISTERNAMECHANGE", Prefix);
1856 return FMRES_HANDLED;
1857 }
1858 }
1859 return FMRES_IGNORED;
1860}
1861
1862public Registered(id)
1863{
1864 if(!is_user_connected(id) || is_user_bot(id))
1865 return;
1866
1867 static szQuery[256], iData[1]; iData[0] = id;
1868 formatex(szQuery, 255, "SELECT * FROM `%s` WHERE `username` = '%s'", TABLE_NAME, get_user_name_ex(id));
1869 SQL_ThreadQuery(g_hTuple, "QuerySelectReg", szQuery, iData, 1);
1870
1871 log_errors("[REGISTERED] %s", szQuery);
1872}
1873
1874public QuerySelectReg( iFailState, Handle:hQuery, szError[ ], iError, iData[ ], iDataSize, Float:fQueueTime )
1875{
1876 if(iFailState == TQUERY_CONNECT_FAILED || iFailState == TQUERY_QUERY_FAILED) { log_errors("[QuerySelectReg] %s", szError); return; }
1877 else
1878 {
1879 new id = iData[0];
1880 if(SQL_NumResults(hQuery))
1881 {
1882 gLogged[id] = true;
1883 gRegistered[id] = true;
1884
1885 new passfield[32], password[32];
1886 get_pcvar_string(csgo_password_field, passfield, 31);
1887 get_user_info(id, passfield, password, 31);
1888
1889 SQL_ReadResult(hQuery, 1, SavedPassword[id], 32);
1890
1891 if(equal(password, SavedPassword[id])) {
1892 Password[id] = password;
1893 }
1894
1895 new szName[32]; get_user_name(id, szName, 31);
1896 log_errors("[Registered] %s - %s", szName, (gRegistered[id]) ? "true" : "false");
1897 }
1898 else
1899 {
1900 gLogged[id] = true;
1901 gRegistered[id] = false;
1902
1903 new szName[32]; get_user_name(id, szName, 31);
1904 log_errors("[Founded REG] %s - %s", szName, (gRegistered[id]) ? "true" : "false");
1905 }
1906 }
1907}
1908
1909public cmdUniq(id)
1910{
1911 if(!Loged[id]) { RegMenu(id); return PLUGIN_HANDLED; }
1912
1913 new sMenu = menu_create("UNIQ skin parduotuve", "MenuHandlerUniq");
1914
1915 new szText[512], gItems = chestsChance[0][0];
1916
1917 for(new i; i < gItems; i++)
1918 {
1919 new gWeaponId = chestsList[0][0][i];
1920
1921 formatex(szText, charsmax(szText), "\r%s \w- \r20 000 \wtašku", WeaponNames[gWeaponId]);
1922 menu_additem(sMenu, szText, _, _, (Points[id] < 20000) ? -2 : -1);
1923 }
1924
1925 menu_setprop(sMenu, MPROP_EXIT, MEXIT_ALL);
1926 menu_display(id, sMenu);
1927
1928 return PLUGIN_CONTINUE;
1929}
1930
1931public MenuHandlerUniq(id, menu, item)
1932{
1933 if(item == MENU_EXIT)
1934 {
1935 menu_destroy(menu);
1936 return PLUGIN_HANDLED;
1937 }
1938
1939 if(Points[id] >= 20000)
1940 {
1941 new gWeaponId = chestsList[0][0][item];
1942 uWeapon[gWeaponId][id]++;
1943 Points[id] -= 20000;
1944 SaveData(id);
1945
1946 print_color(id, "!g%s !t%s !ynusipirko !g%s!", Prefix, get_user_name_ex(id), WeaponNames[gWeaponId]);
1947 }
1948 else {
1949 print_color(id, "!g%s !yNepakanka tašku!", Prefix);
1950 }
1951
1952 menu_destroy(menu);
1953 return PLUGIN_HANDLED;
1954}
1955
1956/*STOCK'S*/
1957stock drop_item(id, dropRate)
1958{
1959 if(dropRate >= random_float(0.0, 500.0) && get_playersnum() >= NEED_MIN_PLAYERS)
1960 {
1961 new szName[33], rNum, accesNum = get_access(id); get_user_name(id, szName, 32);
1962 rNum = random(CHEST_COUNT)+1;
1963
1964 static additional_chests; additional_chests = 0;
1965 if(!random(5) && accesNum)
1966 {
1967 additional_chests = random(((accesNum == 3) ? 4 : (accesNum == 2) ? 3 : 2));
1968
1969 if(additional_chests)
1970 {
1971 additional_chests++;
1972 print_color(0, "%L", LANG_PLAYER, "FOUNDCHESTS", Prefix, szName, additional_chests, chest_name(rNum));
1973 Chest[id][rNum] += additional_chests;
1974 }
1975 }
1976
1977 if(!additional_chests)
1978 {
1979 print_color(0, "%L", LANG_PLAYER, "FOUNDCHEST", Prefix, szName, chest_name(rNum));
1980 Chest[id][rNum]++;
1981 }
1982 SaveChests(id);
1983 }
1984}
1985
1986stock get_access(id)
1987{
1988 if(get_user_flags(id) & ACCESS_SADMIN) {
1989 return 3;
1990 } else if(get_user_flags(id) & ACCESS_ADMIN) {
1991 return 2;
1992 } else if(get_user_flags(id) & ACCESS_VIP) {
1993 return 1;
1994 }
1995
1996 return 0;
1997}
1998
1999stock chest_name(iNum)
2000{
2001 new szReturn[126];
2002
2003 switch(iNum)
2004 {
2005 case 1: { formatex(szReturn, charsmax(szReturn), "Huntsman"); }
2006 case 2: { formatex(szReturn, charsmax(szReturn), "Breakout"); }
2007 case 3: { formatex(szReturn, charsmax(szReturn), "Falchion"); }
2008 case 4: { formatex(szReturn, charsmax(szReturn), "Bravo"); }
2009 case 5: { formatex(szReturn, charsmax(szReturn), "Phoenix"); }
2010 case 6: { formatex(szReturn, charsmax(szReturn), "Vanguard"); }
2011 case 7: { formatex(szReturn, charsmax(szReturn), "Wildfire"); }
2012 case 8: { formatex(szReturn, charsmax(szReturn), "Shadow"); }
2013 case 9: { formatex(szReturn, charsmax(szReturn), "Gamma"); }
2014 }
2015
2016 return szReturn;
2017}
2018
2019stock screen_color(id)
2020{
2021 message_begin(MSG_ONE, g_msgid_ScreenFade, {0,0,0}, id);
2022 write_short(1<<10);
2023 write_short(1<<10);
2024 write_short(0x0000);
2025 write_byte(255);
2026 write_byte(0);
2027 write_byte(0);
2028 write_byte(75);
2029}
2030
2031stock ExplodeString(const string[], output[], olen = sizeof output)
2032{
2033 new len = strlen( string ); // We retrieve the length of the current string passed.
2034
2035 if ( !len ) { return 0; } // If the string is empty we stop there.
2036
2037 new i, c, j, count;
2038 new number[ 12 ];
2039
2040 do
2041 {
2042 while ( string[ i ] == ' ' ) i++; // One or more spaces can be used between 2 numbers, so we move forward until we find a number.
2043 while ( ( number[ j++ ] = c = string[ i++ ] ) && c != ' ' ) {} // We loop and save the number found until the next space found or end of string.
2044
2045 output[ count++ ] = str_to_num( number ); // We convert the number saved previously into a number and we stored in output at the slot count.
2046 j = 0;
2047 }
2048 while ( i < len && count < olen ); // We should looping while we have not cross the string length.
2049
2050 return count;
2051}
2052
2053stock get_user_name_ex(id)
2054{
2055 new szName[33];
2056 get_user_name(id, szName, charsmax(szName));
2057
2058 replace_all(szName, charsmax(szName), "'", "\'");
2059 replace_all(szName, charsmax(szName), "^"", "\^"");
2060 //replace_all(szName, charsmax(szName), ".", "");
2061
2062 return szName;
2063}
2064
2065stock print_color(const id, const input[], any:...)
2066{
2067 new Count = 1, Players[32];
2068 static Msg[191];
2069 vformat(Msg, 190, input, 3);
2070
2071 replace_all(Msg, 190, "!g", "^4");
2072 replace_all(Msg, 190, "!y", "^1");
2073 replace_all(Msg, 190, "!t", "^3");
2074
2075 if(id) Players[0] = id; else get_players(Players, Count, "ch");
2076 {
2077 for (new i = 0; i < Count; i++)
2078 {
2079 if (is_user_connected(Players[i]))
2080 {
2081 message_begin(MSG_ONE, get_user_msgid( "SayText" ), _, Players[i]);
2082 write_byte(Players[i]);
2083 write_string(Msg);
2084 message_end();
2085 }
2086 }
2087 }
2088 return PLUGIN_HANDLED;
2089}
2090
2091stock bool:ValidMdl(Mdl[]) {
2092 return (containi(Mdl, ".mdl") != -1) ? true : false;
2093}
2094
2095public UpdateStatusText(id)
2096{
2097 new szText[256], wId = get_user_weapon(id, _, _);
2098 if(bUsingGuns[id][wId])
2099 formatex(szText, charsmax(szText), "%L", LANG_PLAYER, "KILLS_SHOW", uWeaponKills[bUsingGuns[id][wId]][id], WeaponNames[bUsingGuns[id][wId]]);
2100 else
2101 formatex(szText, charsmax(szText), "%L", LANG_PLAYER, "BLANK");
2102
2103 set_hudmessage(255, 255, 255, 0.01, 0.94, 0, 6.0, 12.0, 0.1, 0.2, 78);
2104 ShowSyncHudMsg(id, g_msgid_SyncHud, szText);
2105}
2106
2107stock get_weapon_maxclip(wpnid = 0)
2108{
2109 for (new a = 0; a < sizeof (g_weapons); a++)
2110 if (wpnid == g_weapons[a])
2111 return g_max_clip[a];
2112
2113 return false;
2114}
2115
2116stock SetFullBpAmmo(id, iWeaponID)
2117{
2118 new iFullbpammo,iAmmoId;
2119
2120 for(new i = 1; i < AmmoIds; i++)
2121 {
2122 if(g_iAmmoWeaponSharedBitSum[i] & (1<<iWeaponID))
2123 {
2124 iAmmoId = i;
2125 iFullbpammo = g_iAmmoMax[i];
2126
2127 break;
2128 }
2129 }
2130
2131 if(!iAmmoId)
2132 return;
2133
2134 cs_set_user_bpammo(id, iWeaponID, iFullbpammo);
2135
2136 message_begin(MSG_ONE_UNRELIABLE, g_msgid_AmmoX, _, id);
2137 write_byte(iAmmoId);
2138 write_byte(iFullbpammo);
2139 message_end();
2140}
2141
2142stock has_user_weapon(id, iCswId, iSlot = 0)
2143{
2144 new iWeapon;
2145 if( !iSlot )
2146 {
2147 static const iWeaponsSlots[] = {
2148 -1,
2149 2, //CSW_P228
2150 -1,
2151 1, //CSW_SCOUT
2152 4, //CSW_HEGRENADE
2153 1, //CSW_XM1014
2154 5, //CSW_C4
2155 1, //CSW_MAC10
2156 1, //CSW_AUG
2157 4, //CSW_SMOKEGRENADE
2158 2, //CSW_ELITE
2159 2, //CSW_FIVESEVEN
2160 1, //CSW_UMP45
2161 1, //CSW_SG550
2162 1, //CSW_GALIL
2163 1, //CSW_FAMAS
2164 2, //CSW_USP
2165 2, //CSW_GLOCK18
2166 1, //CSW_AWP
2167 1, //CSW_MP5NAVY
2168 1, //CSW_M249
2169 1, //CSW_M3
2170 1, //CSW_M4A1
2171 1, //CSW_TMP
2172 1, //CSW_G3SG1
2173 4, //CSW_FLASHBANG
2174 2, //CSW_DEAGLE
2175 1, //CSW_SG552
2176 1, //CSW_AK47
2177 3, //CSW_KNIFE
2178 1 //CSW_P90
2179 };
2180 iSlot = iWeaponsSlots[iCswId];
2181 }
2182
2183 const XO_PLAYER = 5;
2184 const m_rgpPlayerItems_Slot0 = 367;
2185
2186 iWeapon = get_pdata_cbase(id, m_rgpPlayerItems_Slot0 + iSlot, XO_PLAYER);
2187
2188 const XO_WEAPON = 4;
2189 const m_pNext = 42;
2190 const m_iId = 43;
2191
2192 while( iWeapon > 0 )
2193 {
2194 if( get_pdata_int(iWeapon, m_iId, XO_WEAPON) == iCswId )
2195 return iWeapon;
2196
2197 iWeapon = get_pdata_cbase(iWeapon, m_pNext, XO_WEAPON);
2198 }
2199 return 0;
2200}
2201
2202stock SavePoints(id)
2203{
2204 if(Loged[id] && gRegistered[id] && gCanSave)
2205 {
2206 new szQuery[1024];
2207 formatex(szQuery, sizeof(szQuery), "UPDATE `%s` SET `kills` = '%d', `keys` = '%d', `points` = '%d' WHERE `username` = '%s';", TABLE_NAME, Kills[id], pKey[id], Points[id], get_user_name_ex(id));
2208 SQL_ThreadQuery(g_hTuple, "QuerySetData", szQuery);
2209
2210 log_errors("[SAVE POINTS] %s", szQuery);
2211 }
2212}
2213
2214stock SaveChests(id)
2215{
2216 if(Loged[id] && gRegistered[id] && gCanSave)
2217 {
2218 new szQuery[1024], szChests[128];
2219 for(new i; i <= CHEST_COUNT; i++) { format(szChests, sizeof(szChests), "%s%d ", szChests, Chest[id][i]); }
2220
2221 formatex(szQuery, sizeof(szQuery), "UPDATE `%s` SET `points` = '%d', `chests` = '%s' WHERE `username` = '%s';", TABLE_NAME, Points[id], szChests, get_user_name_ex(id));
2222 SQL_ThreadQuery(g_hTuple, "QuerySetData", szQuery);
2223
2224 log_errors("[SAVE CHESTS] %s", szQuery);
2225 }
2226}
2227
2228stock SaveKeys(id)
2229{
2230 if(Loged[id] && gRegistered[id] && gCanSave)
2231 {
2232 new szQuery[1024];
2233
2234 formatex(szQuery, sizeof(szQuery), "UPDATE `%s` SET `points` = '%d', `keys` = '%d' WHERE `username` = '%s';", TABLE_NAME, Points[id], pKey[id], get_user_name_ex(id));
2235 SQL_ThreadQuery(g_hTuple, "QuerySetData", szQuery);
2236
2237 log_errors("[SAVE KEYS] %s", szQuery);
2238 }
2239}
2240
2241stock SaveGunsKills(id)
2242{
2243 if(Loged[id] && gRegistered[id] && gCanSave)
2244 {
2245 new szQuery[1024], szKSkins[1024];
2246
2247 for(new i; i < MAX; i++) { format(szKSkins, sizeof(szKSkins), "%s%d ", szKSkins, uWeaponKills[i][id]); }
2248
2249 formatex(szQuery, charsmax(szQuery), "UPDATE `%s` SET `skins_kills` = '%s' WHERE `username` = '%s';", TABLE_NAME, szKSkins, get_user_name_ex(id));
2250 SQL_ThreadQuery(g_hTuple, "QuerySetData", szQuery);
2251
2252 log_errors("[SAVE GUNS KILLS] %s", szQuery);
2253 }
2254}
2255
2256stock log_errors(const szText[], any:...)
2257{
2258 static szMessage[256];
2259 vformat(szMessage, 256, szText, 2);
2260
2261 log_to_file(g_logfile, szMessage);
2262
2263 return PLUGIN_HANDLED;
2264}