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

Помогите Убрать основной дроп блока

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

Folzy

Активный участник
Пользователь
Баллы
76
Имя в Minecraft
CUBOPHORIA
Написал код, всё работает кроме отключения выпадения дропа у блока в регионе, уже и так переписал и сяк, не пойму. Блок ломаешь, основной дроп в виде руды или в случае алмазной руды - Алмаза, не должны выпадать, а лишь только ресурс из config.yml прописанный там (это я сделал и оно выпадает), а вот основной дроп остаётся.


Код:
    @EventHandler
    public void onBlockBreak(BlockBreakEvent event) {
        Block block = event.getBlock();
        Player player = event.getPlayer();
        RegionContainer regionContainer = worldGuardPlugin.getRegionContainer();
        RegionQuery query = regionContainer.createQuery();

        CompletableFuture.runAsync(() -> {
            ProtectedRegion region = getRegion(block.getLocation());
            if (region == null) {
                return;
            }
            String regionName = region.getId();
            if (!regionBlockReplacementTimes.containsKey(regionName)) {
                return;
            }
            Material material = block.getType();
            if (oreMaterials.contains(material)) {
                long delay = regionBlockReplacementTimes.get(regionName).getOrDefault(material, 0L);
                Material dropMaterial = regionBlockDrops.get(regionName).get(material);

                Bukkit.getScheduler().runTask(this, () -> {
                    event.setCancelled(true);
                    replaceBlockWithBedrock(block);

                    Bukkit.getScheduler().runTaskLater(this, () -> {
                        restoreBlock(block, material);
                    }, delay * 20L);

                    if (dropMaterial != null) {
                        dropItem(block, dropMaterial);
                    }
                    player.playSound(player.getLocation(), Sound.ENTITY_PLAYER_LEVELUP, 1.0f, 1.0f);
                });
            }
        });
    }
 
События мира вызываются прямо тут и сейчас, и действия по событию должны выполняться так же тут и сейчас, а не когда нибудь из соседнего потока.
У тебя из вариантов отменять событие сразу и потом уже смотреть "А что это сломали?", либо выкинуть CompletableFuture.runAsync(Runnable) совсем.
 
Сейчас попробую.
 
События мира вызываются прямо тут и сейчас, и действия по событию должны выполняться так же тут и сейчас, а не когда нибудь из соседнего потока.
У тебя из вариантов отменять событие сразу и потом уже смотреть "А что это сломали?", либо выкинуть CompletableFuture.runAsync(Runnable) совсем.
Да, это помогло, но теперь блок не заменяется на Бедрок, вместо него почему то воздух
 
Последнее редактирование:
Вот код:

Код:
    @EventHandler
    public void onBlockBreak(BlockBreakEvent event) {
        Block block = event.getBlock();
        Player player = event.getPlayer();
        RegionContainer regionContainer = worldGuardPlugin.getRegionContainer();
        RegionQuery query = regionContainer.createQuery();

        ProtectedRegion region = getRegion(block.getLocation());
        if (region == null) {
            return;
        }
        String regionName = region.getId();
        if (!regionBlockReplacementTimes.containsKey(regionName)) {
            return;
        }
        Material material = block.getType();
        if (oreMaterials.contains(material)) {
            long delay = regionBlockReplacementTimes.get(regionName).getOrDefault(material, 0L);
            Material dropMaterial = regionBlockDrops.get(regionName).get(material);

            event.setDropItems(false);
            block.getDrops().clear();

            if (block.getType() != Material.AIR) {
                block.setType(Material.BEDROCK);
            }

            Bukkit.getScheduler().runTaskLater(this, () -> {
                if (block.getType() == Material.BEDROCK) {
                    block.setType(material);
                }
            }, delay * 20L);

            if (dropMaterial != null) {
                dropItem(block, dropMaterial);
            }
            player.playSound(player.getLocation(), Sound.ENTITY_PLAYER_LEVELUP, 1.0f, 1.0f);
        }
    }

Теперь он попросту не заменяет блок после разрушения на другой, даже вводил другие блоки, добавил проверку на воздух, ему всё равно, при этом восстановление руды проходит правильно, после несколько секунд как прописано в config руда восстанавливается.
 
Всё решилось тем что, перевёл разрушение блока и выпадение дропа на основной поток, а замена блока на асинхронный.
 
Статус
Закрыто для дальнейших ответов.

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

Назад
Верх