· 8 years ago · Jan 01, 2018, 08:20 PM
1#include <amxmodx>
2#include <amxmisc>
3#include <hamsandwich>
4#include <fakemeta>
5#include <fakemeta_util>
6#include <engine>
7#include <sqlx>
8
9#define MAX_LEVEL 60
10
11#define MAX_PLAYERS 32
12
13#define RADIUS_BLOW 100.0
14#define RADIUS_BOMB 150.0
15#define RADIUS_FROST 150.0
16
17#define HEADSPLASH_DELAY 0.3
18#define HEADSPLASH_DAMAGE 40.0
19
20#define write_coord_f(%1) engfunc(EngFunc_WriteCoord, %1)
21#define DMG_HEGRENADE (1<<24)
22
23new const PREFIX[] = "JumpOn";
24
25new const g_iVipWeaponChance = 3;
26
27new const g_sSoundLevel[] = "JumpOn/Level.wav";
28new const g_sSoundStealth[] = "JumpOn/Stealth.wav";
29new const g_sSoundBomb[] = "JumpOn/Explode.wav";
30new const g_sSoundFrost[] = "JumpOn/Throw.wav";
31new const g_sSoundVampire[] = "JumpOn/Evil_laugh.wav";
32new const g_sSoundPush[] = "JumpOn/Push.wav";
33
34new const g_sSpriteSkull[] = "sprites/skull.spr";
35new const g_sSpriteBlow[] = "sprites/JumpOn/Blow.spr";
36new const g_sSpriteExplosion[] ="sprites/JumpOn/Explosion.spr";
37new const g_sSpriteTeleport[] = "sprites/JumpOn/Teleport_start.spr";
38
39new const g_sModelBomb[] = "models/JumpOn/bomb.mdl";
40new const g_sModelAura[] = "models/JumpOn/aura.mdl";
41
42new const g_sTable[] = "ExpMod_Table";
43new const g_sBackGroundTop[] = "http://www.hdwallpapers.in/walls/abstract_river-wide.jpg";
44
45new const g_sClassFrost[] = "clFrostBall";
46new const g_sClassBomb[] = "clBomb";
47
48enum
49{
50 sHealth, //
51 sNoFall, //
52 sArmor, //
53 skAura, //
54 sSilentStep,//
55 sIronHead, //
56 sKnockbackHe,//
57 skStealth, //
58 sNoflash, //
59 sFastFlash, //
60 skBomb, //
61 sArmorUpg, //
62 sCritical, //
63 sThorns, //
64 sRespawn, //
65 skFrostBall,//
66 skVampire, //
67 sBlow, //
68 sNoPainShock,//
69 skPush, //
70
71 Skills
72}
73
74new const g_sSkillsNames[][][] =
75{
76 {"Zycie", "Health"}, // sHealth,
77 {"NoFallDmg", "NoFallDmg" }, // sNoFall,
78 {"Armor", "Armor"}, // sArmor,
79 {"Aura zycia", "Life Aura"}, // skAura,
80 {"Ciche kroki", "Silent steps"}, // sSilentStep,
81 {"Stalowa glowa", "Iron head"}, // sIronHead,
82 {"Odpychajacy granat", "HE knockback"}, // sKnockbackHe,
83 {"Niewidzialnosc", "Stealth"}, // skStealth,
84 {"Oslabienie flasha", "Weaker Flash"},// sNoflash,
85 {"Szybki Flash", "Fast Flash"},// sFastFlash,
86 {"Bomba", "Explosive Bomb"}, // skBomb,
87 {"Ulepszenie Armora", "Armor Upgrade"}, // sArmorUpg,
88 {"Krytyczne uderzenie", "Critical Strike"}, // sCritical,
89 {"Ciernie", "Thorns"}, // sThorns,
90 {"Odrodzenie", "Respawn"}, // sRespawn,
91 {"Kula Mrozu[VIP]", "FrostBall[VIP]"}, // skFrostBall,
92 {"Wampir", "Vampire"}, // skVampire,
93 {"Wybuch", "Explosion"}, // sBlow
94 {"No Pain Shock", "No Pain Shock"}, // sNoPainShock,
95 {"Odepchniecie", "Push"} // skPush
96}
97
98new const g_sSkillsMaxLevels[] =
99{
100 5,// sHealth,
101 4,// sNoFall,
102 2,// sArmor,
103 4,// skAura,
104 1,// sSilentStep,
105 3,// sIronHead,
106 3,// sKnockbackHe,
107 5,// skStealth,
108 3,// sNoflash,
109 1,// sFastFlash,
110 3,// skBomb,
111 1,// sArmorUpg,
112 5,// sCritical,
113 3,// sThorns,
114 4,// sRespawn,
115 1,// skFrostBall,
116 3,// skVampire,
117 3,// sBlow
118 3,// sNoPainShock,
119 3// skPush
120}
121
122new const g_sSkillsMinLevels[] =
123{
124 1,// sHealth,
125 1,// sNoFall,
126 5,// sArmor,
127 7,// skAura,
128 10,// sSilentStep,
129 10,// sIronHead,
130 12,// sKnockbackHe,
131 15,// skStealth,
132 15,// sNoflash,
133 18,// sFastFlash,
134 18,// skBomb,
135 20,// sArmorUpg,
136 20,// sCritical,
137 25,// sThorns,
138 28,// sRespawn,
139 30,// skFrostBall,
140 30,// skVampire,
141 35,// sBlow,
142 40,// sNoPainShock,
143 45// skPush
144}
145
146new const g_sSkillsValues[] =
147{
148 5,// sHealth,
149 15,// sNoFall,
150 25,// sArmor,
151 25,// skAura,
152 0,// sSilentStep,
153 10,// sIronHead,
154 15,// sKnockbackHe,
155 1,// skStealth,
156 10,// sNoflash,
157 0,// sFastFlash,
158 15,// skBomb,
159 0,// sArmorUpg,
160 4,// sCritical,
161 3,// sThorns,
162 3,// sRespawn,
163 0,// skFrostBall,
164 15,// skVampire,
165 5,// sBlow
166 20,// sNoPainShock,
167 500// skPush
168}
169
170new const g_sSkillsDescription[][][] =
171{
172 {"Dostajesz +%x zycia co runde", "You get +%x health every round"}, // sHealth,
173 {"Zmniejsza obrazenia od upadku o %x%", "Decreases fall damage by %x%" }, // sNoFall,
174 {"Dostajesz %x armoru co runde", "You get %x armor every round"}, // sArmor,
175 {"Stawiasz magiczna aure leczaca Ciebie i sojusznikow o %x hp w ciagu 10s", "You can place a magical aura healing you and your teammates for %x hp in 10s"}, // skAura,
176 {"Nie slychac Twoich krokow", "Your steps have no sound"}, // sSilentStep,
177 {"Headsplash zadahe %x% mniej obrazen", "Headsplash deals %s% less damage"}, // sIronHead,
178 {"Twoj granat odpycha Ciebie i przeciwnika", "Your HE grenades knockback you and your enemies"}, // sKnockbackHe,
179 {"Po 1,5s stajesz sie calkowicie niewidzialny na %xs", "After 1,5s you become invisible for %xs"}, // skStealth,
180 {"Masz %x% szans na oslabienie flasha", "You have %x% chance, that flashbang will be weakened"},// sNoflash,
181 {"Mozesz uzywac trybu szybkiego flasha", "You can use Fast flash mode"},// sFastFlash,
182 {"Mozesz rzucic bombe, ktora po trzech odbiciach wybuchnie zadajac %x obrazen", "You can throw an explosive bomb, which deals %x damage"}, // skBomb,
183 {"Twoj armor posiada helm", "Your armor has helmet"}, // sArmorUpg,
184 {"Masz %x% szans na zadanie podwojnych obrazen (Nie dziala na HE)", "You have %x% chance, that you deal x2 damage (Doesn't work for HE)"}, // sCritical,
185 {"Odbijasz %x% obrazen", "You reflect %x% damage"}, // sThorns,
186 {"Masz %x% szans na odrodzenie po smierci", "You have %x% chance, that you respawn after your death"}, // sRespawn,
187 {"Puszczasz kule, zamrazajaca graczy, ktorych dotknie", "You can throw a frostball freezing all enemies it hits"},// skFrostBall,
188 {"Kradniesz %x zycia przeciwnikowi (Nie mozna tym skillem zabic)", "You steal %x health from your enemy (You can't kill with this skill)"}, // skVampire,
189 {"Masz %x% szans na wybuchniecie po smierci i zadanie 50 obrazen", "You have %x% chance, that you blow after death dealing 50 damage"}, // sBlow
190 {"Masz %x% szans, ze obrazenia Cie nie spowolnia", "You have %x% chance, that damage won't slow you down"}, // sNoPainShock,
191 {"Odpychasz przeciwnikow z sila %x u", "You can push your enemies with strength of %x u"} // skPush
192}
193
194enum
195{
196 wpnFlash,
197 wpnSg,
198 wpnHe,
199 wpnGuns,
200 wpnRifles,
201
202 Weapons
203}
204
205new const g_sWeaponsNames[][][] =
206{
207 {"Flashbang", "Flashbang"},
208 {"Granat Zamrazajacy", "Frost Nade"},
209 {"Granat HE", "HE Grenade"},
210 {"Pistolet", "Gun"},
211 {"Karabin", "Rifle"}
212}
213
214new const g_sWeaponsMaxLevels[] =
215{
216 3,
217 4,
218 4,
219 5,
220 4
221}
222new const g_sWeaponsChances[] =
223{
224 25,
225 15,
226 15,
227 3,
228 3
229}
230
231new const g_sWeaponsCost[] =
232{
233 15,
234 30,
235 50,
236 100,
237 150
238}
239
240/*
241{
242 // sHealth,
243 // sNoFall,
244 // sArmor,
245 // skAura,
246 // sIronHead,
247 // sKnockbackHe,
248 // skStealth,
249 // skBomb,
250 // sArmorUpg,
251 // sCritical,
252 // sThorns,
253 // sRespawn,
254 // skVampire,
255 // sBlow,
256 // sNoPainShock,
257 // skPush
258}*/
259
260new g_iExpTable[MAX_LEVEL];
261
262enum (+= 255)
263{
264 TASK_COUNTER = 255,
265 TASK_BONUSES,
266 TASK_WEAPONS,
267 TASK_MORESTEALTH,
268 TASK_STEALTH,
269 TASK_EXPLODE,
270 TASK_AURA,
271 TASK_DELAURA,
272 TASK_FROST
273}
274
275new bool:gbConnected[MAX_PLAYERS + 1];
276new bool:gbAlive[MAX_PLAYERS + 1];
277new bool:gbVip[MAX_PLAYERS + 1];
278new bool:gbLoaded[MAX_PLAYERS + 1];
279
280new bool:gbSilentSteps[MAX_PLAYERS + 1];
281
282new gszName[MAX_PLAYERS + 1][32], gszSteam[MAX_PLAYERS + 1][32];
283
284new gTemp[MAX_PLAYERS + 1][2];
285
286new gLvl[MAX_PLAYERS + 1], gExp[MAX_PLAYERS + 1], gTotalExp[MAX_PLAYERS + 1], gPoints[MAX_PLAYERS + 1], gSkulls[MAX_PLAYERS + 1];
287new gSkill[MAX_PLAYERS + 1][Skills];
288new gWeapon[MAX_PLAYERS + 1][Weapons];
289new gMaxHealth[MAX_PLAYERS + 1];
290new gLanguage[MAX_PLAYERS + 1];
291new gFlashMode[MAX_PLAYERS + 1];
292new Float:gfPercent[MAX_PLAYERS + 1];
293new Float:gfFrozenEffect[MAX_PLAYERS + 1];
294
295new Float:fDamageAfter[MAX_PLAYERS + 1][MAX_PLAYERS + 1];
296new Float:gfLastTimeCommandUsed[MAX_PLAYERS + 1];
297
298#define MAX_LEN 1023
299new szTop15_buffer[MAX_LEN + 1];
300new iRankTotalPos;
301new Handle:gSqlTuple;
302
303new gSelectedSkill[MAX_PLAYERS + 1];
304
305enum
306{
307 useAura,
308 useStealth,
309 useBomb,
310 useFrostBall,
311 useVampire,
312 usePush,
313
314 usable
315}
316
317new bool:gbCanUse[MAX_PLAYERS + 1][usable];
318
319#define OFFSET_ARMORTYPE 112
320enum CsArmorType
321{
322 CS_ARMOR_NONE,
323 CS_ARMOR_KEVLAR,
324 CS_ARMOR_VESTHELM
325};
326
327new Float:gfStealthTime[MAX_PLAYERS + 1];
328new gCurrentVis[MAX_PLAYERS + 1];
329
330new Float:fDamageCounter, pMin, pSurv;
331
332new g_msgStatusText, g_msgScreenFade;
333new p_SpriteSkull, p_SpriteBlow, p_SpriteExplosion, p_SpriteTrail, p_SpritePush, p_SpriteWhite, p_SpriteTele, p_SpriteBlood, p_SpriteBloodSpray;
334
335public plugin_natives()
336{
337 register_library("PointMod");
338 register_native("pm_add_points", "f_addPoints");
339 register_native("pm_get_maxhealth", "f_getMaxHp");
340}
341
342public f_addPoints(plugin, params)
343 return AddExp(get_param(1), get_param(2));
344
345public f_getMaxHp(plugin, params)
346 return gMaxHealth[get_param(1)];
347
348public plugin_precache()
349{
350 p_SpriteSkull = precache_model(g_sSpriteSkull);
351 p_SpriteBlow = precache_model(g_sSpriteBlow);
352 p_SpriteExplosion = precache_model(g_sSpriteExplosion)
353 p_SpriteTele = precache_model(g_sSpriteTeleport);
354 p_SpriteTrail = precache_model( "sprites/lgtning.spr" );
355 p_SpritePush = precache_model( "sprites/shockwave.spr" );
356 p_SpriteWhite = precache_model( "sprites/white.spr" );
357 p_SpriteBlood = precache_model( "sprites/blood.spr" );
358 p_SpriteBloodSpray = precache_model( "sprites/bloodspray.spr" );
359
360 precache_model(g_sModelBomb);
361 precache_model(g_sModelAura);
362 precache_model( "models/rpgrocket.mdl" );
363
364 precache_sound(g_sSoundLevel);
365 precache_sound(g_sSoundStealth);
366 precache_sound(g_sSoundBomb);
367 precache_sound(g_sSoundFrost)
368 precache_sound(g_sSoundVampire);
369 precache_sound(g_sSoundPush);
370}
371
372public plugin_init()
373{
374 register_plugin("JumpOn ExpMod", "v1.01", "Grzyboo");
375
376 RegisterHam(Ham_Spawn, "player", "fwdSpawn", 1);
377 RegisterHam(Ham_TakeDamage, "player", "fwdTakeDamage");
378 RegisterHam(Ham_TakeDamage, "player", "fwdTakeDamagePost", 1);
379 RegisterHam(Ham_Touch, "grenade","fwdGrenadeTouch", 1);
380 RegisterHam(Ham_Item_Deploy, "weapon_flashbang", "fwdFlashDeploy", 1);
381
382 register_concmd("add_exp", "_add", ADMIN_IMMUNITY, "<nick> <exp> <powod>");
383
384 new sCommand[16];
385 sCommand = "MS_Main";
386 register_clcmd("say /xp", sCommand);
387 register_clcmd("say /pm", sCommand);
388 register_clcmd("say /mm", sCommand);
389 register_clcmd("say /exp", sCommand);
390 register_clcmd("say /expmod", sCommand);
391 register_clcmd("say /mod", sCommand);
392
393 register_clcmd("say /top15exp", "cmdShowTop15");
394 register_clcmd("say /top10exp", "cmdShowTop15");
395 register_clcmd("say /rankexp", "cmdShowRank");
396
397 register_forward(FM_CmdStart, "fwdCmdStart");
398 register_forward(FM_PlayerPreThink, "fwdPreThink");
399 register_forward(FM_Touch, "fwdTouch");
400
401 register_touch(g_sClassBomb, "*", "fwdTouchBomb");
402 register_touch(g_sClassFrost, "*", "fwdTouchFrostBall");
403
404 register_event("DeathMsg", "fwdDeath", "a");
405 register_event("Damage", "fwdHeDamage", "b", "2!0", "4!0", "5!0", "6!0");
406 register_event("HLTV", "EventNewRound", "a", "1=0", "2=0");
407 register_logevent("EventRoundEnd", 2, "1=Round_End");
408
409 register_cvar("xp_damagecount", "0.2");
410 fDamageCounter = get_cvar_float("xp_damagecount");
411
412 pMin = register_cvar("xp_minplayers", "4");
413 pSurv = register_cvar("xp_survivexp", "40");
414
415 register_cvar("sql_host", "", FCVAR_PROTECTED);
416 register_cvar("sql_login", "", FCVAR_PROTECTED);
417 register_cvar("sql_pass", "", FCVAR_PROTECTED);
418 register_cvar("sql_base", "", FCVAR_PROTECTED);
419
420 g_msgStatusText = get_user_msgid("StatusText");
421 g_msgScreenFade = get_user_msgid("ScreenFade");
422 register_message(g_msgScreenFade, "MsgScreenFade");
423
424 register_menucmd(register_menuid("M_ResetPoints"), 1023, "MH_ResetPoints");
425 register_menucmd(register_menuid("M_AskSkills"), 1023, "MH_AskSkills");
426 register_menucmd(register_menuid("M_AskWeapons"), 1023, "MH_AskWeapons");
427 register_menucmd(register_menuid("M_UseSkills"), 1023, "MH_UseSkills");
428
429 CreateExpTable();
430
431 set_task(150.0, "TaskBestPlayerOnline");
432
433 set_task(0.1, "CreateSqlConnection");
434 set_task(0.2, "formatTop15");
435}
436
437new TotalExp = 0;
438
439public CreateExpTable()
440{
441 new StartingExp = 400;
442
443 for(new i=0; i<MAX_LEVEL; ++i)
444 {
445 new Float:flX;
446 new iExp;
447
448 flX = floatpower(1.3, ( (i > 10) ? 10 : i ) * 1.0);
449 iExp = floatround(StartingExp * flX);
450
451 if(i > 10)
452 {
453 flX = floatpower(1.08, i * 1.0);
454 iExp += floatround(StartingExp * flX);
455 }
456
457 if(i > 25)
458 {
459 flX = floatpower(1.045, i * 1.0);
460 iExp += floatround(StartingExp * flX);
461 }
462
463 if(i > 40)
464 {
465 flX = floatpower(1.015, i * 1.0);
466 iExp += floatround(StartingExp * flX);
467 }
468
469 g_iExpTable[i] = iExp;
470
471 TotalExp += iExp;
472 }
473
474 // TotalExp is 900205 now
475}
476
477public _add(id, level, cid)
478{
479 if(!cmd_access(id, level, cid, 3)) return 1;
480
481 new target[32], amount[7], reason[64]
482 read_argv(1, target, 31);
483 read_argv(2, amount, 6);
484 read_argv(3, reason, 63);
485
486 if(!strlen(reason))
487 reason = "Brak";
488
489 new player = cmd_target(id, target, 8);
490 if(!player)
491 {
492 console_print(id, "Nie znaleziono gracza");
493 return 1;
494 }
495
496 AddExp(player, str_to_num(amount), true);
497
498 Print(player, "Dostales ^4%s expa^3 od admina^1 %s", amount, gszName[id]);
499 if(id)
500 Print(id, "Dales^4 %s expa^3 graczowi^1 %s", amount, gszName[player]);
501 log_amx("[- Expmod -] %s [%s] dal %s %s expa. Powod: %s", gszName[id], gszSteam[id], gszName[player], amount, reason);
502
503 return 1;
504}
505
506
507public TaskBestPlayerOnline()
508{
509 new iBestTotalExp = 0, iBestId = 0;
510
511 for(new i=1; i<=MAX_PLAYERS; ++i)
512 {
513 if(!gbConnected[i])
514 continue;
515
516 if(gTotalExp[i] > iBestTotalExp)
517 {
518 iBestTotalExp = gTotalExp[i];
519 iBestId = i;
520 }
521 }
522
523 if(iBestId)
524 Print(0, "Najwyzszy poziom z graczy online ma:^4 %s^3 [^1 %i^3 ](Exp : %i)", gszName[iBestId], gLvl[iBestId], gExp[iBestId])
525
526 set_task(300.0, "TaskBestPlayerOnline");
527}
528
529public fwdPreThink(id)
530 if(gbAlive[id] && gbSilentSteps[id])
531 set_pev(id, pev_flTimeStepSound, 999);
532
533public MsgScreenFade(msgtype, msgid, id)
534{
535 if(!gbAlive[id] || get_user_team(id) == 1)
536 return PLUGIN_HANDLED;
537
538 if(get_msg_arg_int(4) == 255 && get_msg_arg_int(5) == 255 && get_msg_arg_int(6) == 255 && get_msg_arg_int(7) > 55)
539 {
540 set_msg_arg_int(4, ARG_BYTE, 127);
541 set_msg_arg_int(5, ARG_BYTE, 127);
542 set_msg_arg_int(6, ARG_BYTE, 127);
543
544 if(gSkill[id][sNoflash] && random_num(1, 100) <= gSkill[id][sNoflash] * g_sSkillsValues[sNoflash])
545 {
546 new iNum = get_msg_arg_int(7) - 25;
547
548 set_msg_arg_int(7, ARG_BYTE, iNum);
549 return PLUGIN_CONTINUE;
550 }
551 }
552
553 return PLUGIN_CONTINUE;
554}
555
556public fwdTouch(toucher, touched, entity, id)
557{
558 if(!isPlayer(touched) || !isPlayer(toucher) || !gbAlive[toucher] || !gbAlive[touched])
559 return PLUGIN_CONTINUE;
560
561 if(pev(toucher, pev_groundentity) == touched && pev(touched, pev_flags) & FL_ONGROUND
562 && fDamageAfter[toucher][touched] <= get_gametime() && !fm_get_user_godmode(touched))
563 {
564 fDamageAfter[toucher][touched] = get_gametime() + HEADSPLASH_DELAY;
565
566 new Float:fDamage = HEADSPLASH_DAMAGE;
567
568 if(gSkill[touched][sIronHead])
569 fDamage *= (1.0 - 0.01 * gSkill[touched][sIronHead] * g_sSkillsValues[sIronHead]);
570
571 smashHead(touched, toucher, fDamage);
572 }
573
574 return PLUGIN_CONTINUE;
575}
576
577public smashHead(pwned, pwnzor, Float:damage)
578{
579 if(get_user_team(pwned) == get_user_team(pwnzor))
580 return;
581
582 static Float:fOrigin[3], Float:Health;
583 pev(pwned, pev_origin, fOrigin);
584 pev(pwned, pev_health, Health);
585
586 if(Health < damage)
587 {
588 engfunc(EngFunc_MessageBegin, MSG_PVS, SVC_TEMPENTITY, fOrigin, 0);
589 write_byte(TE_PARTICLEBURST);
590 engfunc(EngFunc_WriteCoord, fOrigin[0]);
591 engfunc(EngFunc_WriteCoord, fOrigin[1]);
592 engfunc(EngFunc_WriteCoord, fOrigin[2]);
593 write_short(50);
594 write_byte(72);
595 write_byte(10);
596 message_end();
597 }
598
599 engfunc(EngFunc_MessageBegin, MSG_BROADCAST, SVC_TEMPENTITY, fOrigin, 0);
600 write_byte(TE_BLOODSPRITE);
601 engfunc(EngFunc_WriteCoord, fOrigin[0] + 8.0);
602 engfunc(EngFunc_WriteCoord, fOrigin[1]);
603 engfunc(EngFunc_WriteCoord, fOrigin[2] + 26.0);
604 write_short(p_SpriteBloodSpray);
605 write_short(p_SpriteBlood);
606 write_byte(248);
607 write_byte(4);
608 message_end();
609
610 ExecuteHamB(Ham_TakeDamage, pwned, "", pwnzor, damage, 1);
611}
612
613public fwdGrenadeTouch(toucher, touched)
614{
615 new id = pev(toucher, pev_owner);
616
617 if(gFlashMode[id])
618 {
619 if(fm_grenade_type(toucher) == 0)
620 {
621 set_pev(toucher, pev_dmgtime, 0.0);
622 set_pev(toucher, pev_nextthink, get_gametime() + 0.001)
623 }
624 }
625}
626
627public fwdFlashDeploy(wpn)
628{
629 static id;
630 id = pev(wpn,pev_owner);
631
632 if(gSkill[id][sFastFlash])
633 PrintFlashMode(id);
634}
635
636stock fm_grenade_type(i)
637{
638 if(get_pdata_int(i, 96) & (1<<8))
639 return 3;
640 return get_pdata_int(i, 114) & 3;
641}
642
643public client_infochanged(id)
644 get_user_name(id, gszName[id], 31);
645
646public client_putinserver(id)
647{
648 gbConnected[id] = true;
649
650 get_user_authid(id, gszSteam[id], 31);
651 get_user_name(id, gszName[id], 31);
652
653 set_task(0.5, "HudUpdate", id, _, _, "b");
654
655 LoadData(id);
656}
657
658public client_disconnect(id)
659{
660 gbConnected[id] = false;
661 gbAlive[id] = false;
662
663 SaveData(id);
664
665 remove_task(id);
666}
667
668public HudUpdate(id)
669{
670 if(!gbAlive[id] || !gbLoaded[id])
671 return 1;
672
673 ShowLevelBar(id);
674
675 return 1;
676}
677
678public fwdCmdStart(id, uc_handle)
679{
680 if(!gbAlive[id])
681 return FMRES_IGNORED;
682
683 new buttons = get_uc(uc_handle, UC_Buttons);
684 new oldbuttons = pev(id, pev_oldbuttons);
685
686 if(buttons & IN_RELOAD && !(oldbuttons & IN_RELOAD))
687 MS_UseSkills(id);
688
689 if(gSkill[id][sFastFlash] && buttons & IN_ATTACK2 && !(oldbuttons & IN_ATTACK2) && get_user_weapon(id) == CSW_FLASHBANG)
690 FlashBangModes(id);
691
692 return FMRES_IGNORED;
693}
694
695public FlashBangModes(id)
696{
697 if(gFlashMode[id])
698 gFlashMode[id] = 0;
699 else
700 gFlashMode[id] = 1;
701
702 PrintFlashMode(id);
703}
704
705public PrintFlashMode(id)
706{
707 if(gLanguage[id])
708 client_print(id, print_center, "Mode : %s", gFlashMode[id] ? "Fast flash" : "Normal flash");
709 else
710 client_print(id, print_center, "Tryb : %s", gFlashMode[id] ? "Szybki flash" : "Normalny flash");
711}
712
713public fwdSpawn(id)
714{
715 if(!is_user_alive(id))
716 return 1;
717
718 gbAlive[id] = true;
719
720 if(task_exists(id+TASK_BONUSES))
721 remove_task(id+TASK_BONUSES);
722
723 if(task_exists(id+TASK_WEAPONS))
724 remove_task(id+TASK_WEAPONS);
725
726 set_task(2.5, "TaskBonuses", id+TASK_BONUSES);
727 set_task(5.0, "TaskWeapons", id+TASK_WEAPONS);
728
729 return 1;
730}
731
732public TaskBonuses(id)
733{
734 id -= TASK_BONUSES;
735
736 gbVip[id] = bool:access(id, ADMIN_RESERVATION);
737
738 gMaxHealth[id] = 100;
739
740 if(gSkill[id][sHealth])
741 gMaxHealth[id] += gSkill[id][sHealth] * g_sSkillsValues[sHealth];
742
743 if(gbVip[id])
744 gMaxHealth[id] += 10;
745
746 set_pev(id, pev_health, gMaxHealth[id] * 1.0);
747
748 if(gSkill[id][sArmor])
749 fm_cs_set_user_armor(id, gSkill[id][sArmor] * g_sSkillsValues[sArmor], (gSkill[id][sArmorUpg]) ? CS_ARMOR_VESTHELM : CS_ARMOR_KEVLAR);
750
751 if(gSkill[id][sSilentStep])
752 fm_set_user_footsteps(id, false);
753 else
754 fm_set_user_footsteps(id, true);
755
756 if(gSkill[id][skAura]) gbCanUse[id][useAura] = true;
757 if(gSkill[id][skStealth]) gbCanUse[id][useStealth] = true;
758 if(gSkill[id][skBomb]) gbCanUse[id][useBomb] = true;
759 if(gSkill[id][skFrostBall] && gbVip[id]) gbCanUse[id][useFrostBall] = true;
760 if(gSkill[id][skVampire]) gbCanUse[id][useVampire] = true;
761 if(gSkill[id][skPush]) gbCanUse[id][usePush] = true;
762}
763
764public TaskWeapons(id)
765{
766 id -= TASK_WEAPONS;
767
768 new szText[256], iLen,
769 iTeam = get_user_team(id);
770
771 if(iTeam == 1)
772 {
773 GiveNade(id, CSW_FLASHBANG);
774 GiveNade(id, CSW_SMOKEGRENADE);
775 }
776
777 iLen = 0;
778 for(new i=0; i<Weapons; ++i)
779 {
780 if(gWeapon[id][i] || gbVip[id])
781 {
782 new iChance = gWeapon[id][i] * g_sWeaponsChances[i];
783
784 if(gbVip[id])
785 iChance += g_iVipWeaponChance;
786
787 if(random_num(1, 100) <= iChance)
788 {
789 if(i == wpnGuns)
790 {
791 switch(random_num(1,5))
792 {
793 case 1: GiveWpn1Ammo(id, "weapon_deagle", CSW_DEAGLE);
794 case 2: GiveWpn1Ammo(id, "weapon_usp", CSW_USP);
795 case 3: GiveWpn1Ammo(id, "weapon_elite", CSW_ELITE);
796 case 4: GiveWpn1Ammo(id, "weapon_fiveseven", CSW_FIVESEVEN);
797 case 5: GiveWpn1Ammo(id, "weapon_p228", CSW_P228);
798 }
799 }
800 else if( i == wpnRifles)
801 {
802 switch(random_num(1,5))
803 {
804 case 1: GiveWpn1Ammo(id, "weapon_m4a1", CSW_M4A1);
805 case 2: GiveWpn1Ammo(id, "weapon_ak47", CSW_AK47);
806 case 3: GiveWpn1Ammo(id, "weapon_mp5navy", CSW_MP5NAVY);
807 case 4: GiveWpn1Ammo(id, "weapon_galil", CSW_GALIL);
808 case 5: GiveWpn1Ammo(id, "weapon_aug", CSW_AUG);
809 }
810 }
811 else
812 {
813 if(iTeam != 1 && (i == wpnFlash || i == wpnSg))
814 continue;
815
816 switch(i)
817 {
818 case wpnFlash: GiveNade(id, CSW_FLASHBANG);
819 case wpnHe: GiveNade(id, CSW_HEGRENADE);
820 case wpnSg: GiveNade(id, CSW_SMOKEGRENADE);
821 }
822 }
823
824 iLen += formatex(szText[iLen], 255 - iLen, "^n%s - %i %", g_sWeaponsNames[i][gLanguage[id]], iChance);
825 }
826 }
827 }
828
829 if(strlen(szText))
830 {
831 set_hudmessage(0, 255, 255, 0.02, 0.6, 0, 10.0, 10.0, 1.0, 1.0, 5);
832 show_hudmessage(id, "Wylosowales bronie: %s", szText);
833 }
834}
835
836stock GiveWpn1Ammo(id, const weapon[], const csw_weapon)
837{
838 fm_give_item(id, weapon);
839 fm_set_user_bpammo(id, csw_weapon, 0);
840 fm_set_weapon_ammo(id, csw_weapon, 1);
841
842 return 1;
843}
844
845stock GiveNade(id, Type)
846{
847 new ammo = fm_get_user_bpammo(id , Type);
848 if(!ammo)
849 {
850 new szItem[32];
851 get_weaponname(Type, szItem, 31);
852 fm_give_item(id, szItem);
853 }
854
855 fm_set_user_bpammo(id , Type , ammo + 1);
856}
857
858stock fm_set_weapon_ammo(id, weapon, ammo)
859{
860 new weaponname[32], weaponid = -1;
861 get_weaponname(weapon, weaponname, 31);
862 while((weaponid = engfunc(EngFunc_FindEntityByString, weaponid, "classname", weaponname)) != 0)
863 if(pev(weaponid, pev_owner) == id) {
864 set_pdata_int(weaponid, 51, ammo, 4);
865
866 return weaponid;
867 }
868 return 0;
869}
870
871stock fm_set_user_bpammo(id, weapon, ammo)
872{
873 static offset;
874
875 switch(weapon)
876 {
877 case CSW_AWP: offset = 377;
878 case CSW_SCOUT, CSW_AK47,CSW_G3SG1: offset = 378;
879 case CSW_M249: offset = 379;
880 case CSW_M4A1, CSW_FAMAS,CSW_AUG,CSW_SG550,CSW_GALI,CSW_SG552: offset = 380;
881 case CSW_M3, CSW_XM1014: offset = 381;
882 case CSW_USP, CSW_UMP45, CSW_MAC10: offset = 382;
883 case CSW_FIVESEVEN, CSW_P90: offset = 383;
884 case CSW_DEAGLE: offset = 384;
885 case CSW_P228: offset = 385;
886 case CSW_GLOCK18, CSW_MP5NAVY, CSW_TMP, CSW_ELITE: offset = 386;
887 case CSW_FLASHBANG: offset = 387;
888 case CSW_HEGRENADE: offset = 388;
889 case CSW_SMOKEGRENADE: offset = 389;
890 case CSW_C4: offset = 390;
891 default: return;
892 }
893
894 set_pdata_int(id, offset, ammo, 5);
895}
896
897stock fm_get_user_bpammo(id, weapon)
898{
899 static offset;
900
901 switch(weapon)
902 {
903 case CSW_AWP: offset = 377;
904 case CSW_SCOUT, CSW_AK47,CSW_G3SG1: offset = 378;
905 case CSW_M249: offset = 379;
906 case CSW_M4A1, CSW_FAMAS,CSW_AUG,CSW_SG550,CSW_GALI,CSW_SG552: offset = 380;
907 case CSW_M3, CSW_XM1014: offset = 381;
908 case CSW_USP, CSW_UMP45, CSW_MAC10: offset = 382;
909 case CSW_FIVESEVEN, CSW_P90: offset = 383;
910 case CSW_DEAGLE: offset = 384;
911 case CSW_P228: offset = 385;
912 case CSW_GLOCK18, CSW_MP5NAVY, CSW_TMP, CSW_ELITE: offset = 386;
913 case CSW_FLASHBANG: offset = 387;
914 case CSW_HEGRENADE: offset = 388;
915 case CSW_SMOKEGRENADE: offset = 389;
916 case CSW_C4: offset = 390;
917 default: return -1;
918 }
919
920 return get_pdata_int(id, offset, 5);
921}
922
923public EventCurWeapon(id)
924{
925 if(!gbAlive[id])
926 return;
927
928 if(gfFrozenEffect[id] >= 0.1)
929 fm_set_user_maxspeed(id, gfFrozenEffect[id]);
930}
931
932public MS_Main(id)
933{
934 if(!gbLoaded[id])
935 return;
936
937 new szTitle[64], menu, szItem[64];
938
939 if(gLanguage[id])
940 {
941 format(szTitle, sizeof szTitle - 1, "\y[%s] \wMain Menu", PREFIX);
942
943 menu = menu_create(szTitle, "MH_Main");
944
945 format(szItem, 63, "Skills ( \r%i \yPoints \w)", gPoints[id])
946 menu_additem(menu, szItem);
947 menu_additem(menu, "\d#\w Skills description");
948 menu_additem(menu, "Weapons^n");
949
950 menu_additem(menu, "Players^n");
951
952 if(gbVip[id])
953 menu_additem(menu, "Reset Skills");
954 else
955 menu_additem(menu, "Reset Skills ( \r5 \ySkulls \w)");
956 }
957 else
958 {
959 format(szTitle, sizeof szTitle - 1, "\y[%s] \wMenu Glowne", PREFIX);
960
961 menu = menu_create(szTitle, "MH_Main");
962
963 format(szItem, 63, "Umiejetnosci ( \r%i \yPunktow \w)", gPoints[id])
964 menu_additem(menu, szItem);
965 menu_additem(menu, "\d#\w Opisy umiejetnosci");
966 menu_additem(menu, "Bronie^n");
967
968 menu_additem(menu, "Gracze^n");
969
970 if(gbVip[id])
971 menu_additem(menu, "Reset Umiejetnosci");
972 else
973 menu_additem(menu, "Reset Umiejetnosci ( \r5 \yCzaszek \w)");
974 }
975
976 format(szItem, 63, "Language: \y%s", gLanguage[id] ? "English" : "Polish");
977 menu_additem(menu, szItem);
978
979 menu_display(id, menu);
980}
981
982public MH_Main(id, menu, item)
983{
984 if( item == MENU_EXIT )
985 {
986 menu_destroy(menu);
987 return;
988 }
989
990 switch(item+1)
991 {
992 case 1: MS_Skills(id, 0);
993 case 2:
994 {
995 static szMotd[2048], szMessage[128], szBonus[16];
996
997 format(szMotd, sizeof szMotd - 1, "<meta http-equiv=^"Content-Type^" content=^"text/html; charset=iso-8859-2^"><body bgcolor=#000000><font color =#4cbc1b font size =5>Expmod: %s<font color =#FFB000 font size =3><br><br><b>", gLanguage[id] ? "Skills" : "Umiejetnosci");
998
999 for(new i=0; i<Skills; ++i)
1000 {
1001 format(szMessage, sizeof szMessage - 1, "%s - %s<br>", g_sSkillsNames[i][gLanguage[id]], g_sSkillsDescription[i][gLanguage[id]]);
1002 format(szBonus, sizeof szBonus - 1, "%i-%i", g_sSkillsValues[i], g_sSkillsValues[i] * g_sSkillsMaxLevels[i])
1003 replace_all(szMessage, sizeof szMessage - 1, "%x", szBonus);
1004 add(szMotd, sizeof szMotd - 1, szMessage);
1005 }
1006
1007 add(szMotd, sizeof szMotd - 1, "</b>");
1008
1009 show_motd(id, szMotd, "Easyblock Expmod - Skills");
1010 }
1011 case 3: MS_Weapons(id);
1012 case 4: MS_Players(id);
1013 case 5:
1014 {
1015 if(gbVip[id] || gSkulls[id] >= 5)
1016 MS_ResetPoints(id);
1017 else
1018 {
1019 if(gLanguage[id])
1020 Print(id, "You don't have enough skulls");
1021 else
1022 Print(id, "Masz za malo czaszek");
1023 }
1024 }
1025 case 6:
1026 {
1027 gLanguage[id] ? (gLanguage[id] = 0) : (gLanguage[id] = 1);
1028 MS_Main(id);
1029 }
1030 }
1031
1032 menu_destroy(menu);
1033}
1034
1035public MS_ResetPoints(id)
1036{
1037 new szMenuBody[256], iLen, keys = (1<<0)|(1<<1);
1038
1039 iLen = formatex(szMenuBody, sizeof szMenuBody -1, "\y[%s]\w Czy na pewno chcesz zresetowac punkty?^n^n", PREFIX);
1040 iLen += formatex(szMenuBody[iLen], sizeof szMenuBody -1, "\r1.\w Tak^n");
1041 iLen += formatex(szMenuBody[iLen], sizeof szMenuBody -1, "\r2.\w Nie");
1042
1043 show_menu(id, keys, szMenuBody, -1, "M_ResetPoints");
1044
1045 return 1;
1046}
1047
1048public MH_ResetPoints(id, key)
1049{
1050 if(key == 0)
1051 {
1052 if(!gbVip[id])
1053 gSkulls[id] -= 5;
1054
1055 ResetPoints(id);
1056 }
1057 else
1058 MS_Main(id);
1059}
1060
1061public ResetPoints(id)
1062{
1063 for(new i=0; i<Skills; i++)
1064 gSkill[id][i] = 0;
1065
1066 gPoints[id] = gLvl[id];
1067
1068 Print(id, "Zresetowales swoje skille. Zostalo Ci zwrocone^1 %i punktow", gPoints[id]);
1069}
1070
1071public MS_Skills(id, page)
1072{
1073 new szTitle[64];
1074 if(gLanguage[id])
1075 format(szTitle, sizeof szTitle - 1, "\y[%s] \wSkills Menu^nYour points: \y%i\r", PREFIX, gPoints[id]);
1076 else
1077 format(szTitle, sizeof szTitle - 1, "\y[%s] \wMenu umiejetnosci^nTwoje punkty: \y%i\r", PREFIX, gPoints[id]);
1078
1079 new menu = menu_create(szTitle, "MH_Skills");
1080
1081 menu_setprop(menu, MPROP_EXITNAME, "Powrot");
1082 menu_setprop(menu, MPROP_BACKNAME, "Poprzednie");
1083 menu_setprop(menu, MPROP_NEXTNAME, "Nastepne");
1084
1085 new szItem[64];
1086
1087 for(new i=0; i<Skills; ++i)
1088 {
1089 if(gSkill[id][i] == g_sSkillsMaxLevels[i])
1090 format(szItem, 63, "\d%s \w(\y%i lvl\w)[\rMAX\w]", g_sSkillsNames[i][gLanguage[id]], g_sSkillsMinLevels[i]);
1091 else
1092 format(szItem, 63, "%s%s \w(%s%i lvl\w)[\y%i\w/\r%i\w]", (gPoints[id] && gLvl[id] >= g_sSkillsMinLevels[i]) ? "\w" : "\d", g_sSkillsNames[i][gLanguage[id]], (gLvl[id] >= g_sSkillsMinLevels[i]) ? "\y" : "\r", g_sSkillsMinLevels[i], gSkill[id][i], g_sSkillsMaxLevels[i]);
1093
1094 menu_additem(menu, szItem);
1095 }
1096
1097 menu_display(id, menu, page);
1098}
1099
1100public MH_Skills(id, menu, item)
1101{
1102 if( item == MENU_EXIT )
1103 {
1104 menu_destroy(menu);
1105 MS_Main(id);
1106 return;
1107 }
1108
1109 gSelectedSkill[id] = item;
1110
1111 if(gSkill[id][gSelectedSkill[id]] >= g_sSkillsMaxLevels[gSelectedSkill[id]])
1112 {
1113 if(gLanguage[id])
1114 Print(id, "Your skill level is maximal.");
1115 else
1116 Print(id, "Osiagnales maksymalny poziom umiejetnosci.");
1117
1118 MS_Skills(id, GetPageByItem(item));
1119 return;
1120 }
1121
1122 if(gPoints[id] <= 0)
1123 {
1124 if(gLanguage[id])
1125 Print(id, "You have no points.");
1126 else
1127 Print(id, "Nie masz punktow do rozdania.");
1128
1129 MS_Skills(id, GetPageByItem(item));
1130 return;
1131 }
1132
1133 if(gLvl[id] < g_sSkillsMinLevels[gSelectedSkill[id]])
1134 {
1135 if(gLanguage[id])
1136 Print(id, "Your level is too low.");
1137 else
1138 Print(id, "Masz za maly poziom.");
1139
1140 MS_Skills(id, GetPageByItem(item));
1141 return;
1142 }
1143
1144 if(!gbVip[id] && gSelectedSkill[id] == skFrostBall)
1145 {
1146 if(gLanguage[id])
1147 Print(id, "Sorry, you are not VIP.");
1148 else
1149 Print(id, "Niestety, nie jestes VIPem.");
1150
1151 MS_Skills(id, GetPageByItem(item));
1152 return;
1153 }
1154
1155
1156 MS_AskSkills(id);
1157
1158 menu_destroy(menu);
1159}
1160
1161GetPageByItem(item)
1162 return floatround(item / 7.0, floatround_floor);
1163
1164public MS_AskSkills(id)
1165{
1166 new szMenuBody[128], iLen, keys = (1<<0)|(1<<1);
1167
1168 if(gLanguage[id])
1169 {
1170 iLen = formatex(szMenuBody, sizeof szMenuBody -1, "\y[%s]\w Do you want to buy \y%s \wlevel \r%i\w?", PREFIX, g_sSkillsNames[gSelectedSkill[id]][gLanguage[id]], gSkill[id][gSelectedSkill[id]] + 1);
1171 iLen += formatex(szMenuBody[iLen], sizeof szMenuBody -1, "^n^n\r1.\w Yes");
1172 iLen += formatex(szMenuBody[iLen], sizeof szMenuBody -1, "^n\r2.\w No");
1173 }
1174 else
1175 {
1176 iLen = formatex(szMenuBody, sizeof szMenuBody -1, "\y[%s]\w Czy chcesz kupic skill \y%s \wpoziom \r%i\w?", PREFIX, g_sSkillsNames[gSelectedSkill[id]][gLanguage[id]], gSkill[id][gSelectedSkill[id]] + 1);
1177 iLen += formatex(szMenuBody[iLen], sizeof szMenuBody -1, "^n^n\r1.\w Tak");
1178 iLen += formatex(szMenuBody[iLen], sizeof szMenuBody -1, "^n\r2.\w Nie");
1179 }
1180
1181 show_menu(id, keys, szMenuBody, -1, "M_AskSkills");
1182
1183 return 1;
1184}
1185
1186public MH_AskSkills(id, key)
1187{
1188 if(key == 0)
1189 {
1190 ++gSkill[id][gSelectedSkill[id]];
1191 --gPoints[id];
1192
1193 if(gLanguage[id])
1194 Print(id, "You bought^1 %s^3 level^4 %i", g_sSkillsNames[gSelectedSkill[id]][gLanguage[id]], gSkill[id][gSelectedSkill[id]]);
1195 else
1196 Print(id, "Kupiles^1 %s^3 poziom^4 %i", g_sSkillsNames[gSelectedSkill[id]][gLanguage[id]], gSkill[id][gSelectedSkill[id]]);
1197
1198 MS_Skills(id, GetPageByItem(gSelectedSkill[id]));
1199 }
1200 else
1201 MS_Main(id);
1202}
1203
1204public MS_Weapons(id)
1205{
1206 new szTitle[64];
1207 if(gLanguage[id])
1208 format(szTitle, sizeof szTitle - 1, "\y[%s] \wWeapons Menu^nYour skulls: \y%i", PREFIX, gSkulls[id]);
1209 else
1210 format(szTitle, sizeof szTitle - 1, "\y[%s] \wMenu Broni^nTwoje czaszki: \y%i", PREFIX, gSkulls[id]);
1211
1212 new menu = menu_create(szTitle, "MH_Weapons");
1213
1214 menu_setprop(menu, MPROP_EXITNAME, "Powrot");
1215 menu_setprop(menu, MPROP_BACKNAME, "Poprzednie");
1216 menu_setprop(menu, MPROP_NEXTNAME, "Nastepne");
1217
1218 new szItem[64];
1219
1220 for(new i=0; i<Weapons; ++i)
1221 {
1222 new iChance = gWeapon[id][i] * g_sWeaponsChances[i];
1223
1224 if(gbVip[id])
1225 iChance += g_iVipWeaponChance;
1226
1227 if(gWeapon[id][i] == g_sWeaponsMaxLevels[i])
1228 format(szItem, 63, "\d%s \w[\rMAX - %i %%\w] \r%i %s", g_sWeaponsNames[i][gLanguage[id]], iChance, g_sWeaponsCost[i], gLanguage[id] ? "Skulls" : "Czaszek");
1229 else
1230 format(szItem, 63, "%s%s \w[\y%i %%\w] \r%i %s", (gSkulls[id] >= g_sWeaponsCost[i]) ? "\w" : "\d", g_sWeaponsNames[i][gLanguage[id]], iChance + g_sWeaponsChances[i], g_sWeaponsCost[i], gLanguage[id] ? "Skulls" : "Czaszek");
1231
1232 menu_additem(menu, szItem);
1233 }
1234
1235 menu_display(id, menu);
1236}
1237
1238public MH_Weapons(id, menu, item)
1239{
1240 if( item == MENU_EXIT )
1241 {
1242 menu_destroy(menu);
1243 MS_Main(id);
1244 return;
1245 }
1246
1247 gSelectedSkill[id] = item;
1248
1249 if(gWeapon[id][gSelectedSkill[id]] >= g_sWeaponsMaxLevels[gSelectedSkill[id]])
1250 {
1251 if(gLanguage[id])
1252 Print(id, "Your weapon level is maximal.");
1253 else
1254 Print(id, "Osiagnales maksymalny poziom dla tej broni.");
1255
1256 MS_Weapons(id);
1257 return;
1258 }
1259
1260 if(gSkulls[id] < g_sWeaponsCost[gSelectedSkill[id]])
1261 {
1262 if(gLanguage[id])
1263 Print(id, "You don't have enough skulls.");
1264 else
1265 Print(id, "Nie masz wystarczajacej ilosci czaszek.");
1266
1267 MS_Weapons(id);
1268 return;
1269 }
1270
1271 MS_AskWeapons(id);
1272
1273 menu_destroy(menu);
1274}
1275
1276public MS_AskWeapons(id)
1277{
1278 new szMenuBody[128], iLen, keys = (1<<0)|(1<<1);
1279
1280 if(gLanguage[id])
1281 {
1282 iLen = formatex(szMenuBody, sizeof szMenuBody -1, "\y[%s]\w Do yo want to buy weapon: \y%s \w[\r%s %%\w] for \r%i \wskulls?", PREFIX, g_sWeaponsNames[gSelectedSkill[id]][gLanguage[id]], ((gWeapon[id][gSelectedSkill[id]] + 1) * g_sWeaponsChances[gSelectedSkill[id]]) + (gbVip[id] ? g_iVipWeaponChance : 0), g_sWeaponsCost[gSelectedSkill[id]]);
1283 iLen += formatex(szMenuBody[iLen], sizeof szMenuBody -1, "^n^n\r1.\w Yes");
1284 iLen += formatex(szMenuBody[iLen], sizeof szMenuBody -1, "^n\r2.\w No");
1285 }
1286 else
1287 {
1288 iLen = formatex(szMenuBody, sizeof szMenuBody -1, "\y[%s]\w Czy chcesz kupic szanse na bron: \y%s \w[\r%s %%\w] za \r%i \wczaszek?", PREFIX, g_sWeaponsNames[gSelectedSkill[id]][gLanguage[id]], ((gWeapon[id][gSelectedSkill[id]] + 1) * g_sWeaponsChances[gSelectedSkill[id]]) + (gbVip[id] ? g_iVipWeaponChance : 0), g_sWeaponsCost[gSelectedSkill[id]]);
1289 iLen += formatex(szMenuBody[iLen], sizeof szMenuBody -1, "^n^n\r1.\w Tak");
1290 iLen += formatex(szMenuBody[iLen], sizeof szMenuBody -1, "^n\r2.\w Nie");
1291 }
1292
1293 show_menu(id, keys, szMenuBody, -1, "M_AskWeapons");
1294
1295 return 1;
1296}
1297
1298public MH_AskWeapons(id, key)
1299{
1300 if(key == 0)
1301 {
1302 ++gWeapon[id][gSelectedSkill[id]];
1303 gSkulls[id] -= g_sWeaponsCost[gSelectedSkill[id]];
1304
1305 if(gLanguage[id])
1306 Print(id, "You bought^1 %s^3 level^4 %i", g_sWeaponsNames[gSelectedSkill[id]][gLanguage[id]], gWeapon[id][gSelectedSkill[id]]);
1307 else
1308 Print(id, "Kupiles^1 %s^3 poziom^4 %i", g_sWeaponsNames[gSelectedSkill[id]][gLanguage[id]], gWeapon[id][gSelectedSkill[id]]);
1309
1310 MS_Weapons(id);
1311 }
1312 else
1313 MS_Main(id);
1314}
1315
1316public MS_Players(id)
1317{
1318 static title[128];
1319 new szItem[64], szNum[5];
1320 formatex(title, sizeof(title) - 1, "\r[%s]\y %s", PREFIX, gLanguage[id] ? "Players Menu" : "Menu Graczy");
1321 new menu = menu_create(title, "MH_Players");
1322
1323 for(new i=1; i<MAX_PLAYERS; i++)
1324 {
1325 if(!gbConnected[i])
1326 continue;
1327
1328 num_to_str(i, szNum, 4);
1329 format(szItem, sizeof szItem-1, "%s", gszName[i])
1330 menu_additem(menu, szItem, szNum);
1331 }
1332
1333 menu_setprop(menu, MPROP_EXITNAME, "Powrot");
1334 menu_setprop(menu, MPROP_BACKNAME, "Poprzednia");
1335 menu_setprop(menu, MPROP_NEXTNAME, "Nastepna");
1336 menu_display(id, menu);
1337
1338 return PLUGIN_HANDLED;
1339}
1340
1341public MH_Players(id, menu, item)
1342{
1343 if( item == MENU_EXIT )
1344 {
1345 MS_Main(id);
1346 menu_destroy(menu);
1347 return;
1348 }
1349
1350 new info[6], szItem[33], _access, callback;
1351 menu_item_getinfo(menu, item, _access, info, 5, szItem, 32, callback);
1352
1353 ShowInfo(id, str_to_num(info));
1354 MS_Main(id);
1355
1356 menu_destroy(menu);
1357}
1358
1359ShowInfo(id, target)
1360{
1361 new motd[1024], len;
1362
1363 if(gLanguage[id])
1364 {
1365 len = format(motd, sizeof motd - 1, "<body bgcolor=#000000>\
1366 <br><font color =#4cbc1b font size =3><b>Name:</b></font><font color =aqua font size =4> %s</font>\
1367 <br><font color =#4cbc1b font size =3><b>Level:</b></font><font color =aqua font size =4> %i</font>\
1368 <br><font color =#4cbc1b font size =3><b>Exp:</b></font><font color =aqua font size =4> %i</font>\
1369 <br><font color =#4cbc1b font size =3>", gszName[target], gLvl[target], gExp[target]);
1370 len += format(motd[len], sizeof motd - 1 - len, "<br><br><font color =red font size =4><b>Skills</b></font><br><font color =#FFB000 font size =3>");
1371 }
1372 else
1373 {
1374 len = format(motd, sizeof motd - 1, "<body bgcolor=#000000>\
1375 <br><font color =#4cbc1b font size =3><b>Nick:</b></font><font color =aqua font size =4> %s</font>\
1376 <br><font color =#4cbc1b font size =3><b>Poziom:</b></font><font color =aqua font size =4> %i</font>\
1377 <br><font color =#4cbc1b font size =3><b>Exp:</b></font><font color =aqua font size =4> %i</font>\
1378 <br><font color =#4cbc1b font size =3>", gszName[target], gLvl[target], gExp[target]);
1379 len += format(motd[len], sizeof motd - 1 - len, "<br><br><font color =red font size =4><b>Umiejetnosci</b></font><br><font color =#FFB000 font size =3>");
1380 }
1381
1382 for(new i=0; i<Skills; ++i)
1383 if(gSkill[target][i])
1384 len += format(motd[len], sizeof motd - 1 - len, "%s: %i / %i<br>", g_sSkillsNames[i][gLanguage[id]], gSkill[target][i], g_sSkillsMaxLevels[i]);
1385
1386 len += format(motd[len], sizeof motd - 1 - len, "<br>");
1387
1388 for(new i=0; i<Weapons; ++i)
1389 if(gWeapon[target][i])
1390 len += format(motd[len], sizeof motd - 1 - len, "%s: %i / %i<br>", g_sWeaponsNames[i][gLanguage[id]], gWeapon[target][i], g_sWeaponsMaxLevels[i]);
1391
1392 show_motd(id, motd, "Easyblock Expmod");
1393}
1394
1395
1396public MS_UseSkills(id)
1397{
1398 new szMenuBody[256], iLen, keys = (1<<9), sName[64];
1399
1400 iLen = formatex(szMenuBody, sizeof szMenuBody -1, "\y[%s]\w %s:^n^n", PREFIX, gLanguage[id] ? "Use abilities" : "Uzyj umiejetnosci");
1401
1402 for(new i=0; i<usable; ++i)
1403 {
1404 keys |= (1<<i);
1405
1406 switch(i)
1407 {
1408 case useAura: copy(sName, 63, g_sSkillsNames[skAura][gLanguage[id]]);
1409 case useStealth: copy(sName, 63, g_sSkillsNames[skStealth][gLanguage[id]]);
1410 case useBomb: copy(sName, 63, g_sSkillsNames[skBomb][gLanguage[id]]);
1411 case useFrostBall: copy(sName, 63, g_sSkillsNames[skFrostBall][gLanguage[id]]);
1412 case useVampire: copy(sName, 63, g_sSkillsNames[skVampire][gLanguage[id]]);
1413 case usePush: copy(sName, 63, g_sSkillsNames[skPush][gLanguage[id]]);
1414 }
1415
1416 iLen += formatex(szMenuBody[iLen], sizeof szMenuBody - 1, "\r%i.%s %s^n", i+1, gbCanUse[id][i] ? "\w" : "\d", sName);
1417 }
1418
1419 iLen += formatex(szMenuBody[iLen], sizeof szMenuBody -1, "^n\r0.\w %s", gLanguage[id] ? "Back" : "Powrot");
1420
1421 show_menu(id, keys, szMenuBody, -1, "M_UseSkills");
1422
1423 return 1;
1424}
1425
1426public MH_UseSkills(id, key)
1427{
1428 new iKey = key+1;
1429
1430 if(!gbAlive[id])
1431 {
1432 if(iKey == 10)
1433 return 1;
1434
1435 else
1436 {
1437 MS_UseSkills(id);
1438 Print(id, "%s", gLanguage[id] ? "You have to be alive!" : "Musisz byc zywy!");
1439 return 1;
1440 }
1441 }
1442
1443 if(key < usable)
1444 {
1445 if(!gbCanUse[id][key])
1446 {
1447 MS_UseSkills(id);
1448 return 1;
1449 }
1450 }
1451
1452 switch(iKey)
1453 {
1454 case 1: cmdUseAura(id);
1455 case 2: cmdUseStealth(id);
1456 case 3: cmdUseBomb(id);
1457 case 4: cmdUseFrostBall(id);
1458 case 5: cmdUseVampirism(id);
1459 case 6: cmdUsePush(id);
1460
1461 case 10: return 1;
1462 }
1463
1464 MS_UseSkills(id);
1465
1466 return 1;
1467}
1468
1469public fwdDeath()
1470{
1471 new vid = read_data(2);
1472 gbAlive[vid] = false;
1473
1474 if(gSkill[vid][sRespawn])
1475 {
1476 new iChance = gSkill[vid][sRespawn] * g_sSkillsValues[sRespawn];
1477 if(random_num(1,100) <= iChance)
1478 set_task(0.5, "TaskRespawn", vid);
1479 }
1480
1481 new kid = read_data(1);
1482
1483 if(gSkill[vid][sBlow] && vid != kid && random_num(1, 100) <= gSkill[vid][sBlow] * g_sSkillsValues[sBlow])
1484 set_task(0.1, "TaskBlow", vid);
1485
1486 if(isPlayer(kid) && vid != kid && IsEnoughPlayers())
1487 {
1488 if(read_data(3)) // HeadShot!
1489 {
1490 new Float:vOrigin[3];
1491 pev(vid, pev_origin, vOrigin);
1492
1493 vOrigin[2] += 50.0;
1494
1495 eff_Headshot(vOrigin);
1496
1497 ++gSkulls[kid];
1498
1499 if(gLanguage[kid])
1500 Print(kid, "You received^1 a skull")
1501 else
1502 Print(kid, "Otrzymales^1 czaszke");
1503 }
1504 }
1505
1506 return 1;
1507}
1508
1509public TaskBlow(id)
1510{
1511 new Float:vOrigin[3];
1512 pev(id, pev_origin, vOrigin);
1513
1514 ExplodeAround(id, id, vOrigin, 50.0, RADIUS_BLOW, p_SpriteBlow);
1515}
1516
1517public TaskRespawn(id)
1518{
1519 ExecuteHamB(Ham_CS_RoundRespawn, id);
1520 Print(id, "Odrodziles sie!");
1521
1522 set_hudmessage(255, 255, 255, 0.2, 0.3, 0, 5.0, 5.0, 1.0, 1.0, 8);
1523 show_hudmessage(0, "%s sie odrodzil!", gszName[id]);
1524}
1525
1526stock bool:IsEnoughPlayers()
1527 return bool:(get_playersnum() >= get_pcvar_num(pMin));
1528
1529stock eff_Headshot(Float:vOrigin[3])
1530{
1531 message_begin(MSG_BROADCAST,SVC_TEMPENTITY );
1532 write_byte(TE_SPRITE);
1533 write_coord_f(vOrigin[0]);
1534 write_coord_f(vOrigin[1]);
1535 write_coord_f(vOrigin[2]);
1536 write_short(p_SpriteSkull);
1537 write_byte(5);
1538 write_byte(200);
1539 message_end();
1540}
1541
1542public EventNewRound()
1543{
1544 new iEnt = -1;
1545 while( (iEnt = fm_find_ent_by_class(iEnt, g_sClassBomb)) )
1546 fm_remove_entity(iEnt);
1547
1548 while( (iEnt = fm_find_ent_by_class(iEnt, g_sClassFrost)) )
1549 fm_remove_entity(iEnt);
1550
1551 set_task(0.1, "formatTop15");
1552}
1553
1554public EventRoundEnd()
1555{
1556 new iSurv = get_pcvar_num(pSurv);
1557 new iSurvVip = floatround(iSurv * 1.25);
1558 new bool:bEnough = IsEnoughPlayers();
1559
1560 for(new id = 1; id <= MAX_PLAYERS; ++id)
1561 {
1562 if( !gbAlive[id] || get_user_team(id) != 1 )
1563 continue;
1564
1565 if(!bEnough)
1566 {
1567 Print(id, "Za malo graczy aby dostac bonus za przezycie");
1568 continue;
1569 }
1570
1571 AddExp(id, gbVip[id] ? iSurvVip : iSurv);
1572 Print(id, "Dostales^1 %i expa^3 za przezycie!", gbVip[id] ? iSurvVip : iSurv);
1573 }
1574}
1575
1576AddExp(id, exp, bool:sound = true)
1577{
1578 gExp[id] += exp;
1579 gTotalExp[id] += exp;
1580
1581 CheckLevelUp(id, sound);
1582
1583 return gExp[id];
1584}
1585
1586public fwdTakeDamage(victim, inflictor, attacker, Float:fDamage, BitDamage)
1587{
1588 if(!is_user_alive(victim))
1589 return HAM_IGNORED;
1590
1591 if(BitDamage & DMG_FALL)
1592 {
1593 new Float:fPercent = 1.0 - 0.01 * (gSkill[victim][sNoFall] * g_sSkillsValues[sNoFall]);
1594 fDamage *= fPercent;
1595 }
1596
1597 if(isPlayer(attacker) && gbConnected[attacker] && get_user_team(victim) != get_user_team(attacker))
1598 {
1599 if(!(BitDamage & DMG_HEGRENADE))
1600 {
1601 if(gSkill[attacker][sCritical])
1602 {
1603 if(random_num(1, 100) <= (g_sSkillsValues[sCritical] * gSkill[attacker][sCritical]))
1604 {
1605 fDamage *= 2.0;
1606
1607 new Float:fOrigin[3];
1608 pev(victim, pev_origin, fOrigin)
1609
1610 message_begin(MSG_BROADCAST, SVC_TEMPENTITY);
1611 write_byte(TE_ARMOR_RICOCHET);
1612 engfunc(EngFunc_WriteCoord, fOrigin[0]);
1613 engfunc(EngFunc_WriteCoord, fOrigin[1]);
1614 engfunc(EngFunc_WriteCoord, fOrigin[2]);
1615 write_byte(45);
1616 message_end();
1617 }
1618 }
1619
1620 if(gSkill[victim][sThorns] && !(BitDamage & DMG_PARALYZE))
1621 {
1622 new Float:fDeal = fDamage * gSkill[victim][sThorns] * g_sSkillsValues[sThorns] * 0.01;
1623
1624 ExecuteHamB(Ham_TakeDamage, attacker, inflictor, victim, fDeal, DMG_PARALYZE);
1625 Display_Fade(attacker, 1, 1, 0, 255, 55, 55, 20);
1626 }
1627 }
1628
1629 new Float:fHealth = float(get_user_health(victim))
1630 CountExp(attacker, ((fDamage > fHealth) ? fHealth : fDamage));
1631 }
1632
1633 SetHamParamFloat(4, fDamage);
1634
1635 return HAM_IGNORED;
1636}
1637
1638public fwdTakeDamagePost(victim, inflictor, attacker, Float:fDamage, BitDamage)
1639{
1640 if(BitDamage & DMG_PARALYZE || (isPlayer(victim) && gSkill[victim][sNoPainShock] && random_num(1, 100) <= gSkill[victim][sNoPainShock] * g_sSkillsValues[sNoPainShock]))
1641 set_pdata_float(victim, 108, 1.0);
1642
1643 return HAM_IGNORED;
1644}
1645
1646public CountExp(attacker, Float:fDamage)
1647{
1648 if(!IsEnoughPlayers())
1649 return;
1650
1651 new taskid = TASK_COUNTER + attacker;
1652
1653 if(task_exists(taskid))
1654 remove_task(taskid);
1655
1656 new Float:fCount = fDamageCounter;
1657
1658 if(gbVip[attacker])
1659 fCount *= 1.25;
1660
1661 gTemp[attacker][0] += floatround(fDamage * fCount);
1662 gTemp[attacker][1] += floatround(fDamage);
1663
1664 set_hudmessage(255, 255, 255, 0.44, 0.52, 0, 1.0, 1.0, 0.5, 0.5, 4);
1665 show_hudmessage(attacker, " + %d Exp [%i dmg]", gTemp[attacker][0], gTemp[attacker][1]);
1666
1667 set_task(3.0, "CountAllExp", taskid);
1668}
1669
1670public CountAllExp(id)
1671{
1672 id -= TASK_COUNTER;
1673
1674 if(!gbConnected[id]) return 0;
1675 if(task_exists(id + TASK_COUNTER)) remove_task(id + TASK_COUNTER);
1676
1677 set_hudmessage(255, 15, 129, 0.44, 0.52, 2, 32.0, 5.5, 0.01, 0.1, 4);
1678 show_hudmessage(id, " W sumie:^n + %d Exp [%i dmg]", gTemp[id][0], gTemp[id][1]);
1679
1680 AddExp(id, gTemp[id][0]);
1681 gTemp[id][0] = 0;
1682 gTemp[id][1] = 0;
1683
1684 return 1;
1685}
1686
1687public CheckLevelUp(id, bool:sound)
1688{
1689 if(gLvl[id] >= MAX_LEVEL)
1690 {
1691 gfPercent[id] = 100.0;
1692 return;
1693 }
1694
1695 new bool:bLeveled = false;
1696
1697 while(gExp[id] > g_iExpTable[gLvl[id]])
1698 {
1699 gExp[id] -= g_iExpTable[gLvl[id]];
1700 ++gLvl[id];
1701 ++gPoints[id];
1702
1703 bLeveled = true;
1704
1705 if(gLvl[id] == MAX_LEVEL)
1706 {
1707 gfPercent[id] = 100.0;
1708 break;
1709 }
1710 }
1711
1712 if(bLeveled)
1713 {
1714 if(sound)
1715 Emit(id, g_sSoundLevel);
1716
1717 for(new i=1; i<=MAX_PLAYERS; ++i)
1718 {
1719 if(!gbConnected[i] || i == id)
1720 continue;
1721
1722 if(gLanguage[i])
1723 Print(i, "^1%s^3 leveled up to level^4 %i", gszName[id], gLvl[id]);
1724 else
1725 Print(i, "^1%s^3 awansowal do poziomu^4 %i", gszName[id], gLvl[id]);
1726 }
1727
1728 if(gLanguage[id])
1729 Print(id, "You leveled up to^4 %i", gLvl[id]);
1730 else
1731 Print(id, "Awansowales do poziomu^4 %i", gLvl[id]);
1732 }
1733
1734 if(gLvl[id] < MAX_LEVEL)
1735 gfPercent[id] = GetPercent(id);
1736}
1737
1738Float:GetPercent(id)
1739 return (gExp[id] * 100.0 / (g_iExpTable[gLvl[id]] * 1.0));
1740
1741public ShowLevelBar(id)
1742{
1743 new szText[128];
1744
1745 if(gLanguage[id])
1746 format(szText, 127, "Level: %d ( %.1f%s ) | Skulls: %d", gLvl[id], gfPercent[id], "%%", gSkulls[id]);
1747 else
1748 format(szText, 127, "Poziom: %d ( %.1f%s ) | Czachy: %d", gLvl[id], gfPercent[id], "%%", gSkulls[id]);
1749
1750 message_begin(MSG_ONE, g_msgStatusText, {0,0,0}, id);
1751 write_byte(0);
1752 write_string(szText);
1753 message_end();
1754}
1755
1756public fwdHeDamage(id)
1757{
1758 new grenade = pev(id, pev_dmg_inflictor);
1759
1760 if(isPlayer(grenade) || !pev_valid(grenade))
1761 return PLUGIN_CONTINUE;
1762
1763 //new attacker = pev(grenade, pev_owner);
1764 new attacker = get_user_attacker(id);
1765
1766 if((get_user_team(id) == get_user_team(attacker) && attacker != id) || !gSkill[attacker][sKnockbackHe])
1767 return PLUGIN_CONTINUE;
1768
1769 new szClass[8];
1770 entity_get_string(grenade, EV_SZ_classname, szClass, 7);
1771
1772 if (!equal(szClass, "grenade"))
1773 return PLUGIN_CONTINUE;
1774
1775 new Float:upVector[3]
1776 upVector[0] = float(read_data(4))
1777 upVector[1] = float(read_data(5))
1778 upVector[2] = float(read_data(6))
1779
1780 new iDamage = read_data(2);
1781 set_velocity_from_origin(id, upVector, (10.0 + gSkill[attacker][sKnockbackHe] * g_sSkillsValues[sKnockbackHe] * 1.0) * iDamage * 0.15);
1782
1783
1784 return PLUGIN_CONTINUE
1785}
1786
1787// Skille aktywne
1788// Aura
1789public cmdUseAura(id)
1790{
1791 new Float:vOrigin[3];
1792 pev(id, pev_origin, vOrigin);
1793
1794 new iTeam = get_user_team(id);
1795
1796 new ent = create_entity("info_target");
1797
1798 set_pev(ent, pev_classname,"clAura");
1799 set_pev(ent, pev_owner, id);
1800 set_pev(ent, pev_solid, SOLID_NOT);
1801 set_pev(ent, pev_origin, vOrigin);
1802 set_pev(ent, pev_team, iTeam);
1803 set_pev(ent, pev_iuser1, floatround(gSkill[id][skAura] * g_sSkillsValues[skAura] * 0.1));
1804 entity_set_model(ent, g_sModelAura);
1805
1806 if(iTeam == 2)
1807 set_rendering(ent, kRenderFxGlowShell, 0, 64, 255, kRenderTransTexture, 55);
1808 else
1809 set_rendering(ent, kRenderFxGlowShell, 255, 64, 0, kRenderTransTexture, 55);
1810
1811 set_task(1.0, "TaskAuraHeal", ent+TASK_AURA, _, _, "a", 10);
1812 set_task(10.0, "TaskDeleteAura", ent+TASK_DELAURA);
1813
1814 gbCanUse[id][useAura] = false;
1815}
1816
1817public TaskAuraHeal(ent)
1818{
1819 ent -= TASK_AURA;
1820
1821 static const Float:fAuraDist = 80.0;
1822
1823 new Float:vOrigin[3];
1824 pev(ent, pev_origin, vOrigin);
1825
1826 new entlist[33];
1827 new numfound = find_sphere_class(0, "player", fAuraDist, entlist, 32, vOrigin);
1828
1829 for (new i=0; i < numfound; i++)
1830 {
1831 new pid = entlist[i];
1832
1833 if(get_user_team(pid) != pev(ent, pev_team) || !gbAlive[pid])
1834 continue;
1835
1836 new health = get_user_health(pid);
1837 if(health >= gMaxHealth[pid])
1838 continue;
1839
1840 health += pev(ent, pev_iuser1);
1841
1842 set_pev(pid, pev_health, min(gMaxHealth[pid], health) * 1.0);
1843 }
1844}
1845
1846public TaskDeleteAura(ent)
1847{
1848 ent -= TASK_DELAURA;
1849
1850 if(is_valid_ent(ent))
1851 remove_entity(ent);
1852}
1853
1854// Stealth
1855public cmdUseStealth(id)
1856{
1857 gfStealthTime[id] = gSkill[id][skStealth] * g_sSkillsValues[skStealth] * 1.0;
1858 gCurrentVis[id] = 255;
1859
1860 set_bartime(id, 2);
1861
1862 set_task(0.4, "TaskMakeMoreInv", id + TASK_MORESTEALTH, _, _, "a", 5);
1863
1864 gbCanUse[id][useStealth] = false;
1865
1866 Emit(id, g_sSoundStealth);
1867}
1868
1869public TaskMakeMoreInv(id)
1870{
1871 id -= TASK_MORESTEALTH;
1872
1873 if(!gbAlive[id])
1874 {
1875 if(task_exists(id + TASK_MORESTEALTH))
1876 remove_task(id + TASK_MORESTEALTH);
1877 return;
1878 }
1879
1880 gCurrentVis[id] -= 51;
1881
1882 if(gCurrentVis[id] <= 0)
1883 {
1884 fm_set_visiblity(id, 0);
1885 new iTimes = gSkill[id][skStealth] * g_sSkillsValues[skStealth] * 10;
1886
1887 set_task(0.1, "TaskStealthCount", id + TASK_STEALTH, _, _, "a", iTimes);
1888 return;
1889 }
1890
1891 fm_set_visiblity(id, gCurrentVis[id]);
1892}
1893
1894public TaskStealthCount(task_id)
1895{
1896 new id = task_id - TASK_STEALTH;
1897
1898 if(!gbAlive[id])
1899 {
1900 gfStealthTime[id] = 0.0;
1901 return;
1902 }
1903
1904 gfStealthTime[id] -= 0.1;
1905
1906 set_hudmessage(255, 255, 255, 0.02, 0.20, 0, 0.2, 0.3, 0.5, 0.5, 11);
1907 show_hudmessage(id, "[ExpMod] Niewidzialnosc : %.1f", gfStealthTime[id]);
1908
1909 if(gfStealthTime[id] <= 0.1)
1910 {
1911 gCurrentVis[id] = 255;
1912 fm_set_visiblity(id, 255);
1913 gfStealthTime[id] = 0.0;
1914
1915 if(task_exists(task_id))
1916 remove_task(task_id);
1917 }
1918}
1919
1920// Bomb
1921
1922public cmdUseBomb(id)
1923{
1924 new Float:fOrigins[3], iEnt;
1925
1926 pev(id, pev_origin, fOrigins);
1927
1928 iEnt = fm_create_entity("info_target");
1929 fm_entity_set_model(iEnt, g_sModelBomb);
1930 fm_entity_set_origin(iEnt, fOrigins);
1931
1932 set_pev(iEnt, pev_classname, g_sClassBomb);
1933 set_pev(iEnt, pev_solid, SOLID_BBOX)
1934 set_pev(iEnt, pev_movetype, MOVETYPE_BOUNCE)
1935 set_pev(iEnt, pev_owner, id);
1936 set_pev(iEnt, pev_team, get_user_team(id));
1937 set_pev(iEnt, pev_iuser1, 0);
1938
1939 set_pev(iEnt, pev_renderfx, kRenderFxGlowShell);
1940 set_pev(iEnt, pev_rendermode, kRenderNormal);
1941 set_pev(iEnt, pev_renderamt, 16.0);
1942 set_pev(iEnt, pev_rendercolor, Float:{175.0, 50.0, 0.0});
1943
1944 new Float:fVelo[3];
1945 velocity_by_aim(id, 500, fVelo);
1946 fVelo[2] += 150.0;
1947 set_pev(iEnt, pev_velocity, fVelo);
1948
1949 message_begin(MSG_BROADCAST, SVC_TEMPENTITY);
1950 write_byte(TE_BEAMFOLLOW);
1951 write_short(iEnt); // entity
1952 write_short(p_SpriteTrail); // sprite
1953 write_byte(10); // life
1954 write_byte(3); // width
1955 write_byte(175);
1956 write_byte(50);
1957 write_byte(0);
1958 write_byte(100);
1959 message_end();
1960
1961 gbCanUse[id][useBomb] = false;
1962
1963 return PLUGIN_HANDLED;
1964}
1965
1966public fwdTouchBomb(ent)
1967{
1968 new Float:vOrigin[3];
1969 pev(ent, pev_origin, vOrigin);
1970
1971 new entinsphere = -1;
1972 while( ( entinsphere = fm_find_ent_in_sphere(entinsphere, vOrigin, 32.0) ) )
1973 {
1974 if(!is_user_alive(entinsphere))
1975 continue;
1976
1977 if(get_user_team(entinsphere) != pev(ent, pev_team))
1978 {
1979 set_task(0.01, "TaskExplode", ent+TASK_EXPLODE);
1980 return 1;
1981 }
1982 }
1983
1984 new Float:vVelo[3];
1985 pev(ent, pev_velocity, vVelo);
1986
1987 vVelo[0] *= 0.5;
1988 vVelo[1] *= 0.5;
1989 vVelo[2] *= 0.8;
1990
1991 set_pev(ent, pev_velocity, vVelo);
1992
1993 new iBounces = pev(ent, pev_iuser1);
1994
1995 if(iBounces >= 2)
1996 {
1997 new Float:fTime = 0.3;
1998
1999 if(floatabs(vVelo[2]) < 250.0)
2000 fTime = 0.01;
2001
2002 set_task(fTime, "TaskExplode", ent + TASK_EXPLODE);
2003 return 1;
2004 }
2005
2006 set_pev(ent, pev_iuser1, iBounces + 1);
2007
2008 return 1;
2009}
2010
2011public TaskExplode(ent)
2012{
2013 ent -= TASK_EXPLODE;
2014
2015 ExplodeBomb(ent);
2016 Effect_KillBeam(0, ent);
2017}
2018
2019public ExplodeBomb(ent)
2020{
2021 new attacker = pev(ent, pev_owner);
2022
2023 new iPos[3], Float:fPos[3];
2024 pev(ent, pev_origin, fPos);
2025 FVecIVec(fPos, iPos);
2026
2027 iPos[2] += 50;
2028
2029 new Float:fDamage = 1.0 * gSkill[attacker][skBomb] * g_sSkillsValues[skBomb];
2030 ExplodeAround(attacker, ent, fPos, fDamage, RADIUS_BOMB, p_SpriteExplosion);
2031
2032 Emit(ent, g_sSoundBomb, 0.2);
2033 fm_remove_entity(ent);
2034}
2035
2036public ExplodeAround(id, ent, Float:vOrigin[3], Float:fDamage, Float:fRadius, sprite)
2037{
2038 new iTeam = get_user_team(id);
2039
2040 new iOrigin[3];
2041 FVecIVec(vOrigin, iOrigin);
2042
2043 Effect_Explosion(0, sprite, iOrigin, 10, 0, TE_EXPLFLAG_NOSOUND);
2044
2045 Emit(ent, g_sSoundBomb, 0.2);
2046
2047 new entinsphere = -1;
2048 while( ( entinsphere = fm_find_ent_in_sphere(entinsphere, vOrigin, fRadius) ) )
2049 {
2050 if(!is_user_alive(entinsphere))
2051 continue;
2052
2053 if(get_user_team(entinsphere) == iTeam)
2054 continue;
2055
2056 ExecuteHamB(Ham_TakeDamage, entinsphere, "", id, fDamage, DMG_PARALYZE);
2057 CountExp(id, fDamage);
2058 }
2059}
2060
2061public cmdUseFrostBall(id)
2062{
2063 new Float:fOrigins[3], iEnt;
2064
2065 pev(id, pev_origin, fOrigins);
2066
2067 iEnt = fm_create_entity("info_target");
2068 fm_entity_set_model(iEnt, "models/rpgrocket.mdl");
2069 fm_entity_set_origin(iEnt, fOrigins);
2070
2071 set_pev(iEnt, pev_classname, g_sClassFrost);
2072 set_pev(iEnt, pev_effects, EF_LIGHT)
2073 set_pev(iEnt, pev_solid, SOLID_BBOX)
2074 set_pev(iEnt, pev_movetype, MOVETYPE_FLY)
2075 set_pev(iEnt, pev_owner, id);
2076
2077 new Float:fVelo[3]
2078 velocity_by_aim(id, 400, fVelo)
2079 set_pev(iEnt, pev_velocity, fVelo)
2080
2081 message_begin(MSG_BROADCAST, SVC_TEMPENTITY);
2082 write_byte(TE_BEAMFOLLOW);
2083 write_short(iEnt); // entity
2084 write_short(p_SpriteTrail); // sprite
2085 write_byte(20); // life
2086 write_byte(10); // width
2087 write_byte(150);
2088 write_byte(150);
2089 write_byte(250);
2090 write_byte(255);
2091 message_end();
2092
2093 gbCanUse[id][useFrostBall] = false;
2094
2095 Emit(id, g_sSoundFrost);
2096
2097 return PLUGIN_HANDLED;
2098}
2099
2100public Explode_Origin(id, Float:origin[3])
2101{
2102 new iOrigin[3];
2103 FVecIVec(origin, iOrigin);
2104
2105 message_begin(MSG_BROADCAST, SVC_TEMPENTITY)
2106 write_byte(TE_SPRITETRAIL)
2107 write_coord(iOrigin[0])
2108 write_coord(iOrigin[1])
2109 write_coord(iOrigin[2])
2110 write_coord(iOrigin[0])
2111 write_coord(iOrigin[1])
2112 write_coord(iOrigin[2]+25)
2113 write_short(p_SpriteTele)
2114 write_byte(25) //count
2115 write_byte(2) //life dlugosc zycia
2116 write_byte(1) //scale 10 = normal size
2117 write_byte(15) //vel wiecej = mocniej odlatuja
2118 write_byte(20) //random vel
2119 message_end()
2120
2121 new entinsphere = -1;
2122 while( ( entinsphere = fm_find_ent_in_sphere(entinsphere, origin, RADIUS_FROST) ) )
2123 {
2124 if(!isPlayer(entinsphere) || !gbAlive[entinsphere])
2125 continue;
2126
2127 new bool:sTeam = bool:(get_user_team(entinsphere) == get_user_team(id))
2128 if(!sTeam || (sTeam && id == entinsphere))
2129 {
2130 gfFrozenEffect[entinsphere] = 75.0;
2131 set_pev(entinsphere, pev_maxspeed, gfFrozenEffect[entinsphere]);
2132
2133 /*message_begin(MSG_ONE, g_msgScreenFade, {0,0,0}, entinsphere);
2134 write_short(1<<14);
2135 write_short(1<<14);
2136 write_short(1<<16);
2137 write_byte (0);
2138 write_byte (100);
2139 write_byte (255);
2140 write_byte (150);
2141 message_end();*/
2142
2143 Display_Fade(entinsphere, 1, 5, 0, 0, 100, 255, 150);
2144
2145 if(task_exists(entinsphere + TASK_FROST))
2146 remove_task(entinsphere + TASK_FROST)
2147
2148 set_task(5.0, "TaskEndFreeze", entinsphere + TASK_FROST);
2149 }
2150 }
2151}
2152
2153public fwdTouchFrostBall(ent)
2154{
2155 new attacker = pev(ent, pev_owner);
2156 new Float:fOrigins[3];
2157
2158 pev(ent, pev_origin, fOrigins);
2159 Explode_Origin(attacker, fOrigins)
2160
2161 fm_remove_entity(ent)
2162}
2163
2164public TaskEndFreeze(id)
2165{
2166 id -= TASK_FROST;
2167
2168 gfFrozenEffect[id] = 0.0;
2169 ResetMaxspeed(id);
2170}
2171
2172public cmdUseVampirism(id)
2173{
2174 new ent, body;
2175 get_user_aiming(id, ent, body);
2176
2177 if(!isPlayer(ent) || get_user_team(id) == get_user_team(ent))
2178 return 1;
2179
2180 Effect_BeamEnts(p_SpriteWhite, id, ent, 0, 0, 10, 5, random_num(20, 40), 255, 0, 0, 255, 0);
2181 Effect_BeamEnts(p_SpriteWhite, id, ent, 0, 0, 10, 5, random_num(40, 60), 255, 0, 0, 255, 0);
2182 Effect_BeamEnts(p_SpriteWhite, id, ent, 0, 0, 10, 5, random_num(55, 75), 255, 0, 0, 255, 0);
2183
2184 new iHealth = get_user_health(id);
2185 new iAdd = min((get_user_health(ent) - 1), (gSkill[id][skVampire] * g_sSkillsValues[skVampire])) * 2;
2186
2187 set_hudmessage(255, 0, 127, 0.05, 0.70, 0, 1.5, 3.0, 1.0, 1.0, 5);
2188
2189 if( (iHealth + iAdd > gMaxHealth[id]) && iHealth < gMaxHealth[id] )
2190 {
2191 set_pev(id, pev_health, float(gMaxHealth[id]));
2192 show_hudmessage(id, "+ %i HP", iAdd);
2193 }
2194 else if( iHealth + iAdd < gMaxHealth[id] )
2195 {
2196 set_pev(id, pev_health, float(iHealth + iAdd));
2197 show_hudmessage(id, "+ %i HP", iAdd);
2198 }
2199
2200 fm_fakedamage(ent, "vampire gaze", 0.5 * iAdd, DMG_PARALYZE);
2201 CountExp(id, 0.5 * iAdd);
2202
2203 Emit(id, g_sSoundVampire);
2204
2205 gbCanUse[id][useVampire] = false;
2206
2207 return 1;
2208}
2209
2210stock Effect_BeamEnts(spriteid, startent, endent, startframe = 0, framerate = 0, life = 5, width = 5, amplitude = 0, red = 255, green = 255, blue = 255, brightness = 255, scrollspeed = 0)
2211{
2212 message_begin(MSG_ALL, SVC_TEMPENTITY)
2213 write_byte(TE_BEAMENTS)
2214 write_short(startent)
2215 write_short(endent)
2216 write_short(spriteid)
2217 write_byte(startframe)
2218 write_byte(framerate)
2219 write_byte(life)
2220 write_byte(width)
2221 write_byte(amplitude)
2222 write_byte(red)
2223 write_byte(green)
2224 write_byte(blue)
2225 write_byte(brightness)
2226 write_byte(scrollspeed)
2227 message_end()
2228}
2229
2230public cmdUsePush(id)
2231{
2232 new Float:vOrigin[3], Float:vOriginPlayer[3];
2233 pev(id, pev_origin, vOrigin);
2234
2235 new Float:fDist, Float:fSpeed, Float:vVelo[3];
2236 new Float:fPushDist = 250.0;
2237
2238 new iTeam = get_user_team(id);
2239
2240 for(new i=0; i<=MAX_PLAYERS; ++i)
2241 {
2242 if(!gbAlive[i] || get_user_team(i) == iTeam)
2243 continue;
2244
2245 pev(i, pev_origin, vOriginPlayer);
2246 fDist = vector_distance(vOriginPlayer, vOrigin);
2247
2248 if(fDist > fPushDist )
2249 continue;
2250
2251 fSpeed = ( fPushDist / (fDist + fPushDist) ) * (500.0 + gSkill[id][skPush] * g_sSkillsValues[skPush]);
2252
2253 new Float:fDistance[3];
2254 fDistance[0] = vOriginPlayer[0] - vOrigin[0];
2255 fDistance[1] = vOriginPlayer[1] - vOrigin[1];
2256 fDistance[2] = vOriginPlayer[2] - vOrigin[2];
2257
2258 new Float:fTime = fDist / fSpeed;
2259
2260 vVelo[0] = fDistance[0] / fTime;
2261 vVelo[1] = fDistance[1] / fTime;
2262 vVelo[2] = fDistance[2] / fTime;
2263
2264 entity_set_vector(i, EV_VEC_velocity, vVelo);
2265 }
2266
2267 new origin[3];
2268 get_user_origin(id, origin);
2269
2270 message_begin(MSG_BROADCAST, SVC_TEMPENTITY);
2271 write_byte(TE_BEAMCYLINDER);
2272 write_coord(origin[0]);
2273 write_coord(origin[1]);
2274 write_coord(origin[2] - 20);
2275 write_coord(origin[0]);
2276 write_coord(origin[1]);
2277 write_coord(origin[2] + floatround(fPushDist));
2278 write_short(p_SpritePush);
2279 write_byte(0);
2280 write_byte(1);
2281 write_byte(4);
2282 write_byte(60);
2283 write_byte(1);
2284 write_byte(255);
2285 write_byte(255);
2286 write_byte(255);
2287 write_byte(75);
2288 write_byte(6);
2289 message_end();
2290
2291 Emit(id, g_sSoundPush);
2292
2293 gbCanUse[id][usePush] = false;
2294}
2295
2296/*
2297public cmdUsePush(id)
2298{
2299 new Float:fOrigin[3], Float:speed, Float:fOriginPlayer[3], Float:odilu = 1.0 * gSkill[id][skPush] * g_sSkillsValues[skPush];
2300 entity_get_vector(id, EV_VEC_origin, fOrigin);
2301 static origin[3];
2302
2303 get_user_origin(id, origin);
2304 message_begin(MSG_BROADCAST, SVC_TEMPENTITY);
2305 write_byte(TE_BEAMCYLINDER);
2306 write_coord(origin[0]);
2307 write_coord(origin[1]);
2308 write_coord(origin[2] - 20);
2309 write_coord(origin[0]);
2310 write_coord(origin[1]);
2311 write_coord(origin[2] + floatround(odilu));
2312 write_short(p_SpritePush);
2313 write_byte(0);
2314 write_byte(1);
2315 write_byte(4);
2316 write_byte(60);
2317 write_byte(1);
2318 write_byte(255);
2319 write_byte(255);
2320 write_byte(255);
2321 write_byte(75);
2322 write_byte(6);
2323 message_end();
2324
2325 new iPlayers[MAX_PLAYERS+1];
2326 new num = find_sphere_class(id, "player", 250.0, iPlayers, MAX_PLAYERS);
2327
2328 new vOrigin[2][3], Float:fOrigins[2][3];
2329 get_user_origin(id, vOrigin[0]);
2330 entity_get_vector(id, EV_VEC_origin, fOrigins[0]);
2331
2332 for(new i=0; i<num; i++)
2333 {
2334 if(get_user_team(id) == get_user_team(iPlayers[i]))
2335 continue;
2336
2337 get_user_origin(iPlayers[i], vOrigin[1]);
2338 entity_get_vector(iPlayers[i], EV_VEC_origin, fOrigins[1]);
2339
2340 for(new b = 0; b <= 2; b++)
2341 {
2342 fOrigins[1][b] -= fOrigins[0][b];
2343
2344 if(fOrigins[1][b] >= 0)
2345 fOrigins[1][b] += 500.0;
2346 else
2347 fOrigins[1][b] -= 500.0;
2348 }
2349
2350 entity_set_vector(iPlayers[i], EV_VEC_velocity, fOrigins[1]);
2351 }
2352
2353 for(new i=1; i<=MAX_PLAYERS; i++)
2354 {
2355 if(gbAlive[i] && get_user_team(i) != get_user_team(id))
2356 {
2357 entity_get_vector(i, EV_VEC_origin, fOriginPlayer);
2358 speed = (odilu - get_distance_f(fOriginPlayer, fOrigin))*3.0;
2359
2360 if(speed > 10)
2361 set_push_direction(i, fOrigin, speed);
2362 }
2363 }
2364
2365 Emit(id, g_sSoundPush);
2366
2367 gbCanUse[id][usePush] = false;
2368}*/
2369
2370stock set_push_direction(ent, Float:fOrigin[3], Float:fSpeed)
2371{
2372 new Float:fVelocity[3];
2373 get_velocity_from_origin(ent, fOrigin, fSpeed, fVelocity);
2374 fVelocity[2] += fSpeed > 400.0 ? 400.0 : fSpeed;
2375 entity_set_vector( ent, EV_VEC_velocity, fVelocity );
2376
2377 return 1;
2378}
2379
2380
2381//
2382
2383stock fm_set_user_footsteps(id, bool:set)
2384 gbSilentSteps[id] = !set;
2385
2386stock set_bartime(id, czas, startprogress = 0)
2387{
2388 static barTime2;
2389
2390 if(!barTime2) barTime2 = get_user_msgid("BarTime2");
2391
2392 message_begin(MSG_ONE, barTime2 , _, id)
2393 write_short(czas);
2394 write_short(startprogress);
2395 message_end();
2396}
2397
2398stock fm_set_visiblity(index, value)
2399{
2400 if(value == 255)
2401 fm_set_rendering(index, kRenderFxGlowShell, 0, 0, 0, kRenderNormal, 255);
2402 else if(value >= 0 && value <= 255)
2403 fm_set_rendering(index, kRenderFxGlowShell, 0, 0, 0, kRenderTransColor, value);
2404 else
2405 log_amx("fm_set_visibility: ERROR VALUE! value = %i", value);
2406}
2407
2408stock get_velocity_from_origin( ent, Float:fOrigin[3], Float:fSpeed, Float:fVelocity[3] )
2409{
2410 new Float:fEntOrigin[3];
2411 entity_get_vector( ent, EV_VEC_origin, fEntOrigin );
2412
2413 new Float:fDistance[3];
2414 fDistance[0] = fEntOrigin[0] - fOrigin[0];
2415 fDistance[1] = fEntOrigin[1] - fOrigin[1];
2416 fDistance[2] = fEntOrigin[2] - fOrigin[2];
2417
2418 new Float:fTime = ( vector_distance( fEntOrigin,fOrigin ) / fSpeed );
2419
2420 fVelocity[0] = fDistance[0] / fTime;
2421 fVelocity[1] = fDistance[1] / fTime;
2422 fVelocity[2] = fDistance[2] / fTime;
2423
2424 return ( fVelocity[0] && fVelocity[1] && fVelocity[2] );
2425}
2426
2427stock set_velocity_from_origin( ent, Float:fOrigin[3], Float:fSpeed )
2428{
2429 new Float:fVelocity[3];
2430 get_velocity_from_origin( ent, fOrigin, fSpeed, fVelocity );
2431
2432 if(fVelocity[2] > 300.0) fVelocity[2] = 300.0;
2433 if(fVelocity[2] < 200.0) fVelocity[2] = 200.0;
2434
2435 entity_set_vector( ent, EV_VEC_velocity, fVelocity );
2436
2437 return 1;
2438}
2439
2440stock ResetMaxspeed(id)
2441{
2442 static Float:max_speed;
2443 switch ( get_user_weapon(id) )
2444 {
2445 case CSW_SG550, CSW_AWP, CSW_G3SG1: max_speed = 210.0;
2446 case CSW_M249: max_speed = 220.0;
2447 case CSW_AK47: max_speed = 221.0;
2448 case CSW_M3, CSW_M4A1: max_speed = 230.0;
2449 case CSW_SG552: max_speed = 235.0;
2450 case CSW_XM1014, CSW_AUG, CSW_GALIL, CSW_FAMAS: max_speed = 240.0;
2451 case CSW_P90: max_speed = 245.0;
2452 case CSW_SCOUT: max_speed = 260.0;
2453 default: max_speed = 250.0;
2454 }
2455
2456 entity_set_float(id, EV_FL_maxspeed, max_speed);
2457}
2458
2459/*
2460#define TE_EXPLFLAG_NONE 0 // All flags clear makes default Half-Life explosion
2461#define TE_EXPLFLAG_NOADDITIVE 1 // Sprite will be drawn opaque (ensure that the sprite you send is a non-additive sprite)
2462#define TE_EXPLFLAG_NODLIGHTS 2 // Do not render dynamic lights
2463#define TE_EXPLFLAG_NOSOUND 4 // Do not play client explosion sound
2464#define TE_EXPLFLAG_NOPARTICLES 8 // Do not draw particles
2465*/
2466
2467stock Effect_Explosion(id, spriteid, Position[3], scale, framerate, flags)
2468{
2469 message_begin(isPlayer(id) ? MSG_ONE : MSG_ALL, SVC_TEMPENTITY, {0,0,0}, id)
2470 write_byte(TE_EXPLOSION)
2471 write_coord(Position[0])
2472 write_coord(Position[1])
2473 write_coord(Position[2])
2474 write_short(spriteid)
2475 write_byte(scale)
2476 write_byte(framerate)
2477 write_byte(flags)
2478 message_end()
2479}
2480
2481stock Effect_KillBeam(id, entity)
2482{
2483 message_begin(isPlayer(id) ? MSG_ONE : MSG_ALL, SVC_TEMPENTITY, {0,0,0}, id)
2484 write_byte(TE_KILLBEAM)
2485 write_short(entity)
2486 message_end()
2487}
2488
2489stock Display_Fade(id,duration,holdtime,fadetype,red,green,blue,alpha)
2490{
2491 message_begin( !id ? MSG_ALL : MSG_ONE, g_msgScreenFade, {0,0,0}, id );
2492 write_short( (1<<12) * duration );
2493 write_short( (1<<12) * holdtime );
2494 write_short( fadetype );
2495 write_byte ( red );
2496 write_byte ( green );
2497 write_byte ( blue );
2498 write_byte ( alpha );
2499 message_end();
2500}
2501
2502stock fm_cs_set_user_armor(client, armorvalue, CsArmorType:armortype)
2503{
2504 set_pdata_int(client, OFFSET_ARMORTYPE, _:armortype, 5);
2505
2506 set_pev(client, pev_armorvalue, float(armorvalue));
2507
2508 if( armortype != CS_ARMOR_NONE )
2509 {
2510 static ArmorType;
2511 if( ArmorType || (ArmorType = get_user_msgid("ArmorType")) )
2512 {
2513 emessage_begin(MSG_ONE_UNRELIABLE, ArmorType, _, client);
2514 ewrite_byte((armortype == CS_ARMOR_VESTHELM) ? 1 : 0);
2515 emessage_end();
2516 }
2517 }
2518}
2519
2520stock Emit(id, const sound[], Float:volume = 1.0)
2521 emit_sound(id, CHAN_STATIC, sound, volume, ATTN_NORM, 0, PITCH_NORM);
2522
2523stock bool:isPlayer(id)
2524 return bool:( 1 <= id <= MAX_PLAYERS );
2525
2526stock Print(id, const message_fmt[], any:...)
2527{
2528 static i; i = id ? id : GetPlayer();
2529 if ( !i ) return;
2530
2531 static message[256], len;
2532 len = formatex(message, charsmax(message), "^4[%s]^3 ", PREFIX);
2533 vformat(message[len], charsmax(message) - len, message_fmt, 3);
2534 message[192] = 0;
2535
2536 static msgid_SayText;
2537 if ( !msgid_SayText ) msgid_SayText = get_user_msgid("SayText");
2538
2539 static const team_names[][] = { "", "TERRORIST", "CT", "SPECTATOR" };
2540
2541 static team; team = get_user_team(i);
2542 TeamInfo(i, id, team_names[0]);
2543
2544 message_begin(id ? MSG_ONE_UNRELIABLE : MSG_BROADCAST, msgid_SayText, _, id);
2545 write_byte(i);
2546 write_string(message);
2547 message_end();
2548
2549 TeamInfo(i, id, team_names[team]);
2550}
2551
2552TeamInfo(receiver, sender, team[])
2553{
2554 static msgid_TeamInfo;
2555 if ( !msgid_TeamInfo ) msgid_TeamInfo = get_user_msgid("TeamInfo");
2556
2557 message_begin(sender ? MSG_ONE_UNRELIABLE : MSG_BROADCAST, msgid_TeamInfo, _, sender);
2558 write_byte(receiver);
2559 write_string(team);
2560 message_end();
2561}
2562
2563GetPlayer()
2564{
2565 for ( new id = 1; id <= MAX_PLAYERS; id++ )
2566 {
2567 if ( !gbConnected[id] ) continue;
2568 return id;
2569 }
2570
2571 return 0;
2572}
2573
2574
2575
2576
2577
2578
2579
2580
2581
2582
2583public CreateSqlConnection()
2584{
2585 new sqlConfig[4][32];
2586 get_cvar_string("sql_host", sqlConfig[0], sizeof sqlConfig[] - 1);
2587 get_cvar_string("sql_login", sqlConfig[1], sizeof sqlConfig[] - 1);
2588 get_cvar_string("sql_pass", sqlConfig[2], sizeof sqlConfig[] - 1);
2589 get_cvar_string("sql_base", sqlConfig[3], sizeof sqlConfig[] - 1);
2590
2591 gSqlTuple = SQL_MakeDbTuple(sqlConfig[0], sqlConfig[1], sqlConfig[2], sqlConfig[3]);
2592
2593 if(gSqlTuple == Empty_Handle)
2594 set_fail_state("Nie mozna utworzyc uchwytu do polaczenia");
2595
2596 new iErr, szError[128];
2597 new Handle:link = SQL_Connect(gSqlTuple, iErr, szError, 127);
2598
2599 if(link == Empty_Handle)
2600 {
2601 log_amx("Error (%d): %s", iErr, szError);
2602 set_fail_state("Brak polaczenia z baza danych");
2603 }
2604
2605 new Handle: hQuery;
2606 new s_Data[1024], iLen = 0;
2607
2608 for(new i=0; i<Skills; ++i)
2609 iLen += format(s_Data[iLen], charsmax(s_Data) - iLen, "`s%i` int(5) NOT NULL,", i);
2610
2611 for(new i=0; i<Weapons; ++i)
2612 iLen += format(s_Data[iLen], charsmax(s_Data) - iLen, "`w%i` int(5) NOT NULL,", i);
2613
2614 hQuery = SQL_PrepareQuery( link, "CREATE TABLE IF NOT EXISTS `%s` (\
2615 `id` int(6) NOT NULL AUTO_INCREMENT,\
2616 `steamid` varchar(33) NOT NULL,\
2617 `nick` varchar(33) NOT NULL,\
2618 `level` int(5) NOT NULL,\
2619 `exp` int(10) NOT NULL,\
2620 `totalexp` int(10) NOT NULL,\
2621 `skulls` int(5) NOT NULL,\
2622 `lang` int(1) NOT NULL,\
2623 %s\
2624 PRIMARY KEY (`id`),\
2625 UNIQUE KEY `authid` (`steamid`))", g_sTable, s_Data);
2626
2627 SQL_Execute(hQuery)
2628 SQL_FreeHandle(hQuery)
2629 SQL_FreeHandle(link);
2630}
2631
2632SaveData(id)
2633{
2634 if(!gbLoaded[id])
2635 {
2636 log_error(1, "%s - Nie zaladowno", gszName[id]);
2637 return;
2638 }
2639
2640 new sCommand[512], s_Data[512], iLen = 0;
2641
2642 for(new i=0; i<Skills; ++i)
2643 iLen += format(s_Data[iLen], charsmax(s_Data) - iLen, ", `s%i` = %i", i, gSkill[id][i]);
2644
2645 for(new i=0; i<Weapons; ++i)
2646 iLen += format(s_Data[iLen], charsmax(s_Data) - iLen, ",`w%i` = %i", i, gWeapon[id][i]);
2647
2648 replace_all(gszName[id], 31, "'", " ");
2649 replace_all(gszName[id], 31, "`", " ");
2650
2651 formatex(sCommand, sizeof sCommand-1, "UPDATE %s SET \
2652 `nick` = '%s',\
2653 `level` = %i,\
2654 `exp` = %i,\
2655 `totalexp` = %i,\
2656 `skulls` = %i,\
2657 `lang` = %i\
2658 %s WHERE `steamid` = '%s'", g_sTable, gszName[id], gLvl[id], gExp[id], gTotalExp[id], gSkulls[id], gLanguage[id], s_Data, gszSteam[id]);
2659
2660 if(gSqlTuple)
2661 SQL_ThreadQuery(gSqlTuple, "SaveHandler", sCommand);
2662}
2663
2664public LoadData(id)
2665{
2666 if(!is_user_connected(id))
2667 return;
2668
2669 new idData[1];
2670 idData[0] = id;
2671
2672 new sCommand[512];
2673 format(sCommand, sizeof sCommand-1, "SELECT * FROM %s WHERE `steamid` = '%s'", g_sTable, gszSteam[id]);
2674 SQL_ThreadQuery(gSqlTuple, "CheckHandler", sCommand, idData, 1);
2675}
2676
2677public SaveHandler(FailState, Handle:hQuery, Error[], Errorcode/*, Data[], DataSize*/)
2678{
2679 if(FailState != TQUERY_SUCCESS)
2680 {
2681 log_amx("[SaveHandler] Blad w zaytaniu(%i): %s", Errorcode, Error);
2682 return;
2683 }
2684}
2685
2686public CheckHandler(FailState, Handle:hQuery, Error[], Errorcode, Data[], DataSize)
2687{
2688 new id = Data[0];
2689
2690 if(FailState != TQUERY_SUCCESS)
2691 {
2692 log_amx("[CheckHandler] Blad w zaytaniu(%i): %s", Errorcode, Error);
2693 return PLUGIN_CONTINUE;
2694 }
2695
2696 if(SQL_MoreResults(hQuery))
2697 {
2698 new iField;
2699 iField = SQL_FieldNameToNum(hQuery, "level");
2700
2701 gLvl[id] = SQL_ReadResult(hQuery, iField++);
2702 gExp[id] = SQL_ReadResult(hQuery, iField++);
2703 gTotalExp[id] = SQL_ReadResult(hQuery, iField++);
2704 gSkulls[id] = SQL_ReadResult(hQuery, iField++);
2705 gLanguage[id] = SQL_ReadResult(hQuery, iField++);
2706
2707 gPoints[id] = gLvl[id];
2708
2709 for(new i=0; i<Skills; ++i)
2710 {
2711 gSkill[id][i] = SQL_ReadResult(hQuery, iField++);
2712 gPoints[id] -= gSkill[id][i];
2713 }
2714
2715 iField = SQL_FieldNameToNum(hQuery, "w0");
2716
2717 for(new i=0; i<Weapons; ++i)
2718 gWeapon[id][i] = SQL_ReadResult(hQuery, iField++);
2719
2720 gfPercent[id] = GetPercent(id);
2721
2722
2723 gbLoaded[id] = true;
2724 }
2725 else
2726 {
2727 gLvl[id] = 0;
2728 gExp[id] = 0;
2729 gTotalExp[id] = 0;
2730 gSkulls[id] = 0;
2731 gPoints[id] = 0;
2732 gLanguage[id] = 0;
2733
2734 SetNewSqlRecord(id);
2735
2736 gbLoaded[id] = true;
2737 }
2738
2739 return PLUGIN_CONTINUE
2740}
2741
2742public SetNewSqlRecord(id)
2743{
2744 new query[512], sZero[256] = "";
2745
2746 for(new i=0; i<(Skills + Weapons); ++i)
2747 add(sZero, 255, ", 0");
2748
2749 replace_all(gszName[id], 31, "'", " ");
2750 replace_all(gszName[id], 31, "`", " ");
2751
2752 formatex(query, 511, "INSERT INTO %s VALUES(`id`, '%s', '%s', 0, %i, %i, 0, 0%s)", g_sTable, gszSteam[id], gszName[id], gExp[id], gTotalExp[id], sZero);
2753
2754 for( new i=0; i<Skills; ++i )
2755 gSkill[id][i] = 0;
2756
2757 for( new i=0; i<Weapons; ++i )
2758 gWeapon[id][i] = 0;
2759
2760 if(gSqlTuple)
2761 SQL_ThreadQuery(gSqlTuple, "SaveHandler", query);
2762}
2763
2764public cmdShowRank(id)
2765{
2766 if(gfLastTimeCommandUsed[id] + 5.0 > get_gametime())
2767 {
2768 Print(id, "Poczekaj, zanim now bedziesz mogl uzyc tej komendy");
2769 return PLUGIN_HANDLED;
2770 }
2771
2772 gfLastTimeCommandUsed[id] = get_gametime();
2773
2774 new Data[1], sCommand[512];
2775 Data[0] = id;
2776
2777 format(sCommand,charsmax(sCommand),"SELECT COUNT(*) FROM %s WHERE `totalexp` > %d", g_sTable, gTotalExp[id]);
2778 SQL_ThreadQuery(gSqlTuple, "Sql_Rank", sCommand, Data, 1);
2779
2780 return PLUGIN_CONTINUE
2781}
2782
2783public Sql_Rank(FailState,Handle:Query,Error[],Errorcode,Data[],DataSize)
2784{
2785 if(FailState != TQUERY_SUCCESS)
2786 {
2787 log_amx("[Sql_Rank] Blad w zaytaniu(%i): %s", Errorcode, Error);
2788 return PLUGIN_CONTINUE;
2789 }
2790
2791 new count = SQL_ReadResult(Query, 0) + 1;
2792
2793 if(gLanguage[Data[0]])
2794 Print(Data[0], "^4[Stats]^3 Your rank is^1 %i / %i^3 with total exp:^1 %i", count, iRankTotalPos, gTotalExp[Data[0]]);
2795 else
2796 Print(Data[0], "^4[Stats]^3 Twoj ranking to^1 %i / %i^3 z iloscia zebranego expa:^1 %i", count, iRankTotalPos, gTotalExp[Data[0]]);
2797
2798 return PLUGIN_HANDLED
2799}
2800
2801public cmdShowTop15(id)
2802 show_motd(id, szTop15_buffer, "Point Top 15");
2803
2804public formatTop15(id)
2805{
2806 new sCommand[512];
2807
2808 format(sCommand, 511, "SELECT steamid, nick, level, exp FROM %s ORDER BY totalexp DESC LIMIT 10;", g_sTable);
2809 SQL_ThreadQuery(gSqlTuple, "Sql_Top15",sCommand);
2810
2811 format(sCommand,charsmax(sCommand),"SELECT COUNT(*) FROM %s", g_sTable);
2812 SQL_ThreadQuery(gSqlTuple, "Sql_RankTotal", sCommand);
2813
2814 return PLUGIN_CONTINUE;
2815}
2816
2817public Sql_Top15(FailState,Handle:hQuery,Error[],Errcode,Data[],DataSize)
2818{
2819 if(FailState == TQUERY_CONNECT_FAILED || FailState == TQUERY_QUERY_FAILED)
2820 {
2821 log_amx("[Top15] Blad(%i): %s", Errcode, Error);
2822 return;
2823 }
2824
2825 new szSteamID[32], szName[32], iExp, iLevel;
2826 new iPos = 1, iLen = 0;
2827
2828 iLen = formatex(szTop15_buffer, MAX_LEN, "<body background=%s><center></center><font color=RED size=4><pre>", g_sBackGroundTop);
2829 iLen += formatex(szTop15_buffer[iLen], MAX_LEN - iLen, "%-2.2s %-32.32s %-6.6s %-6.6s %-20.20s^n", "#", "Nick", "Lvl", "Exp", "SteamID");
2830 iLen += formatex(szTop15_buffer[iLen], MAX_LEN - iLen, "<font color=WHITE>");
2831
2832 while(SQL_MoreResults(hQuery))
2833 {
2834 SQL_ReadResult(hQuery, SQL_FieldNameToNum(hQuery, "steamid"), szSteamID, 31);
2835 SQL_ReadResult(hQuery, SQL_FieldNameToNum(hQuery, "nick"), szName, 31);
2836 iLevel = SQL_ReadResult(hQuery, SQL_FieldNameToNum(hQuery, "level"));
2837 iExp = SQL_ReadResult(hQuery, SQL_FieldNameToNum(hQuery, "exp"));
2838
2839 iLen += formatex(szTop15_buffer[iLen], MAX_LEN - iLen, "%-2.2i %-32.32s %-6.6i %-6.6i %-20.20s^n", iPos, szName, iLevel, iExp, szSteamID);
2840
2841 iPos++;
2842 SQL_NextRow( hQuery );
2843 }
2844
2845 iLen += copy(szTop15_buffer[iLen], MAX_LEN - iLen, "</body></font></pre>");
2846}
2847
2848public Sql_RankTotal(FailState,Handle:hQuery,Error[],Errcode,Data[],DataSize)
2849{
2850 iRankTotalPos = SQL_ReadResult(hQuery, 0);
2851
2852 return PLUGIN_HANDLED;
2853}
2854/* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE
2855*{\\ rtf1\\ ansi\\ deff0{\\ fonttbl{\\ f0\\ fnil Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ lang1045\\ f0\\ fs16 \n\\ par }
2856*/