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

Помогите Хранение дополнительных данных для Entity

Тема в разделе "Разработка плагинов для новичков", создана пользователем DPOH-VAR, 21 янв 2013.

  1. Автор темы
    DPOH-VAR

    DPOH-VAR Старожил Пользователь

    Баллы:
    153
    Skype:
    dpohvar
    Добрый день!
    У меня возникла такая проблема:
    требуется хранить дополнительные данные для некоторых мобов. Например, измененную силу атаки или информацию о выпадающем луте. Каким образом это лучше сделать?
    Вариант с Metadatable очень хорош, но, к сожалению, не подходит, т.к. метадата хранит данные только пока сервер работает. После перезапуска сервера метадата пуста.
    Если все данные писать в базу данных (или любое другое хранилище) - возможно появление "мертвых хвостов". Т.е. моб уже давно не существует, а информация о нем занимает место в базе данных.
    Наилучшим образом подходит формат NBT, т.к. он сохраняет все данные прям в карту. Но для того, чтоб позволить сохранить хотя бы один нестандартный тег - нужно править исходники CraftBukkit. (Кстати, ItemStack позволяют сохранять кастомный тег - это их огромное преимущество. Там можно хранить цену предмета, кастомные способности, и т.д.)
    Есть идеи?
     
  2. Автор темы
    DPOH-VAR

    DPOH-VAR Старожил Пользователь

    Баллы:
    153
    Skype:
    dpohvar
    Ап. неужели никто не сталкивался с этим?
     
  3. Dereku

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

    Баллы:
    173
    Skype:
    derek_unavailable
    Имя в Minecraft:
    _Dereku
    кхм... конечно, извиняюсь, но с сайтом ошибся... тут в таком тебе вряд ли помогут...
    можно сделать Metadatable + db - данные хранить при онлайне в Metadatable, а когда он выключается, все это дело в db. в принципе это мой вариант, незнающего о java почти ничего :D
     
  4. Date

    Date Активный участник

    Баллы:
    63
    Имя в Minecraft:
    TheCaptainDate
    Хм.. Когда я делал подобную фишку для блоков, я банально записывал в бд координаты и значение, а потом считывал. Это конечно НАИТУПЕЙШИЙ из возможных вариантов, но все-же... можно приписывать данные по координатам мобов.

    Теперь серьезно: самый лучший способ - создать функции сериализации и десериализации твоих кастомных мобов. Т.е. при выключении сервера / добавлении нового касомного крипа / раз в n минут сервер будет вызывать функцию, которая будет брать Хешмапу и сериализовывать ее, но перед сериализацией нужно прогонять циклом, и проверять - существует-ли этот моб, и действительно-ли под данным айдишником именно тот моб (я имею ввиду, делать проверку на то, чтобы этот ид не занял моб другого класса - например, чтобы заместо скелета не появился крипер). Это не гарантирует 100% вероятность того, что эти твои модификаторы не будут применяться к случайным крипам, но как минимум гарантирует, что модификаторы не будут применены к другом классу. Если хочешь 100% вероятность - ставь проверку на ивенте смерте моба. Если id моба содержится в ключе хеш-карты - удаляем его от туда. Но это лишняя нагрузка.
     

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