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

  • Автор темы Автор темы AlexMor
  • Дата начала Дата начала
Статус
Закрыто для дальнейших ответов.

AlexMor

Активный участник
Пользователь
Баллы
76
Здравствуйте, у меня самописный плагин на открытие небольшой менюшки при заходе на сервер, все что задумывал работает ,только вот встала проблема, я использую @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);
}
 
используйте BukkitRunnable и все.

Ибо метод sleep останавливает отправку ВСЕХ пакетов -> пока у вас идет таймер, сервер по сути парализован
 
Мультипоточность, погугли
 
1)
Java:
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)
Java:
   @EventHandler
   public void join (PlayerJoinEvent j){
        new Scheduler(j.getPlayer()).runTaskLater(plugin, 50);
   }
 
используйте BukkitRunnable и все.

Ибо метод sleep останавливает отправку ВСЕХ пакетов -> пока у вас идет таймер, сервер по сути парализован
Не всех, а только текущего. А сервер "парализован", потому что по-умолчанию плагины работают в основном серверном потоке. Так, например, чат продолжит стабильно работать (ибо он обрабатывается в отдельном потоке)...
А BukkitScheduler не усыпляет поток, а лишь пропускает нужное количество тиков (до выполнения Runnable)...
 
1)
Java:
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)
Java:
   @EventHandler
   public void join (PlayerJoinEvent j){
        new Scheduler(j.getPlayer()).runTaskLater(plugin, 50);
   }
что из себя представляет переменная plugin? plugin = this?
 
Ок, спасибо тема закрыта))
 
Статус
Закрыто для дальнейших ответов.
Назад
Верх