(BUKKIT) Метод getTargetBlock не работает

Я думаю (надеюсь), что использую правильные аргументы. player.getTargetBlock нужен для многих вещей в буккит, но у меня никогда не работает! Единственный раз, когда это работает, с порождающим молнии.

Вот бит, который не работает:

@EventHandler
public void onPlayerInteractBlockTeleport(PlayerInteractEvent event) {
    Player player = event.getPlayer();
    if (player.getItemInHand().getType() == Material.BONE) {
        player.getWorld().teleport(player.getTargetBlock(null, 200));
        player.playSound(player.getLocation(), Sound.ENDERMAN_TELEPORT, 10, 1);
    }
}

Кто-нибудь поможет?

1 ответ

Есть три причины, по которым ваш код, скорее всего, не будет работать:

  1. Вы пытаетесь телепортировать "мир" игрока (player.getWorld().teleport) а не сам плеер. Насколько я могу судить по API Bukkit 1.8.3, нет teleport() метод для миров. Я предполагаю, что вы пытаетесь телепортировать игрока в этом случае player.teleport(location/entity) буду работать.

  2. Метод teleport() принимает местоположение или объект в качестве аргумента, а не блока. Вам нужно будет передать местоположение целевого блока с помощью block.getLocation(),

  3. В зависимости от того, какую версию Bukkit вы используете, и используете ли вы также Craftbukkit, вам, вероятно, следует привести первый аргумент метода getTargetBlock() к множеству, чтобы избежать неоднозначности (есть другой метод (не рекомендуется), который принимает HashSet в качестве первого аргумента).

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

@EventHandler
public void onPlayerInteractBlockTeleport(PlayerInteractEvent event) {
    Player player = event.getPlayer();
    //Null check isn't necessary anymore, an empty item will have Material.AIR and getTargetBlock() now also works if no target block is found
    if (player.getItemInHand().getType() == Material.BONE) {
        Location playerLoc = player.getLocation(); //Get the player's location
        Location target = player.getTargetBlock((Set) null, 200).getLocation().clone().add(0, 1, 0); //Get the block location + 1 y
        target.setYaw(playerLoc.getYaw()); //Set the yaw of the target location to the player's yaw
        target.setPitch(playerLoc.getPitch()); //Set the pitch of the target location to the player's pitch
        player.teleport(target); //Teleport player
        player.playSound(player.getLocation(), Sound.ENDERMAN_TELEPORT, 10, 1); //Play sound
    }
}
Другие вопросы по тегам