Разработка плагина Spigot - вычесть переменную, когда игрок умирает

Я хочу сделать плагин, который считает жизни игроков. Например, у каждого игрока 3 жизни. Каждый раз, когда он умирает, он теряет 1 жизнь. Когда он достигает 0 жизней, его забанят.

Мой метод выглядит так

public class OnPlayerDeath implements Listener {

    private int lives = 3;

    @EventHandler
    public void OnDeath(PlayerDeathEvent event){
        Player player = event.getEntity().getPlayer();
        if (!(player.getKiller() instanceof Player)) 
            player.sendMessage("Died by a something else. You have " + lives + " lives left.");
        else {
            player.sendMessage("Died by a human. You have " + lives + " lives left.");
            lives--;
        }
    }
}

Проблема в том, что всякий раз, когда игрок умирает, в сообщении все время отображается одна и та же переменная «3». Как это исправить?


person Kasjan    schedule 03.12.2019    source источник
comment
Вы создаете new OnPlayerDeath() каждый раз, когда вызывается OnDeath()? вы также уменьшаете lives только в блоке else, это нарочно? В любом случае, я думаю, что lives должен быть частью Player, а не в другом классе, который, вероятно, не должен быть классом в любом случае.   -  person Guy    schedule 03.12.2019


Ответы (1)


Вам нужно будет сохранить количество жизней для каждого игрока.

Попробуйте использовать HashMap

Например:

public class OnPlayerDeath implements Listener {

// Make new HashMap
private Map<Player, Integer> livesMap = new HashMap<>();

@EventHandler
public void OnDeath(PlayerDeathEvent event){
    Player player = event.getEntity().getPlayer();

    int lives;

    if(!livesMap.containsKey(player)) {
        // Set the default amount of lives to 2. (3 minus 1, since the player already died once)
        lives = 2;
    } else {
        // Subtract one from the player's lives
        lives = livesMap.get(player) - 1;  
    }

    if (!(player.getKiller() instanceof Player)) {
        player.sendMessage("Died by a something else. You have " + lives + " lives left.");
    } else {
        player.sendMessage("Died by a human. You have " + lives + " lives left.");
    }

    // Update new life count
    livesMap.put(player, lives);
}

}

HashMap позволяет сохранить значение для каждого ключа. В этом случае количество жизней для каждого игрока.

person Community    schedule 03.12.2019
comment
Но если у вас есть, например, 1 жизнь, то снова подключитесь, у вас снова будет 2 жизни. Как это исправить? Может быть, какой-нибудь конфигурационный файл для хранения целых чисел? - person Kasjan; 03.12.2019
comment
Жизни игрока останутся сохраненными до тех пор, пока вы не перезапустите или не перезагрузите сервер. Если вы хотите сохранить жизни, вам нужно будет записать данные в файл, когда сервер выключится. (onDisable()) и вы должны читать данные при подключении плеера. Предлагаю вам ознакомиться с FileConfiguration в Bukkit. Если вам нужна помощь, задайте другой вопрос. - person ; 03.12.2019