Войти или зарегистрироваться
  • Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.

Помогите BungeeCord правильный player.connect

Статус
Закрыто для дальнейших ответов.

InterVi

Старожил
Пользователь
Баллы
173
Имя в Minecraft
InterVi
Если я делаю player.connect(server) из PostLoginEvent все проходит как надо. Но когда я пытаюсь сделать тоже самое из параллельного потока, начинается шаманство... тот же самый player.connect(server) выдает краш NullPointerException (при том что player != null), если же кидать PluginMessageEvent и коннектить из него - просто ничего не происходит.

Как правильно перебрасывать игрока на другой сервер не из основного потока?
 
Попробуй в другом потоке player.connect выполнить в шедулере
 
Попробуй в другом потоке player.connect выполнить в шедулере
В таймере проверяется БД MySQL, если в таблице есть ники - телепортирует. Оттуда запускал Runnable через main.getProxy().getScheduler().runAsync(main, new Tp(player)), результат - игрок не телепортируется, в консоли пусто. С schedule тот же результат был, правда не помню с крашем или нет.
 
В таймере проверяется БД MySQL, если в таблице есть ники - телепортирует. Оттуда запускал Runnable через main.getProxy().getScheduler().runAsync(main, new Tp(player)), результат - игрок не телепортируется, в консоли пусто. С schedule тот же результат был, правда не помню с крашем или нет.
Так нужен не асинхронный, а как раз синхронный.
 
Эвенты не имеют такого понятия как синхронность, откуда кидаешь, оттуда и вызывается.
Просто что-то не так с твоим кодом. Ну или EventLoop netty наебнулся, но это врядли.

Показывай код, показывай ошибку, а то хрустальный шар продать пришлось, кризис на дворе.
 
вот тот класс
Код:
import java.util.Timer;
import java.util.TimerTask;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

//import net.md_5.bungee.api.config.ServerInfo;
import net.md_5.bungee.api.connection.ProxiedPlayer;
import net.md_5.bungee.api.plugin.Listener;
//import net.md_5.bungee.api.chat.BaseComponent;

public class SQL implements Listener {
    private Main main;
  
    private static Connection con;
    private static Statement stmt;
    private static ResultSet rs;
  
    private Timer timer;
  
    SQL (Main m) {
        main = m;
      
        try {
            Class.forName("com.mysql.jdbc.Driver");
        } catch (Exception e) {e.printStackTrace();}
        if (!main.config.firststart) connect();
        startTimer();
    }
  
    public void connect() { //подключение БД
        String url = "jdbc:mysql://" + main.config.host + ":" + main.config.port + "/" + main.config.base;
        String query = "select count(*) from " + main.config.table;
        try {
            con = DriverManager.getConnection(url, main.config.user, main.config.pass);
            stmt = con.createStatement();
            rs = stmt.executeQuery(query);
            try {
                while (rs.next()) {
                    int count = 0; count = rs.getInt(1);
                    System.out.println("[BotNagibatorBungee] Строк в таблице: " + String.valueOf(count));
                }
            } catch (Exception e) {e.printStackTrace();}
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {con.close();} catch(SQLException e) {}
            try {stmt.close();} catch(SQLException e) {}
            try {rs.close();} catch(SQLException e) {}
        }
    }
  
    public void startTimer() { //старт таймера
        timer = new Timer();
        timer.schedule(new TP(), main.config.tpintms, main.config.tpintms);
    }
  
    public void stopTimer() { //стоп таймера
        try {
            timer.cancel();
        } catch (Exception e) {e.printStackTrace();}
    }
  
    private class TP extends TimerTask {
        @Override
        public void run() {
            String url = "jdbc:mysql://" + main.config.host + ":" + main.config.port + "/" + main.config.base;
            String query = "select name from " + main.config.table;
            try {
                con = DriverManager.getConnection(url, main.config.user, main.config.pass);
                stmt = con.createStatement();
                rs = stmt.executeQuery(query);
                try {
                    while (rs.next()) { //обработка накопившихся телепортаций
                        String name = rs.getString(1);
                        ProxiedPlayer player = main.getProxy().getPlayer(name);
                        if (player != null) {
                            System.out.println("переброс " + name + " на основной сервер");
                            //player.connect(main.map.get(main.config.main));
                          
                            main.getProxy().getScheduler().runAsync(main, new Tp(player));
                          
                            /*
                            try {
                                String data = "BNBTeleport;" + player.getName();
                                main.tp.add(player.getName()); //костыль :(
                                //перебрасываем игрока с помощью создание ивента
                                main.getProxy().getScheduler().runAsync(main, new SendPluginMessage("BotNagibatorBungee", player.getServer().getInfo(), data));
                            } catch (NullPointerException e) {e.printStackTrace(); continue;} catch (Exception e) {e.printStackTrace(); continue;}
                            */
                          
                            /*
                            try {
                                player.disconnect("test");
                                player.connect(main.map.get(main.config.main));
                            } catch (Exception e) {e.printStackTrace();}
                            */
                            if (main.config.addwhitelist) main.events.whitelist.add(player.getAddress().getAddress().getAddress());
                        }
                    }
                } catch (Exception e) {e.printStackTrace();}
                query = "DELETE FROM " + main.config.table;
                stmt.executeUpdate(query);
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                try {con.close();} catch(SQLException e) {}
                try {stmt.close();} catch(SQLException e) {}
                try {rs.close();} catch(SQLException e) {}
            }
        }
    }
  
    /*
    public class SendPluginMessage implements Runnable {
        private final String channel;
        private final String data;
        private final ServerInfo server;
          
        public SendPluginMessage(String channel, ServerInfo server, String data) { //создаем ивент
            this.channel = channel;
            this.data = data;
            this.server = server;
        }

        public void run() {
            server.sendData(channel, data.getBytes());
        }
    }
    */
  
    private class Tp implements Runnable {
        private ProxiedPlayer player;
      
        public Tp (ProxiedPlayer p) {
            player = p;
        }
      
