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

  • Автор темы Автор темы ToBlEzZ
  • Дата начала Дата начала

ToBlEzZ

Активный участник
Пользователь
Баллы
76
Всем привет!
Дорабатываю плагин с варпами, и понял, что нужно добавить проверку на наличие устойчивой платформы по координатам варпа. Проверки на Material.AIR не достаточно, т.к. если на этих координатах располагается кнопка, рычаг, нить и другие "призрачные блоки", то телепортация может оказаться для игрока смертельным.
Как сделать проверку на "призрачность" блока?
 
Всем привет!
Дорабатываю плагин с варпами, и понял, что нужно добавить проверку на наличие устойчивой платформы по координатам варпа. Проверки на Material.AIR не достаточно, т.к. если на этих координатах располагается кнопка, рычаг, нить и другие "призрачные блоки", то телепортация может оказаться для игрока смертельным.
Как сделать проверку на "призрачность" блока?
Думаю тебе нужно будет выписать исключения + проверка на Material.isBlock()
 
block.getType().isSolid()
 
Думаю тебе нужно будет выписать исключения + проверка на Material.isBlock()
Полагал сделать проверку наличия блока на координатах в списке призрачных. Но это слишком объемная работа, которую хотелось бы сделать только в крайнем случае
 
Должного результата не получил, проверка блока на твердость всегда принимает значение false, стою я на золотом блоке или вишу над бездной.
Код:
Location home = hU.getHome(p.getName());
                if (utilits.isSolid(home)) {
                    p.teleport(home);
}
Код:
public boolean isSolid(Location loc){
        return loc.getBlock().getType().isSolid();
    }
 
Код:
Block b = e.getBlock();

if(b.getType() == Material.BUTTON) {
        Что то
}

Я не понял небя, но вроде так
 
Код:
Block b = e.getBlock();

if(b.getType() == Material.BUTTON) {
        Что то
}

Я не понял небя, но вроде так
Да-да, такое годится, только при проверки на один-два материала. А в 1.16.4 только одних разновидностей кнопок 10.
Разумнее создать enum или строковый список с названиями проблемных блоков (кнопок, картин, табличек...), а дальше проверять блок с локации на наличие в оном списке.
 
Да-да, такое годится, только при проверки на один-два материала. А в 1.16.4 только одних разновидностей кнопок 10.
Разумнее создать enum или строковый список с названиями проблемных блоков (кнопок, картин, табличек...), а дальше проверять блок с локации на наличие в оном списке.
Tag.BUTTONS.isTagged(b.getType()) Все кнопки
 
Ну а что не так с isSolid()? По описанию на spigot он возвращает true, если через блок не сможет пройти игрок. Однако в моём случае он всегда false.
 
Должного результата не получил, проверка блока на твердость всегда принимает значение false, стою я на золотом блоке или вишу над бездной.
Код:
Location home = hU.getHome(p.getName());
                if (utilits.isSolid(home)) {
                    p.teleport(home);
}
Код:
public boolean isSolid(Location loc){
        return loc.getBlock().getType().isSolid();
    }

Очевидно, потому что точка дома находится выше блока платформы. В итоге всегда проверяешь AIR, который, конечно же, не solid
 
Последнее редактирование:
Очевидно, потому что точка дома находится выше блока платформы. В итоге всегда проверяешь AIR, который, конечно же, не solid
Блин, и правда :lol:. Жалко только, что таблички тоже считаются твёрдыми
 
Блин, и правда :lol:. Жалко только, что таблички тоже считаются твёрдыми
Возможно isOccluding() подойдёт больше. Если нет - тогда можно создать свой собственный список материалов на базе уже существующего (isSolid или isOccluding), лишь дополнить или удалить ненужное
 
Возможно isOccluding() подойдёт больше. Если нет - тогда можно создать свой собственный список материалов на базе уже существующего (isSolid или isOccluding), лишь дополнить или удалить ненужное
Ага, в 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;
 
Последнее редактирование:
Ага, в 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;
Для этой задачи отлично подходит MaterialSetTag из Paper, может понравится...
 
Для этой задачи отлично подходит MaterialSetTag из Paper, может понравится...
Может.
Однако сейчас мои проверки с новыми блоками не хотят работать (игнорятся).
Если пишу в наглую, чтобы блок сравнить с Material.SMOKER, то выдаёт ошибку, чтобы в plugin.yml дописал api-version: 1.13. Однако это вызывает ошибку "cannot get data class of modern material" и опять ссылается на новые материалы. Как здесь быть?
 
Может.
Однако сейчас мои проверки с новыми блоками не хотят работать (игнорятся).
Если пишу в наглую, чтобы блок сравнить с Material.SMOKER, то выдаёт ошибку, чтобы в plugin.yml дописал api-version: 1.13. Однако это вызывает ошибку "cannot get data class of modern material" и опять ссылается на новые материалы. Как здесь быть?
Проблема была в проверке на "blackstone". Теперь всё работает
 
Последнее редактирование:
Назад
Верх