Помогите Изменение data у предмета.

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

iD3LSY

Активный участник
Пользователь
Баллы
76
Привет все <3

Есть вопрос, заключается в изменение типа предмета или его data-тэга. Изменяться должно каждые 0,5 секунды. Как реализовать не догадываюсь, но сам инвентарь заготовленный как пример оставлю ниже.

Код:
Inventory rubukkit = Bukkit.createInventory(null, 27, "2k17"); { 
    rubukkit.setItem(13, new ItemStack(new ItemStack(Material.STAINED_GLASS_PANE, 1, (short)14)));
    // Заменять на ↓
    rubukkit.setItem(13, new ItemStack(new ItemStack(Material.STAINED_GLASS_PANE, 1, (short)5)));
}

Заранее спасибо :)

[PS.; Думал сделать через шедулер, но у меня чёт голова поломалась.]
 
Последнее редактирование:
Привет все <3

Есть вопрос, заключается в изменение типа предмета или его data-тэга. Изменяться должно каждые 0,5 секунды. Как реализовать не догадываюсь, но сам инвентарь заготовленный как пример оставлю ниже.

Код:
Inventory rubukkit = Bukkit.createInventory(null, 27, "2k17"); {
    rubukkit.setItem(13, new ItemStack(new ItemStack(Material.STAINED_GLASS_PANE, 1, (short)14)));
    // Заменять на ↓
    rubukkit.setItem(13, new ItemStack(new ItemStack(Material.STAINED_GLASS_PANE, 1, (short)5)));
}

Заранее спасибо :)

[PS.; Думал сделать через шедулер, но у меня чёт голова поломалась.]
Java:
       final Inventory opened_inv = rubukkit;
        BukkitRunnable tll = new BukkitRunnable() {
            int k = 0;
            @Override
            public void run() {
                if (k%2==0){
                    opened_inv.setItem(13, new ItemStack(new ItemStack(Material.STAINED_GLASS_PANE, 1, (short)14)));
                }else{
                    opened_inv.setItem(13, new ItemStack(new ItemStack(Material.STAINED_GLASS_PANE, 1, (short)5)));
                }
                if (opened_inv!=null/*так же рекомендую добавить проверку по имени*/) {
                    cancel();//отменяем таймер если инвентарь закрыт. если не добавишь проверку по имени, то если инвентарь сменится, то будет моргать уже в новом инвентаре.
                }
                k++;
            }
        };
        tll.runTaskTimer(plugin, 5, 10);
 
