2017-04-10 57 views
2

我正在使用Spigot 1.11.2。Spigot PlayerInteractEntityEvent

我有这个简单的代码:

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

什么它应该做的是,如果我右键单击一匹马,我应该得到它的名字,但我不应该骑它,因为​​的。它按预期工作,但问题是,当我右键单击一匹马时,游戏将我的视角(我的玩家的偏航)变成一些不一致的数字。但我不想转身;我仍然希望我的玩家看到我正在看的地方(在这种情况下是马),然后右键单击马。

我尝试了一些方法,如救了我的俯仰和偏航然后取消该事件后,再设置:

@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()),则取消之后再设置事件,无济于事。我在这里做错了什么?或者这是一个错误?

回答

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

所以,现在的球员仍然会期待他们在那里看着面前右键单击一匹马,虽然它看起来很糟糕。我相信,到目前为止,还没有其他办法可以做到这一点。

-1

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

+0

没有帮助OP的问题 – Kerooker

0

您使用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()); 
    } 
} 
+0

虽然这是真的,但这不是问题。在下面检查我的答案 – Kerooker

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); 
    } 
} 
相关问题