PDA

Просмотр полной версии : [Вопрос] Использование команды по ID/нику игрока



Сергей
22.09.2019, 19:06
Доброго времени суток.
Хочу сделать, чтобы команды можно было использовать как по ID так и по Нику

Образно говоря, как я себе это всё представляю:
Ввожу цифры, это у нас получится ИД, мы возвращаем в команду цифры, и работаем с полученными цифрами

Пример:
Пришло из стока число 599
И мы записываем это число в переменную образно говоря в new_id
И дальше уже работаем с new_id

Если ввел ник:
Возвращаем из стока ник, и работаем уже собственно с ником

Я уже по пробовал сделать,но, пока-что как-то туго...



stock Player_Return(const TextTest[])
{
new i = strlen(TextTest);
new retern_text[MAX_PLAYER_NAME+1];
while(--i != -1)
{
switch(TextTest[i])
{
case ' ':
{
strmid(retern_text, TextTest, 0, strlen(TextTest), MAX_PLAYER_NAME);
strdel(retern_text, i, i+1);
}
case '0'..'9':
{
strmid(retern_text, TextTest, 0, strlen(TextTest), 6);
}
default:
{
strmid(retern_text, TextTest, 0, strlen(TextTest), MAX_PLAYER_NAME);
}
}
}
return retern_text,printf("Names: %s",retern_text);
}

Fallen A.
22.09.2019, 22:52
Думаю, должно помочь.


stock GetPlayerIDofName(const player_name[])
{
new temp_name[MAX_PLAYER_NAME];
foreach(Player, f)
{
if(!IsPlayerConnected(f))
continue;
GetPlayerName(f, temp_name, MAX_PLAYER_NAME);
if(!strcmp(temp_name, player_name, false))
return f;
}
return -1;
}

Nexius_Tailer
23.09.2019, 00:09
В sscanf есть спецификатор "u" для выделения из строки ID'а/имени игрока.

DeimoS
23.09.2019, 11:49
В sscanf есть спецификатор "u" для выделения из строки ID'а/имени игрока.

"u" - боты и игроки
"r" - только игроки
"q" - только боты

Ну и да, sscanf иногда может начать тупить, возвращая ID уже вышедших игроков. Не знаю после чего именно такое происходило, но уже несколько раз обращались с такой проблемой действующие проекты.

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


Думаю, должно помочь.


stock GetPlayerIDofName(const player_name[])
{
new temp_name[MAX_PLAYER_NAME];
foreach(Player, f)
{
if(!IsPlayerConnected(f))
continue;
GetPlayerName(f, temp_name, MAX_PLAYER_NAME);
if(!strcmp(temp_name, player_name, false))
return f;
}
return -1;
}


Зачем в foreach проверка на онлайн? Не говоря уже о том, что GetPlayerName вернёт 0, если игрок не подключен.

stock GetPlayerIDofName(const player_name[])
{
new find_name[MAX_PLAYER_NAME];
foreach(new i:Player)
{
GetPlayerName(i, find_name, MAX_PLAYER_NAME);
if(!strcmp(find_name, player_name, false))
return i;
}
return INVALID_PLAYER_ID;
}

Так же можно и кастомный спецификатор для sscanf сделать, который будет работать по принципу "u"
main()
{
new giveplayerid;
new params[] = "Nick_Name";
sscanf(params, "k<id>", giveplayerid);
}

SSCANF:id(const player_name[])
{
if ('0' <= player_name[0] <= '9')
{
new id = strval(player_name);
if(IsPlayerConnected(id))
{
return id;
}
}
new find_name[MAX_PLAYER_NAME];
foreach(new i:Player)
{
GetPlayerName(i, find_name, MAX_PLAYER_NAME);
if(!strcmp(find_name, player_name, false))
return i;
}
return INVALID_PLAYER_ID;
}

Сергей
23.09.2019, 14:10
"u" - боты и игроки
"r" - только игроки
"q" - только боты

Ну и да, sscanf иногда может начать тупить, возвращая ID уже вышедших игроков. Не знаю после чего именно такое происходило, но уже несколько раз обращались с такой проблемой действующие проекты.

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



Зачем в foreach проверка на онлайн? Не говоря уже о том, что GetPlayerName вернёт 0, если игрок не подключен.

stock GetPlayerIDofName(const player_name[])
{
new find_name[MAX_PLAYER_NAME];
foreach(new i:Player)
{
GetPlayerName(i, find_name, MAX_PLAYER_NAME);
if(!strcmp(find_name, player_name, false))
return i;
}
return INVALID_PLAYER_ID;
}

Так же можно и кастомный спецификатор для sscanf сделать, который будет работать по принципу "u"
main()
{
new giveplayerid;
new params[] = "Nick_Name";
sscanf(params, "k<id>", giveplayerid);
}

SSCANF:id(const player_name[])
{
if ('0' <= player_name[0] <= '9')
{
new id = strval(player_name);
if(IsPlayerConnected(id))
{
return id;
}
}
new find_name[MAX_PLAYER_NAME];
foreach(new i:Player)
{
GetPlayerName(i, find_name, MAX_PLAYER_NAME);
if(!strcmp(find_name, player_name, false))
return i;
}
return INVALID_PLAYER_ID;
}

Спасибо, закрываем.