在此实例中更正“for”用法

时间:2014-03-07 22:40:23

标签: java api minecraft bukkit

如果我想要获取玩家的位置并将其传送到Bukkit预定任务中,for (Player p : )的正确用法是什么?它在使用:时给了我一个不明错误,我认为我需要将语句的重置连接在一起,但可能还有另一种方法。虽然这是与Minecraft Bukkit相关的问题,但我相信这里有人可以帮助我。

当前代码:

private void teleporter()
  {
    if (getConfig().getBoolean("teleport")) {
      Bukkit.getScheduler().scheduleSyncRepeatingTask(this,
        new Runnable()
        {
          public void run() {
            for (Player p : ) {
              if (p.getLocation().getY() <= 0.0D)
              {
                p.teleport(NoVoid.spawnLocation);
                p.setFallDistance(0.0F);
              }
            }
          }
        }, 0L, 100L);
    }
  }

感谢任何帮助!

更新

Rusher和rgettman有正确的想法。不得不添加Bukkit.getServer().getOnlinePlayers()来获取所有在线玩家(必须将其连接到列表)。

1 个答案:

答案 0 :(得分:2)

拿你的代码:

for (Player p : ) {
    if(p.getLocation().getY() <= 0.0D)
        p.teleport(NoVoid.spawnLocation);
        p.setFallDistance(0.0F);
}

如果你用英语阅读,听起来应该是这样的:

  • 对于每个玩家,如果该玩家的y坐标小于或等于零,则将玩家传送回产卵。它们不会造成坠落伤害。

你看到明显的语法错误吗?对于 WHAT 中的每位玩家?如果你想说“对于球员名单中的每个球员”。这可能是这样的:

for (Player p : listOfPlayersInTheGame) {

变量listOfPlayersInTheGame必须是玩家的集合。有效示例包括但不限于:

  • List<Player>
  • Player[]
  • ArrayList<Player>
  • LinkedList<Player>

另一方面,我认为你不希望你的传送器传送服务器上的所有玩家。你可能只想抓住目前站在传送器上的球员。您可以通过获取它们的位置和传送器在x,y和z平面中的位置之间的差异来实现。显然有一些容忍度,所以如果差异小于1块,我们很高兴。例如(伪代码):

for each player p in list:
    if Math.abs(p.x - teleporter.x) < 1:
        if(Math.abs(p.y - teleported.y) < 1):
            if(Math.abs(p.z - teleported.z) < 1):
                // They must be standing on the teleporter!
                p.teleport(spawn)