Помогите Нужна помощь с кодом плагина.

Статус
Закрыто для дальнейших ответов.

Ильми

Активный участник
Пользователь
Баллы
66
Имя в Minecraft
IlmiGirafe
Вообщем, вчера начал изучать создание плагинов и Java вообщем, суть плагина - "переплавка" руды, всё работает, но возникли у меня с ним проблемы, а именно - несовместимость с приватами. Таким образом, получается, что игрок может ломать любые блоки, даже на спавне. Мне же нужно как-то решить эту проблему.
Код:
public class handler implements Listener {
    

      @EventHandler
      public void Break(BlockBreakEvent e) {
        Block b = e.getBlock();
        Player p = e.getPlayer();
        Location loc = b.getLocation();
        World world = loc.getWorld();
        if (!p.hasPermission("gfpuse.furnace"))
          return;
        if(!p.hasPermission("gfpuse.furnacemode"))
          return;
        if (b.getType() == Material.IRON_ORE) {
        if (p.getItemInHand().getType() != Material.GOLD_PICKAXE && p.getItemInHand().getType() != Material.DIAMOND_PICKAXE && p.getItemInHand().getType() != Material.STONE_PICKAXE && p.getItemInHand().getType() != Material.IRON_PICKAXE) return;
          ItemStack ITEM = new ItemStack(Material.IRON_INGOT);
          b.setType(Material.AIR);
          b.getWorld().dropItemNaturally(b.getLocation(), ITEM);
          p.playSound(p.getLocation(), Sound.BLOCK_FIRE_EXTINGUISH, .6f, 1.7f);
          world.spigot().playEffect(loc, Effect.FLAME, 0, 0, 0.1f, 0.1f, 0.1f, 0.1f, 10, 10);
 
Попробуй if e.isCancelled() return; добавить.
По идее, ивент должен отменяться вг и таким образом мы это проверяем. Конечно, можно напрямую проверить регион через api wg.
ЗЫ Я сам ещё нуб.
 
Попробуй if e.isCancelled() return; добавить.
По идее, ивент должен отменяться вг и таким образом мы это проверяем. Конечно, можно напрямую проверить регион через api wg.
ЗЫ Я сам ещё нуб.
Нет, так не получилось, может я что-то не так написал?
Код:
        if (b.getType() == Material.IRON_ORE) {
        if (e.isCancelled()) 
          return; 
        if (p.getItemInHand().getType() != Material.GOLD_PICKAXE && p.getItemInHand().getType() != Material.DIAMOND_PICKAXE && p.getItemInHand().getType() != Material.STONE_PICKAXE && p.getItemInHand().getType() != Material.IRON_PICKAXE) return;
        ItemStack ITEM = new ItemStack(Material.IRON_INGOT);
          b.setType(Material.AIR);
          b.getWorld().dropItemNaturally(b.getLocation(), ITEM);
          p.playSound(p.getLocation(), Sound.BLOCK_FIRE_EXTINGUISH, .6f, 1.7f);
          world.spigot().playEffect(loc, Effect.FLAME, 0, 0, 0.1f, 0.1f, 0.1f, 0.1f, 10, 10);
 
Соре, так попробуй: if (e.isCancelled()) {
e.setCancelled(true);
return;
}
Хз нужен ли return, давно ничего не писал, добавляй в начале, чтобы избежать лишних проверок, если они не нужны.
 
Нет, не получается
 
Последнее редактирование:
Нет, не получается

Я, если что, сделал вот так:
Код:
      @EventHandler
      public void Break(BlockBreakEvent e) {
        Block b = e.getBlock();
        Player p = e.getPlayer();
        Location loc = b.getLocation();
        World world = loc.getWorld();
        if (!p.hasPermission("gfpuse.furnace"))
          return;
        if(!p.hasPermission("gfpuse.furnacemode"))
          return;
        if (e.isCancelled()) {
            e.setCancelled(true);
            return;
        }
        if (b.getType() == Material.IRON_ORE) {
        if (p.getItemInHand().getType() != Material.GOLD_PICKAXE && p.getItemInHand().getType() != Material.DIAMOND_PICKAXE && p.getItemInHand().getType() != Material.STONE_PICKAXE && p.getItemInHand().getType() != Material.IRON_PICKAXE) return;
        ItemStack ITEM = new ItemStack(Material.IRON_INGOT);
          b.setType(Material.AIR);
          b.getWorld().dropItemNaturally(b.getLocation(), ITEM);
          p.playSound(p.getLocation(), Sound.BLOCK_FIRE_EXTINGUISH, .6f, 1.7f);
          world.spigot().playEffect(loc, Effect.FLAME, 0, 0, 0.1f, 0.1f, 0.1f, 0.1f, 10, 10);
        }
У тебя права не настроены или может быть у тебя оператор. Если isCancelled выдает false, тогда у тебя точно должен быть оператор
 
Соре, так попробуй: if (e.isCancelled()) {
e.setCancelled(true);
return;
}
Хз нужен ли return, давно ничего не писал, добавляй в начале, чтобы избежать лишних проверок, если они не нужны.
e.setCancelled(true) тут не нужен
 
Попробуй if e.isCancelled() return; добавить.
По идее, ивент должен отменяться вг и таким образом мы это проверяем. Конечно, можно напрямую проверить регион через api wg.
ЗЫ Я сам ещё нуб.
Неа, оно так не работает

Вг вообще как-то парашно работает с флагами, сам когда-то ломал над этим голову
 
У тебя права не настроены или может быть у тебя оператор. Если isCancelled выдает false, тогда у тебя точно должен быть оператор
Смотри сам, у меня нету прав оператора (Я себя деопнул, на скрине должно быть видно), у меня группа default (прописаны 3 права - modifiworld.*, gfpuse.furnace, gfpuse.furnacemode). Когда ломаю блок не в своём привате мне пишут о том, что я не могу сломать блок, но он ломается и исчезает.
qSaDJpV1C8VoUzRcmUxUSzBmv2BmSXFJMceTFtwDtXjB32YZ9aCjRl1304QoxXgivuWOIcA9xHMmmQMrUrpuUQ%3D%3D
 
Смотри сам, у меня нету прав оператора (Я себя деопнул, на скрине должно быть видно), у меня группа default (прописаны 3 права - modifiworld.*, gfpuse.furnace, gfpuse.furnacemode). Когда ломаю блок не в своём привате мне пишут о том, что я не могу сломать блок, но он ломается и исчезает.
qSaDJpV1C8VoUzRcmUxUSzBmv2BmSXFJMceTFtwDtXjB32YZ9aCjRl1304QoxXgivuWOIcA9xHMmmQMrUrpuUQ%3D%3D
у тебя плагин вообще работает? Или ты может евент не зарегистрировал?
 
у тебя плагин вообще работает? Или ты может евент не зарегистрировал?
Плагин то работает, всё вроде хорошо, ивент вроде зарегистрирован.
Код:
      @EventHandler
      public void Break(BlockBreakEvent e) {
        Block b = e.getBlock();
        Player p = e.getPlayer();
        Location loc = b.getLocation();
        World world = loc.getWorld();
        if (!p.hasPermission("gfpuse.furnace"))
          return;
        if(!p.hasPermission("gfpuse.furnacemode"))
          return;
        if (e.isCancelled()) {
            return;
Могу скинуть весь код, если нужно. Команды работают, плагин включается/выключается, все частицы и звуки воспроизводятся. Мне нужно, чтобы следующие строчки не работали, если блок не ЛОМАЕТСЯ (Что и происходит из-за приватов WorldGuard):
Код:
        }
        if (b.getType() == Material.IRON_ORE) {
        if (p.getItemInHand().getType() != Material.GOLD_PICKAXE && p.getItemInHand().getType() != Material.DIAMOND_PICKAXE && p.getItemInHand().getType() != Material.STONE_PICKAXE && p.getItemInHand().getType() != Material.IRON_PICKAXE) return;
        ItemStack ITEM = new ItemStack(Material.IRON_INGOT);
          b.setType(Material.AIR);
          b.getWorld().dropItemNaturally(b.getLocation(), ITEM);
          p.playSound(p.getLocation(), Sound.BLOCK_FIRE_EXTINGUISH, .6f, 1.7f);
          world.spigot().playEffect(loc, Effect.FLAME, 0, 0, 0.1f, 0.1f, 0.1f, 0.1f, 10, 10);
        }
 
Последнее редактирование:
Ну так конечно, ты же изменяешь блок на воздух ивентом, чего ты ожидал то.
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
 
Да, спасибо о великие, всё заработало через @EventHandler(priority = EventPriority.HIGHEST) и if (e.isCancelled()) { return; } - Вопрос решён.
 
Статус
Закрыто для дальнейших ответов.
Назад
Верх