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

Помогите Данные с Spigot на Bungeecord не отправляются

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

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

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

    Баллы:
    76
    Имя в Minecraft:
    EnderBro3D
    Каналы зарегистрированы, названия: ShadowOut (из Spigot) и ShadowReturn (из BungeeCord)
    BungeeCord:
    Код:
              BungeeCord.getInstance().registerChannel("ShadowReturn");
                BungeeCord.getInstance().registerChannel("ShadowOut");
    Spigot:
    Код:
            Bukkit.getMessenger().registerOutgoingPluginChannel(this, "ShadowOut");
            Bukkit.getMessenger().registerIncomingPluginChannel(this, "ShadowReturn", pcl = new PluginChannelListener());

    Ошибок в консоль не выдаёт.
    Код:
    
    package mc.ShadowMine.api;
    
    import org.apache.commons.lang3.ArrayUtils;
    import org.bukkit.entity.Player;
    import org.bukkit.plugin.messaging.PluginMessageListener;
    
    import java.io.*;
    import java.util.HashMap;
    
    public class PluginChannelListener implements PluginMessageListener {
    
        private HashMap<Player, String[]> s = new HashMap<>();
    
        public void flush(Player p) {
            s.remove(p);
        }
    
        public String[] read(Player p) {
            return s.get(p);
        }
    
        public void add(Player p, String val) {
            if(!s.containsKey(p)) {
                s.put(p, new String[]{val});
                return;
            }
            s.put(p, ArrayUtils.add(s.get(p), val));
        }
    
        @Override
        public synchronized void onPluginMessageReceived(String channel, Player player, byte[] message) {
            DataInputStream in = new DataInputStream(new ByteArrayInputStream(message));
            try {
                String subchannel = in.readUTF();
    
                Log.get().debug("[PluginChannelListener] Мы получили данные " + subchannel + ":" + channel);
    
                if(subchannel.equals("get")){
                    String input = in.readUTF();
                    add(player, input);
                    notifyAll();
                }
            } catch (IOException e) {
                Log.get().fatal("Произошла ошибка во время чтения данных", e);
            }
        }
    
        public synchronized void set(Player p, Typeable t, String value) {
            Log.get().debug("[PluginChannelListener] Устанавливаем " + t.getName());
    
            send(p, "set", t.getName(), value);
        }
    
        public synchronized String get(Player p, Typeable t) {
            flush(p);
    
            Log.get().debug("[PluginChannelListener] Получаем данные " + t.getName());
            send(p, "get", t.getName());
            try {
                wait();
            } catch(InterruptedException e){}
    
            return read(p)[0];
        }
    
        private void send(Player p, String channel, String... sub){
            ByteArrayOutputStream b = new ByteArrayOutputStream();
            DataOutputStream out = new DataOutputStream(b);
            try {
                out.writeUTF(channel);
                for(String s:sub) out.writeUTF(s);
            } catch (IOException e) {
                e.printStackTrace();
            }
            p.sendPluginMessage(ShadowMinePlugin.getInstance(), "ShadowOut", b.toByteArray());
        }
    }
    
    Код:
    package mc.ShadowMine.bungee;
    
    
    import mc.ShadowMine.bungee.api.OfflineData;
    import mc.ShadowMine.bungee.api.donate.Donate;
    import mc.ShadowMine.bungee.api.economy.Money;
    import mc.ShadowMine.bungee.api.economy.Multiply;
    import mc.ShadowMine.bungee.api.leveling.Exp;
    import mc.ShadowMine.bungee.api.leveling.Level;
    import net.md_5.bungee.BungeeCord;
    import net.md_5.bungee.api.config.ServerInfo;
    import net.md_5.bungee.api.connection.Connection;
    import net.md_5.bungee.api.connection.ProxiedPlayer;
    import net.md_5.bungee.api.event.PlayerDisconnectEvent;
    import net.md_5.bungee.api.event.PluginMessageEvent;
    import net.md_5.bungee.api.event.PostLoginEvent;
    import net.md_5.bungee.api.plugin.Listener;
    import net.md_5.bungee.event.EventHandler;
    
    import java.io.*;
    import java.net.InetSocketAddress;
    
    /////////////////////////
    // Автор ender
    // Дата 04/08/17
    ////////////////////////
    public class EventListener implements Listener {
    
        private ShadowMinePlugin plugin;
    
        public EventListener(ShadowMinePlugin plugin) {
            this.plugin = plugin;
        }
    
        @EventHandler
        public void on(PostLoginEvent e) {
            ProxiedPlayer p = e.getPlayer();
            OfflineData d = OfflineData.getData(p.getUniqueId());
            d.update(p);
            plugin.getLogger().info("[uuid: " + d.getUniqueId() + ", address: " + d.getAddress() + ", name: " + d.getName() + "] Подключился.");
        }
    
        @EventHandler
        public void on(PluginMessageEvent event) {
            Log.get().debug(event.getTag());
            if(!event.getTag().equalsIgnoreCase("ShadowOut")) return;
    
            DataInputStream in = new DataInputStream(new ByteArrayInputStream(event.getData()));
            try {
                String channel = in.readUTF();
                Connection r = event.getReceiver();
                ProxiedPlayer player = BungeeCord.getInstance().getPlayer(r.toString());
                String input = in.readUTF(); // the inputstring
    
                Log.get().debug("[EventListener] Мы получили данные " + r + ":" + channel + ":" + input);
    
    
                OfflineData d = OfflineData.getData(r.toString());
                Level lvl = Level.getLevel(d);
                Money m = Money.getMoney(d);
                Exp e = Exp.getExp(d);
                Donate don = Donate.getDonate(d);
                Multiply mu = Multiply.getMultiply(d);
                switch (input.toLowerCase()) {
                    case "level":
                        switch (channel) {
                            case "get":
                                send(channel, String.valueOf(lvl.getLevel()), player);
                            case "set":
                                lvl.setLevel(Integer.parseInt(in.readUTF()));
                            default:
                                break;
                        }
                        break;
                    case "offline":
                        switch (channel) {
                            case "get":
                                send(channel, d.getName() + ":" + d.getAddress() + ":" + d.getUniqueId(), player);
                            case "set":
                                lvl.setLevel(Integer.parseInt(in.readUTF()));
                            default:
                                break;
                        }
                        break;
                    case "multiply":
                        switch (channel) {
                            case "get":
                                send(channel, String.valueOf(mu.getMultiply()), player);
                            case "set":
                                lvl.setLevel(Integer.parseInt(in.readUTF()));
                            default:
                                break;
                        }
                        break;
                    case "money":
                        switch (channel) {
                            case "get":
                                send(channel, String.valueOf(m.getMoney()), player);
                            case "set":
                                lvl.setLevel(Integer.parseInt(in.readUTF()));
                            default:
                                break;
                        }
                        break;
                    case "exp":
                        switch (channel) {
                            case "get":
                                send(channel, String.valueOf(e.getExp()), player);
                            case "set":
                                lvl.setLevel(Integer.parseInt(in.readUTF()));
                            default:
                                break;
                        }
                        break;
                    case "donate":
                        switch (channel) {
                            case "get":
                                send(channel, don.getGroup(), player);
                            case "set":
                                lvl.setLevel(Integer.parseInt(in.readUTF()));
                            default:
                                break;
                        }
                        break;
                    default:
                        InetSocketAddress addr = r.getAddress();
                        Log.get().info("[" + addr.getAddress().getHostAddress() + ":" + addr.getPort() + "] Не удалось найти тип данных: " + input);
                        break;
                }
            } catch (IOException ex) {
                Log.get().error("Произошла ошибка во время чтения", ex);
            }
        }
    
        private void send(String channel, String message, ProxiedPlayer p) {
            ByteArrayOutputStream stream = new ByteArrayOutputStream();
            DataOutputStream out = new DataOutputStream(stream);
            try {
                out.writeUTF(channel);
                out.writeUTF(message);
            } catch (IOException e) {
                e.printStackTrace();
            }
            p.sendData("ShadowReturn", stream.toByteArray());
    
        }
    }
    

    Делал почти всё из: https://www.spigotmc.org/threads/tutorial-advanced-plugin-messaging-spigot-bungeecord.53440/

    В консоль (bungeecord) пишет только:
    Снимок.PNG
    а должно писаться и ShadowOut.
    Пожалуйста помогите.
     
    Последнее редактирование: 10 авг 2017
  2. slavik123123123

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

    Баллы:
    143
    Имя в Minecraft:
    Leymooo
    Если отправляешь сразу при заходе игрока, то отправляй с задержкой 5-10 тиков
     
  3. Автор темы
    EnderBro3D

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

    Баллы:
    76
    Имя в Minecraft:
    EnderBro3D
    Попытаюсь, спасибо

    UPD: А сойдёт ли PlayerJoinEvent с приоритетом Highest?
     
  4. slavik123123123

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

    Баллы:
    143
    Имя в Minecraft:
    Leymooo
    нет. нужно именно с задержкой отправлять
     
  5. slavik123123123

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

    Баллы:
    143
    Имя в Minecraft:
    Leymooo
  6. Автор темы
    EnderBro3D

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

    Баллы:
    76
    Имя в Minecraft:
    EnderBro3D

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