Для начала если плагин еще и другие функции выполняет то нужно создать отдельный поток (в этом я не силен, но что знаю скажу)
Код:
new Thread(){
   public void run(){
      try{
         Inventory rubukkit = Bukkit.createInventory(null, 27, "2k17");
         boolean old == true;
         while (true){ //true означает что выполняется всегда и постоянно
                if (old == true){
                      old = false;
                      rubukkit.setItem(13, new ItemStack(new ItemStack(Material.STAINED_GLASS_PANE, 1, (short)14)));
                } else {
                      old = true;
                      rubukkit.setItem(13, new ItemStack(new ItemStack(Material.STAINED_GLASS_PANE, 1, (short)5)));
                }
                Thread.sleep(50); //время в милисекундах , 50 млсек = 0.5 сек
          }
     }catch (Exception ex) {}
}
 
Для начала если плагин еще и другие функции выполняет то нужно создать отдельный поток (в этом я не силен, но что знаю скажу)
Код:
new Thread(){
   public void run(){
      try{
         Inventory rubukkit = Bukkit.createInventory(null, 27, "2k17");
         boolean old == true;
         while (true){ //true означает что выполняется всегда и постоянно
                if (old == true){
                      old = false;
                      rubukkit.setItem(13, new ItemStack(new ItemStack(Material.STAINED_GLASS_PANE, 1, (short)14)));
                } else {
                      old = true;
                      rubukkit.setItem(13, new ItemStack(new ItemStack(Material.STAINED_GLASS_PANE, 1, (short)5)));
                }
                Thread.sleep(50); //время в милисекундах , 50 млсек = 0.5 сек
          }
     }catch (Exception ex) {}
}
а как игрок увидит сей инвентарь?

либо ты открываешь его заново каждые 0,5 секунд(а как тогда с ним работать? а если игроку не нужен этот инвентарь в данный момент?). ну либо ты пилишь какой то костыль, который я не могу придумать. да и вообще за каким куем новый инвентарь создавать. причем каждый раз. мог бы просто два инвентаря создать. все равно ресов меньше пожрало бы (и никуда не делись вопросы по работе\открытию инвентаря).

в общем:
Как говорится, говнокодёрами не рождаются, говнокодёрами становятся...
 
Последнее редактирование:
а как игрок увидит сей инвентарь?

либо ты открываешь его заново каждые 0,5 секунд(а как тогда с ним работать? а если игроку не нужен этот инвентарь в данный момент?). ну либо ты пилишь какой то костыль, который я не могу придумать. да и вообще за каким куем новый инвентарь создавать. причем каждый раз. мог бы просто два инвентаря создать. все равно ресов меньше пожрало бы (и никуда не делись вопросы по работе\открытию инвентаря).

в общем:
Спасибо еще раз, даже если код не будет работать, ибо всё-равно ты потратил время(xd). Сейчас попробую.
 
Открывать инвентарь игроку, после передавать инвентарь в шедулер. В чем проблема?
 
Кратко говоря - не работает, но если захочешь узнать полный мой ответ, то читай ниже.

Сначала у меня была просто ошибка. Нельзя было использовать tll. Плагин думал, что такого BukkitRunnable не существует. Потом я это исправил, методом добавления "{" после создания инвентаря.

Но тут мы замечаем при попытке запуска сервер в консоле
Код:
org.bukkit.plugin.InvalidPluginException: java.lang.IllegalArgumentException: Plugin cannot be null
Это опять-же если в кратко описать краш. Там ошибка будет намного больше. И даже намного больше того, что сейчас ты мог представить.
Открывать инвентарь игроку, после передавать инвентарь в шедулер. В чем проблема?
Наверное проблема в том, что я - "Типичный ноунейм, по совместительству школьник" как написал я в профиле(или шо эт? xd), но помимо того, я еще и "говнокодер".
 
Сначала у меня была просто ошибка. Нельзя было использовать tll. Плагин думал, что такого BukkitRunnable не существует. Потом я это исправил, методом добавления "{" после создания инвентаря.

Но тут мы замечаем при попытке запуска сервер в консоле
Код:
org.bukkit.plugin.InvalidPluginException: java.lang.IllegalArgumentException: Plugin cannot be null
Это опять-же если в кратко описать краш. Там ошибка будет намного больше. И даже намного больше того, что сейчас ты мог представить.

не одуплил куда ты там скобку припаял.

По поводу ошибки: НЕ ЛЕНИТЕСЬ ПЕРВОДИТЬ БЛ***
Plugin cannot be null

значит в первом аргументе запуска таймера ты передал вместо плагина null. либо твоя переменная\поле plugin каким то образом null
Код:
Inventory rubukkit = Bukkit.createInventory(null, 27, "2k17"); {
    rubukkit.setItem(13, new ItemStack(new ItemStack(Material.STAINED_GLASS_PANE, 1, (short)14)));
    // Заменять на ↓
    rubukkit.setItem(13, new ItemStack(new ItemStack(Material.STAINED_GLASS_PANE, 1, (short)5)));
}

кстати за коим х*ем тут скобки фигурные, там где ты заполняешь инвентарь.
или ты создаешь его вне метода (а-та та, надо в методе)
 
не одуплил куда ты там скобку припаял.

По поводу ошибки: НЕ ЛЕНИТЕСЬ ПЕРВОДИТЬ БЛ***
Plugin cannot be null

значит в первом аргументе запуска таймера ты передал вместо плагина null. либо твоя переменная\поле plugin каким то образом null


кстати за коим х*ем тут скобки фигурные, там где ты заполняешь инвентарь.
или ты создаешь его вне метода (а-та та, надо в методе)
На счёт метода - да. А про "Plugin cannot be null" я знаю. Я не знал шо там над фиксануть, ибо как я уже и говорил, я просто говнокодер.
 
вне методов у тебя поля null, так что взял и засунул все это в метод
 
вне методов у тебя поля null, так что взял и засунул все это в метод
Ну вообще-то я не говорил что я тру мастер кодинга, и создавать новый инвентарь для отдельного игрока вполне уместо для новых версий, и сам инвентарь я создаю 1 раз, когда вызывается метод, далее уже просто редактирую его. И если ты хотел видеть готовый рабочий код без изъянов обратись к сашку.
 
Ну вообще-то я не говорил что я тру мастер кодинга, и создавать новый инвентарь для отдельного игрока вполне уместо для новых версий, и сам инвентарь я создаю 1 раз, когда вызывается метод, далее уже просто редактирую его. И если ты хотел видеть готовый рабочий код без изъянов обратись к сашку.
-_-

больше даже добавить нечего. объяснять как это все работает тоже не буду ибо гугл
 
Java:
       final Inventory opened_inv = rubukkit;
        BukkitRunnable tll = new BukkitRunnable() {
            int k = 0;
            @Override
            public void run() {
                if (k%2==0){
                    opened_inv.setItem(13, new ItemStack(new ItemStack(Material.STAINED_GLASS_PANE, 1, (short)14)));
                }else{
                    opened_inv.setItem(13, new ItemStack(new ItemStack(Material.STAINED_GLASS_PANE, 1, (short)5)));
                }
                if (opened_inv!=null/*так же рекомендую добавить проверку по имени*/) {
                    cancel();//отменяем таймер если инвентарь закрыт. если не добавишь проверку по имени, то если инвентарь сменится, то будет моргать уже в новом инвентаре.
                }
                k++;
            }
        };
        tll.runTaskTimer(plugin, 5, 10);
Зачем BukkitRunnable tll? можно runtasktimer напрямую из скобки
 
По-моему, две лишние строки
для человека который в первый раз видит bukkitRunnable это проще (на мой взгляд. и харош придираться к мелочам. тут нет никаких ошибок, а от двух лишних строк кода еще никто не умирал)
 
для человека который в первый раз видит bukkitRunnable это проще (на мой взгляд. и харош придираться к мелочам. тут нет никаких ошибок, а от двух лишних строк кода еще никто не умирал)
Это не мелочи, это так, к слову...
 
Статус
Закрыто для дальнейших ответов.
Назад
Верх