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

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

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

Статус темы:
Закрыта.
  1. Автор темы
    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.; Думал сделать через шедулер, но у меня чёт голова поломалась.]
     
    Последнее редактирование: 12 янв 2017
  2. Fenix78563

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

    Баллы:
    76
    Имя в Minecraft:
    Blc_Dragon
    Код:
           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);
    
     
  3. AlexMor

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

    Баллы:
    76
    Для начала если плагин еще и другие функции выполняет то нужно создать отдельный поток (в этом я не силен, но что знаю скажу)
    Код:
    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) {}
    }
    
     
  4. Fenix78563

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

    Баллы:
    76
    Имя в Minecraft:
    Blc_Dragon
    а как игрок увидит сей инвентарь?

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

    в общем:
     
    Последнее редактирование: 12 янв 2017
  5. Автор темы
    iD3LSY

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

    Баллы:
    76
    Спасибо еще раз, даже если код не будет работать, ибо всё-равно ты потратил время(xd). Сейчас попробую.
     
  6. Dereku

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

    Баллы:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
    Открывать инвентарь игроку, после передавать инвентарь в шедулер. В чем проблема?
     
  7. Автор темы
    iD3LSY

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

    Баллы:
    76
    Кратко говоря - не работает, но если захочешь узнать полный мой ответ, то читай ниже.

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

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

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

    Баллы:
    76
    Имя в Minecraft:
    Blc_Dragon
    не одуплил куда ты там скобку припаял.

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

    значит в первом аргументе запуска таймера ты передал вместо плагина null. либо твоя переменная\поле plugin каким то образом null
    кстати за коим х*ем тут скобки фигурные, там где ты заполняешь инвентарь.
    или ты создаешь его вне метода (а-та та, надо в методе)
     
  9. Автор темы
    iD3LSY

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

    Баллы:
    76
    На счёт метода - да. А про "Plugin cannot be null" я знаю. Я не знал шо там над фиксануть, ибо как я уже и говорил, я просто говнокодер.
     
  10. Fenix78563

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

    Баллы:
    76
    Имя в Minecraft:
    Blc_Dragon
    вне методов у тебя поля null, так что взял и засунул все это в метод
     
  11. AlexMor

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

    Баллы:
    76
    Ну вообще-то я не говорил что я тру мастер кодинга, и создавать новый инвентарь для отдельного игрока вполне уместо для новых версий, и сам инвентарь я создаю 1 раз, когда вызывается метод, далее уже просто редактирую его. И если ты хотел видеть готовый рабочий код без изъянов обратись к сашку.
     
  12. Fenix78563

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

    Баллы:
    76
    Имя в Minecraft:
    Blc_Dragon
    -_-

    больше даже добавить нечего. объяснять как это все работает тоже не буду ибо гугл
     
  13. DonDays

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

    Баллы:
    96
    Имя в Minecraft:
    DonDays
    Зачем BukkitRunnable tll? можно runtasktimer напрямую из скобки
     
  14. Fenix78563

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

    Баллы:
    76
    Имя в Minecraft:
    Blc_Dragon
    так проще и понятнее
     
  15. DonDays

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

    Баллы:
    96
    Имя в Minecraft:
    DonDays
    По-моему, две лишние строки
     
  16. Fenix78563

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

    Баллы:
    76
    Имя в Minecraft:
    Blc_Dragon
    для человека который в первый раз видит bukkitRunnable это проще (на мой взгляд. и харош придираться к мелочам. тут нет никаких ошибок, а от двух лишних строк кода еще никто не умирал)
     
  17. DonDays

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

    Баллы:
    96
    Имя в Minecraft:
    DonDays
    Это не мелочи, это так, к слову...
     
Статус темы:
Закрыта.

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