2014-04-05 115 views
1

我在开发Bukkit插件时遇到数组问题。为什么这不起作用?它应该检查玩家是否已经放置了该块。它不断说“钻石!!”在游戏中。与阵列问题

@EventHandler 
public void OnPlaceofDiamond(BlockPlaceEvent e){ 
    Player player = e.getPlayer(); 
    String storage[] = new String[100]; 
    int i = 0; 

    if(e.getBlock().getType() == Material.DIAMOND_BLOCK){ 
     if(Arrays.asList(storage).contains(player.getName())){ 
      player.sendMessage(ChatColor.BLUE + "You are on the list"); 
     }else{ 
      player.sendMessage(ChatColor.BLUE + "DIAMONDS!!"); 
      storage[i] = player.getName(); 
      i++; 
     } 
    } 
} 
+0

你给总会玩家名称添加到存储[0],因为每次调用该方法,'存储[i] =播放器代码.getName()'总是让我成为0.这是否可以覆盖你想检查的玩家名字? – LadyBernkastel

+0

为什么你甚至会使用一个数组来达到这个目的,当像LinkedList这样的东西同样适用时(并且你不会每次都把它转换成一个列表) – Rogue

回答

0

这是因为你的每一个玩家放置一个块的时间创建一个新的storage数组:

@EventHandler 
public void OnPlaceofDiamond(BlockPlaceEvent e){ 
    Player player = e.getPlayer(); 
    String storage[] = new String[100]; 

所以你永远不会有完整的球员名单。为了解决这个问题,您应该声明你的方法的Array外:

String storage[] = new String[100]; 

@EventHandler 
public void OnPlaceofDiamond(BlockPlaceEvent e) { 
    Player player = e.getPlayer(); 
    int i = 0; 

    if(e.getBlock().getType() == Material.DIAMOND_BLOCK){ 
     if(Arrays.asList(storage).contains(player.getName())){ 
      player.sendMessage(ChatColor.BLUE + "You are on the list"); 
     } 
     else{ 
      player.sendMessage(ChatColor.BLUE + "DIAMONDS!!"); 
      storage[i] = player.getName(); 
      i++; 
     } 
    } 
} 
0

你的问题是,每次BlockPlaceEvent事件被调用时,将创建一个全新的storage阵列。如果你想storage不要在每次事件调用重新创建,你必须把它像这样的方法声明之外:

String storage[] = new String[100]; 

@EventHandler 
public void OnPlaceofDiamond(BlockPlaceEvent e) { 
    Player player = e.getPlayer(); 
    int i = 0; 
    //The rest of your code below 
}