OciXCrom

Untitled

Feb 26th, 2017
184
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 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 0
  21. #define ENABLE_CT_INVISIBILITY 0
  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. */
Add Comment
Please, Sign In to add comment