Войти или зарегистрироваться
  • Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.

Помогите Как присвоить переменную типа int игроку

Aviloo

Активный участник
Пользователь
Баллы
61
Имя в Minecraft
Aviloo
Здравствуйте, форумчане. Помогите пожалуйста советом , как можно привязать переменную типа int игроку . При этом у всех игроков она должна изменяться . Например: Игрок сломал какой-нибудь блок и ему зачислелось , допустим, 10 очков . И было б неплохо , если вы подсказали бы , как сделать так , чтобы переменная не сбрасывалась после рестатрта сервера. Заранее ,спасибо!
 
Помогите пожалуйста советом , как можно привязать переменную типа int игроку

Для такого нужно использовать контейнер Map, который хранит две переменные: 1 - ключ (Игрок), 2 - значение для этого ключа.

Объявляешь где-то этот контейнер вот так:
Код:
private static final ConcurrentHashMap<Player, Integer> playersData = new ConcurrentHashMap<>();

Вот так добавлять определенное количество очков игроку:
Код:
public static void addValue(Player p, int value) {
        playersData.putIfAbsent(p, playersData.getOrDefault(p, 0) + value);
    }

Вот так получать значение очков у игрока (если игрок ничего еще не делал, т.е. есть нет в Map, то будет возвращено значение 0):
Код:
public static void getValue(Player p) {
    playersData.getOrDefault(p, 0);
}

чтобы переменная не сбрасывалась после рестатрта сервера
Сохранять в файл данные из Map при выключении сервера и загружать из файла при запуске сервера.
 
Для такого нужно использовать контейнер Map, который хранит две переменные: 1 - ключ (Игрок), 2 - значение для этого ключа.

Объявляешь где-то этот контейнер вот так:
Код:
private static final ConcurrentHashMap<Player, Integer> playersData = new ConcurrentHashMap<>();

Вот так добавлять определенное количество очков игроку:
Код:
public static void addValue(Player p, int value) {
        playersData.putIfAbsent(p, playersData.getOrDefault(p, 0) + value);
    }

Вот так получать значение очков у игрока (если игрок ничего еще не делал, т.е. есть нет в Map, то будет возвращено значение 0):
Код:
public static void getValue(Player p) {
    playersData.getOrDefault(p, 0);
}


Сохранять в файл данные из Map при выключении сервера и загружать из файла при запуске сервера.
А если без конфига? К примеру создать второй hashmap и при выходе загружать туда его значение.
Ну допустим мне нужно при подключении присвоить игроку 0, но не каждый раз, а если у игрока нет ничего. как ты и написал. вроде playersData.getOrDefault(p, 0);, а при выходе сохранять в playersDataSave и при входе возвращать это значение из playersDataSave в PlayersData, а значит ошибки не будет и данные сохранятся. Это так работать будет?
 
Здравствуйте, форумчане. Помогите пожалуйста советом , как можно привязать переменную типа int игроку . При этом у всех игроков она должна изменяться . Например: Игрок сломал какой-нибудь блок и ему зачислелось , допустим, 10 очков . И было б неплохо , если вы подсказали бы , как сделать так , чтобы переменная не сбрасывалась после рестатрта сервера. Заранее ,спасибо!
Без конфигов.
player.getPersistentDataContainer().set(new NamespacedKey(this.plugin, "int"), PersistentDataType.INTEGER, 1);
player.getPersistentDataContainer().get(new NamespacedKey(this.plugin, "int"), PersistentDataType.INTEGER);
player.getPersistentDataContainer().has(new NamespacedKey(this.plugin, "int"), PersistentDataType.INTEGER);
 
Без конфигов.
player.getPersistentDataContainer().set(new NamespacedKey(this.plugin, "int"), PersistentDataType.INTEGER, 1);
player.getPersistentDataContainer().get(new NamespacedKey(this.plugin, "int"), PersistentDataType.INTEGER);
player.getPersistentDataContainer().has(new NamespacedKey(this.plugin, "int"), PersistentDataType.INTEGER);
После рестарста сбрасывается? Если нет, то где хранится?
 
без конфига можно хранить в бдшке любой
 
Разве это не кусок нбт? Не удаляется при смерти?
Это кусок нбт, и именно поэтому он способен храниться на диске.
Раньше в ядре не было этих persistent контейнеров, поэтому все кастомные теги удалялись ядром. Собственно, так происходит и сейчас, но за исключением persistent-контейнера, уже внутри которого лежат твои кастомные данные. Данный контейнер не удаляется, а сохраняется на диск. Поэтому и называется он persistent.

Причем этот контейнер появился не только у Entity, но и, например, у World, Chunk и ItemStack.
Таким образом, в них теперь тоже можно сохранять собственную информацию, и она никуда не потеряется даже при перезапуске сервера
 
Это кусок нбт, и именно поэтому он способен храниться на диске.
Раньше в ядре не было этих persistent контейнеров, поэтому все кастомные теги удалялись ядром. Собственно, так происходит и сейчас, но за исключением persistent-контейнера, уже внутри которого лежат твои кастомные данные. Данный контейнер не удаляется, а сохраняется на диск. Поэтому и называется он persistent.

Причем этот контейнер появился не только у Entity, но и, например, у World, Chunk и ItemStack.
Таким образом, в них теперь тоже можно сохранять собственную информацию, и она никуда не потеряется даже при перезапуске сервера
думетх, ты ли это на самом деле)
 

Поделиться этой страницей

Назад
Верх