ReHLDS/ReAPI AWPoff

p1oneer?

Пользователь
Регистрация
26 Июн 2017
Сообщения
9
Симпатии
0
Пол
Мужской
Sekret, когда amxmodx обновляли, плагины компилировали под новую версию?
 

paffgame

D0L64E6
Разработчик
Регистрация
9 Июн 2017
Сообщения
154
Симпатии
84
Пол
Мужской
Telegram
@paffgame
Sekret, я конечно не скриптер, но данный плагин не должен вредить другим плагинам.
Пока нет возможности проверить его на 1.9.0, но если он работал отлично на 1.8.3, то почему он будет плохо себя вести на 1.9.0 o_O
 

1hp

Пользователь
Регистрация
28 Янв 2018
Сообщения
12
Симпатии
1
всем привет. помогите пожалуйста исправить ошибку в плагине.
L 09/26/2019 - 15:55:12: Start of error session.
L 09/26/2019 - 15:55:12: Info (map "de_dust2_2x2") (file "addons/amxmodx/logs/error_20190926.log")
L 09/26/2019 - 15:55:12: [AMXX] Displaying debug trace (plugin "awp_off.amxx", version "1.4.3")
L 09/26/2019 - 15:55:12: [AMXX] Run time error 4: index out of bounds
L 09/26/2019 - 15:55:12: [AMXX] [0] awp_off.sma::check_awp (line 350)
L 09/26/2019 - 15:55:12: [AMXX] [1] awp_off.sma::AddItem (line 298)
PHP:
#include < amxmodx >
#include < reapi >

#if AMXX_VERSION_NUM < 183
    #include < colorchat >
    
    #define client_disconnected client_disconnect
    #define MAX_PLAYERS 32
#endif

#define IsPlayer(%0)            (0 < %0 < 33)

//■■■■■■■■■■■■■■■■■■■■■■■ CONFIG START ■■■■■■■■■■■■■■■■■■■■■■■//
#define AWP_ONLINE                                        //Закоментируйте, если не нужен функционал отключения авп при низком онлайне
#define AWP_LIMIT                                        //Закоментируйте, если не нужен функционал ограничения авп по командам
#define AWP_ROUND_LIMIT                                    //Закоментируйте, если не нужен функционал ограничения авп по раундам

// ^4 - зелёный | ^3 - цвет тимы (КТ - синий | Т - красный | SPEC - серый) | ^1 - жёлтый
#define MSG_PREFIX             "^3[^4AWP^3]"
#define MSG_LOWONLINE         "У вас^4 отобрано^3 AWP. Причина:^4 низкий онлайн."
#define MSG_LIMIT             "У вас^4 отобрано^3 AWP. Причина:^4 превышен лимит."
#define MSG_ROUND             "%s У вас^4 отобрано^3 AWP. Причина:^4 подождите %d %s"

#define ALLPLAYERS
/*
    Закоментируйте, чтобы для проверки на онлайн брались только КТ и ТТ(ботов, хлтв и спектаров считать не будет).
 
    Пример:
    Допустим на сервере 5 ботов и 2 человека 1 хлтв.
    Дефайн закоментирован: Посчитает, что на сервере 2 из Максимально возможных игроков.
    Дефайн раскоментирован: Посчитает, что на сервере 8 игроков из Максимально возможных игроков (5 ботов + 2 человека + 1 хлтв).
 
    Отбирать авп будет ТОЛЬКО У ЛЮДЕЙ в любом случае.
*/

#define FLAG                 ADMIN_RCON                //Флаг для иммунитета от лимита и блока на раунды

#define RETURN_MONEY                                //Возвращать деньги при отборе авп в конце раунда из-за низкого онлайна? (Закоментируйте, если не хотите, чтобы возвращало деньги)
#if defined RETURN_MONEY
    #define MONEY_AWP        4750                    //Сколько денег возвращать?
#endif

//#define PERCENT_PLAYERS
/*
    Разкоменитруйте, если хотите чтобы лимит зависил от процента игроков [I am chetko ob'yasnyat']
 
    Например: Онлайн = 10, Процент в кваре(awp_limit_max) = 20
    10/100*20 = 2 авп на тиму (2 у терров и 2 у кт)
*/

//#define NOEND            //Если разкоментировано, то не будет отбирать АВП в конце раунда из-за низкого онлайна. [Если онлайн ниже чем указан в кваре и человек сам дропнет авп или потеряет ее, то подобрать заного не сможет]
//■■■■■■■■■■■■■■■■■■■■■■■■ CONFIG END ■■■■■■■■■■■■■■■■■■■■■■■■//

#if !defined AWP_LIMIT && defined PERCENT_PLAYERS
    #undef PERCENT_PLAYERS
#endif
#if !defined AWP_ONLINE && !defined NOEND
    #define NOEND
#endif

enum ECVARS {
    CVAR_ONLINE,
    CVAR_LIMIT_AWP_STATUS,
    CVAR_LIMIT_MAX_AWP,
    CVAR_LIMIT_IMMUN,
    CVAR_ROUNDS_LIMIT
};

enum EBLOCKS {
    BL_RND,
    BL_LIMIT,
    BL_ONLINE
};

