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

    Статус
    Оффлайн
    Регистрация
    13.08.2015
    Сообщений
    2
    Репутация:
    0 ±

    Выбор нужного игрока из диалога

    Ломаю голову уже несколько дней.
    Что я хочу увидеть от кода? При вызове диалога идет отбор по игрокам, которые находятся в трех метрах от playerid (по коду все ясно), но мне надо передать предмет именно тому игроку, на которого я нажал (из диалога).

      Открыть/закрыть

    Возле меня стоят три игрока, допустим, их зовут PlayerOne[1], PlayerTwo[2] и PlayerThree[3], мне надо передать что-то игроку с ником PlayerTwo и ID:2.
    Диалог, естественно, будет таким:
    Код:
    ShowPlayerDialog(playerid, 8, DIALOG_STYLE_LIST, "Инвентарь > Передать", "PlayerOne[1]\nPlayerTwo[2]\nPlayerThree[3]", "Выбор", "Назад");
    Но ведь вместо этих ников и ID могут быть и другие. Как мне передать игроку с ID:2 предмет?


    PHP код:
    case 2: {
        if(!
    response) return ShowPlayerDialog(playerid6DIALOG_STYLE_TABLIST"Инвентарь"string"Выбор""Выйти");
        new 
    Float:player_pos[3],
            
    string_foreach[31],
            
    strcat_string[24*6];
        
    GetPlayerPos(playeridplayer_pos[0], player_pos[1], player_pos[2]);
        foreach(
    Playeri)
        {
            if(!
    IsPlayerInRangeOfPoint(i3.0player_pos[0], player_pos[1], player_pos[2])) continue;
            
    format(string_foreachsizeof(string_foreach), "%s[%d]\n"PlayerInfo[i][pName], i);
            
    strcat(strcat_stringstring_foreach);
        }
        return 
    ShowPlayerDialog(playerid8DIALOG_STYLE_LIST"Инвентарь > Передать"strcat_string"Выбор""Назад");

    p.s. на массивы не смотрите, потом все пересчитаю и сделаю как надо.

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

    Статус
    Оффлайн
    Регистрация
    02.08.2014
    Адрес
    г. Киров (aka Вятка)
    Сообщений
    1,487
    Репутация:
    276 ±
    if(!IsPlayerInRangeOfPoint(...))
    i - хранит ID игроков в радиусе 3.0, в чем проблема?

  3. #3
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Цитата Сообщение от $continue$ Посмотреть сообщение
    if(!IsPlayerInRangeOfPoint(...))
    i - хранит ID игроков в радиусе 3.0, в чем проблема?
    Т.е. при нажатии кнопки перебирать игроков ещё раз и составлять список? Не пойдёт, за пару секунд между показом диалогов и нажатием кнопки кто-то из игроков может отойти или радом встанет кто-нибудь ещё и на N-ом месте в списке вместо Пети будет Вася. Я уже не говорю о том, насколько это затратно будет перебирать игроков и составлять заново список.

    По сабжу: самым простым выходом будет использовать GetPlayerTargetPlayer: просто нацеливаетесь на игрока, нажимаете Y и перед вам открывается диалог передачи предметов этому игроку.

    Второй способ:
    PHP код:
    // макс. кол-во игроков в диалоге передачи
    const MAX_GIVE_DLG_TARGET_PLAYERS 8;
    new 
    give_dlg_target_players[MAX_PLAYERS][MAX_GIVE_DLG_TARGET_PLAYERS]; 
    Перед показом диалога записываете ID всех стоящих рядом игроков в массив и после нажатия кнопки просто берёте соответствующий ID из массива.

    Третий способ:
    PHP код:
    const MAX_GIVE_DLG_TARGET_PLAYERS 8;
    // кол-во символов в строке диалога: длина ника минус символ конца строки ("\0")
    // плюс знак переноса ("\n") или конца строки, если последняя строка в диалоге.
    const NICK_NAME_STR_LEN MAX_PLAYER_NAME-1+1;
    // рационально рассчитываем размер строковой переменной
    new buffer[NICK_NAME_STR_LEN MAX_GIVE_DLG_TARGET_PLAYERS];
    // ...
    return ShowPlayerDialog(playerid8DIALOG_STYLE_LIST"Инвентарь > Передать"/* ... */); 
    Это нигде не задокументировано, но если показать игроку диалог со стилем DIALOG_STYLE_LIST, то в коллбэке OnDialogResponse будет не только ID выбранной строки (listitem), но и содержимое той строки (inputtext). В итоге в inputtext будет никнейм выбранного игрока - вам останется лишь перебрать всех подключенных игроков, пока не найдёте нужного игрока. Есть вероятность, что выбранный игрок за пару секунд успеет сменить ник, но это маловероятно. Тот же самый эффект будет, если выбранный игрок выйдет с сервера - нужно всего лишь учесть такой вариант и показать сообщение об ошибке, если не нашли игрока с выбранным ником.
    И да, лучше заранее кешировать никнеймы игроков (при подключении сохранять их в массив), чтобы не вызывать по over9000 раз функцию GetPlayerName. Примерно завтра или послезавтра я постараюсь выложить инклуд как раз для таких целей. Следите за обновлениями на сайте.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  4. #4
    Аватар для #Vito
    #define

    Статус
    Оффлайн
    Регистрация
    14.09.2013
    Адрес
    Одесса
    Сообщений
    129
    Репутация:
    38 ±
    Можно еще сделать как то так:
    PHP код:
    new Player[MAX_PLAYERS][15]; 
    PHP код:
    CMDperedat() // КМД показа диалога
    {
       new 
    Float:Pos[3], a;
       
    GetPlayerPos(playeridPos[0], Pos[1], Pos[2]);
       for(new 
    iMAX_PLAYERSi++)
       {
          if(!
    IsPlayerInRangeOfPoint(i3.0Pos[0], Pos[1], Pos[2]) continue;
          
    Player[playerid][a] = i;
          
    a++;
          
    // Тут узнаешь ники и т.д. и т.п.
          
    ShowPlayerDialog(playerid8DIALOG_STYLE_LIST"Инвентарь > Передать""PlayerOne[1]\nPlayerTwo[2]\nPlayerThree[3]""Выбор""Назад");
       }
       return 
    1;

    И использовать
    PHP код:
    Player[playerid][listitem
    Ну, должно работать
    Последний раз редактировалось #Vito; 28.08.2015 в 22:30.
    Skype: vitya.saveliev


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

    Статус
    Оффлайн
    Регистрация
    02.08.2014
    Адрес
    г. Киров (aka Вятка)
    Сообщений
    1,487
    Репутация:
    276 ±
    Цитата Сообщение от #Vito Посмотреть сообщение
    Можно еще сделать как то так:
    PHP код:
    new Player[MAX_PLAYERS][15]; 
    PHP код:
    CMDperedat() // КМД показа диалога
    {
       new 
    Float:Pos[3], a;
       
    GetPlayerPos(playeridPos[0], Pos[1], Pos[2]);
       for(new 
    iMAX_PLAYERSi++)
       {
          if(!
    IsPlayerInRangeOfPoint(i3.0Pos[0], Pos[1], Pos[2]) continue;
          
    Player[playerid][a] = i;
          
    a++;
          
    // Тут узнаешь ники и т.д. и т.п.
          
    ShowPlayerDialog(playerid8DIALOG_STYLE_LIST"Инвентарь > Передать""PlayerOne[1]\nPlayerTwo[2]\nPlayerThree[3]""Выбор""Назад");
       }
       return 
    1;

    И использовать
    PHP код:
    Player[playerid][listitem
    Ну, должно работать
    И словить выход за пределы массива...

  6. #6
    Аватар для #Vito
    #define

    Статус
    Оффлайн
    Регистрация
    14.09.2013
    Адрес
    Одесса
    Сообщений
    129
    Репутация:
    38 ±
    Цитата Сообщение от $continue$ Посмотреть сообщение
    И словить выход за пределы массива...
    Ничего не мешает его увеличить..
    PHP код:
    new Player[MAX_PLAYERS][MAX_PLAYERS]; 
    Skype: vitya.saveliev


  7. #7
    Аватар для $continue$
    Пользователь

    Статус
    Оффлайн
    Регистрация
    02.08.2014
    Адрес
    г. Киров (aka Вятка)
    Сообщений
    1,487
    Репутация:
    276 ±
    R
    Цитата Сообщение от #Vito Посмотреть сообщение
    Ничего не мешает его увеличить..
    PHP код:
    new Player[MAX_PLAYERS][MAX_PLAYERS]; 
    Изврат
    PHP код:
    #undef MAX_PLAYERS
    const MAX_PLAYERS 20

  8. #8
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Цитата Сообщение от #Vito Посмотреть сообщение
    Ничего не мешает его увеличить..
    PHP код:
    new Player[MAX_PLAYERS][MAX_PLAYERS]; 
    Цитата Сообщение от $continue$ Посмотреть сообщение
    R

    Изврат
    PHP код:
    #undef MAX_PLAYERS
    const MAX_PLAYERS 20
    ...
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    PHP код:
    const MAX_GIVE_DLG_TARGET_PLAYERS 8
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  9. Пользователь сказал cпасибо:
    #Vito (29.08.2015)
 

 

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

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

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

Ваши права

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