Правила форума Гаранты форума
Размещение рекламы AMX-X компилятор

Здравствуйте, гость Вход | Регистрация

Наши новости:

14-дек
24-апр
10-апр
11-апр

помощь в плагине ad_manager

, помогите исправить ошибки в плагине
Статус пользователя sergi
сообщение 11.7.2016, 15:05
Сообщение #1
Стаж: 11 лет

Сообщений: 32
Благодарностей: 3
Полезность: 3

всем привет не подскажите как исправить пишет в логах replace() buffer not big enough (130>=115) [AMXX]Run time error 10 (plugin "ad_manager.amxx") (native "replace") - debug not enabled!
[AMXX]To enable debug mode, add "debug" after the plugin name in plugins.ini (without quotes).
replace() buffer not big enough (118>=115)
добавляю debug пишет в логах replace() buffer not big enough (116>=115) [AMXX]Displaying debug trace (plugin "ad_manager.amxx
[AMXX]Run time error 10: native error (native "replace")
[AMXX][0] ad_manager.sma::replace_all_tags (line 186)
[AMXX][1] ad_manager.sma::Print_Color_Msg (line 170)
[AMXX][2] ad_manager.sma::ShowAutoMSG (line 148)
вот сам SMA
Прикрепленные файлы:
Прикрепленный файл  ad_manager.sma ( 6,29 килобайт ) Кол-во скачиваний: 25
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   Цитировать сообщение
Статус пользователя cstriker
сообщение 11.7.2016, 18:43
Сообщение #2


Иконка группы

Стаж: 13 лет

Сообщений: 1233
Благодарностей: 586
Полезность: 869

Никогда с этим плагином проблем не было. Как вариант, перекачать с проверенного сайта и скомпилить заново . Или же приложи код и текстовый файл в тему.
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя sergi
сообщение 11.7.2016, 18:54
Сообщение #3
Стаж: 11 лет

Сообщений: 32
Благодарностей: 3
Полезность: 3

Код:
#include <amxmodx>
#include <amxmisc>

#define TASK_ID 515123

enum _: msg_cmd_enum
{
cmd_com[32],
cmd_msg[192]
}

new Array:MessageCMD, Array:MessageAuto;
new message_cmd_load, msg_cmd[msg_cmd_enum], message_auto_load;
new cur_auto_msg_id, cur_auto_msg[192];
new pcvar_auto_type, pcvar_auto_random;

public plugin_init( )
{
register_plugin("AD Manager", "1.0", "Nesquik");

pcvar_auto_type = register_cvar("ad_manager_auto_type", "0"); // 0 - показывать всем, 1 - показывать только мертвым, 2 - показывать только живым
pcvar_auto_random = register_cvar("ad_manager_auto_random", "0"); // 0 - сообщения идут по порядку, 1 - сообщения выбираются случайным образом
}

public plugin_cfg( )
{
new filename[96];

get_configsdir(filename, charsmax(filename));
add(filename, charsmax(filename), "/ad_manager.ini");

if (!file_exists(filename)) set_fail_state("ad_manager file not found");

MessageCMD = ArrayCreate(msg_cmd_enum);
MessageAuto = ArrayCreate(192, 1);

new text[256];
new hostname[64], contact[64], maxplayers[32], mapname[32], server_ip[25];
new file = fopen(filename, "rt");

if (!file) set_fail_state("ad_manager open error!");

get_cvar_string("hostname", hostname, charsmax(hostname));
get_mapname(mapname, charsmax(mapname));
formatex(maxplayers, charsmax(maxplayers), "%d", get_maxplayers());
get_user_ip(0, server_ip, charsmax(server_ip));
if (cvar_exists("sv_contact")) get_cvar_string("sv_contact", contact, charsmax(contact));

while(!feof(file))
{
fgets(file, text, charsmax(text));
trim(text);

if (text[0] == ';' || !text[0]) continue;
if (text[0] == '@')
{
strtok(text[1], msg_cmd[cmd_com], charsmax(msg_cmd[cmd_com]), msg_cmd[cmd_msg], charsmax(msg_cmd[cmd_msg]), ' ');

trim(msg_cmd[cmd_com]);
trim(msg_cmd[cmd_msg]);

strtolower(msg_cmd[cmd_com]);

format(msg_cmd[cmd_msg], charsmax(msg_cmd[cmd_msg]), "^1%s", msg_cmd[cmd_msg]);

while(replace(msg_cmd[cmd_msg], charsmax(msg_cmd[cmd_msg]), "!g", "^4")){}
while(replace(msg_cmd[cmd_msg], charsmax(msg_cmd[cmd_msg]), "!t", "^3")){}
while(replace(msg_cmd[cmd_msg], charsmax(msg_cmd[cmd_msg]), "!n", "^1")){}

if (containi(msg_cmd[cmd_msg], "#hostname#") != -1) while(replace(msg_cmd[cmd_msg], charsmax(msg_cmd[cmd_msg]), "#hostname#", hostname)){}
if (containi(msg_cmd[cmd_msg], "#maxplayers#") != -1) while(replace(msg_cmd[cmd_msg], charsmax(msg_cmd[cmd_msg]), "#maxplayers#", maxplayers)){}
if (containi(msg_cmd[cmd_msg], "#server_ip#") != -1) while(replace(msg_cmd[cmd_msg], charsmax(msg_cmd[cmd_msg]), "#server_ip#", server_ip)){}
if (containi(msg_cmd[cmd_msg], "#mapname#") != -1) while(replace(msg_cmd[cmd_msg], charsmax(msg_cmd[cmd_msg]), "#mapname#", mapname)){}
if (containi(msg_cmd[cmd_msg], "#contact#") != -1) while(replace(msg_cmd[cmd_msg], charsmax(msg_cmd[cmd_msg]), "#contact#", contact)){}

ArrayPushArray(MessageCMD, msg_cmd);
}
else
{
format(text, charsmax(text), "^1%s", text);

while(replace(text, charsmax(text), "!g", "^4")){}
while(replace(text, charsmax(text), "!t", "^3")){}
while(replace(text, charsmax(text), "!n", "^1")){}

if (containi(text, "#hostname#") != -1) while(replace(text, charsmax(text), "#hostname#", hostname)){}
if (containi(text, "#maxplayers#") != -1) while(replace(text, charsmax(text), "#maxplayers#", maxplayers)){}
if (containi(text, "#server_ip#") != -1) while(replace(text, charsmax(text), "#server_ip#", server_ip)){}
if (containi(text, "#mapname#") != -1) while(replace(text, charsmax(text), "#mapname#", mapname)){}
if (containi(text, "#contact#") != -1) while(replace(text, charsmax(text), "#contact#", contact)){}

if (strlen(text) > 191) text[191] = '^0';
ArrayPushString(MessageAuto, text);
}
}

if ((message_cmd_load = ArraySize(MessageCMD)) > 0)
{
register_clcmd("say", "fwd_hook_say");
register_clcmd("say_team", "fwd_hook_say");
}

if ((message_auto_load = ArraySize(MessageAuto)) > 0)
{
cur_auto_msg_id = -1;
set_task(random_float(25.0, 45.0), "ShowAutoAD", TASK_ID, .flags = "b");
}

fclose(file);
}

public ShowAutoAD( )
{
static players[32],
count, player, i;

switch(get_pcvar_num(pcvar_auto_type))
{
case 1: get_players(players, count, "bch");
case 2: get_players(players, count, "ach");
default: get_players(players, count, "ch");
}

if (!count) return;

if (get_pcvar_num(pcvar_auto_random)) cur_auto_msg_id = random_num(0, message_auto_load - 1);
else
{
cur_auto_msg_id++;
if (cur_auto_msg_id >= message_auto_load || cur_auto_msg_id < 0) cur_auto_msg_id = 0;
}

ArrayGetString(MessageAuto, cur_auto_msg_id, cur_auto_msg, charsmax(cur_auto_msg));
for( i = 0; i < count; i++ )
{
player = players[i];

switch(player)
{
case 1..8: set_task(0.1, "ShowAutoMSG", player);
case 9..16: set_task(0.2, "ShowAutoMSG", player);
case 17..24: set_task(0.3, "ShowAutoMSG", player);
case 25..32: set_task(0.4, "ShowAutoMSG", player);
}
}
}

public ShowAutoMSG(player) Print_Color_Msg(player, cur_auto_msg);

public fwd_hook_say(id)
{
new msg[192];
read_args(msg, charsmax(msg));

remove_quotes(msg);
trim(msg);

for( new i = 0; i < message_cmd_load; i++ )
{
ArrayGetArray(MessageCMD, i, msg_cmd);
if (equal(msg, msg_cmd[cmd_com])) Print_Color_Msg(id, msg_cmd[cmd_msg]);
}
}

public Print_Color_Msg(id, msg[])
{
static cur_msg[192];
format(cur_msg, charsmax(cur_msg), msg);

replace_all_tags(id, cur_msg);

message_begin(MSG_ONE_UNRELIABLE, 76, .player = id);
write_byte(id);
write_string(cur_msg);
message_end();
}

public replace_all_tags(id, msg[])
{
static len, time; len = strlen(msg);
static string[32];

if (containi(msg, "#name#") != -1)
{
get_user_name(id, string, charsmax(string));
while(replace(msg, len, "#name#", string)){}
}

if (containi(msg, "#numplayers#") != -1)
{
format(string, charsmax(string), "%d", get_playersnum());
while(replace(msg, len, "#numplayers#", string)){}
}

if (containi(msg, "#timeleft#") != -1)
{
time = get_timeleft( );
format(string, charsmax(string), "%d:%02d", time / 60, time % 60);

while(replace(msg, len, "#timeleft#", string)){}
}
}


Отредактировал: iShot, - 12.7.2016, 14:50
Причина: Выдано устное предупреждение!
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
   + Цитировать сообщение
Статус пользователя Inline
сообщение 12.7.2016, 9:12
Сообщение #4


Стаж: 10 лет

Сообщений: 139
Благодарностей: 80
Полезность: 447

sergi, Логическая ошибка в плагине. Как максимальная длина буфера используется количество символов, а не настоящая длина. Автор перестарался с бессмысленными оптимизациями, которые по идеи должны наоборот замедлить плагин, за счёт того, что вызывается strlen(..). Совершенно бессмысленно.
Код:

public replace_all_tags(id, msg[])
{
static len, time; len = strlen(msg);
static string[32];

Заменить на ->
Код:

public replace_all_tags(id, msg[], len)
{
static time;
static string[32];


Код:
public Print_Color_Msg(id, msg[])
{
static cur_msg[192];
format(cur_msg, charsmax(cur_msg), msg);

replace_all_tags(id, cur_msg);

Заменить на ->
Код:

public Print_Color_Msg(id, msg[])
{
static cur_msg[192];
format(cur_msg, charsmax(cur_msg), msg);

replace_all_tags(id, cur_msg, charsmax(cur_msg));


Отредактировал: Inline, - 12.7.2016, 9:16


Не читай
Не забывай нажимать кнопку "спасибо"
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
Статус пользователя sergi
сообщение 12.7.2016, 10:28
Сообщение #5
Стаж: 11 лет

Сообщений: 32
Благодарностей: 3
Полезность: 3

Inline, Спасибо огромное все больше ошибок нет в логах все быстро помогли а то не где больше не могли помочь спасибо тебе еще раз все тему можно закрывать
Перейти в начало страницы         Просмотр профиля    Отправить личное сообщение
Поблагодарили 1 раз
   + Цитировать сообщение
  Ответить в данную темуНачать новую тему
 
0 пользователей и 1 гостей читают эту тему: