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

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

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

Статус темы:
Закрыта.
  1. Автор темы
    InterVi

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

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

    Как правильно перебрасывать игрока на другой сервер не из основного потока?
     
  2. Plasticable

    Plasticable Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    plasticable
    Имя в Minecraft:
    Plasticable
    Попробуй в другом потоке player.connect выполнить в шедулере
     
  3. Автор темы
    InterVi

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

    Баллы:
    173
    В таймере проверяется БД MySQL, если в таблице есть ники - телепортирует. Оттуда запускал Runnable через main.getProxy().getScheduler().runAsync(main, new Tp(player)), результат - игрок не телепортируется, в консоли пусто. С schedule тот же результат был, правда не помню с крашем или нет.
     
  4. CraftCoder

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

    Баллы:
    108
    Имя в Minecraft:
    CraftCoderr
    Так нужен не асинхронный, а как раз синхронный.
     
  5. Автор темы
    InterVi

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

    Баллы:
    173
    Какой синхронный то? Я все шедулеры пробовал. И ивент вызывал, он же синхронный должен быть.
     
  6. Shevchik

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

    Баллы:
    173
    Имя в Minecraft:
    _Shevchik_
    Эвенты не имеют такого понятия как синхронность, откуда кидаешь, оттуда и вызывается.
    Просто что-то не так с твоим кодом. Ну или EventLoop netty наебнулся, но это врядли.

    Показывай код, показывай ошибку, а то хрустальный шар продать пришлось, кризис на дворе.
     
  7. Автор темы
    InterVi

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

    Баллы:
    173
    вот тот класс
    Код:
    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
    //просьба не бомбить, я только учусь джаве
     
  8. Shevchik

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

    Баллы:
    173
    Имя в Minecraft:
    _Shevchik_
    Очевидно что проблема тут
    player.disconnect("test");
    player.connect(main.map.get(main.config.main));
    Во первых ты сначала дисконнектишь игрока, зачем?
    Ну а дальше main.map.get(main.config.main) возвращает null, вот и всё.
     
  9. Den_Abr

    Den_Abr Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    Den_Abr
    Имя в Minecraft:
    Den_Abr
    Это наиболее прввильно. disconnect делать не нужно
     
  10. Автор темы
    InterVi

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

    Баллы:
    173
    Та часть закомментирована же, эксперименты были. Сейчас нижний класс вызывается шедулером.
     
  11. Shevchik

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

    Баллы:
    173
    Имя в Minecraft:
    _Shevchik_
    Это не меняет того факта что даже там есть эта строчка
    main.map.get(main.config.main)
    Вот она возвращает null.
     
  12. Автор темы
    InterVi

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

    Баллы:
    173
    :creeper::creeper::creeper::creeper::creeper::creeper: я в конфигах перепутал Main и Mine, естественно был null, ведь такого сервера нет в списке
    вместо таймеров сделал все через шедулеры, чтобы не крашилось
    всем спасибо за ответы
     
Статус темы:
Закрыта.

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