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