Run time error 4: index out of bounds

Статус
В этой теме нельзя размещать новые ответы.
Сообщения
1,340
Реакции
528
Помог
91 раз(а)
Ошибка
Run time error 4: index out of bounds
[0] awp_off_14.sma::check_awp (line 348)
[1] awp_off_14.sma::BuyWeaponByWeaponID (line 285)

Run time error 4: index out of bounds
[0] awp_off_14.sma::check_awp (line 348)
[1] awp_off_14.sma::AddItem (line 298)

Run time error 4: index out of bounds
[0] awp_off_14.sma::minus_awp (line 407)
[1] awp_off_14.sma::client_disconnected (line 168)
ОС
Linux
Amx Mod X
AMX Mod X 1.9.0.5241
Билд
ReHLDS version: 3.7.0.692-dev
ReGamedll
ReGameDLL version: 5.11.0.420-dev+m
Версия Metamod
Metamod-r v1.3.0.128, API (5:13)
Список метамодулей
[ 1] Reunion               RUN   -    reunion.so                  v0.1.0.133       ini  Start Never
[ 2] ReAuthCheck RUN - reauthcheck.so v0.1.6 ini Start Never
[ 3] Revoice RUN - revoice_mm_i386.so v0.1.0.33 ini Start Never
[ 4] SafeNameAndChat RUN - SafeNameAndChat.so v1.1 ini ANY
[ 5] Rechecker RUN - rechecker.so v2.5 ini ANY
[ 6] ReSRDetector RUN - resrdetector_mm_i386.so v0.1.0 ini ANY
[ 7] ReSemiclip RUN - resemiclip.so v2.3.9 ini ANY
[ 8] Ultimate Unprecacher RUN - unprecacher_i386.so vBeta 2.5.3 ini Chlvl Chlvl
[ 9] AMX Mod X RUN - amxmodx.so v1.9.0.5241 ini Start ANY
[10] WHBlocker RUN - whblocker.so v1.5.696 ini Chlvl ANY
[11] MySQL RUN - mysql_amxx_i386.so v1.9.0.5241 pl9 ANY ANY
[12] ReAPI RUN - reapi_amxx_i386.so v5.10.0.188-dev pl9 ANY Never
[13] Fun RUN - fun_amxx_i386.so v1.9.0.5241 pl9 ANY ANY
[14] CStrike RUN - cstrike_amxx_i386.so v1.9.0.5241 pl9 ANY ANY
[15] CSX RUN - csx_amxx_i386.so v1.9.0.5241 pl9 ANY ANY
[16] ReAimDetector RUN - reaimdetector_amxx_i386.so v0.2.2 pl9 ANY Never
[17] FakeMeta RUN - fakemeta_amxx_i386.so v1.9.0.5241 pl9 ANY ANY
[18] Ham Sandwich RUN - hamsandwich_amxx_i386.so v1.9.0.5241 pl9 ANY ANY
[19] Engine RUN - engine_amxx_i386.so v1.9.0.5241 pl9 ANY ANY
19 plugins, 19 running
Список плагинов
[  1] [ACP] General           v1.3         Hafner            acp_general.amx  running  
[ 2] ScreenMaker v1.1 neygomon screen_maker.am running
[ 3] FreshBans v1.4.0b kanagava fresh_bans_140_ running
[ 4] Warnings v0.0.3 beta Subb98 warnings_ban_co running
[ 5] Voice Control by CsSta v1.3[Engine neygomon voice_control.a running
[ 6] [ReAPI] AdminFreeLook v1.0 ReHLDS Team adminfreelook.a running
[ 7] [183] Ultimate Models v19.09.20 SKAJIbnEJIb ultimate_models running
[ 8] Weapon Restrict v2.1 s1lent & neugomo weaponrest.amxx running
[ 9] [ReAPI:AMXX] Buy Nades v0.0.3 steelzorrr amxx_buy_nades_ running
[ 10] [183] Ultimate Weapons v18.08.08BE SKAJIbnEJIb ultimate_weapon running
[ 11] [183] VIP RBS v18.12.17BE SKAJIbnEJIb vip_rbs.amxx running
[ 12] [ReAPI] Random Weapons v2.4.8 neugomon/h1k3 random_weapons_ running
[ 13] [183] Ultimate Flags v18.12.16 SKAJIbnEJIb ultimate_flags. running
[ 14] [183] WeaponMenu RBS v18.12.29BE SKAJIbnEJIb weaponmenu_rbs. running
[ 15] Team Custom Skin v0.0.1 Vaqtincha team_custom_ski running
[ 16] Team Custom Skin v0.0.1 Vaqtincha team_custom_ski running
[ 17] Team Custom Skin v0.0.1 Vaqtincha team_custom_ski running
[ 18] Team Custom Skin v0.0.1 Vaqtincha team_custom_ski running
[ 19] [183] Ultimate Gag v19.02.05BE SKAJIbnEJIb ultimate_gag.am running
[ 20] Admin Commands v1.9.0.5241 AMXX Dev Team admincmd.amxx running
[ 21] Menus Front-End v1.9.0.5241 AMXX Dev Team menufront.amxx running
[ 22] Commands Menu v1.9.0.5241 AMXX Dev Team cmdmenu.amxx running
[ 23] Players Menu v1.9.0.5241 AMXX Dev Team plmenu.amxx running
[ 24] Maps Menu v19.09.01 SKAJIbnEJIb & AM mapsmenu_rbs.am running
[ 25] VoteBan v2.0 UFPS + F@nToM voteban_f.amxx running
[ 26] Pause Plugins v1.9.0.5241 AMXX Dev Team pausecfg.amxx running
[ 27] CsStats MySQL v15.07.15 SKAJIbnEJIb csstats_mysql.a running
[ 28] StatsX RBS v15.07.24 SKAJIbnEJIb & AM statsx_rbs.amxx running
[ 29] Stats Configuration v15.07.15 SKAJIbnEJIb & AM statscfg_rbs.am running
[ 30] CS Misc. Stats v1.9.0.5241 AMXX Dev Team miscstats_MY_19 running
[ 31] [183] AfkKicker RBS v19.08.28 SKAJIbnEJIb afkkicker_rbs.a running
[ 32] Ping Control v1.31f neygomon(+wopox ping_control_wo running
[ 33] [ReAPI] Flasher Punish v0.0.2b Vaqtincha reapi_flasher_p running
[ 34] Advert Chat v2.0 UFPS + F@nToM adv_chat_f.amxx running
[ 35] Reset Score v2.0 UFPS + F@nToM rs_f.amxx running
[ 36] Chat Manager v1.1.1-11 Mistrick chatmanager.amx running
[ 37] Chat Manager: Addon v0.0.4-70 Mistrick chatmanager_add running
[ 38] Map Manager: Core v3.0.5 Mistrick map_manager_cor running
[ 39] Map Manager: Scheduler v0.1.3 Mistrick map_manager_sch running
[ 40] Map Manager: Advanced v0.0.5 Mistrick map_manager_adv running
[ 41] Map Manager: BlockList v0.0.3 Mistrick map_manager_blo running
[ 42] Map Manager: Effects v0.0.8 Mistrick map_manager_eff running
[ 43] Map Manager: Informer v0.0.5 Mistrick map_manager_inf running
[ 44] Map Manager: Nominatio v0.1.2 Mistrick map_manager_nom running
[ 45] Map Manager: Online so v0.0.2 Mistrick map_manager_onl running
[ 46] Map Manager: Rtv v0.1.1 Mistrick map_manager_rtv running
[ 47] Connect Info v10.10.2018 w0w connect_for_adm running
[ 48] ReAimDetector API v0.2.2 ReHLDS Team reaimdetector.a running
[ 49] [183] Damager RBS v19.08.30 SKAJIbnEJIb damager_rbs.amx running
[ 50] [183] Demo Recorder RB v18.02.08 SKAJIbnEJIb demorecorder_rb running
[ 51] Steаm Bonus v1.1 ill+F@nToM steam_bonus_my_ running
[ 52] Noob Bonus System v0.3 Subb98+Vaqtincha noob_bonus_syst running
[ 53] Parachute [ReAPI] v2.0 Leo_[BH] parachute_re.am running
[ 54] [183] Crux Ansata v17.10.30 Sanlerus crux_ansata.amx running
[ 55] GameName Changer v1.0 neugomon gamename_change running
[ 56] Best Player v2.2.9 DUKKHAZ0R | Jack best_player.amx running
[ 57] Winter Environment v1.0 Alka summer.amxx running
[ 58] client_buy forward v0.1.1 ConnorMcLeod client_buy1.amx running
[ 59] Health Grenade v1.2.8 Radius health_grenade. running
[ 60] Bomb pickup on use v1.0.1 voed use_bomb_pickup running
[ 61] [ReAPI] AWPoff v1.4.3 PAffAEJIkA :3 awp_off_14.amxx debug
[ 62] SF Bets v0.1.5 serfreeman1337 sf_bets.amxx running
[ 63] Private Message v0.9 Denzer pm.amxx running
[ 64] [ReAPI] Block 'Fire in v0.0.1 sergrib reapi_block_FIT running
[ 65] Informer DHUD v2.0 UFPS.Team DHUD_fantom.amx running
[ 66] ColorChat v0.1.0 ConnorMcLeod colorchat.amxx running
[ 67] Advanced Experience Sy v0.4 serfreeman1337 aes_main.amxx running
[ 68] AES: Exp CSTRIKE v0.3 serfreeman1337 aes_exp_cstrike running
[ 69] AES: Informer v0.2 serfreeman1337 aes_informer.am running
[ 70] AES: Experience Editor v0.1 serfreeman1337 aes_exp_editor. running
[ 71] AES: Bonus System v0.2 serfreeman1337 aes_bonus_syste running
[ 72] AES: Bonus CSTRIKE v0.4 serfreeman1337 aes_bonus_cstri running
72 plugins, 72 running
Автор плагина
PAffAEJIkA :3
Версия плагина
v1.4.3
Исходный код
#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 "^1[^4AWP^1]"
#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", "0"); //Если онлайн ниже указнного в кваре, в конце раунда у всех отберет авп, и запретит ее. (Что бы отключить поставьте 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", "13"); //Сколько АВП разрешено при лимите [Стандартно по 2 авп на команду] | Если раскоментирован PERCENT_PLAYERS, то сюда вписывать нужный процент
gCvar[CVAR_LIMIT_IMMUN] = register_cvar("awp_limit_immun", "3"); //Иммунитет для админов. [0 - Выкл | 1 - Иммунитет от лимита кол-ва АВП | 2 - Иммунитет от блока АВП по раундам | 3 - Имумунитет от 1 и 2]
#endif
#if defined AWP_ROUND_LIMIT
gCvar[CVAR_ROUNDS_LIMIT] = register_cvar("awp_limit_round", "0"); //На сколько раундов блочить?
#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;
}
Run time error 4: index out of bounds
[0] awp_off_14.sma::check_awp (line 348)
[1] awp_off_14.sma::BuyWeaponByWeaponID (line 285)

Run time error 4: index out of bounds
[0] awp_off_14.sma::check_awp (line 348)
[1] awp_off_14.sma::AddItem (line 298)

Run time error 4: index out of bounds
[0] awp_off_14.sma::minus_awp (line 407)
[1] awp_off_14.sma::client_disconnected (line 168)
 
В этой теме было размещено решение! Перейти к решению.
Сообщения
432
Реакции
410
Помог
14 раз(а)
Код:
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];
        if(!is_user_valid(id))
            continue;
           
        gTeam[id] = get_member(id, m_iTeam);
        #if defined ALLPLAYERS
        if(!(TEAM_UNASSIGNED < gTeam[id] < TEAM_SPECTATOR))
            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
}
Код:
stock bool: is_user_valid(id){
    if(!is_user_connected(id) || is_user_bot(id) || is_user_hltv(id))       
        return false;   
    return true;
}
Должно быть ок
 