        @Override
        public void run() {
            player.connect(main.map.get(main.config.main));
        }
    }
}
alex@Hard:~$ /home/alex/servers/bungee/start.sh
OpenJDK 64-Bit Server VM warning: ignoring option MaxPermSize=128M; support was removed in 8.0
OpenJDK 64-Bit Server VM warning: ignoring option UseStringCache; support was removed in 8.0
OpenJDK 64-Bit Server VM warning: Using incremental CMS is deprecated and will likely be removed in a future release
20:49:42 [INFO] Using OpenSSL based native cipher.
20:49:42 [INFO] Using native code compressor
20:49:42 [INFO] Enabled BungeeCord version git:BungeeCord-Bootstrap:1.8-SNAPSHOT:"bd07be8":1079
20:49:42 [INFO] Discovered module: ModuleSpec(name=cmd_alert, file=modules/cmd_alert.jar, provider=JenkinsModuleSource())
20:49:42 [INFO] Discovered module: ModuleSpec(name=cmd_find, file=modules/cmd_find.jar, provider=JenkinsModuleSource())
20:49:42 [INFO] Discovered module: ModuleSpec(name=cmd_list, file=modules/cmd_list.jar, provider=JenkinsModuleSource())
20:49:42 [INFO] Discovered module: ModuleSpec(name=cmd_send, file=modules/cmd_send.jar, provider=JenkinsModuleSource())
20:49:42 [INFO] Discovered module: ModuleSpec(name=cmd_server, file=modules/cmd_server.jar, provider=JenkinsModuleSource())
20:49:42 [INFO] Discovered module: ModuleSpec(name=reconnect_yaml, file=modules/reconnect_yaml.jar, provider=JenkinsModuleSource())
20:49:42 [INFO] Loaded plugin reconnect_yaml version git:reconnect_yaml:1.8-SNAPSHOT:"bd07be8":1079 by SpigotMC
20:49:42 [INFO] Loaded plugin cmd_find version git:cmd_find:1.8-SNAPSHOT:"bd07be8":1079 by SpigotMC
20:49:42 [INFO] Loaded plugin cmd_server version git:cmd_server:1.8-SNAPSHOT:"bd07be8":1079 by SpigotMC
20:49:42 [INFO] Loaded plugin cmd_alert version git:cmd_alert:1.8-SNAPSHOT:"bd07be8":1079 by SpigotMC
20:49:43 [INFO] [BotNagibatorBungee] Строк в таблице: 0
20:49:43 [WARNING] Plugin performed restricted action, please inform them to use proper API methods: Illegal thread group access
java.security.AccessControlException: Plugin violation: Illegal thread group access
at net.md_5.bungee.BungeeSecurityManager.checkRestricted(BungeeSecurityManager.java:39)
at net.md_5.bungee.BungeeSecurityManager.checkAccess(BungeeSecurityManager.java:62)
at java.lang.ThreadGroup.checkAccess(ThreadGroup.java:315)
at java.lang.Thread.init(Thread.java:391)
at java.lang.Thread.init(Thread.java:349)
at java.lang.Thread.<init>(Thread.java:445)
at java.util.TimerThread.<init>(Timer.java:499)
at java.util.Timer.<init>(Timer.java:101)
at java.util.Timer.<init>(Timer.java:132)
at ru.intervi.botnagibatorbungee.SQL.startTimer(SQL.java:58)
at ru.intervi.botnagibatorbungee.SQL.<init>(SQL.java:32)
at ru.intervi.botnagibatorbungee.Events.<init>(Events.java:22)
at ru.intervi.botnagibatorbungee.Main.<init>(Main.java:17)
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:422)
at net.md_5.bungee.api.plugin.PluginManager.enablePlugin(PluginManager.java:298)
at net.md_5.bungee.api.plugin.PluginManager.loadPlugins(PluginManager.java:205)
at net.md_5.bungee.BungeeCord.start(BungeeCord.java:247)
at net.md_5.bungee.BungeeCordLauncher.main(BungeeCordLauncher.java:54)
at net.md_5.bungee.Bootstrap.main(Bootstrap.java:15)
20:49:43 [INFO] Loaded plugin BotNagibatorBungee version 0.1 by InterVi
20:49:43 [INFO] Loaded plugin cmd_send version git:cmd_send:1.8-SNAPSHOT:"bd07be8":1079 by SpigotMC
20:49:43 [INFO] Loaded plugin cmd_list version git:cmd_list:1.8-SNAPSHOT:"bd07be8":1079 by SpigotMC
20:49:43 [WARNING] Forced host server pvp is not defined
20:49:43 [INFO] Enabled plugin reconnect_yaml version git:reconnect_yaml:1.8-SNAPSHOT:"bd07be8":1079 by SpigotMC
20:49:43 [INFO] Enabled plugin cmd_find version git:cmd_find:1.8-SNAPSHOT:"bd07be8":1079 by SpigotMC
20:49:43 [INFO] Enabled plugin cmd_server version git:cmd_server:1.8-SNAPSHOT:"bd07be8":1079 by SpigotMC
20:49:43 [INFO] Enabled plugin cmd_alert version git:cmd_alert:1.8-SNAPSHOT:"bd07be8":1079 by SpigotMC
20:49:43 [WARNING] Plugin performed restricted action, please inform them to use proper API methods: Illegal thread group access
java.security.AccessControlException: Plugin violation: Illegal thread group access
at net.md_5.bungee.BungeeSecurityManager.checkRestricted(BungeeSecurityManager.java:39)
at net.md_5.bungee.BungeeSecurityManager.checkAccess(BungeeSecurityManager.java:62)
at java.lang.ThreadGroup.checkAccess(ThreadGroup.java:315)
at java.lang.Thread.init(Thread.java:391)
at java.lang.Thread.init(Thread.java:349)
at java.lang.Thread.<init>(Thread.java:445)
at java.util.TimerThread.<init>(Timer.java:499)
at java.util.Timer.<init>(Timer.java:101)
at java.util.Timer.<init>(Timer.java:132)
at ru.intervi.botnagibatorbungee.SQL.startTimer(SQL.java:58)
at ru.intervi.botnagibatorbungee.Main.onEnable(Main.java:25)
at net.md_5.bungee.api.plugin.PluginManager.enablePlugins(PluginManager.java:220)
at net.md_5.bungee.BungeeCord.start(BungeeCord.java:256)
at net.md_5.bungee.BungeeCordLauncher.main(BungeeCordLauncher.java:54)
at net.md_5.bungee.Bootstrap.main(Bootstrap.java:15)
20:49:43 [INFO] [BotNagibatorBungee] ---> Created by InterVi <---
20:49:43 [INFO] Enabled plugin BotNagibatorBungee version 0.1 by InterVi
20:49:43 [INFO] Enabled plugin cmd_send version git:cmd_send:1.8-SNAPSHOT:"bd07be8":1079 by SpigotMC
20:49:43 [INFO] Enabled plugin cmd_list version git:cmd_list:1.8-SNAPSHOT:"bd07be8":1079 by SpigotMC
20:49:43 [INFO] Listening on /127.0.0.1:25565
20:49:43 [INFO] Started query on /127.0.0.1:25565
20:52:26 [INFO] [/127.0.0.1:50181] <-> InitialHandler has connected
20:52:27 [INFO] [InterVi] <-> InitialHandler has connected
20:52:27 [INFO] [InterVi] <-> ServerConnector [Filter] has connected
20:52:30 [INFO] переброс InterVi на основной сервер
20:52:30 [SEVERE] Task BungeeTask(sched=net.md_5.bungee.scheduler.BungeeScheduler@704d4386, id=0, owner=ru.intervi.botnagibatorbungee.Main@2118cddf, task=ru.intervi.botnagibatorbungee.SQL$Tp@58bdcecf, delay=0, period=0, running=true) encountered an exception
java.lang.NullPointerException: info
at com.google.common.base.Preconditions.checkNotNull(Preconditions.java:226)
at net.md_5.bungee.UserConnection.connect(UserConnection.java:222)
at net.md_5.bungee.UserConnection.connect(UserConnection.java:204)
at net.md_5.bungee.UserConnection.connect(UserConnection.java:198)
at ru.intervi.botnagibatorbungee.SQL$Tp.run(SQL.java:145)
at net.md_5.bungee.scheduler.BungeeTask.run(BungeeTask.java:63)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
20:52:45 [INFO] [InterVi] -> UpstreamBridge has disconnected
20:52:45 [INFO] [InterVi] disconnected with: [Proxy] Lost connection to server.
20:52:45 [INFO] [InterVi] <-> DownstreamBridge <-> [Filter] has disconnected
20:52:47 [INFO] [/127.0.0.1:50276] <-> InitialHandler has connected
20:52:50 [INFO] [/127.0.0.1:50295] <-> InitialHandler has connected
>end
20:53:00 [INFO] Closing listener [id: 0xf9ff6e9b, /127.0.0.1:25565]
20:53:00 [INFO] Closing listener [id: 0x4a1da3a7, /127.0.0.1:25565]
20:53:00 [INFO] Closing pending connections
20:53:00 [INFO] Disconnecting 0 connections
20:53:00 [INFO] Closing IO threads
20:53:02 [INFO] Saving reconnect locations
20:53:02 [INFO] Disabling plugins
20:53:02 [SEVERE] java.lang.NullPointerException
20:53:02 [SEVERE] at ru.intervi.botnagibatorbungee.Events.stopTimer(Events.java:82)
20:53:02 [SEVERE] at ru.intervi.botnagibatorbungee.Main.onDisable(Main.java:33)
20:53:02 [SEVERE] at net.md_5.bungee.BungeeCord$4.run(BungeeCord.java:399)
20:53:02 [INFO] Thank you and goodbye
//просьба не бомбить, я только учусь джаве
 
Очевидно что проблема тут
player.disconnect("test");
player.connect(main.map.get(main.config.main));
Во первых ты сначала дисконнектишь игрока, зачем?
Ну а дальше main.map.get(main.config.main) возвращает null, вот и всё.
 
Очевидно что проблема тут
player.disconnect("test");
player.connect(main.map.get(main.config.main));
Во первых ты сначала дисконнектишь игрока, зачем?
Ну а дальше main.map.get(main.config.main) возвращает null, вот и всё.
Та часть закомментирована же, эксперименты были. Сейчас нижний класс вызывается шедулером.
 
Та часть закомментирована же, эксперименты были. Сейчас нижний класс вызывается шедулером.
Это не меняет того факта что даже там есть эта строчка
main.map.get(main.config.main)
Вот она возвращает null.
 
:creeper::creeper::creeper::creeper::creeper::creeper: я в конфигах перепутал Main и Mine, естественно был null, ведь такого сервера нет в списке
вместо таймеров сделал все через шедулеры, чтобы не крашилось
всем спасибо за ответы
 
Статус
Закрыто для дальнейших ответов.

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

Назад
Верх