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

Очередь загрузки плагинов.

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

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

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

    Баллы:
    66
    Здравствуйте, у меня самописный плагин на открытие небольшой менюшки при заходе на сервер, все что задумывал работает ,только вот встала проблема, я использую @EventHandler "join" (как именно смотрите в коде ниже) и у меня выскакивает ошибка что удаленный хост разорвал соединение , методом подбора длительности таймера я понял что "менюшка" запускаеться самая первая а потом уже игрок появляеться в мире.Узнал я это заметив закономерность что если я ставлю таймер на 30 секунд то мир грузиться 30 секунд, ставлю 8 секунд и загрузка тоже 8 секунд. Вообщем нужна помощь как сделать так чтоб менюшка открывалась после появления игрока?
    Код:
    
    public class GUI implements Listener{
       @EventHandler
       public void join (PlayerJoinEvent j){
         Player p = (Player) j.getPlayer();
         GUI.openGUI(p);
       }
    
       public static void openGUI(Player p){
         Inventory inv = Bukkit.createInventory(null, 9, "Начальное меню");
         
         inv.setItem(0, ItemUtils.create(Material.REDSTONE_BLOCK, "Обнулить счет"));
         inv.setItem(1, ItemUtils.create(Material.LAPIS_BLOCK, "Получить креатив"));
         
         inv.setItem(8, ItemUtils.create(Material.WOOD_DOOR, ChatColor.RED + "Выход"));
         
         p.openInventory(inv);
       }
       
       @EventHandler
       public void onInventoryClick (InventoryClickEvent e){
         Player p = (Player) e.getWhoClicked();
         
         if (e.getInventory().getName().equalsIgnoreCase("Начальное меню")){
           e.setCancelled(true);
           
           if(e.getCurrentItem().getType() == Material.WOOD_DOOR){
             e.setCancelled(true);
             p.closeInventory();
           } else if (e.getCurrentItem().getType() == Material.REDSTONE_BLOCK){
             double allm = Main.econ.getBalance(p);
             Main.econ.withdrawPlayer(p, allm);
             
             e.setCancelled(true);
             p.sendMessage("Выш счет обнулен");
             p.closeInventory();
           } else if (e.getCurrentItem().getType() == Material.LAPIS_BLOCK){
             e.setCancelled(true);
             if(p.getGameMode() != GameMode.CREATIVE){
               p.setGameMode(GameMode.CREATIVE);
               p.sendMessage("Вы получили Креатив");
             } else { p.sendMessage("У вас уже есть Креатив");}
             p.closeInventory();
           }
         }
       }
    }
    
    код таймера :

    Код:
    int i =1;
    int b =0;
    while(i<61)
    {
    System.out.println("Количество секунд: "+ i);
    Thread.sleep(1000);
    i++;
    }
    if (i >= 60) {
    Player p = (Player) j.getPlayer();
    GUI.openGUI(p);
    }
    
     
  2. Хостинг MineCraft
    <
  3. Fenix78563

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

    Баллы:
    76
    Имя в Minecraft:
    Blc_Dragon
    используйте BukkitRunnable и все.

    Ибо метод sleep останавливает отправку ВСЕХ пакетов -> пока у вас идет таймер, сервер по сути парализован
     
  4. Qmaks

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

    Баллы:
    173
    Имя в Minecraft:
    Qmaks
    Мультипоточность, погугли
     
  5. alexandrage

    alexandrage Администратор

    Баллы:
    173
    Skype:
    alexandr0116
    1)
    Код:
    public class Scheduler extends BukkitRunnable {
    
        Player p;
    
        Scheduler(Player p) {
            this.p = p;
        }
    
        @Override
        public void run() {
             Inventory inv = Bukkit.createInventory(null, 9, "Начальное меню");
             inv.setItem(0, ItemUtils.create(Material.REDSTONE_BLOCK, "Обнулить счет"));
             inv.setItem(1, ItemUtils.create(Material.LAPIS_BLOCK, "Получить креатив"));
             inv.setItem(8, ItemUtils.create(Material.WOOD_DOOR, ChatColor.RED + "Выход"));
             p.openInventory(inv);
        }
    }
    2)
    Код:
       @EventHandler
       public void join (PlayerJoinEvent j){
            new Scheduler(j.getPlayer()).runTaskLater(plugin, 50);
       }
     
  6. Dymeth

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

    Баллы:
    76
    Не всех, а только текущего. А сервер "парализован", потому что по-умолчанию плагины работают в основном серверном потоке. Так, например, чат продолжит стабильно работать (ибо он обрабатывается в отдельном потоке)...
    А BukkitScheduler не усыпляет поток, а лишь пропускает нужное количество тиков (до выполнения Runnable)...
     
  7. Автор темы
    AlexMor

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

    Баллы:
    66
    что из себя представляет переменная plugin? plugin = this?
     
  8. AtomicInteger

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

    Баллы:
    46
    Это ссылка на главный класс плагина.
     
  9. Qmaks

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

    Баллы:
    173
    Имя в Minecraft:
    Qmaks
  10. Автор темы
    AlexMor

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

    Баллы:
    66
    Ок, спасибо тема закрыта))
     
Статус темы:
Закрыта.

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