Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Показано с 1 по 8 из 8
  1. #1
    Аватар для Wise
    Пользователь

    Статус
    Оффлайн
    Регистрация
    30.10.2014
    Сообщений
    148
    Репутация:
    37 ±

    Ввод ника вместо 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, но я так и не нашёл подобной проблемы. Вот собственно сама команда:
    PHP код:
        else if(!strcmp(cmd"/gethere"))
        {
          if(
    PlayerInfo[playerid][pAdmin] < 2) return SendClientMessage(playeridCOLOR_ERROR"Недостаточно прав для использования команды.");
          if(
    sscanf(params"u"params[0])) return SendClientMessage(playeridCOLOR_ERROR"Команда /gethere [playerid/PartOfName]");
          if(!
    IsPlayerConnected(params[0])) return SendClientMessage(playeridCOLOR_ERROR"Этот игрок в данный момент не в сети.");
          new 
    Float:XFloat:YFloat:Z;
          
    GetPlayerPos(playeridXYZ);
          
    SetPlayerInterior(params[0], GetPlayerInterior(playerid));
          
    SetPlayerVirtualWorld(params[0], GetPlayerVirtualWorld(playerid));
          if(
    GetPlayerState(params[0]) == 2SetVehiclePos(GetPlayerVehicleID(params[0]), XY+4Z);
          else 
    SetPlayerPos(params[0], XY+2Z);
          return 
    1;
        } 
    Помогите пожалуйста разобраться с данной проблемой.

  2. #2
    Аватар для #ball
    Пользователь

    Статус
    Оффлайн
    Регистрация
    01.06.2014
    Адрес
    Rostov-on-Don
    Сообщений
    119
    Репутация:
    14 ±
    Попробуйте почитать вот это,возможно поможет.

  3. #3
    Аватар для Wise
    Пользователь

    Статус
    Оффлайн
    Регистрация
    30.10.2014
    Сообщений
    148
    Репутация:
    37 ±
    Я это и читал.

  4. #4
    Аватар для FanHamMer
    Пользователь

    Статус
    Оффлайн
    Регистрация
    06.01.2014
    Сообщений
    4
    Репутация:
    0 ±
    Я вообще не понял сути. Но типы так лоя информации, напишу.
    PHP код:
    Типы переменных для получения
    i
    Целочисленные 1 3 6
    Буквы д ж а *
    Логические занки true false
    Бинарные 010010b1100
    h
    Hex 1A0x23
    Octal 045 12
    Number 420b0100xAC045
    Дробные 0.7, -99.5
    IEEE Float 0.7, -99.5INFINITY, -INFINITYNANNAN_E
    Имя игрока или его ид Y_Less0
    Bot name/id ShopBot27
    Player name/id Y_Less42 

  5. #5
    Аватар для Wise
    Пользователь

    Статус
    Оффлайн
    Регистрация
    30.10.2014
    Сообщений
    148
    Репутация:
    37 ±
    Цитата Сообщение от FanHamMer Посмотреть сообщение
    Я вообще не понял сути. Но типы так лоя информации, напишу.
    PHP код:
    Типы переменных для получения
    i
    Целочисленные 1 3 6
    Буквы д ж а *
    Логические занки true false
    Бинарные 010010b1100
    h
    Hex 1A0x23
    Octal 045 12
    Number 420b0100xAC045
    Дробные 0.7, -99.5
    IEEE Float 0.7, -99.5INFINITY, -INFINITYNANNAN_E
    Имя игрока или его ид Y_Less0
    Bot name/id ShopBot27
    Player name/id Y_Less42 
    Я вроде всё внятно объяснил. Но попробую объяснить кратко: Представим, что у меня ник такой - Nick_Name. Если введу /gethere Nick_Name то всё работает нормально. Если я введу только имя (Nick) то тоже переместит игрока Nick_Name. Получается проверка здесь на подключение игрока не работает. А если например, вместо имени Nick, написать другое имя начинающееся с другой буквы, то здесь проверка начинает работать.

  6. #6
    Аватар для Wise
    Пользователь

    Статус
    Оффлайн
    Регистрация
    30.10.2014
    Сообщений
    148
    Репутация:
    37 ±
    Попробовал вместо U использовать R все равно такой же баг.

  7. #7
    Аватар для DeimoS
    Модератор?

    Статус
    Оффлайн
    Регистрация
    27.01.2014
    Адрес
    Восточный Мордор
    Сообщений
    5,588
    Репутация:
    1984 ±
    Можно сделать следующее

    PHP код:
    SSCANF:return_user(text[])
    {
        new 
    p_nick[MAX_PLAYER_NAME];
        for(new 
    strlen(text)-1!= -1t--)
        {
            switch(
    text[t])
            {
                case 
    '0'..'9': continue;
                default:
                {
                    for(new 
    iMAX_PLAYERSi++)//foreach(new i: Player)
                    
    {
                        if(!
    IsPlayerConnected(i)) continue;
                        
    GetPlayerName(ip_nickMAX_PLAYER_NAME);
                        if(!
    strcmp(p_nicktexttrue)) return i;
                    }
                    return 
    INVALID_PLAYER_ID;
                }
            }
        }
        return 
    strval(text);

    И теперь использовать так:
    PHP код:
    else if(!strcmp(cmd"/gethere"))
    {
        if(
    PlayerInfo[playerid][pAdmin] < 2) return SendClientMessage(playeridCOLOR_ERROR"Недостаточно прав для использования команды.");
        if(
    sscanf(params"k<return_user>"params[0])) return SendClientMessage(playeridCOLOR_ERROR"Команда /gethere [playerid/PartOfName]");
        if(!
    IsPlayerConnected(params[0])) return SendClientMessage(playeridCOLOR_ERROR"Этот игрок в данный момент не в сети.");
        new 
    Float:XFloat:YFloat:Z;
        
    GetPlayerPos(playeridXYZ);
        
    SetPlayerInterior(params[0], GetPlayerInterior(playerid));
        
    SetPlayerVirtualWorld(params[0], GetPlayerVirtualWorld(playerid));
        if(
    GetPlayerState(params[0]) == 2SetVehiclePos(GetPlayerVehicleID(params[0]), XY+4Z);
        else 
    SetPlayerPos(params[0], XY+2Z);
        return 
    1;

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

    Цитата Сообщение от Wise Посмотреть сообщение
    Попробовал вместо U использовать R все равно такой же баг.
    "u" ищет среди всех игроков и ботов.
    "r" ищет только среди игроков, пропуская ботов
    "q" ищет только среди ботов.
    В общем, это активирует разные проверки в цикле, который проверяет игроков
    Связаться со мной в VK можно через личные сообщения этой группы
    Заказы не принимаю

    Широко известно, что идеи стоят 0.8333 цента каждая (исходя из рыночной цены 10 центов за дюжину).
    Великих идей полно, на них нет спроса.
    Воплощение идеи в законченную игру требует долгой работы,
    таланта, терпения и креативности, не говоря уж о затратах денег, времени и ресурсов.
    Предложить идею просто, воплотить – вот в чём проблема

    Steve Pavlina

  8. Пользователь сказал cпасибо:
    Wise (11.11.2014)
  9. #8
    Аватар для Wise
    Пользователь

    Статус
    Оффлайн
    Регистрация
    30.10.2014
    Сообщений
    148
    Репутация:
    37 ±
    Спасибо огромное Владислав!!! Вы лучший!
    Последний раз редактировалось DeimoS; 11.11.2014 в 21:15.

 

 

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •