PDA

Просмотр полной версии : [Вопрос] Не работает команда /kick



MarioORG
14.07.2015, 02:39
Привет всем. Помогите с проблемой:

Richard_Moretz кикнул игрока 37. Причина: 1337
Вот код:

CMD:kick(playerid,params[])
{
if(pInfo[playerid][pAdmin]>=1){
new string[128], name[MAX_PLAYER_NAME];
new kickname[MAX_PLAYER_NAME], giveplayerid, reason;
if (sscanf(params, "us", giveplayerid, reason)) return SendClientMessage(playerid, COLOR_WHITE, "Введите {FF0000}/kick [ID] [причина]{FFFFFF}");
GetPlayerName(playerid,name,sizeof(name));
GetPlayerName(giveplayerid,kickname,sizeof(kickname));
format(string,sizeof(string),"%s кикнул игрока %s. Причина: %s", name, kickname, reason);
SendClientMessageToAll(COLOR_RED, string);
Kick(giveplayerid);
}else{
SendClientMessage(playerid,COLOR_RED,"У вас нету прав!");
}
return 1;
}
Искал, искал, да так ошибку и не нашел. :mda:

Daniel_Cortez
14.07.2015, 03:26
Нужно указывать в sscanf размер строковой переменной, иначе функция не будет знать, до скольки символов можно считывать, и будет выводить предупреждающие сообщения в консоли сервера.
В вашем случае должна получиться строка "us[128]".

MarioORG
14.07.2015, 03:38
Нужно указывать в sscanf размер строковой переменной, иначе функция не будет знать, до скольки символов можно считывать, и будет выводить предупреждающие сообщения в консоли сервера.
В вашем случае должна получиться строка "us[128]".

Дело не в этом. При вводе команды /kick 0 test, в чате отображается только
Richard_Moretz кикнул игрока st . Причина: test и меня не кикает. Должно корректно отобразиться сообщение и меня должно кикнуть.

Daniel_Cortez
14.07.2015, 04:04
Только сейчас заметил. Да, дело не только в форматной строке. На объявление reason посмотрите, это должен быть массив.
Да и зачем создавать ещё один массив, когда можно считать причину кика в string?

Mazzilla
14.07.2015, 12:32
Deimos подробно описал эту проблему, посмотрите.
http://pro-pawn.ru/showthread.php?9389-%D0%9F%D1%80%D0%BE%D0%B1%D0%BB%D0%B5%D0%BC%D0%B0-sscanf

Daniel_Cortez
14.07.2015, 13:40
Deimos подробно описал эту проблему, посмотрите.
http://pro-pawn.ru/showthread.php?9389-%D0%9F%D1%80%D0%BE%D0%B1%D0%BB%D0%B5%D0%BC%D0%B0-sscanf
Это совсем другая проблема. Да и решение там, как оказалось, неправильное.
Недавно только помог разобрать похожий случай, гляньте решение:

http://pro-pawn.ru/showthread.php?12472

$continue$
14.07.2015, 14:21
Это совсем другая проблема. Да и решение там, как оказалось, неправильное.
Недавно только помог разобрать похожий случай, гляньте решение:

http://pro-pawn.ru/showthread.php?12472

Можно поинтересоваться, почему там решение не правильное?
Была подобная проблема, объявил переменные > стало все нормально работать.

А переменная reason и вправду не правильно объявлена, Вы же вводите текст, нужен массив.

Desulaid
14.07.2015, 16:47
А разве так сделать нельзя?


CMD:kick(playerid,params[])
{
if(pInfo[playerid][pAdmin] >= 1)
return SendClientMessage(playerid,COLOR_RED,"У вас нету прав!");

if(sscanf(params, "us[21]", params[0], params[1]))
return SendClientMessage(playerid, COLOR_WHITE, "Введите {FF0000}/kick [ID] [причина]");

if(params[1] >= 21)
return SendClientMessage(playerid, COLOR_WHITE, "Причина не может привышать 20 символов");

new
string[128],
name[MAX_PLAYER_NAME],
kickname[MAX_PLAYER_NAME]
;

GetPlayerName(playerid, name, sizeof(name));
GetPlayerName(params[0], kickname, sizeof(kickname));

format(string, sizeof(string), "%s кикнул игрока %s. Причина: %s", name, kickname, params[1]);
SendClientMessageToAll(COLOR_RED, string);

return 1;
}

Daniel_Cortez
14.07.2015, 17:30
Можно поинтересоваться, почему там решение не правильное?
По поводу коллизии DeimoS был прав, но проблема была ещё и в том, что между "s" и следующим спецификатором нужно было поставить пробел.
Как результат, топикстартер так и не разобрался до конца и просто убрал второй параметр из команды -_-


А разве так сделать нельзя?


CMD:kick(playerid,params[])
{
if(pInfo[playerid][pAdmin] >= 1)
return SendClientMessage(playerid,COLOR_RED,"У вас нету прав!");

if(sscanf(params, "us[21]", params[0], params[1]))
return SendClientMessage(playerid, COLOR_WHITE, "Введите {FF0000}/kick [ID] [причина]");

if(params[1] >= 21)
return SendClientMessage(playerid, COLOR_WHITE, "Причина не может привышать 20 символов");

new
string[128],
name[MAX_PLAYER_NAME],
kickname[MAX_PLAYER_NAME]
;

GetPlayerName(playerid, name, sizeof(name));
GetPlayerName(params[0], kickname, sizeof(kickname));

format(string, sizeof(string), "%s кикнул игрока %s. Причина: %s", name, kickname, params[1]);
SendClientMessageToAll(COLOR_RED, string);

return 1;
}
ИМХО, юзать params[0/1] под одиночные переменные - редкостное извращение. Доступ к ячейкам массива медленнее, чем к обычным переменным, да и инструкций AMX от этого будет только больше => больше кода => больше памяти потребуется серверу для загрузки скрипта. Вообще использование массива params оправдано только если нужно использовать его вместо какого-то другого массива - но только под строковое значение (или под массив значений), считанное с помощью sscanf (оно всегда вместится в массив, т.к. размер params зависит от длины введённых параметров команды), иначе строковое значение может не вместиться в params => словите выход за пределы массива.

MarioORG
14.07.2015, 19:05
Только сейчас заметил. Да, дело не только в форматной строке. На объявление reason посмотрите, это должен быть массив.
Да и зачем создавать ещё один массив, когда можно считать причину кика в string?

Спасибо за совет, проблема решена. Удалил переменную reason, все записал в string.