· 8 years ago · Jan 06, 2018, 08:36 PM
1#include <amxmodx>
2#include <amxmisc>
3#include <cstrike>
4#include <colorchat>
5#include <hamsandwich>
6#include <fakemeta_util>
7#include <fun>
8#include <engine>
9#include <sqlx>
10#include <sockets>
11#include <player_settings_saver>
12#include <dhudmessage>
13
14#define PLUGIN_HOST "ИП СЕРВЕРРБЕЗ ПОРТÐ!"
15
16#define PLUGIN "HNS Match System"
17#define VERSION "DEV"
18#define AUTHOR "Garey & tahoma"
19
20#define FASTLEAVETIMER 300.0
21#define MAX_PLAYERS 32
22#define hns_ACESS ADMIN_LEVEL_F // flag "r"
23
24#define m_bJustConnected 480
25
26#define SETTING_KNIFES "KNIFE"
27#define SETTING_EMITSOUND "EMITSOUND"
28#define SECURE_NAME_LEN 31 * 2 + 1 // Twice as long as name (31 * 2 + zero terminator) in case all 31 characters are insecure
29
30new Float:g_flRoundTime
31new g_Captime;
32new bool:SoundFx;
33new bool:Survival
34new bool:GameStarted;
35new iCurrentSW
36new Float:flSidesTime[2];
37new Float:PlayNoPlay[33];
38new g_pRoundTime;
39new g_bShowSpeed[33 char];
40enum _:Tiers
41{
42 tierLOW = 1,
43 tierDm,
44 tierD,
45 tierDp,
46 tierCm,
47 tierC,
48 tierCp,
49 tierBm,
50 tierB,
51 tierBp,
52 tierAm,
53 tierA,
54 tierAp,
55 tierTOP
56}
57
58new const Tier_Names[Tiers][10] =
59{
60 "N/A",
61 "B",
62 "L-",
63 "L",
64 "L+",
65 "M-",
66 "M",
67 "M+",
68 "H-",
69 "H",
70 "H+",
71 "P-",
72 "P",
73 "P+",
74 "G"
75}
76
77#define START_RANK tierD
78#define START_PTS 1000
79
80/* PTS */
81new Array:Leavers[3];
82//#define test
83
84#if defined test
85// TEST DB
86new Host[] = "127.0.0.1"
87new User[] = "test"
88new Pass[] = "test" // ÐИЧЕГО ÐЕ ТРОГÐТЬ ТУТ ИЗМЕÐЯТЬ MYSQL ÐИЖЕ!
89new Db[] = "pts"
90new Table[] = "gather"
91#else
92// hns DB
93new Host[] = "ХОСТ"
94new User[] = "ПОЛЬЗОВÐТЕЛЬ"
95new Pass[] = "ПÐСС"
96new Db[] = "БÐЗÐ"
97new Table[] = "ÐÐЗВÐÐИЕ ТÐБЛИЦЫ ПОД PTS"
98#endif
99
100new Handle:g_SqlTuple
101new g_Error[512]
102
103//new g_sBuffer[4096]
104/* /PTS */
105
106new iPts[MAX_PLAYERS+1];
107new iRank[MAX_PLAYERS+1];
108
109/* END PTS */
110
111
112
113new Float:RingWidth
114
115enum _:SaveData
116{
117 save_team,
118 SteamID[32],
119Float:Origin[3],
120Float:Velocity[3],
121Float:Angles[3],
122 health,
123 Flags,
124 flashnum,
125 smokenum
126}
127
128new Array:SavedState;
129
130new LastDieSound;
131
132new bool:GameSaved;
133new bool:CaptainSort;
134new CaptainSide;
135new Captain1;
136new Captain2;
137new CaptainWinner;
138
139new Float:StartRoundTime;
140new SavedTime;
141new SavedFreezeTime;
142#define TIME 15
143#define TASK_MENUCLOSE 9001
144#define TASK_PLAYERSLIST 9002
145#define ROUNDENDTASK 10003
146#define RINGTASK 10004
147#define LEAVERTASK 20004
148enum
149{
150 e_gTraining = 0,
151 e_gPaused,
152 e_gKnife,
153 e_gCaptain,
154 e_gMix,
155 e_gPub
156}
157
158enum
159{
160 mode_mr,
161 mode_timebased
162}
163
164new current_mode;
165new gmsgMoney;
166
167new const g_szDefaultEntities[][] = {
168 "func_hostage_rescue",
169 "info_hostage_rescue",
170 "func_bomb_target",
171 "info_bomb_target",
172 "hostage_entity",
173 "info_vip_start",
174 "func_vip_safetyzone",
175 "func_escapezone",
176 "armoury_entity",
177 "monster_scentist"
178}
179
180new ring_cvar;
181new g_iGiveNadesTo;
182new const snd_denyselect[] = "common/wpn_denyselect.wav";
183new const g_szUseSound[] = "buttons/blip1.wav";
184new const g_szDieSound[6][] = {
185 "ots/001.wav",
186 "ots/002.wav",
187 "ots/003.wav",
188 "ots/004.wav",
189 "ots/005.wav",
190 "ots/006.wav"
191}
192new const g_szNewNadesMenu[] = "\rГранаты?^n^n\r1. \wДа^n\r2. \wÐет";
193/* hns_Hook_Integration */
194new bool:hns_hooked[32]
195new hookorigin[32][3]
196/* /hns_Hook_Integration */
197
198
199static const knifemodel[] = "models/v_knife.mdl"
200new alloc_KnifeModel;
201
202const m_pPlayer = 41;
203new bool:gOnOff[33];
204new bool:gEmitSound[33];
205const EXTRAOFFSET_WEAPONS = 4;
206const m_flNextPrimaryAttack = 46;
207const m_flNextSecondaryAttack = 47;
208
209new const hns_tag[16] = "HNS"
210new HamHook:Player_Killed_Pre;
211new Float:gCheckpoints[MAX_PLAYERS+1][2][3];
212
213new g_CurrentMode
214new g_iScore[2]
215new g_iSecondHalf
216new g_iMaxPlayers
217
218new bool:g_bFreezePeriod
219new bool:g_bCheckpointAlternate[MAX_PLAYERS+1];
220new bool:g_bLastFlash
221new bool:ishooked[MAX_PLAYERS+1];
222new bool:plr_noplay[MAX_PLAYERS+1];
223
224new Sbeam = 0
225new bool:g_Spec[MAX_PLAYERS+1];
226new hDeath[MAX_PLAYERS+1], CsTeams:hTeam[MAX_PLAYERS+1];
227
228new cvarTeam[2]
229new cvarMaxRounds
230new cvarFlashNum
231new cvarSmokeNum
232new cvarSemiclip
233new cvarDefaultMode
234new g_iHostageEnt, g_iRegisterSpawn
235new m_spriteTexture;
236new SyncHud[2]
237
238public plugin_natives()
239{
240 register_native("get_rank", "native_get_rank");
241 register_native("get_mode", "native_get_mode", 1);
242}
243
244public native_get_rank()
245{
246 new iLen = get_param( 2 );
247
248 new sz_Rank[ 32 ];
249 iLen = format(sz_Rank, iLen, "%s", Tier_Names[iRank[get_param( 1 )]]);
250
251 set_string( 2, sz_Rank, iLen );
252}
253
254public native_get_mode(param)
255{
256 return g_CurrentMode;
257}
258
259public plugin_precache() {
260
261 m_spriteTexture = engfunc(EngFunc_PrecacheModel, "sprites/laserbeam.spr");
262
263 engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "func_buyzone"));
264 g_iRegisterSpawn = register_forward(FM_Spawn, "fwdSpawn", 1)
265 precache_sound( g_szUseSound );
266 for(new i = 0; i < sizeof g_szDieSound; i++)
267 {
268 precache_sound( g_szDieSound[i] );
269 }
270 Sbeam = precache_model("sprites/laserbeam.spr");
271}
272
273new g_msgScreenFade;
274new g_msg_showtimer
275new g_msg_roundtime
276
277new iFwd_MixFinished
278
279public plugin_init() {
280 register_plugin(PLUGIN, VERSION, AUTHOR)
281 g_pRoundTime = get_cvar_pointer( "mp_roundtime" );
282 iFwd_MixFinished = CreateMultiForward("MixFinished_Fwd", ET_IGNORE);
283 SavedState = ArrayCreate(SaveData);
284 Leavers[0] = ArrayCreate(32);
285 Leavers[1] = ArrayCreate(4);
286 Leavers[2] = ArrayCreate(32);
287 register_clcmd("say", "sayHandle");
288
289 g_Captime = register_cvar( "hns_wintime", "20");
290 /* Mode */
291 register_concmd("say /pub", "hns_pub", hns_ACESS)
292 register_concmd("say /def", "hns_pub_off", hns_ACESS)
293
294 /* Settings Commands*/
295 register_concmd("say /skill", "hns_skill", hns_ACESS )
296 register_concmd("say /boost", "hns_boost", hns_ACESS )
297 register_concmd("say /aa10", "hns_aa10", hns_ACESS )
298 register_concmd("say /aa100", "hns_aa100", hns_ACESS )
299 register_concmd("say /mr5", "hns_mr5", hns_ACESS )
300 register_concmd("say /mr7", "hns_mr7", hns_ACESS )
301 register_concmd("say /mr9", "hns_mr9", hns_ACESS )
302
303 register_clcmd( "say /rr", "CmdRestartRound", hns_ACESS )
304 register_clcmd( "say /swap", "hns_swap_teams", hns_ACESS)
305
306 /* hns_Hook_Integration */
307 register_clcmd("+hook","hns_hook_on")
308 register_clcmd("-hook","hns_hook_off")
309
310 /* HideNSeek Commands */
311 register_clcmd ( "say /knife", "cmdShowKnife");
312 register_clcmd ( "say /showknife", "cmdShowKnife");
313 register_clcmd ( "say /hideknife", "cmdShowKnife");
314
315 /* Pause / UnPause */
316 register_clcmd( "say /pause", "hns_startpause", hns_ACESS );
317 //register_clcmd( "say /live", "hns_unpause", hns_ACESS );
318
319 //register_clcmd ( "nightvision", "hns_mix_menu", hns_ACESS )
320 register_clcmd ( "say /mix", "hns_mix_menu", hns_ACESS )
321 register_clcmd ( "say /mr", "hns_mr_menu", hns_ACESS )
322 register_clcmd ( "say /aa", "hns_aa_menu", hns_ACESS )
323 register_clcmd ( "say /type", "hns_semi_menu", hns_ACESS )
324 register_clcmd ( "say /trans", "hns_trans_menu", hns_ACESS )
325 register_clcmd ( "say /mode", "hns_mode_menu", hns_ACESS )
326
327 register_clcmd( "chooseteam", "BlockCmd" ); /* block cmd case team completed */
328 register_clcmd( "jointeam", "BlockCmd" );
329 register_clcmd( "joinclass", "BlockCmd" );
330
331 fnRegisterSayCmd("timer", "timermod", "hns_timer", hns_ACESS, "Timer mode");
332 fnRegisterSayCmd("normal", "normalmod", "hns_normal", hns_ACESS, "Normal mode");
333 fnRegisterSayCmd("invite", "announce", "hns_announce", hns_ACESS, "Announce Players")
334 fnRegisterSayCmd("specall", "specall", "hns_transfer_spec", hns_ACESS, "Spec Transfer")
335 fnRegisterSayCmd("ttall", "ttall", "hns_transfer_tt", hns_ACESS, "TT Transfer")
336 fnRegisterSayCmd("ctall", "ctall", "hns_transfer_ct", hns_ACESS, "CT Transfer")
337 fnRegisterSayCmd("score", "s", "Score", 0, "Starts Round")
338 fnRegisterSayCmd("startmix", "start", "cmdStartRound", hns_ACESS, "Starts Round");
339 fnRegisterSayCmd("kniferound", "kf", "cmdKnifeRound", hns_ACESS, "Knife Round");
340 fnRegisterSayCmd("captain", "cap", "CaptainCmd", hns_ACESS, "Captain Mode");
341 fnRegisterSayCmd("stopcaptain", "stopcap", "StopCaptainCmd", hns_ACESS, "Captain Mode");
342 fnRegisterSayCmd("stop", "stop", "cmdStop", hns_ACESS, "Stop Current Mode");
343 fnRegisterSayCmd("live", "unpause", "hns_unpause", hns_ACESS, "UnPause");
344 fnRegisterSayCmd("checkpoint", "cp", "cmdCheckpoint", 0, "Save checkpoint");
345 fnRegisterSayCmd("savegame", "sg", "cmdsavegame", hns_ACESS, "Save game");
346 fnRegisterSayCmd("loadgame", "lg", "cmdloadgame", hns_ACESS, "Load saved game");
347 fnRegisterSayCmd("gocheck", "gc", "cmdGoCheck", 0, "Go to checkpoint");
348 fnRegisterSayCmd("teleport", "tp", "cmdGoCheck", 0, "Go to checkpoint");
349 fnRegisterSayCmd("pick", "pick", "captain_menu", 0, "Pick player");
350 fnRegisterSayCmd( "back", "spec", "team_spec", 0, "Spec/Back player");
351 //fnRegisterSayCmd("myrank", "rank", "CmdRank", 0, "Starts Round")
352 fnRegisterSayCmd("newpts", "npts", "CmdPrognoz", 0, "New Pts")
353 fnRegisterSayCmd("b", "balance", "CmdBalance", 0, "Balance Pts")
354 fnRegisterSayCmd("np", "noplay", "CmdNoPlay", 0, "No play")
355 fnRegisterSayCmd("ip", "play", "CmdPlay", 0, "Play play")
356 //fnRegisterSayCmd("dontcap", "nocap", "CmdNoCaptain", 0, "Balance Pts")
357 fnRegisterSayCmd("pts", "top", "Show_Top", 0, "Show Top")
358
359 alloc_KnifeModel = engfunc(EngFunc_AllocString, knifemodel)
360
361 ring_cvar = register_cvar("hns_ring", "1", FCVAR_ARCHIVE|FCVAR_SERVER)
362 cvarTeam[0] = register_cvar("hns_team1", "Blue", FCVAR_ARCHIVE|FCVAR_SERVER)
363 cvarTeam[1] = register_cvar("hns_team2", "", FCVAR_ARCHIVE|FCVAR_SERVER)
364 cvarFlashNum = register_cvar("hns_flash", "2", FCVAR_ARCHIVE|FCVAR_SERVER)
365 cvarSmokeNum = register_cvar("hns_smoke", "1", FCVAR_ARCHIVE|FCVAR_SERVER)
366 cvarMaxRounds = register_cvar("hns_rounds", "6", FCVAR_ARCHIVE|FCVAR_SERVER)
367 cvarSemiclip = register_cvar("hns_semiclip", "0", FCVAR_ARCHIVE|FCVAR_SERVER)
368 cvarDefaultMode = register_cvar("hns_defaultmode", "1", FCVAR_ARCHIVE|FCVAR_SERVER)
369
370 register_event("CurWeapon", "eCurWeapon", "be", "1!0")
371 register_event("SendAudio","eEndRound","a","2=%!MRAD_terwin","2=%!MRAD_ctwin")
372 register_event("HLTV", "ePreFT", "a", "1=0", "2=0") // Detect freezetime started
373 register_logevent("ePostFT", 2, "0=World triggered", "1=Round_Start") // Detect freezetime ended
374
375 Player_Killed_Pre = RegisterHam( Ham_Killed, "player", "fwd_PlayerKilled_Pre", 0 );
376 RegisterHam( Ham_Spawn, "player", "CBasePlayer_Spawn_Post", true)
377 RegisterHam( Ham_Item_Deploy, "weapon_knife", "FwdDeployKnife", 1 )
378 RegisterHam( Ham_Weapon_PrimaryAttack, "weapon_knife", "FwdKnifePrim" );
379 register_forward(FM_Voice_SetClientListening, "Forward_SetClientListening");
380 register_forward( FM_EmitSound, "fwd_EmitSound_Pre", 0 );
381
382 unregister_forward(FM_Spawn, g_iRegisterSpawn, 1)
383 register_forward(FM_PlayerPreThink, "preThink")
384 register_forward(FM_PlayerPostThink, "postThink")
385
386 register_forward(FM_AddToFullPack, "addToFullPack", 1)
387 register_menucmd( register_menuid( "NadesMenu" ), 3, "HandleNadesMenu" );
388
389 g_msg_showtimer = get_user_msgid("ShowTimer")
390 g_msg_roundtime = get_user_msgid("RoundTime")
391
392 g_iMaxPlayers = get_maxplayers()
393 SyncHud[0] = CreateHudSyncObj()
394 SyncHud[1] = CreateHudSyncObj()
395
396 register_message( get_user_msgid( "ShowMenu" ), "message_show_menu" );
397 register_message( get_user_msgid( "VGUIMenu" ), "message_vgui_menu" );
398 g_msgScreenFade = get_user_msgid("ScreenFade");
399 register_message( g_msgScreenFade, "msg_ScreenFade" );
400 register_message( get_user_msgid( "TextMsg" ), "msgTextMsg" );
401
402 set_msg_block(get_user_msgid("HudTextArgs"),BLOCK_SET);
403
404 register_mode();
405 ePreFT();
406 PrepareMode(e_gTraining);
407
408 set_msg_block(gmsgMoney = get_user_msgid("Money"), BLOCK_SET);
409 set_task(0.1, "ShowSpeedAsMoney", 15671983, .flags="b");
410
411 if(!(get_pcvar_num(cvarDefaultMode)))
412 {
413 current_mode = mode_timebased
414 }
415 else
416 {
417 current_mode = mode_mr
418 }
419
420}
421
422public ClCmd_Speed(id)
423{
424 g_bShowSpeed{id} = !g_bShowSpeed{id};
425}
426
427public ShowSpeedAsMoney()
428{
429 if(Survival)
430 {
431 static players[32], num, id
432 get_players(players, num, "a");
433 for(--num; num>=0; num--)
434 {
435 id = players[num];
436 if( g_bShowSpeed{id} )
437 {
438 message_begin(MSG_ONE, gmsgMoney, .player=id);
439 write_long( floatround((get_pcvar_float(g_Captime)*60.0)-flSidesTime[iCurrentSW], floatround_floor) );
440 write_byte(0);
441 message_end();
442 }
443 }
444 }
445}
446
447public hns_timer(id)
448{
449 if(!(get_user_flags(id) & hns_ACESS))
450 return PLUGIN_HANDLED;
451
452 if(g_CurrentMode == e_gTraining)
453 {
454 new sz_name[64]; get_user_name(id, sz_name, 63);
455 ColorChat(0, RED, "^1[^4%s^1] ^3%s^1 changed mode to Time-Based.", hns_tag, sz_name)
456 current_mode = mode_timebased
457 set_pcvar_num(cvarDefaultMode, 0);
458 }
459 else
460 {
461 ColorChat(id, RED, "^1[^4%s^1] Mode cannot be changed during game!", hns_tag);
462 }
463 return PLUGIN_CONTINUE;
464}
465
466public hns_normal(id)
467{
468 if(!(get_user_flags(id) & hns_ACESS))
469 return PLUGIN_HANDLED;
470
471 if(g_CurrentMode == e_gTraining)
472 {
473 new sz_name[64]; get_user_name(id, sz_name, 63);
474 ColorChat(0, RED, "^1[^4%s^1] ^3%s^1 changed mode to Standart (MR).", hns_tag, sz_name)
475 current_mode = mode_mr
476 set_pcvar_num(cvarDefaultMode, 1);
477 }
478 else
479 {
480 ColorChat(id, RED, "^1[^4%s^1] Mode cannot be changed during game!", hns_tag);
481 }
482
483 return PLUGIN_CONTINUE;
484}
485
486public CmdNoPlay(id)
487{
488 if(get_gametime() > PlayNoPlay[id])
489 if(!plr_noplay[id])
490 {
491 PlayNoPlay[id] = get_gametime()+60.0;
492 plr_noplay[id] = true;
493 new sz_name[64]; get_user_name(id, sz_name, 63);
494 ColorChat(0, RED, "^1[^4%s^1] ^3%s^1 is ^3not available^1 for pick. (^3NOPLAY^1)", hns_tag, sz_name)
495 }
496}
497
498public CmdPlay(id)
499{
500 if(get_gametime() > PlayNoPlay[id])
501 if(plr_noplay[id])
502 {
503 PlayNoPlay[id] = get_gametime()+60.0;
504 plr_noplay[id] = false;
505 new sz_name[64]; get_user_name(id, sz_name, 63);
506 ColorChat(0, RED, "^1[^4%s^1] ^3%s^1 is now ^4available^1 for pick.", hns_tag, sz_name);
507 }
508}
509
510public sayHandle(id)
511{
512 new szArgs[64];
513 read_args(szArgs, charsmax(szArgs));
514 remove_quotes(szArgs);
515 trim(szArgs);
516
517 if ( !szArgs[0] )
518 return PLUGIN_HANDLED;
519
520 if ( szArgs[0] != '/' )
521 return PLUGIN_CONTINUE;
522
523
524 //Command
525 new szTarget[32];
526
527 parse(szArgs,\
528 szArgs, charsmax(szArgs),\
529 szTarget, charsmax(szTarget));
530
531 if ( equali(szArgs, "/wintime", 7) )
532 {
533 trim(szTarget);
534
535 if(!(get_user_flags(id) & hns_ACESS))
536 return PLUGIN_HANDLED;
537
538 if(is_str_num(szTarget))
539 {
540 set_pcvar_num(g_Captime, str_to_num(szTarget));
541 new sz_name[64]; get_user_name(id, sz_name, 63);
542 ColorChat(0, RED, "^1[^4%s^1] ^3%s^1 set wintime to %d minutes.", hns_tag, sz_name, str_to_num(szTarget));
543 }
544 return PLUGIN_CONTINUE;
545 }
546
547 if ( !equali(szArgs, "/rank", 4) )
548 return PLUGIN_CONTINUE;
549 //Command
550
551
552 //Delay
553 new Float:fCommandDelay = 5.0;
554
555 static Float:fCommandUsed[MAX_PLAYERS+1];
556
557 if ( fCommandUsed[id] > get_gametime() )
558 {
559 return PLUGIN_HANDLED;
560 }
561 //Delay
562
563
564 //Display
565 trim(szTarget);
566
567 if ( !szTarget[0] )
568 CmdRank(id, id);
569 else {
570 new targetId = cmd_target(id, szTarget, 2);
571
572 if ( targetId )
573 CmdRank(id, targetId);
574 else {
575 ColorChat(id, RED, "^1[^4%s^1] There is no OR multiple players with that name ->^x03 %s", hns_tag, szTarget);
576 return PLUGIN_CONTINUE;
577 }
578 }
579
580 fCommandUsed[id] = get_gametime()+fCommandDelay;
581 //Display
582
583
584 return PLUGIN_CONTINUE;
585}
586
587public plugin_cfg()
588{
589 MySql_Init();
590}
591
592public msg_ScreenFade( iMsgId, iMsgDest, id )
593{
594 if(is_user_connected(id))
595 {
596 if( get_msg_arg_int( 4 ) == 255 && get_msg_arg_int( 5 ) == 255 && get_msg_arg_int( 6 ) == 255)
597 {
598 if((cs_get_user_team(id) == CS_TEAM_T) || (cs_get_user_team(id) == CS_TEAM_SPECTATOR))
599 {
600 return PLUGIN_HANDLED;
601 }
602 }
603 }
604 return PLUGIN_CONTINUE;
605}
606
607public message_show_menu( msgid, dest, id )
608{
609 if ( !should_autojoin( id ) )
610 return(PLUGIN_CONTINUE);
611
612 static team_select[] = "#Team_Select";
613 static menu_text_code[sizeof team_select];
614 get_msg_arg_string( 4, menu_text_code, sizeof menu_text_code - 1 );
615 if ( !equal( menu_text_code, team_select ) )
616 return(PLUGIN_CONTINUE);
617
618 set_force_team_join_task( id, msgid );
619
620 return(PLUGIN_HANDLED);
621}
622
623
624public message_vgui_menu( msgid, dest, id )
625{
626 if ( get_msg_arg_int( 1 ) != 2 || !should_autojoin( id ) )
627 return(PLUGIN_CONTINUE);
628
629 set_force_team_join_task( id, msgid );
630
631 return(PLUGIN_HANDLED);
632}
633
634
635bool:should_autojoin( id )
636{
637 return(!get_user_team( id ) && !task_exists( id ) );
638}
639
640
641set_force_team_join_task( id, menu_msgid )
642{
643 static param_menu_msgid[2];
644 param_menu_msgid[0] = menu_msgid;
645 set_task( 0.1, "task_force_team_join", id, param_menu_msgid, sizeof param_menu_msgid );
646}
647
648
649public task_force_team_join( menu_msgid[], id )
650{
651 if ( get_user_team( id ) )
652 return;
653
654 force_team_join( id, menu_msgid[0], "5", "5" );
655}
656
657
658stock force_team_join( id, menu_msgid, /* const */ team[] = "5", /* const */ class[] = "0" )
659{
660 static jointeam[] = "jointeam";
661 if ( class[0] == '0' )
662 {
663 engclient_cmd( id, jointeam, team );
664 return;
665 }
666
667 static msg_block, joinclass[] = "joinclass";
668 msg_block = get_msg_block( menu_msgid );
669 set_msg_block( menu_msgid, BLOCK_SET );
670 engclient_cmd( id, jointeam, team );
671 engclient_cmd( id, joinclass, class );
672 set_msg_block( menu_msgid, msg_block );
673 respawn_player( id );
674}
675
676
677public respawn_player( id )
678{
679 if ( is_user_connected( id ) )
680 {
681 /* Make the engine think he is spawning */
682 set_pev( id, pev_deadflag, DEAD_RESPAWNABLE );
683 set_pev( id, pev_iuser1, 0 );
684 dllfunc( DLLFunc_Think, id );
685
686 /* Move his body so if corpse is created it is not in map */
687 engfunc( EngFunc_SetOrigin, id, Float:{ -4800.0, -4800.0, -4800.0 } );
688
689 /* Actual Spawn */
690 set_task(0.1, "spawnagain", id);
691 }
692}
693
694public spawnagain( id )
695{
696 /* Make sure he didn't disconnect in the 0.5 seconds that have passed. */
697 if ( is_user_connected( id ) )
698 {
699 new bool:SortTeams = false;
700 /* Spawn player */
701 if(g_CurrentMode != e_gPub)
702 {
703 spawn( id );
704 dllfunc( DLLFunc_Spawn, id );
705 }
706 if((file_exists("addons/amxmodx/data/playerslist.ini")))
707 {
708 new szMap[64]
709 get_mapname(szMap, 63);
710 if(containi(szMap, "hns_hnserivmknife") != -1)
711 {
712 SortTeams = false;
713 }
714 else
715 {
716 SortTeams = true;
717 if(task_exists(92271))
718 remove_task(92271)
719
720 set_task(5.0, "remove_file", 92271);
721 }
722 }
723 if(( g_CurrentMode != e_gTraining && g_CurrentMode != e_gPub ) || SortTeams)
724 {
725 if(!CheckPlayer(id))
726 {
727 user_silentkill( id );
728 cs_set_user_team( id, CS_TEAM_SPECTATOR );
729 }
730 else
731 {
732 spawn( id );
733 dllfunc( DLLFunc_Spawn, id );
734 }
735 }
736
737
738 /*
739 * After 1.0 the player will be spawned fully and you can mess with the ent (give weapons etc)
740 * set_task(1.0,"player_fully_spawned",id)
741 */
742 }
743}
744public remove_file( )
745{
746 if(file_exists("addons/amxmodx/data/playerslist.ini"))
747 delete_file("addons/amxmodx/data/playerslist.ini");
748}
749
750public BlockCmd(id)
751{
752 if ( g_CurrentMode != e_gTraining )
753 {
754 return(PLUGIN_HANDLED);
755 }
756 return(PLUGIN_CONTINUE);
757}
758
759public msgTextMsg( const MsgId, const MsgDest, const MsgEntity )
760{
761 static szMessage[ 9 ];
762 get_msg_arg_string( 2, szMessage, 8 );
763
764 if( szMessage[ 1 ] == 'C' ) // #CTs_Win
765 {
766 for( new i = 1; i <= 32; i++ )
767 {
768 if( g_Spec[i] )
769 {
770 if( hTeam[i] == CS_TEAM_CT ) hTeam[i] = CS_TEAM_T;
771 else hTeam[i] = CS_TEAM_CT;
772 }
773 }
774 }
775}
776
777public team_spec(id)
778{
779 if(g_CurrentMode != e_gPub)
780 return PLUGIN_HANDLED;
781
782 if (g_Spec[id])
783 {
784 cs_set_user_team(id, hTeam[id]);
785 cs_set_user_deaths(id, hDeath[id]);
786 g_Spec[id] = false
787 }
788 else
789 {
790 if (cs_get_user_team(id) == CS_TEAM_SPECTATOR)
791 return PLUGIN_HANDLED;
792
793 hDeath[id] = cs_get_user_deaths(id);
794 hTeam[id] = cs_get_user_team(id);
795 if (is_user_alive(id))
796 cs_set_user_deaths(id, hDeath[id] - 1);
797 cs_set_user_team(id, CS_TEAM_SPECTATOR);
798 user_silentkill(id);
799 g_Spec[id] = true
800 }
801
802 return PLUGIN_HANDLED;
803}
804
805public fwd_EmitSound_Pre( id, iChannel, szSample[], Float:volume, Float:attenuation, fFlags, pitch )
806{
807 if( equal( szSample, "weapons/knife_deploy1.wav") )
808 {
809 return FMRES_SUPERCEDE;
810 }
811
812 if( equal( szSample, "player/die1.wav") || equal( szSample, "player/die2.wav") || equal( szSample, "player/die3.wav") || equal( szSample, "player/death6.wav") )
813 {
814 if(!gEmitSound[id])
815 return FMRES_IGNORED;
816
817 new rand = random_num(0, charsmax(g_szDieSound))
818 if(rand != LastDieSound)
819 LastDieSound = rand;
820 else if(LastDieSound < charsmax(g_szDieSound))
821 LastDieSound++
822 else
823 LastDieSound = 0;
824
825 emit_sound( id, iChannel, g_szDieSound[LastDieSound], volume, attenuation, fFlags, pitch );
826 return FMRES_SUPERCEDE;
827 }
828
829 if( is_user_alive( id ) && cs_get_user_team(id) == CS_TEAM_T && equal( szSample, snd_denyselect ) )
830 {
831 emit_sound( id, iChannel, g_szUseSound, volume, attenuation, fFlags, pitch );
832 return FMRES_SUPERCEDE;
833 }
834 return FMRES_IGNORED;
835}
836
837public fwd_PlayerKilled_Pre( id )
838{
839 if( cs_get_user_team(id) != CS_TEAM_T )
840 return;
841
842 new players[32], num, index;
843 get_players(players, num, "ae", "TERRORIST");
844 if( num == 1 )
845 {
846 g_bLastFlash = true;
847 index = players[0];
848 g_iGiveNadesTo = index;
849 show_menu( index, 3, g_szNewNadesMenu, -1, "NadesMenu" );
850 DisableHamForward( Player_Killed_Pre );
851 }
852}
853
854public HandleNadesMenu( id, key )
855{
856 if( !g_bLastFlash || id != g_iGiveNadesTo || !is_user_alive( id ) )
857 return;
858
859 if( !key )
860 {
861
862 if( user_has_weapon( id, CSW_SMOKEGRENADE ) )
863 {
864 ExecuteHam( Ham_GiveAmmo, id, 1, "SmokeGrenade", 1024 );
865 }
866 else
867 give_item(id, "weapon_smokegrenade");
868
869
870 if( user_has_weapon( id, CSW_FLASHBANG ) )
871 {
872 ExecuteHam( Ham_GiveAmmo, id, 1, "Flashbang", 1024 );
873 }
874 else
875 give_item(id, "weapon_flashbang");
876
877 emit_sound( id, CHAN_ITEM, "items/gunpickup2.wav", VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
878 }
879 else
880 {
881 //ach_add_progress(id, ac_charity);
882 }
883
884 g_bLastFlash = false;
885 g_iGiveNadesTo = 0;
886
887}
888
889public fwdSpawn(entid) {
890 static szClassName[32];
891 if(pev_valid(entid))
892 {
893 pev(entid, pev_classname, szClassName, 31);
894 if(equal(szClassName, "func_buyzone")) engfunc(EngFunc_RemoveEntity, entid);
895
896 for(new i = 0; i < sizeof g_szDefaultEntities; i++)
897 {
898 if(equal(szClassName, g_szDefaultEntities[i]))
899 {
900 engfunc(EngFunc_RemoveEntity, entid);
901 break;
902 }
903 }
904 }
905}
906
907public register_mode()
908{
909 g_iHostageEnt = engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "hostage_entity"));
910 set_pev(g_iHostageEnt, pev_origin, Float:{ 0.0, 0.0, -55000.0 });
911 set_pev(g_iHostageEnt, pev_size, Float:{ -1.0, -1.0, -1.0 }, Float:{ 1.0, 1.0, 1.0 });
912 dllfunc(DLLFunc_Spawn, g_iHostageEnt);
913}
914
915public hns_hud_paused()
916{
917 if(g_CurrentMode == e_gPaused)
918 {
919 Task_Hud(0, 1.0, 1, 65, 105, 225, 0.5, "MATCH PAUSED");
920 }
921}
922
923public hns_startpause(id, level, cid)
924{
925 if(cmd_access(id, level, cid, 1) && g_CurrentMode == e_gMix && g_CurrentMode != e_gPaused)
926 {
927 g_CurrentMode = e_gPaused
928
929 if(current_mode != mode_mr)
930 {
931 if(GameStarted)
932 {
933 flSidesTime[iCurrentSW] -= g_flRoundTime;
934 new szName[64]
935 get_user_name(id, szName, 63)
936 client_print(0, print_chat, "[%s] %s paused Survival Mode", hns_tag, szName);
937 server_cmd("sv_restart 1")
938 Survival = false;
939 GameStarted = false;
940 }
941 else
942 {
943 client_print(id, print_chat, "[%s] Game not started or already paused (use /unpause)", hns_tag);
944 }
945 }
946
947 set_task(0.5, "hns_hud_paused", _, _, _, "b")
948
949 server_cmd("amxx unpause uq_jumpstats.amxx")
950 server_cmd("sv_restart 1")
951 //server_cmd("hns_alltalk 1");
952 server_cmd("mp_freezetime 0")
953 }
954 return PLUGIN_HANDLED
955}
956public hns_unpause(id, level, cid)
957{
958 if(cmd_access(id, level, cid, 1) && g_CurrentMode == e_gPaused)
959 {
960 g_CurrentMode = e_gMix
961 if(current_mode != mode_mr)
962 GameStarted = true;
963
964 Task_Hud(0, 2.0, 1, 255, 153, 0, 3.0, "LIVE LIVE LIVE");
965
966 server_cmd("amxx pause uq_jumpstats.amxx")
967 server_cmd("sv_restart 1")
968 //server_cmd("hns_alltalk 0");
969 server_cmd("mp_freezetime 15")
970 remove_hook(id)
971 }
972 return PLUGIN_HANDLED
973}
974
975public hns_swap_teams(id,level,cid) {
976 if(!cmd_access(id, level, cid, 1)) return PLUGIN_HANDLED
977
978 new hns_name[32]
979 get_user_name(id, hns_name, charsmax(hns_name))
980 ColorChat(0, RED, "^1[^4%s^1] ^3%s ^1swap teams", hns_tag, hns_name)
981
982 SwitchTeams()
983 server_cmd("sv_restart 1")
984
985 return PLUGIN_HANDLED
986}
987
988public CmdRestartRound(id, level, cid) {
989 if(!cmd_access(id, level, cid, 1)) return PLUGIN_HANDLED
990 new hns_name[32]
991 get_user_name(id, hns_name, 31)
992 ColorChat(0, RED, "^1[^4%s^1] ^3%s ^1did restart", hns_tag, hns_name)
993 RingWidth = 2300.0;
994 RestartRound();
995
996 return PLUGIN_HANDLED
997}
998
999
1000/* Commands for management */
1001/* Commands for management */
1002/* Commands for management */
1003public hns_pub(id, level, cid) {
1004 if(!cmd_access(id, level, cid, 1)) return PLUGIN_HANDLED
1005
1006 new hns_name[32]
1007 get_user_name(id, hns_name, 31)
1008
1009 if(g_CurrentMode != e_gPub)
1010 {
1011 if(g_CurrentMode != e_gMix && g_CurrentMode != e_gKnife) {
1012 PrepareMode(e_gPub);
1013 ColorChat(0, RED, "^1[^4%s^1] ^3%s ^1activated public HNS mode", hns_tag, hns_name)
1014 }
1015 } else
1016 ColorChat(id, RED, "^1[^4%s^1] ^3%s ^1Public HNS mode is ^4already running", hns_tag, hns_name)
1017
1018 remove_hook(id)
1019
1020 return PLUGIN_HANDLED
1021}
1022
1023public hns_pub_off(id, level, cid) {
1024 if(!cmd_access(id, level, cid, 1)) return PLUGIN_HANDLED
1025
1026 new hns_name[32]
1027 get_user_name(id, hns_name, 31)
1028
1029 if(g_CurrentMode == e_gPub)
1030 {
1031 if(g_CurrentMode != e_gMix && g_CurrentMode != e_gKnife) {
1032 g_CurrentMode = e_gTraining;
1033
1034 server_cmd("mp_forcechasecam 2")
1035 server_cmd("mp_forcecamera 2")
1036 server_cmd("hns_switch 0")
1037 server_cmd("hns_training 1")
1038 server_cmd("hns_footsteps 0")
1039 server_cmd("mp_roundtime 3")
1040 server_cmd("mp_freezetime 0")
1041 server_cmd("hns_flash 3")
1042 server_cmd("mp_autoteambalance 0")
1043 server_cmd("hns_join_team 1")
1044 server_cmd("hns_block_change 0")
1045 server_cmd("sv_restart 1")
1046
1047 ColorChat(0, RED, "^1[^4%s^1] ^3%s ^4disabled ^1public HNS mode", hns_tag, hns_name)
1048 }
1049 } else
1050 ColorChat(id, RED, "^1[^4%s^1] ^3%s ^1Public HNS mode is ^4not running", hns_tag, hns_name)
1051
1052 remove_hook(id)
1053
1054 return PLUGIN_HANDLED
1055}
1056
1057public hns_transfer_spec(id)
1058{
1059 if(!(get_user_flags(id) & hns_ACESS))
1060 return PLUGIN_HANDLED
1061
1062 new hns_name[32]
1063 get_user_name(id, hns_name, 31)
1064 ColorChat( 0, RED,"^1[^4%s^1] ^3%s ^1transfered all players to ^4Spectators", hns_tag, hns_name )
1065 /*new Players[32], Num; get_players(Players, Num, "h")
1066
1067 for(new i = 0; i < Num; i++)
1068 {
1069 if(is_user_alive(Players[i]))
1070 user_kill(Players[i], 0)
1071 if(cs_get_user_team(Players[i]) != CS_TEAM_SPECTATOR)
1072 cs_set_user_team(Players[i], CS_TEAM_SPECTATOR, CS_DONTCHANGE)
1073 }*/
1074
1075 safe_transfer( CS_TEAM_SPECTATOR );
1076 return PLUGIN_HANDLED
1077}
1078
1079public hns_transfer_tt(id)
1080{
1081 if(!(get_user_flags(id) & hns_ACESS))
1082 return PLUGIN_HANDLED
1083
1084 new hns_name[32]
1085 get_user_name(id, hns_name, 31)
1086 ColorChat( 0, RED,"^1[^4%s^1] ^3%s ^1transfered all players to ^4TT's", hns_tag, hns_name )
1087 new Players[32], Num; get_players(Players, Num, "h")
1088 /*
1089 for(new i = 0; i < Num; i++)
1090 {
1091 if(is_user_alive(Players[i]))
1092 user_kill(Players[i], 0)
1093 if(cs_get_user_team(Players[i]) != CS_TEAM_T)
1094 cs_set_user_team(Players[i], CS_TEAM_T, CS_T_ARCTIC)
1095 }
1096 */
1097 safe_transfer( CS_TEAM_T );
1098 return PLUGIN_HANDLED
1099}
1100
1101public hns_transfer_ct(id)
1102{
1103 if(!(get_user_flags(id) & hns_ACESS))
1104 return PLUGIN_HANDLED
1105
1106 new hns_name[32]
1107 get_user_name(id, hns_name, 31)
1108 ColorChat( 0, RED,"^1[^4%s^1] ^3%s ^1transfered all players to ^4CT's", hns_tag, hns_name )
1109 new Players[32], Num; get_players(Players, Num, "h")
1110 /*
1111 for(new i = 0; i < Num; i++)
1112 {
1113 if(is_user_alive(Players[i]))
1114 user_kill(Players[i], 0)
1115 if(cs_get_user_team(Players[i]) != CS_TEAM_CT)
1116 cs_set_user_team(Players[i], CS_TEAM_CT, CS_CT_GIGN)
1117 }
1118 */
1119 safe_transfer( CS_TEAM_CT );
1120 return PLUGIN_HANDLED
1121}
1122
1123
1124public hns_skill(id,level,cid)
1125{
1126 if(!cmd_access(id, level, cid, 1 ))
1127 return PLUGIN_HANDLED
1128 new hns_name[32]
1129 get_user_name(id,hns_name, 31)
1130 ColorChat(0, RED, "^1[^4%s^1] ^3%s ^1activated ^4Skill mod ^1(semiclip: ^4on^1)", hns_tag, hns_name)
1131
1132 server_cmd("hns_semiclip 0")
1133
1134 return PLUGIN_HANDLED
1135}
1136
1137public hns_boost(id,level,cid) {
1138 if(!cmd_access(id, level, cid, 1)) return PLUGIN_HANDLED
1139 new hns_name[32]
1140 get_user_name(id,hns_name, 31)
1141 ColorChat(0, RED, "^1[^4%s^1] ^3%s ^1activated ^4Boost mod ^1(semiclip: ^4off^1)", hns_tag, hns_name)
1142
1143 server_cmd("hns_semiclip 1")
1144
1145 return PLUGIN_HANDLED
1146}
1147
1148public hns_aa10(id,level,cid) {
1149 if(!cmd_access(id, level, cid, 1)) return PLUGIN_HANDLED
1150 new hns_name[32]
1151 get_user_name(id,hns_name, 31)
1152 ColorChat(0, RED, "^1[^4%s^1] ^3%s ^1changed ^4sv_airaccelerate^1 to^4 10", hns_tag, hns_name)
1153
1154 server_cmd("sv_airaccelerate 10")
1155
1156 return PLUGIN_HANDLED
1157}
1158
1159public hns_aa100(id,level,cid) {
1160 if(!cmd_access(id, level, cid, 1 )) return PLUGIN_HANDLED;
1161 new hns_name[32]
1162 get_user_name(id,hns_name, 31)
1163 ColorChat(0, RED, "^1[^4%s^1] ^3%s ^1changed ^4sv_airaccelerate^1 to^4 100", hns_tag, hns_name)
1164
1165 server_cmd("sv_airaccelerate 100")
1166
1167 return PLUGIN_HANDLED
1168}
1169
1170public hns_mr5(id,level,cid) {
1171 if(!cmd_access(id, level, cid, 1)) return PLUGIN_HANDLED
1172 new hns_name[32]
1173 get_user_name(id,hns_name, 31)
1174 ColorChat(0, RED, "^1[^4%s^1] ^3%s ^1established the: [^4MR 5^1] system", hns_tag, hns_name)
1175
1176 set_pcvar_num(cvarMaxRounds, 4);
1177
1178 return PLUGIN_HANDLED;
1179}
1180
1181public hns_mr7(id,level,cid) {
1182 if(!cmd_access(id, level, cid, 1 ) ) return PLUGIN_HANDLED
1183 new hns_name[32]
1184 get_user_name(id,hns_name, 31)
1185 ColorChat(0, RED, "^1[^4%s^1] ^3%s ^1established the: [^4MR 7^1] system", hns_tag, hns_name)
1186
1187 set_pcvar_num(cvarMaxRounds, 6);
1188
1189 return PLUGIN_HANDLED
1190}
1191
1192public hns_mr9(id,level,cid) {
1193 if(!cmd_access(id, level, cid, 1)) return PLUGIN_HANDLED
1194 new hns_name[32]
1195 get_user_name(id,hns_name, 31)
1196 ColorChat(0, RED, "^1[^4%s^1] ^3%s ^1established the: [^4MR 9^1] system", hns_tag, hns_name)
1197
1198 set_pcvar_num(cvarMaxRounds, 8);
1199
1200 return PLUGIN_HANDLED
1201}
1202
1203const m_pActiveItem = 373;
1204
1205public change_setting_value ( id, const setting[], const value[] )
1206{
1207 if ( !strcmp ( setting, SETTING_KNIFES ) )
1208 gOnOff[id] = bool:str_to_num ( value )
1209
1210 if ( !strcmp ( setting, SETTING_EMITSOUND ) )
1211 gEmitSound[id] = bool:str_to_num ( value )
1212}
1213
1214public cmdShowKnife(id)
1215{
1216 //gOnOff[id] = !gOnOff[id];
1217 gOnOff[id] = gOnOff[id] ? false : true
1218 set_setting_bool ( id, SETTING_KNIFES, gOnOff[id] )
1219 ColorChat(id, RED, "^1[^4%s^1] Knife is now set %svisible", hns_tag, gOnOff[id] ? "^3in" : "^4" );
1220
1221 if( !is_user_alive( id ) )
1222 return PLUGIN_HANDLED;
1223
1224 if( get_user_weapon( id ) == CSW_KNIFE )
1225 {
1226 if( gOnOff[id] )
1227 set_pev( id, pev_viewmodel, 0 );
1228 else
1229 {
1230 new weapon = get_pdata_cbase( id, m_pActiveItem, 5 );
1231 if( weapon != -1 )
1232 ExecuteHamB( Ham_Item_Deploy, weapon );
1233 }
1234 }
1235
1236 return PLUGIN_CONTINUE;
1237
1238}
1239
1240
1241public ShowTimers(id)
1242{
1243 if(GameStarted)
1244 {
1245 new TimeToWin[2][24]
1246 new szTeam[2][64]
1247 fnConvertTime( (get_pcvar_float(g_Captime)*60.0)-flSidesTime[iCurrentSW], TimeToWin[0], 23 );
1248 get_pcvar_string(cvarTeam[iCurrentSW], szTeam[0], 63)
1249 fnConvertTime( (get_pcvar_float(g_Captime)*60.0)-flSidesTime[!iCurrentSW], TimeToWin[1], 23 );
1250 get_pcvar_string(cvarTeam[!iCurrentSW], szTeam[1], 63)
1251 if(!iCurrentSW)
1252 ColorChat(id,RED, "^1[^%s^1] TT [^3%s^1] vs [^3%s^1] CT ",hns_tag, TimeToWin[iCurrentSW], TimeToWin[!iCurrentSW])
1253 else
1254 ColorChat(id,RED, "^1[^%s^1] TT [^3%s^1] vs [^3%s^1] CT ",hns_tag, TimeToWin[!iCurrentSW], TimeToWin[iCurrentSW])
1255 }
1256 else
1257 {
1258 ColorChat(id,RED, "^1[^%s^1] ^1Sorry, but game ain't started atm.", hns_tag)
1259 }
1260}
1261
1262public client_putinserver(id)
1263{
1264 g_bShowSpeed{id} = true;
1265 //gOnOff[id] = false // hns mode
1266 gOnOff[id] = get_setting_bool ( id, SETTING_KNIFES, true ) //knife
1267 gEmitSound[id] = get_setting_bool ( id, SETTING_EMITSOUND, true ) //sound death
1268}
1269
1270public client_authorized(id)
1271{
1272 Load_MySql(id);
1273}
1274
1275public MarkAsLeaved(item)
1276{
1277 item -= LEAVERTASK;
1278 new sz_name[32];
1279
1280 ArrayGetString(Leavers[2], item, sz_name, 31);
1281 new data[4];
1282 ArrayGetArray(Leavers[1], item, data);
1283 data[0] = 1;
1284 ArraySetArray(Leavers[1], item, data);
1285
1286 ColorChat(0, RED, "^1[^4%s^1] Player ^4%s ^1 marked as ^3LEAVER", hns_tag, sz_name);
1287
1288}
1289public LeaversScore(status)
1290{
1291 new size = ArraySize(Leavers[0]);
1292
1293 if(size)
1294 {
1295 new authid[32];
1296 for(new i = 0; i < size; i++)
1297 {
1298 if(task_exists(i+LEAVERTASK))
1299 remove_task(i+LEAVERTASK)
1300
1301 new szTemp[512];
1302 ArrayGetString(Leavers[0], i, authid, 31);
1303 new data[4];
1304 ArrayGetArray(Leavers[1], i, data);
1305 new team = data[1];
1306 new second_half = data[2];
1307 if(data[0] == 1)
1308 {
1309 ColorChat(0, RED, "^1[^4%s^1] ^3%s FAST LEAVE: ^4NO", hns_tag, authid);
1310 format(szTemp,charsmax(szTemp),"UPDATE `%s` SET `pts` = `pts` - 150, `total` = `total` + 1,`leav` = `leav` + 1 WHERE `%s`.`steamid` = '%s';",Table, Table, authid)
1311 SQL_ThreadQuery(g_SqlTuple,"QueryHandle",szTemp)
1312 }
1313 else if(!data[0])
1314 {
1315 ColorChat(0, RED, "^1[^4%s^1] ^3%s FAST LEAVE: ^4YES", hns_tag, authid);
1316 new Points,win,loss,draw;
1317 if(!status)
1318 {
1319 draw = 1;
1320 loss = win = 0;
1321 Points = 50;
1322 }
1323 else if (second_half)
1324 {
1325 if(status == team)
1326 {
1327 win = 1;
1328 loss = draw = 0;
1329 Points = 100;
1330 }
1331 else
1332 {
1333 loss = 1;
1334 win = draw = 0;
1335 Points = -50;
1336 }
1337 }
1338 else
1339 {
1340 if(status != team)
1341 {
1342 win = 1;
1343 loss = draw = 0;
1344 Points = 100;
1345 }
1346 else
1347 {
1348 loss = 1;
1349 win = draw = 0;
1350 Points = -50;
1351 }
1352 }
1353 format(szTemp,charsmax(szTemp),"UPDATE `%s` SET `pts` = `pts` + %d, `total` = `total` + 1,`win` = `win` + %d,`loss` = `loss` + %d,`draw` = `draw` + %d WHERE `%s`.`steamid` = '%s'",Table,Points,win,loss,draw,Table, authid)
1354 SQL_ThreadQuery(g_SqlTuple,"QueryHandle",szTemp)
1355 }
1356 }
1357 }
1358}
1359
1360public client_disconnect(id)
1361{
1362 if(CaptainWinner == id)
1363 CaptainWinner = 0;
1364 if(CaptainSide == id)
1365 CaptainSide = 0;
1366 if(Captain1 == id)
1367 Captain1 = 0;
1368 if(Captain2 == id)
1369 Captain2 = 0;
1370
1371 PlayNoPlay[id] = get_gametime()+60.0;
1372 Save_MySql(id) // PTS
1373
1374 if(get_user_team(id) == 1 || get_user_team(id) == 2)
1375 SaveState(id);
1376}
1377
1378/* Menu (say /mix) */
1379/* Menu (say /mix) */
1380/* Menu (say /mix) */
1381public hns_mix_menu(id)
1382{
1383 new title[64];
1384 new MaxRound = get_pcvar_num(cvarMaxRounds) + 1;
1385 new AiraCcel = get_cvar_num( "sv_airaccelerate");
1386 formatex(title, 63, "\r#hnsERIVM Match System^n\d[MR:%d] [Airaccelerate:%d]", MaxRound, AiraCcel)
1387 new i_Menu = menu_create(title, "hns_mix_menu_code")
1388
1389 // Старт и Ñтоп матча
1390 if(g_CurrentMode != e_gMix)
1391 menu_additem(i_Menu, "Start match", "1")
1392 else
1393 menu_additem(i_Menu, "Stop match", "1")
1394
1395
1396 // Старт и Ñтоп кнайфраунда + Пауза Матча
1397 if(g_CurrentMode != e_gMix && g_CurrentMode != e_gPaused) {
1398 if( g_CurrentMode == e_gKnife )
1399 menu_additem(i_Menu, "Stop kniferound", "2")
1400 else
1401 menu_additem(i_Menu, "Start kniferound", "2")
1402 }
1403 else {
1404 if(g_CurrentMode != e_gPaused)
1405 menu_additem(i_Menu, "Pause match", "2")
1406 else
1407 menu_additem(i_Menu, "Unpause match", "2")
1408 }
1409
1410 // Капитан мод
1411 if(g_CurrentMode != e_gCaptain && CaptainSort == false )
1412 menu_additem(i_Menu, "Start Captain mod", "3")
1413 else
1414 menu_additem(i_Menu, "Stop Captain mod", "3")
1415
1416 //Путое меÑто
1417 menu_addblank(i_Menu, 0)
1418
1419 // РеÑтарт раунда
1420 menu_additem(i_Menu, "Restart round", "4")
1421
1422 // Сменить команды меÑтами
1423 menu_additem(i_Menu, "Swap teams", "5")
1424
1425 //Путое меÑто
1426 menu_addblank(i_Menu, 0)
1427
1428 menu_additem(i_Menu, "Fast Mute Menu^n", "6", 0)
1429
1430 //Мод Ñервера
1431 if(g_CurrentMode == e_gPub)
1432 menu_additem(i_Menu, "Server mode: \rPublic", "7")
1433 else {
1434 if(g_CurrentMode == e_gKnife) {
1435 menu_additem(i_Menu, "Server mode: \rKnife Round", "7")
1436 } else {
1437 if(g_CurrentMode == e_gMix)
1438 menu_additem(i_Menu, "Server mode: \rMatch", "7")
1439 else
1440 menu_additem(i_Menu, "Server mode: \rTraining", "7")
1441 }
1442 }
1443
1444 // Boost / Skill
1445 if(get_pcvar_num(cvarSemiclip) == 1)
1446 menu_additem(i_Menu, "Game type: \rBoost", "8", 0)
1447 if(get_pcvar_num(cvarSemiclip) == 0)
1448 menu_additem(i_Menu, "Game type: \rSkill", "8", 0)
1449
1450 // Открыть меню чтобы перевеÑти игроков
1451 menu_additem(i_Menu, "\wTransferning players^n", "9", ADMIN_MENU)
1452
1453 menu_additem(i_Menu, "Exit", "MENU_EXIT" )
1454
1455 menu_setprop(i_Menu, MPROP_PERPAGE, 0)
1456 menu_display(id, i_Menu, 0)
1457
1458 return PLUGIN_HANDLED
1459}
1460/* /Menu (say /mix) */
1461/* /Menu (say /mix) */
1462/* /Menu (say /mix) */
1463
1464
1465
1466/* Menu Functions (say /mix) */
1467/* Menu Functions (say /mix) */
1468/* Menu Functions (say /mix) */
1469public hns_mix_menu_code(id, menu, item, level, cid)
1470{
1471 if (item == MENU_EXIT)
1472 {
1473 menu_destroy(menu)
1474 return PLUGIN_HANDLED
1475 }
1476
1477 new s_Data[6], s_Name[64], i_Access, i_Callback
1478 menu_item_getinfo(menu, item, i_Access, s_Data, charsmax(s_Data), s_Name, charsmax(s_Name), i_Callback)
1479 new i_Key = str_to_num(s_Data)
1480
1481 switch(i_Key)
1482 {
1483 case 1:
1484 {
1485 if(g_CurrentMode != e_gMix)
1486 client_cmd(id, "say /start")
1487 else
1488 client_cmd(id, "say /stop")
1489 }
1490 case 2:
1491 {
1492 if(g_CurrentMode != e_gMix && g_CurrentMode != e_gPaused) {
1493 if( g_CurrentMode == e_gKnife )
1494 client_cmd(id, "say /stop")
1495 else
1496 client_cmd(id, "say /kf")
1497 }
1498 else {
1499 if(g_CurrentMode != e_gPaused)
1500 client_cmd(id, "say /pause")
1501 else
1502 client_cmd(id, "say /live")
1503 }
1504 }
1505 case 3:
1506 {
1507 if(g_CurrentMode != e_gCaptain && CaptainSort == false )
1508 client_cmd(id, "say /cap")
1509 else
1510 client_cmd(id, "say /stopcap")
1511 }
1512 case 4:
1513 {
1514 client_cmd(id, "say /rr")
1515 }
1516 case 5:
1517 {
1518 client_cmd(id, "say /swap")
1519 }
1520 case 6:
1521 {
1522 client_cmd(id, "amx_gagmenu")
1523 }
1524 case 7:
1525 {
1526 client_cmd(id, "say /mode")
1527 }
1528 case 8:
1529 {
1530 client_cmd(id, "say /type")
1531 }
1532 case 9:
1533 {
1534 client_cmd(id, "say /trans")
1535 }
1536 }
1537
1538 menu_destroy(menu)
1539 return PLUGIN_HANDLED
1540}
1541
1542
1543public hns_mr_menu(id) {
1544 new i_Menu = menu_create("hnsERIVM MR", "hns_mr_menu_code")
1545
1546 menu_additem(i_Menu, "MR5", "1", 0)
1547 menu_additem(i_Menu, "MR7", "2", 0)
1548 menu_additem(i_Menu, "MR9", "3", 0)
1549 menu_addblank(i_Menu, 0)
1550 menu_additem(i_Menu, "Back to Mix menu", "4", 0)
1551
1552 menu_display(id, i_Menu, 0)
1553 menu_additem(i_Menu, "Exit", "MENU_EXIT" )
1554
1555 return PLUGIN_HANDLED
1556}
1557
1558public hns_mr_menu_code(id, menu, item, level, cid)
1559{
1560 if (item == MENU_EXIT)
1561 {
1562 menu_destroy(menu)
1563 return PLUGIN_HANDLED
1564 }
1565 new s_Data[6], s_Name[64], i_Access, i_Callback
1566 menu_item_getinfo(menu, item, i_Access, s_Data, charsmax(s_Data), s_Name, charsmax(s_Name), i_Callback)
1567 new i_Key = str_to_num(s_Data)
1568
1569 switch(i_Key)
1570 {
1571 case 1:
1572 {
1573 client_cmd(id, "say /mr5")
1574 }
1575 case 2:
1576 {
1577 client_cmd(id, "say /mr7")
1578 }
1579 case 3:
1580 {
1581 client_cmd(id, "say /mr9")
1582 }
1583 case 4:
1584 {
1585 hns_mix_menu(id)
1586 }
1587 }
1588 menu_destroy(menu)
1589 return PLUGIN_HANDLED
1590}
1591
1592public hns_semi_menu(id) {
1593 new i_Menu = menu_create("hnsERIVM TYPE", "hns_semi_menu_code")
1594
1595 menu_additem(i_Menu, "Boost", "1", 0)
1596 menu_additem(i_Menu, "Skill", "2", 0)
1597 menu_addblank(i_Menu, 0)
1598 menu_additem(i_Menu, "Back to Mix menu", "3", 0)
1599
1600 menu_display(id, i_Menu, 0)
1601 menu_additem(i_Menu, "Exit", "MENU_EXIT" )
1602 return PLUGIN_HANDLED
1603}
1604
1605public hns_semi_menu_code(id, menu, item, level, cid)
1606{
1607 if (item == MENU_EXIT)
1608 {
1609 menu_destroy(menu)
1610 return PLUGIN_HANDLED
1611 }
1612 new s_Data[6], s_Name[64], i_Access, i_Callback
1613 menu_item_getinfo(menu, item, i_Access, s_Data, charsmax(s_Data), s_Name, charsmax(s_Name), i_Callback)
1614 new i_Key = str_to_num(s_Data)
1615
1616 switch(i_Key)
1617 {
1618 case 1:
1619 {
1620 client_cmd(id, "say /boost")
1621 }
1622 case 2:
1623 {
1624 client_cmd(id, "say /skill")
1625 }
1626 case 3:
1627 {
1628 hns_mix_menu(id)
1629 }
1630 }
1631
1632 menu_destroy(menu)
1633 return PLUGIN_HANDLED
1634}
1635
1636public hns_aa_menu(id) {
1637 new i_Menu = menu_create("hnsERIVM AA", "hns_aa_menu_code")
1638
1639 menu_additem(i_Menu, "100aa", "1", 0)
1640 menu_additem(i_Menu, "10aa", "2", 0)
1641 menu_addblank(i_Menu, 0)
1642 menu_additem(i_Menu, "Back to Mix menu", "3", 0)
1643 menu_display(id, i_Menu, 0)
1644 menu_additem(i_Menu, "Exit", "MENU_EXIT" )
1645 return PLUGIN_HANDLED
1646}
1647
1648public hns_aa_menu_code(id, menu, item, level, cid)
1649{
1650 if (item == MENU_EXIT)
1651 {
1652 menu_destroy(menu)
1653 return PLUGIN_HANDLED
1654 }
1655 new s_Data[6], s_Name[64], i_Access, i_Callback
1656 menu_item_getinfo(menu, item, i_Access, s_Data, charsmax(s_Data), s_Name, charsmax(s_Name), i_Callback)
1657 new i_Key = str_to_num(s_Data)
1658
1659 switch(i_Key)
1660 {
1661 case 1:
1662 {
1663 client_cmd(id, "say /aa100")
1664 }
1665 case 2:
1666 {
1667 client_cmd(id, "say /aa10")
1668 }
1669 case 3:
1670 {
1671 hns_mix_menu(id)
1672 }
1673 }
1674 menu_destroy(menu)
1675 return PLUGIN_HANDLED
1676}
1677
1678public hns_trans_menu(id) {
1679 new i_Menu = menu_create("hnsERIVM TRANSFERS", "hns_trans_menu_code")
1680 menu_additem(i_Menu, "All to Spectators ", "1", 0)
1681 menu_additem(i_Menu, "All to Terrorist ", "2", 0)
1682 menu_additem(i_Menu, "All to Counter-Terrorist", "3", 0)
1683 menu_addblank(i_Menu, 0)
1684 menu_additem(i_Menu, "Back to Mix menu", "4", 0)
1685
1686 menu_display(id, i_Menu, 0)
1687 menu_additem(i_Menu, "Exit", "MENU_EXIT" )
1688 return PLUGIN_HANDLED
1689}
1690
1691public hns_trans_menu_code(id, menu, item, level, cid)
1692{
1693 if (item == MENU_EXIT)
1694 {
1695 menu_destroy(menu)
1696 return PLUGIN_HANDLED
1697 }
1698 new s_Data[6], s_Name[64], i_Access, i_Callback
1699 menu_item_getinfo(menu, item, i_Access, s_Data, charsmax(s_Data), s_Name, charsmax(s_Name), i_Callback)
1700 new i_Key = str_to_num(s_Data)
1701
1702 switch(i_Key)
1703 {
1704 case 1:
1705 {
1706 client_cmd(id, "say /spec")
1707 }
1708 case 2:
1709 {
1710 client_cmd(id, "say /tt")
1711 }
1712 case 3:
1713 {
1714 client_cmd(id, "say /ct")
1715 }
1716 case 4:
1717 {
1718 hns_mix_menu(id)
1719 }
1720 }
1721 menu_destroy(menu)
1722 return PLUGIN_HANDLED
1723}
1724
1725public hns_mode_menu(id) {
1726 new i_Menu = menu_create("hnsERIVM MODE", "hns_mode_menu_code")
1727
1728 if(g_CurrentMode == e_gPub)
1729 {
1730 menu_additem(i_Menu, "\dPublic HNS mode \d(\rrunning\d)", "1", 0)
1731 menu_additem(i_Menu, "Training + Matches", "2", 0)
1732 } else {
1733 menu_additem(i_Menu, "Public HNS mode", "1", 0)
1734 menu_additem(i_Menu, "\dTraining + Matches \d(\rrunning\d)", "2", 0)
1735 }
1736
1737 menu_addblank(i_Menu, 0)
1738 menu_additem(i_Menu, "Back to Mix menu", "3", 0)
1739 menu_display(id, i_Menu, 0)
1740 menu_additem(i_Menu, "Exit", "MENU_EXIT" )
1741 return PLUGIN_HANDLED
1742}
1743
1744public hns_mode_menu_code(id, menu, item, level, cid)
1745{
1746 if (item == MENU_EXIT)
1747 {
1748 menu_destroy(menu)
1749 return PLUGIN_HANDLED
1750 }
1751 new s_Data[6], s_Name[64], i_Access, i_Callback
1752 menu_item_getinfo(menu, item, i_Access, s_Data, charsmax(s_Data), s_Name, charsmax(s_Name), i_Callback)
1753 new i_Key = str_to_num(s_Data)
1754
1755 switch(i_Key)
1756 {
1757 case 1:
1758 {
1759 client_cmd(id, "say /pub")
1760 }
1761 case 2:
1762 {
1763 client_cmd(id, "say /def")
1764 }
1765 case 3:
1766 {
1767 hns_mix_menu(id)
1768 }
1769 }
1770 menu_destroy(menu)
1771 return PLUGIN_HANDLED
1772}
1773/* /Menu Functions (say /mix) */
1774/* /Menu Functions (say /mix) */
1775/* /Menu Functions (say /mix) */
1776
1777/* Training start */
1778
1779/* Hook */
1780/* Hook */
1781/* Hook */
1782public hns_hook_on(id)
1783{
1784 if ( g_CurrentMode > e_gPaused )
1785 return PLUGIN_HANDLED
1786
1787 if( !is_user_alive(id) )
1788 return PLUGIN_HANDLED
1789
1790 get_user_origin(id,hookorigin[id],3)
1791 hns_hooked[id] = true
1792 set_task(0.1,"hns_hook_task",id+9999,"",0,"ab")
1793 hns_hook_task(id+9999)
1794
1795 return PLUGIN_HANDLED
1796}
1797
1798public is_hooked(id)
1799{
1800 return hns_hooked[id]
1801}
1802
1803public hns_hook_off(id)
1804{
1805 remove_hook(id)
1806
1807 return PLUGIN_HANDLED
1808}
1809
1810public hns_hook_task(id)
1811{
1812 id -= 9999;
1813 if(!is_user_connected(id) || !is_user_alive(id) || g_CurrentMode > e_gPaused)
1814 remove_hook(id)
1815
1816 remove_beam(id)
1817 draw_hook(id)
1818
1819 new origin[3], Float:velocity[3]
1820 get_user_origin(id,origin)
1821 new distance = get_distance(hookorigin[id],origin)
1822 if(distance > 60)
1823 {
1824 velocity[0] = (hookorigin[id][0] - origin[0]) * (2.0 * 500 / distance)
1825 velocity[1] = (hookorigin[id][1] - origin[1]) * (2.0 * 500 / distance)
1826 velocity[2] = (hookorigin[id][2] - origin[2]) * (2.0 * 500 / distance)
1827 entity_set_vector(id,EV_VEC_velocity,velocity)
1828 }
1829 else
1830 {
1831 entity_set_vector(id,EV_VEC_velocity,Float:{0.0,0.0,0.0})
1832 entity_set_float(id, EV_FL_gravity, 0.00000001);
1833 }
1834 entity_set_int(id, EV_INT_sequence, 55);
1835 entity_set_float(id,EV_FL_frame, 0.0);
1836}
1837
1838public draw_hook(id)
1839{
1840 message_begin(MSG_BROADCAST,SVC_TEMPENTITY)
1841 write_byte(1) // TE_BEAMENTPOINT
1842 write_short(id) // entid
1843 write_coord(hookorigin[id][0]) // origin
1844 write_coord(hookorigin[id][1]) // origin
1845 write_coord(hookorigin[id][2]) // origin
1846 write_short(Sbeam) // sprite index
1847 write_byte(0) // start frame
1848 write_byte(0) // framerate
1849 write_byte(100) // life
1850 write_byte(10) // width
1851 write_byte(0) // noise
1852 write_byte(50) // r
1853 write_byte(150) // g
1854 write_byte(250) // b
1855 write_byte(250) // brightness
1856 write_byte(0) // speed
1857 message_end()
1858}
1859
1860
1861public remove_hook(id)
1862{
1863 if(task_exists(id+9999))
1864 remove_task(id+9999)
1865
1866 remove_beam(id)
1867 entity_set_float(id, EV_FL_gravity, 1.0);
1868 ishooked[id] = false
1869}
1870
1871public remove_beam(id)
1872{
1873 message_begin(MSG_BROADCAST,SVC_TEMPENTITY)
1874 write_byte(99) // TE_KILLBEAM
1875 write_short(id)
1876 message_end()
1877}
1878/* /Hook */
1879/* /Hook */
1880/* /Hook */
1881
1882
1883// Commands
1884public cmdCheckpoint(plr)
1885{
1886 if( g_CurrentMode > e_gPaused )
1887 {
1888 client_print(plr, print_chat, "Checkpoints are disabled.");
1889 return PLUGIN_HANDLED;
1890 }
1891 else if( !is_user_alive(plr) )
1892 {
1893 client_print(plr, print_chat, "You can't do that while dead.");
1894 return PLUGIN_HANDLED;
1895 }
1896
1897 pev(plr, pev_origin, gCheckpoints[plr][g_bCheckpointAlternate[plr] ? 1 : 0]);
1898 g_bCheckpointAlternate[plr] = !g_bCheckpointAlternate[plr];
1899
1900 return PLUGIN_HANDLED;
1901}
1902
1903public cmdGoCheck(plr)
1904{
1905 if( g_CurrentMode > e_gPaused )
1906 {
1907 client_print(plr, print_chat, "Checkpoints are disabled.");
1908 return PLUGIN_HANDLED;
1909 }
1910 else if( !is_user_alive(plr) )
1911 {
1912 client_print(plr, print_chat, "You can't do that while dead.");
1913 return PLUGIN_HANDLED;
1914 }
1915 else if( !gCheckpoints[plr][0][0] )
1916 {
1917 client_print(plr, print_chat, "%L", plr, "You don't have any checkpoints.");
1918 return PLUGIN_HANDLED;
1919 }
1920
1921 set_pev(plr, pev_velocity, Float:{0.0, 0.0, 0.0});
1922 set_pev(plr, pev_flags, pev(plr, pev_flags) | FL_DUCKING)
1923 engfunc(EngFunc_SetOrigin, plr, gCheckpoints[plr][!g_bCheckpointAlternate[plr]]);
1924
1925 return PLUGIN_HANDLED;
1926}
1927/* Training end */
1928
1929public cmdStartRound(id)
1930{
1931 if(get_user_flags(id) & hns_ACESS)
1932 {
1933 if(g_CurrentMode > e_gKnife)
1934 {
1935 ColorChat(id, RED, "[^4%s^1] Please ^4disable ^1other mode before start mix", hns_tag);
1936 }
1937 else
1938 {
1939 if(current_mode == mode_mr)
1940 pf_Scrim(id)
1941 else
1942 StartSMCmd(id);
1943 }
1944 }
1945}
1946
1947public StartSMCmd(id) {
1948
1949 if(!GameStarted)
1950 {
1951 set_dhudmessage(0, 128, 0, -1.0, 0.60, 2, 0.0, 5.0, 0.01, 0.01)
1952
1953 show_dhudmessage(0, "SURVIVAL MODE STARTS IN 5 SECONDS")
1954 set_task(5.0, "StartSM");
1955 }
1956 else
1957 {
1958 client_print(id, print_chat, "[%s] Survival Mode is already started, to stop it say /stop", hns_tag);
1959 }
1960 return PLUGIN_HANDLED
1961}
1962
1963public StopSMCmd(id) {
1964 if(GameStarted)
1965 {
1966 GameStarted = false
1967 Survival = false;
1968 new szName[64]
1969 get_user_name(id, szName, 63)
1970 client_print(0, print_chat, "[%s] %s stoped Survival Mode", hns_tag, szName);
1971 }
1972 return PLUGIN_HANDLED
1973}
1974
1975public StartSM()
1976{
1977 PrepareMode(e_gMix);
1978 flSidesTime[0] = 0.0
1979 flSidesTime[1] = 0.0
1980 iCurrentSW = 1;
1981 GameStarted = true;
1982 server_cmd("sv_restart 1")
1983 set_task(2.0, "LiveMessage");
1984
1985}
1986
1987public cmdStop(id)
1988{
1989 if(get_user_flags(id) & hns_ACESS)
1990 {
1991 switch(g_CurrentMode)
1992 {
1993 case e_gPaused:
1994 {
1995 ColorChat(0, RED, "[^4%s^1] ^3%s ^1stopped ^4Mix^1!", hns_tag, GetName(id))
1996 }
1997 case e_gKnife:
1998 {
1999 ColorChat(0, RED, "[^4%s^1] ^3%s ^1stopped ^4Knife Round^1!", hns_tag, GetName(id))
2000 }
2001 case e_gMix:
2002 {
2003 ColorChat(0, RED, "[^4%s^1] ^3%s ^1stopped ^4Mix^1!", hns_tag, GetName(id))
2004 }
2005 case e_gPub:
2006 {
2007 ColorChat(0, RED, "[^4%s^1] ^3%s ^1stopped ^4Public mode^1!", hns_tag, GetName(id))
2008 }
2009 }
2010
2011 server_cmd("amxx unpause uq_jumpstats.amxx")
2012 StopSMCmd(id);
2013 if(g_CurrentMode)
2014 {
2015 PrepareMode(e_gTraining);
2016 }
2017 }
2018}
2019public cmdKnifeRound(id)
2020{
2021 if(get_user_flags(id) & hns_ACESS)
2022 {
2023 if(g_CurrentMode > e_gKnife)
2024 {
2025 ColorChat(id, RED, "[^4%s^1] Please ^4disable ^1other mode before start knife", hns_tag);
2026 }
2027 else
2028 {
2029 pf_KnifeRound(id)
2030 remove_hook(id)
2031 }
2032 }
2033}
2034
2035public pf_Scrim(id)
2036{
2037 set_task(4.5, "PrepareMode", e_gMix);
2038 set_task(5.0, "RestartRound");
2039 Task_Hud(0, 0.0, 1, 65, 105, 225, 3.0, "GOING LIVE IN 5 SECONDS")
2040 Task_Hud(0, 7.0, 1, 255, 153, 0, 5.0, "LIVE LIVE LIVE^nGood Luck & Have Fun")
2041
2042 Announce( 1 );
2043 ColorChat(0, GREY, "[^4%s^1] ^3%s ^1started ^4Mix!", hns_tag, GetName(id));
2044}
2045
2046public pf_KnifeRound(id)
2047{
2048 new szMapName[64]
2049 get_mapname(szMapName, 63);
2050 PrepareMode(e_gKnife);
2051 RingWidth = 2300.0;
2052 if(get_pcvar_num(ring_cvar))
2053 set_task(0.1, "RingTask", RINGTASK, .flags = "b");
2054 Task_Hud(0, 2.0, 1, 65, 105, 225, 3.0, "Knife Round Started!");
2055 ColorChat(0, RED, "[^4%s^1] ^3%s ^1started ^4Knife Round!", hns_tag, GetName(id));
2056
2057 return PLUGIN_HANDLED
2058}
2059
2060public Score(id)
2061{
2062 if(current_mode == mode_timebased)
2063 {
2064 ShowTimers(id)
2065 return PLUGIN_CONTINUE
2066 }
2067 new teamname[2][32]
2068 /*get_pcvar_string(cvarTeamOne, teamname[0], 31)
2069 get_pcvar_string(cvarTeamTwo, teamname[1], 31)*/
2070 teamname[0] = "CT";
2071 teamname[1] = "TT";
2072 if(!g_iSecondHalf)
2073 ColorChat(id, BLUE,"^1[^4%s^1] Score: ^4%s ^3%d^1:^3%d ^4%s ^1(^3MR%d^1)", hns_tag, teamname[0], g_iScore[0], g_iScore[1], teamname[1], get_pcvar_num(cvarMaxRounds))
2074 else
2075 ColorChat(id, BLUE,"^1[^4%s^1] Score: ^4%s ^3%d^1:^3%d ^4%s ^1(^3MR%d^1)", hns_tag, teamname[1], g_iScore[0], g_iScore[1], teamname[0], get_pcvar_num(cvarMaxRounds))
2076
2077 return PLUGIN_CONTINUE
2078}
2079
2080public eCurWeapon(id)
2081{
2082 if(g_CurrentMode == e_gKnife)
2083 {
2084 engclient_cmd(id, "weapon_knife")
2085 }
2086
2087 if(!g_bFreezePeriod)
2088 return
2089
2090 if (cs_get_user_team(id) == CS_TEAM_T)
2091 cs_reset_user_maxspeed(id)
2092}
2093
2094public cs_reset_user_maxspeed(id) {
2095 engfunc(EngFunc_SetClientMaxspeed, id, 250.0);
2096 set_pev(id, pev_maxspeed, 250.0)
2097 return PLUGIN_HANDLED
2098}
2099
2100#define TASK_ROUNDTIME 8888
2101
2102public ePreFT() {
2103 if(task_exists(ROUNDENDTASK))
2104 remove_task(ROUNDENDTASK);
2105 if(task_exists(TASK_ROUNDTIME))
2106 remove_task(TASK_ROUNDTIME);
2107
2108
2109 if(GameStarted)
2110 {
2111 ShowTimers(0);
2112 }
2113
2114 g_flRoundTime = 0.0;
2115 RingWidth = 2300.0;
2116 EnableHamForward( Player_Killed_Pre );
2117 g_bLastFlash = false;
2118 g_bFreezePeriod = true;
2119
2120 set_task(0.1, "TaskDestroyBreakables");
2121}
2122public ePostFT() {
2123 StartRoundTime = get_gametime();
2124 g_bFreezePeriod = false;
2125
2126 if(current_mode == mode_timebased)
2127 {
2128 if(GameStarted)
2129 Survival = true
2130
2131 set_task(0.25, "RoundEnd", TASK_ROUNDTIME,. flags = "b");
2132 }
2133}
2134
2135
2136public RoundEnd()
2137{
2138 g_flRoundTime+= 0.25;
2139 if(Survival)
2140 {
2141 flSidesTime[iCurrentSW]+=0.25;
2142 if(flSidesTime[iCurrentSW] >= get_pcvar_float(g_Captime)*60.0)
2143 {
2144 SoundFx = false;
2145 GameStarted = false;
2146 Survival = false;
2147 new szTeam[64]
2148 new Float:TimeDiff
2149 get_pcvar_string(cvarTeam[iCurrentSW], szTeam, 63)
2150 if(iCurrentSW)
2151 TimeDiff = flSidesTime[iCurrentSW]-flSidesTime[0]
2152 else
2153 TimeDiff = flSidesTime[iCurrentSW]-flSidesTime[1]
2154
2155 new sTime[24];
2156 fnConvertTime( TimeDiff, sTime, 23 );
2157 PrepareMode(e_gTraining);
2158 ColorChat(0,RED,"^1[^4%s^1] ^3%s won the match! (%s difference)",hns_tag, szTeam, sTime)
2159
2160 MixFinished(1);
2161 server_cmd("sv_restart 1")
2162 }
2163 else if(flSidesTime[iCurrentSW] >= get_pcvar_float(g_Captime)*60.0-1.5 && !SoundFx)
2164 {
2165 EndSoundFx(1);
2166 SoundFx = true;
2167 }
2168 }
2169 if((g_flRoundTime/60.0) >= get_pcvar_float( g_pRoundTime ))
2170 {
2171 if(GameStarted)
2172 Survival = false;
2173 //RoundTerminating(0.5)
2174
2175 remove_task(TASK_ROUNDTIME)
2176 }
2177}
2178
2179
2180public EndSoundFx( toggle )
2181{
2182 if(toggle)
2183 client_cmd ( 0 , "spk ambience/endgame.wav" )
2184 else
2185 for( new i = 1; i <= g_iMaxPlayers; i++ )
2186 {
2187 if(is_user_connected(i))
2188 client_cmd(i, "stopsound");
2189 }
2190
2191}
2192
2193public TerroristWin()
2194{
2195 new winner = 2;
2196 if(g_CurrentMode == e_gMix)
2197 {
2198 if(!g_iSecondHalf)
2199 {
2200 if(winner == 1)
2201 {
2202 g_iScore[0]++
2203 }
2204 if(winner == 2)
2205 {
2206 g_iScore[1]++
2207 }
2208 }
2209 else
2210 {
2211 if(winner == 1)
2212 {
2213 g_iScore[1]++
2214 }
2215 if(winner == 2)
2216 {
2217 g_iScore[0]++
2218 }
2219 }
2220 CheckScore();
2221 }
2222 server_cmd("sv_restart 1");
2223}
2224
2225public eEndRound()
2226{
2227 if(task_exists(ROUNDENDTASK))
2228 remove_task(ROUNDENDTASK);
2229
2230 new msg[32], winner;
2231 read_data(2,msg,32)
2232
2233 if(task_exists(RINGTASK))
2234 remove_task(RINGTASK)
2235
2236 if(containi(msg,"ct") != -1)
2237 {
2238 winner = 1
2239 }
2240
2241 else if(contain(msg,"ter") != -1)
2242 {
2243 winner = 2;
2244
2245 }
2246
2247 if(g_CurrentMode == e_gPub || (g_CurrentMode == e_gMix && current_mode == mode_timebased))
2248 {
2249 Survival = false;
2250 if(winner == 1)
2251 {
2252 iCurrentSW = !iCurrentSW;
2253 SwitchTeams();
2254 }
2255 }
2256 else if(g_CurrentMode == e_gMix && current_mode == mode_mr)
2257 {
2258 if(!g_iSecondHalf)
2259 {
2260 if(winner == 1)
2261 {
2262 g_iScore[0]++
2263 }
2264 if(winner == 2)
2265 {
2266 g_iScore[1]++
2267 }
2268 }
2269 else
2270 {
2271 if(winner == 1)
2272 {
2273 g_iScore[1]++
2274 }
2275 if(winner == 2)
2276 {
2277 g_iScore[0]++
2278 }
2279 }
2280 CheckScore();
2281 }
2282 else if(g_CurrentMode == e_gKnife)
2283 {
2284 if(winner == 1)
2285 {
2286 Task_Hud(0, 2.0, 1, 65, 105, 225, 3.0, "KNIFE ROUND WIN COUNTER-TERRORISTS");
2287 }
2288 if(winner == 2)
2289 {
2290 Task_Hud(0, 2.0, 1, 65, 105, 225, 3.0, "KNIFE ROUND WIN TERRORISTS");
2291 }
2292
2293 if(CaptainWinner == 3)
2294 {
2295 if(winner == 1)
2296 CaptainSide = Captain1;
2297 else
2298 CaptainSide = Captain2;
2299 set_task(1.5, "captain_menu", CaptainSide);
2300 //set_task(0.2, "PlayersList", TASK_PLAYERSLIST, _, _, "b");
2301 CaptainWinner = 0;
2302 CaptainSort = true
2303 PrepareMode(e_gCaptain);
2304 }
2305 else
2306 PrepareMode(e_gTraining);
2307
2308 SavePlayers();
2309 }
2310}
2311
2312public CheckScore()
2313{
2314 new Rounds = get_pcvar_num(cvarMaxRounds)
2315
2316 Score(0);
2317
2318 if(!g_iSecondHalf)
2319 {
2320 if(g_iScore[0]+g_iScore[1] == Rounds)
2321 {
2322 g_iSecondHalf = true;
2323 SwitchTeams();
2324 Task_Hud(0, 2.0, 1, 65, 105, 225, 6.0, "1ST HALF %d:%d^nSWITCHING SIDES...^n2ND HALF IN 5 SECONDS", g_iScore[0], g_iScore[1])
2325 Task_Hud(0, 9.0, 1, 255, 153, 0, 5.0, "LIVE LIVE LIVE");
2326 set_task(5.0, "RestartRound");
2327
2328 }
2329 }
2330 else
2331 {
2332 new teamname[32]
2333 if(g_iScore[0] > Rounds)
2334 {
2335 MixFinished(1)
2336 get_pcvar_string(cvarTeam[0], teamname, 31)
2337 Task_Hud(0, 2.0, 1, 65, 105, 225, 3.0, "MATCH FINISHED^nWINNER: %s",teamname);
2338 PrepareMode(e_gTraining);
2339 }
2340 else if(g_iScore[1] > Rounds)
2341 {
2342 MixFinished(2)
2343 get_pcvar_string(cvarTeam[1], teamname, 31)
2344 Task_Hud(0, 2.0, 1, 65, 105, 225, 3.0, "MATCH FINISHED^nWINNER: %s",teamname);
2345 PrepareMode(e_gTraining);
2346 }
2347 else if((g_iScore[0]+g_iScore[1]) == (Rounds*2))
2348 {
2349 Task_Hud(0, 2.0, 1, 65, 105, 225, 3.0, "MATCH FINISHED^nDRAW DRAW DRAW");
2350
2351 MixFinished(0)
2352 PrepareMode(e_gTraining);
2353 }
2354 }
2355}
2356
2357public SwitchTeams()
2358{
2359 for( new i = 1; i <= g_iMaxPlayers; i++ ) {
2360 if( is_user_connected( i ) )
2361 {
2362 switch( cs_get_user_team( i ) )
2363 {
2364 case CS_TEAM_T: cs_set_user_team( i, CS_TEAM_CT )
2365 case CS_TEAM_CT: cs_set_user_team( i, CS_TEAM_T )
2366 }
2367 }
2368 }
2369}
2370
2371public CBasePlayer_Spawn_Post(id) {
2372
2373 if (!is_user_alive(id))
2374 return;
2375
2376 set_pdata_bool(id, m_bJustConnected, false);
2377 if(g_CurrentMode <= e_gPaused)
2378 set_user_godmode(id, 1)
2379
2380 SetRole(id)
2381}
2382
2383
2384public SetRole(id) {
2385 new CsTeams:team = cs_get_user_team(id)
2386 strip_user_weapons(id)
2387 set_user_freeze(id, 0);
2388 if(g_CurrentMode > e_gKnife )
2389 {
2390 switch (team)
2391 {
2392 case CS_TEAM_T:
2393 {
2394 set_user_footsteps(id, 1);
2395 give_item(id, "weapon_knife")
2396 if( get_pcvar_num( cvarFlashNum ) >= 1 )
2397 {
2398 give_item( id, "weapon_flashbang" );
2399 cs_set_user_bpammo( id, CSW_FLASHBANG, get_pcvar_num( cvarFlashNum ) );
2400 }
2401 if( get_pcvar_num( cvarSmokeNum ) >= 1 )
2402 {
2403 give_item( id, "weapon_smokegrenade" );
2404 cs_set_user_bpammo( id, CSW_SMOKEGRENADE, get_pcvar_num( cvarSmokeNum ) );
2405 }
2406 }
2407 case CS_TEAM_CT:
2408 {
2409 set_user_footsteps(id, 0);
2410 give_item(id, "weapon_knife")
2411 }
2412 }
2413 }
2414 else
2415 {
2416 give_item(id, "weapon_knife")
2417 }
2418}
2419
2420public GetName(id)
2421{
2422 new szName[128]
2423 get_user_name(id, szName, charsmax(szName))
2424 return szName
2425}
2426
2427/*public CheckCvars(mode)
2428{
2429 switch(mode)
2430 {
2431 case 0:
2432 {
2433
2434 }
2435 case 3:
2436 {
2437 server_cmd( "hns_hns 1" )
2438 server_cmd( "hns_footsteps 1" )
2439 server_cmd( "mp_forcechasecam 2")
2440 server_cmd( "mp_forcecamera 2")
2441 server_cmd( "hns_alltalk 0" )
2442 server_cmd( "mp_timelimit 0" )
2443 }
2444 }
2445}*/
2446
2447public PrepareMode(mode)
2448{
2449
2450 switch(mode)
2451 {
2452 case e_gTraining:
2453 {
2454 if(task_exists(RINGTASK))
2455 remove_task(RINGTASK);
2456
2457 server_cmd( "mp_timelimit 0" )
2458 server_cmd( "mp_roundtime 9" )
2459 server_cmd( "mp_freezetime 0" )
2460 //server_cmd( "hns_alltalk 1" )
2461 server_cmd( "sv_alltalk 1" )
2462 g_CurrentMode = e_gTraining;
2463 }
2464 case e_gKnife:
2465 {
2466 server_cmd("amxx pause uq_jumpstats.amxx")
2467 server_cmd("mp_freezetime 0")
2468 /*if(g_CurrentMode == e_gCaptain && CaptainSort == true )
2469 server_cmd("hns_alltalk 1")
2470 else*/
2471 //server_cmd("hns_alltalk 0")
2472 server_cmd("mp_timelimit 0")
2473 server_cmd("mp_forcechasecam 2")
2474 server_cmd("mp_forcecamera 2")
2475 g_CurrentMode = e_gKnife;
2476 }
2477 case e_gMix:
2478 {
2479 if(task_exists(RINGTASK))
2480 remove_task(RINGTASK);
2481
2482 LoadMapCFG();
2483 g_iScore[0] = 0;
2484 g_iScore[1] = 0;
2485 g_iSecondHalf = false;
2486 server_cmd("amxx pause uq_jumpstats.amxx")
2487 server_cmd("hns_hns 1" )
2488 server_cmd("hns_flash 3")
2489 server_cmd( "hns_footsteps 1" )
2490 server_cmd("mp_forcechasecam 2")
2491 server_cmd("mp_forcecamera 2")
2492 server_cmd( "mp_freezetime 15" )
2493 //server_cmd( "hns_alltalk 0" )
2494 server_cmd( "mp_timelimit 0" )
2495 g_CurrentMode = e_gMix;
2496 }
2497 case e_gPub:
2498 {
2499 g_CurrentMode = e_gPub;
2500
2501 server_cmd("mp_forcechasecam 0")
2502 server_cmd("mp_forcecamera 0")
2503 server_cmd("hns_switch 1")
2504 server_cmd("hns_footsteps 1")
2505 server_cmd("mp_autoteambalance 1")
2506 server_cmd("mp_roundtime 2.5")
2507 server_cmd("mp_freezetime 3")
2508 server_cmd("hns_flash 1")
2509 server_cmd("hns_block_change 0")
2510 server_cmd("hns_training 0")
2511 server_cmd("hns_checkpoints 1")
2512 server_cmd("hns_hook 1")
2513
2514 }
2515 case e_gCaptain:
2516 {
2517 g_CurrentMode = e_gCaptain;
2518 }
2519 }
2520
2521 RestartRound();
2522}
2523public RestartRound()
2524{
2525 Survival = false;
2526 flSidesTime[iCurrentSW] -= g_flRoundTime;
2527 server_cmd("sv_restart 1");
2528}
2529
2530
2531public FwdKnifePrim( const iPlayer )
2532{
2533 if( g_CurrentMode )
2534 {
2535 ExecuteHamB( Ham_Weapon_SecondaryAttack, iPlayer );
2536 return HAM_SUPERCEDE;
2537 }
2538 return HAM_IGNORED;
2539}
2540
2541
2542public FwdDeployKnife( const iEntity )
2543{
2544 new iClient = get_pdata_cbase( iEntity, m_pPlayer, EXTRAOFFSET_WEAPONS );
2545
2546 if(gOnOff[iClient] )
2547 {
2548 set_pev(iClient, pev_viewmodel, 0)
2549 }
2550 else
2551 {
2552 set_pev(iClient, pev_viewmodel, alloc_KnifeModel)
2553 }
2554
2555 if(get_user_team(iClient) == 1 && g_CurrentMode != e_gKnife)
2556 {
2557 set_pdata_float( iEntity, m_flNextPrimaryAttack, 9999.0, EXTRAOFFSET_WEAPONS );
2558 set_pdata_float( iEntity, m_flNextSecondaryAttack, 9999.0, EXTRAOFFSET_WEAPONS );
2559 }
2560 return HAM_IGNORED;
2561}
2562
2563public Task_Hud(id, Float:Time ,Dhud, Red, Green, Blue, Float:HoldTime, const Text[], any: ... )
2564{
2565 new message[128]; vformat( message, charsmax( message ), Text, 9 );
2566 new Args[7];
2567 Args[0] = id;
2568 Args[1] = EncodeText(message);
2569 Args[2] = Red
2570 Args[3] = Green
2571 Args[4] = Blue
2572 Args[5] = Dhud
2573 Args[6] = _:HoldTime
2574 if(Time > 0.0)
2575 set_task(Time, "Hud_Message", 89000, Args, 7)
2576 else
2577 Hud_Message(Args)
2578}
2579
2580public Hud_Message(Params[])
2581{
2582 new id, Text[128], RRR, GGG, BBB, dhud, Float:HoldTime
2583 id = Params[0]
2584 DecodeText(Params[1], Text, charsmax(Text))
2585 RRR = Params[2]
2586 GGG = Params[3]
2587 BBB = Params[4]
2588 dhud = Params[5]
2589 HoldTime = Float:Params[6]
2590
2591 if(!id || is_user_connected(id))
2592 {
2593 if(dhud)
2594 {
2595 set_hudmessage(RRR, GGG, BBB, -1.0, 0.60, 0, 0.0, HoldTime, 0.1, 0.1)
2596
2597 show_hudmessage(id, Text)
2598 }
2599 else
2600 {
2601 set_hudmessage(RRR, GGG, BBB, -1.0, 0.60, 0, 0.0, HoldTime, 0.1, 0.1, -1);
2602 show_hudmessage(id, Text)
2603 }
2604 }
2605}
2606
2607// Functions
2608stock fnRegisterSayCmd(const szCmd[], const szShort[], const szFunc[], flags = -1, szInfo[] = "")
2609{
2610 new szTemp[65], szInfoLang[65];
2611 format(szInfoLang, 64, "%L", LANG_SERVER, szInfo);
2612
2613 format(szTemp, 64, "say /%s", szCmd);
2614 register_clcmd(szTemp, szFunc, flags, szInfoLang);
2615
2616 format(szTemp, 64, "%s", szCmd);
2617 register_clcmd(szTemp, szFunc, flags, szInfoLang);
2618
2619 format(szTemp, 64, "/%s", szCmd);
2620 register_clcmd(szTemp, szFunc, flags, szInfoLang);
2621
2622
2623 format(szTemp, 64, "say /%s", szShort);
2624 register_clcmd(szTemp, szFunc, flags, szInfoLang);
2625
2626 format(szTemp, 64, "%s", szShort);
2627 register_clcmd(szTemp, szFunc, flags, szInfoLang);
2628
2629 format(szTemp, 64, "/%s", szShort);
2630 register_clcmd(szTemp, szFunc, flags, szInfoLang);
2631
2632 return 1;
2633}
2634
2635stock EncodeText( const text[] )
2636{
2637 return engfunc( EngFunc_AllocString, text )
2638}
2639
2640stock DecodeText( const text, string[], const length )
2641{
2642 global_get( glb_pStringBase, text, string, length )
2643}
2644
2645new bool:plrSolid[MAX_PLAYERS+1]
2646new bool:plrRestore[MAX_PLAYERS+1]
2647new plrTeam[MAX_PLAYERS+1]
2648
2649public addToFullPack(es, e, ent, host, hostflags, player, pSet)
2650{
2651 if(get_pcvar_num(cvarSemiclip))
2652 return FMRES_IGNORED;
2653
2654 if(player)
2655 {
2656 static Float:flDistance
2657 flDistance = entity_range(host, ent)
2658
2659 if(plrSolid[host] && plrSolid[ent] && plrTeam[host] == plrTeam[ent] && get_user_team(host) != 3 && flDistance < 512.0)
2660 {
2661 set_es(es, ES_Solid, SOLID_NOT)
2662 set_es(es, ES_RenderMode, kRenderTransAlpha)
2663 set_es(es, ES_RenderAmt, floatround(flDistance)/1)
2664 }
2665 }
2666
2667 return FMRES_IGNORED;
2668}
2669
2670FirstThink()
2671{
2672 for(new i = 1; i <= g_iMaxPlayers; i++)
2673 {
2674 if(!is_user_alive(i))
2675 {
2676 plrSolid[i] = false
2677 continue
2678 }
2679
2680 plrTeam[i] = get_user_team(i)
2681
2682 plrSolid[i] = pev(i, pev_solid) == SOLID_SLIDEBOX ? true : false
2683 }
2684}
2685
2686public preThink(id)
2687{
2688 if(get_pcvar_num(cvarSemiclip))
2689 return FMRES_IGNORED;
2690
2691 static i, LastThink
2692
2693 if(LastThink > id)
2694 {
2695 FirstThink()
2696 }
2697 LastThink = id
2698
2699
2700 if(!plrSolid[id]) return FMRES_IGNORED
2701
2702 for(i = 1; i <= g_iMaxPlayers; i++)
2703 {
2704 if(!plrSolid[i] || id == i) continue
2705
2706 if(plrTeam[i] == plrTeam[id])
2707 {
2708 set_pev(i, pev_solid, SOLID_NOT)
2709 plrRestore[i] = true
2710 }
2711 }
2712
2713 return FMRES_IGNORED;
2714}
2715
2716public postThink(id)
2717{
2718 if(get_pcvar_num(cvarSemiclip))
2719 return FMRES_IGNORED;
2720
2721 static i
2722
2723 for(i = 1; i <= g_iMaxPlayers; i++)
2724 {
2725 if(plrRestore[i])
2726 {
2727 set_pev(i, pev_solid, SOLID_SLIDEBOX)
2728 plrRestore[i] = false
2729 }
2730 }
2731 return FMRES_IGNORED;
2732}
2733
2734public CaptainCmd(id,level,cid) {
2735 if(!cmd_access(id, level, cid, 1)) return PLUGIN_HANDLED
2736
2737 if(g_CurrentMode != e_gTraining)
2738 return PLUGIN_HANDLED
2739
2740 g_CurrentMode = e_gCaptain;
2741
2742 new hns_name[32]
2743 get_user_name(id, hns_name, charsmax(hns_name))
2744 new iPlayers[32], iNum;
2745 get_players(iPlayers, iNum);
2746
2747 Captain1 = Captain2 = 0;
2748
2749 for(new i; i < iNum; i++)
2750 {
2751 user_silentkill(iPlayers[i]);
2752 cs_set_user_team(iPlayers[i], 3);
2753 }
2754
2755 //PrepareMode(e_gKnife);
2756
2757 ColorChat(0, RED, "^1[^4%s^1] ^3%s ^1choosing ^4captains^1...", hns_tag, hns_name);
2758
2759 CaptainMenu(id);
2760
2761 return PLUGIN_HANDLED;
2762}
2763
2764public StopCaptainCmd(id,level,cid) {
2765 if(!cmd_access(id, level, cid, 1)) return PLUGIN_HANDLED
2766
2767 if(g_CurrentMode == e_gMix || g_CurrentMode == e_gPaused)
2768 return PLUGIN_HANDLED
2769
2770 new hns_name[32]
2771 get_user_name(id, hns_name, charsmax(hns_name))
2772
2773 CaptainWinner = CaptainSide = 0;
2774 Captain1 = Captain2 = 0;
2775 CaptainSort = false;
2776 if(task_exists(TASK_MENUCLOSE))
2777 remove_task(TASK_MENUCLOSE)
2778
2779 if(task_exists(TASK_PLAYERSLIST))
2780 remove_task(TASK_PLAYERSLIST)
2781
2782 PrepareMode(e_gTraining);
2783
2784 ColorChat(0, RED, "^1[^4%s^1] ^3%s ^1stoped ^4captain mode^1...", hns_tag, hns_name);
2785
2786 return PLUGIN_HANDLED;
2787}
2788
2789public CaptainMenu( id )
2790{
2791 //Create a variable to hold the menu
2792 new menu = menu_create( "\rLook at this Player Menu!:", "menu_handler" );
2793
2794 //We will need to create some variables so we can loop through all the players
2795 new players[32], pnum, tempid;
2796
2797 //Some variables to hold information about the players
2798 new szName[32], szUserId[32];
2799
2800 new callback = menu_makecallback("playermenu_callback");
2801
2802 //Fill players with available players
2803 get_players(players, pnum);
2804 //Start looping through all players
2805 new items = 1;
2806 for ( new i; i<pnum; i++ )
2807 {
2808 //Save a tempid so we do not re-index
2809 tempid = players[i];
2810 if(tempid == Captain1)
2811 continue;
2812
2813 //Get the players name and userid as strings
2814 get_user_name( tempid, szName, charsmax( szName ) );
2815 //We will use the data parameter to send the userid, so we can identify which player was selected in the handler
2816 formatex( szUserId, charsmax( szUserId ), "%d", get_user_userid( tempid ) );
2817 if(items && items%7 == 0)
2818 {
2819 items++
2820 menu_additem( menu, "Refresh", "*", 0 );
2821 }
2822 if(plr_noplay[tempid] || tempid == Captain1)
2823 {
2824 if(plr_noplay[tempid])
2825 add(szName, charsmax(szName), " [noplay]");
2826 menu_additem( menu, szName, szUserId, 0, callback );
2827 }
2828 else menu_additem( menu, szName, szUserId, 0);
2829
2830 items++
2831 }
2832 items = menu_items(menu)+1;
2833 if(items%7 != 0)
2834 {
2835 while(items%7 != 0)
2836 {
2837 items++;
2838 menu_addblank(menu);
2839 //menu_addblank2(menu);
2840 }
2841 }
2842
2843 menu_additem( menu, "Refresh", "*", 0 );
2844 //We now have all players in the menu, lets display the menu
2845 menu_display( id, menu, 0 );
2846}
2847
2848
2849public playermenu_callback( id, menu, item )
2850{
2851 return ITEM_DISABLED;
2852}
2853
2854public menu_handler( id, menu, item )
2855{
2856 //Do a check to see if they exited because menu_item_getinfo ( see below ) will give an error if the item is MENU_EXIT
2857 if ( item == MENU_EXIT )
2858 {
2859 menu_destroy( menu );
2860 return PLUGIN_HANDLED;
2861 }
2862
2863 //now lets create some variables that will give us information about the menu and the item that was pressed/chosen
2864 new szData[6], szName[64];
2865 new _access, item_callback;
2866 //heres the function that will give us that information ( since it doesnt magicaly appear )
2867 menu_item_getinfo( menu, item, _access, szData,charsmax( szData ), szName,charsmax( szName ), item_callback );
2868 if(szData[0] == '*')
2869 {
2870 CaptainMenu(id);
2871 return PLUGIN_HANDLED;
2872 }
2873 //Get the userid of the player that was selected
2874 new userid = str_to_num( szData );
2875
2876 //Try to retrieve player index from its userid
2877 new player = find_player( "k", userid ); // flag "k" : find player from userid
2878
2879 //If player == 0, this means that the player's userid cannot be found
2880 //If the player is still alive ( we had retrieved alive players when formating the menu but some players may have died before id could select an item from the menu )
2881 if ( player )
2882 {
2883 new szName[64];
2884 get_user_name( player, szName, charsmax( szName ) );
2885
2886 if(!Captain1)
2887 {
2888 ColorChat(0, GREY, "^1[^4%s^1] ^3%s ^1chosed as ^4First Captain.", hns_tag, szName);
2889 Captain1 = player;
2890
2891 CaptainMenu(id);
2892 }
2893 else
2894 {
2895 ColorChat(0, GREY, "^1[^4%s^1] ^3%s ^1chosed as ^4Second Captain^1, starting knife.", hns_tag, szName);
2896 Captain2 = player;
2897
2898 cs_set_user_team(Captain1, CS_TEAM_CT);
2899 cs_set_user_team(Captain2, CS_TEAM_T);
2900 CaptainWinner = 3;
2901 server_cmd("sv_restart 1")
2902 set_task(1.5, "pf_KnifeRound", id);
2903 }
2904 }
2905
2906 menu_destroy( menu );
2907 return PLUGIN_HANDLED;
2908}
2909
2910public captain_menu(id)
2911{
2912 if(id != Captain1 && id != Captain2)
2913 return PLUGIN_HANDLED;
2914
2915 if(id != CaptainSide)
2916 return PLUGIN_HANDLED
2917
2918 new menu = menu_create("Select a Player:", "captainmenu_handler")
2919 new callback = menu_makecallback("playermenu_callback");
2920 //set_task(11.5, "menu_task", id + TASK_MENUCLOSE);
2921
2922 new players[32], pnum, tempid;
2923 new szName[32], szTempid[10];
2924
2925 get_players(players, pnum);
2926
2927 if(pnum == 0)
2928 {
2929 remove_task(id+TASK_MENUCLOSE)
2930 if(task_exists(TASK_PLAYERSLIST))
2931 remove_task(TASK_PLAYERSLIST);
2932 CaptainSort = false
2933
2934 client_print(0, print_chat, "%s Closing Captain Sort. Missing players.", hns_tag);
2935 return PLUGIN_HANDLED;
2936 }
2937 new totalnum = 0;
2938 new items = 1;
2939 for(new i; i<pnum; i++)
2940 {
2941 tempid = players[i];
2942
2943 if(cs_get_user_team(tempid) != CS_TEAM_SPECTATOR)
2944 {
2945 totalnum++;
2946 continue;
2947 }
2948
2949 get_user_name(tempid, szName, charsmax(szName));
2950 num_to_str(tempid, szTempid, charsmax(szTempid));
2951
2952
2953 if(items && items%7 == 0)
2954 {
2955 items++
2956 menu_additem( menu, "Обновить", "*", 0 );
2957 }
2958 items++
2959
2960 if(plr_noplay[tempid])
2961 {
2962 add(szName, charsmax(szName), " [Ðе играет!]");
2963 menu_additem( menu, szName, szTempid, 0, callback );
2964 }
2965 else
2966 menu_additem( menu, szName, szTempid, 0 );
2967 }
2968 items = menu_items(menu)+1;
2969 if(items%7 != 0)
2970 {
2971 while(items%7 != 0)
2972 {
2973 items++;
2974 menu_addblank(menu);
2975 }
2976 }
2977 menu_additem( menu, "Refresh", "*", 0 );
2978 menu_setprop(menu, MPROP_EXIT, MEXIT_NEVER);
2979
2980
2981
2982 menu_display(id, menu, 0);
2983 return PLUGIN_HANDLED;
2984}
2985
2986public captainmenu_handler(id,menu,item)
2987{
2988 if(id != Captain1 && id != Captain2)
2989 return PLUGIN_HANDLED
2990
2991 if(id != CaptainSide)
2992 return PLUGIN_HANDLED
2993
2994 if(item == MENU_EXIT)
2995 {
2996 menu_display(id,menu,0)
2997 return PLUGIN_HANDLED;
2998 }
2999 new data[6], szName[64];
3000 new access, callback;
3001 menu_item_getinfo(menu, item, access, data, charsmax(data), szName, charsmax(szName), callback);
3002
3003 if(data[0] == '*')
3004 {
3005 captain_menu(id)
3006 return PLUGIN_HANDLED
3007 }
3008 new tempid = str_to_num(data)
3009
3010 new name[35], namec[35];
3011 get_user_name(tempid, name, charsmax(name));
3012 get_user_name(id, namec, charsmax(namec));
3013
3014 cs_set_user_team(tempid, cs_get_user_team(id));
3015 client_print(0, print_chat, "%s %s выбрал в напарники %s", hns_tag, namec, name);
3016
3017 set_cvar_num("sv_restart",1)
3018
3019 remove_task(id+TASK_MENUCLOSE)
3020
3021 new iPlayers[32],pnum
3022 get_players(iPlayers,pnum,"h")
3023 new bool:has_spec
3024 new totalplayers;
3025 for(new i; i < pnum; i++)
3026 {
3027 if(cs_get_user_team(iPlayers[i]) == CS_TEAM_SPECTATOR)
3028 {
3029 has_spec = true
3030 }
3031 else
3032 {
3033 totalplayers++;
3034 }
3035 }
3036 if(!has_spec || totalplayers == 10)
3037 {
3038 if(task_exists(TASK_PLAYERSLIST))
3039 remove_task(TASK_PLAYERSLIST);
3040 CaptainSort = false;
3041 CaptainWinner = CaptainSide = 0;
3042 Captain1 = Captain2 = 0;
3043
3044 PrepareMode(e_gTraining);
3045 return PLUGIN_HANDLED;
3046 }
3047 if(is_user_connected(Captain1) && is_user_connected(Captain2))
3048 {
3049 if(id == Captain1)
3050 CaptainSide = Captain2
3051 else
3052 CaptainSide = Captain1
3053 set_task(1.5,"captain_menu", CaptainSide)
3054 }
3055 else
3056 {
3057 set_task(5.0,"CheckCaptainJoin",id == Captain1 ? Captain1 : Captain2)
3058 }
3059 menu_destroy(menu)
3060 return PLUGIN_HANDLED
3061}
3062
3063public menu_task(id)
3064{
3065 id -= TASK_MENUCLOSE
3066
3067 new players[32], pnum;
3068 get_players(players, pnum, "h");
3069
3070 new randomnum = random(pnum)
3071 new bool:has_spec
3072 new totalplayers;
3073 for(new i; i < pnum; i++)
3074 {
3075 if(cs_get_user_team(players[i]) == CS_TEAM_SPECTATOR)
3076 {
3077 has_spec = true
3078 }
3079 else
3080 {
3081 totalplayers++;
3082 }
3083 }
3084 if(!has_spec || totalplayers == 10)
3085 {
3086 if(task_exists(TASK_PLAYERSLIST))
3087 remove_task(TASK_PLAYERSLIST);
3088
3089 PrepareMode(e_gTraining);
3090 CaptainSort = false;
3091 return;
3092 }
3093 while(cs_get_user_team(players[randomnum]) != CS_TEAM_SPECTATOR)
3094 {
3095 randomnum = random(pnum)
3096 }
3097 if(is_user_connected(id))
3098 {
3099 set_cvar_num("sv_restart",1)
3100 cs_set_user_team(players[randomnum],cs_get_user_team(id))
3101
3102 set_task(1.5, "captain_menu", id == Captain1 ? Captain2 : Captain1);
3103 }
3104 else
3105 {
3106 set_task(5.0, "CheckCaptainJoin", id == Captain1 ? Captain2 : Captain1);
3107
3108 client_print(0, print_chat, "%s Awaiting the arrival of a new Captain.", hns_tag);
3109 }
3110 show_menu(id, 0, "^n", 1);
3111}
3112
3113public CheckCaptainJoin(NextCaptainMenu)
3114{
3115 if(is_user_connected(Captain1) && is_user_connected(Captain2))
3116 {
3117 set_task(1.5, "captain_menu", NextCaptainMenu)
3118 }
3119 else
3120 {
3121 set_task(5.0, "CheckCaptainJoin", NextCaptainMenu)
3122 }
3123}
3124
3125public PlayersList()
3126{
3127 new iPlayers[32], iNum;
3128 get_players(iPlayers, iNum, "h");
3129
3130 new posTR, posCT, posSPEC;
3131 new HudTextTR[512], HudTextCT[512], HudTextSPEC[512];
3132 new szName[38], name[38];
3133
3134 for(new i; i < iNum; i++)
3135 {
3136 get_user_name(iPlayers[i], szName, charsmax(szName));
3137
3138 if(iPlayers[i] == Captain1 || iPlayers[i] == Captain2)
3139 {
3140 formatex(name, charsmax(name), "%s [CAP]", szName);
3141 }
3142 else
3143 {
3144 name = szName;
3145 }
3146 if(cs_get_user_team(iPlayers[i]) == CS_TEAM_T)
3147 {
3148 posTR += formatex(HudTextTR[posTR], 511-posTR,"%s^n", name);
3149 }
3150 else if(cs_get_user_team(iPlayers[i]) == CS_TEAM_CT)
3151 {
3152 posCT += formatex(HudTextCT[posCT], 511-posCT, "%s^n", name);
3153 }
3154 else
3155 {
3156 posSPEC += formatex(HudTextSPEC[posSPEC], 511-posSPEC, "%s^n", name);
3157 }
3158 }
3159 for(new i; i < iNum; i++)
3160 {
3161
3162 set_hudmessage( 180, 40, 40, 0.70, 0.16, 0, 0.0, 0.2, 0.2, 0.2, -1);
3163 ShowSyncHudMsg(iPlayers[i], SyncHud[0], "Terrorists:^n%s", HudTextTR);
3164
3165 set_hudmessage(40, 80, 150, 0.70, 0.51, 0, 0.0, 0.2, 0.2, 0.2, -1);
3166 ShowSyncHudMsg(iPlayers[i], SyncHud[1], "Counter-Terrorist:^n%s", HudTextCT);
3167 }
3168}
3169
3170public LoadMapCFG()
3171{
3172 new szMap[64]
3173 get_mapname(szMap, 63);
3174 new szPath[128]
3175 get_configsdir(szPath, 127);
3176 format(szPath, 127, "%s/hns", szPath);
3177 if(!dir_exists(szPath))
3178 mkdir(szPath);
3179 format(szPath, 127, "%s/mapcfg", szPath);
3180 if(!dir_exists(szPath))
3181 mkdir(szPath);
3182
3183 format(szPath, 127, "%s/%s.cfg", szPath, szMap);
3184 if(file_exists(szPath))
3185 {
3186 server_cmd("exec %s", szPath);
3187 }
3188 else
3189 {
3190 server_cmd("mp_roundtime 3");
3191 }
3192}
3193
3194public bool:CheckPlayer(id)
3195{
3196 new szSteam[64];
3197 get_user_authid(id, szSteam, 63);
3198 new szMap[64]
3199 get_mapname(szMap, 63);
3200 if(containi(szMap, "hns_hnserivmknife") != -1)
3201 {
3202 return false;
3203 }
3204 new string[128];
3205 new side;
3206 new exploded[2][64]
3207
3208 new PlayersFile = fopen("addons/amxmodx/data/playerslist.ini", "r");
3209
3210 if(PlayersFile)
3211 {
3212 while(!feof(PlayersFile))
3213 {
3214 fgets(PlayersFile, string, 127)
3215 if(containi(string, szSteam) != -1)
3216 {
3217 ExplodeString(exploded,2,63,string, ' ' );
3218 //explode_string(string, " ", exploded, 2, 63);
3219 side = str_to_num(exploded[1]);
3220 break;
3221 }
3222 }
3223
3224 fclose(PlayersFile);
3225 }
3226
3227 if(side == 1)
3228 {
3229 cs_set_user_team(id, CS_TEAM_T);
3230 }
3231 else if(side == 2)
3232 {
3233 cs_set_user_team(id, CS_TEAM_CT);
3234 }
3235 else
3236 {
3237 cs_set_user_team(id, CS_TEAM_SPECTATOR);
3238 return false;
3239 }
3240
3241 return true;
3242}
3243
3244public SavePlayers()
3245{
3246 if(file_exists("addons/amxmodx/data/playerslist.ini"))
3247 delete_file("addons/amxmodx/data/playerslist.ini");
3248
3249 new PlayersFile = fopen("addons/amxmodx/data/playerslist.ini", "w");
3250 new players[MAX_PLAYERS], num;
3251 get_players(players, num, "ae", "TERRORIST");
3252
3253 for(new i = 1; i <= g_iMaxPlayers; i++)
3254 {
3255 if(!is_user_connected(i))
3256 continue;
3257
3258 new szString[128];
3259 new Steam[64]
3260 get_user_authid(i, Steam, 63);
3261 if(!num)
3262 {
3263 if(get_user_team(i) == 1)
3264 format(szString, 127, "%s %d^r^n", Steam, 2)
3265 else if(get_user_team(i) == 2)
3266 format(szString, 127, "%s %d^r^n", Steam, 1)
3267 else
3268 format(szString, 127, "%s %d^r^n", Steam, get_user_team(i))
3269 }
3270 else
3271 format(szString, 127, "%s %d^r^n", Steam, get_user_team(i))
3272
3273 fputs(PlayersFile, szString);
3274 }
3275
3276 fclose(PlayersFile);
3277}
3278
3279
3280public TaskDestroyBreakables( )
3281{
3282 new iEntity = -1;
3283 while ((iEntity = find_ent_by_class(iEntity, "func_breakable" )))
3284 {
3285 if(entity_get_float(iEntity , EV_FL_takedamage))
3286 {
3287 entity_set_vector(iEntity, EV_VEC_origin, Float:{10000.0, 10000.0, 10000.0})
3288 }
3289 }
3290}
3291
3292public Forward_SetClientListening(iReceiver, iSender, bool:bListen)
3293{
3294 if(g_CurrentMode <= e_gPaused || g_CurrentMode == e_gCaptain || g_CurrentMode == e_gPub)
3295 {
3296 engfunc(EngFunc_SetClientListening, iReceiver, iSender, true)
3297 forward_return(FMV_CELL, true)
3298 return FMRES_SUPERCEDE
3299 }
3300
3301 if(is_user_connected(iReceiver) && is_user_connected(iSender))
3302 {
3303 if(get_user_team(iReceiver) == get_user_team(iSender))
3304 {
3305 engfunc(EngFunc_SetClientListening, iReceiver, iSender, true)
3306 forward_return(FMV_CELL, true)
3307 return FMRES_SUPERCEDE
3308 }
3309 else if(get_user_team(iReceiver) != 1 && get_user_team(iReceiver) != 2 )
3310 {
3311 engfunc(EngFunc_SetClientListening, iReceiver, iSender, true)
3312 forward_return(FMV_CELL, true)
3313 return FMRES_SUPERCEDE
3314 }
3315 }
3316
3317 engfunc(EngFunc_SetClientListening, iReceiver, iSender, false)
3318 forward_return(FMV_CELL, false)
3319 return FMRES_SUPERCEDE
3320}
3321
3322#define SAFETRANSFERTASK 7832
3323
3324public safe_transfer( CsTeams:iTeam)
3325{
3326 new Float:flTime
3327 new iPlayers[ 32 ], iPlayersNum
3328 get_players( iPlayers, iPlayersNum, "h");
3329 for(new i = 0; i < iPlayersNum; i++)
3330 {
3331 new id = iPlayers[i];
3332 if(is_user_connected(id))
3333 {
3334 switch(id)
3335 {
3336 case 1..8: flTime = 0.1;
3337 case 9..16: flTime = 0.2;
3338 case 17..24: flTime = 0.3;
3339 case 25..32: flTime = 0.4;
3340 }
3341
3342 new task_params[2];
3343 task_params[0] = id;
3344 task_params[1] = _:iTeam;
3345
3346 if(task_exists(SAFETRANSFERTASK+id))
3347 remove_task(SAFETRANSFERTASK+id)
3348
3349 set_task(flTime, "task_to_team", SAFETRANSFERTASK+id, task_params, sizeof task_params);
3350 }
3351 }
3352}
3353
3354public task_to_team( Params[] )
3355{
3356 new id = Params[0];
3357 new team = Params[1];
3358 if(is_user_connected(id))
3359 {
3360 if(is_user_alive(id))
3361 user_kill(id, 0)
3362 if(get_user_team(id) != team)
3363 {
3364 cs_set_user_team(id, team);
3365 }
3366 }
3367}
3368
3369
3370public SaveState(id)
3371{
3372 new temp_array[SaveData];
3373 temp_array[save_team] = get_user_team(id);
3374 get_user_authid(id, temp_array[SteamID], 31);
3375 pev(id, pev_origin, temp_array[Origin]);
3376 pev(id, pev_velocity, temp_array[Velocity]);
3377 pev(id, pev_v_angle, temp_array[Angles]);
3378 temp_array[Flags] = pev(id, pev_flags);
3379 if(is_user_alive(id))
3380 temp_array[health] = get_user_health(id);
3381 else
3382 temp_array[health] = 0;
3383
3384 new clip,ammo
3385 get_user_ammo(id,CSW_FLASHBANG,clip,ammo);
3386 temp_array[flashnum] = ammo;
3387 get_user_ammo(id,CSW_SMOKEGRENADE,clip,ammo);
3388 temp_array[smokenum] = ammo;
3389 ArrayPushArray(SavedState, temp_array);
3390}
3391
3392public LoadState(id, temp_array[SaveData])
3393{
3394 strip_user_weapons(id)
3395 Timer(id, SavedTime);
3396 set_user_footsteps(id, 1);
3397
3398 set_pev(id, pev_origin, temp_array[Origin]);
3399 set_pev(id, pev_velocity, temp_array[Velocity]);
3400 set_pev(id, pev_angles, temp_array[Angles]);
3401 set_pev(id, pev_fixangle, 1);
3402 set_pev(id, pev_flags, temp_array[Flags]);
3403 if(temp_array[health])
3404 set_user_health(id, temp_array[health]);
3405 else if(is_user_alive(id))
3406 {
3407 user_silentkill(id);
3408 }
3409
3410 give_item(id, "weapon_knife")
3411 if(temp_array[smokenum])
3412 {
3413 give_item( id, "weapon_flashbang" );
3414 cs_set_user_bpammo( id, CSW_FLASHBANG, temp_array[flashnum] );
3415 }
3416 if(temp_array[smokenum])
3417 {
3418 give_item( id, "weapon_smokegrenade" );
3419 cs_set_user_bpammo( id, CSW_SMOKEGRENADE, temp_array[smokenum] );
3420 }
3421 ArrayPushArray(SavedState, temp_array);
3422}
3423
3424public cmdsavegame(id)
3425{
3426 if(!(get_user_flags(id) & hns_ACESS))
3427 return PLUGIN_HANDLED;
3428
3429 if(g_CurrentMode != e_gMix)
3430 {
3431 ColorChat(id, RED, "^1[^4%s^1] Game state can be ^4saved ^1only on live match.", hns_tag);
3432 return PLUGIN_HANDLED;
3433 }
3434
3435 new bool:exists = true;
3436 static temp_array[SaveData];
3437 while(exists)
3438 {
3439 exists = false;
3440 new isize = ArraySize(SavedState)
3441 for(new i = 0; i < isize; i++)
3442 {
3443 ArrayGetArray(SavedState, i, temp_array);
3444 if(find_player("c", temp_array[SteamID]))
3445 {
3446 exists = true;
3447 ArrayDeleteItem(SavedState, i);
3448 break;
3449 }
3450 }
3451 }
3452 GameSaved = true;
3453
3454 new players[MAX_PLAYERS], pnum;
3455 get_players(players, pnum);
3456
3457 SavedTime = (get_cvar_num("mp_roundtime")*60)-floatround(get_gametime()-StartRoundTime);
3458
3459 for(new i = 0 ; i < pnum; i++ )
3460 {
3461 new plr = players[i];
3462 if(get_user_team(plr) == 1 || get_user_team(plr) == 2)
3463 SaveState(plr);
3464 else
3465 continue;
3466 }
3467 new szName[128]
3468 get_user_name(id, szName, charsmax(szName))
3469 ColorChat(0, RED, "^1[^4%s^1] ^3%s ^4saved gamestate!", hns_tag, szName);
3470
3471 return PLUGIN_HANDLED;
3472}
3473
3474public cmdloadgame(id)
3475{
3476 if(!(get_user_flags(id) & hns_ACESS))
3477 return PLUGIN_HANDLED;
3478
3479 if(!GameSaved)
3480 {
3481 ColorChat(id, RED, "^1[^4%s^1] Nothing to load... (^4Game was not saved^1)", hns_tag);
3482 return PLUGIN_HANDLED;
3483 }
3484
3485 if(task_exists(71234))
3486 remove_task(71234);
3487
3488 SavedFreezeTime = get_cvar_num("mp_freezetime");
3489 server_cmd("sv_restart 1");
3490 server_cmd("mp_freezetime 0");
3491 set_task(2.0, "loadgame", 71234);
3492 new szName[128]
3493 get_user_name(id, szName, charsmax(szName))
3494 ColorChat(0, RED, "^1[^4%s^1] ^3%s ^4loaded ^1saved game!", hns_tag, szName);
3495
3496 return PLUGIN_HANDLED;
3497}
3498public loadgame()
3499{
3500 new players[MAX_PLAYERS], pnum;
3501 get_players(players, pnum);
3502 server_cmd("mp_freezetime %d", SavedFreezeTime);
3503 loadgamefunc(1);
3504
3505 for(new i = 0 ; i < pnum; i++ )
3506 {
3507 new id = players[i];
3508 if(get_user_team(id) == 1 || get_user_team(id) == 2)
3509 {
3510 Timer(id, 10);
3511 set_user_freeze(id, 1);
3512 }
3513 }
3514
3515 set_task(10.0, "loadgamefunc", 0);
3516
3517
3518
3519 return PLUGIN_HANDLED;
3520}
3521
3522public loadgamefunc(preload)
3523{
3524 if(task_exists(ROUNDENDTASK))
3525 remove_task(ROUNDENDTASK);
3526
3527 if(!preload)
3528 set_task(float(SavedTime), "TerroristWin", ROUNDENDTASK);
3529 new players[MAX_PLAYERS], pnum, anum;
3530 get_players(players, anum, "a");
3531 get_players(players, pnum);
3532 new bool:found[MAX_PLAYERS+1], foundnum;
3533 static sz_steam[32]
3534 static temp_array[SaveData];
3535 new isize = ArraySize(SavedState)
3536 for(new i = 0 ; i < pnum; i++ )
3537 {
3538 new id = players[i];
3539 if(get_user_team(id) != 1 && get_user_team(id) != 2)
3540 continue;
3541
3542 set_user_freeze(id, 0);
3543 get_user_authid(id, sz_steam, 31);
3544 for(new i = 0; i < isize; i++)
3545 {
3546 ArrayGetArray(SavedState, i, temp_array);
3547 if(equal(temp_array[SteamID], sz_steam))
3548 {
3549 LoadState(id, temp_array);
3550 found[id] = true;
3551 foundnum++;
3552 break;
3553 }
3554 }
3555 /*client_print(0, print_chat, "%d", index);
3556 if(index != -1)
3557 {
3558 ArrayGetArray(SavedState, index, temp_array);
3559 LoadState(id, temp_array);
3560 found[id] = true;
3561 foundnum++;
3562 }*/
3563 }
3564 if(foundnum < anum)
3565 {
3566 for(new i = 0; i < isize; i++)
3567 {
3568 if(foundnum >= anum)
3569 break;
3570
3571 ArrayGetArray(SavedState, i, temp_array);
3572 if(find_player("c", temp_array[SteamID]))
3573 continue
3574 else
3575 {
3576 for(new i = 0 ; i < pnum; i++ )
3577 {
3578 new id = players[i];
3579 if(found[id])
3580 break;
3581 else if(temp_array[save_team] == get_user_team(id))
3582 {
3583 found[id] = true;
3584 LoadState(id, temp_array);
3585 foundnum++;
3586 }
3587 }
3588 }
3589 }
3590 }
3591}
3592
3593
3594stock set_user_freeze(client,freeze){
3595 new iFlag = pev(client,pev_flags);
3596 set_pev(client,pev_flags,freeze ? iFlag | FL_FROZEN:iFlag & ~FL_FROZEN);
3597}
3598
3599
3600public Timer(id, Time)
3601{
3602 message_begin(MSG_ONE, g_msg_showtimer, _, id)
3603 message_end()
3604
3605 message_begin(MSG_ONE, g_msg_roundtime, _, id)
3606 write_short(Time+1)
3607 message_end()
3608}
3609
3610
3611
3612public RingTask()
3613{
3614 static Ent1, Ent2;
3615
3616 if(!Ent1)
3617 {
3618 Ent1 = fm_create_entity("info_target");
3619 fm_entity_set_model(Ent1, "sprites/laserbeam.spr");
3620 fm_set_rendering(Ent1, .render = kRenderTransAlpha, .amount = 0);
3621
3622 }
3623
3624 if(!Ent2)
3625 {
3626 Ent2 = fm_create_entity("info_target");
3627 fm_entity_set_model(Ent2, "sprites/laserbeam.spr");
3628 fm_set_rendering(Ent2, .render = kRenderTransAlpha, .amount = 0);
3629 }
3630
3631 new Float:NewOrigin[3];
3632 NewOrigin[1] = 0.0;
3633 NewOrigin[2] = 50.0;
3634 NewOrigin[0] = RingWidth;
3635 set_pev(Ent1, pev_origin, NewOrigin);
3636 NewOrigin[0] = -RingWidth;
3637 set_pev(Ent2, pev_origin, NewOrigin);
3638 if(RingWidth > 150.0)
3639 {
3640 RingWidth -= 5.0;
3641 make_tracer(Ent1, Ent2, 1);
3642 }
3643 else
3644 {
3645 make_tracer(Ent1, Ent2, 1);
3646 }
3647
3648 new Float:tempmax[3];
3649 new Float:tempmin[3];
3650 tempmin[0] = tempmin[1] = -RingWidth;
3651 tempmin[2] = -1000.0;
3652 tempmax[0] = tempmax[1] = RingWidth;
3653 tempmax[2] = 1000.0;
3654 new players[MAX_PLAYERS], pnum;
3655 get_players(players, pnum, "a");
3656 for(new i = 0; i < pnum; i++)
3657 {
3658 new id = players[i];
3659 new Float:origin[3];
3660 if(is_user_alive(id))
3661 {
3662 pev(id, pev_origin, origin);
3663 if(get_distance_f(Float:{0.0, 0.0, 0.0}, origin) > RingWidth)
3664 {
3665 ExecuteHam(Ham_TakeDamage, id, 0, 0, 2.0, DMG_GENERIC);
3666 }
3667 }
3668 }
3669
3670 return PLUGIN_HANDLED
3671
3672}
3673
3674public make_tracer(first, sec, life)
3675{
3676 new red, green, blue;
3677 dynamicColor(-2300, 0, -RingWidth, red, green, blue);
3678 message_begin( MSG_BROADCAST, SVC_TEMPENTITY );
3679 write_byte(TE_BEAMRING)
3680 write_short(first) // start
3681 write_short( sec) // end
3682 write_short(m_spriteTexture) // sprite
3683 write_byte(0) // starting frame
3684 write_byte(0) // rate
3685 write_byte(life) // life
3686 write_byte(100) // widght
3687 write_byte(0) // noise
3688 write_byte(red) // red
3689 write_byte(green); // green
3690 write_byte(blue) // blue
3691 write_byte(255) // bright
3692 write_byte(5) //
3693 message_end();
3694}
3695
3696
3697stock dynamicColor(min,max,Float:value,&red,&green,&blue)
3698{ //Don`t launch with max ~= min
3699 #define MaxC 255
3700 #define MinC 0
3701 #define DtC 50
3702
3703 if (value>=max)
3704 {
3705 red=MaxC;
3706 green=MinC;
3707 blue=MinC;
3708 return;
3709 }
3710 else if (value<=min)
3711 {
3712 red=MinC;
3713 green=MinC;
3714 blue=MaxC;
3715 return;
3716 }
3717
3718 new Float:step = (max-min)/4.0;
3719 new Float:dt = value-min;
3720
3721 if (dt <= step)
3722 {
3723 red = MinC;
3724 green = floatround(dt*(DtC/step));
3725 blue = MaxC;
3726 }
3727 else if (dt-=step, dt <= step)
3728 {
3729 red = MinC;
3730 green = MaxC;
3731 blue = floatround((step-dt)*(DtC/step));
3732 }
3733 else if (dt-=step, dt <= step)
3734 {
3735 red = floatround(dt*(DtC/step));
3736 green = MaxC;
3737 blue = MinC;
3738 }
3739 else
3740 {
3741 dt-=step;
3742 red = MaxC;
3743 green = floatround((step-dt)*(DtC/step));
3744 blue = MinC;
3745 }
3746 return;
3747}
3748// Avererage 25
3749// 1000 / 1300
3750// +32.5 / +17.5
3751// -17.5 / -32.5
3752// 16.25 / 8.75
3753#define DEF_RATIO 25.0
3754/*
3755public bool:CalcPTS(id, new_pts[3])
3756{
3757 new opos_team;
3758 new pnum[2];
3759 if(get_user_team(id) == 1)
3760 opos_team = 2;
3761 else if (get_user_team(id) == 2)
3762 opos_team = 1;
3763 else
3764 return false;
3765
3766 new sumranks[2];
3767 for(new i = 1; i <= g_iMaxPlayers; i++)
3768 {
3769 if(!is_user_connected(i))
3770 continue;
3771
3772 if(get_user_team(i) == opos_team)
3773 {
3774 sumranks[0] += iRank[i];
3775 pnum[0]++;
3776 }
3777 else if(get_user_team(id) == get_user_team(i))
3778 {
3779 sumranks[1] += iRank[i];
3780 pnum[1]++;
3781 }
3782 }
3783 if(!pnum[0] || !pnum[1])
3784 return false;
3785
3786 new Float:enemyaverage_rank = sumranks[0]/(1.0*pnum[0]);
3787 new Float:teamaverage_rank = sumranks[1]/(1.0*pnum[1]);
3788
3789 new_pts[1] = floatround((enemyaverage_rank/teamaverage_rank) * DEF_RATIO);
3790 new_pts[0] = -floatround((teamaverage_rank/enemyaverage_rank * DEF_RATIO));
3791 new_pts[2] = new_pts[1]/2;
3792
3793 return true;
3794}
3795*/
3796
3797public bool:CalcPTS(id, new_pts[3])
3798{
3799 new_pts[1] = 100;
3800 new_pts[0] = -50;
3801 new_pts[2] = 50;
3802
3803
3804 return true;
3805}
3806/* PTS */
3807/* PTS */
3808/* PTS */
3809public MySql_Init()
3810{
3811 // we tell the API that this is the information we want to connect to,
3812 // just not yet. basically it's like storing it in global variables
3813 g_SqlTuple = SQL_MakeDbTuple(Host,User,Pass,Db)
3814
3815 // ok, we're ready to connect
3816 new ErrorCode,Handle:SqlConnection = SQL_Connect(g_SqlTuple,ErrorCode,g_Error,charsmax(g_Error))
3817 if(SqlConnection == Empty_Handle)
3818 // stop the plugin with an error message
3819 set_fail_state(g_Error)
3820
3821 new Handle:Queries
3822 // we must now prepare some random queries
3823 Queries = SQL_PrepareQuery(SqlConnection,"CREATE TABLE IF NOT EXISTS `%s` (`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY, `steamid` varchar(32) NOT NULL, `user_name` varchar(72) NOT NULL, `pts` INT(11) NOT NULL, `total` INT(11) NOT NULL, `win` INT(11) NOT NULL, `loss` INT(11) NOT NULL, `draw` INT(11) NOT NULL, `leav` INT(11) NOT NULL)", Table);
3824
3825 if(!SQL_Execute(Queries))
3826 {
3827 // if there were any problems the plugin will set itself to bad load.
3828 SQL_QueryError(Queries,g_Error,charsmax(g_Error))
3829 set_fail_state(g_Error)
3830
3831 }
3832
3833 // Free the querie
3834 SQL_FreeHandle(Queries)
3835
3836 // you free everything with SQL_FreeHandle
3837 SQL_FreeHandle(SqlConnection)
3838
3839}
3840
3841public QueryHandle(iFailState, Handle:hQuery, szError[], iErrnum, cData[], iSize, Float:fQueueTime)
3842{
3843 if( iFailState != TQUERY_SUCCESS )
3844 {
3845 log_amx("SQL Error #%d - %s", iErrnum, szError)
3846
3847
3848 }
3849
3850 return PLUGIN_CONTINUE
3851}
3852
3853public Load_MySql(id)
3854{
3855 new szSteamId[32], szTemp[512]
3856 get_user_authid(id, szSteamId, charsmax(szSteamId))
3857
3858 new Data[1]
3859 Data[0] = id
3860
3861 //we will now select from the table `tutorial` where the steamid match
3862 format(szTemp,charsmax(szTemp),"SELECT * FROM `%s` WHERE (`%s`.`steamid` = '%s')", Table,Table, szSteamId)
3863 SQL_ThreadQuery(g_SqlTuple,"register_client",szTemp,Data,1)
3864}
3865
3866public register_client(FailState,Handle:Query,Error[],Errcode,Data[],DataSize)
3867{
3868 if(FailState == TQUERY_CONNECT_FAILED)
3869 {
3870 log_amx("Load - Could not connect to SQL database. [%d] %s", Errcode, Error)
3871 }
3872 else if(FailState == TQUERY_QUERY_FAILED)
3873 {
3874 log_amx("Load Query failed. [%d] %s", Errcode, Error)
3875 }
3876
3877 new id
3878 id = Data[0]
3879
3880 if(SQL_NumResults(Query) < 1)
3881 {
3882 //.if there are no results found
3883
3884 new szSteamId[32], szNickName[SECURE_NAME_LEN]
3885 get_user_authid(id, szSteamId, charsmax(szSteamId)) // get user's steamid
3886 get_user_name(id, szNickName, charsmax(szNickName))
3887 // if its still pending we can't do anything with it
3888 if (equal(szSteamId,"ID_PENDING"))
3889 return PLUGIN_HANDLED
3890
3891 new szTemp[512]
3892
3893 // now we will insturt the values into our table.
3894 GetSecureName(szNickName)
3895 format(szTemp,charsmax(szTemp),"INSERT INTO `%s` ( `steamid` ,`user_name`, `pts`)VALUES ('%s','%s','%d');",Table,szSteamId,szNickName, START_PTS)
3896 iPts[id] = 1000;
3897 iRank[id] = CalcRank(id);
3898 SQL_ThreadQuery(g_SqlTuple,"QueryHandle",szTemp)
3899 }
3900 else
3901 {
3902 // if there are results found
3903 iPts[id] = SQL_ReadResult(Query, 3)
3904 iRank[id] = CalcRank(id);
3905 }
3906
3907 return PLUGIN_HANDLED
3908}
3909
3910public Save_MySql(id)
3911{
3912 new szSteamId[32], szNickName[SECURE_NAME_LEN], szTemp[512]
3913 get_user_name(id, szNickName, charsmax(szNickName))
3914 get_user_authid(id, szSteamId, charsmax(szSteamId)) // get user's steamid
3915 GetSecureName(szNickName)
3916 // Here we will update the user hes information in the database where the steamid matches.
3917 format(szTemp,charsmax(szTemp),"UPDATE `%s` SET `user_name` = '%s' WHERE `%s`.`steamid` = '%s';",Table,szNickName,Table, szSteamId)
3918 SQL_ThreadQuery(g_SqlTuple,"QueryHandle",szTemp)
3919
3920}
3921
3922public MixFinished(status)
3923{
3924 new g_iReturn;
3925 Announce( 2 );
3926 ExecuteForward(iFwd_MixFinished, g_iReturn);
3927 LeaversScore(status);
3928 for( new i = 1; i <= g_iMaxPlayers; i++ ) {
3929 if( is_user_connected( i ) )
3930 {
3931 switch( cs_get_user_team( i ) )
3932 {
3933 case CS_TEAM_T:
3934 {
3935 switch(status)
3936 {
3937 case 0:
3938 {
3939 SetPts(i, 0)
3940 }
3941 case 1:
3942 {
3943 SetPts(i, 1)
3944 }
3945 case 2:
3946 {
3947 SetPts(i, 2)
3948 }
3949 }
3950 }
3951 case CS_TEAM_CT:
3952 {
3953 switch(status)
3954 {
3955 case 0:
3956 {
3957 SetPts(i, 0)
3958 }
3959 case 1:
3960 {
3961 SetPts(i, 2)
3962 }
3963 case 2:
3964 {
3965 SetPts(i, 1)
3966 }
3967 }
3968 }
3969 }
3970 Load_MySql(i);
3971 }
3972 }
3973}
3974
3975public SetPts(id, status)
3976{
3977 new authid[64]
3978 get_user_authid(id, authid, 63)
3979 new szTemp[512]
3980 new pts[3], draw, win, loss, Points
3981 CalcPTS(id, pts);
3982 switch( status )
3983 {
3984 case 0:
3985 {
3986 Points = pts[2]
3987 draw = 1
3988 win = 0
3989 loss = 0
3990 }
3991 case 1:
3992 {
3993 Points = pts[1]
3994 loss = 0
3995 win = 1
3996 draw = 0
3997 }
3998 case 2:
3999 {
4000 Points = pts[0]
4001 loss = 1
4002 win = 0
4003 draw = 0
4004 }
4005 }
4006
4007 new time_date[32]
4008 get_time("%d-%m-%Y_%H-%M",time_date,31)
4009
4010 new sz_name[64]
4011 get_user_name(id, sz_name, 63);
4012 log_amx("%s | %s = %d Points",time_date, sz_name, Points);
4013 format(szTemp,charsmax(szTemp),"UPDATE `%s` SET `pts` = `pts` + %d, `total` = `total` + 1,`win` = `win` + %d,`loss` = `loss` + %d,`draw` = `draw` + %d WHERE `%s`.`steamid` = '%s'",Table,Points,win,loss,draw, Table,authid)
4014 SQL_ThreadQuery(g_SqlTuple,"QueryHandle",szTemp)
4015}
4016
4017public Show_Top(id) {
4018 new website[128];
4019
4020 new motd[256];
4021 formatex(motd, sizeof(motd) - 1,\
4022 "<html><head><meta http-equiv=^"Refresh^" content=^"0;url=http://hnserivm.myarena.ru/rnr/^"></head><body><p><center>LOADING...</center></p></body></html>",\
4023 website);
4024
4025 show_motd(id, motd);
4026
4027 return PLUGIN_HANDLED
4028}
4029
4030public CmdRank(id, target) {
4031 new Data[2]; Data[0] = id, Data[1] = target;
4032
4033 new szTemp[512]
4034 format(szTemp,charsmax(szTemp),"SELECT COUNT(*) FROM `%s` WHERE `pts` >= %i", Table,iPts[target])
4035 SQL_ThreadQuery(g_SqlTuple, "Sql_Rank", szTemp, Data, sizeof(Data))
4036 return PLUGIN_CONTINUE
4037}
4038
4039public Sql_Rank(FailState,Handle:Query,Error[],Errcode,Data[],DataSize) {
4040
4041 if(FailState == TQUERY_CONNECT_FAILED)
4042 log_amx("Load - Could not connect to SQL database. [%d] %s", Errcode, Error)
4043 else if(FailState == TQUERY_QUERY_FAILED)
4044 log_amx("Load Query failed. [%d] %s", Errcode, Error)
4045
4046 new count = 0;
4047 count = SQL_ReadResult(Query,0);
4048 if(count == 0)
4049 count = 1
4050
4051 new id, target
4052 id = Data[0]
4053 target = Data[1];
4054
4055 new szName[32];
4056
4057 if(id == target)
4058 get_user_name(id, szName, charsmax(szName));
4059 else
4060 get_user_name(target, szName, charsmax(szName));
4061
4062 ColorChat(id, RED, "^1[^4%s^1] ^3%s^1 %s rank is ^4%i^1 with ^4%i ^1points", hns_tag, szName, (id == target)?"Your":"", count, iPts[target])
4063
4064 return PLUGIN_HANDLED
4065}
4066
4067public CmdBalance(id)
4068{
4069 new ctnum, ttnum, ctrank, ttrank;
4070 for(new i = 1; i <= g_iMaxPlayers; i++)
4071 {
4072 if(!is_user_connected(i))
4073 continue
4074
4075 if(get_user_team(i) == 1)
4076 {
4077 ttnum++
4078 ttrank += iPts[i];
4079 }
4080 if(get_user_team(i) == 2)
4081 {
4082 ctnum++
4083 ctrank += iPts[i];
4084 }
4085 }
4086
4087 if(ttnum && ctnum)
4088 ColorChat(id, RED, "^1[^4%s^1] CT Average ^4%d^1 vs ^4%d^1 TT Average", hns_tag, ctrank/ctnum, ttrank/ttnum)
4089}
4090
4091public CmdPrognoz(id)
4092{
4093 new pts[3];
4094 CalcPTS(id, pts);
4095 ColorChat(id, RED, "^1[^4%s^1] Pts on win: ^4%d^1, lose: ^4%d^1, draw: ^4%d^1", hns_tag, pts[1], pts[0], pts[2])
4096}
4097/* PTS */
4098/* PTS */
4099/* PTS */
4100/*
4101public CalcRank(id)
4102{
4103 switch(iPts[id])
4104 {
4105 case -120000 .. 399: return tierLOW;
4106 case 400 .. 899: return tierDm
4107 case 900 .. 1499: return tierD
4108 case 1500 .. 1999: return tierDp
4109 case 2000 .. 2499: return tierCm
4110 case 2500 .. 2999: return tierC
4111 case 3000 .. 3499: return tierCp
4112 case 3500 .. 3999: return tierBm
4113 case 4000 .. 4499: return tierB
4114 case 4500 .. 4999: return tierBp
4115 case 5000 .. 5499: return tierAm
4116 case 5500 .. 5999: return tierA
4117 case 6000 .. 6499: return tierAp
4118 case 6500 .. 120000: return tierAp
4119 }
4120
4121 return 0;
4122}*/
4123
4124public CalcRank(id)
4125{
4126 if(iPts[id] > 0)
4127 if(floatround(iPts[id] / 250.0, floatround_floor) >= tierTOP)
4128 return tierTOP
4129 else
4130 return floatround(iPts[id] / 250.0, floatround_floor)
4131
4132
4133
4134 return tierLOW;
4135}
4136
4137
4138public plugin_end() {
4139 if(g_SqlTuple) {
4140 SQL_FreeHandle(g_SqlTuple)
4141 }
4142 if(iFwd_MixFinished)
4143 DestroyForward(iFwd_MixFinished);
4144}
4145
4146
4147public ach_add_progress(id, ach)
4148{
4149
4150}
4151
4152GetSecureName(name[SECURE_NAME_LEN])
4153{
4154 new secureName[SECURE_NAME_LEN];
4155 copy(secureName, charsmax(secureName), name);
4156
4157 replace_all(secureName, charsmax(secureName), "\", "\\");
4158 replace_all(secureName, charsmax(secureName), "`", "\`");
4159 replace_all(secureName, charsmax(secureName), "'", "\'");
4160
4161 copy(name, charsmax(name), secureName);
4162}
4163
4164public Announce ( Type )
4165{
4166 new players[MAX_PLAYERS], pnum;
4167 get_players(players, pnum);
4168 static CTPlayers[512]
4169 static TTPlayers[512]
4170 new iLenTT, iLenCT
4171 for(new i = 0; i < pnum; i++)
4172 {
4173 new id = players[i];
4174 if(get_user_team(id) != 1 && get_user_team(id) != 2)
4175 continue
4176
4177 new sz_name[64]
4178 get_user_name(id, sz_name, 63);
4179 if(get_user_team(id) == 1)
4180 {
4181 iLenTT += format(TTPlayers[iLenTT], charsmax(TTPlayers)-iLenTT, "%s [%d] ", sz_name, iPts[id]);
4182 }
4183 else
4184 {
4185 iLenCT += format(CTPlayers[iLenCT], charsmax(CTPlayers)-iLenCT, "%s [%d] ", sz_name, iPts[id]);
4186 }
4187 }
4188 static Message[1024];
4189 new sz_mapname[64]
4190 get_mapname(sz_mapname, 63);
4191 switch( Type )
4192 {
4193 case 1:
4194 {
4195 format(Message, charsmax(Message), "ÐœÐ¸ÐºÑ Ð½Ð°Ñ‡Ð°Ð»ÑÑ! Карта: %s^n Seekers :%s ^n vs ^n Hiders: %s", sz_mapname, CTPlayers, TTPlayers);
4196 send_message(Message, strlen(Message));
4197 }
4198 case 2:
4199 {
4200 format(Message, charsmax(Message), "ÐœÐ¸ÐºÑ Ð·Ð°ÐºÐ¾Ð½Ñ‡Ð¸Ð»ÑÑ Ñо Ñчетом %d %d ! Карта: %s", g_iScore[0], g_iScore[1], sz_mapname);
4201 send_message(Message, strlen(Message));
4202 }
4203 case 3:
4204 {
4205 format(Message, charsmax(Message), "Серверу нужны игроки! Карта: %s (%d Игроков на Ñервере) ^n steam://connect/46.174.48.20:27225", sz_mapname, pnum);
4206 send_message(Message, strlen(Message));
4207 }
4208 }
4209
4210
4211}
4212
4213new Float:LastAnnounce;
4214
4215public hns_announce(id)
4216{
4217 if(LastAnnounce < get_gametime())
4218 {
4219 LastAnnounce = get_gametime()+120.0;
4220 Announce(3);
4221 new szName[64]
4222 get_user_name(id, szName, 63);
4223 set_dhudmessage(random(256), random(256), random(256), -1.0, 0.60, 2, 0.0, 5.0, 0.01, 0.01)
4224 show_dhudmessage(0, "%s позвал Proffi! Ð¡ÐµÐ¹Ñ‡Ð°Ñ Ñ€Ñ‹Ð¶Ð¸Ð¹ Ñоберёт Online!", szName)
4225 }
4226}
4227
4228public send_message( szMessage[], szLen )
4229{
4230 new error;
4231 new g_Socket = socket_open(PLUGIN_HOST, 666, SOCKET_TCP, error)
4232 socket_send(g_Socket, szMessage, szLen)
4233 socket_close(g_Socket)
4234
4235 //log_amx("[Announcer] Sending %s.", szMessage)
4236}
4237
4238public fnConvertTime( Float:time, convert_time[], len )
4239{
4240 new sTemp[24];
4241 new Float:fSeconds = time, iMinutes;
4242
4243 iMinutes = floatround( fSeconds / 60.0, floatround_floor );
4244 fSeconds -= iMinutes * 60.0;
4245 new intpart = floatround( fSeconds, floatround_floor );
4246 new Float:decpart = (fSeconds - intpart) * 100.0;
4247 intpart = floatround( decpart );
4248
4249 formatex( sTemp, charsmax( sTemp ), "%02i:%02.0f.%d", iMinutes, fSeconds, intpart );
4250
4251
4252 formatex( convert_time, len, sTemp );
4253
4254 return(PLUGIN_HANDLED);
4255}
4256
4257const INT_BYTES = 4
4258const BYTE_BITS = 8
4259
4260set_pdata_char(ent, charbased_offset, value, intbase_linuxdiff = 5)
4261{
4262value &= 0xFF;
4263new int_offset_value = get_pdata_int(ent, charbased_offset / INT_BYTES, intbase_linuxdiff);
4264new bit_decal = (charbased_offset % INT_BYTES) * BYTE_BITS;
4265int_offset_value &= ~(0xFF<<bit_decal); // clear byte
4266int_offset_value |= value<<bit_decal;
4267set_pdata_int(ent, charbased_offset / INT_BYTES, int_offset_value, intbase_linuxdiff);
4268return 1;
4269}
4270
4271stock set_pdata_bool(ent, charbased_offset, bool:value, intbase_linuxdiff = 5)
4272{
4273 set_pdata_char(ent, charbased_offset, _:value, intbase_linuxdiff)
4274}
4275stock ExplodeString( p_szOutput[][], p_nMax, p_nSize, p_szInput[], p_szDelimiter )
4276{
4277 new nIdx = 0, l = strlen( p_szInput );
4278 new nLen = (1 + copyc( p_szOutput[nIdx], p_nSize, p_szInput, p_szDelimiter ) );
4279 while ( (nLen < l) && (++nIdx < p_nMax) )
4280 nLen += (1 + copyc( p_szOutput[nIdx], p_nSize, p_szInput[nLen], p_szDelimiter ) );
4281 return(nIdx);
4282}