// vim: set ts=4 sw=4 tw=99 noet: // // AMX Mod X, based on AMX Mod by Aleksander Naszko ("OLO"). // Copyright (C) The AMX Mod X Development Team. // // This software is licensed under the GNU General Public License, version 3 or higher. // Additional exceptions apply. For full license details, see LICENSE.txt or visit: // https://alliedmods.net/amxmodx-license // // Restrict Weapons Plugin // // Uncomment if you want to have seperate settings for each map //#define MAPSETTINGS #include #include #define MAXMENUPOS 34 new g_Position[MAX_PLAYERS + 1] new g_Modified new g_blockPos[112] new g_saveFile[64] new g_Restricted[] = "* This item is restricted *" new g_szWeapRestr[27] = "00000000000000000000000000" new g_szEquipAmmoRestr[10] = "000000000" new g_InBuyMenu[MAX_PLAYERS + 1] new g_RegisteredMenus[10] new g_menuStrings[6][] = { "BuyPistol", "BuyShotgun", "BuySubMachineGun", "BuyRifle", "BuyMachineGun", "BuyItem" } new g_menusNames[7][] = { "pistol", "shotgun", "sub", "rifle", "machine", "equip", "ammo" } new g_MenuTitle[7][] = { "Handguns", "Shotguns", "Sub-Machine Guns", "Assault & Sniper Rifles", "Machine Guns", "Equipment", "Ammunition" } new g_menusSets[7][2] = { {0, 6}, {6, 8}, {8, 13}, {13, 23}, {23, 24}, {24, 32}, {32, 34} } new g_AliasBlockNum new g_AliasBlock[MAXMENUPOS] // First position is a position of menu (0 for ammo, 1 for pistols, 6 for equipment etc.) // Second is a key for TERRORIST (all is key are minus one, 1 is 0, 2 is 1 etc.) // Third is a key for CT // Position with -1 doesn't exist new g_Keys[MAXMENUPOS][3] = { {1, 1, 1}, // H&K USP .45 Tactical {1, 0, 0}, // Glock18 Select Fire {1, 3, 3}, // Desert Eagle .50AE {1, 2, 2}, // SIG P228 {1, 4, -1}, // Dual Beretta 96G Elite {1, -1, 4}, // FN Five-Seven {2, 0, 0}, // Benelli M3 Super90 {2, 1, 1}, // Benelli XM1014 {3, 1, 1}, // H&K MP5-Navy {3, -1, 0}, // Steyr Tactical Machine Pistol {3, 3, 3}, // FN P90 {3, 0, -1}, // Ingram MAC-10 {3, 2, 2}, // H&K UMP45 {4, 1, -1}, // AK-47 {4, 0, -1}, // Gali {4, -1, 0}, // Famas {4, 3, -1}, // Sig SG-552 Commando {4, -1, 2}, // Colt M4A1 Carbine {4, -1, 3}, // Steyr Aug {4, 2, 1}, // Steyr Scout {4, 4, 5}, // AI Arctic Warfare/Magnum {4, 5, -1}, // H&K G3/SG-1 Sniper Rifle {4, -1, 4}, // Sig SG-550 Sniper {5, 0, 0}, // FN M249 Para {6, 0, 0}, // Kevlar Vest {6, 1, 1}, // Kevlar Vest & Helmet {6, 2, 2}, // Flashbang {6, 3, 3}, // HE Grenade {6, 4, 4}, // Smoke Grenade {6, -1, 6}, // Defuse Kit {6, 5, 5}, // NightVision Goggles {6, -1, 7}, // Tactical Shield {0, 5, 5}, // Primary weapon ammo {0, 6, 6} // Secondary weapon ammo } new g_WeaponNames[MAXMENUPOS][] = { "H&K USP .45 Tactical", "Glock18 Select Fire", "Desert Eagle .50AE", "SIG P228", "Dual Beretta 96G Elite", "FN Five-Seven", "Benelli M3 Super90", "Benelli XM1014", "H&K MP5-Navy", "Steyr Tactical Machine Pistol", "FN P90", "Ingram MAC-10", "H&K UMP45", "AK-47", "Gali", "Famas", "Sig SG-552 Commando", "Colt M4A1 Carbine", "Steyr Aug", "Steyr Scout", "AI Arctic Warfare/Magnum", "H&K G3/SG-1 Sniper Rifle", "Sig SG-550 Sniper", "FN M249 Para", "Kevlar Vest", "Kevlar Vest & Helmet", "Flashbang", "HE Grenade", "Smoke Grenade", "Defuse Kit", "NightVision Goggles", "Tactical Shield", "Primary weapon ammo", "Secondary weapon ammo" } new g_MenuItem[MAXMENUPOS][] = { "\yHandguns^n\w^n%d. %s\y\R%L^n\w", "%d. %s\y\R%L^n\w", "%d. %s\y\R%L^n\w", "%d. %s\y\R%L^n\w", "%d. %s\y\R%L^n\w", "%d. %s\y\R%L^n\w^n", "\yShotguns^n\w^n%d. %s\y\R%L^n\w", "%d. %s\y\R%L^n\w^n", "\ySub-Machine Guns^n\w^n%d. %s\y\R%L^n\w", "%d. %s\y\R%L^n\w", "%d. %s\y\R%L^n\w", "%d. %s\y\R%L^n\w", "%d. %s\y\R%L^n\w^n", "\yAssault Rifles^n\w^n%d. %s\y\R%L^n\w", "%d. %s\y\R%L^n\w", "%d. %s\y\R%L^n\w", "%d. %s\y\R%L^n\w", "%d. %s\y\R%L^n\w", "%d. %s\y\R%L^n\w^n", "\ySniper Rifles^n\w^n%d. %s\y\R%L^n\w", "%d. %s\y\R%L^n\w", "%d. %s\y\R%L^n\w", "%d. %s\y\R%L^n\w^n", "\yMachine Guns^n\w^n%d. %s\y\R%L^n\w^n", "\yEquipment^n\w^n%d. %s\y\R%L^n\w", "%d. %s\y\R%L^n\w", "%d. %s\y\R%L^n\w", "%d. %s\y\R%L^n\w", "%d. %s\y\R%L^n\w", "%d. %s\y\R%L^n\w", "%d. %s\y\R%L^n\w", "%d. %s\y\R%L^n\w^n", "\yAmmunition^n\w^n%d. %s\y\R%L^n\w", "%d. %s\y\R%L^n\w" } new g_Aliases[MAXMENUPOS][] = { "usp", //Pistols "glock", "deagle", "p228", "elites", "fn57", "m3", //Shotguns "xm1014", "mp5", //SMG "tmp", "p90", "mac10", "ump45", "ak47", //Rifles "galil", "famas", "sg552", "m4a1", "aug", "scout", "awp", "g3sg1", "sg550", "m249", //Machine Gun "vest", //Equipment "vesthelm", "flash", "hegren", "sgren", "defuser", "nvgs", "shield", "primammo", //Ammo "secammo" } new g_Aliases2[MAXMENUPOS][] = { "km45", //Pistols "9x19mm", "nighthawk", "228compact", "elites", "fiveseven", "12gauge", //Shotguns "autoshotgun", "smg", //SMG "mp", "c90", "mac10", "ump45", "cv47", //Rifles "defender", "clarion", "krieg552", "m4a1", "bullpup", "scout", "magnum", "d3au1", "krieg550", "m249", //Machine Gun "vest", //Equipment "vesthelm", "flash", "hegren", "sgren", "defuser", "nvgs", "shield", "primammo", //Ammo "secammo" } #define AUTOBUYLENGTH 511 new g_Autobuy[MAX_PLAYERS + 1][AUTOBUYLENGTH + 1] //new g_Rebuy[MAX_PLAYERS + 1][AUTOBUYLENGTH + 1] bool:IsOurMenuID(id) { for (new i=1; i<=g_RegisteredMenus[0]; i++) { if (g_RegisteredMenus[i] == id) { return true } } return false } setWeapon(a, action) { new b, m = g_Keys[a][0] * 8 if (g_Keys[a][1] != -1) { b = m + g_Keys[a][1] if (action == 2) g_blockPos[b] = 1 - g_blockPos[b] else g_blockPos[b] = action } if (g_Keys[a][2] != -1) { b = m + g_Keys[a][2] + 56 if (action == 2) g_blockPos[b] = 1 - g_blockPos[b] else g_blockPos[b] = action } for (new i = 0; i < g_AliasBlockNum; ++i) if (g_AliasBlock[i] == a) { if (!action || action == 2) { --g_AliasBlockNum for (new j = i; j < g_AliasBlockNum; ++j) g_AliasBlock[j] = g_AliasBlock[j + 1] } return } if (action && g_AliasBlockNum < MAXMENUPOS) g_AliasBlock[g_AliasBlockNum++] = a } findMenuId(name[]) { for (new i = 0; i < sizeof(g_menusNames) ; ++i) if (equali(name, g_menusNames[i])) return i return -1 } findAliasId(name[]) { for (new i = 0; i < MAXMENUPOS ; ++i) if (equali(name, g_Aliases[i])) return i return -1 } switchCommand(id, action) { new c = read_argc() if (c < 3) { for (new x = 0; x < MAXMENUPOS; x++) setWeapon(x, action) console_print(id, "%L", id, action ? "EQ_WE_RES" : "EQ_WE_UNRES") g_Modified = true } else { new arg[32], a new bool:found = false for (new b = 2; b < c; ++b) { read_argv(b, arg, charsmax(arg)) if ((a = findMenuId(arg)) != -1) { c = g_menusSets[a][1] for (new i = g_menusSets[a][0]; i < c; ++i) setWeapon(i, action) console_print(id, "%s %L %L", g_MenuTitle[a], id, (a < 5) ? "HAVE_BEEN" : "HAS_BEEN", id, action ? "RESTRICTED" : "UNRESTRICTED") g_Modified = found = true } else if ((a = findAliasId(arg)) != -1) { g_Modified = found = true setWeapon(a, action) console_print(id, "%s %L %L", g_WeaponNames[a], id, "HAS_BEEN", id, action ? "RESTRICTED" : "UNRESTRICTED") } } if (!found) console_print(id, "%L", id, "NO_EQ_WE") } } positionBlocked(a) { new m = g_Keys[a][0] * 8 new d = (g_Keys[a][1] == -1) ? 0 : g_blockPos[m + g_Keys[a][1]] d += (g_Keys[a][2] == -1) ? 0 : g_blockPos[m + g_Keys[a][2] + 56] return d } public cmdRest(id, level, cid) { if (!cmd_access(id, level, cid, 1)) return PLUGIN_HANDLED new cmd[8] read_argv(1, cmd, charsmax(cmd)) if (equali("on", cmd)) switchCommand(id, 1) else if (equali("off", cmd)) switchCommand(id, 0) else if (equali("list", cmd)) { new arg1[8] new start = read_argv(2, arg1, charsmax(arg1)) ? str_to_num(arg1) : 1 if (--start < 0) start = 0 if (start >= MAXMENUPOS) start = MAXMENUPOS - 1 new end = start + 10 if (end > MAXMENUPOS) end = MAXMENUPOS new lName[16], lValue[16], lStatus[16], lOnOff[16] format(lName, charsmax(lName), "%L", id, "NAME") format(lValue, charsmax(lValue), "%L", id, "VALUE") format(lStatus, charsmax(lStatus), "%L", id, "STATUS") console_print(id, "^n----- %L: -----", id, "WEAP_RES") console_print(id, " %-32.31s %-10.9s %-9.8s", lName, lValue, lStatus) if (start != -1) { for (new a = start; a < end; ++a) { format(lOnOff, charsmax(lOnOff), "%L", id, positionBlocked(a) ? "ON" : "OFF") console_print(id, "%3d: %-32.31s %-10.9s %-9.8s", a + 1, g_WeaponNames[a], g_Aliases[a], lOnOff) } } console_print(id, "----- %L -----", id, "REST_ENTRIES_OF", start + 1, end, MAXMENUPOS) if (end < MAXMENUPOS) console_print(id, "----- %L -----", id, "REST_USE_MORE", end + 1) else console_print(id, "----- %L -----", id, "REST_USE_BEGIN") } else if (equali("save", cmd)) { if (saveSettings(g_saveFile)) { console_print(id, "%L", id, "REST_CONF_SAVED", g_saveFile) g_Modified = false } else console_print(id, "%L", id, "REST_COULDNT_SAVE", g_saveFile) } else if (equali("load", cmd)) { setc(g_blockPos, sizeof(g_blockPos), 0) // Clear current settings new arg1[64] if (read_argv(2, arg1, charsmax(arg1))) { new configsdir[32] get_configsdir(configsdir, charsmax(configsdir)) format(arg1, charsmax(arg1), "%s/%s", configsdir, arg1) } if (loadSettings(arg1)) { console_print(id, "%L", id, "REST_CONF_LOADED", arg1) g_Modified = true } else console_print(id, "%L", id, "REST_COULDNT_LOAD", arg1) } else { console_print(id, "%L", id, "COM_REST_USAGE") console_print(id, "%L", id, "COM_REST_COMMANDS") console_print(id, "%L", id, "COM_REST_ON") console_print(id, "%L", id, "COM_REST_OFF") console_print(id, "%L", id, "COM_REST_ONV") console_print(id, "%L", id, "COM_REST_OFFV") console_print(id, "%L", id, "COM_REST_LIST") console_print(id, "%L", id, "COM_REST_SAVE") console_print(id, "%L", id, "COM_REST_LOAD") console_print(id, "%L", id, "COM_REST_VALUES") console_print(id, "%L", id, "COM_REST_TYPE") } return PLUGIN_HANDLED } displayMenu(id, pos) { if (pos < 0) return new menubody[512], start = pos * 7 if (start >= MAXMENUPOS) start = pos = g_Position[id] = 0 new len = format(menubody, charsmax(menubody), "\y%L\R%d/5^n^n\w", id, "REST_WEAP", pos + 1) new end = start + 7, keys = MENU_KEY_0|MENU_KEY_8, k = 0 if (end > MAXMENUPOS) end = MAXMENUPOS for (new a = start; a < end; ++a) { keys |= (1<= 24) && (a < 31)) { sz[0] = g_szEquipAmmoRestr[a - 24] g_szEquipAmmoRestr[a - 24] = (sz[0] == '0') ? '1' : '0' // equipments } else if (a == 31) { sz[0] = g_szWeapRestr[25] g_szWeapRestr[25] = (sz[0] == '0') ? '1' : '0' // shield } else if ((a > 31) && (a < 34)) { sz[0] = g_szEquipAmmoRestr[a - 25] g_szEquipAmmoRestr[a - 25] = (sz[0] == '0') ? '1' : '0' // primary and secondary ammo } set_cvar_string("amx_restrweapons", g_szWeapRestr) set_cvar_string("amx_restrequipammo", g_szEquipAmmoRestr) } } return PLUGIN_HANDLED } public CS_InternalCommand(id, const cmd[]) { new a = 0 do { if (equali(g_Aliases[g_AliasBlock[a]], cmd) || equali(g_Aliases2[g_AliasBlock[a]], cmd)) { client_print(id, print_center, "%s", g_Restricted) return PLUGIN_HANDLED } } while (++a < g_AliasBlockNum) return PLUGIN_CONTINUE } public client_command(id) { if (g_AliasBlockNum) { new arg[13] if (read_argv(0, arg, charsmax(arg)) > 11) /* Longest buy command has 11 chars so if command is longer then don't care */ { return PLUGIN_CONTINUE } if (equali(arg, "menuselect") && is_user_connected(id)) { new menu, newmenu new inMenu = player_menu_info(id, menu, newmenu) if (!inMenu && g_InBuyMenu[id]) { new key[12], num read_argv(1, key, charsmax(key)) num = str_to_num(key) - 1 return checkRest(id, g_InBuyMenu[id], num) } else if ((!menu || newmenu != -1) || !IsOurMenuID(menu)) { g_InBuyMenu[id] = 0 } return PLUGIN_CONTINUE } new a = 0 do { if (equali(g_Aliases[g_AliasBlock[a]], arg) || equali(g_Aliases2[g_AliasBlock[a]], arg)) { client_print(id, print_center, "%s", g_Restricted) return PLUGIN_HANDLED } } while (++a < g_AliasBlockNum) } return PLUGIN_CONTINUE } public blockcommand(id) { client_print(id, print_center, "%s", g_Restricted) return PLUGIN_HANDLED } public cmdMenu(id, level, cid) { if (cmd_access(id, level, cid, 1)) { displayMenu(id, g_Position[id] = 0) } return PLUGIN_HANDLED } checkRest(id, menu, key) { new team = get_user_team(id) if (team != 1 && team != 2) { return PLUGIN_HANDLED } new pos = (menu * 8 + key) + (get_user_team(id) - 1) * 56 if (pos < 0 || pos >= 112) { return PLUGIN_CONTINUE } if (g_blockPos[pos]) { engclient_cmd(id, "menuselect", "10") client_print(id, print_center, "%s", g_Restricted) return PLUGIN_HANDLED } return PLUGIN_CONTINUE } public ammoRest1(id) return checkRest(id, 0, 5) public ammoRest2(id) return checkRest(id, 0, 6) public menuBuy(id, key) return checkRest(id, 0, key) public menuPistol(id, key) return checkRest(id, 1, key) public menuShotgun(id, key) return checkRest(id, 2, key) public menuSub(id, key) return checkRest(id, 3, key) public menuRifle(id, key) return checkRest(id, 4, key) public menuMachine(id, key) return checkRest(id, 5, key) public menuItem(id, key) return checkRest(id, 6, key) saveSettings(filename[]) { if (file_exists(filename)) delete_file(filename) if (!write_file(filename, "; Generated by Restrict Weapons Plugin. Do not modify!^n; value name")) return 0 new text[64] for (new a = 0; a < MAXMENUPOS; ++a) { if (positionBlocked(a)) { format(text, charsmax(text), "%-16.15s ; %s", g_Aliases[a], g_WeaponNames[a]) write_file(filename, text) } } return 1 } loadSettings(filename[]) { if (!file_exists(filename)) return 0 new text[16] new a, pos = 0 format(g_szEquipAmmoRestr, charsmax(g_szEquipAmmoRestr), "000000000") format(g_szWeapRestr, charsmax(g_szWeapRestr), "00000000000000000000000000") while (read_file(filename, pos++, text, charsmax(text), a)) { if (text[0] == ';' || !a) continue // line is a comment parse(text, text, charsmax(text)) if ((a = findAliasId(text)) != -1) { setWeapon(a, 1) if (a < 24) g_szWeapRestr[a + 1] = '1' // primary and secondary weapons else if ((a >= 24) && (a < 31)) g_szEquipAmmoRestr[a - 24] = '1' // equipments else if (a == 31) g_szWeapRestr[25] = '1' // shield else if ((a > 31) && (a < 34)) g_szEquipAmmoRestr[a - 25] = '1' // primary and secondary ammo } } set_cvar_string("amx_restrweapons", g_szWeapRestr) set_cvar_string("amx_restrequipammo", g_szEquipAmmoRestr) return 1 } // JGHG public fn_setautobuy(id) { // Empty user's autobuy prefs. (unnecessary?) g_Autobuy[id][0] = '^0' new argCount = read_argc() new arg[128] new autobuyLen = 0 for (new i = 1; i < argCount; i++) // Start at parameter 1; parameter 0 is just "cl_setautobuy" { read_argv(i, arg, charsmax(arg)) // Add this parameter to user's autobuy prefs autobuyLen += format(g_Autobuy[id][autobuyLen], AUTOBUYLENGTH - autobuyLen, "%s", arg) // If we detect more parameters, add a space if (i + 1 < argCount) autobuyLen += format(g_Autobuy[id][autobuyLen], AUTOBUYLENGTH - autobuyLen, " ") } if (g_AliasBlockNum) { // Strip any blocked items new strippedItems[AUTOBUYLENGTH + 1] if (!StripBlockedItems(g_Autobuy[id], strippedItems)) return PLUGIN_CONTINUE // don't touch anything if we didn't strip anything... //server_print("Stripped items: ^"%s^"", strippedItems) engclient_cmd(id, "cl_setautobuy", strippedItems) return PLUGIN_HANDLED } return PLUGIN_CONTINUE } // Returns true if this strips any items, else false. StripBlockedItems(inString[AUTOBUYLENGTH + 1], outString[AUTOBUYLENGTH + 1]) { // First copy string format(outString, AUTOBUYLENGTH, inString) // After that convert all chars in string to lower case (fix by VEN) strtolower(outString) // Then strip those that are blocked. for (new i = 0; i < g_AliasBlockNum; i++) { while (containi(outString, g_Aliases[g_AliasBlock[i]]) != -1) replace(outString, AUTOBUYLENGTH, g_Aliases[g_AliasBlock[i]], "") while (containi(outString, g_Aliases2[g_AliasBlock[i]]) != -1) replace(outString, AUTOBUYLENGTH, g_Aliases2[g_AliasBlock[i]], "") } // We COULD trim white space from outString here, but I don't think it really is necessary currently... if (strlen(outString) < strlen(inString)) return true // outstring is shorter: we stripped items, return true return false // else end here, return false, no items were stripped } public fn_autobuy(id) { // Don't do anything if no items are blocked. if (!g_AliasBlockNum) return PLUGIN_CONTINUE // Strip any blocked items new strippedItems[AUTOBUYLENGTH + 1] if (!StripBlockedItems(g_Autobuy[id], strippedItems)) return PLUGIN_CONTINUE // don't touch anything if we didn't strip anything... engclient_cmd(id, "cl_setautobuy", strippedItems) return PLUGIN_HANDLED } public HookEvent_ShowMenu(id) { new menustring[24] read_data(4, menustring, charsmax(menustring)) /* Early breakouts */ new curidx if (menustring[curidx++] != '#') { g_InBuyMenu[id] = 0 return } /* Strip D */ if (menustring[curidx] == 'D') { curidx++ } /* Strip AS_ */ if (menustring[curidx] == 'A' && menustring[curidx+1] == 'S' && menustring[curidx+2] == '_') { curidx += 3 } /* Strip any team tags */ if (menustring[curidx] == 'C' && menustring[curidx+1] == 'T' && menustring[curidx+2] == '_') { curidx += 3 } else if (menustring[curidx] == 'T' && menustring[curidx+1] == '_') { curidx += 2 } if (menustring[curidx] != 'B') { g_InBuyMenu[id] = 0 return } for (new i=0; i