1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie. Узнать больше.
  2. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

Помогите Запросы другому игроку

Тема в разделе "Разработка плагинов для новичков", создана пользователем reZero, 18 янв 2019.

  1. Автор темы
    reZero

    reZero Активный участник Пользователь

    Баллы:
    76
    Всем привет. Извиняюсь за то что стал частенько создавать темы с глупыми вопросами и надеюсь, что эта будет последней...
    В общем, я на этом моменте затупил и не могу разобраться..
    Мне нужно, чтобы при вводе команды игроком name1, игроку name2 отправлялся запрос. Ему нужно этот запрос принять или отказаться от него. Если по-русски, то можно привести в пример тот же самый /call из essentials'а.
    В чем же проблема.. Проблема заключается в том, что при вводе команды на запрос игроком name1, мне нужно записать обоих игроков в мапу, а потом доставать из этой мапы чтобы совершать действия которые мне нужны, но я запутался в этих джавовских азах и не могу въехать, каким образом мне можно получить из этой мапы и игрока name1 и игрока name2...
    Вопрос очень глупый, но тем не менее, надеюсь что поможете и помидорами закидывать не будете...
     
  2. Reality_SC

    Reality_SC Старожил Пользователь

    Баллы:
    123
    Имя в Minecraft:
    Reality_SC
    Долго писал ответ, но всё стёр, и написал код.
    https://pastebin.com/3Fqe2HPY
    Как юзать:
    • В главном классе
      Код:
      private final RequestContextService contextService = new 
      RequestContextService(this);
    • По необходимости расширить класс с контекстом каким-то своим:
      Код:
      public class MyOwnSuperRequest extends RequestContext {
      /* ... */
      }
    • Ловко обрабатывать команды от игроков, исходного — отправка и отмена, от целевого — принятие и отказ, для этого юзать методы contextService: addRequest(), findBySource(), findByTarget(), removeContext().
    • Ну и там наверное стоит поправить код уведомлений, сделать как-то попизже.
    P. S. Немного переписал: https://pastebin.com/RjyaaYC0
     
    Последнее редактирование: 18 янв 2019
  3. Автор темы
    reZero

    reZero Активный участник Пользователь

    Баллы:
    76
    В коде, который ты скинул, есть несколько непонятных моментов... а именно:
    • Ты используешь методы getSource(); getTarget(); setSourceTask(); setTargetTask(); которые ты в принципе не прописал. Мб я туплю конечно, но эти методы отсутствуют.
    • Ты используешь аннотации, которых у меня по факту нет, естественно они не пашут
     
  4. Reality_SC

    Reality_SC Старожил Пользователь

    Баллы:
    123
    Имя в Minecraft:
    Reality_SC
    Это lombok, чтобы не писать шаблонный код.
     
  5. Dymeth

    Dymeth Активный участник Пользователь

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    С шаблонным кодом, но без Lombok: https://pastebin.com/nUchNeGv
     
  6. MurlikMurlik

    MurlikMurlik Активный участник Пользователь

    Баллы:
    96
    Можно сделать совсем просто.
    Создаем хешмап с ключем String и с списком, который хранит так же String. Список это игроки, которые отправляли запрос тому, где находятся собственно эти списки.
    Например.
    Код:
    Map<String, List<String>> requests = new HashMap<String, List<String>>();
    
    Например игрок Kot хочет отправить запросу игроку Vasya.
    Добавляем в хешмап новый объект, ключ которого Vasya, а значение этого ключа список String, добавляем в этот список игрока Kot. Если нужно реализовать таймаут запросов, то нужно создать класс который будет хранить ник игрока и таймер (далее использовать его вместо String у списков). Таймер будет запускаться в конструкторе. Так же, в конструкторе, надо передать ссылку на список, в котором находится этот объект, а далее, использовать это для самоуничтожения когда выйдет время.
    Код:
    мол this.whereIAm.remove(this);
    Это крайне говнокодерский вариант (вроде), но по этому принципу по началу можно реализовать такое.
     

Поделиться этой страницей