Помогите разработка плагина с 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]
 
Гуишка с серверами готовая есть, в качестве примера. Сервера разделяются через мотд.
Ты вроде шаришь 🙂 . Я как понимаю когда клиент получает данные они "приходят в метод"
channelRead(ChannelHandlerContext ctx, Object msg). К примеру я создал метод String get(Strings s)
В методе я серверу отправляю стоку s и хочу от получить строку, и отправить(return o; к примеру, где o - полученная строка от сервера) полученные данные. Как возможно реализовать это?
 
Ты вроде шаришь 🙂 . Я как понимаю когда клиент получает данные они "приходят в метод"
channelRead(ChannelHandlerContext ctx, Object msg). К примеру я создал метод String get(Strings s)
В методе я серверу отправляю стоку s и хочу от получить строку, и отправить(return o; к примеру, где o - полученная строка от сервера) полученные данные. Как возможно реализовать это?
NetHandlerPlayClient handleChat читает ответ.
 
Вот у меня тут идет управление менюшкой
Код:
    @Override
    public void handleChat(SPacket packet) {
        Map<String, Integer> list = this.plugin.getServerList().list;
        list.put(packet.getServer(), packet.getOnline());
        this.plugin.getMenu().reload(list);
    }
Заменишь своей логикой и все.
 
Вот у меня тут идет управление менюшкой
Код:
    @Override
    public void handleChat(SPacket packet) {
        Map<String, Integer> list = this.plugin.getServerList().list;
        list.put(packet.getServer(), packet.getOnline());
        this.plugin.getMenu().reload(list);
    }
Заменишь своей логикой и все.
Спасибо, что-то полезное найду точно.
 
До меня не доходит как это сделать, что-бы главный поток не останавливался , Всё что я могу придумать это цикл пока результат не появится.
Мне кажется тебе надо многопоточность подучить перед netty ору, можешь юзать какой-то простенький MQ вместо netty
 
У тебя с CORE ошибка, или я не ту версию netty использую.
[07:04:28] [Server thread/ERROR]: Error occurred while enabling core v1.0 (Is it up to date?)
java.lang.NoClassDefFoundError: io/netty/channel/EventLoopGroup
at core.Main.onEnable(Main.java:27) ~[?:?]
at org.bukkit.plugin.java.JavaPlugin.setEnabled(JavaPlugin.java:316) ~[Test.jar:git-Spigot-1.7.9-R0.2-208-ge0f2e95]
at org.bukkit.plugin.java.JavaPluginLoader.enablePlugin(JavaPluginLoader.java:332) [Test.jar:git-Spigot-1.7.9-R0.2-208-ge0f2e95]
at org.bukkit.plugin.SimplePluginManager.enablePlugin(SimplePluginManager.java:412) [Test.jar:git-Spigot-1.7.9-R0.2-208-ge0f2e95]
at org.bukkit.craftbukkit.v1_7_R4.CraftServer.loadPlugin(CraftServer.java:476) [Test.jar:git-Spigot-1.7.9-R0.2-208-ge0f2e95]
at org.bukkit.craftbukkit.v1_7_R4.CraftServer.enablePlugins(CraftServer.java:394) [Test.jar:git-Spigot-1.7.9-R0.2-208-ge0f2e95]
at org.bukkit.craftbukkit.v1_7_R4.CraftServer.reload(CraftServer.java:866) [Test.jar:git-Spigot-1.7.9-R0.2-208-ge0f2e95]
at org.bukkit.Bukkit.reload(Bukkit.java:301) [Test.jar:git-Spigot-1.7.9-R0.2-208-ge0f2e95]
at org.bukkit.command.defaults.ReloadCommand.execute(ReloadCommand.java:23) [Test.jar:git-Spigot-1.7.9-R0.2-208-ge0f2e95]
at org.bukkit.command.SimpleCommandMap.dispatch(SimpleCommandMap.java:181) [Test.jar:git-Spigot-1.7.9-R0.2-208-ge0f2e95]
at org.bukkit.craftbukkit.v1_7_R4.CraftServer.dispatchCommand(CraftServer.java:767) [Test.jar:git-Spigot-1.7.9-R0.2-208-ge0f2e95]
at org.bukkit.craftbukkit.v1_7_R4.CraftServer.dispatchServerCommand(CraftServer.java:753) [Test.jar:git-Spigot-1.7.9-R0.2-208-ge0f2e95]
at net.minecraft.server.v1_7_R4.DedicatedServer.aB(DedicatedServer.java:326) [Test.jar:git-Spigot-1.7.9-R0.2-208-ge0f2e95]
at net.minecraft.server.v1_7_R4.DedicatedServer.v(DedicatedServer.java:290) [Test.jar:git-Spigot-1.7.9-R0.2-208-ge0f2e95]
at net.minecraft.server.v1_7_R4.MinecraftServer.u(MinecraftServer.java:584) [Test.jar:git-Spigot-1.7.9-R0.2-208-ge0f2e95]
at net.minecraft.server.v1_7_R4.MinecraftServer.run(MinecraftServer.java:490) [Test.jar:git-Spigot-1.7.9-R0.2-208-ge0f2e95]
at net.minecraft.server.v1_7_R4.ThreadServerApplication.run(SourceFile:628) [Test.jar:git-Spigot-1.7.9-R0.2-208-ge0f2e95]
Caused by: java.lang.ClassNotFoundException: io.netty.channel.EventLoopGroup
at java.base/java.net.URLClassLoader.findClass(Unknown Source) ~[?:?]
at org.bukkit.plugin.java.PluginClassLoader.findClass(PluginClassLoader.java:101) ~[Test.jar:git-Spigot-1.7.9-R0.2-208-ge0f2e95]
at org.bukkit.plugin.java.PluginClassLoader.findClass(PluginClassLoader.java:86) ~[Test.jar:git-Spigot-1.7.9-R0.2-208-ge0f2e95]
at java.base/java.lang.ClassLoader.loadClass(Unknown Source) ~[?:?]
at java.base/java.lang.ClassLoader.loadClass(Unknown Source) ~[?:?]
... 17 more


