Redux, а как сделать чтобы на админов и випов тоже распространялось ограничение если они берут через vipmenu?
Код:
#include <amxmodx>
#include <fakemeta>
#include <hamsandwich>
#if AMXX_VERSION_NUM < 183
#include <colorchat>
#endif
new const VERSION[] = "1.0";
#define get_bit(%1,%2) (%1 & (1 << (%2 & 31)))
#define set_bit(%1,%2) %1 |= (1 << (%2 & 31))
#define clr_bit(%1,%2) %1 &= ~(1 << (%2 & 31))
#define is_primary_weapon(%0) (PRIMARY_WEAPONS_BITSUM & (1 << %0))
#define OFFSET_WEAPONID 43
#define EXTRAOFFSET_WEAPONS 4
const PRIMARY_WEAPONS_BITSUM = (1 << CSW_SCOUT) | (1 << CSW_XM1014) | (1 << CSW_MAC10) | (1 << CSW_AUG) | (1 << CSW_UMP45) | (1 << CSW_SG550) | (1 << CSW_GALIL) | (1 << CSW_FAMAS) | (1 << CSW_AWP) | (1 << CSW_MP5NAVY) | (1 << CSW_M249) | (1 << CSW_M3) | (1 << CSW_M4A1) | (1 << CSW_TMP) | (1 << CSW_G3SG1) | (1 << CSW_SG552) | (1 << CSW_AK47) | (1 << CSW_P90) | (1 << 0);
const MAX_CLIENTS = 32;
const AUTH_LEN = 34;
const IP_LEN = 16;
const MSG_LEN = 191;
const POST = 1;
const PRE = 0;
const KEYS = 511;
enum
{
TEAM_UNASSIGNED = 0,
TEAM_TERRORIST = 1,
TEAM_CT = 2,
TEAM_SPECTATOR = 3
}
new user_team[MAX_CLIENTS + 1], ip[IP_LEN], authid[AUTH_LEN],
pcv_awp_timelimit, pcv_awp_limit_by_team, awp_limit_by_team,
need_block_awp[MAX_CLIENTS + 1], need_block_awp_by_time[MAX_CLIENTS + 1],
Float: awp_use_time[MAX_CLIENTS + 1], Float: last_ctime[MAX_CLIENTS + 1],
Float: awp_timelimit, awp_count_by_team[4], awp_access;
new const BLOCK_AUTHID[][] = {
"STEAM_0:0:0000000000"
};
new const BLOCK_IP[][] = {
"000.000.000.000"
};
/* Список карт на которых нужно отключить плагин
можно указывать название полностью или только префикс карты
*/
new const MAPLIST_DISABLED[][] = {
"aim_",
"awp_"
};
/* Список карт на которых нужна принудительная блокировка, несмотря на условия
можно указывать название полностью или только префикс карты
*/
new const MAPLIST_FORCED[][] = {
"xxx_"
};
stock const CHAT_INFO_PREFIX[] = "^3[ИНФО]^1";
stock const AWP_RESTRICT_MSG[] = "%s На этой карте запрещено пользоваться AWP";
stock const AWP_RESTRICT_PERSONAL_MSG[] = "%s Вам запрещено использовать AWP. Обратитесь к Администратору";
stock const AWP_RESTRICT_BY_TIME_MSG[] = "%s Вы сможете купить AWP, когда сыграете %.0f сек с другим оружием";
stock const AWP_RESTRICT_BY_TEAM_MSG[] = "%s В команде уже есть %d AWP";
stock const PLAYER[] = "player";
stock const DROP[] = "drop";
stock const WEAPON_AWP[] = "weapon_awp";
public plugin_init()
{
register_plugin ("AWP Restrictions", VERSION, "Free");
register_clcmd ("awp", "clcmd_awp");
register_clcmd ("magnum", "clcmd_awp");
register_event ("TextMsg", "event_restart", "a", "2=#Game_will_restart_in");
register_menucmd (register_menuid("BuyRifle", 1), KEYS, "buy_rifle");
register_message (get_user_msgid ("TeamInfo"), "msg_TeamInfo");
register_srvcmd ("amx_reloadcvars", "load_cvars");
}
public plugin_cfg()
{
load_cvars();
new map_name[32];
get_mapname(map_name, charsmax(map_name));
new i, j, need_pause_plugin, need_block_awp_forcibly;
for (; i < sizeof MAPLIST_DISABLED && !need_pause_plugin; i++) {
while (MAPLIST_DISABLED[i][j] && map_name[j]) {
if (map_name[j] == MAPLIST_DISABLED[i][j]) {
switch (MAPLIST_DISABLED[i][j + 1]) {
case 0: {
if (map_name[j + 1] == 0) {
need_pause_plugin = 1;
break;
}
}
case '_': {
if (!MAPLIST_DISABLED[i][j + 2]) {
need_pause_plugin = 1;
break;
}
}
}
}
else {
break;
}
j++;
}
}
if (need_pause_plugin) {
pause("ad");
}
i = j = 0;
for (; i < sizeof MAPLIST_FORCED && !need_block_awp_forcibly; i++) {
while (MAPLIST_FORCED[i][j] && map_name[j]) {
if (map_name[j] == MAPLIST_FORCED[i][j]) {
switch (MAPLIST_FORCED[i][j + 1]) {
case 0: {
if (map_name[j + 1] == 0) {
need_block_awp_forcibly = 1;
break;
}
}
case '_': {
if (MAPLIST_FORCED[i][j + 2] == 0) {
need_block_awp_forcibly = 1;
break;
}
}
}
}
else {
break;
}
j++;
}
}
if (need_block_awp_forcibly) {
state block_awp_forcibly_enabled;
register_event ("CurWeapon", "event_CurWeapon", "be", "1=1", "2=18");
}
else {
state block_awp_forcibly_disabled;
register_event ("CurWeapon", "event_CurWeapon", "be", "1=1");
if (awp_timelimit > 0.0) {
RegisterHam (Ham_Killed, PLAYER, "player_Killed_Post", POST);
RegisterHam (Ham_Spawn, PLAYER, "player_Spawn_Post", POST);
}
}
if (awp_limit_by_team) {
RegisterHam (Ham_AddPlayerItem, PLAYER, "AddPlayerItem", POST);
RegisterHam (Ham_RemovePlayerItem, PLAYER, "RemovePlayerItem", PRE);
}
else {
awp_access = -1;
}
}
public load_cvars()
{
static is_cvars_registered;
log_amx((is_cvars_registered) ? "Cvars Reloaded" : "Cvars Loaded");
if (!is_cvars_registered) {
pcv_awp_timelimit = register_cvar ("awp_timelimit", "120");
pcv_awp_limit_by_team = register_cvar ("awp_limit_by_team", "2"); //кол-во AWP в команде
is_cvars_registered = 1;
}
server_exec();
awp_timelimit = get_pcvar_float (pcv_awp_timelimit);
awp_limit_by_team = get_pcvar_num (pcv_awp_limit_by_team);
}
public event_restart()
{
#emit CONST.ALT need_block_awp
#emit ZERO.PRI
#emit FILL 132
if (awp_timelimit > 0.0) {
#emit CONST.ALT need_block_awp_by_time
#emit ZERO.PRI
#emit FILL 132
arrayset(_:awp_use_time, _:0.0, sizeof awp_use_time);
}
if (awp_limit_by_team) {
#emit CONST.ALT awp_count_by_team
#emit ZERO.PRI
#emit FILL 16
awp_access = 0;
}
}
public client_putinserver(id) <block_awp_forcibly_enabled> {}
public client_putinserver(id) <block_awp_forcibly_disabled>
{
need_block_awp[id] = need_block_awp_by_time[id] = 0;
awp_use_time[id] = 0.0;
if (awp_limit_by_team) {
clr_bit(awp_access, id);
}
get_user_ip(id, ip, charsmax(ip), 1)
for(new i; i < sizeof BLOCK_IP; i++) {
if (equal(ip, BLOCK_IP[i]) ) {
need_block_awp[id] = 1;
break;
}
}
if (!need_block_awp[id]) {
get_user_authid(id, authid, charsmax(authid));
for(new i; i < sizeof BLOCK_AUTHID; i++) {
if (equal(authid, BLOCK_AUTHID[i])) {
need_block_awp[id] = 1;
break;
}
}
}
}
public client_disconnect(id) <block_awp_forcibly_enabled> {}
public client_disconnect(id) <block_awp_forcibly_disabled>
{
if (awp_limit_by_team && get_bit(awp_access, id)) {
--awp_count_by_team[user_team[id]];
}
}
public clcmd_awp(id) <block_awp_forcibly_enabled>
{
return PLUGIN_HANDLED;
}
public clcmd_awp(id) <block_awp_forcibly_disabled>
{
if (need_block_awp[id]) {
client_print_color (id, print_team_default, AWP_RESTRICT_PERSONAL_MSG, CHAT_INFO_PREFIX);
return PLUGIN_HANDLED;
}
else if (need_block_awp_by_time[id]) {
client_print_color (id, print_team_default, AWP_RESTRICT_BY_TIME_MSG, CHAT_INFO_PREFIX, awp_use_time[id]);
return PLUGIN_HANDLED;
}
else if (awp_count_by_team[user_team[id]] >= awp_limit_by_team && !get_bit(awp_access, id)) {
client_print_color (id, print_team_default, AWP_RESTRICT_BY_TEAM_MSG, CHAT_INFO_PREFIX, awp_limit_by_team);
return PLUGIN_HANDLED;
}
return PLUGIN_CONTINUE;
}
public buy_rifle(id, item) <block_awp_forcibly_disabled>
{
static need_block, block_awp_msg[MSG_LEN];
need_block = 0;
if (need_block_awp[id]) {
need_block = 1;
formatex (block_awp_msg, charsmax(block_awp_msg), AWP_RESTRICT_MSG, CHAT_INFO_PREFIX);
}
else if (need_block_awp_by_time[id]) {
need_block = 1;
formatex (block_awp_msg, charsmax(block_awp_msg), AWP_RESTRICT_BY_TIME_MSG, CHAT_INFO_PREFIX, awp_use_time[id]);
}
else if (awp_count_by_team[user_team[id]] >= awp_limit_by_team && !get_bit(awp_access, id)) {
need_block = 1;
formatex (block_awp_msg, charsmax(block_awp_msg), AWP_RESTRICT_BY_TEAM_MSG, CHAT_INFO_PREFIX, awp_limit_by_team);
}
if (need_block) {
switch (user_team[id]) {
case TEAM_CT: {
if (item == 5) {
client_print_color (id, print_team_default, block_awp_msg);
return PLUGIN_HANDLED;
}
}
case TEAM_TERRORIST: {
if (item == 4) {
client_print_color (id, print_team_default, block_awp_msg);
return PLUGIN_HANDLED;
}
}
}
}
return PLUGIN_CONTINUE;
}
public buy_rifle(id, item) <block_awp_forcibly_enabled>
{
switch (user_team[id]) {
case TEAM_CT: {
if (item == 5) {
client_print_color (id, print_team_default, AWP_RESTRICT_MSG, CHAT_INFO_PREFIX);
return PLUGIN_HANDLED;
}
}
case TEAM_TERRORIST: {
if (item == 4) {
client_print_color (id, print_team_default, AWP_RESTRICT_MSG, CHAT_INFO_PREFIX);
return PLUGIN_HANDLED;
}
}
}
return PLUGIN_CONTINUE;
}
public event_CurWeapon(id) <block_awp_forcibly_enabled>
{
engclient_cmd (id, DROP, WEAPON_AWP);
client_print_color (id, print_team_default, AWP_RESTRICT_MSG, CHAT_INFO_PREFIX);
}
public event_CurWeapon(id) <block_awp_forcibly_disabled>
{
static csw_id, last_csw_id[MAX_CLIENTS + 1],
Float: ctime;
csw_id = read_data(2);
if (is_primary_weapon(csw_id)) {
ctime = get_gametime();
if (csw_id == CSW_AWP) {
if (need_block_awp[id]) {
engclient_cmd (id, DROP, WEAPON_AWP);
client_print_color (id, print_team_default, AWP_RESTRICT_PERSONAL_MSG, CHAT_INFO_PREFIX);
}
else if (need_block_awp_by_time[id]) {
engclient_cmd (id, DROP, WEAPON_AWP);
client_print_color (id, print_team_default, AWP_RESTRICT_BY_TIME_MSG, CHAT_INFO_PREFIX, awp_use_time[id]);
}
else if (awp_count_by_team[user_team[id]] >= awp_limit_by_team && !get_bit(awp_access, id)) {
engclient_cmd (id, DROP, WEAPON_AWP);
client_print_color (id, print_team_default, AWP_RESTRICT_BY_TEAM_MSG, CHAT_INFO_PREFIX, awp_limit_by_team);
}
else if (last_csw_id[id] == CSW_AWP || !is_primary_weapon(last_csw_id[id])) {
awp_use_time[id] += ctime - last_ctime[id];
}
}
else {
awp_use_time[id] -= ctime - last_ctime[id];
if (awp_use_time[id] < 0.0) {
awp_use_time[id] = 0.0;
need_block_awp_by_time[id] = 0;
}
}
}
last_ctime[id] = ctime;
last_csw_id[id] = csw_id;
}
public player_Spawn_Post(id)
{
last_ctime[id] = get_gametime();
}
public player_Killed_Post(id, attacker, should_gib)
{
if (awp_use_time[id] > awp_timelimit) {
awp_use_time[id] = awp_timelimit;
need_block_awp_by_time[id] = 1;
client_print_color (id, print_team_default, AWP_RESTRICT_BY_TIME_MSG, CHAT_INFO_PREFIX, awp_timelimit);
}
}
public AddPlayerItem (id, entity)
{
if (get_pdata_int (entity, OFFSET_WEAPONID, EXTRAOFFSET_WEAPONS) == CSW_AWP) {
static team; team = user_team[id];
if (awp_count_by_team[team] < awp_limit_by_team) {
set_bit(awp_access, id);
++awp_count_by_team[team];
}
else {
++awp_count_by_team[team];
}
}
}
public RemovePlayerItem (id, entity)
{
if (get_pdata_int (entity, OFFSET_WEAPONID, EXTRAOFFSET_WEAPONS) == CSW_AWP) {
static team; team = user_team[id];
if (awp_count_by_team[team] > 0) {
--awp_count_by_team[team];
clr_bit(awp_access, id);
}
}
}
public msg_TeamInfo ()
{
static id, team_name_tmp[11];
id = get_msg_arg_int(1);
get_msg_arg_string(2, team_name_tmp, charsmax(team_name_tmp));
switch (team_name_tmp[0]) {
case 'T': {
if (awp_count_by_team[user_team[id]] && get_bit(awp_access, id)) {
--awp_count_by_team[user_team[id]];
user_team[id] = TEAM_TERRORIST;
++awp_count_by_team[user_team[id]];
}
else {
user_team[id] = TEAM_TERRORIST;
}
}
case 'C': {
if (awp_count_by_team[user_team[id]] && get_bit(awp_access, id)) {
--awp_count_by_team[user_team[id]];
user_team[id] = TEAM_CT;
++awp_count_by_team[user_team[id]];
}
else {
user_team[id] = TEAM_CT;
}
}
case 'S': user_team[id] = TEAM_SPECTATOR;
case 'U': user_team[id] = TEAM_UNASSIGNED;
}
}
хотя нет. тут и у обычных игроков не пашет лимит на время. может это связано рехлдс хз
Отредактировал: 1hp, - 20.11.2016, 11:14
Причина: Выдано устное предупреждение!