Проблема с массивами

У меня возникла проблема с массивом при разработке плагина 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++;
        }
    }
}

person user3501676    schedule 05.04.2014    source источник
comment
Код, который вы даете, всегда будет добавлять имя игрока в хранилище [0], потому что каждый раз, когда вы вызываете метод, storage[i] = player.getName() всегда имеет i равным 0. Может ли это перезаписывать имена игроков, которые вы хотите проверить?   -  person LadyBernkastel    schedule 05.04.2014
comment
Почему вы даже используете массив для этой цели, когда что-то вроде LinkedList будет работать так же хорошо (и вы не будете каждый раз преобразовывать его в список)   -  person Rogue    schedule 18.02.2015


Ответы (2)


Это потому, что вы создаете новый массив 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++;
        }
    }
}
person Jojodmo    schedule 05.04.2014

Ваша проблема в том, что каждый раз, когда вызывается событие 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
}
person kabb    schedule 05.04.2014