Сообщения
1,340
Реакции
528
Помог
91 раз(а)
voed, еще)))
Код:
[0] awp_off_14.sma::check_awp (line 350)
[1] awp_off_14.sma::BuyWeaponByWeaponID (line 287)

[0] awp_off_14.sma::check_awp (line 350)
[1] awp_off_14.sma::AddItem (line 300)

Код:
#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             "^1[^4AWP^1]"
#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", "0");        //Если онлайн ниже указнного в кваре, в конце раунда у всех отберет авп, и запретит ее. (Что бы отключить поставьте 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", "13");        //Сколько АВП разрешено при лимите [Стандартно по 2 авп на команду] | Если раскоментирован PERCENT_PLAYERS, то сюда вписывать нужный процент
    gCvar[CVAR_LIMIT_IMMUN] =         register_cvar("awp_limit_immun", "3");        //Иммунитет для админов. [0 - Выкл | 1 - Иммунитет от лимита кол-ва АВП | 2 - Иммунитет от блока АВП по раундам | 3 - Имумунитет от 1 и 2]
    #endif
    #if defined AWP_ROUND_LIMIT
    gCvar[CVAR_ROUNDS_LIMIT] =         register_cvar("awp_limit_round", "0");        //На сколько раундов блочить?
    #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];
        if(!is_user_valid(id))
            continue;
          
        gTeam[id] = get_member(id, m_iTeam);
        #if defined ALLPLAYERS
        if(!(TEAM_UNASSIGNED < gTeam[id] < TEAM_SPECTATOR))
            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_connected(id) || 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;
}
 
Последнее редактирование:

d3m37r4

111111
Сообщения
1,451
Реакции
1,177
Помог
10 раз(а)
present, в плагине заюзано всё что можно, кроме нужных хуков, выкинь его.
 
Сообщения
1,340
Реакции
528
Помог
91 раз(а)
Можно закрыть без решения, спасибо voed что вызвался помочь, но как сказано выше такой омно код сложно поправить)))
 

d3m37r4

111111
Сообщения
1,451
Реакции
1,177
Помог
10 раз(а)
present, Если нужен авп лимит более менее нормальный, юзай неугомоновский, или fantom напиши, он делал нормальный.
 
Сообщения
1,340
Реакции
528
Помог
91 раз(а)
d3m37r4, спасибо, но я уже на пути решения данной проблемы.
 
Статус
В этой теме нельзя размещать новые ответы.

Пользователи, просматривающие эту тему

Сейчас на форуме нет ни одного пользователя.
Сверху Снизу