【问题标题】:How to check if a player right-clicked another player如何检查一个玩家是否右键单击另一个玩家
【发布时间】:2018-12-31 10:50:48
【问题描述】:

寻找合适的活动。我想检查一个玩家是否右键点击了另一个玩家。

这是我到目前为止所拥有的(不起作用。没有进入ifelse 声明:

public void onPlayerRightClicks(PlayerInteractEntityEvent e) {
    Player p=e.getPlayer();
    if(e.getRightClicked() instanceof Player) p.sendMessage("You have rightclicked a player.");
    else p.sendMessage("You didn't hit anyone with your spell");
}

【问题讨论】:

  • 你有@EventHandler注解吗?
  • "未进入 if 或 else 语句" 表示从未调用此回调。请显示更多代码。
  • 你创建了 Player 对象,还是在该行失败了?
  • @AndrewLi 我已经添加了@EventHandler 注释
  • @131 控制台有错误吗?

标签: java bukkit


【解决方案1】:

通过将我自己的代码与类似问题的另一个答案的代码相结合,找到了问题的答案:

@SuppressWarnings("deprecation")
@EventHandler
public void onPlayerClick(PlayerInteractEvent e) {
    Player p=e.getPlayer();
    NBTItem item = new NBTItem(p.getItemInHand());
    Entity en=getNearestEntityInSight(p,5);
    if(e.getAction()==Action.RIGHT_CLICK_AIR && en instanceof Player) p.sendMessage("You have rightclicked a player.");
    else p.sendMessage("You didn't hit anyone with your spell");
}

public static Entity getNearestEntityInSight(Player player, int range) {
    ArrayList<Entity> entities = (ArrayList<Entity>) player.getNearbyEntities(range, range, range);
    ArrayList<Block> sightBlock = (ArrayList<Block>) player.getLineOfSight(null, range);
    ArrayList<Location> sight = new ArrayList<Location>();
    for (int i = 0;i<sightBlock.size();i++)
        sight.add(sightBlock.get(i).getLocation());
    for (int i = 0;i<sight.size();i++) {
        for (int k = 0;k<entities.size();k++) {
            if (Math.abs(entities.get(k).getLocation().getX()-sight.get(i).getX())<1.3) {
                if (Math.abs(entities.get(k).getLocation().getY()-sight.get(i).getY())<1.5) {
                    if (Math.abs(entities.get(k).getLocation().getZ()-sight.get(i).getZ())<1.3) {
                        return entities.get(k);
                    }
                }
            }
        }
    }
    return null;
}

即使它有效,但我认为这不是最佳答案,因为应该有一个事件可以检查玩家是否右击或至少左击了另一个玩家。 getNearestEntitySight 方法在玩家的视线中找到最近的实体。我使用PlayerInteractEvent将它与我的代码结合起来,当玩家右键单击时运行。

【讨论】:

  • 对我来说似乎过于复杂了;我真的没有看到使用PlayerInteractEvent 代替PlayerInteractEntityEvent 的意义。
  • @AscendedKitten PlayerInteractEntityEvent 不适用于玩家;它只适用于暴徒。
【解决方案2】:

试试这个:

@EventHandler
public void onPlayerInteractEntity(final PlayerInteractAtEntityEvent e) {
    final Player p = e.getPlayer();
    if (e.getRightClicked() instanceof Player) {
        final Player clicked = (Player) e.getRightClicked();
        // DO STUFF
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-30
    • 1970-01-01
    • 2016-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-28
    • 2022-01-14
    相关资源
    最近更新 更多