enum {
    AWP_DROP = 0,
    AWP_NONE,
    AWP_BUY,
    AWP_PICK_UP
};

new gCvar[ECVARS], sCvars[ECVARS], COST_AWP, gAwp[MAX_PLAYERS + 1], gCount;

#if defined AWP_LIMIT || defined AWP_ROUND_LIMIT
new TeamName: gTeam[MAX_PLAYERS + 1];
#endif
#if defined AWP_LIMIT
new sAwp[TeamName: TEAM_SPECTATOR];
#endif
#if defined AWP_ROUND_LIMIT
new gBlock[MAX_PLAYERS + 1], gRound;
#endif

#if defined PERCENT_PLAYERS
new gLimit;
#endif

public plugin_precache(){
    register_plugin("[ReAPI] AWPoff", "1.4.3", "PAffAEJIkA :3");
    
    #if !defined AWP_LIMIT && !defined AWP_ROUND_LIMIT && !defined AWP_ONLINE
    set_fail_state("xmm, ti ubral ves' funkcional plagina, no postavil ego na server... ti molodec!");
    #endif
    
    #if defined AWP_ONLINE
    gCvar[CVAR_ONLINE] =             register_cvar("awp_players_low", "8");        //Если онлайн ниже указнного в кваре, в конце раунда у всех отберет авп, и запретит ее. (Что бы отключить поставьте 0) [стандартно: при онлайне меньше 8]
    #endif
    #if defined AWP_LIMIT
    gCvar[CVAR_LIMIT_AWP_STATUS] =     register_cvar("awp_limit", "1");            //Включить|Выключить лимит авп [Стандартно: включен]
    gCvar[CVAR_LIMIT_MAX_AWP] =        register_cvar("awp_limit_max", "2");        //Сколько АВП разрешено при лимите [Стандартно по 2 авп на команду] | Если раскоментирован PERCENT_PLAYERS, то сюда вписывать нужный процент
    gCvar[CVAR_LIMIT_IMMUN] =         register_cvar("awp_limit_immun", "1");        //Иммунитет для админов. [0 - Выкл | 1 - Иммунитет от лимита кол-ва АВП | 2 - Иммунитет от блока АВП по раундам | 3 - Имумунитет от 1 и 2]
    #endif
    #if defined AWP_ROUND_LIMIT
    gCvar[CVAR_ROUNDS_LIMIT] =         register_cvar("awp_limit_round", "1");        //На сколько раундов блочить?
    #endif
}

public plugin_init(){   
    new mapname[32];
    get_mapname(mapname, charsmax(mapname));   
    
    static maps[][] = { "awp", "aim", "35hp" };
    for(new i; i < sizeof maps; i++){
        if(containi(mapname, maps[i]) != -1){
            pause("ad");
            return;
        }
    }
    
    COST_AWP = rg_get_weapon_info(WEAPON_AWP, WI_COST);
    
    RegisterHookChain(RG_CBasePlayer_AddPlayerItem, "AddItem");
    RegisterHookChain(RG_BuyWeaponByWeaponID, "BuyWeaponByWeaponID");
    RegisterHookChain(RG_CBasePlayer_RemovePlayerItem, "RemoveItem");
    
    register_concmd("awpoff_reload", "load_cvars");
    
    register_event("HLTV", "EventRoundStart", "a", "1=0", "2=0");
    register_logevent("EventRestartRound", 2, "1&Restart_Round_");
    #if !defined NOEND
    register_logevent("EventRoundEnd", 2, "1=Round_End");
    #endif
}

public plugin_cfg(){
    #if AMXX_VERSION_NUM < 183
    server_exec();
    #endif
    load_cvars(0);
}

public load_cvars(id){
    #if defined AWP_ONLINE
    sCvars[CVAR_ONLINE] =                     get_pcvar_num(gCvar[CVAR_ONLINE]);
    #endif
    #if defined AWP_LIMIT
    sCvars[CVAR_LIMIT_AWP_STATUS] =         get_pcvar_num(gCvar[CVAR_LIMIT_AWP_STATUS]);
    sCvars[CVAR_LIMIT_MAX_AWP] =             get_pcvar_num(gCvar[CVAR_LIMIT_MAX_AWP]);
    sCvars[CVAR_LIMIT_IMMUN] =                 get_pcvar_num(gCvar[CVAR_LIMIT_IMMUN]);
    #endif
    #if defined AWP_ROUND_LIMIT
    sCvars[CVAR_ROUNDS_LIMIT] =             get_pcvar_num(gCvar[CVAR_ROUNDS_LIMIT]);
    #endif
    if(IsPlayer(id))   
        client_print(id, print_center, "[AWPoff] Cvars have been reloaded!");
}

public client_disconnected(id)    if(IsPlayer(id))    minus_awp(id);

