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

Помогите Особенности блока (ТНТ)

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

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

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

    Баллы:
    173
    Как дать ТНТ (блоку) особенность радиуса взрыва ?(Отличие между обычным ТНТ и этим)
    Типо:
    C4 радиус взрыва 3 блока
    TNT(Обычный) радиус 8 блоков
    и т.д.(При этом используется один блок - ТНТ)
     
  2. Автор темы
    BeYkeR

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

    Баллы:
    173
    Пытался, не получилось(Или я криворукий)
     
  3. Jampire

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

    Баллы:
    173
    Skype:
    jampire-h
    Имя в Minecraft:
    Jampire
    BeYkeR нравится это.
  4. Автор темы
    BeYkeR

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

    Баллы:
    173
    Спасибо ,уже немного понял, тогда как "Прикрутить" к скрафченному блоку динамита?(Recept)
     
  5. Jampire

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

    Баллы:
    173
    Skype:
    jampire-h
    Имя в Minecraft:
    Jampire
    TNTPrimed tnt = ((TNTPrimed) Entity динамита).setYield(100500);
    А к блоку - даже не знаю. Ибо блок он и в африке блок..
     
  6. Jampire

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

    Баллы:
    173
    Skype:
    jampire-h
    Имя в Minecraft:
    Jampire
    Можно дать блоку динамита data равное силе его взрыва, а в событии взрыва определять дату динамита и менять силу. Или использовать в итем мете тег Lore.
    Вариантов много, выбери лучший.
     
    BeYkeR нравится это.
  7. Автор темы
    BeYkeR

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

    Баллы:
    173
    А какой "по-твоему" Самый оптимальный код ?(Извини если много спрашиваю)
     
    Vedroyder и Black-UK-Lord нравится это.
  8. Jampire

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

    Баллы:
    173
    Skype:
    jampire-h
    Имя в Minecraft:
    Jampire
    Можно записать в Lore "Блок динамита имеет силу взрыва 100"
    а потом извлечь из строки только цифры.
     
    BeYkeR нравится это.
  9. Автор темы
    BeYkeR

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

    Баллы:
    173
    и как я понял, через NBTTagCompound ?
     
  10. Den_Abr

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

    Баллы:
    173
    Skype:
    Den_Abr
    Имя в Minecraft:
    Den_Abr
    Кстати, а можно ли удалить активированный динамит?
     
  11. Автор темы
    BeYkeR

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

    Баллы:
    173
    Вероятно нет
     
  12. Den_Abr

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

    Баллы:
    173
    Skype:
    Den_Abr
    Имя в Minecraft:
    Den_Abr
    Вроде есть сущность TNTPrimed, только мне интересно, можно ли с ней взаимодействовать(пкм)?
     
  13. Автор темы
    BeYkeR

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

    Баллы:
    173
    Такой код подойдет ?
    Код:
                        final Location loc = event.getEntity().getLocation();
                        final TNTPrimed tnt = loc.getWorld().spawn(loc, TNTPrimed.class);
                        tnt.setFuseTicks(40);
                        tnt.setYield(0);
     
  14. DPOH-VAR

    DPOH-VAR Старожил Пользователь

    Баллы:
    153
    Skype:
    dpohvar
    Удалить tntprimed можно.
    Взаимодействовать пкм с ним тоже можно
    А вот создать блок динамита с кастомным data нельзя. Во всяком случае через API. Вероятно можно через рефлексии или CB api.
    Конечно простейший способ - запись силы взрыва в Lore (а можно и в скрытый тег), При установке блока будет ставиться сразу TNTPrimed. Время до взрыва по умолчанию 4 секунды, если поставить больше - через 4 сек. визуально динамит исчезает и с ним нельзя взаимодействовать.
     
    BeYkeR нравится это.
  15. Автор темы
    BeYkeR

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

    Баллы:
    173
    Тогда как писать через Lore (Впервые вижу :D)
     
  16. DPOH-VAR

    DPOH-VAR Старожил Пользователь

    Баллы:
    153
    Skype:
    dpohvar
    Если не ошибаюсь - нужно взять getItemMeta(), там Lore представлен как массив строк. В любую из строк надо записать силу взрыва, она будет отображаться как описание предмета, под названием.

    Хандлер:
    При установке блока тнт(и если событие не отменено) - считываем из предмета Lore, если он есть - читаем нужную строчку, затем парсим значение. Дальше нужно отменить событие, на месте блока заспавнить TNTPrimed, установить силу взрыва.
    ПС: событие нужно ожидать с самым низким приоритетом, чтобы не было конфликтов с WorldGuard.
     
  17. Автор темы
    BeYkeR

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

    Баллы:
    173
    Примерно так ?
    Код:
            ItemStack poison_TNT = new ItemStack(Material.TNT, 1);
              ItemMeta im = poison_TNT.getItemMeta();
            ArrayList poison_TNT_lore = new ArrayList();
            poison_TNT_lore.add("5");
            im.setLore(poison_TNT_lore);
            im.setDisplayName("Poison TNT");
            poison_TNT.setItemMeta(im);
            ShapedRecipe craft = new ShapedRecipe(poison_TNT); 
            craft.shape(new String[] { "AAA", "AAA", "AAA" });
            craft.setIngredient('A', Material.getMaterial(46));
            getServer().addRecipe(craft);
            final Location loc = event.getEntity().getLocation();
            final TNTPrimed tnt = loc.getWorld().spawn(loc, TNTPrimed.class);
            tnt.setFuseTicks(20);
            tnt.setYield(4);
     
    ql_Nik_lp нравится это.
  18. Jampire

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

    Баллы:
    173
    Skype:
    jampire-h
    Имя в Minecraft:
    Jampire
    На будущее для информации - не советую отменять событие установки блока с измененной метой. Краш всех кто это увидит обеспечен.
     
  19. DPOH-VAR

    DPOH-VAR Старожил Пользователь

    Баллы:
    153
    Skype:
    dpohvar
    Строчки верные, но:
    * Рецепт нужно создавать единожды при загрузке плагина, а спавнить тнт - при использовании предмета.
    * В момент, когда считываем мету, должны быть проверки на null или лучше код в блоке try.
    * Если нужен просто один новый блок динамита, можно не париться с Lore, а просто проверять название.
     
    BeYkeR нравится это.
  20. Автор темы
    BeYkeR

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

    Баллы:
    173
    Теперь сойдет ?
    Код:
    public class MoreBombs extends JavaPlugin implements Listener {
     
        public static final Logger _log = Logger.getLogger("Minecraft");
     
        public void onEnable() {
            _log.info("[MoreBombs] Started! ");
     
            ItemStack poison_TNT = new ItemStack(Material.TNT, 1);
              ItemMeta im = poison_TNT.getItemMeta();
            ArrayList poison_TNT_lore = new ArrayList();
            poison_TNT_lore.add("5");
            im.setLore(poison_TNT_lore);
            im.setDisplayName("Poison TNT");
            poison_TNT.setItemMeta(im);
            ShapedRecipe craft = new ShapedRecipe(poison_TNT);
            craft.shape(new String[] { "AAA", "AAA", "AAA" });
            craft.setIngredient('A', Material.getMaterial(46));
            getServer().addRecipe(craft);
     
            ItemStack TNTNuke = new ItemStack(Material.TNT, 1);
              ItemMeta im1 = TNTNuke.getItemMeta();
            ArrayList TNT_Nuke_lore = new ArrayList();
            TNT_Nuke_lore.add("8");
            im1.setLore(TNT_Nuke_lore);
            im1.setDisplayName("DevTNT");
            TNTNuke.setItemMeta(im1);
            ShapedRecipe craft2 = new ShapedRecipe(TNTNuke);
            craft2.shape(new String[] { "AAB", "AAB", "BBB" });
            craft2.setIngredient('A', Material.getMaterial(46), 64);
            getServer().addRecipe(craft2);
     
            Bukkit.getPluginManager().registerEvents(this, this);
          }
     
     
    @EventHandler(priority = EventPriority.NORMAL)
    public void onBlockPlace(BlockPlaceEvent event) {
        if(event.getBlock().getType() == Material.TNT)
        {
            {
                Location toSpawn = event.getBlock().getLocation();
                event.getBlock().setType(Material.AIR);
                TNTPrimed tnt = toSpawn.getWorld().spawn(toSpawn, TNTPrimed.class);
                int TNTNuke_lore = 15;
                tnt.setFuseTicks(TNTNuke_lore);
                tnt.setYield(15);
            }
        }
    }
    }
    А про 2 и 3 не слышал(Недавно начал)
    Еще:Можно ли брать значение из конфига ?
     

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