1. Этот сайт использует файлы cookie. Продолжая пользоваться данным сайтом, Вы соглашаетесь на использование нами Ваших файлов cookie. Узнать больше.
  2. Вы находитесь в сообществе Rubukkit. Мы - администраторы серверов Minecraft, разрабатываем собственные плагины и переводим на различные языки плагины наших коллег из других стран.
    Скрыть объявление
Скрыть объявление
В преддверии глобального обновления, мы проводим исследования, которые помогут нам сделать опыт пользования форумом ещё удобнее. Помогите нам, примите участие!

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

Тема в разделе "Разработка плагинов для новичков", создана пользователем Aviloo, 6 янв 2022.

  1. Автор темы
    Aviloo

    Aviloo Активный участник Пользователь

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

    NuaN Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    NuaN
    Для такого нужно использовать контейнер 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 при выключении сервера и загружать из файла при запуске сервера.
     
  3. kainlight

    kainlight Новичок

    Баллы:
    16
    А если без конфига? К примеру создать второй hashmap и при выходе загружать туда его значение.
    Ну допустим мне нужно при подключении присвоить игроку 0, но не каждый раз, а если у игрока нет ничего. как ты и написал. вроде playersData.getOrDefault(p, 0);, а при выходе сохранять в playersDataSave и при входе возвращать это значение из playersDataSave в PlayersData, а значит ошибки не будет и данные сохранятся. Это так работать будет?
     
  4. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    Без конфигов.
    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);
     
  5. kainlight

    kainlight Новичок

    Баллы:
    16
    После рестарста сбрасывается? Если нет, то где хранится?
     
  6. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    В файле игрока храниться.
     
  7. Dymeth

    Dymeth Активный участник Пользователь

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    В папке основного мира в playerdata
     
  8. kainlight

    kainlight Новичок

    Баллы:
    16
    Удобненько
     
  9. Zuif

    Zuif Активный участник Пользователь

    Баллы:
    76
    без конфига можно хранить в бдшке любой
     
  10. NuaN

    NuaN Активный участник Пользователь

    Баллы:
    96
    Имя в Minecraft:
    NuaN
    Ух ты, не знал, про такую вещь) Реально удобно, спасибо :good:
     
  11. Galster

    Galster Активный участник Пользователь

    Баллы:
    61
    Имя в Minecraft:
    GalsterMC
    Разве это не кусок нбт? Не удаляется при смерти?
     
  12. alexandrage

    alexandrage Старожил Пользователь

    Баллы:
    173
    Ты с чем то путаешь, контейнеры это постоянные записи.
     
  13. Dymeth

    Dymeth Активный участник Пользователь

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    Это кусок нбт, и именно поэтому он способен храниться на диске.
    Раньше в ядре не было этих persistent контейнеров, поэтому все кастомные теги удалялись ядром. Собственно, так происходит и сейчас, но за исключением persistent-контейнера, уже внутри которого лежат твои кастомные данные. Данный контейнер не удаляется, а сохраняется на диск. Поэтому и называется он persistent.

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

    kainlight Новичок

    Баллы:
    16
    думетх, ты ли это на самом деле)
     
  15. Dymeth

    Dymeth Активный участник Пользователь

    Баллы:
    98
    Имя в Minecraft:
    Dymeth
    А есть сомнения?
     
  16. kainlight

    kainlight Новичок

    Баллы:
    16
    не ожидал тебя тут увидеть просто
     

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