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

EnderBro3D

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

Ошибок в консоль не выдаёт.
Java:
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());
    }
}
Java:
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.
Пожалуйста помогите.
 
Последнее редактирование:
Если отправляешь сразу при заходе игрока, то отправляй с задержкой 5-10 тиков
 
Назад
Верх