OciXCrom

Untitled

Feb 26th, 2017
238
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pawn 84.03 KB | None | 0 0
  1. //#define USING_SQL
  2. #define ENTRY_XP            100
  3.  
  4. #define ENABLE_GRENADE          1
  5. #define ENABLE_FLASHBANG_1      1
  6. #define ENABLE_FLASHBANG_2      1
  7. #define ENABLE_SMOKEGRENADE     1
  8. #define ENABLE_TERR_HEALTH      1
  9. #define ENABLE_CT_HEALTH        1
  10. #define ENABLE_TERR_ARMOR       1
  11. #define ENABLE_CT_ARMOR         1
  12. #define ENABLE_TERR_RESPAWN     1
  13. #define ENABLE_CT_RESPAWN       1
  14. #define ENABLE_TERR_NOFALL      1
  15. #define ENABLE_CT_NOFALL        1
  16. #define ENABLE_TERR_DMG         1
  17. #define ENABLE_CT_DMG           1
  18. #define ENABLE_TERR_REGENERATION    1
  19. #define ENABLE_CT_REGENERATION      1
  20. #define ENABLE_TERR_INVISIBILITY    1
  21. #define ENABLE_CT_INVISIBILITY      1
  22.  
  23. // The maximum level for each ability
  24.  
  25. #define MAXLEVEL_GRENADE        8
  26. #define MAXLEVEL_FLASHBANG_1        4
  27. #define MAXLEVEL_FLASHBANG_2        4
  28. #define MAXLEVEL_SMOKEGRENADE       4
  29. #define MAXLEVEL_TERR_HEALTH        10
  30. #define MAXLEVEL_CT_HEALTH      8
  31. #define MAXLEVEL_TERR_ARMOR     9
  32. #define MAXLEVEL_CT_ARMOR       9
  33. #define MAXLEVEL_TERR_RESPAWN       2
  34. #define MAXLEVEL_CT_RESPAWN     2
  35. #define MAXLEVEL_TERR_NOFALL        9
  36. #define MAXLEVEL_CT_NOFALL      9
  37. #define MAXLEVEL_TERR_DMG       2
  38. #define MAXLEVEL_CT_DMG         2
  39. #define MAXLEVEL_TERR_REGENERATION  4
  40. #define MAXLEVEL_CT_REGENERATION    5
  41. #define MAXLEVEL_TERR_INVISIBILITY  8
  42. #define MAXLEVEL_CT_INVISIBILITY    6
  43.  
  44. // The xp amount required to buy the first level
  45.  
  46. #define FIRST_XP_GRENADE        100
  47. #define FIRST_XP_FLASHBANG_1        100
  48. #define FIRST_XP_FLASHBANG_2        100
  49. #define FIRST_XP_SMOKEGRENADE       100
  50. #define FIRST_XP_TERR_HEALTH        200
  51. #define FIRST_XP_CT_HEALTH      300
  52. #define FIRST_XP_TERR_ARMOR     200
  53. #define FIRST_XP_CT_ARMOR       300
  54. #define FIRST_XP_TERR_RESPAWN       3000
  55. #define FIRST_XP_CT_RESPAWN     6000
  56. #define FIRST_XP_TERR_NOFALL        400
  57. #define FIRST_XP_CT_NOFALL      500
  58. #define FIRST_XP_TERR_DMG       3000
  59. #define FIRST_XP_CT_DMG         3500
  60. #define FIRST_XP_TERR_REGENERATION  2700
  61. #define FIRST_XP_CT_REGENERATION    2700
  62. #define FIRST_XP_TERR_INVISIBILITY  5000
  63. #define FIRST_XP_CT_INVISIBILITY    5000
  64.  
  65. // The maximum chance possible for this ability (happens when player has maximum level)
  66.  
  67. #define CHANCE_MAX_GRENADE      100
  68. #define CHANCE_MAX_FLASHBANG_1      100
  69. #define CHANCE_MAX_FLASHBANG_2      100
  70. #define CHANCE_MAX_SMOKEGRENADE     100
  71. #define CHANCE_MAX_TERR_RESPAWN     50
  72. #define CHANCE_MAX_CT_RESPAWN       50
  73. #define CHANCE_MAX_TERR_NOFALL      80
  74. #define CHANCE_MAX_CT_NOFALL        80
  75. #define CHANCE_MAX_CT_DMG       50
  76. #define CHANCE_MAX_TERR_DMG     50
  77.  
  78. #include <amxmodx>
  79. #include <amxmisc>
  80. #include <cstrike>
  81. #include < fakemeta >
  82. #include <hamsandwich>
  83. #include <fun>
  84. #include <regex>
  85. #include <hlsdk_const>
  86. #include <colorchat>
  87.  
  88. #if defined USING_SQL
  89. #include <sqlx>
  90.  
  91. new Handle:g_sql_tuple;
  92. #else
  93. #include <nvault>
  94.  
  95. new g_vault;
  96. #endif
  97.  
  98. new const VERSION[] =   "0.0.1";
  99.  
  100. #pragma semicolon 1
  101.  
  102. enum _:Grenades
  103. {
  104.     NADE_HE,
  105.     NADE_FL1,
  106.     NADE_FL2,
  107.     NADE_SM
  108. };
  109.  
  110. new const g_nade_enabled[Grenades] =
  111. {
  112.     ENABLE_GRENADE,
  113.     ENABLE_FLASHBANG_1,
  114.     ENABLE_FLASHBANG_2,
  115.     ENABLE_SMOKEGRENADE
  116. };
  117.  
  118. new const g_any_nade_enabled = ENABLE_GRENADE + ENABLE_FLASHBANG_1 + ENABLE_FLASHBANG_2 + ENABLE_SMOKEGRENADE;
  119.  
  120. new const g_nade_names[Grenades][] =
  121. {
  122.     "HE Grenade",
  123.     "Flashbang #1",
  124.     "Flashbang #2",
  125.     "Frost Nade"
  126. };
  127.  
  128. new const g_nade_classnames[Grenades][] =
  129. {
  130.     "weapon_hegrenade",
  131.     "weapon_flashbang",
  132.     "weapon_flashbang",
  133.     "weapon_smokegrenade"
  134. };
  135.  
  136. new const g_nade_maxlevels[Grenades] =
  137. {
  138.     MAXLEVEL_GRENADE,
  139.     MAXLEVEL_FLASHBANG_1,
  140.     MAXLEVEL_FLASHBANG_2,
  141.     MAXLEVEL_SMOKEGRENADE
  142. };
  143.  
  144. new const g_nade_first_xp[Grenades] =
  145. {
  146.     FIRST_XP_GRENADE,
  147.     FIRST_XP_FLASHBANG_1,
  148.     FIRST_XP_FLASHBANG_2,
  149.     FIRST_XP_SMOKEGRENADE
  150. };
  151.  
  152. new const g_nade_max_chance[Grenades] =
  153. {
  154.     CHANCE_MAX_GRENADE,
  155.     CHANCE_MAX_FLASHBANG_1,
  156.     CHANCE_MAX_FLASHBANG_2,
  157.     CHANCE_MAX_SMOKEGRENADE
  158. };
  159.  
  160. new const g_team_names[CsTeams][] =
  161. {
  162.     "Spectator",
  163.     "Terrorist",
  164.     "Counter-Terrorist",
  165.     "Spectator"
  166. };
  167.  
  168. new const g_health_enabled[CsTeams] =
  169. {
  170.     0,
  171.     ENABLE_TERR_HEALTH,
  172.     ENABLE_CT_HEALTH,
  173.     0
  174. };
  175.  
  176. new const g_any_health_enabled = ENABLE_TERR_HEALTH + ENABLE_CT_HEALTH;
  177.  
  178. new iHealth[ 33 ];
  179.  
  180. new const g_health_names[CsTeams][] =
  181. {
  182.     "",
  183.     "T Extra Health",
  184.     "CT Extra Health",
  185.     ""
  186. };
  187.  
  188. new const g_health_maxamount[CsTeams] =
  189. {
  190.     0,
  191.     MAXLEVEL_TERR_HEALTH * 10,
  192.     MAXLEVEL_CT_HEALTH * 10,
  193.     0
  194. };
  195.  
  196. new const g_health_maxlevels[CsTeams] =
  197. {
  198.     0,
  199.     MAXLEVEL_TERR_HEALTH,
  200.     MAXLEVEL_CT_HEALTH,
  201.     0
  202. };
  203.  
  204. new const g_health_first_xp[CsTeams] =
  205. {
  206.     0,
  207.     FIRST_XP_TERR_HEALTH,
  208.     FIRST_XP_CT_HEALTH,
  209.     0
  210. };
  211.  
  212. new const g_armor_enabled[CsTeams] =
  213. {
  214.     0,
  215.     ENABLE_TERR_ARMOR,
  216.     ENABLE_CT_ARMOR,
  217.     0
  218. };
  219.  
  220. new const g_any_armor_enabled = ENABLE_TERR_ARMOR + ENABLE_CT_ARMOR;
  221.  
  222. new const g_armor_names[CsTeams][] =
  223. {
  224.     "",
  225.     "T Armor",
  226.     "CT Armor",
  227.     ""
  228. };
  229.  
  230. new const g_armor_maxamount[CsTeams] =
  231. {
  232.     0,
  233.     225,
  234.     225,
  235.     0
  236. };
  237.  
  238. new const g_armor_maxlevels[CsTeams] =
  239. {
  240.     0,
  241.     MAXLEVEL_TERR_ARMOR,
  242.     MAXLEVEL_CT_ARMOR,
  243.     0
  244. };
  245.  
  246. new const g_armor_first_xp[CsTeams] =
  247. {
  248.     0,
  249.     FIRST_XP_TERR_ARMOR,
  250.     FIRST_XP_CT_ARMOR,
  251.     0
  252. };
  253.  
  254. new const g_respawn_enabled[CsTeams] =
  255. {
  256.     0,
  257.     ENABLE_TERR_RESPAWN,
  258.     ENABLE_CT_RESPAWN,
  259.     0
  260. };
  261.  
  262. new const g_any_respawn_enabled = ENABLE_TERR_RESPAWN + ENABLE_CT_RESPAWN;
  263.  
  264. new const g_respawn_names[CsTeams][] =
  265. {
  266.     "",
  267.     "T Respawn Chance",
  268.     "CT Respawn Chance",
  269.     ""
  270. };
  271.  
  272. new const g_respawn_maxlevels[CsTeams] =
  273. {
  274.     0,
  275.     MAXLEVEL_TERR_RESPAWN,
  276.     MAXLEVEL_CT_RESPAWN,
  277.     0
  278. };
  279.  
  280. new const g_respawn_first_xp[CsTeams] =
  281. {
  282.     0,
  283.     FIRST_XP_TERR_RESPAWN,
  284.     FIRST_XP_CT_RESPAWN,
  285.     0
  286. };
  287.  
  288. new const g_respawn_max_chance[CsTeams] =
  289. {
  290.     0,
  291.     CHANCE_MAX_TERR_RESPAWN,
  292.     CHANCE_MAX_CT_RESPAWN,
  293.     0
  294. };
  295. ///////////////////////////////////////////
  296. new const g_nofall_enabled[CsTeams] =
  297. {
  298.     0,
  299.     ENABLE_TERR_NOFALL,
  300.     ENABLE_CT_NOFALL,
  301.     0
  302. };
  303.  
  304. new const g_any_nofall_enabled = ENABLE_TERR_NOFALL + ENABLE_CT_NOFALL;
  305.  
  306. new const g_nofall_names[CsTeams][] =
  307. {
  308.     "",
  309.     "T Fall Damage Reducer",
  310.     "CT Fall Damage Reducer",
  311.     ""
  312. };
  313.  
  314. new const g_nofall_maxlevels[CsTeams] =
  315. {
  316.     0,
  317.     MAXLEVEL_TERR_NOFALL,
  318.     MAXLEVEL_CT_NOFALL,
  319.     0
  320. };
  321.  
  322. new const g_nofall_first_xp[CsTeams] =
  323. {
  324.     0,
  325.     FIRST_XP_TERR_NOFALL,
  326.     FIRST_XP_CT_NOFALL,
  327.     0
  328. };
  329.  
  330. new const g_nofall_max_chance[CsTeams] =
  331. {
  332.     0,
  333.     CHANCE_MAX_TERR_NOFALL,
  334.     CHANCE_MAX_CT_NOFALL,
  335.     0
  336. };
  337. /////////////////////////////////////
  338. new const g_dmg_enabled[CsTeams] =
  339. {
  340.     0,
  341.     ENABLE_TERR_DMG,
  342.     ENABLE_CT_DMG,
  343.     0
  344. };
  345.  
  346. new const g_any_dmg_enabled = ENABLE_TERR_DMG + ENABLE_CT_DMG;
  347.  
  348. new const g_dmg_names[CsTeams][] =
  349. {
  350.     "",
  351.     "T Increase Damage",
  352.     "CT Increase Damage",
  353.     ""
  354. };
  355.  
  356. new const g_dmg_maxlevels[CsTeams] =
  357. {
  358.     0,
  359.     MAXLEVEL_TERR_DMG,
  360.     MAXLEVEL_CT_DMG,
  361.     0
  362. };
  363.  
  364. new const g_dmg_first_xp[CsTeams] =
  365. {
  366.     0,
  367.     FIRST_XP_TERR_DMG,
  368.     FIRST_XP_CT_DMG,
  369.     0
  370. };
  371. new const g_dmg_max_chance[CsTeams] =
  372. {
  373.     0,
  374.     CHANCE_MAX_TERR_DMG,
  375.     CHANCE_MAX_CT_DMG,
  376.     0
  377. };
  378.  
  379. new const g_regeneration_enabled[CsTeams] =
  380. {
  381.     0,
  382.     ENABLE_TERR_REGENERATION,
  383.     ENABLE_CT_REGENERATION,
  384.     0
  385. };
  386.  
  387. new const g_any_regeneration_enabled = ENABLE_TERR_REGENERATION + ENABLE_CT_REGENERATION;
  388.  
  389. new const g_regeneration_names[CsTeams][] =
  390. {
  391.     "",
  392.     "T Regeneration",
  393.     "CT Regeneration",
  394.     ""
  395. };
  396.  
  397. new const g_regeneration_maxamount[CsTeams] =
  398. {
  399.     0,
  400.     MAXLEVEL_TERR_REGENERATION * 10,
  401.     MAXLEVEL_CT_REGENERATION * 10,
  402.     0
  403. };
  404.  
  405. new const g_regeneration_maxlevels[CsTeams] =
  406. {
  407.     0,
  408.     MAXLEVEL_TERR_REGENERATION,
  409.     MAXLEVEL_CT_REGENERATION,
  410.     0
  411. };
  412.  
  413. new const g_regeneration_first_xp[CsTeams] =
  414. {
  415.     0,
  416.     FIRST_XP_TERR_REGENERATION,
  417.     FIRST_XP_CT_REGENERATION,
  418.     0
  419. };
  420.  
  421. new const g_invisibility_enabled[CsTeams] =
  422. {
  423.     0,
  424.     ENABLE_TERR_INVISIBILITY,
  425.     ENABLE_CT_INVISIBILITY,
  426.     0
  427. };
  428.  
  429. new const g_any_invisibility_enabled = ENABLE_TERR_INVISIBILITY + ENABLE_CT_INVISIBILITY;
  430.  
  431. new const g_invisibility_names[CsTeams][] =
  432. {
  433.     "",
  434.     "T Invisibility",
  435.     "CT Invisibility",
  436.     ""
  437. };
  438.  
  439. new const g_invisibility_maxamount[CsTeams] =
  440. {
  441.     0,
  442.     200,
  443.     150,
  444.     0
  445. };
  446.  
  447. new const g_invisibility_maxlevels[CsTeams] =
  448. {
  449.     0,
  450.     MAXLEVEL_TERR_INVISIBILITY,
  451.     MAXLEVEL_CT_INVISIBILITY,
  452.     0
  453. };
  454.  
  455. new const g_invisibility_first_xp[CsTeams] =
  456. {
  457.     0,
  458.     FIRST_XP_TERR_INVISIBILITY,
  459.     FIRST_XP_CT_INVISIBILITY,
  460.     0
  461. };
  462.  
  463. #define ANY_ABILITY_ENABLED (g_any_nade_enabled || g_any_health_enabled || g_any_armor_enabled || g_any_respawn_enabled || g_any_nofall_enabled || g_any_dmg_enabled || g_any_regeneration_enabled || g_any_invisibility_enabled)
  464.  
  465. #define DAMAGE_ALPHA_RESET      6
  466. #define TASK_ID_RESET           4163
  467.  
  468. #define IN_MOVEMENT         (IN_FORWARD|IN_MOVELEFT|IN_MOVERIGHT|IN_BACK)
  469.  
  470. new g_authid[33][35];
  471. new g_xp[33];
  472.  
  473. new cacheUserName[ 33 ];
  474.  
  475. new g_first_time[33];
  476. #if defined USING_SQL
  477. new g_loaded_data[33];
  478. #endif
  479.  
  480. new g_used_revive[33];
  481.  
  482. new g_nade_level[33][Grenades];
  483. new g_armor_level[33][CsTeams];
  484. new g_respawn_level[33][CsTeams];
  485. new g_health_level[33][CsTeams];
  486. new g_nofall_level[33][CsTeams];
  487. new g_dmg_level[33][CsTeams];
  488. new g_regeneration_level[ 33 ][ CsTeams ];
  489. new g_invisibility_level[ 33 ][ CsTeams ];
  490.  
  491. new g_alpha[ 33 ];
  492. new g_moving[ 33 ];
  493. new g_stop_alpha[ 33 ];
  494. new g_interval[ 33 ];
  495.  
  496. new cvar_xp_suicide;
  497. new cvar_xp_kill;
  498. new cvar_xp_headshot;
  499. new cvar_xp_grenade;
  500. new cvar_xp_survive;
  501. new cvar_xp_win;
  502. new cvar_spawn_nade_delay;
  503.  
  504. new const cfgfile_name[ ] = "hnsxp_cvars";
  505.  
  506. new bool:g_grenade_give_round[ 33 ];
  507. new bool:iRoundStarted;
  508.  
  509. new g_first_client;
  510. new g_max_clients;
  511.  
  512. #define VIP_FLAG    ADMIN_LEVEL_E
  513. new bool:iAdmin[ 33 ];
  514.  
  515. native bm_player_stealth_duration( client );
  516.  
  517. #if defined USING_SQL
  518. public plugin_precache()
  519. {
  520.     g_sql_tuple = SQL_MakeStdTuple();
  521.    
  522.     SQL_ThreadQuery(g_sql_tuple, "QueryCreateTable", "CREATE TABLE IF NOT EXISTS `hns_xp` ( `name` VARCHAR(32) NOT NULL, `authid` VARCHAR(35) NOT NULL, `data` VARCHAR(256) NOT NULL );" );
  523. }
  524.  
  525. public QueryCreateTable(failstate, Handle:query, error[], errnum, data[], size, Float:queuetime)
  526. {
  527.     if( failstate == TQUERY_CONNECT_FAILED
  528.     || failstate == TQUERY_QUERY_FAILED )
  529.     {
  530.         set_fail_state(error);
  531.     }
  532. }
  533. #endif
  534.  
  535. // Happy Hour
  536. /*new hh_start, hh_end;
  537. new bool:iHappyHourStarted;*/
  538.  
  539. public plugin_init()
  540. {
  541.     register_plugin("HideNSeek XP Mod", VERSION, "Exolent");
  542.  
  543.     register_clcmd("say /xp", "CmdMainMenu");
  544.     register_clcmd("say /exp", "CmdMainMenu");
  545.  
  546.     register_clcmd( "give_xp", "cmdGiveFunction" );
  547.     register_clcmd( "give_xp_all", "cmdGiveAllFunction" );
  548.     register_clcmd( "remove_xp", "cmdRemoveFunction" );
  549.    
  550.     register_concmd("hnsxp_give_xp", "CmdGiveXP", ADMIN_RCON, "<nick, #userid, authid> <xp>");
  551.     register_concmd("hnsxp_remove_xp", "CmdRemoveXP", ADMIN_RCON, "<nick, #userid, authid> <xp>");
  552.     register_concmd("hnsxp_giveall", "CmdGiveAllXP", ADMIN_RCON, "<xp>");
  553.    
  554.     register_event("DeathMsg", "EventDeathMsg", "a");
  555.     register_event("TextMsg", "EventRoundRestart", "a", "2&#Game_C", "2&#Game_w");
  556.    
  557.     register_logevent( "EventRoundStart", 2, "1=Round_Start" );
  558.     register_logevent("EventRoundEnd", 2, "1=Round_End");
  559.  
  560.     RegisterHam(Ham_Spawn, "player", "FwdPlayerSpawn", 1);
  561.     RegisterHam(Ham_Killed, "player", "FwdPlayerDeath", 1);
  562.     RegisterHam(Ham_TakeDamage, "player", "FwdPlayerDamage");
  563.    
  564.     register_forward(FM_CmdStart, "FwdCmdStart");
  565.     register_forward(FM_AddToFullPack, "FwdAddToFullPack", 1);
  566.    
  567.     cvar_xp_suicide = register_cvar("hnsxp_xp_suicide", "5");
  568.     cvar_xp_kill = register_cvar("hnsxp_xp_kill", "40");
  569.     cvar_xp_headshot = register_cvar("hnsxp_xp_headshot", "80");
  570.     cvar_xp_grenade = register_cvar("hnsxp_xp_grenade", "100");
  571.     cvar_xp_survive = register_cvar("hnsxp_xp_survive", "30");
  572.     cvar_xp_win = register_cvar("hnsxp_xp_win", "60");
  573.     cvar_spawn_nade_delay = register_cvar("hnsxp_spawn_nade_delay", "4");
  574.    
  575.     /*hh_start = register_cvar( "hnsxp_hh_start", "17" );
  576.     hh_end = register_cvar( "hnsxp_hh_end", "05" );*/
  577.    
  578.     #if !defined USING_SQL
  579.     g_vault = nvault_open("hnsxp");
  580.     #endif
  581.        
  582.     g_first_client = 1;
  583.     g_max_clients = get_maxplayers();
  584.    
  585.     //iHappyHourStarted = false;
  586.    
  587.     set_task( 1.0, "taskLoadConfigurationFile" );
  588. }
  589.  
  590. #if !defined USING_SQL
  591. public plugin_end()
  592. {
  593.     nvault_close(g_vault);
  594. }
  595. #endif
  596.  
  597. public plugin_natives()
  598. {
  599.     register_library("hns_xp");
  600.     register_native("hnsxp_get_user_xp", "_get_xp");
  601.     register_native("hnsxp_set_user_xp", "_set_xp");
  602.    
  603.     register_native( "hnsxp_get_user_health", "_get_health" );
  604. }
  605.  
  606. public _get_xp(plugin, params)
  607. {
  608.     return g_xp[get_param(1)];
  609. }
  610.  
  611. public _set_xp(plugin, params)
  612. {
  613.     new client = get_param(1);
  614.     g_xp[client] = max(0, get_param(2));
  615.     Save(client);
  616.     return g_xp[client];
  617. }
  618.  
  619. public _get_health(plugin, params) { return iHealth[get_param(1)]; }
  620.  
  621. public client_authorized(client)
  622. {
  623.     iAdmin[ client ] = ( get_user_flags( client ) & VIP_FLAG ) ? true : false;
  624.    
  625.     if( !is_user_bot(client) && !is_user_hltv(client) )
  626.     {
  627.         get_user_name(client, g_authid[client], sizeof(g_authid[]) - 1);
  628.         Load(client);
  629.     }
  630. }
  631.  
  632. public client_disconnect(client)
  633. {
  634.     Save(client);
  635.    
  636.     iAdmin[ client ] = false;
  637.    
  638.     g_alpha[client] = 255;
  639.     g_moving[client] = 0;
  640.     remove_task(TASK_ID_RESET + client);
  641.    
  642.     g_authid[client][0] = 0;
  643.     g_first_time[client] = 0;
  644.     #if defined USING_SQL
  645.     g_loaded_data[client] = 0;
  646.     #endif
  647.     g_used_revive[client] = 0;
  648. }
  649.  
  650. public client_putinserver( client )
  651. {
  652.     if( iRoundStarted ) g_grenade_give_round[ client ] = true;
  653. }
  654.  
  655. public CmdMainMenu(client)
  656. {
  657.     ShowMainMenu(client);
  658. }
  659.  
  660. public CmdGiveAllXP( client, level, cid )
  661. {
  662.     if( !cmd_access( client, level, cid, 2 ) ) return PLUGIN_HANDLED;
  663.    
  664.     new arg[ 32 ];
  665.     read_argv( 1, arg, charsmax( arg ) );
  666.  
  667.     if( str_to_num( arg ) <= 0 ) return PLUGIN_HANDLED;
  668.    
  669.     new iPlayers[ 32 ], iNum;
  670.     get_players( iPlayers, iNum, "ch" );
  671.    
  672.     for( new i; i < iNum; i++ )
  673.     {
  674.         g_xp[ iPlayers[i] ] += str_to_num( arg );
  675.         BlindPlayer( iPlayers[i], 1.0, 1.0, 0, 255, 0, 120 );
  676.         Save( iPlayers[i] );
  677.     }
  678.        
  679.     new name[ 33 ];
  680.     get_user_name( client, name, charsmax( name ) );
  681.  
  682.     ColorChat( 0, GREEN, "[BetterPlay]^1 ADMIN:^3 %s^1 give^4 %d^1 XP to^3 All Players.", name, str_to_num( arg ) );
  683.    
  684.     return PLUGIN_HANDLED;
  685. }
  686.  
  687. public CmdGiveXP(client, level, cid)
  688. {
  689.     if( !cmd_access(client, level, cid, 3) ) return PLUGIN_HANDLED;
  690.    
  691.     static arg[35];
  692.     read_argv(1, arg, charsmax( arg ) );
  693.    
  694.     new target = cmd_target(client, arg, CMDTARGET_NO_BOTS);
  695.     if( !target ) return PLUGIN_HANDLED;
  696.    
  697.     if( !IsUserAuthorized(target) )
  698.     {
  699.         console_print(client, "Target has not authorized with the server.");
  700.         return PLUGIN_HANDLED;
  701.     }
  702.    
  703.     read_argv(2, arg, sizeof(arg) - 1);
  704.     new xp = str_to_num(arg);
  705.    
  706.     if( xp <= 0 )
  707.     {
  708.         console_print(client, "XP must be a value greater than 0!");
  709.         if( xp < 0 )
  710.         {
  711.             console_print(client, "Use hnsxp_remove_xp instead.");
  712.         }
  713.         return PLUGIN_HANDLED;
  714.     }
  715.    
  716.     g_xp[target] += xp;
  717.     BlindPlayer( target, 1.0, 1.0, 0, 255, 0, 120 );
  718.    
  719.     Save(target);
  720.    
  721.     static name[2][32];
  722.     get_user_name(client, name[0], sizeof(name[]) - 1);
  723.     get_user_name(target, name[1], sizeof(name[]) - 1);
  724.    
  725.     ColorChat(0, GREEN, "^4[BetterPlay] ^3%s ^1gave ^4%i ^1XP to ^3%s.", name[0], xp, name[1]);
  726.    
  727.     return PLUGIN_HANDLED;
  728. }
  729.  
  730. public CmdRemoveXP(client, level, cid)
  731. {
  732.     if( !cmd_access(client, level, cid, 3) ) return PLUGIN_HANDLED;
  733.    
  734.     static arg[35];
  735.     read_argv(1, arg, charsmax( arg ) );
  736.    
  737.     new target = cmd_target(client, arg, CMDTARGET_NO_BOTS);
  738.     if( !target ) return PLUGIN_HANDLED;
  739.    
  740.     if( !IsUserAuthorized(target) )
  741.     {
  742.         console_print(client, "Target has not authorized with the server.");
  743.         return PLUGIN_HANDLED;
  744.     }
  745.    
  746.     read_argv(2, arg, sizeof(arg) - 1);
  747.     new xp = str_to_num(arg);
  748.    
  749.     if( xp <= 0 )
  750.     {
  751.         console_print(client, "XP must be a value greater than 0!");
  752.         if( xp < 0 )
  753.         {
  754.             console_print(client, "Use hnsxp_give_xp instead.");
  755.         }
  756.         return PLUGIN_HANDLED;
  757.     }
  758.    
  759.     g_xp[target] -= xp;
  760.     BlindPlayer( target, 1.0, 1.0, 255, 0, 0, 120 );
  761.    
  762.     Save(target);
  763.    
  764.     static name[2][32];
  765.     get_user_name(client, name[0], sizeof(name[]) - 1);
  766.     get_user_name(target, name[1], sizeof(name[]) - 1);
  767.    
  768.     ColorChat(0, GREEN, "^4[BetterPlay] ^3%s ^1removed ^4%i ^1XP from ^3%s.", name[0], xp, name[1]);
  769.  
  770.     return PLUGIN_HANDLED;
  771. }
  772.  
  773. public EventDeathMsg()
  774. {
  775.     new killer = read_data(1);
  776.     new victim = read_data(2);
  777.    
  778.     if( (g_first_client <= killer <= g_max_clients) && victim != killer )
  779.     {
  780.         if( IsUserAuthorized(killer) )
  781.         {
  782.             if( is_user_connected( killer ) && is_user_alive( killer ) )
  783.             {
  784.                 new CsTeams:team = cs_get_user_team( killer );
  785.                 new regeneration = g_regeneration_maxamount[ team ] * g_regeneration_level[ killer ][ team ] / g_regeneration_maxlevels[ team ];
  786.                
  787.                 if( regeneration )
  788.                 {
  789.                     set_user_health( killer, get_user_health( killer ) + regeneration );
  790.                     BlindPlayer( killer, 0.8, 0.8, 255, 0, 0, 100 );
  791.                 }
  792.             }
  793.            
  794.             new weapon[ 20 ], name[ 33 ];
  795.             read_data( 4, weapon, sizeof( weapon ) - 1 );
  796.             get_user_name( victim, name, charsmax( name ) );
  797.            
  798.             /*new iTime[ 3 ]
  799.             get_time( "%H", iTime, charsmax( iTime ) );
  800.            
  801.             new get_hour = str_to_num( iTime );
  802.             new get_start = get_pcvar_num( hh_start );
  803.             new get_end = get_pcvar_num( hh_end );
  804.        
  805.             if( get_start < get_end ? ( get_start <= get_hour && get_hour < get_end ) : ( get_start <= get_hour || get_hour < get_end ) )
  806.             {
  807.                 // regular kill
  808.                 new xp = get_pcvar_num(cvar_xp_kill) * 2;
  809.            
  810.                 if( read_data(3) )
  811.                 {
  812.                     // headshot kill
  813.                     xp += get_pcvar_num(cvar_xp_headshot) * 2; 
  814.                 }
  815.                 else
  816.                 {
  817.                     if( contain(weapon, "grenade") >= 0 )
  818.                     {
  819.                         // grenade kill (or frostnade)
  820.                         xp += get_pcvar_num(cvar_xp_grenade) * 2;
  821.                     }
  822.                 }
  823.                                
  824.                 new reward;            
  825.                 if( iAdmin[ killer ] )
  826.                 {
  827.                     reward = xp + xp;
  828.                 }
  829.                 else
  830.                 {
  831.                     reward = xp;
  832.                 }
  833.                
  834.                 g_xp[killer] += reward;
  835.                
  836.                 new msg[ 128 ];
  837.                 iAdmin[ killer ] ? formatex( msg, sizeof( msg ) - 1, " (Bonus:^3 %d^4 XP^1 for^4 VIP^3 Users^1)", xp ) : formatex( msg, sizeof( msg ) - 1, " (buy^3 VIP^1 to get^4 more^3 XP^1)" );
  838.  
  839.                 ColorChat(killer, GREEN, "^4[BetterPlay] ^1You gained ^3%i ^1XP for killing ^4%s^1 (^3happyhour^1)%s", reward, name, msg );
  840.             }
  841.             else
  842.             {*/
  843.             // regular kill
  844.             new xp = get_pcvar_num(cvar_xp_kill);
  845.            
  846.             if( read_data(3) )
  847.             {
  848.                 // headshot kill
  849.                 xp += get_pcvar_num(cvar_xp_headshot);
  850.             }
  851.             else
  852.             {
  853.                 if( contain(weapon, "grenade") >= 0 )
  854.                 {
  855.                     // grenade kill (or frostnade)
  856.                     xp += get_pcvar_num(cvar_xp_grenade);
  857.                 }
  858.             }
  859.            
  860.             new reward;            
  861.             if( iAdmin[ killer ] )
  862.             {
  863.                 reward = xp + xp;
  864.             }
  865.             else
  866.             {
  867.                 reward = xp;
  868.             }
  869.            
  870.             g_xp[killer] += reward;
  871.            
  872.             new msg[ 128 ];
  873.             iAdmin[ killer ] ? formatex( msg, sizeof( msg ) - 1, " (Bonus:^3 %d^4 XP^1 for^4 VIP^3 Users^1)", xp ) : formatex( msg, sizeof( msg ) - 1, " (buy^3 VIP^1 to get^4 more^3 XP^1)" );
  874.  
  875.             ColorChat(killer, GREEN, "^4[BetterPlay] ^1You gained ^3%i ^1XP for killing ^4%s^1!%s", reward, name, msg );
  876.             //}
  877.            
  878.             Save(killer);
  879.         }
  880.     }
  881.     else if( IsUserAuthorized(victim) )
  882.     {
  883.         // victim died of map causes or killed self
  884.         new xp = get_pcvar_num(cvar_xp_suicide);
  885.        
  886.         g_xp[victim] -= xp;
  887.        
  888.         ColorChat(victim, GREEN, "^4[BetterPlay] ^1You lost ^3%i ^1XP!", xp);
  889.        
  890.         Save(victim);
  891.     }
  892. }
  893.  
  894. public EventRoundRestart( )
  895. {
  896.     //remove_task(1234);
  897.     remove_task(1223);
  898.     arrayset( g_grenade_give_round, false, charsmax( g_grenade_give_round ) );
  899. }
  900.    
  901. public EventRoundStart( )
  902. {
  903.     for( new client = g_first_client; client <= g_max_clients; client++ )
  904.     {
  905.         if( is_user_alive( client ) && is_user_connected( client ) )
  906.         {
  907.             set_task( get_pcvar_float( cvar_spawn_nade_delay ), "TaskGiveNades", client );
  908.             set_task( 1.0, "taskSet", client );
  909.         }
  910.     }
  911.  
  912.     iRoundStarted = true;
  913.    
  914.     /*new iTime[ 3 ], iHour;
  915.     get_time( "%H", iTime, charsmax( iTime ) );
  916.     iHour = str_to_num( iTime );
  917.    
  918.     if( !iHappyHourStarted )
  919.     {
  920.         if( iHour == get_pcvar_num( hh_start ) )
  921.         {
  922.             iHappyHourStarted = true;
  923.            
  924.             ColorChat( 0, GREEN, "[BetterPlay]^3 Happy Hour^1 Stared!" );
  925.             ColorChat( 0, GREEN, "[BetterPlay]^3 All players^1 will gain^4 double XP^3 now!" );
  926.         }
  927.     }
  928.     else
  929.     {
  930.         if( iHour == get_pcvar_num( hh_end ) )
  931.         {
  932.             iHappyHourStarted = false;
  933.            
  934.             ColorChat( 0, GREEN, "[BetterPlay]^3 Happy Hour^1 Ended!" );
  935.             ColorChat( 0, GREEN, "[BetterPlay]^3 All players^1 will gain^4 normal XP^3 now!" );
  936.         }
  937.     }*/
  938. }
  939.  
  940. public taskSet( client ) { if( is_user_connected( client ) ) { g_grenade_give_round[ client ] = true; } }
  941.  
  942. public TaskGiveNades( client )
  943. {
  944.     if( !is_user_connected( client ) || !is_user_alive( client ) ) return PLUGIN_HANDLED;
  945.    
  946.     new CsTeams:team = cs_get_user_team(client);
  947.     if( team == CS_TEAM_T )
  948.     {
  949.         static percent;
  950.         for( new i = 0; i < Grenades; i++ )
  951.         {
  952.             if( g_nade_enabled[i] )
  953.             {
  954.                 percent = g_nade_max_chance[i] * g_nade_level[client][i] / g_nade_maxlevels[i];
  955.                 if( percent > 0 && (percent == 100 || random_num(1, 100) <= percent) )
  956.                 {
  957.                     give_item(client, g_nade_classnames[i]);
  958.                     if( percent < 100 ) ColorChat( client, GREEN, "[BetterPlay]^1 You received your^3 %s^1! ^3(^4%i%%^1 chance^3)", g_nade_names[i], percent); 
  959.                 }
  960.             }
  961.         }
  962.     }
  963.    
  964.     return PLUGIN_CONTINUE;
  965. }
  966.  
  967. public EventRoundEnd()
  968. {
  969.     new hider, seeker, hider_alive;
  970.     arrayset( g_grenade_give_round, false, charsmax( g_grenade_give_round ) );
  971.     iRoundStarted = false;
  972.    
  973.     for( new i = g_first_client; i <= g_max_clients; i++ )
  974.     {
  975.         if( is_user_connected(i) )
  976.         {
  977.             switch( cs_get_user_team(i) )
  978.             {
  979.                 case CS_TEAM_CT:
  980.                 {
  981.                     if( !seeker )
  982.                     {
  983.                         seeker = i;
  984.                     }
  985.                 }
  986.                 case CS_TEAM_T:
  987.                 {
  988.                     if( !hider )
  989.                     {
  990.                         hider = i;
  991.                        
  992.                         if( !hider_alive && is_user_alive(i) )
  993.                         {
  994.                             hider_alive = i;
  995.                         }
  996.                     }
  997.                 }
  998.             }
  999.            
  1000.             if( seeker && hider && hider_alive )
  1001.             {
  1002.                 break;
  1003.             }
  1004.         }
  1005.     }
  1006.    
  1007.     if( !hider || !seeker )
  1008.     {
  1009.         return;
  1010.     }
  1011.    
  1012.     new CsTeams:winner = CS_TEAM_CT;
  1013.    
  1014.     if( hider_alive )
  1015.     {
  1016.         winner = CS_TEAM_T;
  1017.        
  1018.         new survive = get_pcvar_num(cvar_xp_survive);
  1019.         for( new client = g_first_client; client <= g_max_clients; client++ )
  1020.         {
  1021.             if( IsUserAuthorized(client) && is_user_alive(client) && cs_get_user_team(client) == CS_TEAM_T )
  1022.             {
  1023.                 g_xp[client] += survive;
  1024.                 Save(client);
  1025.                
  1026.                 ColorChat(client, GREEN, "^4[BetterPlay] ^1You gained ^3%i ^1XP for surviving!", survive);
  1027.             }
  1028.         }
  1029.     }
  1030.    
  1031.     new win = get_pcvar_num(cvar_xp_win);
  1032.     for( new client = g_first_client; client <= g_max_clients; client++ )
  1033.     {
  1034.         if( IsUserAuthorized(client) && is_user_alive(client) && cs_get_user_team(client) == winner )
  1035.         {
  1036.             g_xp[client] += win;
  1037.             Save(client);
  1038.            
  1039.             ColorChat(client, GREEN, "^4[BetterPlay] ^1You gained ^3%i ^1XP for winning the round!", win);
  1040.         }
  1041.     }
  1042. }
  1043.    
  1044. public FwdPlayerSpawn(client)
  1045. {
  1046.     if( is_user_alive(client) )
  1047.     {
  1048.         new CsTeams:team = cs_get_user_team(client);
  1049.         if( team == CS_TEAM_T || team == CS_TEAM_CT )
  1050.         {
  1051.             if( g_first_time[client] )
  1052.             {
  1053.                 ColorChat(client, GREEN, "^4[BetterPlay] ^1It is your first time playing this HideNSeek XP mod, so you are rewarded with %i XP!", ENTRY_XP);
  1054.                 ColorChat(client, GREEN, "^4[BetterPlay] ^1You earn XP based upon your gameplay, and you can buy more levels in the menu.");
  1055.                 ColorChat(client, GREEN, "^4[BetterPlay] ^1Type ^3/xp ^1to view what you can get!");
  1056.                
  1057.                 g_first_time[client] = 0;
  1058.             }
  1059.             else
  1060.             {
  1061.                 if( g_health_enabled[team] )
  1062.                 {
  1063.                     iHealth[ client ] = g_health_maxamount[team] * g_health_level[client][team] / g_health_maxlevels[team];
  1064.                    
  1065.                     if( iHealth[ client ] )
  1066.                     {
  1067.                         set_user_health(client, get_user_health(client) + iHealth[ client ] );
  1068.                         ColorChat( client, GREEN, "[BetterPlay]^1 You got^3 %i HP^1 for having^3 %s^1 Level^4 %i^1!", iHealth[ client ], g_health_names[ team ], g_health_level[ client ][ team ] );
  1069.                     }
  1070.                 }
  1071.                
  1072.                 if( g_armor_enabled[team] )
  1073.                 {
  1074.                     new armorvalue = g_armor_maxamount[team] * g_armor_level[client][team] / g_armor_maxlevels[team];
  1075.                     if( armorvalue == 0 )
  1076.                     {
  1077.                         cs_set_user_armor(client, armorvalue, CS_ARMOR_NONE);
  1078.                     }
  1079.                     else if( armorvalue < 100 )
  1080.                     {
  1081.                         cs_set_user_armor(client, armorvalue, CS_ARMOR_KEVLAR);
  1082.                     }
  1083.                     else
  1084.                     {
  1085.                         cs_set_user_armor(client, armorvalue, CS_ARMOR_VESTHELM);
  1086.                     }
  1087.                 }
  1088.                
  1089.                 if( g_invisibility_enabled[ team ] )
  1090.                 {
  1091.                     new alpha = g_invisibility_maxamount[ team ] * g_invisibility_level[ client ][ team ] / g_invisibility_maxlevels[ team ];
  1092.                    
  1093.                     g_alpha[client] = 255 - alpha;
  1094.                     g_moving[client] = 1;
  1095.                     remove_task(TASK_ID_RESET + client);
  1096.                 }
  1097.                
  1098.                 if( g_grenade_give_round[ client ] ) set_task( 1.0, "TaskGiveNades", client );
  1099.             }
  1100.         }
  1101.     }
  1102. }
  1103.  
  1104. public FwdPlayerDeath(client, killer, shouldgib)
  1105. {
  1106.     if( !g_used_revive[client] )
  1107.     {
  1108.         new CsTeams:team = cs_get_user_team(client);
  1109.         if( team == CS_TEAM_T || team == CS_TEAM_CT )
  1110.         {
  1111.             if( g_respawn_enabled[team] )
  1112.             {
  1113.                 new percent = g_respawn_max_chance[team] * g_respawn_level[client][team] / g_respawn_maxlevels[team];
  1114.                 if( random_num(1, 100) <= percent )
  1115.                 {
  1116.                     if( HasTeammateAlive(client, team) && team != CS_TEAM_SPECTATOR )
  1117.                     {
  1118.                         set_task(1.0, "TaskRespawn", client);
  1119.                         g_used_revive[client] = 1;
  1120.                        
  1121.                         ColorChat(client, GREEN, "^4[BetterPlay] ^1You have been respawned! ^4(%i%% chance)", percent);        
  1122.                     }
  1123.                 }
  1124.             }
  1125.         }
  1126.     }
  1127.    
  1128.     g_alpha[client] = 255;
  1129.     g_moving[client] = 0;
  1130.     remove_task(TASK_ID_RESET + client);
  1131. }
  1132.  
  1133. public FwdPlayerDamage(client, inflictor, attacker, Float:damage, damagebits)
  1134. {
  1135.     if( is_user_alive(client) && is_user_connected( client ) )
  1136.     {
  1137.         new CsTeams:team = cs_get_user_team(client);
  1138.         if( team == CS_TEAM_T || team == CS_TEAM_CT )
  1139.         {
  1140.             if( damagebits & DMG_FALL )
  1141.             {  
  1142.                 if( g_nofall_enabled[team] )
  1143.                 {
  1144.                     new percent = g_nofall_max_chance[team] * g_nofall_level[client][team] / g_nofall_maxlevels[team];
  1145.                     new Float:reduction = float(floatround((damage * float(percent) / 100.0), floatround_floor));
  1146.                    
  1147.                     SetHamParamFloat(4, damage - reduction);
  1148.                    
  1149.                     if( percent > 0 )
  1150.                     {
  1151.                         set_hudmessage( 0, 127, 255, -1.0, 0.35, 0, 3.0, 3.0, 0.1, 0.2, 4 );
  1152.                         show_hudmessage( client, "Fall Damage Reducer^nLevel %i^n^nInitial Damage: %.1f^nDamage Taken: %.1f", g_nofall_level[ client ][ team ], damage, ( damage - reduction ) );
  1153.                     }
  1154.                 }
  1155.             }
  1156.            
  1157.             if( g_invisibility_enabled[ team ] )
  1158.             {
  1159.                 new alpha = g_invisibility_maxamount[ team ] * g_invisibility_level[ client ][ team ] / g_invisibility_maxlevels[ team ];
  1160.                
  1161.                 if( alpha > 0 )
  1162.                 {
  1163.                     g_alpha[client] = 255;
  1164.                     g_interval[client] = 0;
  1165.                     g_stop_alpha[client] = alpha;
  1166.                    
  1167.                     remove_task(TASK_ID_RESET + client);
  1168.                     set_task(1.0, "TaskResetAlpha", (TASK_ID_RESET + client));
  1169.                 }
  1170.             }
  1171.         }
  1172.     }
  1173.    
  1174.     if( is_user_alive( attacker ) && is_user_connected( attacker ) )
  1175.     {
  1176.         new CsTeams:team = cs_get_user_team(attacker);
  1177.         if( team == CS_TEAM_T || team == CS_TEAM_CT )
  1178.         {  
  1179.             if( g_dmg_enabled[ team ] )
  1180.             {
  1181.                 new percent = g_dmg_max_chance[ team ] * g_dmg_level[ attacker ][ team ] / g_dmg_maxlevels[ team ];
  1182.                 if( ( 1 <= attacker <= g_max_clients ) && random_num( 1, 100 ) <= percent )
  1183.                 {
  1184.                     SetHamParamFloat( 4, damage * ( float( percent ) / 39.0 ) );
  1185.                 }
  1186.             }
  1187.         }
  1188.     }
  1189. }
  1190.    
  1191. public RemoveXPInvisibility( client )
  1192. {
  1193.     new CsTeams:team = cs_get_user_team(client);
  1194.     if( team == CS_TEAM_T || team == CS_TEAM_CT )
  1195.     {
  1196.         if( g_invisibility_enabled[ team ] )
  1197.         {
  1198.             new alpha = g_invisibility_maxamount[ team ] * g_invisibility_level[ client ][ team ] / g_invisibility_maxlevels[ team ];
  1199.                
  1200.             if( alpha > 0 )
  1201.             {
  1202.                 g_alpha[client] = 255;
  1203.                 g_interval[client] = 0;
  1204.                 g_stop_alpha[client] = alpha;
  1205.                    
  1206.                 remove_task(TASK_ID_RESET + client);
  1207.                
  1208.                 new iTime = bm_player_stealth_duration( client );
  1209.                 set_task(float(iTime), "TaskResetAlpha", (TASK_ID_RESET + client));
  1210.             }
  1211.         }
  1212.     }
  1213. }
  1214.    
  1215. public TaskRespawn(client)
  1216. {
  1217.     if( !is_user_connected( client ) ) return PLUGIN_HANDLED;
  1218.    
  1219.     new CsTeams:team = cs_get_user_team( client );
  1220.     if( team == CS_TEAM_T || team == CS_TEAM_CT )
  1221.     {
  1222.         ExecuteHamB(Ham_CS_RoundRespawn, client);
  1223.     }
  1224.    
  1225.     return PLUGIN_CONTINUE;
  1226. }
  1227.  
  1228. HasTeammateAlive(client, CsTeams:team)
  1229. {
  1230.     for( new i = g_first_client; i <= g_max_clients; i++ )
  1231.     {
  1232.         if( i == client ) continue;
  1233.        
  1234.         if( is_user_alive(i) && cs_get_user_team(i) == team )
  1235.         {
  1236.             return 1;
  1237.         }
  1238.     }
  1239.    
  1240.     return 0;
  1241. }
  1242.  
  1243. public TaskResetAlpha(taskid)
  1244. {
  1245.     new client = taskid - TASK_ID_RESET;
  1246.    
  1247.     if( ++g_interval[client] <= DAMAGE_ALPHA_RESET )
  1248.     {
  1249.         g_alpha[client] = 255 - g_stop_alpha[ client ] * g_interval[ client ] / DAMAGE_ALPHA_RESET;
  1250.  
  1251.         if( g_interval[client] < DAMAGE_ALPHA_RESET )
  1252.         {
  1253.             set_task(1.0, "TaskResetAlpha", (TASK_ID_RESET + client));
  1254.         }
  1255.     }
  1256. }
  1257.  
  1258. public FwdCmdStart(client, uc_handle, random_seed)
  1259. {
  1260.     if( is_user_alive(client) )
  1261.     {
  1262.         new buttons = get_uc(uc_handle, UC_Buttons);
  1263.         g_moving[client] = ( buttons & IN_MOVEMENT || (buttons & IN_JUMP) && !(pev(client, pev_oldbuttons) & IN_JUMP) );
  1264.     }
  1265. }
  1266.  
  1267. public FwdAddToFullPack(es, e, ent, host, host_flags, player, pSet)
  1268. {
  1269.     if( player )
  1270.     {
  1271.         if( g_alpha[ent] != 255 && cs_get_user_team(ent) != cs_get_user_team(host) )
  1272.         {
  1273.             set_es(es, ES_RenderMode, kRenderTransAdd);
  1274.             set_es(es, ES_RenderAmt, g_alpha[ent] / (g_moving[ent] + 1));
  1275.         }
  1276.     }
  1277. }
  1278.  
  1279. ShowMainMenu(client)
  1280. {
  1281.     static title[128];
  1282.     formatex(title, sizeof(title) - 1, "[BetterPlay XP Mod]^nMain Menu^n^nYour XP: \w%i^n\yPage\d:\r", g_xp[client]);
  1283.     new menu = menu_create(title, "MenuMain");
  1284.    
  1285.     new iText[ 64 ];
  1286.     formatex( iText, sizeof( iText ) - 1, "\yHelp%s", get_user_flags( client ) & ADMIN_RCON ? "" : "^n" );
  1287.     menu_additem(menu, iText, "*");
  1288.    
  1289.     if( get_user_flags( client ) & ADMIN_RCON )
  1290.     {
  1291.         menu_additem( menu, "\yAdmin \wMenu^n", "1");
  1292.     }
  1293.     if( g_any_nade_enabled )
  1294.     {
  1295.         menu_additem(menu, "\yGrenades \wMenu", "2");
  1296.     }
  1297.     if( g_any_health_enabled )
  1298.     {
  1299.         menu_additem(menu, "\yHealth \wMenu", "3");
  1300.     }
  1301.     if( g_any_armor_enabled )
  1302.     {
  1303.         menu_additem(menu, "\yArmor \wMenu", "4");
  1304.     }
  1305.     if( g_any_respawn_enabled )
  1306.     {
  1307.         menu_additem(menu, "\yRespawn \wMenu", "5");
  1308.     }
  1309.     if( g_any_nofall_enabled )
  1310.     {
  1311.         menu_additem(menu, "\yFall Damage \wMenu", "6");
  1312.     }
  1313.     if( g_any_dmg_enabled )
  1314.     {
  1315.         menu_additem( menu, "\yIncrease Damage \wMenu", "7");
  1316.     }
  1317.    
  1318.     if( g_any_regeneration_enabled )
  1319.     {
  1320.         menu_additem( menu, "\yRegeneration \wMenu", "8");
  1321.     }
  1322.    
  1323.     if( g_any_invisibility_enabled )
  1324.     {
  1325.         menu_additem( menu, "\yInvisibility \wMenu^n", "9");
  1326.     }
  1327.  
  1328.     if( ANY_ABILITY_ENABLED )
  1329.     {
  1330.         menu_additem(menu, "\yPlayer \wInfo", "=", ADMIN_IMMUNITY);
  1331.     }
  1332.    
  1333.     menu_display(client, menu);
  1334. }
  1335.  
  1336. public MenuMain(client, menu, item)
  1337. {
  1338.     if( item == MENU_EXIT )
  1339.     {
  1340.         menu_destroy(menu);
  1341.         return;
  1342.     }
  1343.    
  1344.     static _access, info[4], callback;
  1345.     menu_item_getinfo(menu, item, _access, info, sizeof(info) - 1, _, _, callback);
  1346.     menu_destroy(menu);
  1347.    
  1348.     switch( info[0] )
  1349.     {
  1350.         case '*':
  1351.         {
  1352.             static motd[2500];
  1353.             new len = formatex(motd, sizeof(motd) - 1,  "<body style=^"background-color:#030303; color:#FF8F00^">");
  1354.             len += format(motd[len], sizeof(motd) - len - 1,    "<p align=^"center^">");
  1355.             len += format(motd[len], sizeof(motd) - len - 1,    "HideNSeek XP Mod is an experienced based addon for HideNSeek.<br>");
  1356.             len += format(motd[len], sizeof(motd) - len - 1,    "Players earn experience points by how well they play the game.<br>");
  1357.             len += format(motd[len], sizeof(motd) - len - 1,    "<br>");
  1358.             len += format(motd[len], sizeof(motd) - len - 1,    "<table border=0>");
  1359.             len += format(motd[len], sizeof(motd) - len - 1,    "<tr><th>Action</th><th>XP</th></tr>");
  1360.             len += format(motd[len], sizeof(motd) - len - 1,    "<tr><td>Kill</td><td>+%i</td></tr>", get_pcvar_num(cvar_xp_kill));
  1361.             len += format(motd[len], sizeof(motd) - len - 1,    "<tr><td>Grenade</td><td>+%i</td></tr>", get_pcvar_num(cvar_xp_grenade));
  1362.             len += format(motd[len], sizeof(motd) - len - 1,    "<tr><td>Headshot</td><td>+%i</td></tr>", get_pcvar_num(cvar_xp_headshot));
  1363.             len += format(motd[len], sizeof(motd) - len - 1,    "<tr><td>Suicide</td><td>-%i</td></tr>", get_pcvar_num(cvar_xp_suicide));
  1364.             len += format(motd[len], sizeof(motd) - len - 1,    "<tr><td>Survive as a T</td><td>+%i</td></tr>", get_pcvar_num(cvar_xp_survive));
  1365.             len += format(motd[len], sizeof(motd) - len - 1,    "<tr><td>Win Round</td><td>+%i</td></tr>", get_pcvar_num(cvar_xp_win));
  1366.             len += format(motd[len], sizeof(motd) - len - 1,    "</table>");
  1367.             len += format(motd[len], sizeof(motd) - len - 1,    "With these XP points, you can buy upgrades.<br>");
  1368.             len += format(motd[len], sizeof(motd) - len - 1,    "For a list of these upgrades, type /xp again and view the other menus inside.");
  1369.             len += format(motd[len], sizeof(motd) - len - 1,    "</p>");
  1370.             len += format(motd[len], sizeof(motd) - len - 1,    "</body>");
  1371.            
  1372.             show_motd(client, motd, "HideNSeek XP Mod Info");
  1373.         }
  1374.         case '1':
  1375.         {
  1376.             ShowAdminMenu(client);
  1377.         }
  1378.         case '2':
  1379.         {
  1380.             ShowGrenadesMenu(client);
  1381.         }
  1382.         case '3':
  1383.         {
  1384.             ShowHealthMenu(client);
  1385.         }
  1386.         case '4':
  1387.         {
  1388.             ShowArmorMenu(client);
  1389.         }
  1390.         case '5':
  1391.         {
  1392.             ShowRespawnMenu(client);
  1393.         }
  1394.         case '6':
  1395.         {
  1396.             ShowNoFallMenu(client);
  1397.         }
  1398.         case '7':
  1399.         {
  1400.             ShowDamageMenu(client);
  1401.         }
  1402.         case '8':
  1403.         {
  1404.             ShowRegenerationMenu( client );
  1405.         }
  1406.         case '9':
  1407.         {
  1408.             ShowInvisibilityMenu( client );
  1409.         }
  1410.         case '=':
  1411.         {
  1412.             ShowPlayerMenu(client);
  1413.         }
  1414.     }
  1415. }
  1416.  
  1417. ShowAdminMenu( client )
  1418. {
  1419.     new title[ 128 ];
  1420.     formatex( title, sizeof( title ) - 1, "[BetterPlay XP Mod]^nAdmin Menu^n^nYour XP: \w%i", g_xp[ client ] );
  1421.     new menu = menu_create( title, "AdminMenuHandler" );
  1422.    
  1423.     menu_additem( menu, "\wGive \rXP \dto \yPlayer", "1", 0 );
  1424.     menu_additem( menu, "\wGive \rXP \dto \yAll \wPlayers", "2", 0 );
  1425.     menu_additem( menu, "\wRemove \rXP \dfrom \yPlayer", "3", 0 );
  1426.    
  1427.     menu_setprop( menu, MPROP_EXIT, MEXIT_ALL );
  1428.     menu_display( client, menu, 0 );
  1429.    
  1430.     return PLUGIN_HANDLED;
  1431. }
  1432.  
  1433. public AdminMenuHandler( client, menu, item )
  1434. {
  1435.     if( item == MENU_EXIT )
  1436.     {
  1437.         menu_destroy( menu );
  1438.         ShowMainMenu(client);
  1439.         return PLUGIN_HANDLED;
  1440.     }
  1441.    
  1442.     new iData[ 6 ], iName[ 63 ], iAccess, iCallback;
  1443.     menu_item_getinfo( menu, item, iAccess, iData, charsmax( iData ), iName, charsmax( iName ), iCallback );
  1444.  
  1445.     switch( str_to_num( iData ) )
  1446.     {
  1447.         case 1: CmdGiveMenu( client );
  1448.         case 2: client_cmd( client, "messagemode give_xp_all" );
  1449.         case 3: CmdRemoveMenu( client );
  1450.     }
  1451.    
  1452.     menu_destroy( menu );
  1453.     return PLUGIN_HANDLED;
  1454. }
  1455.  
  1456. CmdGiveMenu( client )
  1457. {
  1458.     new title[ 128 ];
  1459.     formatex( title, sizeof( title ) - 1, "[BetterPlay XP Mod]^nAdmin Menu^n^nYour XP: \w%i^n\rGive \yMenu", g_xp[ client ] );
  1460.     new menu = menu_create( title, "CmdGiveMenuHandler" );
  1461.    
  1462.     new iPlayers[ 32 ], iNum, tempid[ 10 ], iName[ 33 ];
  1463.     get_players( iPlayers, iNum, "ch" );
  1464.    
  1465.     for( new i; i < iNum; i++ )
  1466.     {
  1467.         new plr = iPlayers[ i ];
  1468.        
  1469.         num_to_str( plr, tempid, charsmax( tempid ) );
  1470.         get_user_name( plr, iName, charsmax( iName ) );
  1471.  
  1472.         menu_additem( menu, iName, tempid, 0 );
  1473.     }
  1474.    
  1475.     menu_setprop( menu, MPROP_EXIT, MEXIT_ALL );
  1476.     menu_display( client, menu );
  1477. }
  1478.  
  1479. public CmdGiveMenuHandler( client, menu, item )
  1480. {
  1481.     if( item == MENU_EXIT )
  1482.     {
  1483.         menu_destroy( menu );
  1484.         ShowMainMenu(client);
  1485.         return PLUGIN_HANDLED;
  1486.     }
  1487.    
  1488.     new iData[ 6 ], iName[ 63 ], iAccess, iCallback;
  1489.     menu_item_getinfo( menu, item, iAccess, iData, charsmax( iData ), iName, charsmax( iName ), iCallback );
  1490.  
  1491.     get_user_name( str_to_num( iData ), cacheUserName, charsmax( cacheUserName ) );
  1492.     client_cmd( client, "messagemode give_xp" );
  1493.    
  1494.     menu_destroy( menu );
  1495.     return PLUGIN_HANDLED;
  1496. }
  1497.  
  1498. CmdRemoveMenu( client )
  1499. {
  1500.     new title[ 128 ];
  1501.     formatex( title, sizeof( title ) - 1, "[BetterPlay XP Mod]^nAdmin Menu^n^nYour XP: \w%i^n\rRemove \yMenu", g_xp[ client ] );
  1502.     new menu = menu_create( title, "CmdRemoveMenuHandler" );
  1503.    
  1504.     new iPlayers[ 32 ], iNum, tempid[ 10 ], iName[ 33 ];
  1505.     get_players( iPlayers, iNum, "ch" );
  1506.    
  1507.     for( new i; i < iNum; i++ )
  1508.     {
  1509.         new plr = iPlayers[ i ];
  1510.        
  1511.         num_to_str( plr, tempid, charsmax( tempid ) );
  1512.         get_user_name( plr, iName, charsmax( iName ) );
  1513.  
  1514.         menu_additem( menu, iName, tempid, 0 );
  1515.     }
  1516.    
  1517.     menu_setprop( menu, MPROP_EXIT, MEXIT_ALL );
  1518.     menu_display( client, menu );
  1519. }
  1520.  
  1521. public CmdRemoveMenuHandler( client, menu, item )
  1522. {
  1523.     if( item == MENU_EXIT )
  1524.     {
  1525.         menu_destroy( menu );
  1526.         ShowMainMenu(client);
  1527.         return PLUGIN_HANDLED;
  1528.     }
  1529.    
  1530.     new iData[ 6 ], iName[ 63 ], iAccess, iCallback;
  1531.     menu_item_getinfo( menu, item, iAccess, iData, charsmax( iData ), iName, charsmax( iName ), iCallback );
  1532.  
  1533.     get_user_name( str_to_num( iData ), cacheUserName, charsmax( cacheUserName ) );
  1534.     client_cmd( client, "messagemode remove_xp" );
  1535.    
  1536.     menu_destroy( menu );
  1537.     return PLUGIN_HANDLED;
  1538. }
  1539.  
  1540. ShowGrenadesMenu(client)
  1541. {
  1542.     static title[128];
  1543.     formatex(title, sizeof(title) - 1, "[BetterPlay XP Mod]^nGrenades Menu^n^nNote: \wGrenade abilities are for \rT's Only!\y^n^nYour XP: \w%i", g_xp[client]);
  1544.     new menu = menu_create(title, "MenuGrenades");
  1545.     new callback = menu_makecallback("CallbackGrenades");
  1546.    
  1547.     menu_additem(menu, "\yHelp", "*", _, callback);
  1548.    
  1549.     static level, xp, percent, item[128], info[4];
  1550.     for( new i = 0; i < Grenades; i++ )
  1551.     {
  1552.         if( g_nade_enabled[i] )
  1553.         {
  1554.             level = g_nade_level[client][i] + 1;
  1555.             percent = g_nade_max_chance[i] * level / g_nade_maxlevels[i];
  1556.            
  1557.             if( g_nade_level[client][i] < g_nade_maxlevels[i] )
  1558.             {
  1559.                 xp = g_nade_first_xp[i] * (1 << (level - 1));
  1560.                 formatex(item, sizeof(item) - 1, "%s: \yLevel %i (%i%%) \r[\w%i XP\r]", g_nade_names[i], level, percent, xp);
  1561.             }
  1562.             else
  1563.             {
  1564.                 formatex(item, sizeof(item) - 1, "%s: \yLevel %i (%i%%) \r[\wMaxed Out!\r]", g_nade_names[i], level, percent);
  1565.             }
  1566.            
  1567.             num_to_str(i, info, sizeof(info) - 1);
  1568.            
  1569.             menu_additem(menu, item, info, _, callback);
  1570.         }
  1571.     }
  1572.    
  1573.     menu_display(client, menu);
  1574. }
  1575.  
  1576. public MenuGrenades(client, menu, item)
  1577. {
  1578.     if( item == MENU_EXIT )
  1579.     {
  1580.         menu_destroy(menu);
  1581.         ShowMainMenu(client);
  1582.         return;
  1583.     }
  1584.    
  1585.     static _access, info[4], callback;
  1586.     menu_item_getinfo(menu, item, _access, info, sizeof(info) - 1, _, _, callback);
  1587.     menu_destroy(menu);
  1588.    
  1589.     if( info[0] == '*' )
  1590.     {
  1591.         static motd[2500];
  1592.         new len = formatex(motd, sizeof(motd) - 1,  "<body style=^"background-color:#030303; color:#FF8F00^">");
  1593.         len += format(motd[len], sizeof(motd) - len - 1,    "<p align=^"center^">");
  1594.         len += format(motd[len], sizeof(motd) - len - 1,    "The Grenades ability for the XP Mod is for Terrorists only.<br>");
  1595.         len += format(motd[len], sizeof(motd) - len - 1,    "The Grenades ability contains the HE Grenade, 2 Flashbangs, and Frost Nade.<br>");
  1596.         len += format(motd[len], sizeof(motd) - len - 1,    "These are the grenades you are given when you receive the your items after the hide timer ends.<br>");
  1597.         len += format(motd[len], sizeof(motd) - len - 1,    "<br>");
  1598.         len += format(motd[len], sizeof(motd) - len - 1,    "<table>");
  1599.         len += format(motd[len], sizeof(motd) - len - 1,    "<tr>");
  1600.         len += format(motd[len], sizeof(motd) - len - 1,    "<th></th>");
  1601.         for( new i = 0; i < Grenades; i++ )
  1602.         {
  1603.             if( g_nade_enabled[i] )
  1604.             {
  1605.                 len += format(motd[len], sizeof(motd) - len - 1,    "<th>%s</th>", g_nade_names[i]);
  1606.             }
  1607.         }
  1608.         len += format(motd[len], sizeof(motd) - len - 1,    "</tr>");
  1609.         len += format(motd[len], sizeof(motd) - len - 1,    "<tr>");
  1610.         len += format(motd[len], sizeof(motd) - len - 1,    "<th>Chance Intervals</th>");
  1611.         for( new i = 0; i < Grenades; i++ )
  1612.         {
  1613.             if( g_nade_enabled[i] )
  1614.             {
  1615.                 len += format(motd[len], sizeof(motd) - len - 1,    "<td>%i%%</td>", (g_nade_max_chance[i] / g_nade_maxlevels[i]));
  1616.             }
  1617.         }
  1618.         len += format(motd[len], sizeof(motd) - len - 1,    "</tr>");
  1619.         len += format(motd[len], sizeof(motd) - len - 1,    "<tr>");
  1620.         len += format(motd[len], sizeof(motd) - len - 1,    "<th>Max Level</th>");
  1621.         for( new i = 0; i < Grenades; i++ )
  1622.         {
  1623.             if( g_nade_enabled[i] )
  1624.             {
  1625.                 len += format(motd[len], sizeof(motd) - len - 1,    "<td>%i</td>", g_nade_maxlevels[i]);
  1626.             }
  1627.         }
  1628.         len += format(motd[len], sizeof(motd) - len - 1,    "</tr>");
  1629.         len += format(motd[len], sizeof(motd) - len - 1,    "<th>Max Chance</th>");
  1630.         for( new i = 0; i < Grenades; i++ )
  1631.         {
  1632.             if( g_nade_enabled[i] )
  1633.             {
  1634.                 len += format(motd[len], sizeof(motd) - len - 1,    "<td>%i%%</td>", g_nade_max_chance[i]);
  1635.             }
  1636.         }
  1637.         len += format(motd[len], sizeof(motd) - len - 1,    "</tr>");
  1638.         len += format(motd[len], sizeof(motd) - len - 1,    "</table>");
  1639.         len += format(motd[len], sizeof(motd) - len - 1,    "</p>");
  1640.         len += format(motd[len], sizeof(motd) - len - 1,    "</body>");
  1641.        
  1642.         show_motd(client, motd, "XP Grenades Info");
  1643.     }
  1644.     else
  1645.     {
  1646.         new upgrade = str_to_num(info);
  1647.        
  1648.         new level = g_nade_level[client][upgrade] + 1;
  1649.         new xp = g_nade_first_xp[upgrade] * (1 << (level - 1));
  1650.         new percent = g_nade_max_chance[upgrade] * level / g_nade_maxlevels[upgrade];
  1651.        
  1652.         g_xp[client] -= xp;
  1653.         g_nade_level[client][upgrade] = level;
  1654.        
  1655.         Save(client);
  1656.        
  1657.         BlindPlayer( client, 1.0, 1.0, 255, 255, 0, 120 );
  1658.  
  1659.         ColorChat(client, GREEN, "^4[BetterPlay] ^1You bought ^3%s ^1Level ^4%i ^4(%i%%) ^1for ^3%i ^1XP!", g_nade_names[upgrade], level, percent, xp);
  1660.     }
  1661.    
  1662.     ShowGrenadesMenu(client);
  1663. }
  1664.  
  1665. public CallbackGrenades(client, menu, item)
  1666. {
  1667.     static _access, info[4], callback;
  1668.     menu_item_getinfo(menu, item, _access, info, sizeof(info) - 1, _, _, callback);
  1669.    
  1670.     if( info[0] == '*' ) return ITEM_ENABLED;
  1671.    
  1672.     new upgrade = str_to_num(info);
  1673.     if( g_nade_level[client][upgrade] == g_nade_maxlevels[upgrade] )
  1674.     {
  1675.         return ITEM_DISABLED;
  1676.     }
  1677.    
  1678.     new xp = g_nade_first_xp[upgrade] * (1 << g_nade_level[client][upgrade]);
  1679.     if( g_xp[client] < xp )
  1680.     {
  1681.         return ITEM_DISABLED;
  1682.     }
  1683.    
  1684.     return ITEM_ENABLED;
  1685. }
  1686.  
  1687. ShowHealthMenu(client)
  1688. {
  1689.     static title[128];
  1690.     formatex(title, sizeof(title) - 1, "[BetterPlay XP Mod]^nHealth Menu^n^nYour XP: \w%i", g_xp[client]);
  1691.     new menu = menu_create(title, "MenuHealth");
  1692.     new callback = menu_makecallback("CallbackHealth");
  1693.    
  1694.     menu_additem(menu, "\yHelp", "*", _, callback);
  1695.    
  1696.     static level, xp, amount, item[128], info[4];
  1697.     for( new CsTeams:i = CS_TEAM_T; i <= CS_TEAM_CT; i++ )
  1698.     {
  1699.         if( g_health_enabled[i] )
  1700.         {
  1701.             level = g_health_level[client][i] + 1;
  1702.             amount = g_health_maxamount[i] * level / g_health_maxlevels[i];
  1703.            
  1704.             if( g_health_level[client][i] < g_health_maxlevels[i] )
  1705.             {
  1706.                 xp = g_health_first_xp[i] * (1 << (level - 1));
  1707.                 formatex(item, sizeof(item) - 1, "%s: \yLevel %i (%i HP) \r[\w%i XP\r]", g_health_names[i], level, amount, xp);
  1708.             }
  1709.             else
  1710.             {
  1711.                 formatex(item, sizeof(item) - 1, "\w%s: \yLevel %i (%i HP) \r[\wMaxed Out!\r]", g_health_names[i], level, amount);
  1712.             }
  1713.            
  1714.             num_to_str(_:i, info, sizeof(info) - 1);
  1715.            
  1716.             menu_additem(menu, item, info, _, callback);
  1717.         }
  1718.     }
  1719.    
  1720.     menu_display(client, menu);
  1721. }
  1722.  
  1723. public MenuHealth(client, menu, item)
  1724. {
  1725.     if( item == MENU_EXIT )
  1726.     {
  1727.         menu_destroy(menu);
  1728.         ShowMainMenu(client);
  1729.         return;
  1730.     }
  1731.    
  1732.     static _access, info[4], callback;
  1733.     menu_item_getinfo(menu, item, _access, info, sizeof(info) - 1, _, _, callback);
  1734.     menu_destroy(menu);
  1735.    
  1736.     if( info[0] == '*' )
  1737.     {
  1738.         static motd[2500];
  1739.         new len = formatex(motd, sizeof(motd) - 1,  "<body style=^"background-color:#030303; color:#FF8F00^">");
  1740.         len += format(motd[len], sizeof(motd) - len - 1,    "<p align=^"center^">");
  1741.         len += format(motd[len], sizeof(motd) - len - 1,    "The Health ability is the amount of HP that is added to your spawn health.<br>");
  1742.         len += format(motd[len], sizeof(motd) - len - 1,    "<br>");
  1743.         len += format(motd[len], sizeof(motd) - len - 1,    "<table>");
  1744.         len += format(motd[len], sizeof(motd) - len - 1,    "<tr>");
  1745.         len += format(motd[len], sizeof(motd) - len - 1,    "<th></th>");
  1746.         for( new CsTeams:i = CS_TEAM_T; i <= CS_TEAM_CT; i++ )
  1747.         {
  1748.             if( g_health_enabled[i] )
  1749.             {
  1750.                 len += format(motd[len], sizeof(motd) - len - 1,    "<th>%s</th>",g_team_names[i]);
  1751.             }
  1752.         }
  1753.         len += format(motd[len], sizeof(motd) - len - 1,    "</tr>");
  1754.         len += format(motd[len], sizeof(motd) - len - 1,    "<tr>");
  1755.         len += format(motd[len], sizeof(motd) - len - 1,    "<th>Health Intervals</th>");
  1756.         for( new CsTeams:i = CS_TEAM_T; i <= CS_TEAM_CT; i++ )
  1757.         {
  1758.             if( g_health_enabled[i] )
  1759.             {
  1760.                 len += format(motd[len], sizeof(motd) - len - 1,    "<td>%i</td>", (g_health_maxamount[i] / g_health_maxlevels[i]));
  1761.             }
  1762.         }
  1763.         len += format(motd[len], sizeof(motd) - len - 1,    "</tr>");
  1764.         len += format(motd[len], sizeof(motd) - len - 1,    "<tr>");
  1765.         len += format(motd[len], sizeof(motd) - len - 1,    "<th>Max Level</th>");
  1766.         for( new CsTeams:i = CS_TEAM_T; i <= CS_TEAM_CT; i++ )
  1767.         {
  1768.             if( g_health_enabled[i] )
  1769.             {
  1770.                 len += format(motd[len], sizeof(motd) - len - 1,    "<td>%i</td>", g_health_maxlevels[i]);
  1771.             }
  1772.         }
  1773.         len += format(motd[len], sizeof(motd) - len - 1,    "</tr>");
  1774.         len += format(motd[len], sizeof(motd) - len - 1,    "<th>Max Health</th>");
  1775.         for( new CsTeams:i = CS_TEAM_T; i <= CS_TEAM_CT; i++ )
  1776.         {
  1777.             if( g_health_enabled[i] )
  1778.             {
  1779.                 len += format(motd[len], sizeof(motd) - len - 1,    "<td>%i</td>", g_health_maxamount[i]);
  1780.             }
  1781.         }
  1782.         len += format(motd[len], sizeof(motd) - len - 1,    "</tr>");
  1783.         len += format(motd[len], sizeof(motd) - len - 1,    "</table>");
  1784.         len += format(motd[len], sizeof(motd) - len - 1,    "</p>");
  1785.         len += format(motd[len], sizeof(motd) - len - 1,    "</body>");
  1786.        
  1787.         show_motd(client, motd, "XP Health Info");
  1788.     }
  1789.     else
  1790.     {
  1791.         new CsTeams:upgrade = CsTeams:str_to_num(info);
  1792.        
  1793.         new level = g_health_level[client][upgrade] + 1;
  1794.         new xp = g_health_first_xp[upgrade] * (1 << (level - 1));
  1795.         new amount = g_health_maxamount[upgrade] * level / g_health_maxlevels[upgrade];
  1796.        
  1797.         g_xp[client] -= xp;
  1798.         g_health_level[client][upgrade] = level;
  1799.        
  1800.         Save(client);
  1801.        
  1802.         BlindPlayer( client, 1.0, 1.0, 255, 255, 0, 120 );
  1803.  
  1804.         ColorChat(client, GREEN, "^4[BetterPlay] ^1You bought ^3%s ^1Level ^4%i ^4(%i HP) ^1for ^3%i ^1XP!", g_health_names[upgrade], level, amount, xp);
  1805.     }
  1806.    
  1807.     ShowHealthMenu(client);
  1808. }
  1809.  
  1810. public CallbackHealth(client, menu, item)
  1811. {
  1812.     static _access, info[4], callback;
  1813.     menu_item_getinfo(menu, item, _access, info, sizeof(info) - 1, _, _, callback);
  1814.    
  1815.     if( info[0] == '*' ) return ITEM_ENABLED;
  1816.    
  1817.     new CsTeams:upgrade = CsTeams:str_to_num(info);
  1818.     if( g_health_level[client][upgrade] == g_health_maxlevels[upgrade] )
  1819.     {
  1820.         return ITEM_DISABLED;
  1821.     }
  1822.    
  1823.     new xp = g_health_first_xp[upgrade] * (1 << g_health_level[client][upgrade]);
  1824.     if( g_xp[client] < xp )
  1825.     {
  1826.         return ITEM_DISABLED;
  1827.     }
  1828.    
  1829.     return ITEM_ENABLED;
  1830. }
  1831.  
  1832. ShowArmorMenu(client)
  1833. {
  1834.     static title[128];
  1835.     formatex(title, sizeof(title) - 1, "[BetterPlay XP Mod]^nArmor Menu^n^nYour XP: \w%i", g_xp[client]);
  1836.     new menu = menu_create(title, "MenuArmor");
  1837.     new callback = menu_makecallback("CallbackArmor");
  1838.    
  1839.     menu_additem(menu, "\yHelp", "*", _, callback);
  1840.    
  1841.     static level, xp, amount, item[128], info[4];
  1842.     for( new CsTeams:i = CS_TEAM_T; i <= CS_TEAM_CT; i++ )
  1843.     {
  1844.         if( g_armor_enabled[i] )
  1845.         {
  1846.             level = g_armor_level[client][i] + 1;
  1847.             amount = g_armor_maxamount[i] * level / g_armor_maxlevels[i];
  1848.            
  1849.             if( g_armor_level[client][i] < g_armor_maxlevels[i] )
  1850.             {
  1851.                 xp = g_armor_first_xp[i] * (1 << (level - 1));
  1852.                 formatex(item, sizeof(item) - 1, "%s: \yLevel %i (%i AP) \r[\w%i XP\r]", g_armor_names[i], level, amount, xp);
  1853.             }
  1854.             else
  1855.             {
  1856.                 formatex(item, sizeof(item) - 1, "\w%s: \yLevel %i (%i AP) \r[\wMaxed Out!\r]", g_armor_names[i], level, amount);
  1857.             }
  1858.            
  1859.             num_to_str(_:i, info, sizeof(info) - 1);
  1860.            
  1861.             menu_additem(menu, item, info, _, callback);
  1862.         }
  1863.     }
  1864.    
  1865.     menu_display(client, menu);
  1866. }
  1867.  
  1868. public MenuArmor(client, menu, item)
  1869. {
  1870.     if( item == MENU_EXIT )
  1871.     {
  1872.         menu_destroy(menu);
  1873.         ShowMainMenu(client);
  1874.         return;
  1875.     }
  1876.    
  1877.     static _access, info[4], callback;
  1878.     menu_item_getinfo(menu, item, _access, info, sizeof(info) - 1, _, _, callback);
  1879.     menu_destroy(menu);
  1880.    
  1881.     if( info[0] == '*' )
  1882.     {
  1883.         static motd[2500];
  1884.         new len = formatex(motd, sizeof(motd) - 1,  "<body style=^"background-color:#030303; color:#FF8F00^">");
  1885.         len += format(motd[len], sizeof(motd) - len - 1,    "<p align=^"center^">");
  1886.         len += format(motd[len], sizeof(motd) - len - 1,    "The Armor ability is the amount of AP that given to you at spawn.<br>");
  1887.         len += format(motd[len], sizeof(motd) - len - 1,    "<br>");
  1888.         len += format(motd[len], sizeof(motd) - len - 1,    "<table>");
  1889.         len += format(motd[len], sizeof(motd) - len - 1,    "<tr>");
  1890.         len += format(motd[len], sizeof(motd) - len - 1,    "<th></th>");
  1891.         for( new CsTeams:i = CS_TEAM_T; i <= CS_TEAM_CT; i++ )
  1892.         {
  1893.             if( g_armor_enabled[i] )
  1894.             {
  1895.                 len += format(motd[len], sizeof(motd) - len - 1,    "<th>%s</th>",g_team_names[i]);
  1896.             }
  1897.         }
  1898.         len += format(motd[len], sizeof(motd) - len - 1,    "</tr>");
  1899.         len += format(motd[len], sizeof(motd) - len - 1,    "<tr>");
  1900.         len += format(motd[len], sizeof(motd) - len - 1,    "<th>Armor Intervals</th>");
  1901.         for( new CsTeams:i = CS_TEAM_T; i <= CS_TEAM_CT; i++ )
  1902.         {
  1903.             if( g_armor_enabled[i] )
  1904.             {
  1905.                 len += format(motd[len], sizeof(motd) - len - 1,    "<td>%i</td>", (g_armor_maxamount[i] / g_armor_maxlevels[i]));
  1906.             }
  1907.         }
  1908.         len += format(motd[len], sizeof(motd) - len - 1,    "</tr>");
  1909.         len += format(motd[len], sizeof(motd) - len - 1,    "<tr>");
  1910.         len += format(motd[len], sizeof(motd) - len - 1,    "<th>Max Level</th>");
  1911.         for( new CsTeams:i = CS_TEAM_T; i <= CS_TEAM_CT; i++ )
  1912.         {
  1913.             if( g_armor_enabled[i] )
  1914.             {
  1915.                 len += format(motd[len], sizeof(motd) - len - 1,    "<td>%i</td>", g_armor_maxlevels[i]);
  1916.             }
  1917.         }
  1918.         len += format(motd[len], sizeof(motd) - len - 1,    "</tr>");
  1919.         len += format(motd[len], sizeof(motd) - len - 1,    "<th>Max Armor</th>");
  1920.         for( new CsTeams:i = CS_TEAM_T; i <= CS_TEAM_CT; i++ )
  1921.         {
  1922.             if( g_armor_enabled[i] )
  1923.             {
  1924.                 len += format(motd[len], sizeof(motd) - len - 1,    "<td>%i</td>", g_armor_maxamount[i]);
  1925.             }
  1926.         }
  1927.         len += format(motd[len], sizeof(motd) - len - 1,    "</tr>");
  1928.         len += format(motd[len], sizeof(motd) - len - 1,    "</table>");
  1929.         len += format(motd[len], sizeof(motd) - len - 1,    "</p>");
  1930.         len += format(motd[len], sizeof(motd) - len - 1,    "</body>");
  1931.        
  1932.         show_motd(client, motd, "XP Armor Info");
  1933.     }
  1934.     else
  1935.     {
  1936.         new CsTeams:upgrade = CsTeams:str_to_num(info);
  1937.        
  1938.         new level = g_armor_level[client][upgrade] + 1;
  1939.         new xp = g_armor_first_xp[upgrade] * (1 << (level - 1));
  1940.         new amount = g_armor_maxamount[upgrade] * level / g_armor_maxlevels[upgrade];
  1941.        
  1942.         g_xp[client] -= xp;
  1943.         g_armor_level[client][upgrade] = level;
  1944.        
  1945.         Save(client);
  1946.        
  1947.         BlindPlayer( client, 1.0, 1.0, 255, 255, 0, 120 );
  1948.        
  1949.         ColorChat(client, GREEN, "^4[BetterPlay] ^1You bought ^3%s ^1Level ^4%i (%i AP) ^1for ^3%i ^1XP!", g_armor_names[upgrade], level, amount, xp);
  1950.     }
  1951.    
  1952.     ShowArmorMenu(client);
  1953. }
  1954.  
  1955. public CallbackArmor(client, menu, item)
  1956. {
  1957.     static _access, info[4], callback;
  1958.     menu_item_getinfo(menu, item, _access, info, sizeof(info) - 1, _, _, callback);
  1959.    
  1960.     if( info[0] == '*' ) return ITEM_ENABLED;
  1961.    
  1962.     new CsTeams:upgrade = CsTeams:str_to_num(info);
  1963.     if( g_armor_level[client][upgrade] == g_armor_maxlevels[upgrade] )
  1964.     {
  1965.         return ITEM_DISABLED;
  1966.     }
  1967.    
  1968.     new xp = g_armor_first_xp[upgrade] * (1 << g_armor_level[client][upgrade]);
  1969.     if( g_xp[client] < xp )
  1970.     {
  1971.         return ITEM_DISABLED;
  1972.     }
  1973.    
  1974.     return ITEM_ENABLED;
  1975. }
  1976.  
  1977. ShowRespawnMenu(client)
  1978. {
  1979.     static title[128];
  1980.     formatex(title, sizeof(title) - 1, "[BetterPlay XP Mod]^nRespawn Menu^n^nYour XP: \w%i", g_xp[client]);
  1981.     new menu = menu_create(title, "MenuRespawn");
  1982.     new callback = menu_makecallback("CallbackRespawn");
  1983.    
  1984.     menu_additem(menu, "\yHelp", "*", _, callback);
  1985.    
  1986.     static level, xp, percent, item[128], info[4];
  1987.     for( new CsTeams:i = CS_TEAM_T; i <= CS_TEAM_CT; i++ )
  1988.     {
  1989.         if( g_respawn_enabled[i] )
  1990.         {
  1991.             level = g_respawn_level[client][i] + 1;
  1992.             percent = g_respawn_max_chance[i] * level / g_respawn_maxlevels[i];
  1993.            
  1994.             if( g_respawn_level[client][i] < g_respawn_maxlevels[i] )
  1995.             {
  1996.                 xp = g_respawn_first_xp[i] * (1 << (level - 1));
  1997.                 formatex(item, sizeof(item) - 1, "%s: \yLevel %i (%i%%) \r[\w%i XP\r]", g_respawn_names[i], level, percent, xp);
  1998.             }
  1999.             else
  2000.             {
  2001.                 formatex(item, sizeof(item) - 1, "%s: \yLevel %i (%i%%) \r[\wMaxed Out!\r]", g_respawn_names[i], level, percent);
  2002.             }
  2003.            
  2004.             num_to_str(_:i, info, sizeof(info) - 1);
  2005.            
  2006.             menu_additem(menu, item, info, _, callback);
  2007.         }
  2008.     }
  2009.    
  2010.     menu_display(client, menu);
  2011. }
  2012.  
  2013. public MenuRespawn(client, menu, item)
  2014. {
  2015.     if( item == MENU_EXIT )
  2016.     {
  2017.         menu_destroy(menu);
  2018.         ShowMainMenu(client);
  2019.         return;
  2020.     }
  2021.    
  2022.     static _access, info[4], callback;
  2023.     menu_item_getinfo(menu, item, _access, info, sizeof(info) - 1, _, _, callback);
  2024.     menu_destroy(menu);
  2025.    
  2026.     if( info[0] == '*' )
  2027.     {
  2028.         static motd[2500];
  2029.         new len = formatex(motd, sizeof(motd) - 1,  "<body style=^"background-color:#030303; color:#FF8F00^">");
  2030.         len += format(motd[len], sizeof(motd) - len - 1,    "<p align=^"center^">");
  2031.         len += format(motd[len], sizeof(motd) - len - 1,    "The Respawn ability is chance to be respawned when you die.<br>");
  2032.         len += format(motd[len], sizeof(motd) - len - 1,    "<br>");
  2033.         len += format(motd[len], sizeof(motd) - len - 1,    "<table>");
  2034.         len += format(motd[len], sizeof(motd) - len - 1,    "<tr>");
  2035.         len += format(motd[len], sizeof(motd) - len - 1,    "<th></th>");
  2036.         for( new CsTeams:i = CS_TEAM_T; i <= CS_TEAM_CT; i++ )
  2037.         {
  2038.             if( g_respawn_enabled[i] )
  2039.             {
  2040.                 len += format(motd[len], sizeof(motd) - len - 1,    "<th>%s</th>",g_team_names[i]);
  2041.             }
  2042.         }
  2043.         len += format(motd[len], sizeof(motd) - len - 1,    "</tr>");
  2044.         len += format(motd[len], sizeof(motd) - len - 1,    "<tr>");
  2045.         len += format(motd[len], sizeof(motd) - len - 1,    "<th>Chance Intervals</th>");
  2046.         for( new CsTeams:i = CS_TEAM_T; i <= CS_TEAM_CT; i++ )
  2047.         {
  2048.             if( g_respawn_enabled[i] )
  2049.             {
  2050.                 len += format(motd[len], sizeof(motd) - len - 1,    "<td>%i%%</td>", (g_respawn_max_chance[i] / g_respawn_maxlevels[i]));
  2051.             }
  2052.         }
  2053.         len += format(motd[len], sizeof(motd) - len - 1,    "</tr>");
  2054.         len += format(motd[len], sizeof(motd) - len - 1,    "<tr>");
  2055.         len += format(motd[len], sizeof(motd) - len - 1,    "<th>Max Level</th>");
  2056.         for( new CsTeams:i = CS_TEAM_T; i <= CS_TEAM_CT; i++ )
  2057.         {
  2058.             if( g_respawn_enabled[i] )
  2059.             {
  2060.                 len += format(motd[len], sizeof(motd) - len - 1,    "<td>%i</td>", g_respawn_maxlevels[i]);
  2061.             }
  2062.         }
  2063.         len += format(motd[len], sizeof(motd) - len - 1,    "</tr>");
  2064.         len += format(motd[len], sizeof(motd) - len - 1,    "<th>Max Chance</th>");
  2065.         for( new CsTeams:i = CS_TEAM_T; i <= CS_TEAM_CT; i++ )
  2066.         {
  2067.             if( g_respawn_enabled[i] )
  2068.             {
  2069.                 len += format(motd[len], sizeof(motd) - len - 1,    "<td>%i%%</td>", g_respawn_max_chance[i]);
  2070.             }
  2071.         }
  2072.         len += format(motd[len], sizeof(motd) - len - 1,    "</tr>");
  2073.         len += format(motd[len], sizeof(motd) - len - 1,    "</table>");
  2074.         len += format(motd[len], sizeof(motd) - len - 1,    "</p>");
  2075.         len += format(motd[len], sizeof(motd) - len - 1,    "</body>");
  2076.        
  2077.         show_motd(client, motd, "XP Respawn Info");
  2078.     }
  2079.     else
  2080.     {
  2081.         new CsTeams:upgrade = CsTeams:str_to_num(info);
  2082.        
  2083.         new level = g_respawn_level[client][upgrade] + 1;
  2084.         new xp = g_respawn_first_xp[upgrade] * (1 << (level - 1));
  2085.         new percent = g_respawn_max_chance[upgrade] * level / g_respawn_maxlevels[upgrade];
  2086.        
  2087.         g_xp[client] -= xp;
  2088.         g_respawn_level[client][upgrade] = level;
  2089.        
  2090.         Save(client);
  2091.        
  2092.         BlindPlayer( client, 1.0, 1.0, 255, 255, 0, 120 );
  2093.  
  2094.         ColorChat(client, GREEN, "^4[BetterPlay] ^1You bought ^3%s ^1Level ^4%i (%i%%) ^1for ^3%i ^1XP!", g_respawn_names[upgrade], level, percent, xp);
  2095.     }
  2096.    
  2097.     ShowRespawnMenu(client);
  2098. }
  2099.  
  2100. public CallbackRespawn(client, menu, item)
  2101. {
  2102.     static _access, info[4], callback;
  2103.     menu_item_getinfo(menu, item, _access, info, sizeof(info) - 1, _, _, callback);
  2104.    
  2105.     if( info[0] == '*' ) return ITEM_ENABLED;
  2106.    
  2107.     new CsTeams:upgrade = CsTeams:str_to_num(info);
  2108.     if( g_respawn_level[client][upgrade] == g_respawn_maxlevels[upgrade] )
  2109.     {
  2110.         return ITEM_DISABLED;
  2111.     }
  2112.    
  2113.     new xp = g_respawn_first_xp[upgrade] * (1 << g_respawn_level[client][upgrade]);
  2114.     if( g_xp[client] < xp || g_respawn_level[client][upgrade] == g_respawn_maxlevels[upgrade] )
  2115.     {
  2116.         return ITEM_DISABLED;
  2117.     }
  2118.    
  2119.     return ITEM_ENABLED;
  2120. }
  2121.  
  2122. ShowNoFallMenu(client)
  2123. {
  2124.     static title[128];
  2125.     formatex(title, sizeof(title) - 1, "[BetterPlay XP Mod]^nFall Damage Menu^n^nYour XP: \w%i", g_xp[client]);
  2126.     new menu = menu_create(title, "MenuNoFall");
  2127.     new callback = menu_makecallback("CallbackNoFall");
  2128.    
  2129.     menu_additem(menu, "\yHelp", "*", _, callback);
  2130.    
  2131.     static level, xp, percent, item[128], info[4];
  2132.     for( new CsTeams:i = CS_TEAM_T; i <= CS_TEAM_CT; i++ )
  2133.     {
  2134.         if( g_nofall_enabled[i] )
  2135.         {
  2136.             level = g_nofall_level[client][i] + 1;
  2137.             percent = g_nofall_max_chance[i] * level / g_nofall_maxlevels[i];
  2138.            
  2139.             if( g_nofall_level[client][i] < g_nofall_maxlevels[i] )
  2140.             {
  2141.                 xp = g_nofall_first_xp[i] * (1 << (level - 1));
  2142.                 formatex(item, sizeof(item) - 1, "%s: \yLevel %i (%i%%) \r[\w%i XP\r]", g_nofall_names[i], level, percent, xp);
  2143.             }
  2144.             else
  2145.             {
  2146.                 formatex(item, sizeof(item) - 1, "%s: \yLevel %i (%i%%) \r[\wMaxed Out!\r]", g_nofall_names[i], level, percent);
  2147.             }
  2148.            
  2149.             num_to_str(_:i, info, sizeof(info) - 1);
  2150.            
  2151.             menu_additem(menu, item, info, _, callback);
  2152.         }
  2153.     }
  2154.    
  2155.     menu_display(client, menu);
  2156. }
  2157.  
  2158. public MenuNoFall(client, menu, item)
  2159. {
  2160.     if( item == MENU_EXIT )
  2161.     {
  2162.         menu_destroy(menu);
  2163.         ShowMainMenu(client);
  2164.         return;
  2165.     }
  2166.    
  2167.     static _access, info[4], callback;
  2168.     menu_item_getinfo(menu, item, _access, info, sizeof(info) - 1, _, _, callback);
  2169.     menu_destroy(menu);
  2170.    
  2171.     if( info[0] == '*' )
  2172.     {
  2173.         static motd[2500];
  2174.         new len = formatex(motd, sizeof(motd) - 1,  "<body style=^"background-color:#030303; color:#FF8F00^">");
  2175.         len += format(motd[len], sizeof(motd) - len - 1,    "<p align=^"center^">");
  2176.         len += format(motd[len], sizeof(motd) - len - 1,    "The Fall Damage ability reduces the amount of damage inflicted from falling.<br>");
  2177.         len += format(motd[len], sizeof(motd) - len - 1,    "<br>");
  2178.         len += format(motd[len], sizeof(motd) - len - 1,    "<table>");
  2179.         len += format(motd[len], sizeof(motd) - len - 1,    "<tr>");
  2180.         len += format(motd[len], sizeof(motd) - len - 1,    "<th></th>");
  2181.         for( new CsTeams:i = CS_TEAM_T; i <= CS_TEAM_CT; i++ )
  2182.         {
  2183.             if( g_nofall_enabled[i] )
  2184.             {
  2185.                 len += format(motd[len], sizeof(motd) - len - 1,    "<th>%s</th>",g_team_names[i]);
  2186.             }
  2187.         }
  2188.         len += format(motd[len], sizeof(motd) - len - 1,    "</tr>");
  2189.         len += format(motd[len], sizeof(motd) - len - 1,    "<tr>");
  2190.         len += format(motd[len], sizeof(motd) - len - 1,    "<th>Reduction Intervals</th>");
  2191.         for( new CsTeams:i = CS_TEAM_T; i <= CS_TEAM_CT; i++ )
  2192.         {
  2193.             if( g_nofall_enabled[i] )
  2194.             {
  2195.                 len += format(motd[len], sizeof(motd) - len - 1,    "<td>%i%%</td>", (g_nofall_max_chance[i] / g_nofall_maxlevels[i]));
  2196.             }
  2197.         }
  2198.         len += format(motd[len], sizeof(motd) - len - 1,    "</tr>");
  2199.         len += format(motd[len], sizeof(motd) - len - 1,    "<tr>");
  2200.         len += format(motd[len], sizeof(motd) - len - 1,    "<th>Max Level</th>");
  2201.         for( new CsTeams:i = CS_TEAM_T; i <= CS_TEAM_CT; i++ )
  2202.         {
  2203.             if( g_nofall_enabled[i] )
  2204.             {
  2205.                 len += format(motd[len], sizeof(motd) - len - 1,    "<td>%i</td>", g_nofall_maxlevels[i]);
  2206.             }
  2207.         }
  2208.         len += format(motd[len], sizeof(motd) - len - 1,    "</tr>");
  2209.         len += format(motd[len], sizeof(motd) - len - 1,    "<th>Max Chance</th>");
  2210.         for( new CsTeams:i = CS_TEAM_T; i <= CS_TEAM_CT; i++ )
  2211.         {
  2212.             if( g_nofall_enabled[i] )
  2213.             {
  2214.                 len += format(motd[len], sizeof(motd) - len - 1,    "<td>%i%%</td>", g_nofall_max_chance[i]);
  2215.             }
  2216.         }
  2217.         len += format(motd[len], sizeof(motd) - len - 1,    "</tr>");
  2218.         len += format(motd[len], sizeof(motd) - len - 1,    "</table>");
  2219.         len += format(motd[len], sizeof(motd) - len - 1,    "</p>");
  2220.         len += format(motd[len], sizeof(motd) - len - 1,    "</body>");
  2221.        
  2222.         show_motd(client, motd, "XP Fall Damage Info");
  2223.     }
  2224.     else
  2225.     {
  2226.         new CsTeams:upgrade = CsTeams:str_to_num(info);
  2227.        
  2228.         new level = g_nofall_level[client][upgrade] + 1;
  2229.         new xp = g_nofall_first_xp[upgrade] * (1 << (level - 1));
  2230.         new percent = g_nofall_max_chance[upgrade] * level / g_nofall_maxlevels[upgrade];
  2231.        
  2232.         g_xp[client] -= xp;
  2233.         g_nofall_level[client][upgrade] = level;
  2234.        
  2235.         Save(client);
  2236.        
  2237.         BlindPlayer( client, 1.0, 1.0, 255, 255, 0, 120 );
  2238.  
  2239.         ColorChat(client, GREEN, "^4[BetterPlay] ^1You bought ^3%s ^1Level ^4%i (%i%%) ^1for ^3%i ^1XP!", g_nofall_names[upgrade], level, percent, xp);
  2240.     }
  2241.    
  2242.     ShowNoFallMenu(client);
  2243. }
  2244.  
  2245. public CallbackNoFall(client, menu, item)
  2246. {
  2247.     static _access, info[4], callback;
  2248.     menu_item_getinfo(menu, item, _access, info, sizeof(info) - 1, _, _, callback);
  2249.    
  2250.     if( info[0] == '*' ) return ITEM_ENABLED;
  2251.    
  2252.     new CsTeams:upgrade = CsTeams:str_to_num(info);
  2253.     if( g_nofall_level[client][upgrade] == g_nofall_maxlevels[upgrade] )
  2254.     {
  2255.         return ITEM_DISABLED;
  2256.     }
  2257.    
  2258.     new xp = g_nofall_first_xp[upgrade] * (1 << g_nofall_level[client][upgrade]);
  2259.     if( g_xp[client] < xp || g_nofall_level[client][upgrade] == g_nofall_maxlevels[upgrade] )
  2260.     {
  2261.         return ITEM_DISABLED;
  2262.     }
  2263.    
  2264.     return ITEM_ENABLED;
  2265. }
  2266.  
  2267. ShowDamageMenu(client)
  2268. {
  2269.     static title[128];
  2270.     formatex(title, sizeof(title) - 1, "[BetterPlay XP Mod]^nIncrease Damage Menu^n^nYour XP: \w%i", g_xp[client]);
  2271.     new menu = menu_create(title, "InsuredMenu");
  2272.     new callback = menu_makecallback("Callbackdamage");
  2273.    
  2274.     static level, xp, percent, item[128], info[4];
  2275.     for( new CsTeams:i = CS_TEAM_T; i <= CS_TEAM_CT; i++ )
  2276.     {
  2277.         level = g_dmg_level[client][i] + 1;
  2278.         percent = g_dmg_max_chance[i] * level / g_dmg_maxlevels[i];
  2279.            
  2280.         if( g_dmg_level[client][i] < g_dmg_maxlevels[i] )
  2281.         {
  2282.             xp = g_dmg_first_xp[i] * (1 << (level - 1));
  2283.             formatex(item, sizeof(item) - 1, "%s: \yLevel %i (%i%%) \r[\w%i XP\r]", g_dmg_names[i], level, percent, xp);
  2284.         }
  2285.         else
  2286.         {
  2287.             formatex(item, sizeof(item) - 1, "%s: \yLevel %i (%i%%) \r[\wMaxed Out!\r]", g_dmg_names[i], level, percent);
  2288.         }
  2289.            
  2290.         num_to_str(_:i, info, sizeof(info) - 1);
  2291.            
  2292.         menu_additem(menu, item, info, _, callback);
  2293.     }
  2294.    
  2295.     menu_display(client, menu);
  2296. }
  2297.  
  2298. public InsuredMenu(client, menu, item)
  2299. {
  2300.     if( item == MENU_EXIT )
  2301.     {
  2302.         menu_destroy(menu);
  2303.         ShowMainMenu(client);
  2304.         return;
  2305.     }
  2306.    
  2307.     static _access, info[4], callback;
  2308.     menu_item_getinfo(menu, item, _access, info, sizeof(info) - 1, _, _, callback);
  2309.     menu_destroy(menu);
  2310.    
  2311.     if( info[0] == '*' )
  2312.     {
  2313.         static motd[2500];
  2314.         new len = formatex(motd, sizeof(motd) - 1,  "<body style=^"background-color:#030303; color:#FF8F00^">");
  2315.         len += format(motd[len], sizeof(motd) - len - 1,    "<p align=^"center^">");
  2316.         len += format(motd[len], sizeof(motd) - len - 1,    "The Respawn ability is chance to be respawned when you die.<br>");
  2317.         len += format(motd[len], sizeof(motd) - len - 1,    "<br>");
  2318.         len += format(motd[len], sizeof(motd) - len - 1,    "<table>");
  2319.         len += format(motd[len], sizeof(motd) - len - 1,    "<tr>");
  2320.         len += format(motd[len], sizeof(motd) - len - 1,    "<th></th>");
  2321.         for( new CsTeams:i = CS_TEAM_T; i <= CS_TEAM_CT; i++ )
  2322.         {
  2323.            
  2324.                 len += format(motd[len], sizeof(motd) - len - 1,    "<th>%s</th>",g_team_names[i]);
  2325.            
  2326.         }
  2327.         len += format(motd[len], sizeof(motd) - len - 1,    "</tr>");
  2328.         len += format(motd[len], sizeof(motd) - len - 1,    "<tr>");
  2329.         len += format(motd[len], sizeof(motd) - len - 1,    "<th>Chance Intervals</th>");
  2330.         for( new CsTeams:i = CS_TEAM_T; i <= CS_TEAM_CT; i++ )
  2331.         {
  2332.        
  2333.                 len += format(motd[len], sizeof(motd) - len - 1,    "<td>%i%%</td>", (g_respawn_max_chance[i] / g_respawn_maxlevels[i]));
  2334.        
  2335.         }
  2336.         len += format(motd[len], sizeof(motd) - len - 1,    "</tr>");
  2337.         len += format(motd[len], sizeof(motd) - len - 1,    "<tr>");
  2338.         len += format(motd[len], sizeof(motd) - len - 1,    "<th>Max Level</th>");
  2339.         for( new CsTeams:i = CS_TEAM_T; i <= CS_TEAM_CT; i++ )
  2340.         {
  2341.            
  2342.                 len += format(motd[len], sizeof(motd) - len - 1,    "<td>%i</td>", g_respawn_maxlevels[i]);
  2343.        
  2344.         }
  2345.         len += format(motd[len], sizeof(motd) - len - 1,    "</tr>");
  2346.         len += format(motd[len], sizeof(motd) - len - 1,    "<th>Max Chance</th>");
  2347.         for( new CsTeams:i = CS_TEAM_T; i <= CS_TEAM_CT; i++ )
  2348.         {
  2349.        
  2350.                 len += format(motd[len], sizeof(motd) - len - 1,    "<td>%i%%</td>", g_respawn_max_chance[i]);
  2351.            
  2352.         }
  2353.         len += format(motd[len], sizeof(motd) - len - 1,    "</tr>");
  2354.         len += format(motd[len], sizeof(motd) - len - 1,    "</table>");
  2355.         len += format(motd[len], sizeof(motd) - len - 1,    "</p>");
  2356.         len += format(motd[len], sizeof(motd) - len - 1,    "</body>");
  2357.        
  2358.         show_motd(client, motd, "XP Respawn Info");
  2359.     }
  2360.     else
  2361.     {
  2362.         new CsTeams:upgrade = CsTeams:str_to_num(info);
  2363.        
  2364.         new level = g_dmg_level[client][upgrade] + 1;
  2365.         new xp = g_dmg_first_xp[upgrade] * (1 << (level - 1));
  2366.         new percent = g_dmg_max_chance[upgrade] * level / g_dmg_maxlevels[upgrade];
  2367.        
  2368.         g_xp[client] -= xp;
  2369.         g_dmg_level[client][upgrade] = level;
  2370.        
  2371.         Save(client);
  2372.        
  2373.         BlindPlayer( client, 1.0, 1.0, 255, 255, 0, 120 );
  2374.        
  2375.         ColorChat(client,GREEN, "^4[BetterPlay] ^1You bought ^3%s ^1Level ^4%i (%i%%) ^1for ^3%i ^1XP!", g_dmg_names[upgrade], level, percent, xp);
  2376.     }
  2377.    
  2378.     ShowDamageMenu(client);
  2379. }
  2380.  
  2381. public Callbackdamage(client, menu, item)
  2382. {
  2383.     static _access, info[4], callback;
  2384.     menu_item_getinfo(menu, item, _access, info, sizeof(info) - 1, _, _, callback);
  2385.    
  2386.     if( info[0] == '*' ) return ITEM_ENABLED;
  2387.    
  2388.     new CsTeams:upgrade = CsTeams:str_to_num(info);
  2389.     if( g_dmg_level[client][upgrade] == g_dmg_maxlevels[upgrade] )
  2390.     {
  2391.         return ITEM_DISABLED;
  2392.     }
  2393.    
  2394.     new xp = g_dmg_first_xp[upgrade] * (1 << g_dmg_level[client][upgrade]);
  2395.     if( g_xp[client] < xp || g_dmg_level[client][upgrade] == g_dmg_maxlevels[upgrade] )
  2396.     {
  2397.         return ITEM_DISABLED;
  2398.     }
  2399.    
  2400.     return ITEM_ENABLED;
  2401. }
  2402.  
  2403. ShowRegenerationMenu(client)
  2404. {
  2405.     static title[128];
  2406.     formatex(title, sizeof(title) - 1, "[BetterPlay XP Mod]^nRegeneration Menu^n^nYour XP: \w%i", g_xp[client]);
  2407.     new menu = menu_create(title, "MenuRegeneration");
  2408.     new callback = menu_makecallback("CallbackRegeneration");
  2409.    
  2410.     menu_additem(menu, "\yHelp", "*", _, callback);
  2411.    
  2412.     static level, xp, amount, item[128], info[4];
  2413.     for( new CsTeams:i = CS_TEAM_T; i <= CS_TEAM_CT; i++ )
  2414.     {
  2415.         if( g_regeneration_enabled[i] )
  2416.         {
  2417.             level = g_regeneration_level[client][i] + 1;
  2418.             amount = g_regeneration_maxamount[i] * level / g_regeneration_maxlevels[i];
  2419.            
  2420.             if( g_regeneration_level[client][i] < g_regeneration_maxlevels[i] )
  2421.             {
  2422.                 xp = g_regeneration_first_xp[i] * (1 << (level - 1));
  2423.                 formatex(item, sizeof(item) - 1, "%s: \yLevel %i (%i HP) \r[\w%i XP\r]", g_regeneration_names[i], level, amount, xp);
  2424.             }
  2425.             else
  2426.             {
  2427.                 formatex(item, sizeof(item) - 1, "%s: \yLevel %i (%i HP) \r[\wMaxed Out!\r]", g_regeneration_names[i], g_regeneration_level[client][i], g_regeneration_maxamount[i] * g_regeneration_level[client][i] / g_regeneration_maxlevels[i] );
  2428.             }
  2429.            
  2430.             num_to_str(_:i, info, sizeof(info) - 1);
  2431.            
  2432.             menu_additem(menu, item, info, _, callback);
  2433.         }
  2434.     }
  2435.    
  2436.     menu_display(client, menu);
  2437. }
  2438.  
  2439. public MenuRegeneration(client, menu, item)
  2440. {
  2441.     if( item == MENU_EXIT )
  2442.     {
  2443.         menu_destroy(menu);
  2444.         ShowMainMenu(client);
  2445.         return;
  2446.     }
  2447.    
  2448.     static _access, info[4], callback;
  2449.     menu_item_getinfo(menu, item, _access, info, sizeof(info) - 1, _, _, callback);
  2450.     menu_destroy(menu);
  2451.    
  2452.     if( info[0] == '*' )
  2453.     {
  2454.         ShowRegenerationMenu( client );
  2455.     }
  2456.     else
  2457.     {
  2458.         new CsTeams:upgrade = CsTeams:str_to_num(info);
  2459.        
  2460.         new level = g_regeneration_level[client][upgrade] + 1;
  2461.         new xp = g_regeneration_first_xp[upgrade] * (1 << (level - 1));
  2462.         new amount = g_regeneration_maxamount[upgrade] * level / g_regeneration_maxlevels[upgrade];
  2463.        
  2464.         g_xp[client] -= xp;
  2465.         g_regeneration_level[client][upgrade] = level;
  2466.        
  2467.         Save(client);
  2468.        
  2469.         BlindPlayer( client, 1.0, 1.0, 255, 255, 0, 120 );
  2470.  
  2471.         ColorChat(client, GREEN, "^4[BetterPlay] ^1You bought ^3%s ^1Level ^4%i ^4(%i HP) ^1for ^3%i ^1XP!", g_regeneration_names[upgrade], level, amount, xp);
  2472.     }
  2473.    
  2474.     ShowRegenerationMenu(client);
  2475. }
  2476.  
  2477. public CallbackRegeneration(client, menu, item)
  2478. {
  2479.     static _access, info[4], callback;
  2480.     menu_item_getinfo(menu, item, _access, info, sizeof(info) - 1, _, _, callback);
  2481.    
  2482.     if( info[0] == '*' ) return ITEM_ENABLED;
  2483.    
  2484.     new CsTeams:upgrade = CsTeams:str_to_num(info);
  2485.     if( g_regeneration_level[client][upgrade] == g_regeneration_maxlevels[upgrade] )
  2486.     {
  2487.         return ITEM_DISABLED;
  2488.     }
  2489.    
  2490.     new xp = g_regeneration_first_xp[upgrade] * (1 << g_regeneration_level[client][upgrade]);
  2491.     if( g_xp[client] < xp )
  2492.     {
  2493.         return ITEM_DISABLED;
  2494.     }
  2495.    
  2496.     return ITEM_ENABLED;
  2497. }
  2498.  
  2499. ShowInvisibilityMenu(client)
  2500. {
  2501.     static title[128];
  2502.     formatex(title, sizeof(title) - 1, "[BetterPlay XP Mod]^nInvisibility Menu^n^nYour XP: \w%i", g_xp[client]);
  2503.     new menu = menu_create(title, "MenuInvisibility");
  2504.     new callback = menu_makecallback("CallbackInvisibility");
  2505.    
  2506.     menu_additem(menu, "\yHelp", "*", _, callback);
  2507.    
  2508.     static level, xp, item[128], info[4];
  2509.     for( new CsTeams:i = CS_TEAM_T; i <= CS_TEAM_CT; i++ )
  2510.     {
  2511.         if( g_invisibility_enabled[i] )
  2512.         {
  2513.             level = g_invisibility_level[client][i] + 1;
  2514.  
  2515.             if( g_invisibility_level[client][i] < g_invisibility_maxlevels[i] )
  2516.             {
  2517.                 xp = g_invisibility_first_xp[i] * (1 << (level - 1));
  2518.                 formatex(item, sizeof(item) - 1, "%s: \yLevel %i \r[\w%i XP\r]", g_invisibility_names[i], level, xp);
  2519.             }
  2520.             else
  2521.             {
  2522.                 formatex(item, sizeof(item) - 1, "%s: \yLevel %i \r[\wMaxed Out!\r]", g_invisibility_names[i], g_invisibility_level[client][i] );
  2523.             }
  2524.            
  2525.             num_to_str(_:i, info, sizeof(info) - 1);
  2526.            
  2527.             menu_additem(menu, item, info, _, callback);
  2528.         }
  2529.     }
  2530.    
  2531.     menu_display(client, menu);
  2532. }
  2533.  
  2534. public MenuInvisibility(client, menu, item)
  2535. {
  2536.     if( item == MENU_EXIT )
  2537.     {
  2538.         menu_destroy(menu);
  2539.         ShowMainMenu(client);
  2540.         return;
  2541.     }
  2542.    
  2543.     static _access, info[4], callback;
  2544.     menu_item_getinfo(menu, item, _access, info, sizeof(info) - 1, _, _, callback);
  2545.     menu_destroy(menu);
  2546.    
  2547.     if( info[0] == '*' )
  2548.     {
  2549.         ShowInvisibilityMenu( client );
  2550.     }
  2551.     else
  2552.     {
  2553.         new CsTeams:upgrade = CsTeams:str_to_num(info);
  2554.        
  2555.         new level = g_invisibility_level[client][upgrade] + 1;
  2556.         new xp = g_invisibility_first_xp[upgrade] * (1 << (level - 1));
  2557.  
  2558.         g_xp[client] -= xp;
  2559.         g_invisibility_level[client][upgrade] = level;
  2560.        
  2561.         Save(client);
  2562.        
  2563.         BlindPlayer( client, 1.0, 1.0, 255, 255, 0, 120 );
  2564.        
  2565.         ColorChat(client, GREEN, "^4[BetterPlay] ^1You bought ^3%s ^1Level ^4%i ^1for ^3%i ^1XP!", g_invisibility_names[upgrade], level, xp);
  2566.     }
  2567.    
  2568.     ShowInvisibilityMenu(client);
  2569. }
  2570.  
  2571. public CallbackInvisibility(client, menu, item)
  2572. {
  2573.     static _access, info[4], callback;
  2574.     menu_item_getinfo(menu, item, _access, info, sizeof(info) - 1, _, _, callback);
  2575.    
  2576.     if( info[0] == '*' ) return ITEM_ENABLED;
  2577.    
  2578.     new CsTeams:upgrade = CsTeams:str_to_num(info);
  2579.     if( g_invisibility_level[client][upgrade] == g_invisibility_maxlevels[upgrade] )
  2580.     {
  2581.         return ITEM_DISABLED;
  2582.     }
  2583.    
  2584.     new xp = g_invisibility_first_xp[upgrade] * (1 << g_invisibility_level[client][upgrade]);
  2585.     if( g_xp[client] < xp )
  2586.     {
  2587.         return ITEM_DISABLED;
  2588.     }
  2589.    
  2590.     return ITEM_ENABLED;
  2591. }
  2592.  
  2593. ShowPlayerMenu(client)
  2594. {
  2595.     new menu = menu_create("Player Info Menu", "MenuPlayer");
  2596.    
  2597.     new name[32], authid[35];
  2598.     for( new i = 1; i <= g_max_clients; i++ )
  2599.     {
  2600.         if( !is_user_connected(i) ) continue;
  2601.        
  2602.         get_user_name(i, name, sizeof(name) - 1);
  2603.         get_user_ip(i, authid, sizeof(authid) - 1);
  2604.        
  2605.         menu_additem(menu, name, authid);
  2606.     }
  2607.    
  2608.     menu_display(client, menu);
  2609. }
  2610.  
  2611. public MenuPlayer(client, menu, item)
  2612. {
  2613.     if( item == MENU_EXIT )
  2614.     {
  2615.         menu_destroy(menu);
  2616.         ShowMainMenu(client);
  2617.         return;
  2618.     }
  2619.    
  2620.     static _access, authid[35], callback;
  2621.     menu_item_getinfo(menu, item, _access, authid, sizeof(authid) - 1, _, _, callback);
  2622.     menu_destroy(menu);
  2623.    
  2624.     new player = find_player("d", authid);
  2625.     if( !is_user_connected(player) )
  2626.     {
  2627.         ShowMainMenu(client);
  2628.         return;
  2629.     }
  2630.    
  2631.     new name[32];
  2632.     get_user_name(player, name, sizeof(name) - 1);
  2633.    
  2634.     static motd[2500];
  2635.     new len = copy(motd, sizeof(motd) - 1, "<html>");
  2636.     len += format(motd[len], sizeof(motd) - len - 1, "<b><font size=^"4^">Name:</font></b> %s<br><br>", name);
  2637.     len += format(motd[len], sizeof(motd) - len - 1, "<b><font size=^"4^">XP:</font></b> %i<br><br>", g_xp[player]);
  2638.     if( g_any_nade_enabled )
  2639.     {
  2640.         len += format(motd[len], sizeof(motd) - len - 1, "<b><font size=^"4^">Grenades Levels:</font></b><br>");
  2641.         for( new i = 0; i < Grenades; i++ )
  2642.         {
  2643.             if( g_nade_enabled[i] )
  2644.             {
  2645.                 len += format(motd[len], sizeof(motd) - len - 1, "<b>%s:</b> %i/%i<br>", g_nade_names[i], g_nade_level[player][i], g_nade_maxlevels[i]);
  2646.             }
  2647.         }
  2648.     }
  2649.     if( g_any_health_enabled )
  2650.     {
  2651.         len += format(motd[len], sizeof(motd) - len - 1, "<br><b><font size=^"4^">Health Levels:</font></b><br>");
  2652.         for( new CsTeams:i = CS_TEAM_T; i <= CS_TEAM_CT; i++ )
  2653.         {
  2654.             if( g_health_enabled[i] )
  2655.             {
  2656.                 len += format(motd[len], sizeof(motd) - len - 1, "<b>%s:</b> %i/%i (%i/%i HP)<br>",\
  2657.                     g_health_names[i], g_health_level[player][i], g_health_maxlevels[i],\
  2658.                     (g_health_maxamount[i] * g_health_level[player][i] / g_health_maxlevels[i]), g_health_maxamount[i]);
  2659.             }
  2660.         }
  2661.     }
  2662.     if( g_any_armor_enabled )
  2663.     {
  2664.         len += format(motd[len], sizeof(motd) - len - 1, "<br><b><font size=^"4^">Armor Levels:</font></b><br>");
  2665.         for( new CsTeams:i = CS_TEAM_T; i <= CS_TEAM_CT; i++ )
  2666.         {
  2667.             if( g_armor_enabled[i] )
  2668.             {
  2669.                 len += format(motd[len], sizeof(motd) - len - 1, "<b>%s:</b> %i/%i (%i/%i AP)<br>",\
  2670.                     g_armor_names[i], g_armor_level[player][i], g_armor_maxlevels[i],\
  2671.                     (g_armor_maxamount[i] * g_armor_level[player][i] / g_armor_maxlevels[i]), g_armor_maxamount[i]);
  2672.             }
  2673.         }
  2674.     }
  2675.     if( g_any_respawn_enabled )
  2676.     {
  2677.         len += format(motd[len], sizeof(motd) - len - 1, "<br><b><font size=^"4^">Respawn Levels:</font></b><br>");
  2678.         for( new CsTeams:i = CS_TEAM_T; i <= CS_TEAM_CT; i++ )
  2679.         {
  2680.             if( g_respawn_enabled[i] )
  2681.             {
  2682.                 len += format(motd[len], sizeof(motd) - len - 1, "<b>%s:</b> %i/%i (%i/%i %%)<br>",\
  2683.                     g_respawn_names[i], g_respawn_level[player][i], g_respawn_maxlevels[i],\
  2684.                     (g_respawn_max_chance[i] * g_respawn_level[player][i] / g_respawn_maxlevels[i]), g_respawn_max_chance[i]);
  2685.             }
  2686.         }
  2687.     }
  2688.     if( g_any_nofall_enabled )
  2689.     {
  2690.         len += format(motd[len], sizeof(motd) - len - 1, "<br><b><font size=^"4^">Fall Damage Levels:</font></b><br>");
  2691.         for( new CsTeams:i = CS_TEAM_T; i <= CS_TEAM_CT; i++ )
  2692.         {
  2693.             if( g_nofall_enabled[i] )
  2694.             {
  2695.                 len += format(motd[len], sizeof(motd) - len - 1, "<b>%s:</b> %i/%i (%i/%i %%)<br>",\
  2696.                     g_nofall_names[i], g_nofall_level[player][i], g_nofall_maxlevels[i],\
  2697.                     (g_nofall_max_chance[i] * g_nofall_level[player][i] / g_nofall_maxlevels[i]), g_nofall_max_chance[i]);
  2698.             }
  2699.         }
  2700.     }
  2701.     if( g_any_dmg_enabled )
  2702.     {
  2703.         len += format(motd[len], sizeof(motd) - len - 1, "<br><b><font size=^"4^">Increase Damage Levels:</font></b><br>");
  2704.         for( new CsTeams:i = CS_TEAM_T; i <= CS_TEAM_CT; i++ )
  2705.         {
  2706.             if( g_dmg_enabled[ i ] )
  2707.             {
  2708.                 len += format(motd[len], sizeof(motd) - len - 1, "<b>%s:</b> %i/%i (%i/%i %%)<br>",\
  2709.                     g_dmg_names[i], g_dmg_level[player][i], g_dmg_maxlevels[i],\
  2710.                     (g_dmg_max_chance[i] * g_respawn_level[player][i] / g_dmg_maxlevels[i]), g_dmg_max_chance[i]);
  2711.             }
  2712.         }
  2713.     }
  2714.     if( g_any_regeneration_enabled )
  2715.     {
  2716.         len += format(motd[len], sizeof(motd) - len - 1, "<br><b><font size=^"4^">Regeneration Levels:</font></b><br>");
  2717.         for( new CsTeams:i = CS_TEAM_T; i <= CS_TEAM_CT; i++ )
  2718.         {
  2719.             if( g_regeneration_enabled[i] )
  2720.             {
  2721.                 len += format(motd[len], sizeof(motd) - len - 1, "<b>%s:</b> %i/%i (%i/%i HP)<br>",\
  2722.                     g_regeneration_names[i], g_regeneration_level[player][i], g_regeneration_maxlevels[i],\
  2723.                     (g_regeneration_maxamount[i] * g_regeneration_level[player][i] / g_regeneration_maxlevels[i]), g_regeneration_maxamount[i]);
  2724.             }
  2725.         }
  2726.     }
  2727.     if( g_any_invisibility_enabled )
  2728.     {
  2729.         len += format(motd[len], sizeof(motd) - len - 1, "<br><b><font size=^"4^">Invisibility Levels:</font></b><br>");
  2730.         for( new CsTeams:i = CS_TEAM_T; i <= CS_TEAM_CT; i++ )
  2731.         {
  2732.             if( g_invisibility_enabled[i] )
  2733.             {
  2734.                 len += format(motd[len], sizeof(motd) - len - 1, "<b>%s:</b> %i/%i<br>", g_invisibility_names[i], g_invisibility_level[player][i], g_invisibility_maxlevels[i] );
  2735.             }
  2736.         }
  2737.     }
  2738.    
  2739.     len += format(motd[len], sizeof(motd) - len - 1, "</html>");
  2740.    
  2741.     show_motd(client, motd, "BetterPlay XP Mod Info");
  2742.    
  2743.     ShowPlayerMenu(client);
  2744. }
  2745.  
  2746. public cmdGiveFunction( client )
  2747. {
  2748.     if( !( get_user_flags( client ) & ADMIN_RCON ) ) return PLUGIN_HANDLED;
  2749.    
  2750.     new arg[ 32 ];
  2751.     read_argv( 1, arg, charsmax( arg ) );
  2752.    
  2753.     if( !is_str_num( arg ) )
  2754.     {
  2755.         ColorChat( client, GREEN, "[BetterPlay]^1 Invalid input,^3 please try^4 again^1." );
  2756.         client_cmd( client, "messagemode give_xp" );
  2757.        
  2758.         return PLUGIN_HANDLED;
  2759.     }
  2760.  
  2761.     client_cmd( client, "hnsxp_give_xp ^"%s^" %d", cacheUserName, str_to_num( arg ) ); 
  2762.     return PLUGIN_HANDLED;
  2763. }
  2764.  
  2765. public cmdGiveAllFunction( client )
  2766. {
  2767.     if( !( get_user_flags( client ) & ADMIN_RCON ) ) return PLUGIN_HANDLED;
  2768.    
  2769.     new arg[ 32 ];
  2770.     read_argv( 1, arg, charsmax( arg ) );
  2771.    
  2772.     if( !is_str_num( arg ) )
  2773.     {
  2774.         ColorChat( client, GREEN, "[BetterPlay]^1 Invalid input,^3 please try^4 again^1." );
  2775.         client_cmd( client, "messagemode give_xp_all" );
  2776.        
  2777.         return PLUGIN_HANDLED;
  2778.     }
  2779.  
  2780.     client_cmd( client, "hnsxp_giveall %d", str_to_num( arg ) );   
  2781.     return PLUGIN_HANDLED;
  2782. }
  2783.  
  2784. public cmdRemoveFunction( client )
  2785. {
  2786.     if( !( get_user_flags( client ) & ADMIN_RCON ) ) return PLUGIN_HANDLED;
  2787.    
  2788.     new arg[ 32 ];
  2789.     read_argv( 1, arg, charsmax( arg ) );
  2790.    
  2791.     if( !is_str_num( arg ) )
  2792.     {
  2793.         ColorChat( client, GREEN, "[BetterPlay]^1 Invalid input,^3 please try^4 again^1." );
  2794.         client_cmd( client, "messagemode remove" );
  2795.        
  2796.         return PLUGIN_HANDLED;
  2797.     }
  2798.    
  2799.     client_cmd( client, "hnsxp_remove_xp ^"%s^" %d", cacheUserName, str_to_num( arg ) );
  2800.     return PLUGIN_HANDLED;
  2801. }
  2802.  
  2803. BlindPlayer( index, Float:fDuration, Float:fHoldTime, cRed, cGreen, cBlue, cAlpha )
  2804. {
  2805.     message_begin( MSG_ONE_UNRELIABLE, get_user_msgid( "ScreenFade" ), { 0, 0, 0 }, index );
  2806.    
  2807.     write_short( floatround( 4096.0 * fDuration, floatround_round ) );
  2808.     write_short( floatround( 4096.0 * fHoldTime, floatround_round ) );
  2809.     write_short( 4096 );
  2810.  
  2811.     write_byte( cRed );
  2812.     write_byte( cGreen );
  2813.     write_byte( cBlue );
  2814.     write_byte( cAlpha );
  2815.    
  2816.     message_end( );
  2817. }
  2818.  
  2819. public taskLoadConfigurationFile( )
  2820. {
  2821.     new file[ 124 ], dir[ 124 ];
  2822.     get_configsdir( dir, charsmax( dir ) );
  2823.     formatex( file, charsmax( file ), "%s/%s.cfg", dir, cfgfile_name );
  2824.    
  2825.     if( file_exists( file ) )
  2826.     {
  2827.         server_cmd( "exec %s", file );
  2828.         server_exec( );
  2829.     }
  2830.     else
  2831.     {
  2832.         CreateCFGFile( file );
  2833.         log_amx( "%s.cfg is not found in configs folder. File is created...", cfgfile_name );
  2834.     }
  2835. }
  2836.  
  2837. CreateCFGFile( const file[ ] )
  2838. {
  2839.     new i = fopen( file, "wt" );
  2840.    
  2841.     fprintf( i, "// HidenSeek XP Mod v%s^n", VERSION );
  2842.     fprintf( i, "// Original plugin by: Exolent^n" );
  2843.     fprintf( i, "// Edit by: Smiley^n^n" );
  2844.    
  2845.     fprintf( i, "// Default Cvars^n" );
  2846.     fprintf( i, "hnsxp_xp_kill %i^n", get_pcvar_num( cvar_xp_kill ) );
  2847.     fprintf( i, "hnsxp_xp_headshot %i^n", get_pcvar_num( cvar_xp_headshot ) );
  2848.     fprintf( i, "hnsxp_xp_grenade %i^n", get_pcvar_num( cvar_xp_grenade ) );
  2849.     fprintf( i, "hnsxp_xp_suicide %i^n", get_pcvar_num( cvar_xp_suicide ) );
  2850.     fprintf( i, "hnsxp_xp_survive %i^n", get_pcvar_num( cvar_xp_survive ) );
  2851.     fprintf( i, "hnsxp_xp_win %i^n", get_pcvar_num( cvar_xp_win ) );
  2852.     fprintf( i, "hnsxp_xp_spawn_nade_delay %i^n^n", get_pcvar_num( cvar_spawn_nade_delay ) );
  2853.    
  2854.     /*fprintf( i, "// HNSXP Happy Hour^n" );
  2855.     fprintf( i, "hnsxp_hh_start %i^n", get_pcvar_num( hh_start ) );
  2856.     fprintf( i, "hnsxp_hh_end %i", get_pcvar_num( hh_end ) );*/
  2857.    
  2858.     fclose( i );
  2859. }
  2860.        
  2861. IsUserAuthorized(client)
  2862. {
  2863.     return g_authid[client][0] != 0;
  2864. }
  2865.  
  2866. Load(client)
  2867. {
  2868.     #if defined USING_SQL
  2869.     static query[128];
  2870.     formatex(query, sizeof(query) - 1, "SELECT `data` FROM `hns_xp` WHERE `authid` = '%s';", g_authid[client]);
  2871.    
  2872.     static data[2];
  2873.     data[0] = client;
  2874.    
  2875.     SQL_ThreadQuery(g_sql_tuple, "QueryLoadData", query, data, sizeof(data));
  2876.     #else
  2877.     static data[512], timestamp;
  2878.     if( nvault_lookup(g_vault, g_authid[client], data, sizeof(data) - 1, timestamp) )
  2879.     {
  2880.         ParseLoadData(client, data);
  2881.         return;
  2882.     }
  2883.     else
  2884.     {
  2885.         NewUser(client);
  2886.     }
  2887.     #endif
  2888. }
  2889.  
  2890. #if defined USING_SQL
  2891. public QueryLoadData(failstate, Handle:query, error[], errnum, data[], size, Float:queuetime)
  2892. {
  2893.     if( failstate == TQUERY_CONNECT_FAILED
  2894.     || failstate == TQUERY_QUERY_FAILED )
  2895.     {
  2896.         set_fail_state(error);
  2897.     }
  2898.     else
  2899.     {
  2900.         if( SQL_NumResults(query) )
  2901.         {
  2902.             static sqldata[256];
  2903.             SQL_ReadResult(query, 0, sqldata, sizeof(sqldata) - 1);
  2904.             ParseLoadData(data[0], sqldata);
  2905.         }
  2906.         else
  2907.         {
  2908.             NewUser(data[0]);
  2909.         }
  2910.     }
  2911. }
  2912. #endif
  2913.  
  2914. ParseLoadData(client, data[512])
  2915. {
  2916.     static num[512];
  2917.     strbreak(data, num, sizeof(num) - 1, data, sizeof(data) - 1);
  2918.    
  2919.     g_xp[client] = str_to_num(num);
  2920.    
  2921.     for( new i = 0; i < Grenades; i++ )
  2922.     {
  2923.         strbreak(data, num, sizeof(num) - 1, data, sizeof(data) - 1);
  2924.         g_nade_level[client][i] = clamp(str_to_num(num), 0, g_nade_maxlevels[i]);
  2925.     }
  2926.    
  2927.     for( new CsTeams:i = CS_TEAM_T; i <= CS_TEAM_CT; i++ )
  2928.     {
  2929.         strbreak(data, num, sizeof(num) - 1, data, sizeof(data) - 1);
  2930.         g_armor_level[client][i] = clamp(str_to_num(num), 0, g_armor_maxlevels[i]);
  2931.     }
  2932.    
  2933.     for( new CsTeams:i = CS_TEAM_T; i <= CS_TEAM_CT; i++ )
  2934.     {
  2935.         strbreak(data, num, sizeof(num) - 1, data, sizeof(data) - 1);
  2936.         g_respawn_level[client][i] = clamp(str_to_num(num), 0, g_respawn_maxlevels[i]);
  2937.     }
  2938.    
  2939.     for( new CsTeams:i = CS_TEAM_T; i <= CS_TEAM_CT; i++ )
  2940.     {
  2941.         strbreak(data, num, sizeof(num) - 1, data, sizeof(data) - 1);
  2942.         g_health_level[client][i] = clamp(str_to_num(num), 0, g_health_maxlevels[i]);
  2943.     }
  2944.    
  2945.     for( new CsTeams:i = CS_TEAM_T; i <= CS_TEAM_CT; i++ )
  2946.     {
  2947.         strbreak(data, num, sizeof(num) - 1, data, sizeof(data) - 1);
  2948.         g_nofall_level[client][i] = clamp(str_to_num(num), 0, g_nofall_maxlevels[i]);
  2949.     }
  2950.    
  2951.     for( new CsTeams:i = CS_TEAM_T; i <= CS_TEAM_CT; i++ )
  2952.     {
  2953.         strbreak(data, num, sizeof(num) - 1, data, sizeof(data) - 1);
  2954.         g_dmg_level[client][i] = clamp(str_to_num(num), 0, g_dmg_maxlevels[i]);
  2955.     }
  2956.    
  2957.     for( new CsTeams:i = CS_TEAM_T; i <= CS_TEAM_CT; i++ )
  2958.     {
  2959.         strbreak(data, num, sizeof(num) - 1, data, sizeof(data) - 1);
  2960.         g_regeneration_level[client][i] = clamp(str_to_num(num), 0, g_regeneration_maxlevels[i]);
  2961.     }
  2962.    
  2963.     for( new CsTeams:i = CS_TEAM_T; i <= CS_TEAM_CT; i++ )
  2964.     {
  2965.         strbreak(data, num, sizeof(num) - 1, data, sizeof(data) - 1);
  2966.         g_invisibility_level[client][i] = clamp(str_to_num(num), 0, g_invisibility_maxlevels[i]);
  2967.     }
  2968.    
  2969.     #if defined USING_SQL
  2970.     g_loaded_data[client] = 1;
  2971.     #endif
  2972. }
  2973.  
  2974. NewUser(client)
  2975. {
  2976.     g_first_time[client] = 1;
  2977.    
  2978.     g_xp[client] = ENTRY_XP;
  2979.     arrayset(g_nade_level[client], 0, sizeof(g_nade_level[]));
  2980.     for( new CsTeams:i = CS_TEAM_T; i <= CS_TEAM_CT; i++ )
  2981.     {
  2982.         g_armor_level[client][i] = 0;
  2983.         g_respawn_level[client][i] = 0;
  2984.         g_health_level[client][i] = 0;
  2985.         g_nofall_level[client][i] = 0;
  2986.         g_dmg_level[client][i] = 0;
  2987.         g_regeneration_level[ client ][ i ] = 0;
  2988.         g_invisibility_level[ client ][ i ] = 0;
  2989.     }
  2990. }
  2991.  
  2992. Save(client)
  2993. {
  2994.     if( !IsUserAuthorized(client) ) return;
  2995.    
  2996.     static data[512];
  2997.     new len = formatex(data, sizeof(data) - 1, "%i", g_xp[client]);
  2998.    
  2999.     for( new i = 0; i < Grenades; i++ )
  3000.     {
  3001.         len += formatex(data[len], sizeof(data) - len - 1, " %i", g_nade_level[client][i]);
  3002.     }
  3003.    
  3004.     for( new CsTeams:i = CS_TEAM_T; i <= CS_TEAM_CT; i++ )
  3005.     {
  3006.         len += formatex(data[len], sizeof(data) - len - 1, " %i", g_armor_level[client][i]);
  3007.     }
  3008.    
  3009.     for( new CsTeams:i = CS_TEAM_T; i <= CS_TEAM_CT; i++ )
  3010.     {
  3011.         len += formatex(data[len], sizeof(data) - len - 1, " %i", g_respawn_level[client][i]);
  3012.     }
  3013.    
  3014.     for( new CsTeams:i = CS_TEAM_T; i <= CS_TEAM_CT; i++ )
  3015.     {
  3016.         len += formatex(data[len], sizeof(data) - len - 1, " %i", g_health_level[client][i]);
  3017.     }
  3018.    
  3019.     for( new CsTeams:i = CS_TEAM_T; i <= CS_TEAM_CT; i++ )
  3020.     {
  3021.         len += formatex(data[len], sizeof(data) - len - 1, " %i", g_nofall_level[client][i]);
  3022.     }
  3023.    
  3024.     for( new CsTeams:i = CS_TEAM_T; i <= CS_TEAM_CT; i++ )
  3025.     {
  3026.         len += formatex(data[len], sizeof(data) - len - 1, " %i", g_dmg_level[client][i]);
  3027.     }
  3028.    
  3029.     for( new CsTeams:i = CS_TEAM_T; i <= CS_TEAM_CT; i++ )
  3030.     {
  3031.         len += formatex(data[len], sizeof(data) - len - 1, " %i", g_regeneration_level[client][i]);
  3032.     }
  3033.    
  3034.     for( new CsTeams:i = CS_TEAM_T; i <= CS_TEAM_CT; i++ )
  3035.     {
  3036.         len += formatex(data[len], sizeof(data) - len - 1, " %i", g_invisibility_level[client][i]);
  3037.     }
  3038.    
  3039.     #if defined USING_SQL
  3040.     static name[32];
  3041.     get_user_name(client, name, sizeof(name) - 1);
  3042.    
  3043.     static query[512];
  3044.     if( g_loaded_data[client] )
  3045.     {
  3046.         formatex(query, sizeof(query) - 1, "UPDATE `hns_xp` SET `name` = '%s', `data` = '%s' WHERE `authid` = '%s';", name, data, g_authid[client]);
  3047.     }
  3048.     else
  3049.     {
  3050.         formatex(query, sizeof(query) - 1, "INSERT INTO `hns_xp` ( `name`, `authid`, `data` ) VALUES ( '%s', '%s', '%s' );", name, g_authid[client], data);
  3051.     }
  3052.    
  3053.     SQL_ThreadQuery(g_sql_tuple, "QuerySaveData", query);
  3054.     #else
  3055.     nvault_set(g_vault, g_authid[client], data);
  3056.     #endif
  3057. }
  3058.  
  3059. #if defined USING_SQL
  3060. public QuerySaveData(failstate, Handle:query, error[], errnum, data[], size, Float:queuetime)
  3061. {
  3062.     if( failstate == TQUERY_CONNECT_FAILED
  3063.     || failstate == TQUERY_QUERY_FAILED )
  3064.     {
  3065.         set_fail_state(error);
  3066.     }
  3067. }
  3068. #endif
  3069. /* AMXX-Studio Notes - DO NOT MODIFY BELOW HERE
  3070. *{\\ rtf1\\ ansi\\ deff0{\\ fonttbl{\\ f0\\ fnil Tahoma;}}\n\\ viewkind4\\ uc1\\ pard\\ lang1026\\ f0\\ fs16 \n\\ par }
  3071. */
Advertisement
Add Comment
Please, Sign In to add comment