Есть ли способ удалить определенный блок, когда он помещен поверх другого определенного блока? - PullRequest
0 голосов
/ 23 июня 2019

Я пытаюсь найти самый простой способ удаления, например, рельса, когда он находится над блоком слизи. Я не хочу сканировать все блоки в пределах определенного радиуса, потому что я не хочу, чтобы плагин использовал много оперативной памяти.

Я бы хотел, чтобы рельс удалялся только тогда, когда он был помещен поверх блока слизи.

Спасибо за любые ответы.

1 Ответ

1 голос
/ 25 июня 2019

Как и делал Бенджамин Уркхарт, всегда делите вашу проблему на более мелкие подзадачи, на них можно гораздо легче ответить, если вы будете искать их, а не искать основную проблему, потому что главная, скорее всего, уникальна для вас, тогда как суб -проблемы нет.

Имея это в виду, нам нужно начать с прослушивания события. В частности, BlockPlaceEvent . Настройте свой класс в качестве слушателя и зарегистрируйте его.

Внутри события нам нужно проверить, является ли размещенный блок рельсом, а блок под слизью, если это так, отмените событие, чтобы предотвратить его размещение. Обратите внимание, что отмена события будет только препятствовать тому, чтобы рельс был размещен, но не удален. Если вы хотите удалить рельс, вы должны установить его тип в AIR вместо отмены события.

В итоге вы получите что-то вроде этого:

@EventHandler
public void onBlockPlace(BlockPlaceEvent event) {
    Block block = event.getBlock();
    Block against = event.getBlockAgainst();

    if(block.getType().equals(Material.RAIL) && against.getType().equals(Material.SLIME_BLOCK)) {
        event.setCancelled(true);
    }
}

Вы должны поместить этот код в зарегистрированный класс слушателя, чтобы он вызывался. Я решил использовать # getBlockAgainst () , чтобы проверить наш блок слизи. Обратите внимание, что этот метод возвращает блок, на котором был размещен наш рельс, в нашем случае рельс можно разместить только сверху блоков, то есть метод должен возвращать блок ниже. Однако помните, что метод не гарантирует, что с блоками, кроме рельса.

В других случаях вам может потребоваться получить блок с координатой block.getY()-1, который всегда будет возвращать блок ниже, но требует большей производительности. Я выбрал event.getBlockAgainst(), потому что вы имели в виду производительность.

...