Хостинг серверов Minecraft playvds.com
  1. Вы находитесь в русском сообществе Bukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на русский язык плагины наших собратьев из других стран.
    Скрыть объявление

Помогите BungeeCord API и потоки

Тема в разделе "Разработка плагинов для новичков", создана пользователем Creeplays, 5 фев 2016.

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

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

    Баллы:
    68
    Добрый день! Начал кодить на Java лишь недавно, так что извините если это сильно нубский вопрос.
    Имею следующий код:
    Код:
    private class updateAllWorker implements Runnable {
    public void run() {
    for (ServerInfo info : ProxyServer.getInstance().getServers().values()) {
    executeQuery(String.format("INSERT INTO servers (name, curplayers) VALUES('%1$s', '%2$d') ON DUPLICATE KEY UPDATE name='%1$s', curplayers='%2$d'",info.getName(),info.getPlayers().size()));
    }
    }
    updateAllWorkerFinished=true;
    }
    
    private void updateAll(){
    updateAllWorker updateAllRunnable = new updateAllWorker();
    Thread updateAllThread = new Thread(updateAllRunnable);
    updateAllThread.start();
    }
    
    Функция updateAll вызывается раз в десять секунд при условии что в состоянии серверов произошли изменения (Игрок вошёл/вышел/перешёл на другой сервер) и updateAllWorkerFinished==true.

    Но данный код порождает пока не понятное для меня предупреждение:
    Код:
    15:50:59 [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(Unknown Source)
      at java.lang.Thread.init(Unknown Source)
      at java.lang.Thread.init(Unknown Source)
      at java.lang.Thread.<init>(Unknown Source)
      at main.updateAll(main.java:58)
      at main.access$000(main.java:13)
      at main$updateAllTimerTask.run(main.java:44)
      at java.util.TimerThread.mainLoop(Unknown Source)
      at java.util.TimerThread.run(Unknown Source)
    
    Как я понял, при написании плагинов под Bungee нужно использовать какой то другой метод для создания потоков, либо отказаться от них вообще.
    Буду благодарен, если вы подскажете что я делаю не так)
     
  2. Хостинг MineCraft
    <
  3. Freeos

    Freeos Участник Пользователь

    Баллы:
    36
    Имя в Minecraft:
    freeos
    Как я знаю, взаимодействие с Bukkit только с основного потока, то есть другие потоки, которые ты создашь, не смогут взаимодействовать с твоим сервером (будут ошибки). Возможно так же и для Bungee.
     
  4. Автор темы
    Creeplays

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

    Баллы:
    68
    Отдельный поток я использую только для записи в бд, дабы не блочить основной
     
  5. Freeos

    Freeos Участник Пользователь

    Баллы:
    36
    Имя в Minecraft:
    freeos
    Я знаю. Но ты вызываешь цикл, в котором используется информация с Bungee, то есть ServerInfo, а именно ProxyServer.getInstance().getServers().values();
     
  6. Автор темы
    Creeplays

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

    Баллы:
    68
    А какие есть другие варианты? Консоль захламлённая варнингами и стэктрэйсами выглядит не очень хорошо, а использовать запись в бд в основном потоке невозможно из за зависания сервера при записи.
     
  7. Den_Abr

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

    Баллы:
    173
    Skype:
    Den_Abr
    Имя в Minecraft:
    Den_Abr
    В BungeeCord нельзя порождать потоки способами, отличными от встроенных в него. Используйте шедулер.
     
  8. Автор темы
    Creeplays

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

    Баллы:
    68
    Спасибо, разобрался.
    Снимок.PNG
    Можно ещё пару вопросов?)
    1. Возможно ли менять порядок элементов в Scoreboard?
    (Без использования чисел справа, они нужны для отображения информации)
    2. Какая кодировка используется в Minecraft для отображения Scoreboardов?
    В бд данные записаны в cp1251, на сервере получаю данные, перекодирую в utf-8 и получаю вопросительные знаки (видно на скриншоте).[DOUBLEPOST=1454966531,1454965122][/DOUBLEPOST]Разобрался с данными из бд, но столкнулся с другой проблемой.
    Снимок.PNG
    Снимок.PNG
    Название таблицы задаю так:
    server.setDisplayName(ChatColor.DARK_PURPLE + "F6CF: " + ChatColor.RED + "Сервера");
    task.setDisplayName(ChatColor.DARK_PURPLE + "F6CF: " + ChatColor.BLUE + "Задачи");
    Но отображаются вопросительные знаки... Какая же кодировка?
     
  9. Den_Abr

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

    Баллы:
    173
    Skype:
    Den_Abr
    Имя в Minecraft:
    Den_Abr
    Нельзя, по ним и происходит сортировка строк.[DOUBLEPOST=1455102651,1455102600][/DOUBLEPOST]
    А проект в какой кодировке?
     
  10. Reality_SC

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

    Баллы:
    123
    Имя в Minecraft:
    Reality_SC
    Почему бы не хранить данные в БД сразу в uft-8? Гораздо проще использовать везде одну универсальную кодировку.
     
  11. Автор темы
    Creeplays

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

    Баллы:
    68
    UTF-8

    На шиндовс сервере я не смог заставить корректно работать MySQL)
    Проблему с кодировкой решил полным переходом на MongoDB (Новее, быстрее, функциональнее ИМХО + единственная бд которая работает на виндовс без костылей)
     
  12. Reality_SC

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

    Баллы:
    123
    Имя в Minecraft:
    Reality_SC
    У меня есть рабочий MySQL на Server 2012R2, вполне себе работает как следует.
     
  13. Автор темы
    Creeplays

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

    Баллы:
    68
    Ну а я криворукий) Всё равно давно на монго хотел, вот и причина перехода появилась)
     
  14. Reality_SC

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

    Баллы:
    123
    Имя в Minecraft:
    Reality_SC
    Главное чтобы результат тебя устраивал, а остальное в общем-то неважно ))
    Так это, а что сейчас не получается в итоге?
     
  15. Автор темы
    Creeplays

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

    Баллы:
    68
    Всё получилось, спасибо всем!
     

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