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

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

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

Статус темы:
Закрыта.
  1. Автор темы
    Folzy

    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);
                    });
                }
            });
        }
     
  2. Dereku

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

    Баллы:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
    События мира вызываются прямо тут и сейчас, и действия по событию должны выполняться так же тут и сейчас, а не когда нибудь из соседнего потока.
    У тебя из вариантов отменять событие сразу и потом уже смотреть "А что это сломали?", либо выкинуть CompletableFuture.runAsync(Runnable) совсем.
     
  3. Автор темы
    Folzy

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

    Баллы:
    76
    Имя в Minecraft:
    CUBOPHORIA
    Сейчас попробую.
     
  4. Автор темы
    Folzy

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

    Баллы:
    76
    Имя в Minecraft:
    CUBOPHORIA
    Да, это помогло, но теперь блок не заменяется на Бедрок, вместо него почему то воздух
     
    Последнее редактирование: 25 авг 2024
  5. Автор темы
    Folzy

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

    Баллы:
    76
    Имя в Minecraft:
    CUBOPHORIA
    Вот код:

    Код:
        @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 руда восстанавливается.
     
  6. Автор темы
    Folzy

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

    Баллы:
    76
    Имя в Minecraft:
    CUBOPHORIA
    Всё решилось тем что, перевёл разрушение блока и выпадение дропа на основной поток, а замена блока на асинхронный.
     
Статус темы:
Закрыта.

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