PDA

Просмотр полной версии : [Вопрос] Команды



ALIT13
29.03.2018, 23:13
Не работает не в каких командах

if(sscanf(params, "s[128]",params[0]))
return SendClientMessage(playerid, COLOR_WHITE, "Введите: (/f)amily [текст]");


CMD:f(playerid, params[])
{
new str_f[128];
if(!Logged[playerid] == false)
return SendClientMessage(playerid, COLOR_GREY, PLogged);

if(strlen(params[0]) >= 125)
return SendClientMessage(playerid, COLOR_WARNING,"[!] Сократите количестов вводимых символов");

else if(sscanf(params,"s[125]",params[0]))
return 1;

if(sscanf(params, "s[128]",params[0]))
return SendClientMessage(playerid, COLOR_WHITE, "Введите: (/f)amily [текст]");

if(PlayerInfo[playerid][pMember] == 16 || PlayerInfo[playerid][pMember] == 11|| PlayerInfo[playerid][pMember] == 22)
{
format(str_f, 128,"[F] %s %s [%d]: %s", GetPlayerRank(playerid), GN(playerid), playerid, params[0]);
SendFamilyMessage(PlayerInfo[playerid][pMember], 0x01FCFFC8, str_f);
return true;
}
return true;
}

DeimoS
29.03.2018, 23:48
Во-первых, зачем ты инициализируешь массив str_f, если после него есть ещё 4 разных условия, прежде чем он будет использован? Только лишнее время впустую тратишь.
Во-вторых, почему ты 2 раза sscanf вызываешь?
В-третьих, что это такое?

if(!Logged[playerid] == false)
return SendClientMessage(playerid, COLOR_GREY, PLogged);
Ты уж определись как ты проверяешь переменную, ибо сейчас у тебя получается двойное отрицание, из-за чего условие будет срабатывать для "true", а не для "false"
В-четвертых, зачем вообще тут sscanf? Особенно если ты перед этим вызываешь strlen, не давая записать больше 125 символов.
В-пятых, зачем вообще ограничивать количество введённых символов, когда и так уже есть 2 нативных ограничения: 128 символов для окна чата (то окно, куда вводишь текст при нажатии на F6 или Т) и MAX_CHATBUBBLE_LENGTH (144) для SendClientMessage(ToAll).



В общем, не код, а треш какой-то. Когда пишешь код, разбирай его, дабы понимать как он будет работать, а не просто от балды пиши.


CMD:f(playerid, params[])
{
if(Logged[playerid] == false)
return SendClientMessage(playerid, COLOR_GREY, PLogged);

new member = PlayerInfo[playerid][pMember];
if(member != 11 && member != 16 && member != 22)
return SendClientMessage(playerid, COLOR_WHITE, "Нет доступа!");

if(isnull(params))
return SendClientMessage(playerid, COLOR_WHITE, "Введите: (/f)amily [текст]");

new str_f[MAX_CHATBUBBLE_LENGTH+1];
format(str_f, sizeof(str_f),"[F] %s %s [%d]: %s", GetPlayerRank(playerid), GN(playerid), playerid, params);
SendFamilyMessage(member, 0x01FCFFC8, str_f);
return 1;
}

Elrmrnt-Kritik
30.03.2018, 00:10
Извиняюсь, что сюда, в чужую тему так сказать, просто раз уж за длину пошел разговор, а в params текст какой длиной, собственно, можно вместить?

whale
30.03.2018, 01:11
Извиняюсь, что сюда, в чужую тему так сказать, просто раз уж за длину пошел разговор, а в params текст какой длиной, собственно, можно вместить?

Если используется в команде, то, по сути - 128 символов (возможно ошибаюсь).

DeimoS
30.03.2018, 02:13
Извиняюсь, что сюда, в чужую тему так сказать, просто раз уж за длину пошел разговор, а в params текст какой длиной, собственно, можно вместить?

Вообще, если я не ошибаюсь, не больше свободного места в стэке, так как это просто параметр паблик-функции. Но если брать именно окно чата, то, как уже заметили выше, не больше 128 символов (так как больше ввести не получится игроку).
Точнее, "128 - длина_имени_команды", так как командный процессор помещает в "params" всё, кроме самой команды