【问题标题】:Spigot PlayerInteractEntityEventSpigot PlayerInteractEntityEvent
【发布时间】:2017-04-10 14:26:52
【问题描述】:

我正在使用 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()),然后在取消事件后再次设置,但无济于事。我在这里做错了吗?或者这是一个错误?

【问题讨论】:

    标签: java plugins minecraft bukkit


    【解决方案1】:

    嗯,我发现你实际上不能直接编辑玩家的俯仰和偏航。您必须使用自定义俯仰和偏航值将玩家传送到自定义位置,如下所示:

    @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());
        }
    }
    

    所以现在玩家在右键单击马之前仍然会寻找他们正在看的地方,尽管它看起来有问题。到目前为止,我相信没有其他方法可以做到这一点。

    【讨论】:

      【解决方案2】:

      您在 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());
          }
      }
      

      【讨论】:

      • 虽然这是真的,但这不是问题所在。在下面查看我的答案
      【解决方案3】:

      您正在寻找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);
          }
      }
      

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 对 OP 的问题没有帮助
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-03-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-04
        • 2016-11-14
        相关资源
        最近更新 更多