HLMOD.HU Forrás Megtekintés - www.hlmod.hu
  1. /*
  2. Extended Weapon Menu
  3. v1.4 by mforce
  4.  
  5. Changes:
  6.  
  7. v1.1 - Multilang added, strip_user_weapons fixed, "hardcoded" things fixed,
  8. unnecessary cvar removed, using Safety1st method for money block, ColorChat included.
  9.  
  10. v1.2 - AMXX 1.8.3 support fixed, minimal improvements (less cvar hook)
  11. v1.21 - Multilang fix.
  12. v1.3 - Plugin pause removed. Added files for modify weapon menu items.
  13. v1.4 - Added give and drop by Safety1st, menu builds by Vaqtincha's plugin.
  14. */
  15.  
  16.  
  17. #include <amxmodx>
  18. #include <cstrike>
  19. #include <fun>
  20. #include <fakemeta>
  21. #include <hamsandwich>
  22.  
  23. new const PLUGIN[] = "Extended Weapon Menu";
  24. new const VERSION[] = "1.4";
  25. new const AUTHOR[] = "mforce";
  26.  
  27.  
  28. new const PREFIX[] = "^4[EWM]";
  29.  
  30. #if AMXX_VERSION_NUM < 183
  31. #include <colorchat>
  32. const MAX_PLAYERS = 32;
  33. #endif
  34. const m_iHideHUD = 361;
  35. const m_iClientHideHUD = 362;
  36. const HUD_HIDE_MONEY = 1<<5;
  37. const m_iMapZone = 235;
  38.  
  39. new Array:g_Primary_MenuItems, Array:g_Secondary_MenuItems;
  40. new g_iPrim_TotalItems, g_iSec_TotalItems;
  41. new g_iPrim_EquipMenuID, g_iSec_EquipMenuID;
  42. enum _:weapinfo {weap_name[32], bpammo, weap_id};
  43. enum _:PCVARS {AwpMinPlayers, MaxAwps, PistolMenu, MaxHeg, MaxFlash, MaxSmoke}
  44. enum _:TEAMS {TE, CT};
  45. enum _:MAXGRENADES {HE, FLASH, SMOKE};
  46. enum _:AWPCVARS {MinPlayers, MaxAwp};
  47. new g_Cvars[PCVARS], bool:g_AllowAWP, g_Awps[TEAMS], bool:g_Used[MAX_PLAYERS+1], g_Grenades[MAXGRENADES], g_AWPCvarHook[AWPCVARS];
  48.  
  49.  
  50. new const g_szWeaponNames[CSW_P90+1][] = {
  51. "","weapon_p228","weapon_shield","weapon_scout","weapon_hegrenade","weapon_xm1014","weapon_c4",
  52. "weapon_mac10","weapon_aug","weapon_smokegrenade","weapon_elite","weapon_fiveseven","weapon_ump45",
  53. "weapon_sg550","weapon_galil","weapon_famas","weapon_usp","weapon_glock18","weapon_awp",
  54. "weapon_mp5navy","weapon_m249","weapon_m3","weapon_m4a1","weapon_tmp","weapon_g3sg1",
  55. "weapon_flashbang","weapon_deagle","weapon_sg552","weapon_ak47","weapon_knife","weapon_p90"
  56. }
  57.  
  58. public plugin_init() {
  59. register_plugin(PLUGIN, VERSION, AUTHOR);
  60. register_dictionary("extended_weapon_menu.txt");
  61. g_Cvars[AwpMinPlayers] = register_cvar("ewm_awpminplayers", "4")
  62. g_Cvars[MaxAwps] = register_cvar("ewm_maxawp", "3")
  63. g_Cvars[PistolMenu] = register_cvar("ewm_pistolmenu", "0")
  64. g_Cvars[MaxHeg] = register_cvar("ewm_maxheg", "1")
  65. g_Cvars[MaxFlash] = register_cvar("ewm_maxflash", "2")
  66. g_Cvars[MaxSmoke] = register_cvar("ewm_maxsmoke", "1")
  67. RegisterHam(Ham_Spawn, "player", "weapmenu", 1);
  68. register_event("HLTV", "Event_NewRound", "a", "1=0", "2=0");
  69.  
  70. new const commands[][] = {"say /gun", "say /guns", "say /weap", "say_team /gun", "say_team /guns", "say_team /weap"};
  71. for(new i; i < sizeof(commands); i++) {
  72. register_clcmd(commands[i], "weapmenu");
  73. }
  74.  
  75. register_message(get_user_msgid("StatusIcon"), "Message_StatusIcon");
  76. register_event("ResetHUD", "Event_ResetHUD", "b")
  77. register_event("HideWeapon", "Event_HideWeapon", "b")
  78. set_msg_block(get_user_msgid("Money"), BLOCK_SET)
  79.  
  80. g_Primary_MenuItems = ArrayCreate(weapinfo);
  81. g_Secondary_MenuItems = ArrayCreate(weapinfo);
  82. }
  83.  
  84. public plugin_cfg() {
  85. new sBuffer[256], sFile[128], sData[2][32], pFile;
  86. get_localinfo("amxx_configsdir", sFile, charsmax(sFile));
  87. add(sFile, charsmax(sFile), "/ewm_weapons.ini");
  88.  
  89. pFile = fopen(sFile, "rt");
  90. if(!pFile) set_fail_state("Error reading weapon menu items config file.");
  91.  
  92. new Trie:tCheckWeaponName = TrieCreate();
  93. new Trie:tCheckAddedItems = TrieCreate()
  94.  
  95. new iWeaponIds[CSW_P90+1], iId;
  96. for(new i = 0; i< sizeof(g_szWeaponNames); i++)
  97. TrieSetCell(tCheckWeaponName, g_szWeaponNames[i], iWeaponIds[i]);
  98.  
  99. new bSection, menudata[weapinfo];
  100.  
  101. while(!feof(pFile)) {
  102. fgets(pFile, sBuffer, charsmax(sBuffer)); trim(sBuffer);
  103. if(!sBuffer[0] || sBuffer[0] == ';' || sBuffer[0] == '#') continue;
  104.  
  105. if(sBuffer[0] == '[') {
  106. if(equali(sBuffer, "[weapons]")) bSection = 1;
  107. else if(equali(sBuffer, "[pistols]")) bSection = 2;
  108. else bSection = 0;
  109.  
  110. continue;
  111. }
  112.  
  113. if(parse(sBuffer, sData[0], charsmax(sData[]), sData[1], charsmax(sData[]))) {
  114. format(sData[0], charsmax(sData[]), "weapon_%s", sData[0]);
  115. strtolower(sData[0]);
  116.  
  117. if(!sData[0][0] || !TrieGetCell(tCheckWeaponName, sData[0], iId)) {
  118. server_print("WARNING: Invalid weapon name ^"%s^" will be skipped!", sData[0]);
  119. continue;
  120. }
  121. if(TrieKeyExists(tCheckAddedItems, sData[0])) {
  122. server_print("WARNING: Item ^"%s^" is already added!", sData[0]);
  123. continue;
  124. }
  125.  
  126. copy(menudata[weap_name], charsmax(menudata[weap_name]), sData[0]);
  127. menudata[bpammo] = str_to_num(sData[1]);
  128. menudata[weap_id] = get_weaponid(sData[0]);
  129. TrieSetCell(tCheckAddedItems, sData[0], menudata[weap_id]);
  130.  
  131. if(bSection == 1) {
  132. ArrayPushArray(g_Primary_MenuItems, menudata);
  133. g_iPrim_TotalItems++
  134. }
  135. else if(bSection == 2) {
  136. ArrayPushArray(g_Secondary_MenuItems, menudata);
  137. g_iSec_TotalItems++
  138. }
  139. }
  140. }
  141.  
  142. fclose(pFile);
  143. TrieDestroy(tCheckWeaponName);
  144. TrieDestroy(tCheckAddedItems);
  145.  
  146. if(!g_iPrim_TotalItems || !g_iSec_TotalItems) set_fail_state("Error! The menu doesn't contain any weapons.");
  147.  
  148. build_menu();
  149. }
  150.  
  151. build_menu() {
  152. g_iPrim_EquipMenuID = menu_create(PLUGIN, "Prim_WeaponMenuHandler")
  153. g_iSec_EquipMenuID = menu_create(PLUGIN, "Sec_WeaponMenuHandler")
  154. // menu_setprop(g_iPrim_EquipMenuID, MPROP_NUMBER_COLOR, "\r")
  155.  
  156. new szMenuText[64], menudata[weapinfo], szNum[3], i;
  157.  
  158. for(i = 0; i < g_iPrim_TotalItems; i++) {
  159. ArrayGetArray(g_Primary_MenuItems, i, menudata)
  160. strtoupper(menudata[weap_name]);
  161. formatex(szMenuText, charsmax(szMenuText), "%s", menudata[weap_name][7]);
  162. num_to_str(i, szNum, charsmax(szNum))
  163. menu_additem(g_iPrim_EquipMenuID, szMenuText, szNum, 0)
  164. }
  165.  
  166. for(i = 0; i < g_iSec_TotalItems; i++) {
  167. ArrayGetArray(g_Secondary_MenuItems, i, menudata)
  168. strtoupper(menudata[weap_name]);
  169. formatex(szMenuText, charsmax(szMenuText), "%s", menudata[weap_name][7]);
  170. num_to_str(i, szNum, charsmax(szNum))
  171. menu_additem(g_iSec_EquipMenuID, szMenuText, szNum, 0)
  172. }
  173.  
  174. menu_setprop(g_iPrim_EquipMenuID, MPROP_EXIT, MEXIT_ALL);
  175. menu_setprop(g_iSec_EquipMenuID, MPROP_EXIT, MEXIT_ALL);
  176. formatex(szMenuText, charsmax(szMenuText), "%L", LANG_SERVER, "EWM_MENU_BACK");
  177. menu_setprop(g_iPrim_EquipMenuID, MPROP_BACKNAME, szMenuText);
  178. menu_setprop(g_iSec_EquipMenuID, MPROP_BACKNAME, szMenuText);
  179. formatex(szMenuText, charsmax(szMenuText), "%L", LANG_SERVER, "EWM_MENU_NEXT");
  180. menu_setprop(g_iPrim_EquipMenuID, MPROP_NEXTNAME, szMenuText);
  181. menu_setprop(g_iSec_EquipMenuID, MPROP_NEXTNAME, szMenuText);
  182. formatex(szMenuText, charsmax(szMenuText), "%L", LANG_SERVER, "EWM_MENU_EXIT");
  183. menu_setprop(g_iPrim_EquipMenuID, MPROP_EXITNAME, szMenuText);
  184. menu_setprop(g_iSec_EquipMenuID, MPROP_EXITNAME, szMenuText);
  185. }
  186.  
  187. public Prim_WeaponMenuHandler(id, iMenu, iItem) {
  188. if(iItem == MENU_EXIT) return PLUGIN_HANDLED;
  189.  
  190. new szNum[3], iAccess, cb;
  191. menu_item_getinfo(iMenu, iItem, iAccess, szNum, charsmax(szNum), _, _, cb);
  192.  
  193. new iItemIndex = str_to_num(szNum);
  194. new menudata[weapinfo];
  195.  
  196. ArrayGetArray(g_Primary_MenuItems, iItemIndex, menudata);
  197.  
  198. if(equal(menudata[weap_name], "weapon_awp")) {
  199. if(!g_AllowAWP) {
  200. client_print_color(id, print_team_default, "%s^1 %L", PREFIX, LANG_SERVER, "EWM_AWP_ALLOWFROM", g_AWPCvarHook[MinPlayers], g_AWPCvarHook[MinPlayers]);
  201. weapmenu(id);
  202. return PLUGIN_HANDLED;
  203. }
  204. else if(g_AWPCvarHook[MaxAwp]) {
  205. switch(cs_get_user_team(id)) {
  206. case CS_TEAM_T: {
  207. if(g_Awps[TE] < g_AWPCvarHook[MaxAwp]) g_Awps[TE]++;
  208. else {
  209. client_print_color(id, print_team_default, "%s^1 %L", PREFIX, LANG_SERVER, "EWM_AWP_TOOMANY", g_AWPCvarHook[MaxAwp]);
  210. weapmenu(id);
  211. return PLUGIN_HANDLED;
  212. }
  213. }
  214. case CS_TEAM_CT: {
  215. if(g_Awps[CT] < g_AWPCvarHook[MaxAwp]) g_Awps[CT]++;
  216. else {
  217. client_print_color(id, print_team_default, "%s^1 %L", PREFIX, LANG_SERVER, "EWM_AWP_TOOMANY", g_AWPCvarHook[MaxAwp]);
  218. weapmenu(id);
  219. return PLUGIN_HANDLED;
  220. }
  221. }
  222. }
  223. }
  224. }
  225.  
  226. if(get_pcvar_num(g_Cvars[PistolMenu]) == 1) {
  227. menu_display(id, g_iSec_EquipMenuID, 0);
  228. }
  229. else {
  230. GiveWeapon(id, "weapon_deagle", CSW_DEAGLE, 35);
  231. }
  232.  
  233. GiveWeapon(id, menudata[weap_name], menudata[weap_id], menudata[bpammo]);
  234. cs_set_user_armor(id, 100, CS_ARMOR_VESTHELM);
  235. give_grenades(id);
  236. strtoupper(menudata[weap_name]);
  237. client_print_color(id, print_team_default, "%s^1 %L", PREFIX, LANG_SERVER, "EWM_CHOOSED", menudata[weap_name][7]);
  238. g_Used[id] = true;
  239.  
  240. return PLUGIN_HANDLED;
  241. }
  242.  
  243. public Sec_WeaponMenuHandler(id, iMenu, iItem) {
  244. if(iItem == MENU_EXIT) return PLUGIN_HANDLED;
  245.  
  246. new szNum[3], iAccess, cb;
  247. menu_item_getinfo(iMenu, iItem, iAccess, szNum, charsmax(szNum), _, _, cb);
  248.  
  249. new iItemIndex = str_to_num(szNum);
  250. new menudata[weapinfo];
  251.  
  252. ArrayGetArray(g_Secondary_MenuItems, iItemIndex, menudata);
  253.  
  254. GiveWeapon(id, menudata[weap_name], menudata[weap_id], menudata[bpammo]);
  255.  
  256. return PLUGIN_HANDLED;
  257. }
  258.  
  259. public Event_NewRound() {
  260. arrayset(g_Used, false, sizeof(g_Used));
  261. arrayset(g_Awps, 0, sizeof(g_Awps));
  262. g_AWPCvarHook[MinPlayers] = get_pcvar_num(g_Cvars[AwpMinPlayers]);
  263. g_AllowAWP = (GetPlayers(1) >= g_AWPCvarHook[MinPlayers] && GetPlayers(2) >= g_AWPCvarHook[MinPlayers]) ? true : false;
  264. g_Grenades[HE] = get_pcvar_num(g_Cvars[MaxHeg]);
  265. g_Grenades[FLASH] = get_pcvar_num(g_Cvars[MaxFlash]);
  266. g_Grenades[SMOKE] = get_pcvar_num(g_Cvars[MaxSmoke]);
  267. g_AWPCvarHook[MaxAwp] = get_pcvar_num(g_Cvars[MaxAwps]);
  268. }
  269.  
  270. public weapmenu(id) {
  271. if (!is_user_alive(id) || g_Used[id]) return;
  272.  
  273. menu_display(id, g_iPrim_EquipMenuID, 0);
  274. }
  275.  
  276. give_grenades(id) {
  277. if(g_Grenades[HE])
  278. GiveWeapon(id, "weapon_hegrenade", CSW_HEGRENADE, g_Grenades[HE]);
  279.  
  280. if(g_Grenades[FLASH])
  281. GiveWeapon(id, "weapon_flashbang", CSW_FLASHBANG, g_Grenades[FLASH]);
  282.  
  283. if(g_Grenades[SMOKE])
  284. GiveWeapon(id, "weapon_smokegrenade", CSW_SMOKEGRENADE, g_Grenades[SMOKE]);
  285. }
  286.  
  287. GetPlayers(team) {
  288. new players[32], num;
  289. get_players(players, num, "ce", team == 1 ? "TERRORIST":"CT")
  290.  
  291. return num;
  292. }
  293.  
  294. public Event_ResetHUD(id) {
  295. set_pdata_int(id, m_iClientHideHUD, 0)
  296. set_pdata_int(id, m_iHideHUD, HUD_HIDE_MONEY)
  297. }
  298.  
  299. public Event_HideWeapon(id) {
  300. // for compatibility with other plugins using that message; ZP for example
  301. new iFlags = read_data(1)
  302. if(~iFlags & HUD_HIDE_MONEY) {
  303. set_pdata_int(id, m_iClientHideHUD, 0)
  304. set_pdata_int(id, m_iHideHUD, iFlags|HUD_HIDE_MONEY)
  305. }
  306. }
  307.  
  308. public Message_StatusIcon(iMsgId, iMsgDest, id) {
  309. static szIcon[8];
  310. get_msg_arg_string(2, szIcon, charsmax(szIcon));
  311. if(equal(szIcon, "buyzone")) {
  312. if(get_msg_arg_int(1)) {
  313. set_pdata_int(id, m_iMapZone, get_pdata_int(id, m_iMapZone) & ~(1<<0));
  314. return PLUGIN_HANDLED;
  315. }
  316. }
  317. return PLUGIN_CONTINUE;
  318. }
  319.  
  320. public plugin_end() {
  321. ArrayDestroy(g_Primary_MenuItems);
  322. ArrayDestroy(g_Secondary_MenuItems);
  323. }
  324.  
  325. // ============================
  326. #define CSW_SHIELD 2
  327.  
  328. const PRIMARY_WEAPONS_BIT_SUM = 1<<CSW_SCOUT|1<<CSW_XM1014|1<<CSW_MAC10|1<<CSW_AUG|1<<CSW_UMP45
  329. |1<<CSW_SG550|1<<CSW_GALIL|1<<CSW_FAMAS|1<<CSW_AWP|1<<CSW_MP5NAVY|1<<CSW_M249|1<<CSW_M3
  330. |1<<CSW_M4A1|1<<CSW_TMP|1<<CSW_G3SG1|1<<CSW_SG552|1<<CSW_AK47|1<<CSW_P90;
  331.  
  332. const SECONDARY_WEAPONS_BIT_SUM = 1<<CSW_P228|1<<CSW_ELITE|1<<CSW_FIVESEVEN|1<<CSW_USP|1<<CSW_GLOCK18|1<<CSW_DEAGLE;
  333. const EXCP_WEAPONS_BIT_SUM = 1<<CSW_HEGRENADE|1<<CSW_SMOKEGRENADE|1<<CSW_FLASHBANG|1<<CSW_KNIFE;
  334.  
  335. stock GiveWeapon(id, const szWeapon[], iId, bp_ammo) {
  336. if(1<<iId & SECONDARY_WEAPONS_BIT_SUM)
  337. DropWeapon(id, SECONDARY_WEAPONS_BIT_SUM);
  338.  
  339. else if(1<<iId & PRIMARY_WEAPONS_BIT_SUM) {
  340. if(cs_get_user_shield(id))
  341. engclient_cmd( id, "drop", g_szWeaponNames[CSW_SHIELD]);
  342. else DropWeapon(id, PRIMARY_WEAPONS_BIT_SUM);
  343. }
  344.  
  345. give_item(id, szWeapon);
  346. cs_set_user_bpammo(id, iId, bp_ammo);
  347. }
  348.  
  349. stock DropWeapon(id, weapons_bitsum) {
  350. new iWeapons[32], iNum, iId;
  351. get_user_weapons(id, iWeapons, iNum);
  352.  
  353. for(new i = 0; i < iNum; i++) {
  354. iId = iWeapons[i];
  355. if(!(EXCP_WEAPONS_BIT_SUM & (1<<iId)) && 1<<iId & weapons_bitsum)
  356. engclient_cmd(id, "drop", g_szWeaponNames[iId]);
  357. }
  358. }