Войти или зарегистрироваться
  • Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.

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

BeYkeR

Старожил
Девелопер
Пользователь
Баллы
173
Как дать ТНТ (блоку) особенность радиуса взрыва ?(Отличие между обычным ТНТ и этим)
Типо:
C4 радиус взрыва 3 блока
TNT(Обычный) радиус 8 блоков
и т.д.(При этом используется один блок - ТНТ)
 
http://jd.bukkit.org/rb/apidocs/org/bukkit/entity/TNTPrimed.html
http://jd.bukkit.org/rb/apidocs/src-html/org/bukkit/entity/Explosive.html#line.12
кури в этом направлении. Там 100% есть то что тебе нужно.

Так-же помни что на момент взрыва блока нету, есть только Entity динамита
Спасибо ,уже немного понял, тогда как "Прикрутить" к скрафченному блоку динамита?(Recept)
 
TNTPrimed tnt = ((TNTPrimed) Entity динамита).setYield(100500);
А к блоку - даже не знаю. Ибо блок он и в африке блок..
 
Можно дать блоку динамита data равное силе его взрыва, а в событии взрыва определять дату динамита и менять силу. Или использовать в итем мете тег Lore.
Вариантов много, выбери лучший.
 
Можно дать блоку динамита data равное силе его взрыва, а в событии взрыва определять дату динамита и менять силу. Или использовать в итем мете тег Lore.
Вариантов много, выбери лучший.

А какой "по-твоему" Самый оптимальный код ?(Извини если много спрашиваю)
 
А какой "по-твоему" Самый оптимальный код ?(Извини если много спрашиваю)
Можно записать в Lore "Блок динамита имеет силу взрыва 100"
а потом извлечь из строки только цифры.
 
Кстати, а можно ли удалить активированный динамит?
 
Такой код подойдет ?
Java:
                    final Location loc = event.getEntity().getLocation();
                    final TNTPrimed tnt = loc.getWorld().spawn(loc, TNTPrimed.class);
                    tnt.setFuseTicks(40);
                    tnt.setYield(0);
 
Вроде есть сущность TNTPrimed, только мне интересно, можно ли с ней взаимодействовать(пкм)?
Удалить tntprimed можно.
Взаимодействовать пкм с ним тоже можно
Можно дать блоку динамита data равное силе его взрыва, а в событии взрыва определять дату динамита и менять силу. Или использовать в итем мете тег Lore.
Вариантов много, выбери лучший.
А вот создать блок динамита с кастомным data нельзя. Во всяком случае через API. Вероятно можно через рефлексии или CB api.
Конечно простейший способ - запись силы взрыва в Lore (а можно и в скрытый тег), При установке блока будет ставиться сразу TNTPrimed. Время до взрыва по умолчанию 4 секунды, если поставить больше - через 4 сек. визуально динамит исчезает и с ним нельзя взаимодействовать.
 
Тогда как писать через Lore (Впервые вижу :D)
 
Тогда как писать через Lore (Впервые вижу :D)
Если не ошибаюсь - нужно взять getItemMeta(), там Lore представлен как массив строк. В любую из строк надо записать силу взрыва, она будет отображаться как описание предмета, под названием.

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

Хандлер:
При установке блока тнт(и если событие не отменено) - считываем из предмета Lore, если он есть - читаем нужную строчку, затем парсим значение. Дальше нужно отменить событие, на месте блока заспавнить TNTPrimed, установить силу взрыва.
ПС: событие нужно ожидать с самым низким приоритетом, чтобы не было конфликтов с WorldGuard.
Примерно так ?
Java:
        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);
 
На будущее для информации - не советую отменять событие установки блока с измененной метой. Краш всех кто это увидит обеспечен.
 
Примерно так ?
Java:
Строчки верные, но:
* Рецепт нужно создавать единожды при загрузке плагина, а спавнить тнт - при использовании предмета.
* В момент, когда считываем мету, должны быть проверки на null или лучше код в блоке try.
* Если нужен просто один новый блок динамита, можно не париться с Lore, а просто проверять название.
 
Строчки верные, но:
* Рецепт нужно создавать единожды при загрузке плагина, а спавнить тнт - при использовании предмета.
* В момент, когда считываем мету, должны быть проверки на null или лучше код в блоке try.
* Если нужен просто один новый блок динамита, можно не париться с Lore, а просто проверять название.
Теперь сойдет ?
Java:
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 не слышал(Недавно начал)
Еще:Можно ли брать значение из конфига ?
 

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

Назад
Верх