Питання введення ника замість id в командах sscanf

Введення ника замість ID в командах [sscanf].

Привіт шановні користувачі pro-pawn. Я використовую sscanf разом зі стандартним командним процесором (ZCMD не котить). Мені в деяких командах треба робити так, щоб адміністратор міг не тільки ввести ID гравця, але і написати його нік. Суть проблеми полягає ось у чому: припустимо на сервері сидить один гравець з ніком Alex_Brut. Якщо адміністратор вводить КМД / gethere [id_ігрока], то все працює чудово. Якщо адміністратор вводить / gethere [nickname] то теж все чудово, гравця переміщує до адміністратора (в даному випадку просто виконується команда). Але якщо ввести / gethere [Alex] або / gethere [Alex_Brutsss] або ж / gethere [Al] то адміністратора все одно переміщує до гравця Alex_Brut. Тобто виходить, що перевірка не спрацьовує на підключення гравця (IsPlayerConnected), а якщо ввести например не / gethere Alex, а / gethere Mike (або інші нікнейми), то перевірка спрацьовує. Я радився з Владиславом (Deimos) і він мені сказав почитати документацію до sscanf, але я так і не знайшов подібної проблеми. Ось власне сама команда:

else if (! strcmp (cmd. "/ gethere"))
<
if (PlayerInfo # 91; playerid # 93; # 91; pAdmin # 93; <2 ) return SendClientMessage ( playerid. COLOR_ERROR. "Недостаточно прав для использования команды." );
if (sscanf (params. "u". params # 91; 0 # 93;)) return SendClientMessage (playerid. COLOR_ERROR. "Команда / gethere # 91; playerid / PartOfName # 93; ");
if (! IsPlayerConnected (params # 91; 0 # 93;)) return SendClientMessage (playerid. COLOR_ERROR. "Цей гравець в даний момент не в мережі.");
new Float. X. Float. Y. Float. Z;
GetPlayerPos (playerid. X. Y. Z);
SetPlayerInterior (params # 91; 0 # 93 ;, GetPlayerInterior (playerid));
SetPlayerVirtualWorld (params # 91; 0 # 93 ;, GetPlayerVirtualWorld (playerid));
if (GetPlayerState (params # 91; 0 # 93;) == 2) SetVehiclePos (GetPlayerVehicleID (params # 91; 0 # 93;), X. Y + 4. Z);
else SetPlayerPos (params # 91; 0 # 93 ;, X. Y + 2. Z);
return 1;
>

Допоможіть будь ласка розібратися з даною проблемою.

Спробуйте почитати ось це, можливо допоможе.

Я взагалі не зрозумів суті. Але типи так лоя інформації, напишу.

Типи змінних для отримання
i. d - Цілочисельні 1 3 6
c - Букви д ж а *
l - Логічні Занки true false
b - Бінарні 01001. 0b1100
h. x - Hex 1A. 0x23
o - Octal 045 12
n - Number 42. 0b010. 0xAC. 045
f - Дробові 0.7. - 99.5
g - IEEE Float 0.7. - 99.5. INFINITY. - INFINITY. NAN. NAN_E
u - Повне ім'я або його ід Y_Less. 0
q - Bot name / id ShopBot. 27
r - Player name / id Y_Less. 42

Повідомлення від FanHamMer

Я взагалі не зрозумів суті. Але типи так лоя інформації, напишу.

Типи змінних для отримання
i. d - Цілочисельні 1 3 6
c - Букви д ж а *
l - Логічні Занки true false
b - Бінарні 01001. 0b1100
h. x - Hex 1A. 0x23
o - Octal 045 12
n - Number 42. 0b010. 0xAC. 045
f - Дробові 0.7. - 99.5
g - IEEE Float 0.7. - 99.5. INFINITY. - INFINITY. NAN. NAN_E
u - Повне ім'я або його ід Y_Less. 0
q - Bot name / id ShopBot. 27
r - Player name / id Y_Less. 42

Я ніби все чітко пояснив. Але спробую пояснити коротко: Уявімо, що у мене нік такий - Nick_Name. Якщо введу / gethere Nick_Name то все працює нормально. Якщо я введу тільки ім'я (Nick) то теж перемістить гравця Nick_Name. Виходить перевірка тут на підключення гравця не працює. А якщо наприклад, замість імені Nick, написати інше ім'я починається з іншої літери, то тут перевірка починає працювати.

SSCANF. return_user (text # 91; # 93;)
new p_nick # 91; MAX_PLAYER_NAME # 93 ;;
for (new t = strlen (text) - 1; t! = - 1; t -)
switch (text # 91; t # 93;)
case '0'. '9'. continue;
default:
for (new i; i if (! IsPlayerConnected (i)) continue;
GetPlayerName (i. P_nick. MAX_PLAYER_NAME);
if (! strcmp (p_nick. text. true)) return i;
>
return INVALID_PLAYER_ID;
>
>
>
return strval (text);
>

І тепер використовувати так:

else if (! strcmp (cmd. "/ gethere"))
if (PlayerInfo # 91; playerid # 93; # 91; pAdmin # 93; <2 ) return SendClientMessage ( playerid. COLOR_ERROR. "Недостаточно прав для использования команды." );
if (sscanf (params. "k". Params # 91; 0 # 93;)) return SendClientMessage (playerid. COLOR_ERROR. "Команда / gethere # 91; playerid / PartOfName # 93; ");
if (! IsPlayerConnected (params # 91; 0 # 93;)) return SendClientMessage (playerid. COLOR_ERROR. "Цей гравець в даний момент не в мережі.");
new Float. X. Float. Y. Float. Z;
GetPlayerPos (playerid. X. Y. Z);
SetPlayerInterior (params # 91; 0 # 93 ;, GetPlayerInterior (playerid));
SetPlayerVirtualWorld (params # 91; 0 # 93 ;, GetPlayerVirtualWorld (playerid));
if (GetPlayerState (params # 91; 0 # 93;) == 2) SetVehiclePos (GetPlayerVehicleID (params # 91; 0 # 93;), X. Y + 4. Z);
else SetPlayerPos (params # 91; 0 # 93 ;, X. Y + 2. Z);
return 1;
>

Повідомлення від Wise

Спробував замість U використовувати R все одно такий же баг.

"U" шукає серед всіх гравців і спамерських пошукових роботів.
"R" шукає тільки серед гравців, пропускаючи ботів
"Q" шукає тільки серед спамерських пошукових роботів.
Загалом, це активує різні перевірки в циклі, який перевіряє гравців

Зв'язатися зі мною можна в особистих повідомленнях цієї групи

Широко відомо, що ідеї стоять 0.8333 цента кожна (виходячи з ринкової ціни 10 центів за дюжину).
Великих ідей повно, на них немає попиту.
Втілення ідеї в закінчену гру вимагає довгої роботи,
таланту, терпіння і креативності, не кажучи вже про витрати грошей, часу і ресурсів.
Запропонувати ідею просто, втілити - ось в чому проблема

S teve P avlina