public EventRoundStart(){
    #if defined AWP_ROUND_LIMIT
    gRound ++;
    #endif
    
    gCount = 0;   
    
    static pl[32];
    get_pl(pl, gCount);
    
    #if defined PERCENT_PLAYERS
    const MAX_PERCENT = 100;
    gLimit = gCount * sCvars[CVAR_LIMIT_MAX_AWP] / MAX_PERCENT;
    #endif
    
    #if defined AWP_LIMIT
    sAwp[TEAM_CT] = 0;
    sAwp[TEAM_TERRORIST] = 0;
    #endif
    
    #if defined AWP_LIMIT || defined AWP_ROUND_LIMIT
    for(new i,id; i < gCount; i ++){
        id = pl[i];
        
        gTeam[id] = get_member(id, m_iTeam);   
        #if defined ALLPLAYERS
        if(!(TEAM_UNASSIGNED < gTeam[id] < TEAM_SPECTATOR) || !is_user_valid(id))
            continue;
        #endif
        
        switch(gAwp[id]){           
            case AWP_NONE:    continue;
            #if defined AWP_ROUND_LIMIT
            case AWP_DROP:{
                gAwp[id] = AWP_NONE;
                gBlock[id] = gRound + sCvars[CVAR_ROUNDS_LIMIT];
            }
            #endif
            #if defined AWP_LIMIT
            default:        sAwp[gTeam[id]] ++;
            #endif
        }
    }
    #endif
}

public EventRestartRound(){
    #if defined AWP_LIMIT
    sAwp[TEAM_CT] = 0;
    sAwp[TEAM_TERRORIST] = 0;
    #endif
    #if defined  AWP_ROUND_LIMIT
    gRound = 0;
    arrayset(gBlock, false, sizeof gBlock);
    #endif
    arrayset(gAwp, AWP_NONE, sizeof gAwp);
}

#if !defined NOEND
public EventRoundEnd(){
    new players[32], count;
    get_pl(players, count);
    
    if(count >= sCvars[CVAR_ONLINE])
        return PLUGIN_CONTINUE;
    
    for(new i = 0; i < count; i ++){       
        #if defined ALLPLAYERS       
        if(!is_user_valid(players[i]))   
            continue;
        #endif

        return_awp(players[i]);
    }
    EventRestartRound();
    return PLUGIN_CONTINUE;
}
#endif

stock get_pl(players[32], &count){
    #if defined ALLPLAYERS
    get_players(players, count);
    #else
    get_players(players, count, "ch");   
    new players1[32], cnt = 0;
    for(new i; i < count; i ++){
        if(TEAM_UNASSIGNED < get_member(players[i], m_iTeam) < TEAM_SPECTATOR)
            players1[cnt ++] = players[i];
    }
    
    players = players1;
    count = cnt;
    #endif
}

stock return_awp(id){   
    if(gAwp[id] <= AWP_NONE)
        return;
    
    rg_remove_item(id, "weapon_awp");
    #if defined RETURN_MONEY
    if(gAwp[id] == AWP_BUY)
        rg_add_account(id, MONEY_AWP);
    #endif
    client_print_color(id, false, "%s %s", MSG_PREFIX, MSG_LOWONLINE);
}

public BuyWeaponByWeaponID(id, WeaponIdType:weaponID){
    if(weaponID != WEAPON_AWP || !is_user_valid(id) || gAwp[id] > AWP_NONE)
        return HC_CONTINUE;
        
    new gMoney = get_member(id, m_iAccount);
    if(gMoney < COST_AWP)
        return HC_CONTINUE;
    
    if(check_awp(id)){
        gAwp[id] = AWP_BUY;
        return HC_CONTINUE;
    }
    
    SetHookChainReturn(ATYPE_INTEGER, true);
    return HC_SUPERCEDE;
}

public AddItem(id, pItem){
    if(get_member(pItem, m_iId) != WEAPON_AWP || gAwp[id] > AWP_NONE || !is_user_valid(id))
        return HC_CONTINUE;
    
    if(check_awp(id)){
        gAwp[id] = AWP_PICK_UP;
        return HC_CONTINUE;
    }
    
    SetHookChainReturn(ATYPE_INTEGER, false);
    return HC_SUPERCEDE;
}

//Native's
public plugin_natives()
    register_native("awpoff_check", "check_native", true);
    
public check_native(id, chat){
    #if defined AWP_LIMIT
    #if defined ALLPLAYERS
    if(!(TEAM_UNASSIGNED < gTeam[id] < TEAM_SPECTATOR))
        return false;
    #endif
    return check_awp(id, true, chat);
    #else
    return check_awp(id, chat);
    #endif
}
//Native's

