Spigot PlayerInteractEntityEvent
Spigot PlayerInteractEntityEvent
我正在使用 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()
)然后在取消事件后再次设置它,但无济于事。我在这里做错了什么吗?或者这是一个错误?
您应该使用 player.getEyeLocation()
来检索俯仰和偏航值
您在 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());
}
}
您正在寻找 VehicleEnterEvent
。这是当一个实体开始骑另一个实体(包括马、矿车或任何其他在适当情况下的实体)时抛出的事件。
定义在
关于如何实现它的快速示例:
@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);
}
}
好吧,我发现您实际上无法直接编辑玩家的俯仰和偏航。您必须使用自定义俯仰和偏航值将玩家传送到自定义位置,如下所示:
@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());
}
}
所以现在玩家在右键单击一匹马之前仍然会看向他们正在看的地方,尽管它看起来有点问题。我相信到目前为止没有其他方法可以做到这一点。
我正在使用 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()
)然后在取消事件后再次设置它,但无济于事。我在这里做错了什么吗?或者这是一个错误?
您应该使用 player.getEyeLocation()
来检索俯仰和偏航值
您在 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());
}
}
您正在寻找 VehicleEnterEvent
。这是当一个实体开始骑另一个实体(包括马、矿车或任何其他在适当情况下的实体)时抛出的事件。
定义在
关于如何实现它的快速示例:
@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);
}
}
好吧,我发现您实际上无法直接编辑玩家的俯仰和偏航。您必须使用自定义俯仰和偏航值将玩家传送到自定义位置,如下所示:
@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());
}
}
所以现在玩家在右键单击一匹马之前仍然会看向他们正在看的地方,尽管它看起来有点问题。我相信到目前为止没有其他方法可以做到这一点。