Spigot PlayerInteractEntityEvent

时间:2017-04-10 14:26:52

标签: java plugins minecraft bukkit

我正在使用Spigot 1.11.2。

我有这个简单的代码:

@EventHandler
public void onPlayerInteractEntity (PlayerInteractEntityEvent event) {
    if (entity instanceof AbstractHorse) {
        event.setCancelled(true);

        AbstractHorse horse = (AbstractHorse) event.getRightClicked();
        Player player = event.getPlayer();
        player.sendMessage(horse.getName());
    }
}

它应该做的是,如果我右键单击一匹马,我应该得到它的名字但我不应该骑它,因为event.setCancelled(true)。它按预期工作,但问题是,当我右键单击一匹马时,游戏会将我的视野(我的玩家的偏航)转变为一些不一致的数字。但我不想转身;在我右键单击马后,我仍然希望我的播放器能够看到我正在看的位置(在这种情况下是马)。

我尝试了一些方法,例如保存我的音高和偏航,然后在取消事件后重新设置它:

@EventHandler
public void onPlayerInteractEntity (PlayerInteractEntityEvent event) {
    Player player = event.getPlayer();
    float pitch = player.getLocation().getPitch();
    float yaw = player.getLocation().getYaw();

    if (entity instanceof AbstractHorse) {
        event.setCancelled(true);
        player.getLocation().setPitch(pitch);
        player.getLocation().setYaw(yaw);

        AbstractHorse horse = (AbstractHorse) event.getRightClicked();
        player.sendMessage(horse.getName());
    }
}

并且同样尝试保存玩家的方向(通过player.getLocation().getDirection())然后在取消事件后再次设置它,无济于事。我在这里做错了吗?或者这是一个错误吗?

4 个答案:

答案 0 :(得分:2)

好吧,我发现你实际上无法直接编辑球员的投球和偏航。您必须使用自定义音高和偏航值将播放器传送到自定义位置,如下所示:

@EventHandler
public void onPlayerInteractEntity (PlayerInteractEntityEvent event) {
    Entity entity = event.getRightClicked();
    Player player = event.getPlayer();

    float pitch = player.getLocation().getPitch();
    float yaw = player.getLocation().getYaw();

    if (entity instanceof AbstractHorse) {
        event.setCancelled(true);

        Location loc = player.getLocation();
        loc.setPitch(pitch);
        loc.setYaw(yaw);
        player.teleport(loc);

        AbstractHorse horse = (AbstractHorse) event.getRightClicked();
        player.sendMessage(horse.getName());
    }
}

所以现在玩家在右键点击一匹马之前仍然会看到他们所看到的位置,尽管看起来很奇怪。到目前为止,没有其他方法可以做到这一点,我相信。

答案 1 :(得分:0)

您在if条件中使用entity,但您从未声明过它。使用此代码:

@EventHandler
public void onPlayerInteractEntity (PlayerInteractEntityEvent event) {
    Entity entity = event.getRightClicked();

    if (entity instanceof AbstractHorse) {
        event.setCancelled(true);

        AbstractHorse horse = (AbstractHorse) entity;
        Player player = event.getPlayer();
        player.sendMessage(horse.getName());
    }
}

答案 2 :(得分:0)

您正在寻找VehicleEnterEvent。当实体开始乘坐另一个实体(包括马匹,矿车或任何其他实体,在适当的环境下)时,它就会被抛出。

spigot javadocs

中定义

关于如何实施它的快速示例:

@EventHandler
public void onHorseMount(VehicleEnterEvent e) {
    Entity entered = e.getEntered();
    Vehicle enteredOn = e.getVehicle();
    if (enteredOn instanceof AbstractHorse) {

        //Entity entered a Horse

        if (!(entered instanceof Player))return; //Returns if this is not a player

        Player mountingHorse = (Player) entered;
        AbstractHorse horseEntered = (AbstractHorse) enteredOn;
        mountingHorse.sendMessage(horseEntered.getName());   //Sending the message
        e.setCancelled(true);
    }
}

答案 3 :(得分:-1)

您应该使用player.getEyeLocation()来检索音高和偏航值