· 5 years ago · Mar 18, 2020, 10:00 PM
1#include <amxmodx>
2#include <amxmisc>
3#include <cstrike>
4#include <fakemeta>
5#include <hamsandwich>
6
7#include <fun>
8#include <sqlx>
9#include <celltrie>
10
11#include <colorchat>
12
13#define PLUGIN "Call of Duty: MW Mod SQL"
14#define VERSION "1.1.0"
15#define AUTHOR "QTM_Peyote (edit Cypis)"
16
17#define MAX_WIELKOSC_NAZWY 32
18#define MAX_WIELKOSC_OPISU 256
19#define MAX_ILOSC_PERKOW 120
20#define MAX_ILOSC_KLAS 50
21
22#define STANDARDOWA_SZYBKOSC 250.0
23
24#define ZADANIE_POKAZ_INFORMACJE 672
25#define ZADANIE_POKAZ_REKLAME 768
26#define ZADANIE_USTAW_SZYBKOSC 832
27
28#define MAX_WIELKOSC_FRAKCJA 64
29
30#define MA_FRAKCJE 1
31
32#if defined MA_FRAKCJE
33new frakcja_klas[MAX_ILOSC_KLAS+1][MAX_WIELKOSC_FRAKCJA+1];
34new nazwa_klasy[MAX_ILOSC_KLAS+1][64];
35new nazwa_frakcji[MAX_ILOSC_KLAS+1][64];
36new klasid;
37#endif
38
39new const maxAmmo[31] = {0, 52, 0, 90, 1, 31, 1, 100, 90, 1, 120, 100, 100, 90, 90, 90, 100, 120, 30, 120, 200, 31, 90, 120,
40 90, 2, 35, 90, 90,0, 100};
41
42new MsgScreenfade;
43
44new SyncHudObj, SyncHudObj2;
45
46new cvar_doswiadczenie_za_zabojstwo,
47 cvar_doswiadczenie_za_obrazenia,
48 cvar_doswiadczenie_za_wygrana,
49 cvar_limit_poziomu,
50 cvar_proporcja_poziomu;
51
52new perk_zmieniony,
53 klasa_zmieniona;
54
55new nazwy_perkow[MAX_ILOSC_PERKOW+1][MAX_WIELKOSC_NAZWY+1],
56 opisy_perkow[MAX_ILOSC_PERKOW+1][MAX_WIELKOSC_OPISU+1],
57 max_wartosci_perkow[MAX_ILOSC_PERKOW+1],
58 min_wartosci_perkow[MAX_ILOSC_PERKOW+1],
59 pluginy_perkow[MAX_ILOSC_PERKOW+1],
60 ilosc_perkow;
61
62new nazwa_gracza[33][64],
63 klasa_gracza[33],
64 nowa_klasa_gracza[33],
65 poziom_gracza[33],
66 doswiadczenie_gracza[33],
67 perk_gracza[33],
68 wartosc_perku_gracza[33];
69
70new Float:maksymalne_zdrowie_gracza[33],
71 Float:szybkosc_gracza[33],
72 Float:redukcja_obrazen_gracza[33];
73
74new punkty_gracza[33],
75 zdrowie_gracza[33],
76 inteligencja_gracza[33],
77 wytrzymalosc_gracza[33],
78 kondycja_gracza[33];
79
80new bool:gracz_ma_tarcze[33],
81 bool:gracz_ma_noktowizor[33];
82
83new bonusowe_bronie_gracza[33],
84 bonusowe_zdrowie_gracza[33],
85 bonusowa_inteligencja_gracza[33],
86 bonusowa_wytrzymalosc_gracza[33],
87 bonusowa_kondycja_gracza[33];
88
89new bronie_klasy[MAX_ILOSC_KLAS+1],
90 zdrowie_klas[MAX_ILOSC_KLAS+1],
91 kondycja_klas[MAX_ILOSC_KLAS+1],
92 inteligencja_klas[MAX_ILOSC_KLAS+1],
93 wytrzymalosc_klas[MAX_ILOSC_KLAS+1],
94 nazwy_klas[MAX_ILOSC_KLAS+1][MAX_WIELKOSC_NAZWY+1],
95 opisy_klas[MAX_ILOSC_KLAS+1][MAX_WIELKOSC_OPISU+1],
96 pluginy_klas[MAX_ILOSC_KLAS+1],
97 ilosc_klas;
98
99new bronie_druzyny[] = {0, 1<<CSW_GLOCK18, 1<<CSW_USP},
100 bronie_dozwolone = 1<<CSW_KNIFE | 1<<CSW_C4;
101
102new bool:freezetime = true;
103
104public plugin_init()
105{
106 register_plugin(PLUGIN, VERSION, AUTHOR);
107
108 cvar_doswiadczenie_za_zabojstwo = register_cvar("cod_killxp", "150");
109 cvar_doswiadczenie_za_obrazenia = register_cvar("cod_damagexp", "10"); // ilosc doswiadczenia za 20 obrazen
110 cvar_doswiadczenie_za_wygrana = register_cvar("cod_winxp", "500");
111 cvar_limit_poziomu = register_cvar("cod_maxlevel", "401");
112 cvar_proporcja_poziomu = register_cvar("cod_levelratio", "35");
113
114 register_cvar("cod_sql_host", "mysql8.mydevil.net");
115 register_cvar("cod_sql_user", "m1542_testowanko");
116 register_cvar("cod_sql_pass", "Waflekokosowe1");
117 register_cvar("cod_sql_db", "m1542_testowanko");
118 register_cvar("cod_sql_table", "codmod_table");
119
120 register_clcmd("say /klasa", "WybierzKlase");
121 register_clcmd("say /class", "WybierzKlase");
122 register_clcmd("say /klasy", "OpisKlasy");
123 register_clcmd("say /classinfo", "OpisKlasy");
124 register_clcmd("say /perk", "KomendaOpisPerku");
125 register_clcmd("say /perki", "OpisPerkow");
126 register_clcmd("say /perks", "OpisPerkow");
127 register_clcmd("say /item", "Pomoc");
128 register_clcmd("say /przedmiot", "OpisPerku");
129 register_clcmd("say /drop", "WyrzucPerk");
130 register_clcmd("say /wyrzuc", "WyrzucPerk");
131 register_clcmd("say /reset", "KomendaResetujPunkty");
132 register_clcmd("say /statystyki", "PrzydzielPunkty");
133 register_clcmd("say /staty", "PrzydzielPunkty");
134 register_clcmd("say /pomoc", "Pomoc");
135 register_clcmd("useperk", "UzyjPerku");
136 register_clcmd("radio3", "UzyjPerku");
137 register_clcmd("fullupdate", "BlokujKomende");
138
139 register_clcmd("cl_autobuy", "BlokujKomende");
140 register_clcmd("cl_rebuy", "BlokujKomende");
141 register_clcmd("cl_setautobuy","BlokujKomende");
142 register_clcmd("rebuy", "BlokujKomende");
143 register_clcmd("autobuy", "BlokujKomende");
144 register_clcmd("hegren", "BlokujKomende");
145 register_clcmd("sgren", "BlokujKomende");
146 register_clcmd("flash", "BlokujKomende");
147
148 register_menucmd(register_menuid("Klasa:"), 1023, "OpisKlasy");
149
150 RegisterHam(Ham_TakeDamage, "player", "Obrazenia");
151 RegisterHam(Ham_TakeDamage, "player", "ObrazeniaPost", 1);
152 RegisterHam(Ham_Spawn, "player", "Odrodzenie", 1);
153 RegisterHam(Ham_Killed, "player", "SmiercGraczaPost", 1);
154
155 RegisterHam(Ham_Touch, "armoury_entity", "DotykBroni");
156 RegisterHam(Ham_Touch, "weapon_shield", "DotykTarczy");
157 RegisterHam(Ham_Touch, "weaponbox", "DotykBroni");
158
159 new WeaponName[24];
160 for(new i = CSW_P228; i <= CSW_P90; i++){
161 if(i == 2)
162 continue;
163
164 get_weaponname(i, WeaponName, 23);
165 RegisterHam(Ham_Item_Deploy, WeaponName, "Item_Deploy_Post", 1);
166 }
167 RegisterHam(get_player_resetmaxspeed_func(), "player", "CS_Player_ResetMaxSpeed_Post", 1);
168
169 register_forward(FM_CmdStart, "CmdStart");
170 register_forward(FM_EmitSound, "EmitSound");
171
172 register_logevent("PoczatekRundy", 2, "1=Round_Start");
173
174 register_event("Health", "MessageHealth", "be", "1!255");
175 register_event("SendAudio", "WygranaTerro" , "a", "2&%!MRAD_terwin");
176 register_event("SendAudio", "WygranaCT", "a", "2&%!MRAD_ctwin");
177 register_event("HLTV", "NowaRunda", "a", "1=0", "2=0");
178
179 MsgScreenfade = get_user_msgid("ScreenFade");
180
181 SyncHudObj = CreateHudSyncObj();
182 SyncHudObj2 = CreateHudSyncObj();
183
184 perk_zmieniony = CreateMultiForward("cod_perk_changed", ET_CONTINUE, FP_CELL, FP_CELL, FP_CELL);
185 klasa_zmieniona = CreateMultiForward("cod_class_changed", ET_CONTINUE, FP_CELL, FP_CELL);
186
187 copy(nazwy_perkow[0], MAX_WIELKOSC_NAZWY, "Brak");
188 copy(opisy_perkow[0], MAX_WIELKOSC_OPISU, "Zabij kogos, aby otrzymac przedmiot");
189 copy(nazwy_klas[0], MAX_WIELKOSC_NAZWY, "Brak");
190
191#if defined MA_FRAKCJE
192 loadfile();
193#endif
194}
195
196new Handle:hookSql;
197new Trie:ClassName;
198
199new lvl_klasy_gracza[33][MAX_ILOSC_KLAS];
200new xp_klasy_gracza[33][MAX_ILOSC_KLAS];
201new int_klasy_gracza[33][MAX_ILOSC_KLAS];
202new zdr_klasy_gracza[33][MAX_ILOSC_KLAS];
203new wyt_klasy_gracza[33][MAX_ILOSC_KLAS];
204new kon_klasy_gracza[33][MAX_ILOSC_KLAS];
205
206new bool:wczytane_dane[33];
207new gracz_zdobyl_expa[33];
208new Tabela[32];
209
210public plugin_cfg()
211{
212 new lokalizacja_cfg[33];
213 get_configsdir(lokalizacja_cfg, charsmax(lokalizacja_cfg));
214 server_cmd("exec %s/codmod.cfg", lokalizacja_cfg);
215 server_exec();
216
217 new DaneBazy[4][64];
218 get_cvar_string("cod_sql_host", DaneBazy[0], 63);
219 get_cvar_string("cod_sql_user", DaneBazy[1], 63);
220 get_cvar_string("cod_sql_pass", DaneBazy[2], 63);
221 get_cvar_string("cod_sql_db", DaneBazy[3], 63);
222
223 get_cvar_string("cod_sql_table", Tabela, 31);
224
225 hookSql = SQL_MakeDbTuple(DaneBazy[0], DaneBazy[1], DaneBazy[2], DaneBazy[3]);
226
227 new error, szError[128];
228 new Handle:hConn = SQL_Connect(hookSql, error, szError, 127);
229 if(error){
230 log_amx("Error: %s", szError);
231 return;
232 }
233 new szTemp[1024];
234 formatex(szTemp, charsmax(szTemp), "CREATE TABLE IF NOT EXISTS `%s` (name VARCHAR(35) NOT NULL, klasa VARCHAR(64) NOT NULL, xp INT UNSIGNED NOT NULL DEFAULT 1, level INT UNSIGNED NOT NULL DEFAULT 1, PRIMARY KEY(name, klasa), ", Tabela);
235 add(szTemp, charsmax(szTemp), "intelligence INT UNSIGNED NOT NULL DEFAULT 0, health INT UNSIGNED NOT NULL DEFAULT 0, strength INT UNSIGNED NOT NULL DEFAULT 0, stamina INT UNSIGNED NOT NULL DEFAULT 0)");
236
237 new Handle:query = SQL_PrepareQuery(hConn, szTemp);
238 SQL_Execute(query);
239 SQL_FreeHandle(query);
240 SQL_FreeHandle(hConn);
241}
242
243public plugin_end() {
244 SQL_FreeHandle(hookSql);
245}
246
247#if defined MA_FRAKCJE
248public loadfile()
249{
250 new file[256];
251 get_configsdir(file,charsmax(file));
252 formatex(file, charsmax(file), "%s/cod_frakcje.ini", file);
253
254 if(!file_exists(file))
255 return;
256
257 new row[128], trash, size=file_size(file,1);
258 for(new i=0;i<size;i++)
259 {
260 read_file(file, i, row, charsmax(row), trash);
261
262 if((contain(row,";")!=0) && strlen(row) && klasid<MAX_ILOSC_KLAS+1)
263 {
264 replace(row, charsmax(row), "[klasa]", "");
265 split(row, nazwa_klasy[klasid], charsmax(nazwa_klasy[]), nazwa_frakcji[klasid], charsmax(nazwa_frakcji[]), "[frakcja]");
266 klasid++;
267 }
268 }
269}
270#endif
271
272public plugin_precache()
273{
274 precache_sound("QTM_CodMod/select.wav");
275 precache_sound("QTM_CodMod/start.wav");
276 precache_sound("QTM_CodMod/start2.wav");
277 precache_sound("QTM_CodMod/levelup.wav");
278}
279
280public plugin_natives()
281{
282 ClassName = TrieCreate();
283 register_native("cod_set_user_xp", "UstawDoswiadczenie", 1);
284 register_native("cod_set_user_class", "UstawKlase", 1);
285 register_native("cod_set_user_perk", "UstawPerk", 1);
286 register_native("cod_set_user_bonus_health", "UstawBonusoweZdrowie", 1);
287 register_native("cod_set_user_bonus_intelligence", "UstawBonusowaInteligencje", 1);
288 register_native("cod_set_user_bonus_trim", "UstawBonusowaKondycje", 1);
289 register_native("cod_set_user_bonus_stamina", "UstawBonusowaWytrzymalosc", 1);
290
291 register_native("cod_get_user_xp", "PobierzDoswiadczenie", 1);
292 register_native("cod_get_user_level", "PobierzPoziom", 1);
293 register_native("cod_get_user_points", "PobierzPunkty", 1);
294 register_native("cod_get_user_class", "PobierzKlase", 1);
295
296 register_native("cod_get_user_health", "PobierzZdrowie", 1);
297 register_native("cod_get_user_intelligence", "PobierzInteligencje", 1);
298 register_native("cod_get_user_trim", "PobierzKondycje", 1);
299 register_native("cod_get_user_stamina", "PobierzWytrzymalosc", 1);
300
301 register_native("cod_get_level_xp", "PobierzDoswiadczeniePoziomu", 1);
302
303 register_native("cod_get_perkid", "PobierzPerkPrzezNazwe", 1);
304 register_native("cod_get_perks_num", "PobierzIloscPerkow", 1);
305 register_native("cod_get_perk_name", "PobierzNazwePerku", 1);
306 register_native("cod_get_perk_desc", "PobierzOpisPerku", 1);
307
308 register_native("cod_get_classid", "PobierzKlasePrzezNazwe", 1);
309 register_native("cod_get_classes_num", "PobierzIloscKlas", 1);
310 register_native("cod_get_class_name", "PobierzNazweKlasy", 1);
311 register_native("cod_get_class_desc", "PobierzOpisKlasy", 1);
312
313 register_native("cod_get_class_health", "PobierzZdrowieKlasy", 1);
314 register_native("cod_get_class_intelligence", "PobierzInteligencjeKlasy", 1);
315 register_native("cod_get_class_trim", "PobierzKondycjeKlasy", 1);
316 register_native("cod_get_class_stamina", "PobierzWytrzymaloscKlasy", 1);
317
318 register_native("cod_give_weapon", "DajBron", 1);
319 register_native("cod_take_weapon", "WezBron", 1);
320 register_native("cod_set_user_shield", "UstawTarcze", 1);
321 register_native("cod_set_user_nightvision", "UstawNoktowizor", 1);
322
323 register_native("cod_inflict_damage", "ZadajObrazenia", 1);
324
325 register_native("cod_get_user_perk", "PobierzPerk");
326 register_native("cod_register_perk", "ZarejestrujPerk");
327 register_native("cod_register_class", "ZarejestrujKlase");
328
329#if defined MA_FRAKCJE
330 register_native("cod_get_frakcja_name", "PobierzNazweFrakcji", 1);
331#endif
332}
333
334public CmdStart(id, uc_handle)
335{
336 if(!is_user_alive(id))
337 return FMRES_IGNORED;
338
339 new Float: velocity[3];
340 pev(id, pev_velocity, velocity);
341 new Float: speed = vector_length(velocity);
342 if(szybkosc_gracza[id] > speed*1.8)
343 set_pev(id, pev_flTimeStepSound, 300);
344
345 return FMRES_IGNORED;
346}
347
348public Odrodzenie(id)
349{
350 if(!task_exists(id+ZADANIE_POKAZ_INFORMACJE))
351 set_task(1.5, "PokazInformacje", id+ZADANIE_POKAZ_INFORMACJE, _, _, "b");
352
353 if(nowa_klasa_gracza[id])
354 UstawNowaKlase(id);
355
356 if(!klasa_gracza[id])
357 {
358 WybierzKlase(id);
359 return PLUGIN_CONTINUE;
360 }
361
362 DajBronie(id);
363 ZastosujAtrybuty(id);
364
365 if(punkty_gracza[id] > 0)
366 PrzydzielPunkty(id);
367
368 return PLUGIN_CONTINUE;
369}
370
371public UstawNowaKlase(id)
372{
373 new ret;
374
375 new forward_handle = CreateOneForward(pluginy_klas[klasa_gracza[id]], "cod_class_disabled", FP_CELL, FP_CELL);
376 ExecuteForward(forward_handle, ret, id, klasa_gracza[id]);
377 DestroyForward(forward_handle);
378
379 forward_handle = CreateOneForward(pluginy_klas[nowa_klasa_gracza[id]], "cod_class_enabled", FP_CELL, FP_CELL);
380 ExecuteForward(forward_handle, ret, id, nowa_klasa_gracza[id]);
381 DestroyForward(forward_handle);
382
383
384 if(ret == 4)
385 {
386 klasa_gracza[id] = 0;
387 return PLUGIN_CONTINUE;
388 }
389
390 ExecuteForward(klasa_zmieniona, ret, id, klasa_gracza[id]);
391
392 if(ret == 4)
393 {
394 klasa_gracza[id] = 0;
395 return PLUGIN_CONTINUE;
396 }
397
398 if(klasa_gracza[id])
399 ZapiszDane(id, 0);
400
401 klasa_gracza[id] = nowa_klasa_gracza[id];
402 nowa_klasa_gracza[id] = 0;
403 UstawPerk(id, perk_gracza[id], wartosc_perku_gracza[id], 0);
404
405 WczytajDane(id, klasa_gracza[id]);
406 return PLUGIN_CONTINUE;
407}
408
409public DajBronie(id)
410{
411 for(new i=1; i < 32; i++)
412 {
413 if((1<<i) & (bronie_klasy[klasa_gracza[id]] | bonusowe_bronie_gracza[id]))
414 {
415 new weaponname[22];
416 get_weaponname(i, weaponname, 21);
417 give_item(id, weaponname); //fm_give_item(id, weaponname);
418 }
419 }
420
421 if(gracz_ma_tarcze[id])
422 give_item(id, "weapon_shield"); //fm_give_item(id, "weapon_shield");
423
424 if(gracz_ma_noktowizor[id])
425 cs_set_user_nvg(id, 1);
426
427 new weapons[32];
428 new weaponsnum;
429 get_user_weapons(id, weapons, weaponsnum);
430 for(new i=0; i<weaponsnum; i++)
431 if(is_user_alive(id))
432 if(maxAmmo[weapons[i]] > 0)
433 cs_set_user_bpammo(id, weapons[i], maxAmmo[weapons[i]]);
434}
435
436public ZastosujAtrybuty(id)
437{
438 redukcja_obrazen_gracza[id] = 0.7*(1.0-floatpower(1.1, -0.112311341*PobierzWytrzymalosc(id, 1, 1, 1)));
439
440 maksymalne_zdrowie_gracza[id] = 100.0+PobierzZdrowie(id, 1, 1, 1);
441
442 szybkosc_gracza[id] = STANDARDOWA_SZYBKOSC+PobierzKondycje(id, 1, 1, 1)*1.3;
443
444 set_pev(id, pev_health, maksymalne_zdrowie_gracza[id]);
445}
446
447public PoczatekRundy()
448{
449 freezetime = false;
450 for(new id=0;id<=32;id++)
451 {
452 if(!is_user_alive(id))
453 continue;
454
455 Display_Fade(id, 1<<9, 1<<9, 1<<12, 0, 255, 70, 100);
456
457 set_task(0.1, "UstawSzybkosc", id+ZADANIE_USTAW_SZYBKOSC);
458
459 /*switch(get_user_team(id))
460 {
461 case 1: client_cmd(id, "spk QTM_CodMod/start2");
462 case 2: client_cmd(id, "spk QTM_CodMod/start");
463 }*/
464 }
465}
466
467public NowaRunda()
468 freezetime = true;
469
470public Obrazenia(this, idinflictor, idattacker, Float:damage, damagebits)
471{
472 if(!is_user_alive(idattacker))
473 return HAM_IGNORED;
474
475 if(get_user_team(this) == get_user_team(idattacker))
476 return HAM_IGNORED;
477
478 if(get_user_health(this) <= 1)
479 return HAM_IGNORED;
480
481 SetHamParamFloat(4, damage*(1.0-redukcja_obrazen_gracza[this]));
482
483 return HAM_IGNORED;
484}
485
486public ObrazeniaPost(id, idinflictor, attacker, Float:damage, damagebits)
487{
488 if(!is_user_connected(attacker) || !klasa_gracza[attacker])
489 return HAM_IGNORED;
490
491 if(get_user_team(id) != get_user_team(attacker))
492 {
493 new doswiadczenie_za_obrazenia = get_pcvar_num(cvar_doswiadczenie_za_obrazenia);
494 while(damage>20)
495 {
496 damage -= 20;
497 gracz_zdobyl_expa[attacker] += doswiadczenie_za_obrazenia;
498 }
499 }
500 SprawdzPoziom(attacker);
501 return HAM_IGNORED;
502}
503
504public SmiercGraczaPost(id, attacker, shouldgib)
505{
506 if(!is_user_connected(attacker))
507 return HAM_IGNORED;
508
509 if(get_user_team(id) != get_user_team(attacker) && klasa_gracza[attacker])
510 {
511 new doswiadczenie_za_zabojstwo = get_pcvar_num(cvar_doswiadczenie_za_zabojstwo);
512 new nowe_doswiadczenie = get_pcvar_num(cvar_doswiadczenie_za_zabojstwo);
513
514 if(poziom_gracza[id] > poziom_gracza[attacker])
515 nowe_doswiadczenie += (poziom_gracza[id]-poziom_gracza[attacker])*(doswiadczenie_za_zabojstwo/10);
516
517 if(!perk_gracza[attacker])
518 UstawPerk(attacker, -1, -1, 1);
519 gracz_zdobyl_expa[attacker] += nowe_doswiadczenie;
520 client_print(attacker, print_center, "+%i", nowe_doswiadczenie);
521 }
522
523 SprawdzPoziom(attacker);
524
525 return HAM_IGNORED;
526}
527
528public task_Wskrzes(id)
529 ExecuteHamB(Ham_CS_RoundRespawn, id-5641);
530
531public MessageHealth(id)
532{
533 if(read_data(1) > 255)
534 {
535 message_begin(MSG_ONE, get_user_msgid("Health"), {0,0,0}, id);
536 write_byte(255);
537 message_end();
538 }
539}
540
541public client_putinserver(id)
542{
543 for(new i=0; i<MAX_ILOSC_KLAS; i++)
544 {
545 lvl_klasy_gracza[id][i] = 1;
546 xp_klasy_gracza[id][i] = 0;
547 int_klasy_gracza[id][i] = 0;
548 zdr_klasy_gracza[id][i] = 0;
549 wyt_klasy_gracza[id][i] = 0;
550 kon_klasy_gracza[id][i] = 0;
551 }
552 gracz_zdobyl_expa[id] = 0;
553 wczytane_dane[id] = false;
554
555 UsunUmiejetnosci(id);
556
557 get_user_name(id, nazwa_gracza[id], 63);
558 replace_all(nazwa_gracza[id], 63, "'", "\'");
559 replace_all(nazwa_gracza[id], 63, "`", "\`");
560
561 new data[1], szTemp[256];
562 data[0] = id;
563 formatex(szTemp, 255, "SELECT * FROM `%s` WHERE name = '%s'", Tabela, nazwa_gracza[id]);
564 SQL_ThreadQuery(hookSql, "handleCacheDane", szTemp, data, 1);
565
566 UsunZadania(id);
567}
568
569public handleCacheDane(failstate, Handle:query, error[], errnum, data[], size)
570{
571 if(failstate != TQUERY_SUCCESS)
572 {
573 log_amx("<Query> Error: %s", error);
574 return;
575 }
576 new id = data[0];
577 if(!is_user_connected(id) && !is_user_connecting(id))
578 return;
579
580 new szClass[32], int;
581 while(SQL_MoreResults(query))
582 {
583 SQL_ReadResult(query, SQL_FieldNameToNum(query, "klasa"), szClass, 31);
584 TrieGetCell(ClassName, szClass, int);
585
586 lvl_klasy_gracza[id][int] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "level"));
587 xp_klasy_gracza[id][int] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "xp"));
588 int_klasy_gracza[id][int] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "intelligence"));
589 zdr_klasy_gracza[id][int] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "health"));
590 wyt_klasy_gracza[id][int] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "strength"));
591 kon_klasy_gracza[id][int] = SQL_ReadResult(query, SQL_FieldNameToNum(query, "stamina"));
592
593 SQL_NextRow(query);
594 }
595 wczytane_dane[id] = true;
596}
597
598public ZapiszDane(id, level)
599{
600 if(!klasa_gracza[id] || !wczytane_dane[id])
601 return;
602
603 new szTemp[1024];
604 formatex(szTemp, 1023, "UPDATE `%s` SET xp=(`xp` + %d), level=(`level` + %d), intelligence='%d', health='%d', strength='%d', stamina='%d' WHERE name='%s' AND klasa='%s'", Tabela,
605 gracz_zdobyl_expa[id], level, inteligencja_gracza[id],
606 zdrowie_gracza[id], wytrzymalosc_gracza[id], kondycja_gracza[id],
607 nazwa_gracza[id], nazwy_klas[klasa_gracza[id]]);
608
609 doswiadczenie_gracza[id] += gracz_zdobyl_expa[id];
610 gracz_zdobyl_expa[id] = 0;//wyzeruj expa po dodaniu do bazy zeby nie dawalo 2x tyle expa typowi
611
612 lvl_klasy_gracza[id][klasa_gracza[id]] = poziom_gracza[id];
613 xp_klasy_gracza[id][klasa_gracza[id]] = doswiadczenie_gracza[id];
614 int_klasy_gracza[id][klasa_gracza[id]] = inteligencja_gracza[id];
615 zdr_klasy_gracza[id][klasa_gracza[id]] = zdrowie_gracza[id];
616 wyt_klasy_gracza[id][klasa_gracza[id]] = wytrzymalosc_gracza[id];
617 kon_klasy_gracza[id][klasa_gracza[id]] = kondycja_gracza[id];
618
619 SQL_ThreadQuery(hookSql, "handleIgnore", szTemp);
620}
621
622public WczytajDane(id, klasa)
623{
624 if(!klasa || !wczytane_dane[id])
625 return;
626
627 gracz_zdobyl_expa[id] = 0;
628 poziom_gracza[id] = max(1, lvl_klasy_gracza[id][klasa]);
629 doswiadczenie_gracza[id] = xp_klasy_gracza[id][klasa];
630 inteligencja_gracza[id] = int_klasy_gracza[id][klasa];
631 zdrowie_gracza[id] = zdr_klasy_gracza[id][klasa];
632 wytrzymalosc_gracza[id] = wyt_klasy_gracza[id][klasa];
633 kondycja_gracza[id] = kon_klasy_gracza[id][klasa];
634
635 punkty_gracza[id] = (poziom_gracza[id]-1)*2-inteligencja_gracza[id]-zdrowie_gracza[id]-wytrzymalosc_gracza[id]-kondycja_gracza[id];
636 if(poziom_gracza[id] && !doswiadczenie_gracza[id])
637 {
638 doswiadczenie_gracza[id] = 1;
639 xp_klasy_gracza[id][klasa] = 1;
640 new szTemp[512];
641 formatex(szTemp, 511, "INSERT INTO `%s` (`name`, `klasa`) VALUES ('%s', '%s')", Tabela, nazwa_gracza[id], nazwy_klas[klasa]);
642 SQL_ThreadQuery(hookSql, "handleIgnore", szTemp);
643 }
644}
645
646public handleIgnore(failstate, Handle:query, error[], errnum, data[], size){
647 if(failstate != TQUERY_SUCCESS){
648 log_amx("<Query> Error: %s", error);
649 return;
650 }
651}
652
653public client_disconnect(id)
654{
655 ZapiszDane(id, 0);
656 UsunUmiejetnosci(id);
657 UsunZadania(id);
658}
659
660public UsunUmiejetnosci(id)
661{
662 nowa_klasa_gracza[id] = 0;
663 UstawNowaKlase(id);
664 klasa_gracza[id] = 0;
665 poziom_gracza[id] = 0;
666 doswiadczenie_gracza[id] = 0;
667 gracz_zdobyl_expa[id] = 0; //
668 punkty_gracza[id] = 0;
669 zdrowie_gracza[id] = 0;
670 inteligencja_gracza[id] = 0;
671 wytrzymalosc_gracza[id] = 0;
672 kondycja_gracza[id] = 0;
673 bonusowe_zdrowie_gracza[id] = 0;
674 bonusowa_wytrzymalosc_gracza[id] = 0;
675 bonusowa_inteligencja_gracza[id] = 0;
676 bonusowa_kondycja_gracza[id] = 0;
677 maksymalne_zdrowie_gracza[id] = 0.0;
678 szybkosc_gracza[id] = 0.0;
679
680 UstawPerk(id, 0, 0, 0);
681}
682
683public UsunZadania(id)
684{
685 remove_task(id+ZADANIE_POKAZ_INFORMACJE);
686 remove_task(id+ZADANIE_POKAZ_REKLAME);
687 remove_task(id+ZADANIE_USTAW_SZYBKOSC);
688}
689
690public WygranaTerro()
691 WygranaRunda("TERRORIST");
692
693public WygranaCT()
694 WygranaRunda("CT");
695
696public WygranaRunda(const Team[])
697{
698 new Players[32], playerCount, id;
699 get_players(Players, playerCount, "aeh", Team);
700 new doswiadczenie_za_wygrana = get_pcvar_num(cvar_doswiadczenie_za_wygrana);
701
702 if(get_playersnum() < 3)
703 return;
704
705 for (new i=0; i<playerCount; i++)
706 {
707 id = Players[i];
708 if(!klasa_gracza[id])
709 continue;
710
711 gracz_zdobyl_expa[id] += doswiadczenie_za_wygrana;
712 ColorChat(id, GREEN, "^x01[^x04 COD^x01 ] Dostales %i doswiadczenia za wygrana runde.", doswiadczenie_za_wygrana);
713 SprawdzPoziom(id);
714 }
715}
716
717public KomendaOpisPerku(id)
718 OpisPerku(id, perk_gracza[id], wartosc_perku_gracza[id]);
719
720public OpisPerku(id, perk, wartosc)
721{
722 new opis_perku[MAX_WIELKOSC_OPISU];
723 new losowa_wartosc[15];
724 if(wartosc > -1)
725 num_to_str(wartosc, losowa_wartosc, 14);
726 else
727 format(losowa_wartosc, charsmax(losowa_wartosc), "%i-%i", min_wartosci_perkow[perk], max_wartosci_perkow[perk]);
728
729 format(opis_perku, charsmax(opis_perku), opisy_perkow[perk]);
730 replace_all(opis_perku, charsmax(opis_perku), "LW", losowa_wartosc);
731
732 ColorChat(id, GREEN, "^x01[^x04 COD^x01 ] Perk:^x03 %s.", nazwy_perkow[perk]);
733 ColorChat(id, GREEN, "^x01[^x04 COD^x01 ] Opis:^x03 %s.", opis_perku);
734}
735
736public OpisPerkow(id) {
737 OpisPerkowPage(id, 0);
738}
739
740public OpisPerkowPage(id, page)
741{
742 new menu = menu_create("\d[ \yWybierz Perk \d]", "OpisPerkow_Handle");
743 for(new i=1; i <= ilosc_perkow; i++)
744 menu_additem(menu, nazwy_perkow[i]);
745 menu_setprop(menu, MPROP_EXITNAME, "Wyjdz");
746 menu_setprop(menu, MPROP_BACKNAME, "Poprzednia strona");
747 menu_setprop(menu, MPROP_NEXTNAME, "Nastepna strona");
748 menu_display(id, menu, page);
749 /*client_cmd(id, "spk QTM_CodMod/select");*/
750}
751
752public OpisPerkow_Handle(id, menu, item)
753{
754 if(item++ == MENU_EXIT)
755 {
756 menu_destroy(menu);
757 return PLUGIN_CONTINUE;
758 }
759 OpisPerku(id, item, -1);
760 OpisPerkowPage(id, item/7);
761 return PLUGIN_CONTINUE;
762}
763
764public OpisKlasy(id)
765{
766 new menu = menu_create("\d[ \yWybierz klase \d]", "OpisKlasy_Handle");
767 for(new i=1; i <= ilosc_klas; i++)
768 menu_additem(menu, nazwy_klas[i]);
769 menu_setprop(menu, MPROP_EXITNAME, "Wyjdz");
770 menu_setprop(menu, MPROP_BACKNAME, "Poprzednia strona");
771 menu_setprop(menu, MPROP_NEXTNAME, "Nastepna strona");
772 menu_display(id, menu);
773
774 /*client_cmd(id, "spk QTM_CodMod/select");*/
775}
776
777public OpisKlasy_Handle(id, menu, item)
778{
779 /*client_cmd(id, "spk QTM_CodMod/select");*/
780
781 if(item++ == MENU_EXIT)
782 {
783 menu_destroy(menu);
784 return PLUGIN_CONTINUE;
785 }
786
787 new bronie[320];
788 for(new i=1, n=1; i <= 32; i++)
789 {
790 if((1<<i) & bronie_klasy[item])
791 {
792 new weaponname[22];
793 get_weaponname(i, weaponname, 21);
794 replace_all(weaponname, 21, "weapon_", " ");
795 if(n > 1)
796 add(bronie, charsmax(bronie), ",");
797 add(bronie, charsmax(bronie), weaponname);
798 n++;
799 }
800 }
801
802 new opis[416+MAX_WIELKOSC_OPISU];
803 format(opis, charsmax(opis), "\w[ \yKlasa: \w%s ]^n^n\yInteligencja: \w%i^n\yZdrowie: \w%i^n\yWytrzymalosc: \w%i^n\yKondycja: \w%i^n^n\yBronie:\w%s^n^n\yDodatkowy opis: \w%s^n%s", nazwy_klas[item], inteligencja_klas[item], zdrowie_klas[item], wytrzymalosc_klas[item], kondycja_klas[item], bronie, opisy_klas[item], opisy_klas[item][79]);
804 show_menu(id, 1023, opis);
805
806 return PLUGIN_CONTINUE;
807}
808
809public WybierzKlase(id)
810{
811 if(!wczytane_dane[id])
812 {
813 ColorChat(id, GREEN, "^x01[^x04 COD^x01 ] Trwa wczytywanie twoich klas ...");
814 return;
815 }
816
817 lvl_klasy_gracza[id][klasa_gracza[id]] = poziom_gracza[id];
818
819#if defined MA_FRAKCJE
820 new menu = menu_create("\d[ \yWybierz klase \d]", "WybierzKlase_Frakcje");
821 for(new i=1; i <= ilosc_klas; i++)
822 {
823 if(!is_in_previous(frakcja_klas[i],i))
824 {
825 menu_additem(menu,frakcja_klas[i],frakcja_klas[i])
826 }
827 }
828#else
829 new klasa[50], szTmp[5], menu = menu_create("\d[ \yWybierz klase \d]", "WybierzKlase_Handle");
830 for(new i=1; i <= ilosc_klas; i++)
831 {
832 formatex(klasa, charsmax(klasa), "%s \d[ \yPoziom: \r%i \d]", nazwy_klas[i], lvl_klasy_gracza[id][i]);
833 num_to_str(i, szTmp, charsmax(szTmp));
834 menu_additem(menu, klasa, szTmp);
835 }
836#endif
837
838 menu_setprop(menu, MPROP_EXITNAME, "Wyjdz");
839 menu_setprop(menu, MPROP_BACKNAME, "Poprzednia strona");
840 menu_setprop(menu, MPROP_NEXTNAME, "Nastepna strona");
841 menu_display(id, menu);
842}
843
844#if defined MA_FRAKCJE
845public WybierzKlase_Frakcje(id, menu, item)
846{
847 if(item == MENU_EXIT){
848 menu_destroy(menu);
849 return PLUGIN_CONTINUE;
850 }
851
852 new data[65], iName[64]
853 new acces, callback
854 menu_item_getinfo(menu, item, acces, data,64, iName, 63, callback)
855
856 new menu2 = menu_create("\d[ \yWybierz klase \d]", "WybierzKlase_Handle");
857
858 new klasa[50],szTmp[5];
859 for(new i=1; i <= ilosc_klas; i++)
860 {
861 if(equali(data,frakcja_klas[i])){
862 formatex(klasa, charsmax(klasa), "%s \d[ \yPoziom: \r%i \d]", nazwy_klas[i], lvl_klasy_gracza[id][i]);
863 num_to_str(i,szTmp,charsmax(szTmp));
864 menu_additem(menu2, klasa, szTmp);
865 }
866 }
867
868 menu_setprop(menu2, MPROP_EXITNAME, "Wyjdz");
869 menu_setprop(menu2, MPROP_BACKNAME, "Poprzednia strona");
870 menu_setprop(menu2, MPROP_NEXTNAME, "Nastepna strona");
871 menu_display(id, menu2);
872
873 /*client_cmd(id, "spk QTM_CodMod/select");*/
874
875 menu_destroy(menu);
876 return PLUGIN_CONTINUE;
877}
878#endif
879
880public WybierzKlase_Handle(id, menu, item)
881{
882 /*client_cmd(id, "spk QTM_CodMod/select");*/
883
884 if(item == MENU_EXIT)
885 {
886 menu_destroy(menu);
887 return PLUGIN_CONTINUE;
888 }
889
890 new data[65], iName[64]
891 new acces, callback
892 menu_item_getinfo(menu, item, acces, data,64, iName, 63, callback)
893
894 item = str_to_num(data);
895 if(item == klasa_gracza[id] && !nowa_klasa_gracza[id])
896 return PLUGIN_CONTINUE;
897
898 nowa_klasa_gracza[id] = item;
899
900 if(klasa_gracza[id])
901 ColorChat(id, GREEN, "^x01[^x04 COD^x01 ] Klasa zostanie zmieniona w nastepnej rundzie.");
902 else
903 {
904 UstawNowaKlase(id);
905 DajBronie(id);
906 ZastosujAtrybuty(id);
907 }
908 return PLUGIN_CONTINUE;
909}
910
911#if defined MA_FRAKCJE
912public bool:is_in_previous(frakcja[],from){
913 for(new i = from - 1;i>=1;i--){
914 if(equali(frakcja_klas[i],frakcja)){
915 return true;
916 }
917 }
918 return false;
919}
920#endif
921
922new const co_ile[] = { 1, 4, 8, 16, 24, -1 }; // Wlasnie tutaj zmieniamy co ile maja rosnac punkty.
923new szybkosc_rozdania[33];
924
925public PrzydzielPunkty(id) {
926 PrzydzielPunktyPage(id, 0);
927}
928
929public PrzydzielPunktyPage(id, page)
930{
931 new szybkosc[60];
932 new inteligencja[65];
933 new zdrowie[60];
934 new wytrzymalosc[60];
935 new kondycja[60];
936 new tytul[25];
937
938 if(co_ile[szybkosc_rozdania[id]] == -1)
939 format(szybkosc, charsmax(szybkosc), "Ile dodawac: \rwszystko \y(Ile pkt dodac do statow)");
940 else
941 format(szybkosc, charsmax(szybkosc), "Ile dodawac: \r%d \y(Ile pkt dodac do statow)", co_ile[szybkosc_rozdania[id]]);
942
943 format(inteligencja, charsmax(inteligencja), "Inteligencja: \r%i \y(Zwieksza sile perkow i umiejetnosci klasy)", PobierzInteligencje(id, 1, 1, 1));
944 format(zdrowie, charsmax(zdrowie), "Zdrowie: \r%i \y(Zwieksza zdrowie)", PobierzZdrowie(id, 1, 1, 1));
945 format(wytrzymalosc, charsmax(wytrzymalosc), "Wytrzymalosc: \r%i \y(Zmniejsza obrazenia)", PobierzWytrzymalosc(id, 1, 1, 1));
946 format(kondycja, charsmax(kondycja), "Kondycja: \r%i \y(Zwieksza tempo chodu)", PobierzKondycje(id, 1, 1, 1));
947 format(tytul, charsmax(tytul), "Przydziel Punkty(%i):", punkty_gracza[id]);
948
949 new menu = menu_create(tytul, "PrzydzielPunkty_Handler");
950
951 menu_additem(menu, szybkosc);
952 menu_addblank(menu, 0);
953 menu_additem(menu, inteligencja);
954 menu_additem(menu, zdrowie);
955 menu_additem(menu, wytrzymalosc);
956 menu_additem(menu, kondycja);
957 menu_setprop(menu, MPROP_EXIT, 0);
958 menu_display(id, menu, page);
959}
960
961public PrzydzielPunkty_Handler(id, menu, item) {
962 /*client_cmd(id, "spk QTM_CodMod/select");*/
963
964 if(item == MENU_EXIT) {
965 menu_destroy(menu);
966 return PLUGIN_CONTINUE;
967 }
968
969 if(punkty_gracza[id] < 1)
970 return PLUGIN_CONTINUE;
971
972 new limit_poziomu = get_pcvar_num(cvar_limit_poziomu);
973 new ilosc = (co_ile[szybkosc_rozdania[id]] > punkty_gracza[id]) ? punkty_gracza[id] : co_ile[szybkosc_rozdania[id]]
974
975 switch(item) {
976 case 0: {
977 if(szybkosc_rozdania[id] < charsmax(co_ile))
978 szybkosc_rozdania[id]++;
979 else
980 szybkosc_rozdania[id] = 0;
981 }
982 case 1: {
983 if(inteligencja_gracza[id] < limit_poziomu/2) {
984
985 if(ilosc > limit_poziomu/2 - inteligencja_gracza[id])
986 ilosc = limit_poziomu/2 - inteligencja_gracza[id];
987
988 inteligencja_gracza[id]+=ilosc;
989 punkty_gracza[id]-=ilosc;
990
991 }
992 else
993 ColorChat(id, GREEN, "^x01[^x04 COD^x01 ] Maxymalny poziom inteligencji osiagniety");
994 }
995 case 2: {
996 if(zdrowie_gracza[id] < limit_poziomu/2) {
997 if(ilosc > limit_poziomu/2 - zdrowie_gracza[id])
998 ilosc = limit_poziomu/2 - zdrowie_gracza[id];
999
1000 zdrowie_gracza[id]+=ilosc;
1001 punkty_gracza[id]-=ilosc;
1002 }
1003 else
1004 ColorChat(id, GREEN, "^x01[^x04 COD^x01 ] Maxymalny poziom sily osiagniety");
1005 }
1006 case 3: {
1007 if(wytrzymalosc_gracza[id] < limit_poziomu/2) {
1008 if(ilosc > limit_poziomu/2 - wytrzymalosc_gracza[id])
1009 ilosc = limit_poziomu/2 - wytrzymalosc_gracza[id];
1010
1011 wytrzymalosc_gracza[id]+=ilosc;
1012 punkty_gracza[id]-=ilosc;
1013 }
1014 else
1015 ColorChat(id, GREEN, "^x01[^x04 COD^x01 ] Maxymalny poziom zrecznosci osiagniety");
1016
1017 }
1018 case 4: {
1019 if(kondycja_gracza[id] < limit_poziomu/2) {
1020
1021 if(ilosc > limit_poziomu/2 - kondycja_gracza[id])
1022 ilosc = limit_poziomu/2 - kondycja_gracza[id];
1023
1024 kondycja_gracza[id]+=ilosc;
1025 punkty_gracza[id]-=ilosc;
1026 }
1027 else
1028 ColorChat(id, GREEN, "^x01[^x04 COD^x01 ] Maxymalny poziom kondycji osiagniety");
1029 }
1030 }
1031
1032 if(punkty_gracza[id] > 0)
1033 PrzydzielPunktyPage(id, item/7);
1034
1035 return PLUGIN_CONTINUE;
1036}
1037
1038public KomendaResetujPunkty(id)
1039{
1040 ColorChat(id, GREEN, "^x01[^x04 COD^x01 ] Umiejetnosci zostana zresetowane.");
1041 /*client_cmd(id, "spk QTM_CodMod/select");*/
1042
1043 ResetujPunkty(id);
1044}
1045
1046public ResetujPunkty(id)
1047{
1048 punkty_gracza[id] = (poziom_gracza[id]-1)*2;
1049 inteligencja_gracza[id] = 0;
1050 zdrowie_gracza[id] = 0;
1051 kondycja_gracza[id] = 0;
1052 wytrzymalosc_gracza[id] = 0;
1053
1054 if(punkty_gracza[id])
1055 PrzydzielPunkty(id);
1056}
1057
1058public DotykBroni(weapon, id)
1059{
1060 if(!is_user_connected(id))
1061 return HAM_IGNORED;
1062
1063 static model[23];
1064 pev(weapon, pev_model, model, 22);
1065 if(containi(model, "w_backpack") != -1)
1066 return HAM_IGNORED;
1067
1068 static team; team = get_user_team(id);
1069 if(team > 2)
1070 return HAM_IGNORED;
1071
1072 pev(weapon, pev_classname, model, 2);
1073 static bron; bron = ((model[0] == 'a')? cs_get_armoury_type(weapon): cs_get_weaponbox_type(weapon));
1074
1075 static bronie; bronie = (bronie_klasy[klasa_gracza[id]] | bonusowe_bronie_gracza[id] | bronie_druzyny[team] | bronie_dozwolone);
1076 if((1<<bron) & bronie)
1077 return HAM_IGNORED;
1078
1079 return HAM_SUPERCEDE;
1080}
1081
1082public DotykTarczy(weapon, id)
1083{
1084 if(!is_user_connected(id))
1085 return HAM_IGNORED;
1086
1087 if(gracz_ma_tarcze[id])
1088 return HAM_IGNORED;
1089
1090 return HAM_SUPERCEDE;
1091}
1092
1093public Item_Deploy_Post(ent)
1094{
1095 static id; id = get_pdata_cbase(ent, 41, 4);
1096 if(!is_user_alive(id))
1097 return;
1098
1099 static team; team = get_user_team(id);
1100 if(team > 2)
1101 return;
1102
1103 static bron; bron = cs_get_weapon_id(ent);
1104 if(!((1<<bron) & (bronie_klasy[klasa_gracza[id]] | bonusowe_bronie_gracza[id] | bronie_druzyny[team] | bronie_dozwolone)))
1105 {
1106 new weaponname[24];
1107 get_weaponname(bron, weaponname, 23);
1108 engclient_cmd(id, "drop", weaponname);
1109 }
1110 if(cs_get_user_shield(id) && !gracz_ma_tarcze[id])
1111 engclient_cmd(id, "drop", "weapon_shield");
1112}
1113
1114public CS_Player_ResetMaxSpeed_Post(id)
1115{
1116 if(!is_user_alive(id))
1117 return;
1118
1119 UstawSzybkosc(id);
1120}
1121
1122public EmitSound(id, iChannel, szSound[], Float:fVol, Float:fAttn, iFlags, iPitch )
1123{
1124 if(!is_user_alive(id))
1125 return FMRES_IGNORED;
1126
1127 if(equal(szSound, "common/wpn_denyselect.wav"))
1128 {
1129 new forward_handle = CreateOneForward(pluginy_klas[klasa_gracza[id]], "cod_class_skill_used", FP_CELL);
1130 ExecuteForward(forward_handle, id, id);
1131 DestroyForward(forward_handle);
1132 return FMRES_SUPERCEDE;
1133 }
1134
1135 if(equal(szSound, "items/ammopickup2.wav"))
1136 {
1137 cs_set_user_armor(id, 0, CS_ARMOR_NONE);
1138 return FMRES_SUPERCEDE;
1139 }
1140
1141 if(equal(szSound, "items/equip_nvg.wav") && !gracz_ma_noktowizor[id])
1142 {
1143 cs_set_user_nvg(id, 0);
1144 return FMRES_SUPERCEDE;
1145 }
1146
1147 return FMRES_IGNORED;
1148}
1149
1150public UzyjPerku(id)
1151{
1152 if(!is_user_alive(id))
1153 return PLUGIN_HANDLED;
1154
1155 new forward_handle = CreateOneForward(pluginy_perkow[perk_gracza[id]], "cod_perk_used", FP_CELL);
1156 ExecuteForward(forward_handle, id, id);
1157 DestroyForward(forward_handle);
1158 return PLUGIN_HANDLED;
1159}
1160
1161public SprawdzPoziom(id)
1162{
1163 if(!is_user_connected(id) || !klasa_gracza[id])
1164 return;
1165
1166 new limit_poziomu = get_pcvar_num(cvar_limit_poziomu);
1167
1168 new zdobyl_poziom = 0;
1169
1170 while((gracz_zdobyl_expa[id]+doswiadczenie_gracza[id]) >= PobierzDoswiadczeniePoziomu(poziom_gracza[id]) && poziom_gracza[id] < limit_poziomu)
1171 {
1172 poziom_gracza[id]++;
1173 zdobyl_poziom++;
1174 }
1175
1176 if(!zdobyl_poziom)
1177 {
1178 while((gracz_zdobyl_expa[id]+doswiadczenie_gracza[id]) < PobierzDoswiadczeniePoziomu(poziom_gracza[id]-1))
1179 {
1180 poziom_gracza[id]--;
1181 zdobyl_poziom--;
1182 }
1183 }
1184
1185 if(poziom_gracza[id] > limit_poziomu)
1186 {
1187 poziom_gracza[id] = limit_poziomu;
1188 ResetujPunkty(id);
1189 }
1190
1191 if(!zdobyl_poziom)
1192 return;
1193
1194 if(zdobyl_poziom)
1195 {
1196 punkty_gracza[id] = (poziom_gracza[id]-1)*2-inteligencja_gracza[id]-zdrowie_gracza[id]-wytrzymalosc_gracza[id]-kondycja_gracza[id];
1197
1198 set_hudmessage(212, 255, 85, 0.31, 0.32, 0, 6.0, 5.0);
1199 ShowSyncHudMsg(id, SyncHudObj2,"Awansowales do %i poziomu!", poziom_gracza[id]);
1200 /*client_cmd(id, "spk QTM_CodMod/levelup");*/
1201 }
1202 else
1203 {
1204 ResetujPunkty(id);
1205 set_hudmessage(212, 255, 85, 0.31, 0.32, 0, 6.0, 5.0);
1206 ShowSyncHudMsg(id, SyncHudObj2,"Spadles do %i poziomu!", poziom_gracza[id]);
1207 }
1208 ZapiszDane(id, zdobyl_poziom);
1209}
1210
1211public PokazInformacje(id)
1212{
1213 id -= ZADANIE_POKAZ_INFORMACJE;
1214
1215 if(!is_user_connected(id))
1216 {
1217 remove_task(id+ZADANIE_POKAZ_INFORMACJE);
1218 return PLUGIN_CONTINUE;
1219 }
1220
1221 if(!is_user_alive(id))
1222 {
1223 new target = pev(id, pev_iuser2);
1224
1225 if(!target)
1226 return PLUGIN_CONTINUE;
1227 new ileMa = doswiadczenie_gracza[target],ilePotrzeba = PobierzDoswiadczeniePoziomu(poziom_gracza[target]),ilePotrzebaBylo = poziom_gracza[target]-1 >= 0 ? PobierzDoswiadczeniePoziomu(poziom_gracza[target]-1) : 0;
1228 new Float:fProcent = 0.0;
1229 fProcent = (float((ileMa - ilePotrzebaBylo)) / float((ilePotrzeba - ilePotrzebaBylo))) * 100.0;
1230
1231 set_hudmessage(255, 255, 255, 0.6, -1.0, 0, 0.0, 1.5, 0.0, 0.0, 2);
1232 ShowSyncHudMsg(id, SyncHudObj, "Forum serwera: GreenHaze.pl^nKlasa : %s^nPoziom : %i (%0.1f%%)^nPerk : %s", nazwy_klas[klasa_gracza[target]], poziom_gracza[target], fProcent, nazwy_perkow[perk_gracza[target]]);
1233 return PLUGIN_CONTINUE;
1234 }
1235 new ileMa = doswiadczenie_gracza[id],ilePotrzeba = PobierzDoswiadczeniePoziomu(poziom_gracza[id]),ilePotrzebaBylo = poziom_gracza[id]-1 >= 0 ?PobierzDoswiadczeniePoziomu(poziom_gracza[id]-1) : 0
1236 new Float:fProcent = 0.0;
1237 fProcent = (float((ileMa - ilePotrzebaBylo)) / float((ilePotrzeba - ilePotrzebaBylo))) * 100.0;
1238
1239 set_hudmessage(0, 255, 0, 0.02, 0.23, 0, 0.0, 1.5, 0.0, 0.0);
1240 ShowSyncHudMsg(id, SyncHudObj, "[Forum: GreenHaze.PL]^n[Klasa : %s]^n[Poziom : %i (%0.1f%%)]^n[Perk : %s]^n[VIP: %s]", nazwy_klas[klasa_gracza[id]], poziom_gracza[id], fProcent, nazwy_perkow[perk_gracza[id]], get_user_flags(id) & ADMIN_LEVEL_H ? "Tak" : "Nie");
1241
1242 return PLUGIN_CONTINUE;
1243}
1244
1245public Pomoc(id)
1246 show_menu(id, 1023, "\y/reset\w - resetuje statystyki^n\y/statystyki\w - wyswietla statystyki^n\y/klasa\w - uruchamia menu wyboru klas^n\y/wyrzuc\w - wyrzuca perk^n\y/perk\w - pokazuje opis twojego perku^n\y/klasy\w - pokazuje opisy klas^n\y+use\w - Uzycie umiejetnosci klasy^n\yradio3\w (standardowo C) lub \yuseperk\w - Uzycie perku", -1, "Pomoc");
1247
1248public UstawSzybkosc(id)
1249{
1250 id -= id>32? ZADANIE_USTAW_SZYBKOSC: 0;
1251
1252 if(klasa_gracza[id] && !freezetime)
1253 set_pev(id, pev_maxspeed, szybkosc_gracza[id]);
1254}
1255
1256public WyrzucPerk(id)
1257{
1258 if(perk_gracza[id])
1259 {
1260 ColorChat(id, GREEN, "^x01[^x04 COD^x01 ] Wyrzuciles %s.", nazwy_perkow[perk_gracza[id]]);
1261 UstawPerk(id, 0, 0, 0);
1262 }
1263 else
1264 ColorChat(id, GREEN, "^x01[^x04 COD^x01 ] Nie masz zadnego perku.");
1265}
1266
1267public UstawPerk(id, perk, wartosc, pokaz_info)
1268{
1269 if(!ilosc_perkow)
1270 return PLUGIN_CONTINUE;
1271
1272 static obroty[33];
1273
1274 if(obroty[id]++ >= 5)
1275 {
1276 UstawPerk(id, 0, 0, 0);
1277 obroty[id] = 0;
1278 return PLUGIN_CONTINUE;
1279 }
1280
1281 perk = (perk == -1)? random_num(1, ilosc_perkow): perk;
1282 wartosc = (wartosc == -1 || min_wartosci_perkow[perk] > wartosc || wartosc > max_wartosci_perkow[perk])? random_num(min_wartosci_perkow[perk], max_wartosci_perkow[perk]): wartosc;
1283
1284 new ret;
1285
1286 new forward_handle = CreateOneForward(pluginy_perkow[perk_gracza[id]], "cod_perk_disabled", FP_CELL, FP_CELL);
1287 ExecuteForward(forward_handle, ret, id, perk);
1288 DestroyForward(forward_handle);
1289
1290 perk_gracza[id] = 0;
1291
1292 forward_handle = CreateOneForward(pluginy_perkow[perk], "cod_perk_enabled", FP_CELL, FP_CELL, FP_CELL);
1293 ExecuteForward(forward_handle, ret, id, wartosc, perk);
1294 DestroyForward(forward_handle);
1295
1296 if(ret == 4)
1297 {
1298 UstawPerk(id, -1, -1, 1);
1299 return PLUGIN_CONTINUE;
1300 }
1301
1302 ExecuteForward(perk_zmieniony, ret, id, perk, wartosc);
1303
1304 if(ret == 4)
1305 {
1306 UstawPerk(id, -1, -1, 1);
1307 return PLUGIN_CONTINUE;
1308 }
1309
1310 perk_gracza[id] = perk;
1311 wartosc_perku_gracza[id] = wartosc;
1312
1313 obroty[id] = 0;
1314
1315 if(pokaz_info && perk_gracza[id])
1316 ColorChat(id, GREEN, "^x01[^x04 COD^x01 ] Zdobyles %s.", nazwy_perkow[perk_gracza[id]]);
1317
1318 return PLUGIN_CONTINUE;
1319}
1320
1321public UstawDoswiadczenie(id, wartosc)
1322{
1323 gracz_zdobyl_expa[id] = wartosc;
1324 SprawdzPoziom(id);
1325}
1326
1327public UstawKlase(id, klasa, zmien)
1328{
1329 nowa_klasa_gracza[id] = klasa;
1330 if(zmien)
1331 {
1332 UstawNowaKlase(id);
1333 DajBronie(id);
1334 ZastosujAtrybuty(id);
1335 }
1336}
1337
1338public UstawTarcze(id, wartosc)
1339{
1340 if((gracz_ma_tarcze[id] = (wartosc > 0)))
1341 give_item(id, "weapon_shield"); //fm_give_item(id, "weapon_shield");
1342}
1343
1344public UstawNoktowizor(id, wartosc)
1345{
1346 if((gracz_ma_noktowizor[id] = (wartosc > 0)))
1347 cs_set_user_nvg(id, 1);
1348}
1349
1350public DajBron(id, bron)
1351{
1352 bonusowe_bronie_gracza[id] |= (1<<bron);
1353 new weaponname[22];
1354 get_weaponname(bron, weaponname, 21);
1355 return give_item(id, weaponname); //fm_give_item(id, weaponname);
1356}
1357
1358public WezBron(id, bron)
1359{
1360 bonusowe_bronie_gracza[id] &= ~(1<<bron);
1361
1362 if((1<<bron) & (bronie_dozwolone | bronie_klasy[klasa_gracza[id]]))
1363 return;
1364
1365 new weaponname[22];
1366 get_weaponname(bron, weaponname, 21);
1367 engclient_cmd(id, "drop", weaponname);
1368}
1369
1370public UstawBonusoweZdrowie(id, wartosc)
1371 bonusowe_zdrowie_gracza[id] = wartosc;
1372
1373
1374public UstawBonusowaInteligencje(id, wartosc)
1375 bonusowa_inteligencja_gracza[id] = wartosc;
1376
1377
1378public UstawBonusowaKondycje(id, wartosc)
1379 bonusowa_kondycja_gracza[id] = wartosc;
1380
1381
1382public UstawBonusowaWytrzymalosc(id, wartosc)
1383 bonusowa_wytrzymalosc_gracza[id] = wartosc;
1384
1385public PobierzPerk(plugin, params)
1386{
1387 if(!(0 < params < 3))
1388 return 0;
1389
1390 new id = get_param(1);
1391 if(!is_user_connected(id))
1392 return 0;
1393
1394 if(params == 2)
1395 set_param_byref(2, wartosc_perku_gracza[id]);
1396
1397 return perk_gracza[id];
1398}
1399
1400public PobierzIloscPerkow()
1401 return ilosc_perkow;
1402
1403public PobierzNazwePerku(perk, Return[], len)
1404{
1405 if(perk <= ilosc_perkow)
1406 {
1407 param_convert(2);
1408 copy(Return, len, nazwy_perkow[perk]);
1409 }
1410}
1411
1412public PobierzOpisPerku(perk, Return[], len)
1413{
1414 if(perk <= ilosc_perkow)
1415 {
1416 param_convert(2);
1417 copy(Return, len, opisy_perkow[perk]);
1418 }
1419}
1420
1421public PobierzPerkPrzezNazwe(const nazwa[])
1422{
1423 param_convert(1);
1424 for(new i=1; i <= ilosc_perkow; i++)
1425 if(equal(nazwa, nazwy_perkow[i]))
1426 return i;
1427 return 0;
1428}
1429
1430public PobierzDoswiadczeniePoziomu(poziom)
1431 return power(poziom, 2)*get_pcvar_num(cvar_proporcja_poziomu);
1432
1433public PobierzDoswiadczenie(id)
1434 return gracz_zdobyl_expa[id];
1435
1436public PobierzPunkty(id)
1437 return punkty_gracza[id];
1438
1439public PobierzPoziom(id)
1440 return poziom_gracza[id];
1441
1442public PobierzZdrowie(id, zdrowie_zdobyte, zdrowie_klasy, zdrowie_bonusowe)
1443{
1444 new zdrowie;
1445
1446 if(zdrowie_zdobyte)
1447 zdrowie += zdrowie_gracza[id];
1448 if(zdrowie_bonusowe)
1449 zdrowie += bonusowe_zdrowie_gracza[id];
1450 if(zdrowie_klasy)
1451 zdrowie += zdrowie_klas[klasa_gracza[id]];
1452
1453 return zdrowie;
1454}
1455
1456public PobierzInteligencje(id, inteligencja_zdobyta, inteligencja_klasy, inteligencja_bonusowa)
1457{
1458 new inteligencja;
1459
1460 if(inteligencja_zdobyta)
1461 inteligencja += inteligencja_gracza[id];
1462 if(inteligencja_bonusowa)
1463 inteligencja += bonusowa_inteligencja_gracza[id];
1464 if(inteligencja_klasy)
1465 inteligencja += inteligencja_klas[klasa_gracza[id]];
1466
1467 return inteligencja;
1468}
1469
1470public PobierzKondycje(id, kondycja_zdobyta, kondycja_klasy, kondycja_bonusowa)
1471{
1472 new kondycja;
1473
1474 if(kondycja_zdobyta)
1475 kondycja += kondycja_gracza[id];
1476 if(kondycja_bonusowa)
1477 kondycja += bonusowa_kondycja_gracza[id];
1478 if(kondycja_klasy)
1479 kondycja += kondycja_klas[klasa_gracza[id]];
1480
1481 return kondycja;
1482}
1483
1484public PobierzWytrzymalosc(id, wytrzymalosc_zdobyta, wytrzymalosc_klasy, wytrzymalosc_bonusowa)
1485{
1486 new wytrzymalosc;
1487
1488 if(wytrzymalosc_zdobyta)
1489 wytrzymalosc += wytrzymalosc_gracza[id];
1490 if(wytrzymalosc_bonusowa)
1491 wytrzymalosc += bonusowa_wytrzymalosc_gracza[id];
1492 if(wytrzymalosc_klasy)
1493 wytrzymalosc += wytrzymalosc_klas[klasa_gracza[id]];
1494
1495 return wytrzymalosc;
1496}
1497
1498public PobierzKlase(id)
1499 return klasa_gracza[id];
1500
1501public PobierzIloscKlas()
1502 return ilosc_klas;
1503
1504public PobierzNazweKlasy(klasa, Return[], len)
1505{
1506 if(klasa <= ilosc_klas)
1507 {
1508 param_convert(2);
1509 copy(Return, len, nazwy_klas[klasa]);
1510 }
1511}
1512
1513public PobierzOpisKlasy(klasa, Return[], len)
1514{
1515 if(klasa <= ilosc_klas)
1516 {
1517 param_convert(2);
1518 copy(Return, len, opisy_klas[klasa]);
1519 }
1520}
1521
1522public PobierzKlasePrzezNazwe(const nazwa[])
1523{
1524 param_convert(1);
1525 for(new i=1; i <= ilosc_klas; i++)
1526 if(equal(nazwa, nazwy_klas[i]))
1527 return i;
1528 return 0;
1529}
1530
1531public PobierzZdrowieKlasy(klasa)
1532{
1533 if(klasa <= ilosc_klas)
1534 return zdrowie_klas[klasa];
1535 return -1;
1536}
1537
1538public PobierzInteligencjeKlasy(klasa)
1539{
1540 if(klasa <= ilosc_klas)
1541 return inteligencja_klas[klasa];
1542 return -1;
1543}
1544
1545public PobierzKondycjeKlasy(klasa)
1546{
1547 if(klasa <= ilosc_klas)
1548 return kondycja_klas[klasa];
1549 return -1;
1550}
1551
1552public PobierzWytrzymaloscKlasy(klasa)
1553{
1554 if(klasa <= ilosc_klas)
1555 return wytrzymalosc_klas[klasa];
1556 return -1;
1557}
1558
1559#if defined MA_FRAKCJE
1560public PobierzNazweFrakcji(klasa, Return[], len)
1561{
1562 if(klasa <= ilosc_klas)
1563 {
1564 param_convert(2);
1565 copy(Return, len, frakcja_klas[klasa]);
1566 }
1567}
1568#endif
1569
1570public ZadajObrazenia(atakujacy, ofiara, Float:obrazenia, Float:czynnik_inteligencji, byt_uszkadzajacy, dodatkowe_flagi)
1571 ExecuteHam(Ham_TakeDamage, ofiara, byt_uszkadzajacy, atakujacy, obrazenia+PobierzInteligencje(atakujacy, 1, 1, 1)*czynnik_inteligencji, (1<<31) | dodatkowe_flagi);
1572
1573public ZarejestrujPerk(plugin, params)
1574{
1575 if(params != 4)
1576 return PLUGIN_CONTINUE;
1577
1578 if(++ilosc_perkow > MAX_ILOSC_PERKOW)
1579 return -1;
1580
1581 pluginy_perkow[ilosc_perkow] = plugin;
1582 get_string(1, nazwy_perkow[ilosc_perkow], MAX_WIELKOSC_NAZWY);
1583 get_string(2, opisy_perkow[ilosc_perkow], MAX_WIELKOSC_OPISU);
1584 min_wartosci_perkow[ilosc_perkow] = get_param(3);
1585 max_wartosci_perkow[ilosc_perkow] = get_param(4);
1586
1587 return ilosc_perkow;
1588}
1589
1590public ZarejestrujKlase(plugin, params)
1591{
1592 if(params != 7)
1593 return PLUGIN_CONTINUE;
1594
1595 if(++ilosc_klas > MAX_ILOSC_KLAS)
1596 return -1;
1597
1598 pluginy_klas[ilosc_klas] = plugin;
1599
1600 get_string(1, nazwy_klas[ilosc_klas], MAX_WIELKOSC_NAZWY);
1601 TrieSetCell(ClassName, nazwy_klas[ilosc_klas], ilosc_klas);
1602
1603 get_string(2, opisy_klas[ilosc_klas], MAX_WIELKOSC_OPISU);
1604
1605 bronie_klasy[ilosc_klas] = get_param(3);
1606 zdrowie_klas[ilosc_klas] = get_param(4);
1607 kondycja_klas[ilosc_klas] = get_param(5);
1608 inteligencja_klas[ilosc_klas] = get_param(6);
1609 wytrzymalosc_klas[ilosc_klas] = get_param(7);
1610
1611#if defined MA_FRAKCJE
1612 for(new i=0;i<klasid;i++)
1613 {
1614 if(equali(nazwy_klas[ilosc_klas],nazwa_klasy[i]))
1615 {
1616 frakcja_klas[ilosc_klas] = nazwa_frakcji[i];
1617 break;
1618 }
1619 }
1620#endif
1621
1622 return ilosc_klas;
1623}
1624
1625stock Display_Fade(id,duration,holdtime,fadetype,red,green,blue,alpha)
1626{
1627 message_begin( MSG_ONE, MsgScreenfade,{0,0,0},id );
1628 write_short( duration ); // Duration of fadeout
1629 write_short( holdtime ); // Hold time of color
1630 write_short( fadetype ); // Fade type
1631 write_byte ( red ); // Red
1632 write_byte ( green ); // Green
1633 write_byte ( blue ); // Blue
1634 write_byte ( alpha ); // Alpha
1635 message_end();
1636}
1637
1638/*stock fm_give_item(index, const item[]) {
1639 if (!equal(item, "weapon_", 7) && !equal(item, "ammo_", 5) && !equal(item, "item_", 5) && !equal(item, "tf_weapon_", 10))
1640 return 0;
1641
1642 new ent = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, item));
1643 if (!pev_valid(ent))
1644 return 0;
1645
1646 new Float:origin[3];
1647 pev(index, pev_origin, origin);
1648 set_pev(ent, pev_origin, origin);
1649 set_pev(ent, pev_spawnflags, pev(ent, pev_spawnflags) | SF_NORESPAWN);
1650 dllfunc(DLLFunc_Spawn, ent);
1651
1652 new save = pev(ent, pev_solid);
1653 dllfunc(DLLFunc_Touch, ent, index);
1654 if (pev(ent, pev_solid) != save)
1655 return ent;
1656
1657 engfunc(EngFunc_RemoveEntity, ent);
1658
1659 return -1;
1660}*/
1661
1662public BlokujKomende()
1663 return PLUGIN_HANDLED;
1664
1665
1666//stock by ConnorMcLeod - http://forums.alliedmods.net/showpost.php?p=1712101#post1712101
1667stock const XO_CWEAPONBOX = 4;
1668stock const m_rgpPlayerItems_CWeaponBox[6] = { 34 , 35 , ... };
1669
1670stock cs_get_weaponbox_type(iWeaponBox)
1671{
1672 new iWeapon;
1673 for(new i=1; i<=5; i++) {
1674 iWeapon = get_pdata_cbase(iWeaponBox, m_rgpPlayerItems_CWeaponBox[i], XO_CWEAPONBOX);
1675 if( iWeapon > 0 ) {
1676 return cs_get_weapon_id(iWeapon);
1677 }
1678 }
1679 return 0;
1680}
1681
1682Ham:get_player_resetmaxspeed_func(){
1683 #if defined Ham_CS_Player_ResetMaxSpeed
1684 return IsHamValid(Ham_CS_Player_ResetMaxSpeed)?Ham_CS_Player_ResetMaxSpeed:Ham_Item_PreFrame;
1685 #else
1686 return Ham_Item_PreFrame;
1687 #endif
1688}
1689
1690//////dhud//////
1691stock dhud_color;
1692stock dhud_x;
1693stock dhud_y;
1694stock dhud_effect;
1695stock dhud_fxtime;
1696stock dhud_holdtime;
1697stock dhud_fadeintime;
1698stock dhud_fadeouttime;
1699stock dhud_reliable;
1700
1701stock set_dhudmessage(red = 0, green = 160, blue = 0, Float:x = -1.0, Float:y = 0.65, effects = 2, Float:fxtime = 6.0, Float:holdtime = 3.0, Float:fadeintime = 0.1, Float:fadeouttime = 1.5, bool:reliable = false)
1702{
1703 #define clamp_byte(%1) (clamp(%1, 0, 255))
1704 #define pack_color(%1,%2,%3) (%3 + (%2<<8) + (%1<<16))
1705
1706 dhud_color = pack_color(clamp_byte(red), clamp_byte(green), clamp_byte(blue));
1707 dhud_x = _:x;
1708 dhud_y = _:y;
1709 dhud_effect = effects;
1710 dhud_fxtime = _:fxtime;
1711 dhud_holdtime = _:holdtime;
1712 dhud_fadeintime = _:fadeintime;
1713 dhud_fadeouttime = _:fadeouttime;
1714 dhud_reliable = _:reliable;
1715 return 1;
1716}
1717
1718stock show_dhudmessage(index, const message[], any:...)
1719{
1720 new buffer[128];
1721 new numArguments = numargs();
1722
1723 if(numArguments == 2)
1724 send_dhudMessage(index, message);
1725 else if(index || numArguments == 3)
1726 {
1727 vformat(buffer, charsmax(buffer), message, 3);
1728 send_dhudMessage(index, buffer);
1729 }
1730 else
1731 {
1732 new playersList[32], numPlayers;
1733 get_players(playersList, numPlayers, "ch");
1734
1735 if(!numPlayers)
1736 return 0;
1737
1738 new Array:handleArrayML = ArrayCreate();
1739
1740 for(new i = 2, j; i < numArguments; i++)
1741 {
1742 if(getarg(i) == LANG_PLAYER)
1743 {
1744 while((buffer[j] = getarg(i + 1, j++))) {}
1745 j = 0;
1746
1747 if(GetLangTransKey(buffer) != TransKey_Bad)
1748 ArrayPushCell(handleArrayML, i++);
1749 }
1750 }
1751
1752 new size = ArraySize(handleArrayML);
1753
1754 if(!size)
1755 {
1756 vformat(buffer, charsmax(buffer), message, 3);
1757 send_dhudMessage(index, buffer);
1758 }
1759 else
1760 {
1761 for(new i = 0, j; i < numPlayers; i++)
1762 {
1763 index = playersList[i];
1764
1765 for(j = 0; j < size; j++)
1766 setarg(ArrayGetCell(handleArrayML, j), 0, index);
1767
1768 vformat(buffer, charsmax(buffer), message, 3);
1769 send_dhudMessage(index, buffer);
1770 }
1771 }
1772 ArrayDestroy(handleArrayML);
1773 }
1774 return 1;
1775}
1776
1777stock send_dhudMessage(const index, const message[])
1778{
1779 message_begin(dhud_reliable? (index? MSG_ONE: MSG_ALL): (index? MSG_ONE_UNRELIABLE: MSG_BROADCAST), SVC_DIRECTOR, _, index);
1780 write_byte(strlen(message) + 31);
1781 write_byte(DRC_CMD_MESSAGE);
1782 write_byte(dhud_effect);
1783 write_long(dhud_color);
1784 write_long(dhud_x);
1785 write_long(dhud_y);
1786 write_long(dhud_fadeintime);
1787 write_long(dhud_fadeouttime);
1788 write_long(dhud_holdtime);
1789 write_long(dhud_fxtime);
1790 write_string(message);
1791 message_end();
1792}