#if defined AWP_LIMIT
bool: check_awp(id, check = false, chat = true)
#else
bool: check_awp(id, chat = true)
#endif
{
    new EBLOCKS:block;
    
    #if defined AWP_ROUND_LIMIT
    if(gBlock[id] > gRound)
        block = BL_RND;
    else
    #endif
    #if defined AWP_ONLINE
    if(gCount < sCvars[CVAR_ONLINE])
        block = BL_ONLINE;
    else
    #endif
    #if defined AWP_LIMIT
    if(sCvars[CVAR_LIMIT_AWP_STATUS]){
        if(sCvars[CVAR_LIMIT_IMMUN] && sCvars[CVAR_LIMIT_IMMUN] != 2 && get_user_flags(id) & FLAG)
            return true;
        
        #if defined PERCENT_PLAYERS       
        if(sAwp[gTeam[id]] < gLimit)
        #else
        if(sAwp[gTeam[id]] < sCvars[CVAR_LIMIT_MAX_AWP])
        #endif
        {
            if(!check)
                sAwp[gTeam[id]] ++;
            return true;
        }else
            block = BL_LIMIT;
    }else
    #endif
        return true;
        
    if(chat){                    //Слишком туп, чтобы придумать какой нибудь другой вариант с чатом.
        switch(block){
            #if defined AWP_ROUND_LIMIT
            case BL_RND:{
                new c = gBlock[id] - gRound;
                client_print_color(id, false, MSG_ROUND, MSG_PREFIX, c, get_text(c));
            }
            #endif
            #if defined AWP_ONLINE
            case BL_ONLINE:        client_print_color(id, false, "%s %s", MSG_PREFIX, MSG_LOWONLINE);
            #endif
            #if defined AWP_LIMIT
            case BL_LIMIT:        client_print_color(id, false, "%s %s", MSG_PREFIX, MSG_LIMIT);
            #endif
        }
    }   
    return false;
}

public RemoveItem(id, pItem){
    if(get_member(pItem, m_iId) == WEAPON_AWP)
        minus_awp(id);
}

stock minus_awp(id){   
    if(!is_user_valid(id) || gAwp[id] <= AWP_NONE)
        return;
    
    #if defined AWP_LIMIT || defined AWP_ROUND_LIMIT
    new flag = get_user_flags(id) & FLAG;
    #endif
    
    #if defined AWP_ROUND_LIMIT
    gAwp[id] = (flag && sCvars[CVAR_LIMIT_IMMUN] > 1) ? AWP_NONE : AWP_DROP;
    #else
    gAwp[id] = AWP_NONE;
    #endif
    
    #if defined AWP_LIMIT
    if(!sCvars[CVAR_LIMIT_AWP_STATUS])
        return;
        
    if(sCvars[CVAR_LIMIT_IMMUN] && sCvars[CVAR_LIMIT_IMMUN] != 2 && flag)
        return;
    
    sAwp[gTeam[id]] --;   
    #endif
}
    
stock bool: is_user_valid(id){
    if(is_user_bot(id) || is_user_hltv(id))       
        return false;   
    return true;
}
 
stock get_text(tm){
    new ost = tm % 10, ost2 = tm % 100, buff[16];
    
    if(ost2 >= 5 && ost2 <= 20)
        format(buff, charsmax(buff), "раундов");
    else{
        switch(ost){
            case 1:            format(buff, charsmax(buff), "раунд");
            case 2..4:        format(buff, charsmax(buff), "раунда");
            case 0, 5..9:    format(buff, charsmax(buff), "раундов");
        }
    }
    return buff;
}
 

1hp

Пользователь
Регистрация
28 Янв 2018
Сообщения
12
Симпатии
1
как исправить? кто нибудь подскажет?:rolleyes:
 

1hp

