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

Помогите разработка плагина с Netty, создание АПИ, помогите

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

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

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

    Баллы:
    76
    Имя в Minecraft:
    Kukuroku
    Ответ сервера не сразу приходит и в другой метод.
     
  2. alexandrage

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

    Баллы:
    173
    И чем это тебе мешает? Как пришло тогда и получил.
     
  3. Автор темы
    Mukiroku

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

    Баллы:
    76
    Имя в Minecraft:
    Kukuroku
    Ну я делаю АПИ, хочу сделать когда игрок написал команду /balance ему с минимальной задержкой АПИ прислала ответ, а плагин выслал сообщение о балансе. А как сделать АПИ я не знаю.
     
  4. alexandrage

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

    Баллы:
    173
    Добавил пакет для твоих нужд. Тестовая команда /getbalanse. Возвращает тестовое значение 10 от сокетсервера игроку. -> core
    Логика получения и передача баланса будет тут в //TODO.

    NetworkManager
    Код:
        public static void sendMoney(Packet<?> packet, String username, Channel channel)
                throws IOException {
            ByteBuf buf = Unpooled.buffer();
            PacketBuffer pbuf = new PacketBuffer(buf);
            pbuf.writeString(username);
            //TODO get player balanse.
            pbuf.writeInt(10);
            //TODO
            packet.readPacketData(pbuf);
            System.out.println(username);
            channel.writeAndFlush(packet);
        }
     
    Последнее редактирование: 7 апр 2018
  5. Автор темы
    Mukiroku

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

    Баллы:
    76
    Имя в Minecraft:
    Kukuroku
    А если я хочу что-бы не только выводились сообщение, а ещё в менюшке, сообщение к 3 лицам и многое другое, для этого каждый раз новый метод создавать?
     
  6. alexandrage

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

    Баллы:
    173
    Как нравится так и делай. Я показал тебе, как ответить всем серверам сразу и как ответить только одному серверу, от куда был запрос.
     
  7. Автор темы
    Mukiroku

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

    Баллы:
    76
    Имя в Minecraft:
    Kukuroku
    @alexandrage В твоём обновлённом коре есть баг. Я чисто от нечего делать сделал что-бы вместо 10 отправлялся обратно ник. И когда отправляешь 2 запроса вместе, то обработка иногда происходит 1 запроса 2 раза. Т.Е. когда я отправляю 2 запроса с никми A и B, то пишется в чат BB или AB.

    Я считаю что буфер забит 1 запросом когда 2 приходит и выплняет 2 раза 1 запрос, но как это исправить я не знаю.
    Подскажи.
     
  8. Автор темы
    Mukiroku

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

    Баллы:
    76
    Имя в Minecraft:
    Kukuroku
    UP!
     
  9. alexandrage

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

    Баллы:
    173
    Там ник и так возвращался. Сам что то сломал.
     
  10. Автор темы
    Mukiroku

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

    Баллы:
    76
    Имя в Minecraft:
    Kukuroku
    Я немного модернизировал твой код, добавив к одному пакету несколько слушателей.
    Я в класс Client добавил поле
    PHP:
    public static HashMap<String,Obrreg;// Obr - интерфейс с 1 методом
    В метод void start добавил обработчики
    PHP:
    reg.put("TEST"money -> {
       
    Player p Bukkit.getPlayerExact(money.getName().split("/%/")[0]);
       
    p.sendMessage(money.getMoney()+"");
          });
    reg.put("TEST1"money -> {
       
    Player p Bukkit.getPlayerExact(money.getName().split("/%/")[0]);
       
    p.sendMessage("Hahahahahaha");
    });
    reg.put("TEST2"money -> {
       
    Player p Bukkit.getPlayerExact(money.getName().split("/%/")[0]);
       
    p.sendMessage("Мы же так не похожи");
    });
    В классе NetworkManager в методах
    void sendMoney добавил параметр String obr и изменил
    pbuf.writeString(username); на pbuf.writeString(username+"/%/"+obr);
    в итоге
    PHP:
    public static void sendMoney(Packet<?packetString username,String obrChannel channel)
          
    throws IOException {
       
    ByteBuf buf Unpooled.buffer();
       
    PacketBuffer pbuf = new PacketBuffer(buf);
       
    pbuf.writeString(username+"/%/"+obr);
       
    //TODO get player balanse.
       
    pbuf.writeInt(10);
       
    //TODO
       
    packet.readPacketData(pbuf);
       
    System.out.println(username);
       
    buf.release();
       
    channel.writeAndFlush(packet);
    }
    и в методе
    void send изменил параметры на
    (Channel channel, Packet<?> packet, String name,String obr)
    и и аналогично изменил
    pbuf.writeString(name+"/%/"+obr);
    итог
    PHP:
    public static void send(Channel channel, Packet<?packetString name,String obrthrows IOException {
       
    ByteBuf buf Unpooled.buffer();
       
    PacketBuffer pbuf = new PacketBuffer(buf);
       
    pbuf.writeString(name+"/%/"+obr);
       
    packet.readPacketData(pbuf);
       
    buf.release();
       
    channel.writeAndFlush(packet);
    }
    Далее изменил метод handleMoney
    PHP:
    @Override
    public void handleMoney(SMoney packet) {
       
    System.out.println(packet.getName());
       
    String[] list = packet.getName().split("/%/");
       
    System.out.println(list[0]+" : " + list[1]);
       
    Client.reg.get(list[1]).enable(packet);
    }
    И всё, вроде не накосячил всё работает как я и хотел, но при проверке происходит баг.

    При вводе команды я вызываю методы
    PHP:
    NetworkManager.send(plugin.getChannel(), packetsender.getName(),"TEST");
    NetworkManager.send(plugin.getChannel(), packetsender.getName(),"TEST2");
    NetworkManager.send(plugin.getChannel(), packetsender.getName(),"TEST1");
    для проверки.

    И игроку пишет :
    upload_2018-4-10_6-48-56.png
    2 раз
    upload_2018-4-10_6-49-22.png
    3 раз
    upload_2018-4-10_6-50-10.png
    4 и 5 раз почти одновременно.
    upload_2018-4-10_6-50-43.png
     
  11. alexandrage

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

    Баллы:
    173
    Вот и не надо было так делать. И все работало бы как и должно.
     
  12. Автор темы
    Mukiroku

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

    Баллы:
    76
    Имя в Minecraft:
    Kukuroku
    А как ты скажешь обрабатывать разные события в зависимости от условий когда нужен только 1 пакет?
     

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