IAttribute & DataWatcher/DataManager

IAttribute & DataWatcher/DataManager

243
28
202
AustereTony добавил(а) новый ресурс:

IAttribute & DataManager - Добавление собственных свойств для игроков стандартными средствами.

Здравствуйте. В этом туториале речь пойдёт об атрибутах и менеджере данных, которые используются для реализации свойств сущностей, о том как они применяются в игре и продемонстрирую создание собственного свойства для игрока, аналогичного запасу здоровья или опыта. Рассмотренный здесь пример доступен в моём репозитории: 1.12.2.

Для версии 1.7.10 туториал будет дописан в ближайшее время....​

Узнать больше об этом ресурсе...
 
5,018
47
783
ну и в чем отличие от капы?
 
476
9
39
ну и в чем отличие от капы?
Вроде автоматом синхронизируется? Но да мне тоже интересно в чём отличие. Насколько я знаю капа юзается для инвентаря и через атрибут её так просто не реализуешь, если только костылями... upd. кажется и это можно)

Тогда великий вопрос в чём разница? Этот способ быстрее или лучше?
Довольно таки интересная тема)
 
476
9
39
Извините, я идиотo_O(не заметил, так заинтересовался чем-то новым, что сразу к главному полез)
На атрибутах и менеджере данных строится ванильная система свойств сущностей и у нас есть возможность использовать её для своих нужд. Преимущества - это проще настройки Capability и нет необходимости использовать пакетную систему для синхронизации с клиентом.
Пс-пс, парни открою великий секрет который я не знал и реализовал сам не изучив всего кода.
В игре в utils УЖЕ есть готовая боевая система (аля находится ли тот или иной entity в бою О_оооо)
 

Eifel

Модератор
1,623
78
608
Не только для инвентаря, например если полно всяких переменных, то лучше сделать КАПу с пакетной системой, чем создавать много разных атрибутов
 
243
28
202
Вот вам кратко суть, если есть вопросы:

Атрибут не более чем фиксированное число. Его можно использовать только как потолок для какого то свойства (прим.: макс. здоровье, макс. скорость, макс. мана), может синхронизироваться с клиентом. Атрибут сам по себе не подходит для изменяемых свойств (он фиксирован), позволяет лишь задать их макс. значение. Можно изменить значение модификаторами.

Сами изменяемые значения (прим.: текущий запас здоровья) реализуются через DataManager (бывший DataWatcher), который позволяет управлять ими и синхронизирует их с клиентом. Игра использует эту систему для всех часто изменяемых параметров сущностей. Значения менеджера данных можно использовать совместно с атрибутами (менеджер - текущее значение, атрибут - максимальное), а можно и без них.

Capability вообще не связаны ни с атрибутами ни с менеджером данных, это чисто форджевская приблуда для кастомных свойств, однако DataManager можно использовать для синхронизации данных Capability.

DataManager отлично подойдёт, если нужно добавить одно свойство (255 ячеек, только 16 заняты (для игрока)) ибо зачем ради этого тащить КАПу и пакетную систему. При этом он может управлять множеством типов данных (Числа, Стаки, NBT и т.д.) и можно добавлять свои. Однако если у вас десятки параметров и инвентарь до кучи, то проще наверное всё собрать в Capability (хотя не факт).
 

Eifel

Модератор
1,623
78
608
Я например стараюсь избегать стороной какие-то методы, где есть ограниченное кол-во чего-то, да бы потом не возникало конфликтов с другими модами, если их много в сборке. А если альтернативы нету - пишу свое. Если провести аналогию с PotionEffect, то я написал свою систему, тут же с DataManager - выбираю Capability ибо там точно уверен, что будет свободное место
 
243
28
202
да бы потом не возникало конфликтов с другими модами
В случае с DataManager конфликтов не возникнет, так как factory метод инициализации значения DataParameter сам подберёт свободную ячейку (идентификатор). Конечно, если моды займут все ячейки, то будут проблемы, но это уже другой разговор...
 
476
9
39
Интересно, как адекватно инвентарь синхронизировать?
Чувствую мой метод говно. Юзаю просто setItem(что-то такое).
И по сути за раз по одному пакету? Как адекватнее?
 
2,505
81
397
Контейнер может его синхронить. Ну или можешь написать пакет, который разом отправит весь инвентарь.
 
476
9
39
243
28
202
1,159
38
544
Вот у меня есть вопросец про DataWatcher. Как я понял из мануала, его задача - чекать изменения в атрибутах и отправлять эти изменения на клиент. Но вот только синхронизация происходит и без регистрации в DataWatcher'е (см EntityTrackerEntry#sendMetadataToAllAssociatedPlayers()).

Так зачем нужен-то DataWatcher? И как устранять возможные конфликты ID? Выносить их в конфиг?
 

tox1cozZ

aka Agravaine
8,454
598
2,890
Смысле? Если ты не зарегаешь свою переменную в датавотчере, то при ее получении из него тебе эксепшн кинет.
Атрибуты != DataWatcher. Обычно атрибуты юзают для каких-то значений, которые не меняются часто(максимальное хп, урон и тд). Датавотчер же нужен для постоянных изменений.

И как устранять возможные конфликты ID? Выносить их в конфиг
О каких конфликтах речь? В 1.12 айдишники вообще сам генерируются, там ты никак не попадешь на коллизию. А в 1.7.10 и ниже датавотчер стоит юзать только для своих энтити. В игрока вообще не стоит их совать, ибо их может быть только 32 штуки, половина из которых уже занята майном.
 
Сверху