Пользователь
Регистрация
28 Янв 2018
Сообщения
12
Симпатии
1
Добавь на 298 строке после if( !is_user_alive(id)||
добавил. компилятор ругается.
//AMXXPC compile.exe
// by the AMX Mod X Dev Team


//// awp_off.sma
//
// C:\Users\User\Desktop\amxmodx-1.9.0-git5249-base-windows\addons\amxmodx\scripting\awp_off.sma(298) : error 028: invalid subscript (not an array or too many subscripts): "check_awp"
// C:\Users\User\Desktop\amxmodx-1.9.0-git5249-base-windows\addons\amxmodx\scripting\awp_off.sma(300) : warning 217: loose indentation
// C:\Users\User\Desktop\amxmodx-1.9.0-git5249-base-windows\addons\amxmodx\scripting\awp_off.sma(303) : error 021: symbol already defined: "SetHookChainReturn"
// C:\Users\User\Desktop\amxmodx-1.9.0-git5249-base-windows\addons\amxmodx\scripting\awp_off.sma(304) : error 010: invalid function or declaration
//
// 3 Errors.
// Could not locate output file C:\Users\User\Desktop\amxmodx-1.9.0-git5249-base-windows\addons\amxmodx\scripting\compiled\awp_off.amx (compile failed).
//
// Compilation Time: 1,36 sec
// ----------------------------------------

Press enter to exit ...
 

1hp

Пользователь
Регистрация
28 Янв 2018
Сообщения
12
Симпатии
1
Может строку покажешь?
Код:
public AddItem(id, pItem){
    if(get_member(pItem, m_iId) != WEAPON_AWP || gAwp[id] > AWP_NONE || !is_user_valid(id))
        return HC_CONTINUE;
        
    if(!is_user_alive(id)||(check_awp(id)){
        gAwp[id] = AWP_PICK_UP;
        return HC_CONTINUE;
    }
    
    SetHookChainReturn(ATYPE_INTEGER, false);
    return HC_SUPERCEDE;
}
 
K

kapangaIII

Верни все обратно и сделай преобразование на if'е который выше.
 

1hp

Пользователь
Регистрация
28 Янв 2018
Сообщения
12
Симпатии
1
Верни все обратно и сделай преобразование на if'е который выше.
сделал так . нормально скомпилилось. ошибок в логах и в консоли нет. но почему то теперь через випменю не берется авп. випменю стоит от Vaqtincha. V.I.P Custom Weapons

PHP:
if(!is_user_alive(id)){
        gAwp[id] = AWP_PICK_UP;
        return HC_CONTINUE;
    }
 
K

kapangaIII

Продолжай в том же духе. Может когда-нибудь поймёшь где и что требуется добавить и перестаешь делать противоположные вещи.
 

1hp

Пользователь
Регистрация
28 Янв 2018
Сообщения
12
Симпатии
1
Продолжай в том же духе. Может когда-нибудь поймёшь где и что требуется добавить и перестаешь делать противоположные вещи.
я не скриптер. и не шарю во всех этих значениях. тут я смотрю вообще форум мертвый. один чел в сутки вылезет поязвит и уйдет. твоя помощь точно не нужна господин разработчик.
 
K

kapangaIII

Ну ты видимо глупый, раз прочесть не можешь верно и просто скопировать и вставить в нужный участок.
 

NeTvoyKenji

Пользователь
Регистрация
27 Мар 2019
Сообщения
423
Симпатии
47
,
После этих манипуляций вылазит следующее:
Код:
L 11/26/2019 - 19:18:43: [AMXX] Displaying debug trace (плагин "awp_off.amxx", версия "1.4.3")
L 11/26/2019 - 19:18:43: [AMXX] Ошибка времени выполнения 4: index out of bounds
L 11/26/2019 - 19:18:43: [AMXX]    [0] awp_off.sma::minus_awp (line 407)
L 11/26/2019 - 19:18:43: [AMXX]    [1] awp_off.sma::client_disconnected (line 168)
Код:
#include < amxmodx >
#include < reapi >

#if AMXX_VERSION_NUM < 183
    #include < colorchat >
    
    #define client_disconnected client_disconnect
    #define MAX_PLAYERS 32
#endif

#define IsPlayer(%0)            (0 < %0 < 33)

//■■■■■■■■■■■■■■■■■■■■■■■ CONFIG START ■■■■■■■■■■■■■■■■■■■■■■■//
#define AWP_ONLINE                                        //Закоментируйте, если не нужен функционал отключения авп при низком онлайне
#define AWP_LIMIT                                        //Закоментируйте, если не нужен функционал ограничения авп по командам
//#define AWP_ROUND_LIMIT                                    //Закоментируйте, если не нужен функционал ограничения авп по раундам

// ^4 - зелёный | ^3 - цвет тимы (КТ - синий | Т - красный | SPEC - серый) | ^1 - жёлтый
#define MSG_PREFIX             "^4[^4Old School^4]"
#define MSG_LOWONLINE         "У вас^4 отобрано^3 AWP. Причина:^4 низкий онлайн."
#define MSG_LIMIT             "У вас^4 отобрано^3 AWP. Причина:^4 превышен лимит."
#define MSG_ROUND             "%s У вас^4 отобрано^3 AWP. Причина:^4 подождите %d %s"

#define ALLPLAYERS
/*
    Закоментируйте, чтобы для проверки на онлайн брались только КТ и ТТ(ботов, хлтв и спектаров считать не будет).
 
    Пример:
    Допустим на сервере 5 ботов и 2 человека 1 хлтв.
    Дефайн закоментирован: Посчитает, что на сервере 2 из Максимально возможных игроков.
    Дефайн раскоментирован: Посчитает, что на сервере 8 игроков из Максимально возможных игроков (5 ботов + 2 человека + 1 хлтв).
 
    Отбирать авп будет ТОЛЬКО У ЛЮДЕЙ в любом случае.
*/

#define FLAG                 ADMIN_BAN                //Флаг для иммунитета от лимита и блока на раунды

#define RETURN_MONEY                                //Возвращать деньги при отборе авп в конце раунда из-за низкого онлайна? (Закоментируйте, если не хотите, чтобы возвращало деньги)
#if defined RETURN_MONEY
    #define MONEY_AWP        4750                    //Сколько денег возвращать?
#endif

#define PERCENT_PLAYERS
/*
    Разкоменитруйте, если хотите чтобы лимит зависил от процента игроков [I am chetko ob'yasnyat']
 
    Например: Онлайн = 10, Процент в кваре(awp_limit_max) = 20
    10/100*20 = 2 авп на тиму (2 у терров и 2 у кт)
*/

//#define NOEND            //Если разкоментировано, то не будет отбирать АВП в конце раунда из-за низкого онлайна. [Если онлайн ниже чем указан в кваре и человек сам дропнет авп или потеряет ее, то подобрать заного не сможет]
//■■■■■■■■■■■■■■■■■■■■■■■■ CONFIG END ■■■■■■■■■■■■■■■■■■■■■■■■//

#if !defined AWP_LIMIT && defined PERCENT_PLAYERS
    #undef PERCENT_PLAYERS
#endif
#if !defined AWP_ONLINE && !defined NOEND
    #define NOEND
#endif

enum ECVARS {
    CVAR_ONLINE,
    CVAR_LIMIT_AWP_STATUS,
    CVAR_LIMIT_MAX_AWP,
    CVAR_LIMIT_IMMUN,
    CVAR_ROUNDS_LIMIT
};

enum EBLOCKS {
    BL_RND,
    BL_LIMIT,
    BL_ONLINE
};

enum {
    AWP_DROP = 0,
    AWP_NONE,
    AWP_BUY,
    AWP_PICK_UP
};

new gCvar[ECVARS], sCvars[ECVARS], COST_AWP, gAwp[MAX_PLAYERS + 1], gCount;

#if defined AWP_LIMIT || defined AWP_ROUND_LIMIT
new TeamName: gTeam[MAX_PLAYERS + 1];
#endif
#if defined AWP_LIMIT
new sAwp[TeamName: TEAM_SPECTATOR];
#endif
#if defined AWP_ROUND_LIMIT
new gBlock[MAX_PLAYERS + 1], gRound;
#endif

#if defined PERCENT_PLAYERS
new gLimit;
#endif

public plugin_precache(){
    register_plugin("[ReAPI] AWPoff", "1.4.3", "PAffAEJIkA :3");
    
    #if !defined AWP_LIMIT && !defined AWP_ROUND_LIMIT && !defined AWP_ONLINE
    set_fail_state("xmm, ti ubral ves' funkcional plagina, no postavil ego na server... ti molodec!");
    #endif
    
    #if defined AWP_ONLINE
    gCvar[CVAR_ONLINE] =             register_cvar("awp_players_low", "8");        //Если онлайн ниже указнного в кваре, в конце раунда у всех отберет авп, и запретит ее. (Что бы отключить поставьте 0) [стандартно: при онлайне меньше 8]
    #endif
    #if defined AWP_LIMIT
    gCvar[CVAR_LIMIT_AWP_STATUS] =     register_cvar("awp_limit", "1");            //Включить|Выключить лимит авп [Стандартно: включен]
    gCvar[CVAR_LIMIT_MAX_AWP] =        register_cvar("awp_limit_max", "2");        //Сколько АВП разрешено при лимите [Стандартно по 2 авп на команду] | Если раскоментирован PERCENT_PLAYERS, то сюда вписывать нужный процент
    gCvar[CVAR_LIMIT_IMMUN] =         register_cvar("awp_limit_immun", "1");        //Иммунитет для админов. [0 - Выкл | 1 - Иммунитет от лимита кол-ва АВП | 2 - Иммунитет от блока АВП по раундам | 3 - Имумунитет от 1 и 2]
    #endif
    #if defined AWP_ROUND_LIMIT
    gCvar[CVAR_ROUNDS_LIMIT] =         register_cvar("awp_limit_round", "1");        //На сколько раундов блочить?
    #endif
}

public plugin_init(){   
    new mapname[32];
    get_mapname(mapname, charsmax(mapname));   
    
    static maps[][] = { "awp", "aim", "35hp" };
    for(new i; i < sizeof maps; i++){
        if(containi(mapname, maps[i]) != -1){
            pause("ad");
            return;
        }
    }
    
    COST_AWP = rg_get_weapon_info(WEAPON_AWP, WI_COST);
    
    RegisterHookChain(RG_CBasePlayer_AddPlayerItem, "AddItem");
    RegisterHookChain(RG_BuyWeaponByWeaponID, "BuyWeaponByWeaponID");
    RegisterHookChain(RG_CBasePlayer_RemovePlayerItem, "RemoveItem");
    
    register_concmd("awpoff_reload", "load_cvars");
    
    register_event("HLTV", "EventRoundStart", "a", "1=0", "2=0");
    register_logevent("EventRestartRound", 2, "1&Restart_Round_");
    #if !defined NOEND
    register_logevent("EventRoundEnd", 2, "1=Round_End");
    #endif
}

public plugin_cfg(){
    #if AMXX_VERSION_NUM < 183
    server_exec();
    #endif
    load_cvars(0);
}

public load_cvars(id){
    #if defined AWP_ONLINE
    sCvars[CVAR_ONLINE] =                     get_pcvar_num(gCvar[CVAR_ONLINE]);
    #endif
    #if defined AWP_LIMIT
    sCvars[CVAR_LIMIT_AWP_STATUS] =         get_pcvar_num(gCvar[CVAR_LIMIT_AWP_STATUS]);
    sCvars[CVAR_LIMIT_MAX_AWP] =             get_pcvar_num(gCvar[CVAR_LIMIT_MAX_AWP]);
    sCvars[CVAR_LIMIT_IMMUN] =                 get_pcvar_num(gCvar[CVAR_LIMIT_IMMUN]);
    #endif
    #if defined AWP_ROUND_LIMIT
    sCvars[CVAR_ROUNDS_LIMIT] =             get_pcvar_num(gCvar[CVAR_ROUNDS_LIMIT]);
    #endif
    if(IsPlayer(id))   
        client_print(id, print_center, "[AWPoff] Cvars have been reloaded!");
}

public client_disconnected(id)    if(IsPlayer(id))    minus_awp(id);

public EventRoundStart(){
    #if defined AWP_ROUND_LIMIT
    gRound ++;
    #endif
    
    gCount = 0;   
    
    static pl[32];
    get_pl(pl, gCount);
    
    #if defined PERCENT_PLAYERS
    const MAX_PERCENT = 100;
    gLimit = gCount * sCvars[CVAR_LIMIT_MAX_AWP] / MAX_PERCENT;
    #endif
    
    #if defined AWP_LIMIT
    sAwp[TEAM_CT] = 0;
    sAwp[TEAM_TERRORIST] = 0;
    #endif
    
    #if defined AWP_LIMIT || defined AWP_ROUND_LIMIT
    for(new i,id; i < gCount; i ++){
        id = pl[i];
        
        gTeam[id] = get_member(id, m_iTeam);   
        #if defined ALLPLAYERS
        if(!(TEAM_UNASSIGNED < gTeam[id] < TEAM_SPECTATOR) || !is_user_valid(id))
            continue;
        #endif
        
        switch(gAwp[id]){           
            case AWP_NONE:    continue;
            #if defined AWP_ROUND_LIMIT
            case AWP_DROP:{
                gAwp[id] = AWP_NONE;
                gBlock[id] = gRound + sCvars[CVAR_ROUNDS_LIMIT];
            }
            #endif
            #if defined AWP_LIMIT
            default:        sAwp[gTeam[id]] ++;
            #endif
        }
    }
    #endif
}

public EventRestartRound(){
    #if defined AWP_LIMIT
    sAwp[TEAM_CT] = 0;
    sAwp[TEAM_TERRORIST] = 0;
    #endif
    #if defined  AWP_ROUND_LIMIT
    gRound = 0;
    arrayset(gBlock, false, sizeof gBlock);
    #endif
    arrayset(gAwp, AWP_NONE, sizeof gAwp);
}

#if !defined NOEND
public EventRoundEnd(){
    new players[32], count;
    get_pl(players, count);
    
    if(count >= sCvars[CVAR_ONLINE])
        return PLUGIN_CONTINUE;
    
    for(new i = 0; i < count; i ++){       
        #if defined ALLPLAYERS       
        if(!is_user_valid(players[i]))   
            continue;
        #endif

        return_awp(players[i]);
    }
    EventRestartRound();
    return PLUGIN_CONTINUE;
}
#endif

stock get_pl(players[32], &count){
    #if defined ALLPLAYERS
    get_players(players, count);
    #else
    get_players(players, count, "ch");   
    new players1[32], cnt = 0;
    for(new i; i < count; i ++){
        if(TEAM_UNASSIGNED < get_member(players[i], m_iTeam) < TEAM_SPECTATOR)
            players1[cnt ++] = players[i];
    }
    
    players = players1;
    count = cnt;
    #endif
}

stock return_awp(id){   
    if(gAwp[id] <= AWP_NONE)
        return;
    
    rg_remove_item(id, "weapon_awp");
    #if defined RETURN_MONEY
    if(gAwp[id] == AWP_BUY)
        rg_add_account(id, MONEY_AWP);
    #endif
    client_print_color(id, false, "%s %s", MSG_PREFIX, MSG_LOWONLINE);
}

public BuyWeaponByWeaponID(id, WeaponIdType:weaponID){
    if(weaponID != WEAPON_AWP || !is_user_valid(id) || gAwp[id] > AWP_NONE)
        return HC_CONTINUE;
        
    new gMoney = get_member(id, m_iAccount);
    if(gMoney < COST_AWP)
        return HC_CONTINUE;
    
    if(check_awp(id)){
        gAwp[id] = AWP_BUY;
        return HC_CONTINUE;
    }
    
    SetHookChainReturn(ATYPE_INTEGER, true);
    return HC_SUPERCEDE;
}

public AddItem(id, pItem){
    if(get_member(pItem, m_iId) != WEAPON_AWP || gAwp[id] > AWP_NONE || !is_user_valid(id))
        return HC_CONTINUE;
    
    if(!is_user_alive(id)||check_awp(id)){
        gAwp[id] = AWP_PICK_UP;
        return HC_CONTINUE;
    }
    
    SetHookChainReturn(ATYPE_INTEGER, false);
    return HC_SUPERCEDE;
}

//Native's
public plugin_natives()
    register_native("awpoff_check", "check_native", true);
    
public check_native(id, chat){
    #if defined AWP_LIMIT
    #if defined ALLPLAYERS
    if(!(TEAM_UNASSIGNED < gTeam[id] < TEAM_SPECTATOR))
        return false;
    #endif
    return check_awp(id, true, chat);
    #else
    return check_awp(id, chat);
    #endif
}
//Native's

#if defined AWP_LIMIT
bool: check_awp(id, check = false, chat = true)
#else
bool: check_awp(id, chat = true)
#endif
{
    new EBLOCKS:block;
    
    #if defined AWP_ROUND_LIMIT
    if(gBlock[id] > gRound)
        block = BL_RND;
    else
    #endif
    #if defined AWP_ONLINE
    if(gCount < sCvars[CVAR_ONLINE])
        block = BL_ONLINE;
    else
    #endif
    #if defined AWP_LIMIT
    if(sCvars[CVAR_LIMIT_AWP_STATUS]){
        if(sCvars[CVAR_LIMIT_IMMUN] && sCvars[CVAR_LIMIT_IMMUN] != 2 && get_user_flags(id) & FLAG)
            return true;
        
        #if defined PERCENT_PLAYERS       
        if(sAwp[gTeam[id]] < gLimit)
        #else
        if(sAwp[gTeam[id]] < sCvars[CVAR_LIMIT_MAX_AWP])
        #endif
        {
            if(!check)
                sAwp[gTeam[id]] ++;
            return true;
        }else
            block = BL_LIMIT;
    }else
    #endif
        return true;
        
    if(chat){                    //Слишком туп, чтобы придумать какой нибудь другой вариант с чатом.
        switch(block){
            #if defined AWP_ROUND_LIMIT
            case BL_RND:{
                new c = gBlock[id] - gRound;
                client_print_color(id, false, MSG_ROUND, MSG_PREFIX, c, get_text(c));
            }
            #endif
            #if defined AWP_ONLINE
            case BL_ONLINE:        client_print_color(id, false, "%s %s", MSG_PREFIX, MSG_LOWONLINE);
            #endif
            #if defined AWP_LIMIT
            case BL_LIMIT:        client_print_color(id, false, "%s %s", MSG_PREFIX, MSG_LIMIT);
            #endif
        }
    }   
    return false;
}

public RemoveItem(id, pItem){
    if(get_member(pItem, m_iId) == WEAPON_AWP)
        minus_awp(id);
}

stock minus_awp(id){   
    if(!is_user_valid(id) || gAwp[id] <= AWP_NONE)
        return;
    
    #if defined AWP_LIMIT || defined AWP_ROUND_LIMIT
    new flag = get_user_flags(id) & FLAG;
    #endif
    
    #if defined AWP_ROUND_LIMIT
    gAwp[id] = (flag && sCvars[CVAR_LIMIT_IMMUN] > 1) ? AWP_NONE : AWP_DROP;
    #else
    gAwp[id] = AWP_NONE;
    #endif
    
    #if defined AWP_LIMIT
    if(!sCvars[CVAR_LIMIT_AWP_STATUS])
        return;
        
    if(sCvars[CVAR_LIMIT_IMMUN] && sCvars[CVAR_LIMIT_IMMUN] != 2 && flag)
        return;
    
    sAwp[gTeam[id]] --;   
    #endif
}
    
stock bool: is_user_valid(id){
    if(is_user_bot(id) || is_user_hltv(id))       
        return false;   
    return true;
}
 
stock get_text(tm){
    new ost = tm % 10, ost2 = tm % 100, buff[16];
    
    if(ost2 >= 5 && ost2 <= 20)
        format(buff, charsmax(buff), "раундов");
    else{
        switch(ost){
            case 1:            format(buff, charsmax(buff), "раунд");
            case 2..4:        format(buff, charsmax(buff), "раунда");
            case 0, 5..9:    format(buff, charsmax(buff), "раундов");
        }
    }
    return buff;
}
 
K

kapangaIII

1574857001808.png


Причем здесь вообще это?

Как это:
1574857033672.png

Относится к ошибке происходящей в дисконнекте?
 

soob

Пользователь
Регистрация
28 Июн 2018
Сообщения
27
Симпатии
1
Пол
Мужской
[AMXX] Run time error 10 (plugin "awp_off.amxx") (native "SetHookChainReturn") - debug not enabled!
[AMXX] To enable debug mode, add "debug" after the plugin name in plugins.ini (without quotes).
Установил плагин с дефолтными настройками, но вылазит вот такая ошибка и awp запрещено вообще.
 

r1nk0

Пользователь
Регистрация
3 Окт 2018
Сообщения
258
Симпатии
53
Установил плагин с дефолтными настройками, но вылазит вот такая ошибка и awp запрещено вообще.
ну дак пропиши debug после плагина.
Скорее всего.

Изменить:
SetHookChainReturn(ATYPE_INTEGER, true)

На:
SetHookChainReturn(ATYPE_BOOL, true)
 

kupoross

Пользователь
Регистрация
27 Июн 2018
Сообщения
13
Симпатии
0
Господа. Верно ли я понимаю, что иммунитета на запрет по онлайну нет? Если да, то подскажите код, который нужно добавить в исходник, чтобы иммунитет был еще и на запрет по онлайну.
 

r1nk0

Пользователь
Регистрация
3 Окт 2018
Сообщения
258
Симпатии
53
Господа. Верно ли я понимаю, что иммунитета на запрет по онлайну нет? Если да, то подскажите код, который нужно добавить в исходник, чтобы иммунитет был еще и на запрет по онлайну.
верно ли я понимаю что пункт Настройки в исходе: вы вообще не читали?
 

kupoross

Пользователь
Регистрация
27 Июн 2018
Сообщения
13
Симпатии
0
верно ли я понимаю что пункт Настройки в исходе: вы вообще не читали?
Понимаете не верно, ибо иммунитет работает только на лимит и запрет по раундам.
Где вы тут видите иммунитет на запрет по онлайну?

awp_limit_immun "1" //Иммунитет для админов. [0 - Выкл | 1 - Иммунитет от лимита кол-ва АВП | 2 - Иммунитет от блока АВП по раундам | 3 - Имумунитет от 1 и 2]
 
Сверху Снизу