PHP:
package core;

import org.bukkit.Bukkit;
import org.bukkit.plugin.java.JavaPlugin;
import io.netty.channel.Channel;
import netty.CPacket;
import netty.Client;
import netty.INetHandlerPlayServer;
import netty.NetworkManager;
import netty.Packet;

public class Main extends JavaPlugin {
    private Channel channel;
    private Menu menu;
    ServerList list;
    Client client;

    public void setupChannel() {
        if (client.getChannel() == null) {
            client.start(this);
            channel = client.getChannel();
        }
    }


    public void onEnable() {
        client = new Client();
        setupChannel();
        getServer().getPluginManager().registerEvents(new EventListener(this), this);
        menu = new Menu("Menu");
        list = new ServerList();
        try {
            Packet<INetHandlerPlayServer> packet = new CPacket();
            NetworkManager.send(getChannel(), packet, Bukkit.getServer().getMotd(),
                    getServer().getOnlinePlayers().size());
        } catch (Exception e1) {}
    }

    public Menu getMenu() {
        return menu;
    }

    public ServerList getServerList() {
        return list;
    }

    public Channel getChannel() {
        return channel;
    }

    public Main getPlugin() {
        return this;
    }
PHP:
 package netty;

import core.Main;
import io.netty.bootstrap.Bootstrap;
import io.netty.channel.Channel;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioSocketChannel;

public class Client {
    private Channel channel;
    private State state;

    public void start(Main plugin) {
        state = State.client;
        EventLoopGroup group = new NioEventLoopGroup();
        try {
            Bootstrap bootstrap = new Bootstrap().group(group).channel(NioSocketChannel.class)
                    .handler(new Initializer(new NetHandlerPlayClient(plugin), state));
            this.channel = bootstrap.connect(Config.ip, Config.port).sync().channel();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    public Channel getChannel() {
        return this.channel;
    }

    public State getState() {
        return this.state;
    }
}


cтрока ошибки
PHP:
         client = new Client();
 
@alexandrage Смотри, твой плагин при входе/выходе изменяет значения меню на серверах, когда вызывается метод reload. А я пытаюсь сделать на прямую. Вызываю метод получить онлайн и метод вернул онлайн с серверов, без reload.
 
@alexandrage Или сделать мапу где я буду временно хронить(пока игрок онлайн) его данные а когда выходит загружать новые данные на СЕРВЕР.
 
@alexandrage Смотри, твой плагин при входе/выходе изменяет значения меню на серверах, когда вызывается метод reload. А я пытаюсь сделать на прямую. Вызываю метод получить онлайн и метод вернул онлайн с серверов, без reload.
Ну так и делай напрямую. Что тебе мешает?
 
Назад
Верх