AkycTuk
Участник
- Сообщения
- 73
- Реакции
- 19
- Баллы
- 8
Ссылка на плагин
В данном плагине иногда появляется ошибка вида:
Как понимаю ошибка возникает, когда игрок успевает выйти во время голосования.
Нашёл решение в интернете, заменить:
на
Но тогда плагин компилируется с варнингами:
Добавил ";" в инклуд, осталось понять, чем ему не нравятся отступы пунктов 1 и 2?
И собственно, такое решение уберет ошибку "Player 24 is not in game" ?
В данном плагине иногда появляется ошибка вида:
L 03/15/2020 - 16:33:46: Player 24 is not in game.
L 03/15/2020 - 16:33:46: [AMXX] Run time error 10 (plugin "VoteBan_Menu.amxx") (native "menu_display") - debug not enabled!
L 03/15/2020 - 16:33:46: [AMXX] To enable debug mode, add "debug" after the plugin name in plugins.ini (without quotes).
L 03/15/2020 - 16:33:46: [AMXX] Run time error 10 (plugin "VoteBan_Menu.amxx") (native "menu_display") - debug not enabled!
L 03/15/2020 - 16:33:46: [AMXX] To enable debug mode, add "debug" after the plugin name in plugins.ini (without quotes).
Как понимаю ошибка возникает, когда игрок успевает выйти во время голосования.
L 10/02/2020 - 21:50:36: Start of error session.
L 10/02/2020 - 21:50:36: Info (map "de_dust2") (file "addons/amxmodx/logs/error_20201002.log")
L 10/02/2020 - 21:50:36: [AMXX] Displaying debug trace (plugin "VoteBan_Menu.amxx", version "1.1")
L 10/02/2020 - 21:50:36: [AMXX] Run time error 4: index out of bounds
L 10/02/2020 - 21:50:36: [AMXX] [0] VoteBan_Menu.sma::ReasonsMenuHandler (line 243)
L 10/02/2020 - 21:50:36: Info (map "de_dust2") (file "addons/amxmodx/logs/error_20201002.log")
L 10/02/2020 - 21:50:36: [AMXX] Displaying debug trace (plugin "VoteBan_Menu.amxx", version "1.1")
L 10/02/2020 - 21:50:36: [AMXX] Run time error 4: index out of bounds
L 10/02/2020 - 21:50:36: [AMXX] [0] VoteBan_Menu.sma::ReasonsMenuHandler (line 243)
Нашёл решение в интернете, заменить:
C++:
for(new i; i < g_iVoteBanPlayersNum; ++i)
{
if(g_iVoteBanPlayers[i] != g_iVictim)
menu_display(g_iVoteBanPlayers[i], g_iVoteMenu);
}[
на
C++:
new pPlayers[MAX_PLAYERS], iPlCount
get_players(pPlayers, iPlCount, "ch")
for(new i; i < iPlCount; i++) {
if(pPlayers[i] != g_iVictim)
menu_display(pPlayers[i], g_iVoteMenu);
}
Но тогда плагин компилируется с варнингами:
Код:
1. AMX Mod X 1.9.0 5271 (Reapi 5.11.0.197)\VoteBan_Menu.sma(275) : warning 217: loose indentation
2. AMX Mod X 1.9.0 5271 (Reapi 5.11.0.197)\VoteBan_Menu.sma(281) : warning 217: loose indentation
3. AMX Mod X 1.9.0 5271 (Reapi 5.11.0.197)\include\gamecms5.inc(109) : error 001: expected token: ";", but found "enum"
Добавил ";" в инклуд, осталось понять, чем ему не нравятся отступы пунктов 1 и 2?
C++:
#include <amxmodx>
#pragma semicolon 1
new szPluginInfo[][] = { "VoteBan Menu", "1.1" };
// Для поддержки создания услуги: Иммунитет от VoteBan'a
// NOTE: Требуется плагин GameCms API
// Закомментируйте для отключения поддержки GameCMS API
#define SUPPORT_CMS
// Название файла для записи логов
// NOTE: расширение ".log" Обязательно!
#define LogFile_Name "VoteBan_Menu.log"
// Стандартные причины VoteBan.
// Максимальное кол-во 8 (Иначе сломается меню)
// Пункт "Своя причина" добавляется в конце списка.
new g_aBanReasons[][64] = {
"Читер",
"Флуд в Микро",
"Мешает играть",
"Оскорбляет игроков",
"Неадекватное поведение"
};
#if defined SUPPORT_CMS
#include <gamecms5>
#endif
new g_iReasonsMenu;
new g_iVoteMenu;
new _access, callback, ItemData[3];
new g_iInsider;
new g_iVoteStartTime;
new g_iVoteCount, bool:g_bIsVoted[33];
new g_iVictim;
new g_sBanReason[128];
new g_iVoteBanPlayersNum, g_iVoteBanPlayers[33];
enum E_Cvars {
C_Access_VTB,
C_AccessFlags[16],
C_ChatPrefix[16],
C_MinPlayers,
Float:C_BanRatio,
C_TimeBetween,
Float:C_DurationVote,
C_BanTime,
C_BanType,
C_FlagsImmunity[16],
C_AdminFlags[16],
#if defined SUPPORT_CMS
C_ServiceName[32],
#endif
}
new Cvars[E_Cvars];
public plugin_init() {
register_clcmd("voteban", "CmdVoteban");
register_clcmd("say /voteban", "CmdVoteban");
register_clcmd("say_team /voteban", "CmdVoteban");
register_clcmd("say /vtb", "CmdVoteban");
register_clcmd("say_team /vtb", "CmdVoteban");
register_clcmd("vtb_reason", "ClCmdReason");
register_srvcmd("voteban_lockmap", "Check_LockMap");
register_dictionary("VoteBan_Menu.txt");
}
public plugin_precache() {
register_plugin(szPluginInfo[0], szPluginInfo[1], "Author + ApXuTekToR" );
InitCvars();
}
public plugin_cfg() {
#if defined SUPPORT_CMS
if(is_plugin_loaded("GameCMS_API") == INVALID_PLUGIN_ID) {
log_amx("WARNING: GameCMS API isn't loaded! Plugin Stopped.");
pause("a");
return;
}
#endif
create_menu();
}
create_menu() {
g_iReasonsMenu = menu_create("\d[\rVoteBan\d] \yВыберите причину бана\w", "ReasonsMenuHandler");
g_iVoteMenu = menu_create("UNNAMED_MENU", "VoteMenuHandler");
menu_setprop(g_iReasonsMenu, MPROP_EXIT, MEXIT_NEVER);
menu_setprop(g_iReasonsMenu, MPROP_PERPAGE, 0);
menu_setprop(g_iVoteMenu, MPROP_EXIT, MEXIT_NEVER);
new num[3];
for(new i; i < sizeof g_aBanReasons; i++) {
num_to_str(i, num, charsmax(num));
menu_additem(g_iReasonsMenu, g_aBanReasons[i], num);
}
menu_addblank(g_iReasonsMenu, 0);
menu_additem(g_iReasonsMenu, "\yСвоя причина", "69");
menu_additem(g_iVoteMenu, "\rДа", "1");
menu_additem(g_iVoteMenu, "\yНет", "0");
}
InitCvars() {
bind_pcvar_string(create_cvar( "VoteBan_ChatPrefix", "VB", FCVAR_NONE, "Префикс для чат сообщений" ), Cvars[C_ChatPrefix], charsmax(Cvars[C_ChatPrefix]));
bind_pcvar_num(create_cvar( "VoteBan_MinPlayers", "5", FCVAR_NONE, "Минимальное кол-во игроков на сервере для запуска голосования" ), Cvars[C_MinPlayers]);
bind_pcvar_float(create_cvar( "VoteBan_BanRatio", "0.8", FCVAR_NONE, "Коэффицент голосов для бана.^n\ '0.1' - 10% | '1.0' - 100%" ), Cvars[C_BanRatio]);
bind_pcvar_num(create_cvar( "VoteBan_TimeBetween", "5", FCVAR_NONE, "Время между голосованиями (в секундах)" ), Cvars[C_TimeBetween]);
bind_pcvar_float(create_cvar( "VoteBan_DurationVote", "15.0", FCVAR_NONE, "Продолжительность голосования" ), Cvars[C_DurationVote]);
bind_pcvar_num(create_cvar( "VoteBan_BanType", "1", FCVAR_NONE, "Тип наказания:^n\
'0' - кик^n\
'1' - AmxBans/FreshBans^n\
'2' - Lite Bans (Neugomon)" ), Cvars[C_BanType]);
bind_pcvar_num(create_cvar( "VoteBan_BanTime", "1440", FCVAR_NONE, "Время бана (в минутах)" ), Cvars[C_BanTime]);
bind_pcvar_num(create_cvar( "VoteBan_Access_VTB", "0", FCVAR_NONE, "Кому доступно право на голосование?^n\
'0' - Доступно всем^n\
'1' - По флагу доступа" ), Cvars[C_Access_VTB]);
bind_pcvar_string(create_cvar( "VoteBan_AccessFlags", "t", FCVAR_NONE, "Флаг доступа к вотебану" ), Cvars[C_AccessFlags], charsmax(Cvars[C_AccessFlags]));
bind_pcvar_string(create_cvar( "VoteBan_FlagsImmunity", "a", FCVAR_NONE, "Флаг иммунитета от бана" ), Cvars[C_FlagsImmunity], charsmax(Cvars[C_FlagsImmunity]));
#if defined SUPPORT_CMS
bind_pcvar_string(create_cvar( "VoteBan_ServiceImmunity", "_vtb_immunity", FCVAR_PROTECTED, "Название услуги для иммунитета от вотебана" ), Cvars[C_ServiceName], charsmax(Cvars[C_ServiceName]));
#endif
bind_pcvar_string(create_cvar( "VoteBan_AdminFlags", "d", FCVAR_PROTECTED, "Флаг Администратора^n\
Note: Если игрок с данным флагом на сервере - голосование недоступно" ), Cvars[C_AdminFlags], charsmax(Cvars[C_AdminFlags]));
AutoExecConfig(true, "Voteban_Menu", "SevCorp");
}
#if defined SUPPORT_BLOCK
public block_plug() {
new bool:IsAccess = false;
new szServerIP[22]; get_user_ip(0, szServerIP, charsmax(szServerIP));
for(new i; i < sizeof(PluginIP); i++) {
if(equal(PluginIP[i], szServerIP))
IsAccess = true;
}
if(!IsAccess) {
//server_print("[ %s v%s ] Нужна лицензия? - Купи тут: https://epic-cs.ru/forums", szPluginInfo[0], szPluginInfo[1]);
//set_fail_state("[ %s v%s ] Вот ты и папался дружок! Нет лицензии - иди гуляй!", szPluginInfo[0], szPluginInfo[1]);
}
}
#endif
public client_disconnected(id) {
if(g_bIsVoted[id]) {
g_bIsVoted[id] = false;
g_iVoteCount--;
}
}
public CmdVoteban(id) {
if(Cvars[C_Access_VTB] == 1) {
if(CheckAccess(id, Cvars[C_AccessFlags])) {
ClCmdVoteban(id);
} else {
client_print_color(id, print_team_default, "%L", LANG_PLAYER, "LANG_NOACCESS_VOTE", Cvars[C_ChatPrefix]);
return PLUGIN_HANDLED;
}
} else if(Cvars[C_Access_VTB] == 0) {
ClCmdVoteban(id);
}
return PLUGIN_HANDLED;
}
public ClCmdVoteban(id) {
static players[32], pnum, iVtbDelay;
if(g_iInsider)
return client_print_color(id, print_team_default, "%L", LANG_PLAYER, "LANG_ALREADY_RUNNING", Cvars[C_ChatPrefix]);
if((iVtbDelay = g_iVoteStartTime + Cvars[C_TimeBetween] - get_systime()) > 0)
return client_print_color(id, print_team_default, "%L", LANG_PLAYER, "LANG_AVAILABLE_VIA_TIME", Cvars[C_ChatPrefix], (iVtbDelay / 60), (iVtbDelay % 60));
get_players(players, pnum);
if(Cvars[C_MinPlayers] > pnum)
return client_print_color(id, print_team_default, "%L", LANG_PLAYER, "LANG_MIN_PLAYERS", Cvars[C_ChatPrefix], Cvars[C_MinPlayers]);
g_iVoteBanPlayersNum = 0;
for(new i; i < pnum; i++) {
if(CheckAccess(players[i], Cvars[C_AdminFlags]))
return client_print_color(id, print_team_default, "%L", LANG_PLAYER, "LANG_ADMIN_CHECK", Cvars[C_ChatPrefix]);
g_iVoteBanPlayers[g_iVoteBanPlayersNum++] = players[i];
}
return SelectPlayerOnBan(id);
}
public SelectPlayerOnBan(id) {
new iPlayersMenu = menu_create("\d[\rVoteBan\d] \yВыберите игрока\w", "PlayersMenuHandler");
new iCallBack = menu_makecallback("PlayersMenuCallback");
menu_setprop(iPlayersMenu, MPROP_BACKNAME, "Назад");
menu_setprop(iPlayersMenu, MPROP_NEXTNAME, "Далее");
menu_setprop(iPlayersMenu, MPROP_EXITNAME, "Выход");
new name[32], num[3];
for(new i; i < g_iVoteBanPlayersNum; i++) {
if(g_iVoteBanPlayers[i] == id)
continue;
get_user_name(g_iVoteBanPlayers[i], name, charsmax(name));
num_to_str(g_iVoteBanPlayers[i], num, charsmax(num));
menu_additem(iPlayersMenu, name, num, 0, iCallBack);
}
menu_display(id, iPlayersMenu, 0);
return PLUGIN_HANDLED;
}
public PlayersMenuCallback(id, menu, item) {
static ItemName[32], ItemNewName[64];
menu_item_getinfo(menu, item, _access, ItemData, charsmax(ItemData), ItemName, charsmax(ItemName), callback);
#if defined SUPPORT_CMS
static Array:Services;
Services = cmsapi_get_user_services(str_to_num(ItemData), "", Cvars[C_ServiceName]);
if(CheckAccess(str_to_num(ItemData), Cvars[C_FlagsImmunity]) || Services)
#else
if(CheckAccess(str_to_num(ItemData), Cvars[C_FlagsImmunity]))
#endif
{
formatex(ItemNewName, charsmax(ItemNewName), "\d%s \y[\rИммунитет\y]", ItemName);
menu_item_setname(menu, item, ItemNewName);
return ITEM_DISABLED;
}
return ITEM_ENABLED;
}
public PlayersMenuHandler(id, menu, item) {
if(item == MENU_EXIT) {
menu_destroy(menu);
return PLUGIN_HANDLED;
}
menu_item_getinfo(menu, item, _access, ItemData, charsmax(ItemData), _, _, callback);
g_iVictim = str_to_num(ItemData);
menu_destroy(menu);
return menu_display(id, g_iReasonsMenu);
}
public ReasonsMenuHandler(id, menu, item) {
menu_item_getinfo(menu, item, _access, ItemData, charsmax(ItemData), _, _, callback);
new ReasonId = str_to_num(ItemData);
if(ReasonId == 69) {
client_cmd(id, "messagemode vtb_reason");
} else {
g_sBanReason = g_aBanReasons[ReasonId];
VoteBanAction(id);
}
return PLUGIN_HANDLED;
}
public ClCmdReason(id) {
if(Cvars[C_Access_VTB] == 1) {
if(CheckAccess(id, Cvars[C_AccessFlags])) {
client_print_color(id, print_team_default, "%L", LANG_PLAYER, "LANG_NOACCESS_VOTE", Cvars[C_ChatPrefix]);
return PLUGIN_HANDLED;
}
}
static sReason[64];
read_args(sReason, charsmax(sReason));
remove_quotes(sReason);
g_sBanReason = sReason[0] ? sReason : "unknown";
return VoteBanAction(id);
}
VoteBanAction(id) {
static sInsName[32], sVicName[32], sTitle[256];
get_user_name(id, sInsName, charsmax(sInsName));
get_user_name(g_iVictim, sVicName, charsmax(sVicName));
formatex(sTitle, charsmax(sTitle), "\rЗабанить \y%s\w?^n\rПричина\w: \y%s^n\dЗапустил \r%s", sVicName, g_sBanReason, sInsName);
menu_setprop(g_iVoteMenu, MPROP_TITLE, sTitle);
g_iInsider = id;
g_iVoteStartTime = get_systime();
g_iVoteCount = 0;
arrayset(g_bIsVoted, false, sizeof(g_bIsVoted));
new pPlayers[MAX_PLAYERS], iPlCount;
get_players(pPlayers, iPlCount, "ch");
for(new i; i < iPlCount; i++) {
if(pPlayers[i] != g_iVictim)
menu_display(pPlayers[i], g_iVoteMenu);
}
return set_task(Cvars[C_DurationVote], "VoteBanResults");
}
public VoteMenuHandler(id, menu, item) {
if(item != MENU_EXIT) {
menu_item_getinfo(menu, item, _access, ItemData, charsmax(ItemData), _, _, callback);
if(str_to_num(ItemData)) {
g_iVoteCount++;
g_bIsVoted[id] = true;
}
}
return PLUGIN_HANDLED;
}
public VoteBanResults() {
show_menu(0, 0, "^n", 1); // визуально закрываем меню.
if(is_user_connected(g_iVictim)) {
new iVoteBanMinVotes = floatround(Cvars[C_BanRatio] * float(g_iVoteBanPlayersNum));
new name[32]; get_user_name(g_iVictim, name, charsmax(name));
if(g_iVoteCount >= iVoteBanMinVotes) {
if(Cvars[C_BanType] == 0) server_cmd("kick #%d ^"%s^"", get_user_userid(g_iVictim), g_sBanReason);
else if(Cvars[C_BanType] == 1) server_cmd("amx_ban %d #%d ^"%s^"", Cvars[C_BanTime], get_user_userid(g_iVictim), g_sBanReason);
else if(Cvars[C_BanType] == 2) server_cmd("amx_ban #%d %d ^"%s^"", get_user_userid(g_iVictim), Cvars[C_BanTime], g_sBanReason);
client_print_color(0, print_team_default, "%L", LANG_PLAYER, "LANG_VOTEBAN_SUCCESS_1", Cvars[C_ChatPrefix]);
client_print_color(0, print_team_default, "%L", LANG_PLAYER, "LANG_VOTEBAN_SUCCESS_2", Cvars[C_ChatPrefix], name, g_iVoteCount, iVoteBanMinVotes);
log_to_file(LogFile_Name, "VOTEBAN SUCCESS: [ Player '%s' ] [ Reason: '%s'] [ Vote: '%d' | MinVote: '%d' ]", name, g_sBanReason, g_iVoteCount, iVoteBanMinVotes);
} else {
client_print_color(0, print_team_default, "%L", LANG_PLAYER, "LANG_VOTEBAN_FAILED_1", Cvars[C_ChatPrefix]);
client_print_color(0, print_team_default, "%L", LANG_PLAYER, "LANG_VOTEBAN_FAILED_2", Cvars[C_ChatPrefix], name, g_iVoteCount, iVoteBanMinVotes);
log_to_file(LogFile_Name, "VOTEBAN FAILED: [ Player '%s' ] [ Reason: '%s'] [ Vote: '%d' | MinVote: '%d' ]", name, g_sBanReason, g_iVoteCount, iVoteBanMinVotes);
}
} else client_print_color(g_iInsider, print_team_default, "%L", LANG_PLAYER, "LANG_PLAYER_IS_OUT", Cvars[C_ChatPrefix]);
g_iInsider = g_iVictim = 0;
}
public Check_LockMap() {
new getmap[32], map[32];
read_args(getmap, charsmax(getmap));
remove_quotes(getmap);
get_mapname(map, charsmax(map));
if(!strcmp(getmap, map, true))
pause("ad");
}
CheckAccess(const Id, const Flags[]) {
static FlagsBits; FlagsBits = read_flags(Flags);
return (get_user_flags(Id) & FlagsBits || !FlagsBits);
}
И собственно, такое решение уберет ошибку "Player 24 is not in game" ?
- Исходный код
- C++:
#include <amxmodx> new szPluginInfo[][] = { "VoteBan Menu", "1.1" }; // Для поддержки создания услуги: Иммунитет от VoteBan'a // NOTE: Требуется плагин GameCms API // Закомментируйте для отключения поддержки GameCMS API #define SUPPORT_CMS // Название файла для записи логов // NOTE: расширение ".log" Обязательно! #define LogFile_Name "VoteBan_Menu.log" // Стандартные причины VoteBan. // Максимальное кол-во 8 (Иначе сломается меню) // Пункт "Своя причина" добавляется в конце списка. new g_aBanReasons[][64] = { "Читер", "Флуд в Микро", "Мешает играть", "Оскорбляет игроков", "Неадекватное поведение" }; #if defined SUPPORT_CMS #include <gamecms5> #endif new g_iReasonsMenu; new g_iVoteMenu; new _access, callback, ItemData[3]; new g_iInsider; new g_iVoteStartTime; new g_iVoteCount, bool:g_bIsVoted[33]; new g_iVictim; new g_sBanReason[128]; new g_iVoteBanPlayersNum, g_iVoteBanPlayers[33]; enum E_Cvars { C_Access_VTB, C_AccessFlags[16], C_ChatPrefix[16], C_MinPlayers, Float:C_BanRatio, C_TimeBetween, Float:C_DurationVote, C_BanTime, C_BanType, C_FlagsImmunity[16], C_AdminFlags[16], #if defined SUPPORT_CMS C_ServiceName[32], #endif } new Cvars[E_Cvars]; public plugin_init() { register_clcmd("voteban", "CmdVoteban"); register_clcmd("say /voteban", "CmdVoteban"); register_clcmd("say_team /voteban", "CmdVoteban"); register_clcmd("say /vtb", "CmdVoteban"); register_clcmd("say_team /vtb", "CmdVoteban"); register_clcmd("vtb_reason", "ClCmdReason"); register_srvcmd("voteban_lockmap", "Check_LockMap"); register_dictionary("VoteBan_Menu.txt"); } public plugin_precache() { register_plugin(szPluginInfo[0], szPluginInfo[1], "Author + ApXuTekToR" ); InitCvars(); } public plugin_cfg() { #if defined SUPPORT_CMS if(is_plugin_loaded("GameCMS_API") == INVALID_PLUGIN_ID) { log_amx("WARNING: GameCMS API isn't loaded! Plugin Stopped."); pause("a"); return; } #endif create_menu(); } create_menu() { g_iReasonsMenu = menu_create("\d[\rVoteBan\d] \yВыберите причину бана\w", "ReasonsMenuHandler"); g_iVoteMenu = menu_create("UNNAMED_MENU", "VoteMenuHandler"); menu_setprop(g_iReasonsMenu, MPROP_EXIT, MEXIT_NEVER); menu_setprop(g_iReasonsMenu, MPROP_PERPAGE, 0); menu_setprop(g_iVoteMenu, MPROP_EXIT, MEXIT_NEVER); new num[3]; for(new i; i < sizeof g_aBanReasons; i++) { num_to_str(i, num, charsmax(num)); menu_additem(g_iReasonsMenu, g_aBanReasons, num); } menu_addblank(g_iReasonsMenu, 0); menu_additem(g_iReasonsMenu, "\yСвоя причина", "69"); menu_additem(g_iVoteMenu, "\rДа", "1"); menu_additem(g_iVoteMenu, "\yНет", "0"); } InitCvars() { bind_pcvar_string(create_cvar( "VoteBan_ChatPrefix", "VB", FCVAR_NONE, "Префикс для чат сообщений" ), Cvars[C_ChatPrefix], charsmax(Cvars[C_ChatPrefix])); bind_pcvar_num(create_cvar( "VoteBan_MinPlayers", "5", FCVAR_NONE, "Минимальное кол-во игроков на сервере для запуска голосования" ), Cvars[C_MinPlayers]); bind_pcvar_float(create_cvar( "VoteBan_BanRatio", "0.8", FCVAR_NONE, "Коэффицент голосов для бана.^n\ '0.1' - 10% | '1.0' - 100%" ), Cvars[C_BanRatio]); bind_pcvar_num(create_cvar( "VoteBan_TimeBetween", "5", FCVAR_NONE, "Время между голосованиями (в секундах)" ), Cvars[C_TimeBetween]); bind_pcvar_float(create_cvar( "VoteBan_DurationVote", "15.0", FCVAR_NONE, "Продолжительность голосования" ), Cvars[C_DurationVote]); bind_pcvar_num(create_cvar( "VoteBan_BanType", "1", FCVAR_NONE, "Тип наказания:^n\ '0' - кик^n\ '1' - AmxBans/FreshBans^n\ '2' - Lite Bans (Neugomon)" ), Cvars[C_BanType]); bind_pcvar_num(create_cvar( "VoteBan_BanTime", "1440", FCVAR_NONE, "Время бана (в минутах)" ), Cvars[C_BanTime]); bind_pcvar_num(create_cvar( "VoteBan_Access_VTB", "0", FCVAR_NONE, "Кому доступно право на голосование?^n\ '0' - Доступно всем^n\ '1' - По флагу доступа" ), Cvars[C_Access_VTB]); bind_pcvar_string(create_cvar( "VoteBan_AccessFlags", "t", FCVAR_NONE, "Флаг доступа к вотебану" ), Cvars[C_AccessFlags], charsmax(Cvars[C_AccessFlags])); bind_pcvar_string(create_cvar( "VoteBan_FlagsImmunity", "a", FCVAR_NONE, "Флаг иммунитета от бана" ), Cvars[C_FlagsImmunity], charsmax(Cvars[C_FlagsImmunity])); #if defined SUPPORT_CMS bind_pcvar_string(create_cvar( "VoteBan_ServiceImmunity", "_vtb_immunity", FCVAR_PROTECTED, "Название услуги для иммунитета от вотебана" ), Cvars[C_ServiceName], charsmax(Cvars[C_ServiceName])); #endif bind_pcvar_string(create_cvar( "VoteBan_AdminFlags", "d", FCVAR_PROTECTED, "Флаг Администратора^n\ Note: Если игрок с данным флагом на сервере - голосование недоступно" ), Cvars[C_AdminFlags], charsmax(Cvars[C_AdminFlags])); AutoExecConfig(true, "Voteban_Menu", "SevCorp"); } #if defined SUPPORT_BLOCK public block_plug() { new bool:IsAccess = false; new szServerIP[22]; get_user_ip(0, szServerIP, charsmax(szServerIP)); for(new i; i < sizeof(PluginIP); i++) { if(equal(PluginIP, szServerIP)) IsAccess = true; } if(!IsAccess) { //server_print("[ %s v%s ] Нужна лицензия? - Купи тут: https://epic-cs.ru/forums", szPluginInfo[0], szPluginInfo[1]); //set_fail_state("[ %s v%s ] Вот ты и папался дружок! Нет лицензии - иди гуляй!", szPluginInfo[0], szPluginInfo[1]); } } #endif public client_disconnected(id) { if(g_bIsVoted[id]) { g_bIsVoted[id] = false; g_iVoteCount--; } } public CmdVoteban(id) { if(Cvars[C_Access_VTB] == 1) { if(CheckAccess(id, Cvars[C_AccessFlags])) { ClCmdVoteban(id); } else { client_print_color(id, print_team_default, "%L", LANG_PLAYER, "LANG_NOACCESS_VOTE", Cvars[C_ChatPrefix]); return PLUGIN_HANDLED; } } else if(Cvars[C_Access_VTB] == 0) { ClCmdVoteban(id); } return PLUGIN_HANDLED; } public ClCmdVoteban(id) { static players[32], pnum, iVtbDelay; if(g_iInsider) return client_print_color(id, print_team_default, "%L", LANG_PLAYER, "LANG_ALREADY_RUNNING", Cvars[C_ChatPrefix]); if((iVtbDelay = g_iVoteStartTime + Cvars[C_TimeBetween] - get_systime()) > 0) return client_print_color(id, print_team_default, "%L", LANG_PLAYER, "LANG_AVAILABLE_VIA_TIME", Cvars[C_ChatPrefix], (iVtbDelay / 60), (iVtbDelay % 60)); get_players(players, pnum); if(Cvars[C_MinPlayers] > pnum) return client_print_color(id, print_team_default, "%L", LANG_PLAYER, "LANG_MIN_PLAYERS", Cvars[C_ChatPrefix], Cvars[C_MinPlayers]); g_iVoteBanPlayersNum = 0; for(new i; i < pnum; i++) { if(CheckAccess(players, Cvars[C_AdminFlags])) return client_print_color(id, print_team_default, "%L", LANG_PLAYER, "LANG_ADMIN_CHECK", Cvars[C_ChatPrefix]); g_iVoteBanPlayers[g_iVoteBanPlayersNum++] = players; } return SelectPlayerOnBan(id); } public SelectPlayerOnBan(id) { new iPlayersMenu = menu_create("\d[\rVoteBan\d] \yВыберите игрока\w", "PlayersMenuHandler"); new iCallBack = menu_makecallback("PlayersMenuCallback"); menu_setprop(iPlayersMenu, MPROP_BACKNAME, "Назад"); menu_setprop(iPlayersMenu, MPROP_NEXTNAME, "Далее"); menu_setprop(iPlayersMenu, MPROP_EXITNAME, "Выход"); new name[32], num[3]; for(new i; i < g_iVoteBanPlayersNum; i++) { if(g_iVoteBanPlayers == id) continue; get_user_name(g_iVoteBanPlayers, name, charsmax(name)); num_to_str(g_iVoteBanPlayers, num, charsmax(num)); menu_additem(iPlayersMenu, name, num, 0, iCallBack); } menu_display(id, iPlayersMenu, 0); return PLUGIN_HANDLED; } public PlayersMenuCallback(id, menu, item) { static ItemName[32], ItemNewName[64]; menu_item_getinfo(menu, item, _access, ItemData, charsmax(ItemData), ItemName, charsmax(ItemName), callback); #if defined SUPPORT_CMS static Array:Services; Services = cmsapi_get_user_services(str_to_num(ItemData), "", Cvars[C_ServiceName]); if(CheckAccess(str_to_num(ItemData), Cvars[C_FlagsImmunity]) || Services) #else if(CheckAccess(str_to_num(ItemData), Cvars[C_FlagsImmunity])) #endif { formatex(ItemNewName, charsmax(ItemNewName), "\d%s \y[\rИммунитет\y]", ItemName); menu_item_setname(menu, item, ItemNewName); return ITEM_DISABLED; } return ITEM_ENABLED; } public PlayersMenuHandler(id, menu, item) { if(item == MENU_EXIT) { menu_destroy(menu); return PLUGIN_HANDLED; } menu_item_getinfo(menu, item, _access, ItemData, charsmax(ItemData), _, _, callback); g_iVictim = str_to_num(ItemData); menu_destroy(menu); return menu_display(id, g_iReasonsMenu); } public ReasonsMenuHandler(id, menu, item) { menu_item_getinfo(menu, item, _access, ItemData, charsmax(ItemData), _, _, callback); new ReasonId = str_to_num(ItemData); if(ReasonId == 69) { client_cmd(id, "messagemode vtb_reason"); } else { g_sBanReason = g_aBanReasons[ReasonId]; VoteBanAction(id); } return PLUGIN_HANDLED; } public ClCmdReason(id) { if(Cvars[C_Access_VTB] == 1) { if(CheckAccess(id, Cvars[C_AccessFlags])) { client_print_color(id, print_team_default, "%L", LANG_PLAYER, "LANG_NOACCESS_VOTE", Cvars[C_ChatPrefix]); return PLUGIN_HANDLED; } } static sReason[64]; read_args(sReason, charsmax(sReason)); remove_quotes(sReason); g_sBanReason = sReason[0] ? sReason : "unknown"; return VoteBanAction(id); } VoteBanAction(id) { static sInsName[32], sVicName[32], sTitle[256]; get_user_name(id, sInsName, charsmax(sInsName)); get_user_name(g_iVictim, sVicName, charsmax(sVicName)); formatex(sTitle, charsmax(sTitle), "\rЗабанить \y%s\w?^n\rПричина\w: \y%s^n\dЗапустил \r%s", sVicName, g_sBanReason, sInsName); menu_setprop(g_iVoteMenu, MPROP_TITLE, sTitle); g_iInsider = id; g_iVoteStartTime = get_systime(); g_iVoteCount = 0; arrayset(g_bIsVoted, false, sizeof(g_bIsVoted)); for(new i; i < g_iVoteBanPlayersNum; ++i) { if(g_iVoteBanPlayers != g_iVictim) menu_display(g_iVoteBanPlayers, g_iVoteMenu); } return set_task(Cvars[C_DurationVote], "VoteBanResults"); } public VoteMenuHandler(id, menu, item) { if(item != MENU_EXIT) { menu_item_getinfo(menu, item, _access, ItemData, charsmax(ItemData), _, _, callback); if(str_to_num(ItemData)) { g_iVoteCount++; g_bIsVoted[id] = true; } } return PLUGIN_HANDLED; } public VoteBanResults() { show_menu(0, 0, "^n", 1); // визуально закрываем меню. if(is_user_connected(g_iVictim)) { new iVoteBanMinVotes = floatround(Cvars[C_BanRatio] * float(g_iVoteBanPlayersNum)); new name[32]; get_user_name(g_iVictim, name, charsmax(name)); if(g_iVoteCount >= iVoteBanMinVotes) { if(Cvars[C_BanType] == 0) server_cmd("kick #%d ^"%s^"", get_user_userid(g_iVictim), g_sBanReason); else if(Cvars[C_BanType] == 1) server_cmd("amx_ban %d #%d ^"%s^"", Cvars[C_BanTime], get_user_userid(g_iVictim), g_sBanReason); else if(Cvars[C_BanType] == 2) server_cmd("amx_ban #%d %d ^"%s^"", get_user_userid(g_iVictim), Cvars[C_BanTime], g_sBanReason); client_print_color(0, print_team_default, "%L", LANG_PLAYER, "LANG_VOTEBAN_SUCCESS_1", Cvars[C_ChatPrefix]); client_print_color(0, print_team_default, "%L", LANG_PLAYER, "LANG_VOTEBAN_SUCCESS_2", Cvars[C_ChatPrefix], name, g_iVoteCount, iVoteBanMinVotes); log_to_file(LogFile_Name, "VOTEBAN SUCCESS: [ Player '%s' ] [ Reason: '%s'] [ Vote: '%d' | MinVote: '%d' ]", name, g_sBanReason, g_iVoteCount, iVoteBanMinVotes); } else { client_print_color(0, print_team_default, "%L", LANG_PLAYER, "LANG_VOTEBAN_FAILED_1", Cvars[C_ChatPrefix]); client_print_color(0, print_team_default, "%L", LANG_PLAYER, "LANG_VOTEBAN_FAILED_2", Cvars[C_ChatPrefix], name, g_iVoteCount, iVoteBanMinVotes); log_to_file(LogFile_Name, "VOTEBAN FAILED: [ Player '%s' ] [ Reason: '%s'] [ Vote: '%d' | MinVote: '%d' ]", name, g_sBanReason, g_iVoteCount, iVoteBanMinVotes); } } else client_print_color(g_iInsider, print_team_default, "%L", LANG_PLAYER, "LANG_PLAYER_IS_OUT", Cvars[C_ChatPrefix]); g_iInsider = g_iVictim = 0; } public Check_LockMap() { new getmap[32], map[32]; read_args(getmap, charsmax(getmap)); remove_quotes(getmap); get_mapname(map, charsmax(map)); if(!strcmp(getmap, map, true)) pause("ad"); } CheckAccess(const Id, const Flags[]) { static FlagsBits; FlagsBits = read_flags(Flags); return (get_user_flags(Id) & FlagsBits || !FlagsBits); }
-
L 10/02/2020 - 21:50:36: Start of error session.
L 10/02/2020 - 21:50:36: Info (map "de_dust2") (file "addons/amxmodx/logs/error_20201002.log")
L 10/02/2020 - 21:50:36: [AMXX] Displaying debug trace (plugin "VoteBan_Menu.amxx", version "1.1")
L 10/02/2020 - 21:50:36: [AMXX] Run time error 4: index out of bounds
L 10/02/2020 - 21:50:36: [AMXX] [0] VoteBan_Menu.sma::ReasonsMenuHandler (line 243)
L 10/02/2020 - 21:50:36: Info (map "de_dust2") (file "addons/amxmodx/logs/error_20201002.log")
L 10/02/2020 - 21:50:36: [AMXX] Displaying debug trace (plugin "VoteBan_Menu.amxx", version "1.1")
L 10/02/2020 - 21:50:36: [AMXX] Run time error 4: index out of bounds
L 10/02/2020 - 21:50:36: [AMXX] [0] VoteBan_Menu.sma::ReasonsMenuHandler (line 243)
- Список плагинов (amx_plugins)
- -
- Список модулей (meta list)
- -
Последнее редактирование модератором: