HLMOD.HU Forrás Megtekintés - www.hlmod.hu
  1.  
  2. /*************************************************************************************
  3. ******* PRAGMA ***********************************************************************
  4. *************************************************************************************/
  5.  
  6. // WHETHER OR NOT TO FORCE ';' AFTER EACH LINE
  7. //
  8. // #pragma semicolon 1
  9.  
  10. // WHETHER OR NOT TO INCREASE MEMORY FOR THIS SCRIPT
  11. //
  12. // #pragma dynamic 2097152
  13.  
  14. // WHETHER OR NOT TO USE '\' AS A CONTROL CHARACTER
  15. // INSTEAD OF THE DEFAULT ONE, WHICH IS '^'
  16. //
  17. // #pragma ctrlchar '\'
  18.  
  19. // SETS TAB SIZE '\t', ' ' TO 0
  20. // GLOBALLY
  21. //
  22. #pragma tabsize 0
  23.  
  24.  
  25. /*************************************************************************************
  26. ******* HEADERS **********************************************************************
  27. *************************************************************************************/
  28.  
  29. // AMX MOD X HEADER FILES
  30. //
  31. #include <amxmodx>
  32. #include <amxmisc>
  33.  
  34. // FAKE META
  35. //
  36. #include <fakemeta>
  37.  
  38. // REQUIRES XSTATS MODULE IF AVAILABLE
  39. //
  40. #pragma reqclass xstats
  41.  
  42. // AUTO LOAD
  43. //
  44. #if !defined AMXMODX_NOAUTOLOAD
  45. #pragma defclasslib xstats csx
  46. #pragma defclasslib xstats dodx
  47. #pragma defclasslib xstats tfcx
  48. #pragma defclasslib xstats tsx
  49. #endif
  50.  
  51.  
  52. /*************************************************************************************
  53. ******* DEFINITIONS ******************************************************************
  54. *************************************************************************************/
  55.  
  56. // CENTER HUD MESSAGE POSITION
  57. //
  58. #define QS_CENTERPOS (-1.0)
  59.  
  60. // VERSION
  61. //
  62. #define QS_VERSION "5.0"
  63.  
  64. // INVALID PLAYER
  65. //
  66. #define QS_INVALIDPLR (0xFF)
  67.  
  68. // MAXIMUM PLAYERS
  69. //
  70. #define QS_MAXPLRS (32)
  71.  
  72. // MAXIMUM BYTE (8 BIT)
  73. //
  74. #define QS_MAXBYTE (0xFF)
  75.  
  76. // INVALID TEAM
  77. //
  78. #define QS_INVALIDTEAM (0xFF)
  79.  
  80. // HUD MESSAGE PURPOSES
  81. //
  82. enum /* HUD MESSAGE PURPOSE */
  83. {
  84. HUDMSG_EVENT = 0,
  85. HUDMSG_STREAK,
  86. HUDMSG_ROUND,
  87.  
  88. HUDMSG_MAX
  89. };
  90.  
  91.  
  92. /*************************************************************************************
  93. ******* GLOBAL VARIABLES *************************************************************
  94. *************************************************************************************/
  95.  
  96. // PLUG-IN ON/ OFF
  97. //
  98. new bool:g_bON = false;
  99.  
  100. /**
  101. * HEAD SHOT
  102. */
  103.  
  104. // HEAD SHOT ON/ OFF
  105. //
  106. new bool:g_bHShot = false;
  107.  
  108. // HEAD SHOT MESSAGE ON/ OFF
  109. new bool:g_bHShotMsg = false;
  110.  
  111. // HEAD SHOT MESSAGE
  112. //
  113. new g_HShotMsg[256];
  114.  
  115. // HEAD SHOT SOUNDS COUNT
  116. //
  117. new g_HShotSize = 0;
  118.  
  119. // HEAD SHOT ONLY FOR KILLER
  120. //
  121. new bool:g_bHShotOnlyKiller = false;
  122.  
  123. // HEAD SHOT SOUNDS CONTAINER
  124. //
  125. new Array:g_pHShot = Invalid_Array;
  126.  
  127. /**
  128. * REVENGE
  129. */
  130.  
  131. // REVENGE ON/ OFF
  132. //
  133. new bool:g_bRevenge = false;
  134.  
  135. // REVENGE MESSAGE FOR KILLER ON/ OFF
  136. //
  137. new bool:g_bRevengeMsgKiller = false;
  138.  
  139. // REVENGE MESSAGE FOR VICTIM ON/ OFF
  140. //
  141. new bool:g_bRevengeMsgVictim = false;
  142.  
  143. // REVENGE MESSAGE FOR KILLER (IF ENABLED)
  144. //
  145. new g_RevengeMsgKiller[256];
  146.  
  147. // REVENGE MESSAGE FOR VICTIM (IF ENABLED)
  148. //
  149. new g_RevengeMsgVictim[256];
  150.  
  151. // REVENGE SOUNDS COUNT
  152. //
  153. new g_RevengeSize = 0;
  154.  
  155. // REVENGE ONLY FOR KILER
  156. //
  157. new bool:g_bRevengeOnlyKiller = false;
  158.  
  159. // REVENGE SOUNDS CONTAINER
  160. //
  161. new Array:g_pRevenge = Invalid_Array;
  162.  
  163. /**
  164. * HATTRICK
  165. * THE LEADER OF CURRENT ROUND
  166. */
  167.  
  168. // HATTRICK ON/ OFF
  169. //
  170. new bool:g_bHattrick = false;
  171.  
  172. // HATTRICK MESSAGE ON/ OFF
  173. //
  174. new bool:g_bHattrickMsg = false;
  175.  
  176. // HATTRICK MESSAGE
  177. //
  178. new g_HattrickMsg[256];
  179.  
  180. // HATTRICK SOUNDS COUNT
  181. //
  182. new g_HattrickSize = 0;
  183.  
  184. // MINIMUM KILLS REQUIRED FOR HATTRICK
  185. //
  186. new g_MinimumKillsForHattrick = 0;
  187.  
  188. // HATTRICK SOUNDS CONTAINER
  189. //
  190. new Array:g_pHattrick = Invalid_Array;
  191.  
  192. /**
  193. * SUICIDE
  194. */
  195.  
  196. // SUICIDE ON/ OFF
  197. //
  198. new bool:g_bSuicide = false;
  199.  
  200. // SUICIDE MESSAGE ON/ OFF
  201. //
  202. new bool:g_bSuicideMsg = false;
  203.  
  204. // SUICIDE MESSAGE
  205. //
  206. new g_SuicideMsg[256];
  207.  
  208. // SUICIDE SOUNDS COUNT
  209. //
  210. new g_SuicideSize = 0;
  211.  
  212. // SUICIDE SOUNDS CONTAINER
  213. //
  214. new Array:g_pSuicide = Invalid_Array;
  215.  
  216. /**
  217. * GRENADE
  218. */
  219.  
  220. // GRENADE ON/ OFF
  221. //
  222. new bool:g_bGrenade = false;
  223.  
  224. // GRENADE MESSAGE ON/ OFF
  225. //
  226. new bool:g_bGrenadeMsg = false;
  227.  
  228. // GRENADE KILL MESSAGE
  229. //
  230. new g_GrenadeMsg[256];
  231.  
  232. // GRENADE SOUNDS COUNT
  233. //
  234. new g_GrenadeSize = 0;
  235.  
  236. // GRENADE SOUNDS CONTAINER
  237. //
  238. new Array:g_pGrenade = Invalid_Array;
  239.  
  240. /**
  241. * TEAM KILL
  242. */
  243.  
  244. // TEAM KILL ON/ OFF
  245. //
  246. new bool:g_bTKill = false;
  247.  
  248. // TEAM KILL MESSAGE ON/ OFF
  249. //
  250. new bool:g_bTKillMsg = false;
  251.  
  252. // TEAM KILL MESSAGE
  253. //
  254. new g_TKillMsg[256];
  255.  
  256. // TEAM KILL SOUNDS COUNT
  257. //
  258. new g_TKillSize = 0;
  259.  
  260. // TEAM KILL SOUNDS CONTAINER
  261. //
  262. new Array:g_pTKill = Invalid_Array;
  263.  
  264. /**
  265. * KNIFE
  266. */
  267.  
  268. // KNIFE ON/ OFF
  269. //
  270. new bool:g_bKnife = false;
  271.  
  272. // KNIFE MESSAGE ON/ OFF
  273. //
  274. new bool:g_bKnifeMsg = false;
  275.  
  276. // KNIFE KILL MESSAGE
  277. //
  278. new g_KnifeMsg[256];
  279.  
  280. // KNIFE KILL SOUNDS COUNT
  281. //
  282. new g_KnifeSize = 0;
  283.  
  284. // KNIFE SOUNDS CONTAINER
  285. //
  286. new Array:g_pKnife = Invalid_Array;
  287.  
  288. /**
  289. * FIRST BLOOD
  290. */
  291.  
  292. // FIRST BLOOD ON/ OFF
  293. //
  294. new bool:g_bFBlood = false;
  295.  
  296. // FIRST BLOOD MESSAGE ON/ OFF
  297. //
  298. new bool:g_bFBloodMsg = false;
  299.  
  300. // FIRST BLOOD MESSAGE
  301. //
  302. new g_FBloodMsg[256];
  303.  
  304. // FIRST BLOOD SOUNDS COUNT
  305. //
  306. new g_FBloodSize = 0;
  307.  
  308. // FIRST BLOOD VARIABLE
  309. //
  310. new g_FBlood = 0;
  311.  
  312. // FIRST BLOOD SOUNDS CONTAINER
  313. //
  314. new Array:g_pFBlood = Invalid_Array;
  315.  
  316. /**
  317. * KILLS STREAK
  318. */
  319.  
  320. // KILLS STREAK ON/ OFF
  321. //
  322. new bool:g_bKStreak = false;
  323.  
  324. // KILL STREAK SOUNDS COUNT
  325. //
  326. new g_KStreakSoundsSize = 0;
  327.  
  328. // KILLS STREAK SOUNDS CONTAINER
  329. //
  330. new Array:g_pKStreakSounds = Invalid_Array;
  331.  
  332. // KILLS STREAK MESSAGES CONTAINER
  333. //
  334. new Array:g_pKStreakMessages = Invalid_Array;
  335.  
  336. // KILLS STREAK REQUIRED KILLS CONTAINER
  337. //
  338. new Array:g_pKStreakRequiredKills = Invalid_Array;
  339.  
  340. /**
  341. * ROUND START
  342. */
  343.  
  344. // ROUND START ON/ OFF
  345. //
  346. new bool:g_bRStart = false;
  347.  
  348. // ROUND START MESSAGE ON/ OFF
  349. //
  350. new bool:g_bRStartMsg = false;
  351.  
  352. // ROUND START MESSAGE
  353. //
  354. new g_RStartMsg[256];
  355.  
  356. // ROUND START SOUNDS COUNT
  357. //
  358. new g_RStartSize = 0;
  359.  
  360. // ROUND START SOUNDS CONTAINER
  361. //
  362. new Array:g_pRStart = Invalid_Array;
  363.  
  364. /**
  365. * DOUBLE KILL
  366. */
  367.  
  368. // DOUBLE KILL ON/ OFF
  369. //
  370. new bool:g_bDKill = false;
  371.  
  372. // DOUBLE KILL MESSAGE ON/ OFF
  373. //
  374. new bool:g_bDKillMsg = false;
  375.  
  376. // DOUBLE KILL MESSAGE
  377. //
  378. new g_DKillMsg[256];
  379.  
  380. // DOUBLE KILL SOUNDS COUNT
  381. //
  382. new g_DKillSize = 0;
  383.  
  384. // DOUBLE KILL SOUNDS CONTAINER
  385. //
  386. new Array:g_pDKill = Invalid_Array;
  387.  
  388. /**
  389. * FLAWLESS
  390. * IF A TEAM KILLS THE OTHER ONE W/ O GETTING ANY CASUALTIES
  391. */
  392.  
  393. // FLAWLESS ON/ OFF
  394. //
  395. new bool:g_bFlawless = false;
  396.  
  397. // FLAWLESS MESSAGE ON/ OFF
  398. //
  399. new bool:g_bFlawlessMsg = false;
  400.  
  401. // FLAWLESS MESSAGE
  402. //
  403. new g_FlawlessMsg[256];
  404.  
  405. // FLAWLESS TEAM NAME FOR TEAM [1]
  406. //
  407. new g_FlawlessTeamName_1[256];
  408.  
  409. // FLAWLESS TEAM NAME FOR TEAM [2]
  410. //
  411. new g_FlawlessTeamName_2[256];
  412.  
  413. // FLAWLESS SOUNDS COUNT
  414. //
  415. new g_FlawlessSize = 0;
  416.  
  417. // FLAWLESS SOUNDS CONTAINER
  418. //
  419. new Array:g_pFlawless = Invalid_Array;
  420.  
  421.  
  422. /**
  423. * HUD MESSAGE [TE_TEXTMESSAGE]
  424. */
  425.  
  426. // CHANNEL HANDLES
  427. //
  428. new g_pHudMsg[HUDMSG_MAX];
  429.  
  430. // RED
  431. //
  432. new g_Red = 0;
  433.  
  434. // RANDOM RED
  435. //
  436. new bool:g_bRandomRed = false;
  437.  
  438. // GREEN
  439. //
  440. new g_Green = 0;
  441.  
  442. // RANDOM GREEN
  443. //
  444. new bool:g_bRandomGreen = false;
  445.  
  446. // BLUE
  447. //
  448. new g_Blue = 0;
  449.  
  450. // RANDOM BLUE
  451. //
  452. new bool:g_bRandomBlue = false;
  453.  
  454.  
  455. /**
  456. * GAME RELATED
  457. */
  458.  
  459. // MOD NAME
  460. //
  461. new g_ModName[8];
  462.  
  463. // ON DEATHMSG
  464. //
  465. new bool:g_bOnDeathMsg = false;
  466.  
  467. // DEATHMSG BYTE STATUS
  468. //
  469. new g_DeathMsgByteStatus = 0;
  470.  
  471. // DEATHMSG ONLY AVAILABLE
  472. //
  473. new bool:g_bDeathMsgOnly = false;
  474.  
  475. // CACHED KILLER ID
  476. //
  477. new g_Killer = 0;
  478.  
  479. // CACHED VICTIM ID
  480. //
  481. new g_Victim = 0;
  482.  
  483. // CACHED WEAPON ID
  484. //
  485. new g_wpnID = 0;
  486.  
  487. // CACHED HIT PLACE
  488. //
  489. new g_Place = 0;
  490.  
  491. // CACHED TEAM KILL BOOLEAN
  492. //
  493. new g_TK = 0;
  494.  
  495.  
  496. /**
  497. * PLAYERS RELATED
  498. */
  499.  
  500. // MAXIMUM PLAYERS
  501. //
  502. new g_maxPlayers = 0;
  503.  
  504. // TOTAL KILLS PER PLAYER PER LIFE
  505. // RESETS ON PLAYER DEATH
  506. //
  507. new g_Kills[QS_MAXPLRS + 1];
  508.  
  509. // TOTAL KILLS PER PLAYER PER ROUND
  510. // RESETS NEXT ROUND
  511. //
  512. new g_RKills[QS_MAXPLRS + 1];
  513.  
  514. // HLTV
  515. //
  516. new bool:g_bHLTV[QS_MAXPLRS + 1];
  517.  
  518. // BOT
  519. //
  520. new bool:g_bBOT[QS_MAXPLRS + 1];
  521.  
  522. // CONNECTED
  523. //
  524. new bool:g_bConnected[QS_MAXPLRS + 1];
  525.  
  526. // NAME
  527. //
  528. new g_Name[QS_MAXPLRS + 1][32];
  529.  
  530. // REVENGE KILL NAME STAMP
  531. //
  532. new g_RevengeStamp[QS_MAXPLRS + 1][32];
  533.  
  534. // SOUNDS DISABLED PER PLAYER
  535. //
  536. new bool:g_bDisabled[QS_MAXPLRS + 1];
  537.  
  538. // LAST KILL TIME STAMP (GAME TIME)
  539. //
  540. new Float:g_fLastKillTimeStamp[QS_MAXPLRS + 1];
  541.  
  542.  
  543. /*************************************************************************************
  544. ******* FORWARDS *********************************************************************
  545. *************************************************************************************/
  546.  
  547. // PLUG-IN NATIVES
  548. //
  549. public plugin_natives()
  550. {
  551. // SETS MODULE FILTER
  552. //
  553. set_module_filter("Module_Filter");
  554.  
  555. // SETS NATIVE FILTER
  556. //
  557. set_native_filter("Native_Filter");
  558. }
  559.  
  560. // FILTERS MODULE
  561. //
  562. public Module_Filter(const Module[])
  563. {
  564. // XSTATS
  565. //
  566. if (equali(Module, "xstats"))
  567. {
  568. // AVAILABLE FOR GAMES BELOW
  569. //
  570. if (equali(g_ModName, "CS", 2) || equali(g_ModName, "CZ", 2) || equali(g_ModName, "DOD", 3) || \
  571. equali(g_ModName, "TFC", 3) || equali(g_ModName, "TS", 2))
  572. return PLUGIN_CONTINUE;
  573.  
  574. // UNAVAILABLE
  575. //
  576. return PLUGIN_HANDLED;
  577. }
  578.  
  579. // OK
  580. //
  581. return PLUGIN_CONTINUE;
  582. }
  583.  
  584. // FILTERS NATIVE
  585. //
  586. public Native_Filter(const Name[], Id, bTrap)
  587. {
  588. // TRAP
  589. //
  590. return !bTrap ? PLUGIN_HANDLED : PLUGIN_CONTINUE;
  591. }
  592.  
  593. // pfnSpawn()
  594. // CALLED BEFORE "plugin_init"
  595. // THE RIGHT MOMENT FOR INI FILES
  596. // AND PRECACHING DATA
  597. //
  598. public plugin_precache()
  599. {
  600. // CREATES ARRAYS FIRST
  601. //
  602. g_pHShot = ArrayCreate(128);
  603. g_pSuicide = ArrayCreate(128);
  604. g_pGrenade = ArrayCreate(128);
  605. g_pTKill = ArrayCreate(128);
  606. g_pKnife = ArrayCreate(128);
  607. g_pFBlood = ArrayCreate(128);
  608. g_pRStart = ArrayCreate(128);
  609. g_pDKill = ArrayCreate(128);
  610. g_pHattrick = ArrayCreate(128);
  611. g_pFlawless = ArrayCreate(128);
  612. g_pRevenge = ArrayCreate(128);
  613. g_pKStreakSounds = ArrayCreate(128);
  614. g_pKStreakMessages = ArrayCreate(256);
  615. g_pKStreakRequiredKills = ArrayCreate(8);
  616.  
  617. // READS FILE
  618. //
  619. __Load();
  620.  
  621. // PRECACHES NOTHING
  622. // IF PLUG-IN IS OFF
  623. //
  624. if (!g_bON)
  625. return;
  626.  
  627. // RETRIEVES SOUNDS COUNT
  628. //
  629. g_HShotSize = ArraySize(g_pHShot);
  630. g_SuicideSize = ArraySize(g_pSuicide);
  631. g_GrenadeSize = ArraySize(g_pGrenade);
  632. g_TKillSize = ArraySize(g_pTKill);
  633. g_KnifeSize = ArraySize(g_pKnife);
  634. g_FBloodSize = ArraySize(g_pFBlood);
  635. g_RStartSize = ArraySize(g_pRStart);
  636. g_DKillSize = ArraySize(g_pDKill);
  637. g_HattrickSize = ArraySize(g_pHattrick);
  638. g_FlawlessSize = ArraySize(g_pFlawless);
  639. g_RevengeSize = ArraySize(g_pRevenge);
  640. g_KStreakSoundsSize = ArraySize(g_pKStreakSounds);
  641.  
  642. // DEFINES ITERATOR FOR FURTHER USE
  643. //
  644. new Iterator = 0;
  645.  
  646. // DEFINES SOUND FOR FURTHER USE
  647. //
  648. new Sound[128];
  649.  
  650. if (g_bHShot)
  651. {
  652. for (Iterator = 0; Iterator < g_HShotSize; Iterator++)
  653. ArrayGetString(g_pHShot, Iterator, Sound, charsmax(Sound)), precache_sound(Sound);
  654. }
  655.  
  656. if (g_bSuicide)
  657. {
  658. for (Iterator = 0; Iterator < g_SuicideSize; Iterator++)
  659. ArrayGetString(g_pSuicide, Iterator, Sound, charsmax(Sound)), precache_sound(Sound);
  660. }
  661.  
  662. if (g_bGrenade)
  663. {
  664. for (Iterator = 0; Iterator < g_GrenadeSize; Iterator++)
  665. ArrayGetString(g_pGrenade, Iterator, Sound, charsmax(Sound)), precache_sound(Sound);
  666. }
  667.  
  668. if (g_bTKill)
  669. {
  670. for (Iterator = 0; Iterator < g_TKillSize; Iterator++)
  671. ArrayGetString(g_pTKill, Iterator, Sound, charsmax(Sound)), precache_sound(Sound);
  672. }
  673.  
  674. if (g_bKnife)
  675. {
  676. for (Iterator = 0; Iterator < g_KnifeSize; Iterator++)
  677. ArrayGetString(g_pKnife, Iterator, Sound, charsmax(Sound)), precache_sound(Sound);
  678. }
  679.  
  680. if (g_bFBlood)
  681. {
  682. for (Iterator = 0; Iterator < g_FBloodSize; Iterator++)
  683. ArrayGetString(g_pFBlood, Iterator, Sound, charsmax(Sound)), precache_sound(Sound);
  684. }
  685.  
  686. if (g_bRStart)
  687. {
  688. for (Iterator = 0; Iterator < g_RStartSize; Iterator++)
  689. ArrayGetString(g_pRStart, Iterator, Sound, charsmax(Sound)), precache_sound(Sound);
  690. }
  691.  
  692. if (g_bDKill)
  693. {
  694. for (Iterator = 0; Iterator < g_DKillSize; Iterator++)
  695. ArrayGetString(g_pDKill, Iterator, Sound, charsmax(Sound)), precache_sound(Sound);
  696. }
  697.  
  698. if (g_bHattrick)
  699. {
  700. for (Iterator = 0; Iterator < g_HattrickSize; Iterator++)
  701. ArrayGetString(g_pHattrick, Iterator, Sound, charsmax(Sound)), precache_sound(Sound);
  702. }
  703.  
  704. if (g_bFlawless)
  705. {
  706. for (Iterator = 0; Iterator < g_FlawlessSize; Iterator++)
  707. ArrayGetString(g_pFlawless, Iterator, Sound, charsmax(Sound)), precache_sound(Sound);
  708. }
  709.  
  710. if (g_bRevenge)
  711. {
  712. for (Iterator = 0; Iterator < g_RevengeSize; Iterator++)
  713. ArrayGetString(g_pRevenge, Iterator, Sound, charsmax(Sound)), precache_sound(Sound);
  714. }
  715.  
  716. if (g_bKStreak)
  717. {
  718. for (Iterator = 0; Iterator < g_KStreakSoundsSize; Iterator++)
  719. ArrayGetString(g_pKStreakSounds, Iterator, Sound, charsmax(Sound)), precache_sound(Sound);
  720. }
  721. }
  722.  
  723. // pfnServerDeactivate_Post()
  724. // MAP ENDS
  725. //
  726. public plugin_end()
  727. {
  728. // DESTROYS ARRAYS
  729. //
  730. ArrayDestroy(g_pHShot);
  731. ArrayDestroy(g_pSuicide);
  732. ArrayDestroy(g_pGrenade);
  733. ArrayDestroy(g_pTKill);
  734. ArrayDestroy(g_pKnife);
  735. ArrayDestroy(g_pFBlood);
  736. ArrayDestroy(g_pRStart);
  737. ArrayDestroy(g_pDKill);
  738. ArrayDestroy(g_pHattrick);
  739. ArrayDestroy(g_pFlawless);
  740. ArrayDestroy(g_pRevenge);
  741. ArrayDestroy(g_pKStreakSounds);
  742. ArrayDestroy(g_pKStreakMessages);
  743. ArrayDestroy(g_pKStreakRequiredKills);
  744. }
  745.  
  746. // pfnServerActivate_Post()
  747. // CALLED AFTER "plugin_precache"
  748. // THE RIGHT MOMENT TO REGISTER STUFF
  749. //
  750. public plugin_init()
  751. {
  752. // REGISTERS PLUG-IN
  753. //
  754. register_plugin("ADV. QUAKE SOUNDS", QS_VERSION, "HATTRICK (HTTRCKCLDHKS)");
  755.  
  756. // REGISTERS CONSOLE VARIABLE
  757. //
  758. new pCVar = register_cvar("advanced_quake_sounds", QS_VERSION, FCVAR_SERVER | FCVAR_EXTDLL | FCVAR_UNLOGGED | FCVAR_SPONLY);
  759.  
  760. // SETS CONSOLE VARIABLE STRING
  761. //
  762. if (pCVar)
  763. set_pcvar_string(pCVar, QS_VERSION);
  764.  
  765. // STOPS HERE IF THE PLUG-IN IS DISABLED
  766. //
  767. if (!g_bON)
  768. return;
  769.  
  770. // REGISTERS FAKE META FORWARDS
  771. //
  772. register_forward(FM_MessageBegin, "OnMessageBegin", 1);
  773. register_forward(FM_WriteByte, "OnWriteByte", 1);
  774. register_forward(FM_MessageEnd, "OnMessageEnd", 1);
  775.  
  776. // GETS MAXIMUM PLAYERS
  777. //
  778. g_maxPlayers = get_maxplayers();
  779.  
  780. // GETS MOD NAME
  781. //
  782. get_modname(g_ModName, charsmax(g_ModName));
  783.  
  784. // DEATHMSG IS THE ONLY AVAILABLE FOR ESF, NS AND VALVE
  785. // THESE MODS HAVE NO XSTATS MODULE
  786. //
  787. if (equali(g_ModName, "ESF", 3) || equali(g_ModName, "NS", 2) || equali(g_ModName, "VALVE"))
  788. {
  789. g_bDeathMsgOnly = true;
  790. }
  791.  
  792. // COUNTER-STRIKE
  793. //
  794. if (equali(g_ModName, "CS", 2) || equali(g_ModName, "CZ", 2))
  795. {
  796. // ROUND RESTART
  797. //
  798. register_event("TextMsg", "OnRRestart", "a", "2&#Game_C", "2&#Game_w");
  799.  
  800. // ROUND START
  801. //
  802. register_logevent("OnRStart", 2, "1=Round_Start");
  803.  
  804. // ROUND END
  805. //
  806. register_logevent("OnREnd", 2, "1=Round_End");
  807. }
  808.  
  809. // DAY OF DEFEAT
  810. //
  811. else if (equali(g_ModName, "DOD", 3))
  812. {
  813. // ROUND START
  814. //
  815. register_event("RoundState", "OnRStart", "a", "1=1");
  816.  
  817. // ROUND END
  818. //
  819. register_event("RoundState", "OnREnd", "a", "1=3", "1=4");
  820.  
  821. // DISABLES HATTRICK
  822. //
  823. g_bHattrick = false;
  824.  
  825. // DISABLES FLAWLESS
  826. //
  827. g_bFlawless = false;
  828. }
  829.  
  830. // NO CS/ CZ OR DOD
  831. //
  832. else
  833. {
  834. // DISABLES TEAM KILL
  835. //
  836. g_bTKill = false;
  837.  
  838. // DISABLES HATTRICK
  839. //
  840. g_bHattrick = false;
  841.  
  842. // DISABLES FLAWLESS
  843. //
  844. g_bFlawless = false;
  845.  
  846. // DISABLES ROUND START
  847. //
  848. g_bRStart = false;
  849. }
  850.  
  851. // HUD MESSAGE [TE_TEXTMESSAGE] CHANNEL HANDLES
  852. //
  853. g_pHudMsg[HUDMSG_STREAK] = CreateHudSyncObj();
  854. g_pHudMsg[HUDMSG_EVENT] = CreateHudSyncObj();
  855. g_pHudMsg[HUDMSG_ROUND] = CreateHudSyncObj();
  856. }
  857.  
  858. // pfnServerActivate_Post()
  859. // CALLED AFTER "plugin_init"
  860. // THE RIGHT MOMENT FOR ACTUALIZING CONFIGURATIONS
  861. //
  862. public plugin_cfg()
  863. {
  864. /**
  865. * MESSAGES ON/ OFF
  866. */
  867.  
  868. g_bHShotMsg = g_HShotMsg[0] ? true : false;
  869. g_bSuicideMsg = g_SuicideMsg[0] ? true : false;
  870. g_bGrenadeMsg = g_GrenadeMsg[0] ? true : false;
  871. g_bTKillMsg = g_TKillMsg[0] ? true : false;
  872. g_bKnifeMsg = g_KnifeMsg[0] ? true : false;
  873. g_bFBloodMsg = g_FBloodMsg[0] ? true : false;
  874. g_bRStartMsg = g_RStartMsg[0] ? true : false;
  875. g_bDKillMsg = g_DKillMsg[0] ? true : false;
  876. g_bHattrickMsg = g_HattrickMsg[0] ? true : false;
  877. g_bFlawlessMsg = g_FlawlessMsg[0] ? true : false;
  878. g_bRevengeMsgVictim = g_RevengeMsgVictim[0] ? true : false;
  879. g_bRevengeMsgKiller = g_RevengeMsgKiller[0] ? true : false;
  880. }
  881.  
  882. // pfnClientUserInfoChanged()
  883. // EXECUTES WHEN CLIENT CHANGES INFORMATION
  884. //
  885. public client_infochanged(Player)
  886. {
  887. static NewName[32];
  888.  
  889. // PLAYER IS CONNECTED AND IT'S NOT A HLTV
  890. //
  891. if (g_bConnected[Player] && !g_bHLTV[Player])
  892. {
  893. // RETRIEVES NEW NAME (IF ANY)
  894. //
  895. get_user_info(Player, "name", NewName, charsmax(NewName));
  896.  
  897. // UPDATES IF NEEDED
  898. //
  899. if (!equali(NewName, g_Name[Player]))
  900. g_Name[Player] = NewName;
  901. }
  902. }
  903.  
  904. // pfnClientDisconnect()
  905. // EXECUTES WHEN CLIENT DISCONNECTS
  906. //
  907. public client_disconnect(Player)
  908. {
  909. // NO MORE KILLS
  910. //
  911. g_Kills[Player] = 0;
  912. g_RKills[Player] = 0;
  913.  
  914. // NO MORE TRUE DATA
  915. //
  916. g_bHLTV[Player] = false;
  917. g_bBOT[Player] = false;
  918. g_bDisabled[Player] = false;
  919. g_bConnected[Player] = false;
  920.  
  921. // NO MORE VALID STRINGS
  922. //
  923. g_Name[Player][0] = EOS;
  924. g_RevengeStamp[Player][0] = EOS;
  925. }
  926.  
  927. // pfnClientCommand()
  928. // EXECUTES WHEN CLIENT TYPES
  929. //
  930. public client_command(Player)
  931. {
  932. static Argument[16];
  933.  
  934. // CONNECTED, NOT BOT AND NOT HLTV
  935. //
  936. if (g_bConnected[Player] && !g_bBOT[Player] && !g_bHLTV[Player])
  937. {
  938. // RETRIEVES THE ARGUMENT
  939. //
  940. read_argv(1, Argument, charsmax(Argument));
  941.  
  942. // CHECKS ARGUMENT
  943. //
  944. if (equali(Argument, "/Sounds", 7) || equali(Argument, "Sounds", 6))
  945. {
  946. // ENABLES/ DISABLES SOUNDS PER CLIENT
  947. //
  948. client_print(Player, print_chat, ">> QUAKE SOUNDS HAVE BEEN %s.", g_bDisabled[Player] ? "ENABLED" : "DISABLED");
  949. g_bDisabled[Player] = !g_bDisabled[Player];
  950. }
  951. }
  952. }
  953.  
  954. // pfnClientPutInServer()
  955. // EXECUTES WHEN CLIENT JOINS
  956. //
  957. public client_putinserver(Player)
  958. {
  959. // RETRIEVES PLAYER NAME
  960. //
  961. get_user_name(Player, g_Name[Player], charsmax(g_Name[]));
  962.  
  963. // HLTV
  964. //
  965. g_bHLTV[Player] = bool:is_user_hltv(Player);
  966.  
  967. // BOT
  968. //
  969. g_bBOT[Player ] = bool:is_user_bot(Player);
  970.  
  971. // NO KILLS
  972. //
  973. g_Kills[Player] = 0;
  974. g_RKills[Player] = 0;
  975.  
  976. // CONNECTED
  977. //
  978. g_bConnected[Player] = true;
  979.  
  980. // SETTINGS ON
  981. //
  982. g_bDisabled[Player] = false;
  983.  
  984. // NO REVENGE STAMP YET
  985. //
  986. g_RevengeStamp[Player][0] = EOS;
  987.  
  988. // PRINTS INFORMATION FOR VALID PLAYERS ONLY
  989. //
  990. if (!g_bBOT[Player] && !g_bHLTV[Player])
  991. set_task(6.0, "QuakeSoundsPrint", Player);
  992. }
  993.  
  994. // PRINTS INFORMATION TO PLAYER
  995. //
  996. public QuakeSoundsPrint(Player)
  997. {
  998. // ONLY IF CONNECTED
  999. //
  1000. if (g_bConnected[Player])
  1001. client_print(Player, print_chat, ">> Ird be 'sounds' , hogy ki/be kapcsold a Quake hangokat.");
  1002. }
  1003.  
  1004. // EXECUTED ON PLAYER DEATH
  1005. // THIS IS ONLY REQUIRED FOR CS/ CZ, DOD, TS AND TFC
  1006. // THIS IS EXECUTED BEFORE DEATHMSG EVENT
  1007. //
  1008. public client_death(Killer, Victim, wpnID, Place, TK)
  1009. {
  1010. // CACHES WEAPON ID
  1011. //
  1012. g_wpnID = wpnID;
  1013.  
  1014. // CACHES HIT PLACE
  1015. //
  1016. g_Place = Place;
  1017.  
  1018. // CACHES TEAM KILL BOOLEAN
  1019. //
  1020. g_TK = TK;
  1021. }
  1022.  
  1023. // WHEN ROUND RESTARTS
  1024. //
  1025. public OnRRestart()
  1026. {
  1027. static Player;
  1028. for (Player = 1; Player <= g_maxPlayers; Player++)
  1029. {
  1030. // CLEARS DATA
  1031. //
  1032. g_Kills[Player] = 0;
  1033. g_RKills[Player] = 0;
  1034.  
  1035. g_RevengeStamp[Player][0] = EOS;
  1036. }
  1037. }
  1038.  
  1039. // WHEN ROUND STARTS
  1040. //
  1041. public OnRStart()
  1042. {
  1043. static Player;
  1044.  
  1045. // RESETS FIRST BLOOD
  1046. //
  1047. if (g_bFBlood)
  1048. g_FBlood = 0;
  1049.  
  1050. // PREPARES ROUND START EVENT
  1051. //
  1052. if (g_bRStart)
  1053. {
  1054. if (g_bRStartMsg)
  1055. {
  1056. if (g_bRandomRed) g_Red = random_num(0, QS_MAXBYTE);
  1057. if (g_bRandomGreen) g_Green = random_num(0, QS_MAXBYTE);
  1058. if (g_bRandomBlue) g_Blue = random_num(0, QS_MAXBYTE);
  1059.  
  1060. set_hudmessage(g_Red, g_Green, g_Blue, QS_CENTERPOS, 0.2615, _, _, 5.0);
  1061. qs_ShowSyncHudMsg(0, g_pHudMsg[HUDMSG_ROUND], g_RStartMsg);
  1062. }
  1063.  
  1064. qs_client_cmd(0, "SPK ^"%a^"", ArrayGetStringHandle(g_pRStart, random_num(0, g_RStartSize - 1)));
  1065. }
  1066.  
  1067. // RESETS HATTRICK DATA
  1068. //
  1069. if (g_bHattrick)
  1070. {
  1071. for (Player = 1; Player <= g_maxPlayers; Player++)
  1072. g_RKills[Player] = 0;
  1073. }
  1074. }
  1075.  
  1076. // WHEN ROUND ENDS
  1077. //
  1078. public OnREnd()
  1079. {
  1080. // GETS HATTRICK READY
  1081. //
  1082. if (g_bHattrick) set_task(2.8, "__Hattrick");
  1083.  
  1084. // GETS FLAWLESS READY
  1085. //
  1086. if (g_bFlawless) set_task(1.2, "__Flawless");
  1087. }
  1088.  
  1089. // PREPARES HATTRICK
  1090. //
  1091. public __Hattrick()
  1092. {
  1093. // RETRIEVES LEADER ID
  1094. //
  1095. static Leader;
  1096. Leader = __Leader();
  1097.  
  1098. // IF ANY
  1099. //
  1100. if (Leader != QS_INVALIDPLR)
  1101. {
  1102. if (g_bRandomRed) g_Red = random_num(0, QS_MAXBYTE);
  1103. if (g_bRandomGreen) g_Green = random_num(0, QS_MAXBYTE);
  1104. if (g_bRandomBlue) g_Blue = random_num(0, QS_MAXBYTE);
  1105.  
  1106. if (g_RKills[Leader] >= g_MinimumKillsForHattrick)
  1107. {
  1108. if (g_bHattrickMsg)
  1109. {
  1110. set_hudmessage(g_Red, g_Green, g_Blue, QS_CENTERPOS, 0.2015, _, _, 5.0);
  1111. qs_ShowSyncHudMsg(0, g_pHudMsg[HUDMSG_EVENT], g_HattrickMsg, g_Name[Leader]);
  1112. }
  1113.  
  1114. qs_client_cmd(0, "SPK ^"%a^"", ArrayGetStringHandle(g_pHattrick, random_num(0, g_HattrickSize - 1)));
  1115. }
  1116. }
  1117. }
  1118.  
  1119. // PREPARES FLAWLESS
  1120. //
  1121. public __Flawless()
  1122. {
  1123. if (g_bRandomRed) g_Red = random_num(0, QS_MAXBYTE);
  1124. if (g_bRandomGreen) g_Green = random_num(0, QS_MAXBYTE);
  1125. if (g_bRandomBlue) g_Blue = random_num(0, QS_MAXBYTE);
  1126.  
  1127. new aliveTeam_1 = __Players(true, 1);
  1128. new aliveTeam_2 = __Players(true, 2);
  1129.  
  1130. new allTeam_1 = aliveTeam_1 + __Players(false, 1);
  1131. new allTeam_2 = aliveTeam_2 + __Players(false, 2);
  1132.  
  1133. set_hudmessage(g_Red, g_Green, g_Blue, QS_CENTERPOS, 0.2815, _, _, 5.0);
  1134.  
  1135. if (allTeam_1 == aliveTeam_1)
  1136. {
  1137. if (g_bFlawlessMsg)
  1138. qs_ShowSyncHudMsg(0, g_pHudMsg[HUDMSG_ROUND], g_FlawlessMsg, g_FlawlessTeamName_1);
  1139.  
  1140. qs_client_cmd(0, "SPK ^"%a^"", ArrayGetStringHandle(g_pFlawless, random_num(0, g_FlawlessSize - 1)));
  1141. }
  1142.  
  1143. else if (allTeam_2 == aliveTeam_2)
  1144. {
  1145. if (g_bFlawlessMsg)
  1146. qs_ShowSyncHudMsg(0, g_pHudMsg[HUDMSG_ROUND], g_FlawlessMsg, g_FlawlessTeamName_2);
  1147.  
  1148. qs_client_cmd(0, "SPK ^"%a^"", ArrayGetStringHandle(g_pFlawless, random_num(0, g_FlawlessSize - 1)));
  1149. }
  1150. }
  1151.  
  1152. // pfnMessageBegin()
  1153. // FIRED WHEN A MESSAGE BEGINS
  1154. //
  1155. public OnMessageBegin(Destination, Type)
  1156. {
  1157. static deathMsg = 0;
  1158.  
  1159. // GETS DEATHMSG ID
  1160. //
  1161. if (deathMsg == 0)
  1162. deathMsg = get_user_msgid("DeathMsg");
  1163.  
  1164. // IF GLOBALLY SENT
  1165. //
  1166. if (deathMsg > 0 && Type == deathMsg && (Destination == MSG_ALL || Destination == MSG_BROADCAST))
  1167. {
  1168. g_bOnDeathMsg = true;
  1169. g_DeathMsgByteStatus = 0;
  1170. }
  1171. }
  1172.  
  1173. // pfnWriteByte()
  1174. // FIRED WHEN A BYTE IS BEING WRITTEN
  1175. //
  1176. public OnWriteByte(Byte)
  1177. {
  1178. // OUR DEATHMSG
  1179. //
  1180. if (g_bOnDeathMsg)
  1181. {
  1182. // GETS DATA
  1183. //
  1184. switch (++g_DeathMsgByteStatus)
  1185. {
  1186. case 1: g_Killer = Byte;
  1187. case 2: g_Victim = Byte;
  1188. }
  1189. }
  1190. }
  1191.  
  1192. // pfnMessageEnd()
  1193. // FIRED WHEN A MESSAGE ENDS
  1194. //
  1195. public OnMessageEnd()
  1196. {
  1197. // OUR DEATHMSG
  1198. //
  1199. if (g_bOnDeathMsg)
  1200. {
  1201. g_bOnDeathMsg = false;
  1202. g_DeathMsgByteStatus = 0;
  1203.  
  1204. // FIRES
  1205. //
  1206. set_task(0.0, "__DeathMsg");
  1207. }
  1208. }
  1209.  
  1210. // WHEN A PLAYER DIES
  1211. // THIS IS EXECUTED AFTER XSTATS MODULE "client_death" FORWARD
  1212. //
  1213. public __DeathMsg()
  1214. {
  1215. // HIT PLACE
  1216. //
  1217. new Place = 0;
  1218.  
  1219. // PREPARES WEAPON ID AND PLACE
  1220. //
  1221. if (g_wpnID < 1)
  1222. {
  1223. new wpnID = 0;
  1224. get_user_attacker(g_Victim, wpnID, Place);
  1225.  
  1226. // POSSIBLE FIX
  1227. //
  1228. if (wpnID < 1 && g_bConnected[g_Killer])
  1229. wpnID = get_user_weapon(g_Killer);
  1230.  
  1231. g_wpnID = wpnID;
  1232. }
  1233.  
  1234. // POSSIBLE HIT PLACE FIX
  1235. //
  1236. if (g_Place < 1 && Place > 0)
  1237. g_Place = Place;
  1238.  
  1239. // PREPARES TEAM KILL BOOLEAN
  1240. //
  1241. if (g_bDeathMsgOnly && g_bConnected[g_Killer])
  1242. g_TK = get_user_team(g_Killer) == get_user_team(g_Victim) ? 1 : 0;
  1243.  
  1244. // PROCESSES DEATH
  1245. //
  1246. __Death(g_Killer, g_Victim, g_wpnID, g_Place, g_TK);
  1247. }
  1248.  
  1249.  
  1250. /*************************************************************************************
  1251. ******* FUNCTIONS ********************************************************************
  1252. *************************************************************************************/
  1253.  
  1254. // PROCESSES CLIENT DEATH FOR ALL MODS
  1255. //
  1256. __Death(Killer, Victim, wpnID, Place, TK)
  1257. {
  1258. // VARIABLES
  1259. //
  1260. static Iterator, Float:gameTime, Weapon[32], Sound[128], Message[256];
  1261.  
  1262. // RESETS KILLS FOR VICTIM
  1263. //
  1264. if (g_bKStreak)
  1265. g_Kills[Victim] = 0;
  1266.  
  1267. // INVALID KILLER (WORLD)
  1268. //
  1269. if (!g_bConnected[Killer])
  1270. return;
  1271.  
  1272. // PREPARES HUD MESSAGE COLOR
  1273. //
  1274. if (g_bRandomRed) g_Red = random_num(0, QS_MAXBYTE);
  1275. if (g_bRandomGreen) g_Green = random_num(0, QS_MAXBYTE);
  1276. if (g_bRandomBlue) g_Blue = random_num(0, QS_MAXBYTE);
  1277.  
  1278. // PREPARES HUD MESSAGE
  1279. //
  1280. set_hudmessage(g_Red, g_Green, g_Blue, QS_CENTERPOS, 0.2415, _, _, 5.0);
  1281.  
  1282. // REVENGE KILLER STAMP
  1283. //
  1284. if (g_bRevenge)
  1285. g_RevengeStamp[Victim] = g_Name[Killer];
  1286.  
  1287. // SUICIDE
  1288. //
  1289. if (Victim == Killer)
  1290. {
  1291. if (g_bSuicide)
  1292. {
  1293. if (g_bSuicideMsg)
  1294. qs_ShowSyncHudMsg(0, g_pHudMsg[HUDMSG_EVENT], g_SuicideMsg, g_Name[Victim]);
  1295.  
  1296. qs_client_cmd(0, "SPK ^"%a^"", ArrayGetStringHandle(g_pSuicide, random_num(0, g_SuicideSize - 1)));
  1297. }
  1298.  
  1299. if (g_bHattrick)
  1300. g_RKills[Victim]--;
  1301. }
  1302.  
  1303. // NORMAL DEATH
  1304. //
  1305. else
  1306. {
  1307. if (g_bKStreak)
  1308. g_Kills[Killer]++;
  1309.  
  1310. if (g_bHattrick)
  1311. g_RKills[Killer]++;
  1312.  
  1313. // WEAPON NAME
  1314. //
  1315. if (wpnID > 0)
  1316. get_weaponname(wpnID, Weapon, charsmax(Weapon));
  1317.  
  1318. // NO WEAPON
  1319. //
  1320. else
  1321. Weapon[0] = EOS;
  1322.  
  1323. if (g_bRevenge && equali(g_Name[Victim], g_RevengeStamp[Killer]))
  1324. {
  1325. g_RevengeStamp[Killer][0] = EOS;
  1326.  
  1327. if (g_bRevengeMsgKiller)
  1328. qs_ShowSyncHudMsg(Killer, g_pHudMsg[HUDMSG_EVENT], g_RevengeMsgKiller, g_Name[Victim]);
  1329.  
  1330. if (g_bRevengeMsgVictim && !g_bRevengeOnlyKiller)
  1331. qs_ShowSyncHudMsg(Victim, g_pHudMsg[HUDMSG_EVENT], g_RevengeMsgVictim, g_Name[Killer]);
  1332.  
  1333. qs_client_cmd(Killer, "SPK ^"%a^"", ArrayGetStringHandle(g_pRevenge, random_num(0, g_RevengeSize - 1)));
  1334.  
  1335. if (!g_bRevengeOnlyKiller)
  1336. qs_client_cmd(Victim, "SPK ^"%a^"", ArrayGetStringHandle(g_pRevenge, random_num(0, g_RevengeSize - 1)));
  1337. }
  1338.  
  1339. if (g_bHShot && Place == HIT_HEAD)
  1340. {
  1341. if (g_bHShotMsg)
  1342. qs_ShowSyncHudMsg(0, g_pHudMsg[HUDMSG_EVENT], g_HShotMsg, g_Name[Killer], g_Name[Victim]);
  1343.  
  1344. qs_client_cmd(g_bHShotOnlyKiller ? Killer : 0, "SPK ^"%a^"", ArrayGetStringHandle(g_pHShot, random_num(0, g_HShotSize - 1)));
  1345. }
  1346.  
  1347. if (g_bFBlood && ++g_FBlood == 1)
  1348. {
  1349. if (g_bFBloodMsg)
  1350. qs_ShowSyncHudMsg(0, g_pHudMsg[HUDMSG_EVENT], g_FBloodMsg, g_Name[Killer]);
  1351.  
  1352. qs_client_cmd(0, "SPK ^"%a^"", ArrayGetStringHandle(g_pFBlood, random_num(0, g_FBloodSize - 1)));
  1353. }
  1354.  
  1355. if (g_bTKill && TK > 0)
  1356. {
  1357. if (g_bTKillMsg)
  1358. qs_ShowSyncHudMsg(0, g_pHudMsg[HUDMSG_EVENT], g_TKillMsg, g_Name[Killer]);
  1359.  
  1360. qs_client_cmd(0, "SPK ^"%a^"", ArrayGetStringHandle(g_pTKill, random_num(0, g_TKillSize - 1)));
  1361. }
  1362.  
  1363. if (g_bGrenade && (containi(Weapon, "RECK") != -1 || containi(Weapon, "ROCK") != -1 || containi(Weapon, "MK") != -1 || \
  1364. containi(Weapon, "GRANATE") != -1 || containi(Weapon, "BOMB") != -1 || containi(Weapon, "GREN") != -1 || \
  1365. containi(Weapon, "PIAT") != -1 || containi(Weapon, "BAZOOKA") != -1 || containi(Weapon, "PANZER") != -1))
  1366. {
  1367. if (g_bGrenadeMsg)
  1368. qs_ShowSyncHudMsg(0, g_pHudMsg[HUDMSG_EVENT], g_GrenadeMsg, g_Name[Killer], g_Name[Victim]);
  1369.  
  1370. qs_client_cmd(0, "SPK ^"%a^"", ArrayGetStringHandle(g_pGrenade, random_num(0, g_GrenadeSize - 1)));
  1371. }
  1372.  
  1373. if (g_bKnife && (containi(Weapon, "KNIFE") != -1 || containi(Weapon, "SPADE") != -1 || containi(Weapon, "SATCHEL") != -1))
  1374. {
  1375. if (g_bKnifeMsg)
  1376. qs_ShowSyncHudMsg(0, g_pHudMsg[HUDMSG_EVENT], g_KnifeMsg, g_Name[Killer], g_Name[Victim]);
  1377.  
  1378. qs_client_cmd(0, "SPK ^"%a^"", ArrayGetStringHandle(g_pKnife, random_num(0, g_KnifeSize - 1)));
  1379. }
  1380.  
  1381. if (g_bDKill)
  1382. {
  1383. // GAME TIME
  1384. //
  1385. gameTime = get_gametime();
  1386.  
  1387. if (g_fLastKillTimeStamp[Killer] > gameTime)
  1388. {
  1389. if (g_bDKillMsg)
  1390. qs_ShowSyncHudMsg(0, g_pHudMsg[HUDMSG_EVENT], g_DKillMsg, g_Name[Killer], g_Name[Victim]);
  1391.  
  1392. qs_client_cmd(0, "SPK ^"%a^"", ArrayGetStringHandle(g_pDKill, random_num(0, g_DKillSize - 1)));
  1393. }
  1394.  
  1395. g_fLastKillTimeStamp[Killer] = gameTime + 0.1;
  1396. }
  1397.  
  1398. if (g_bKStreak)
  1399. {
  1400. for (Iterator = 0; Iterator < g_KStreakSoundsSize; Iterator++)
  1401. {
  1402. if (g_Kills[Killer] == ArrayGetCell(g_pKStreakRequiredKills, Iterator))
  1403. {
  1404. ArrayGetString(g_pKStreakMessages, Iterator, Message, charsmax(Message));
  1405. ArrayGetString(g_pKStreakSounds, Iterator, Sound, charsmax(Sound));
  1406.  
  1407. __Display(Killer, Message, Sound);
  1408.  
  1409. break;
  1410. }
  1411. }
  1412. }
  1413. }
  1414. }
  1415.  
  1416. // LOADS FILE
  1417. //
  1418. __Load()
  1419. {
  1420. // PREPARES CONFIGURATIONS FILE DIRECTORY
  1421. //
  1422. new File[256];
  1423. get_configsdir(File, charsmax(File));
  1424.  
  1425. // APPENDS CONFIGURATIONS FILE NAME
  1426. //
  1427. add(File, charsmax(File), "/quakesounds.ini");
  1428.  
  1429. // OPENS FILE
  1430. //
  1431. new pFile = fopen(File, "r");
  1432. if (!pFile)
  1433. return;
  1434.  
  1435. // PREPARES FILE LINE
  1436. //
  1437. new Line[512], Key[64], Value[256], Type[32], Sound[128], RequiredKills[8], Dummy[4], Message[256];
  1438.  
  1439. // READS FILE
  1440. //
  1441. while (!feof(pFile))
  1442. {
  1443. // GETS LINE
  1444. //
  1445. fgets(pFile, Line, charsmax(Line));
  1446.  
  1447. // TRIMS LINE OFF
  1448. //
  1449. trim(Line);
  1450.  
  1451. // CHECK FOR VALIDITY
  1452. //
  1453. if (Line[0] == EOS || Line[0] == ';' || Line[0] == '#' || (Line[0] == '/' && Line[1] == '/'))
  1454. continue;
  1455.  
  1456. // SPLITS STRING IN TOKENS
  1457. //
  1458. strtok(Line, Key, charsmax(Key), Value, charsmax(Value), '=');
  1459.  
  1460. // TRIMS KEY
  1461. trim(Key);
  1462.  
  1463. // TRIMS VALUE
  1464. trim(Value);
  1465.  
  1466. //
  1467. // SETTINGS
  1468. //
  1469.  
  1470. if (equali(Key, "ENABLE/DISABLE PLUGIN")) g_bON = bool:str_to_num(Value);
  1471. else if (equali(Key, "HEADSHOT ONLY KILLER")) g_bHShotOnlyKiller = bool:str_to_num(Value);
  1472. else if (equali(Key, "MIN FRAGS FOR HATTRICK")) g_MinimumKillsForHattrick = str_to_num(Value);
  1473. else if (equali(Key, "REVENGE ONLY FOR KILLER")) g_bRevengeOnlyKiller = bool:str_to_num(Value);
  1474.  
  1475. //
  1476. // HUD MESSAGES
  1477. //
  1478.  
  1479. else if (equali(Key, "HUDMSG RED"))
  1480. {
  1481. if (equal(Value, "_")) g_bRandomRed = true;
  1482. else g_Red = str_to_num(Value);
  1483. }
  1484.  
  1485. else if (equali(Key, "HUDMSG GREEN"))
  1486. {
  1487. if (equal(Value, "_")) g_bRandomGreen = true;
  1488. else g_Green = str_to_num(Value);
  1489. }
  1490.  
  1491. else if (equali(Key, "HUDMSG BLUE"))
  1492. {
  1493. if (equal(Value, "_")) g_bRandomBlue = true;
  1494. else g_Blue = str_to_num(Value);
  1495. }
  1496.  
  1497. // KILLS STREAK SOUNDS
  1498. //
  1499. else if (equali(Key, "SOUND"))
  1500. {
  1501. parse(Value, Dummy, charsmax(Dummy), Type, charsmax(Type));
  1502.  
  1503. if (equali(Type, "REQUIREDKILLS"))
  1504. {
  1505. parse(Value, Dummy, charsmax(Dummy), Type, charsmax(Type), RequiredKills, charsmax(RequiredKills), \
  1506. Dummy, charsmax(Dummy), Sound, charsmax(Sound));
  1507.  
  1508. ArrayPushString(g_pKStreakSounds, Sound);
  1509. ArrayPushCell(g_pKStreakRequiredKills, str_to_num(RequiredKills));
  1510. }
  1511.  
  1512. else if (equali(Type, "MESSAGE"))
  1513. {
  1514. strtok(Value, Type, charsmax(Type), Message, charsmax(Message), '@');
  1515. trim(Message);
  1516.  
  1517. ArrayPushString(g_pKStreakMessages, Message);
  1518. }
  1519. }
  1520.  
  1521. //
  1522. // EVENTS ON/ OFF
  1523. //
  1524.  
  1525. else if (equali(Key, "KILLSTREAK EVENT")) g_bKStreak = bool:str_to_num(Value);
  1526. else if (equali(Key, "REVENGE EVENT")) g_bRevenge = bool:str_to_num(Value);
  1527. else if (equali(Key, "HEADSHOT EVENT")) g_bHShot = bool:str_to_num(Value);
  1528. else if (equali(Key, "SUICIDE EVENT")) g_bSuicide = bool:str_to_num(Value);
  1529. else if (equali(Key, "NADE EVENT")) g_bGrenade = bool:str_to_num(Value);
  1530. else if (equali(Key, "TEAMKILL EVENT")) g_bTKill = bool:str_to_num(Value);
  1531. else if (equali(Key, "KNIFE EVENT")) g_bKnife = bool:str_to_num(Value);
  1532. else if (equali(Key, "FIRSTBLOOD EVENT")) g_bFBlood = bool:str_to_num(Value);
  1533. else if (equali(Key, "ROUNDSTART EVENT")) g_bRStart = bool:str_to_num(Value);
  1534. else if (equali(Key, "DOUBLEKILL EVENT")) g_bDKill = bool:str_to_num(Value);
  1535. else if (equali(Key, "HATTRICK EVENT")) g_bHattrick = bool:str_to_num(Value);
  1536. else if (equali(Key, "FLAWLESS VICTORY")) g_bFlawless = bool:str_to_num(Value);
  1537.  
  1538. //
  1539. // EVENT SOUNDS
  1540. //
  1541.  
  1542. else if (equali(Key, "HEADSHOT SOUNDS"))
  1543. {
  1544. while (Value[0] != EOS && strtok(Value, Key, charsmax(Key), Value, charsmax(Value), ','))
  1545. {
  1546. trim(Key), trim(Value);
  1547. ArrayPushString(g_pHShot, Key);
  1548. }
  1549. }
  1550.  
  1551. else if (equali(Key, "REVENGE SOUNDS"))
  1552. {
  1553. while (Value[0] != EOS && strtok(Value, Key, charsmax(Key), Value, charsmax(Value), ','))
  1554. {
  1555. trim(Key), trim(Value);
  1556. ArrayPushString(g_pRevenge, Key);
  1557. }
  1558. }
  1559.  
  1560. else if (equali(Key, "SUICIDE SOUNDS"))
  1561. {
  1562. while (Value[0] != EOS && strtok(Value, Key, charsmax(Key), Value, charsmax(Value), ','))
  1563. {
  1564. trim(Key), trim(Value);
  1565. ArrayPushString(g_pSuicide, Key);
  1566. }
  1567. }
  1568.  
  1569. else if (equali(Key, "NADE SOUNDS"))
  1570. {
  1571. while (Value[0] != EOS && strtok(Value, Key, charsmax(Key), Value, charsmax(Value), ','))
  1572. {
  1573. trim(Key), trim(Value);
  1574. ArrayPushString(g_pGrenade, Key);
  1575. }
  1576. }
  1577.  
  1578. else if (equali(Key, "TEAMKILL SOUNDS"))
  1579. {
  1580. while (Value[0] != EOS && strtok(Value, Key, charsmax(Key), Value, charsmax(Value), ','))
  1581. {
  1582. trim(Key), trim(Value);
  1583. ArrayPushString(g_pTKill, Key);
  1584. }
  1585. }
  1586.  
  1587. else if (equali(Key, "KNIFE SOUNDS"))
  1588. {
  1589. while (Value[0] != EOS && strtok(Value, Key, charsmax(Key), Value, charsmax(Value), ','))
  1590. {
  1591. trim(Key), trim(Value);
  1592. ArrayPushString(g_pKnife, Key);
  1593. }
  1594. }
  1595.  
  1596. else if (equali(Key, "FIRSTBLOOD SOUNDS"))
  1597. {
  1598. while (Value[0] != EOS && strtok(Value, Key, charsmax(Key), Value, charsmax(Value), ','))
  1599. {
  1600. trim(Key), trim(Value);
  1601. ArrayPushString(g_pFBlood, Key);
  1602. }
  1603. }
  1604.  
  1605. else if (equali(Key, "ROUNDSTART SOUNDS"))
  1606. {
  1607. while (Value[0] != EOS && strtok(Value, Key, charsmax(Key), Value, charsmax(Value), ','))
  1608. {
  1609. trim(Key), trim(Value);
  1610. ArrayPushString(g_pRStart, Key);
  1611. }
  1612. }
  1613.  
  1614. else if (equali(Key, "DOUBLEKILL SOUNDS"))
  1615. {
  1616. while (Value[0] != EOS && strtok(Value, Key, charsmax(Key), Value, charsmax(Value), ','))
  1617. {
  1618. trim(Key), trim(Value);
  1619. ArrayPushString(g_pDKill, Key);
  1620. }
  1621. }
  1622.  
  1623. else if (equali(Key, "HATTRICK SOUNDS"))
  1624. {
  1625. while (Value[0] != EOS && strtok(Value, Key, charsmax(Key), Value, charsmax(Value), ','))
  1626. {
  1627. trim(Key), trim(Value);
  1628. ArrayPushString(g_pHattrick, Key);
  1629. }
  1630. }
  1631.  
  1632. else if (equali(Key, "FLAWLESS SOUNDS"))
  1633. {
  1634. while (Value[0] != EOS && strtok(Value, Key, charsmax(Key), Value, charsmax(Value), ','))
  1635. {
  1636. trim(Key), trim(Value);
  1637. ArrayPushString(g_pFlawless, Key);
  1638. }
  1639. }
  1640.  
  1641. //
  1642. // MESSAGE STRINGS
  1643. //
  1644.  
  1645. else if (equali(Key, "HEADSHOT HUDMSG")) g_HShotMsg = Value;
  1646. else if (equali(Key, "SUICIDE HUDMSG")) g_SuicideMsg = Value;
  1647. else if (equali(Key, "NADE HUDMSG")) g_GrenadeMsg = Value;
  1648. else if (equali(Key, "TEAMKILL HUDMSG")) g_TKillMsg = Value;
  1649. else if (equali(Key, "KNIFE HUDMSG")) g_KnifeMsg = Value;
  1650. else if (equali(Key, "FIRSTBLOOD HUDMSG")) g_FBloodMsg = Value;
  1651. else if (equali(Key, "ROUNDSTART HUDMSG")) g_RStartMsg = Value;
  1652. else if (equali(Key, "DOUBLEKILL HUDMSG")) g_DKillMsg = Value;
  1653. else if (equali(Key, "HATTRICK HUDMSG")) g_HattrickMsg = Value;
  1654. else if (equali(Key, "FLAWLESS VICTORY HUDMSG")) g_FlawlessMsg = Value;
  1655. else if (equali(Key, "REVENGE KILLER MESSAGE")) g_RevengeMsgKiller = Value;
  1656. else if (equali(Key, "REVENGE VICTIM MESSAGE")) g_RevengeMsgVictim = Value;
  1657. else if (equali(Key, "TERRO TEAM NAME")) g_FlawlessTeamName_1 = Value;
  1658. else if (equali(Key, "CT TEAM NAME")) g_FlawlessTeamName_2 = Value;
  1659. }
  1660.  
  1661. // CLOSES
  1662. //
  1663. fclose(pFile);
  1664. }
  1665.  
  1666. // DISPLAYS KILLS STREAK GLOBALLY
  1667. //
  1668. __Display(Killer, Message[], Sound[])
  1669. {
  1670. if (g_bRandomRed) g_Red = random_num(0, QS_MAXBYTE);
  1671. if (g_bRandomGreen) g_Green = random_num(0, QS_MAXBYTE);
  1672. if (g_bRandomBlue) g_Blue = random_num(0, QS_MAXBYTE);
  1673.  
  1674. set_hudmessage(g_Red, g_Green, g_Blue, QS_CENTERPOS, 0.2215, _, _, 5.0);
  1675. qs_ShowSyncHudMsg(0, g_pHudMsg[HUDMSG_STREAK], Message, g_Name[Killer]);
  1676.  
  1677. qs_client_cmd(0, "SPK ^"%s^"", Sound);
  1678. }
  1679.  
  1680. // RETRIEVES PLAYERS COUNT
  1681. // bAlive [TRUE/ FALSE]
  1682. // Team [QS_INVALIDTEAM/ 1/ 2/ 3]
  1683. //
  1684. __Players(bool:bAlive, Team = QS_INVALIDTEAM)
  1685. {
  1686. // PLAYERS COUNT
  1687. //
  1688. new Total = 0;
  1689.  
  1690. // ITERATES BETWEEN PLAYERS
  1691. //
  1692. for (new Player = 1; Player <= g_maxPlayers; Player++)
  1693. {
  1694. // CONNECTED, NOT HLTV, IN SPECIFIED TEAM AND ALIVE/ DEAD
  1695. //
  1696. if (g_bConnected[Player] && !g_bHLTV[Player] && (Team != QS_INVALIDTEAM && \
  1697. get_user_team(Player) == Team) && bAlive == bool:is_user_alive(Player))
  1698. {
  1699. // TOTAL = TOTAL + 1
  1700. //
  1701. Total++;
  1702. }
  1703. }
  1704.  
  1705. // GETS TOTAL
  1706. //
  1707. return Total;
  1708. }
  1709.  
  1710. // RETRIEVES THE LEADER OF THIS ROUND
  1711. // RETURNS "QS_INVALIDPLR" IF THERE IS NO LEADER
  1712. //
  1713. __Leader()
  1714. {
  1715. // GETS LEADER ID READY
  1716. //
  1717. new Leader = QS_INVALIDPLR;
  1718.  
  1719. // MOST KILLS
  1720. //
  1721. new Kills = 0;
  1722.  
  1723. // ITERATES BETWEEN CLIENTS
  1724. //
  1725. for (new Client = 1; Client <= g_maxPlayers; Client++)
  1726. {
  1727. // CONNECTED AND NOT HLTV
  1728. //
  1729. if (g_bConnected[Client] && !g_bHLTV[Client])
  1730. {
  1731. // HAS MANY KILLS THAN THE ONE PREVIOUSLY CHECKED
  1732. //
  1733. if (g_RKills[Client] > Kills)
  1734. {
  1735. // THIS IS THE NEW LEADER
  1736. //
  1737. Kills = g_RKills[Client];
  1738. Leader = Client;
  1739. }
  1740. }
  1741. }
  1742.  
  1743. // GETS LEADER ID
  1744. //
  1745. return Leader;
  1746. }
  1747.  
  1748. // PROCESSES HUD MESSAGE
  1749. //
  1750. qs_ShowSyncHudMsg(Target, pObject, Rules[], any:...)
  1751. {
  1752. // ARGUMENT FORMAT
  1753. //
  1754. static Buffer[256], Player;
  1755. vformat(Buffer, charsmax(Buffer), Rules, 4);
  1756.  
  1757. // SPECIFIED CLIENT
  1758. //
  1759. if (Target > 0 && g_bConnected[Target] && !g_bBOT[Target] && !g_bHLTV[Target] && !g_bDisabled[Target])
  1760. ShowSyncHudMsg(Target, pObject, Buffer);
  1761.  
  1762. // NO TARGET
  1763. //
  1764. else if (Target < 1)
  1765. {
  1766. for (Player = 1; Player <= g_maxPlayers; Player++)
  1767. {
  1768. if (g_bConnected[Player] && !g_bBOT[Player] && !g_bHLTV[Player] && !g_bDisabled[Player])
  1769. ShowSyncHudMsg(Player, pObject, Buffer);
  1770. }
  1771. }
  1772. }
  1773.  
  1774. // PROCESSES CLIENT COMMAND
  1775. //
  1776. qs_client_cmd(Target, Rules[], any:...)
  1777. {
  1778. // ARGUMENT FORMAT
  1779. //
  1780. static Buffer[256], Player;
  1781. vformat(Buffer, charsmax(Buffer), Rules, 3);
  1782.  
  1783. // SPECIFIED CLIENT
  1784. //
  1785. if (Target > 0 && g_bConnected[Target] && !g_bBOT[Target] && !g_bHLTV[Target] && !g_bDisabled[Target])
  1786. client_cmd(Target, Buffer);
  1787.  
  1788. // NO TARGET
  1789. //
  1790. else if (Target < 1)
  1791. {
  1792. for (Player = 1; Player <= g_maxPlayers; Player++)
  1793. {
  1794. if (g_bConnected[Player] && !g_bBOT[Player] && !g_bHLTV[Player] && !g_bDisabled[Player])
  1795. client_cmd(Player, Buffer);
  1796. }
  1797. }
  1798. }
  1799.