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

Mukiroku

Активный участник
Пользователь
Баллы
76
Имя в Minecraft
Kukuroku
Здравствуйте, коротко о проблеме пишу плагины(Сервер+ Клиен) на экономику. Нужно с помощью метода как-то получить информацию в сервера. То есть

/-------> Нужны монеты Vasya ->--\
Клиент [Сервер]
| | |
API | Обработка
| \-----------<----Vasya 200<--/
200
|
3 плагин


Q) Т.К. netty работает асинхронно то у неё нет метода что-то получить, есть эвенты, и когда клиент прослушивает что отправил сервер данные заносит в КАРТУ.

пример метода.

PHP:
  public static int getMoney(String name)
{
  [Отправка запроса к серверу]

  while(   [Если в мате нет Name]  ){
  //ждём пока не появится.
}
return МАПА.получить(Name);
}
Суть вопроса: стоит ли ждать пока сервер ответит циклом While или есть другой способ?

P.S. делал с Netty[/PHP]
 
И чем это тебе мешает? Как пришло тогда и получил.
Ну я делаю АПИ, хочу сделать когда игрок написал команду /balance ему с минимальной задержкой АПИ прислала ответ, а плагин выслал сообщение о балансе. А как сделать АПИ я не знаю.
 
Ну я делаю АПИ, хочу сделать когда игрок написал команду /balance ему с минимальной задержкой АПИ прислала ответ, а плагин выслал сообщение о балансе. А как сделать АПИ я не знаю.
Добавил пакет для твоих нужд. Тестовая команда /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);
    }
 
Последнее редактирование:
Добавил пакет для твоих нужд. Тестовая команда /getbalanse. Возвращает тестовое значение 10 от сокетсервера игроку. -> core
Логика получения и передача баланса будет тут в //TODO.
Код:
А если я хочу что-бы не только выводились сообщение, а ещё в менюшке, сообщение к 3 лицам и многое другое, для этого каждый раз новый метод создавать?
 
А если я хочу что-бы не только выводились сообщение, а ещё в менюшке, сообщение к 3 лицам и многое другое, для этого каждый раз новый метод создавать?
Как нравится так и делай. Я показал тебе, как ответить всем серверам сразу и как ответить только одному серверу, от куда был запрос.
 
@alexandrage В твоём обновлённом коре есть баг. Я чисто от нечего делать сделал что-бы вместо 10 отправлялся обратно ник. И когда отправляешь 2 запроса вместе, то обработка иногда происходит 1 запроса 2 раза. Т.Е. когда я отправляю 2 запроса с никми A и B, то пишется в чат BB или AB.

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

Я считаю что буфер забит 1 запросом когда 2 приходит и выплняет 2 раза 1 запрос, но как это исправить я не знаю.
Подскажи.
UP!
 
@alexandrage В твоём обновлённом коре есть баг. Я чисто от нечего делать сделал что-бы вместо 10 отправлялся обратно ник. И когда отправляешь 2 запроса вместе, то обработка иногда происходит 1 запроса 2 раза. Т.Е. когда я отправляю 2 запроса с никми A и B, то пишется в чат BB или AB.

Я считаю что буфер забит 1 запросом когда 2 приходит и выплняет 2 раза 1 запрос, но как это исправить я не знаю.
Подскажи.
Там ник и так возвращался. Сам что то сломал.
 
Я немного модернизировал твой код, добавив к одному пакету несколько слушателей.
Я в класс Client добавил поле
PHP:
public static HashMap<String,Obr> reg;// 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<?> packet, String username,String obr, Channel 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<?> packet, String name,String obr) throws 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(), packet, sender.getName(),"TEST");
NetworkManager.send(plugin.getChannel(), packet, sender.getName(),"TEST2");
NetworkManager.send(plugin.getChannel(), packet, sender.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
 
Я немного модернизировал твой код, добавив к одному пакету несколько слушателей.
Я в класс Client добавил поле
PHP:
public static HashMap<String,Obr> reg;// 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<?> packet, String username,String obr, Channel 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<?> packet, String name,String obr) throws 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(), packet, sender.getName(),"TEST");
NetworkManager.send(plugin.getChannel(), packet, sender.getName(),"TEST2");
NetworkManager.send(plugin.getChannel(), packet, sender.getName(),"TEST1");
для проверки.

И игроку пишет :
Посмотреть вложение 50542
2 раз
Посмотреть вложение 50543
3 раз
Посмотреть вложение 50544
4 и 5 раз почти одновременно.
Посмотреть вложение 50545
Вот и не надо было так делать. И все работало бы как и должно.
 
Назад
Верх