Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.

Реклама


**Как получить V.I.P** (Перейти)
Чтобы заказать рекламу на Pro-Pawn.Ru, обращайтесь в Skype.
Баннерная реклама 200руб/мес, Текстовая 100руб/мес.
Показано с 1 по 8 из 8
  1. #1
    Аватар для Wise
    Пользователь

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

    Ввод ника вместо 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
    Сообщений
    120
    Репутация:
    14 ±
    Попробуйте почитать вот это,возможно поможет.

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

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

  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
    Репутация:
    36 ±
    Цитата Сообщение от 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
    Репутация:
    36 ±
    Попробовал вместо U использовать R все равно такой же баг.

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

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

    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" ищет только среди ботов.
    В общем, это активирует разные проверки в цикле, который проверяет игроков
    Связаться со мной можно в личных сообщениях этой группы

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

    Steve Pavlina

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

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

 

 

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

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

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

Ваши права

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