(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 ответ
Есть три причины, по которым ваш код, скорее всего, не будет работать:
Вы пытаетесь телепортировать "мир" игрока (
player.getWorld().teleport
) а не сам плеер. Насколько я могу судить по API Bukkit 1.8.3, нетteleport()
метод для миров. Я предполагаю, что вы пытаетесь телепортировать игрока в этом случаеplayer.teleport(location/entity)
буду работать.Метод teleport() принимает местоположение или объект в качестве аргумента, а не блока. Вам нужно будет передать местоположение целевого блока с помощью
block.getLocation()
,В зависимости от того, какую версию 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
}
}