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

Помогите Проверка блока на "призрачность"

Тема в разделе "Разработка плагинов для новичков", создана пользователем ToBlEzZ, 1 фев 2021.

  1. Автор темы
    ToBlEzZ

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

    Баллы:
    76
    Всем привет!
    Дорабатываю плагин с варпами, и понял, что нужно добавить проверку на наличие устойчивой платформы по координатам варпа. Проверки на Material.AIR не достаточно, т.к. если на этих координатах располагается кнопка, рычаг, нить и другие "призрачные блоки", то телепортация может оказаться для игрока смертельным.
    Как сделать проверку на "призрачность" блока?
     
  2. CriticaMobslps

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

    Баллы:
    76
    Имя в Minecraft:
    CriticaMobs
    Думаю тебе нужно будет выписать исключения + проверка на Material.isBlock()
     
  3. Dymeth

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

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    block.getType().isSolid()
     
  4. Автор темы
    ToBlEzZ

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

    Баллы:
    76
    Полагал сделать проверку наличия блока на координатах в списке призрачных. Но это слишком объемная работа, которую хотелось бы сделать только в крайнем случае
     
  5. Автор темы
    ToBlEzZ

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

    Баллы:
    76
    Должного результата не получил, проверка блока на твердость всегда принимает значение false, стою я на золотом блоке или вишу над бездной.
    Код:
    Location home = hU.getHome(p.getName());
                    if (utilits.isSolid(home)) {
                        p.teleport(home);
    }
    Код:
    public boolean isSolid(Location loc){
            return loc.getBlock().getType().isSolid();
        }
     
  6. adodvstudios

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

    Баллы:
    76
    Имя в Minecraft:
    Jenka20091
    Код:
    Block b = e.getBlock();
    
    if(b.getType() == Material.BUTTON) {
            Что то
    } 
    Я не понял небя, но вроде так
     
  7. Автор темы
    ToBlEzZ

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

    Баллы:
    76
    Да-да, такое годится, только при проверки на один-два материала. А в 1.16.4 только одних разновидностей кнопок 10.
    Разумнее создать enum или строковый список с названиями проблемных блоков (кнопок, картин, табличек...), а дальше проверять блок с локации на наличие в оном списке.
     
  8. alexandrage

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

    Баллы:
    173
    Tag.BUTTONS.isTagged(b.getType()) Все кнопки
     
  9. Автор темы
    ToBlEzZ

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

    Баллы:
    76
    Ну а что не так с isSolid()? По описанию на spigot он возвращает true, если через блок не сможет пройти игрок. Однако в моём случае он всегда false.
     
  10. Dymeth

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

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    Очевидно, потому что точка дома находится выше блока платформы. В итоге всегда проверяешь AIR, который, конечно же, не solid
     
    Последнее редактирование: 1 фев 2021
  11. Автор темы
    ToBlEzZ

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

    Баллы:
    76
    Блин, и правда :lol:. Жалко только, что таблички тоже считаются твёрдыми
     
  12. Dymeth

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

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    Возможно isOccluding() подойдёт больше. Если нет - тогда можно создать свой собственный список материалов на базе уже существующего (isSolid или isOccluding), лишь дополнить или удалить ненужное
     
  13. Автор темы
    ToBlEzZ

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

    Баллы:
    76
    Ага, в 1.16 много новых блоков, которые не расцениваются спиготом как твёрдые. Всё же пришлось сделать список. Может кому пригодится (Не ручаюсь, что там абсолютно все блоки, т.к. мог пропустить)
    Код:
    private boolean solidCases(Location loc){
            switch (loc.getBlock().getType()){
                case SMITHING_TABLE:
                case FLETCHING_TABLE:
                case CARTOGRAPHY_TABLE:
                case BEEHIVE:
                case BEE_NEST:
                case SHROOMLIGHT:
                case COMPOSTER:
                case LODESTONE:
                case RESPAWN_ANCHOR:
                case BARREL:
                case LOOM:
                case SMOKER:
                case BLAST_FURNACE:
                case CAKE:
                case STONECUTTER:
                case HONEY_BLOCK:
                case HONEYCOMB_BLOCK:
                case CAMPFIRE:
                case SOUL_CAMPFIRE:
                case PUMPKIN:
                case SOUL_SOIL:
                case CRYING_OBSIDIAN:
                case SCAFFOLDING:
                case NETHER_GOLD_ORE:
                case ANCIENT_DEBRIS:
                case NETHERITE_BLOCK:
                case WARPED_WART_BLOCK:
                case NETHER_WART_BLOCK:
                    return true;
                default: return false;
            }
        }
    Код:
    if (loc.getBlock().getType().getData().getName().contains("Blackstone")) isSolid = true;
     
    Последнее редактирование: 3 фев 2021
  14. Dymeth

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

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    Для этой задачи отлично подходит MaterialSetTag из Paper, может понравится...
     
  15. Автор темы
    ToBlEzZ

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

    Баллы:
    76
    Может.
    Однако сейчас мои проверки с новыми блоками не хотят работать (игнорятся).
    Если пишу в наглую, чтобы блок сравнить с Material.SMOKER, то выдаёт ошибку, чтобы в plugin.yml дописал api-version: 1.13. Однако это вызывает ошибку "cannot get data class of modern material" и опять ссылается на новые материалы. Как здесь быть?
     
  16. Автор темы
    ToBlEzZ

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

    Баллы:
    76
    Проблема была в проверке на "blackstone". Теперь всё работает
     
    Последнее редактирование: 3 фев 2021

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