PDA

Просмотр полной версии : [Мануал] Исправление команд (не срабатывают с первого раза) | sscanf



#Gabriel
22.11.2014, 10:26
В общем всех приветствую.
Пришел на Ваш портал по совету одного очень хорошего человека :bye:
И сразу выкидываю мой первый урок.

Замечал, у многих не работают команды с 1 раза (команды на CMD процессоре + sscanf).
Ну что-ж приступим.

Ищем команду которая не работает, в моём случае это:

CMD:zamorozka(playerid, params[])
{
if ( sscanf( params, "u", params[0] ) ) return SendClientMessage(playerid, -1, "Введите: /zamorozka [id]"); // Тут у нас сама недоработка
if ( !IsPlayerConnected( params[0] ) ) return true;
TogglePlayerControllable ( params[0], 0 ) ; // Замораживаем указанного игрока
ABroadCast ( -1, str, 1 ) ;
return true ; // Заканчиваем действие
}

Просто ищем код типа:

if ( sscanf( params, "u", params[0] ) ) // у Вас может быть по другому.

Ошибка у нас содержится в значении которое мы указываем после ввода самой команды (ид игрока). То есть:

"u"

Просто заменяем на

"d"

Получится:

CMD:zamorozka(playerid, params[])
{
if ( sscanf( params, "d", params[0] ) ) return SendClientMessage(playerid, -1, "Введите: /zamorozka [id]"); // Тут у нас сама недоработка
if ( !IsPlayerConnected( params[0] ) ) return true;
TogglePlayerControllable ( params[0], 0 ) ; // Замораживаем указанного игрока
ABroadCast ( -1, str, 1 ) ;
return true ; // Заканчиваем действие
}


Автор: #Gabriel (Gabriel_Shiffer)
При копировании информации, указывайте авторские права "Автор: #Gabriel (Gabriel_Shiffer)".

wAx
22.11.2014, 13:23
Ничего сверх полезного в этом мануале не описано, скажу больше, в "u" хранится не только ID игрока, но и его Ник, т.е можно указать как и ID так и Никнейм..

DeimoS
22.11.2014, 13:29
Ничего сверх полезного в этом мануале не описано, скажу больше, в "u" хранится не только ID игрока, но и его Ник, т.е можно указать как и ID так и Никнейм..

Точнее, можно даже часть ника указывать. Даже одну букву. И всё равно sscanf будет искать... С "u" больше проблем. Проще уж самостоятельно написать что-то типа "ReturnUser" и сделать его понятным sscanf (пример (http://pro-pawn.ru/showthread.php?10842-%D0%92%D0%B2%D0%BE%D0%B4-%D0%BD%D0%B8%D0%BA%D0%B0-%D0%B2%D0%BC%D0%B5%D1%81%D1%82%D0%BE-ID-%D0%B2-%D0%BA%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4%D0%B0%D1%85-sscanf&p=53391&viewfull=1#post53391))

L0ndl3m
22.11.2014, 15:04
#Gabriel, можете ли объяснить, с чем это связано?

#Gabriel
22.11.2014, 17:39
Ничего сверх полезного в этом мануале не описано, скажу больше, в "u" хранится не только ID игрока, но и его Ник, т.е можно указать как и ID так и Никнейм..

s[значение] лично я использую для ников.

- - - Добавлено - - -


Точнее, можно даже часть ника указывать. Даже одну букву. И всё равно sscanf будет искать... С "u" больше проблем. Проще уж самостоятельно написать что-то типа "ReturnUser" и сделать его понятным sscanf (пример (http://pro-pawn.ru/showthread.php?10842-%D0%92%D0%B2%D0%BE%D0%B4-%D0%BD%D0%B8%D0%BA%D0%B0-%D0%B2%D0%BC%D0%B5%D1%81%D1%82%D0%BE-ID-%D0%B2-%D0%BA%D0%BE%D0%BC%D0%B0%D0%BD%D0%B4%D0%B0%D1%85-sscanf&p=53391&viewfull=1#post53391))

Полностью согласен что "d" проблематичен.

wAx
22.11.2014, 18:17
s[значение] лично я использую для ников.
Я очень рад что ты используешь это для ников. Но в своем мануале, ты заменяешь способ поиска как и по ID так и по части ника, на простой поиск по ID.

#Gabriel
22.11.2014, 18:25
Я очень рад что ты используешь это для ников. Но в своем мануале, ты заменяешь способ поиска как и по ID так и по части ника, на простой поиск по ID.

Зачем использовать "u" где нужно использовать "d" для действия на определенный ID?
"u" - для ника
"d" - id
- Вывод: мой мануал на примере команды заморозки.

Wise
22.11.2014, 18:59
Зачем использовать "u" где нужно использовать "d" для действия на определенный ID?
"u" - для ника
"d" - id
- Вывод: мой мануал на примере команды заморозки.

"u" - чисто только для ника и ID игрока.
"d" используется для всех целых чисел/десятичных дробей.

"u" также может использоваться для ввода ID игрока, если администратор не будет вводить ник, то всё будет прекрасно работать. А вдруг администратор захочет ввести ник игрока, то ваш числовой параметр здесь не спасёт его. Кроме чисел он ничего не сможет вводить, так что ваш мануал не решает недоработку разработчиков sscanf.

Valera_Trefilov
22.11.2014, 19:22
Ребята, зачем нам это программирование?
Делаем просто вот так:



CMD:test(playerid, params[])
{
if (sscanf(params, "u", params[0])) return 1;
GetPlayerName (params[0], params[params[0]], 24);
SendClientMessage (params[0], -1, params[params[0]]);
return 1;
}

#Gabriel
22.11.2014, 19:27
Ребята, зачем нам это программирование?
Делаем просто вот так:



CMD:test(playerid, params[])
{
if (sscanf(params, "u", params[0])) return 1;
GetPlayerName (params[0], params[params[0]], 24);
SendClientMessage (params[0], -1, params[params[0]]);
return 1;
}



CMD:test(playerid, params[])
{
if (sscanf(params, "u", params[0])) return 1;
GetPlayerName (params[0], params[params[0]], 24);
SendClientMessage (params[0], -1, params[params[0]]);
return 1;
}

Действие команды заканчивается раньше. Вашим "return true;".
На ID игрока определенного срабатывать не будет.