IExtendedEntityProperties и куча матов.

svk

1,185
3
Что делает эта е******я х***я?

Читал туториалы, что там за п***ц творится так и не понял.


Код:
player.registerExtendedProperties("GunData", new GunData(player)); 

Значит, оно добавляет экземпляр класса GunData с названием GunData в player?
Это, обратно вытаскивает этот экземпляр.
Код:
(GunData) player.getExtendedProperties("GunData");

Получается, надо всего-лишь создать объект класса GunData и записать в него переменные?
Зачем там методы saveNBTData, loadNBTData, init?
 
svk написал(а):
Получается, надо всего-лишь создать объект класса GunData и записать в него переменные?
Зачем там методы saveNBTData, loadNBTData, init?
1) да
2) чтобы сохранять эти данные в нбт игрока
3) чтобы грузить эти данные из нбт игрока
4) чтобы инициализировать (вызывается при создании энтити), толку мало, то же самое можно в конструкторе сделать обычно
 
Ну, получается надо сделать так:
Код:
GunData gunData = new GunData();
gunData.reload = 5;
player.registerExtendedProperties("GunData", gunData); 
//Теперь вытаскиваем
GunData gunData = (GunData) player.getExtendedProperties("GunData");
System.out.println(gunData.reload);

М?
 
Ам, надо делать так?
Создавать в GunData.class переменную НБТ.
С помощью этих методов ею оперировать, а потом просто достать НБТ и там будут наши данные?
Зачем всё так усложнили-то?
 
Потому что НБТ - это неудобно и потому что ты в нбт не можешь записать произвольный объект. Если нужна только запись в НБТ, то вместо IExtendedEntityProperties можно юзать просто entity.getEntityData(). Получишь нбт тег, привязанный к сущности (как со стаками)
 
GloomyFolken написал(а):
Потому что НБТ - это неудобно и потому что ты в нбт не можешь записать произвольный объект. Если нужна только запись в НБТ, то вместо IExtendedEntityProperties можно юзать просто entity.getEntityData(). Получишь нбт тег, привязанный к сущности (как со стаками)
Хм, а как установить дату ентити?
[merge_posts_bbcode]Добавлено: 30.03.2015 22:22:16[/merge_posts_bbcode]

Пойду напишу туториал, а то такой ужас наделали в других.
 
Что за дата энтити?
[merge_posts_bbcode]Добавлено: 30.03.2015 23:37:14[/merge_posts_bbcode]

А, entityData :D
Чо ее устанавливать, entity.getEntityData() все тебе как надо вернет
 
Код:
NBTTagCompound mainTag = entity.getEntityData();
if (!tag.hasKey("modTag")) tag.setTag("modTag", new NBTTagCompound());
NBTTagCompound modTag = tag.getCompoundTag("modTag");
modTag.setInt("someInt", 123);
int someInt = modTag.getInt("someInt");
 
GloomyFolken написал(а):
Код:
NBTTagCompound mainTag = entity.getEntityData();
if (!tag.hasKey("modTag")) tag.setTag("modTag", new NBTTagCompound());
NBTTagCompound modTag = tag.getCompoundTag("modTag");
modTag.setInt("someInt", 123);
int someInt = modTag.getInt("someInt");
М? Совсем не понял что вы тут делаете.
Зачем мы записываем в него ещё 1 НБТ? 
Не проще оперировать сразу с tag? (Я так понял tag это mainTag)
 
Можно, но нехорошо так делать, потому что можно пересечься в названиях с другими модами. Кстати, туда же можно записывать информацию, которая не пропадает при смерти. Нужно создать тег с названием, которое записано в константе PLAYER_PERSISTED (или как-то так), и записывать данные туда. Тег с этим названием при смерти копируется.
 
Создавай свой нбт и добавляй его к ранее существующему под своим именем.MODID сойдёт.Другой вопрос.А надо приписывать ник игрока?
 
Советую вместо того, чтобы создавать новое поле в nbt мод каждое значение, лучше сделать новый объект и туда писать все переменные. А в нбт записывать сериализованный массив байтов твоего объекта с переменными.
 
В туторе они выглядят вот так:
Код:
@Override
public void saveNBTData(NBTTagCompound compound)
{

     NBTTagCompound properties = new NBTTagCompound();

     properties.setInteger("CurrentMana", this.currentMana);
     properties.setInteger("MaxMana", this.maxMana);

     compound.setTag(EXT_PROP_NAME, properties);
}

@Override
public void loadNBTData(NBTTagCompound compound)
{
     NBTTagCompound properties = (NBTTagCompound) compound.getTag(EXT_PROP_NAME);

     this.currentMana = properties.getInteger("CurrentMana");
     this.maxMana = properties.getInteger("MaxMana");
}
Эти методы вызываются при заходе/выходе с мира?
Получается, cmpound это "системное" НБТ для сохранения параметров?
[merge_posts_bbcode]Добавлено: 31.03.2015 13:26:58[/merge_posts_bbcode]

Или если я буду, прям объекте изменять переменные, они сохранятся, без этих методов?
 
svk написал(а):
В туторе они выглядят вот так:
Код:
@Override
public void saveNBTData(NBTTagCompound compound)
{

     NBTTagCompound properties = new NBTTagCompound();

     properties.setInteger("CurrentMana", this.currentMana);
     properties.setInteger("MaxMana", this.maxMana);

     compound.setTag(EXT_PROP_NAME, properties);
}

@Override
public void loadNBTData(NBTTagCompound compound)
{
     NBTTagCompound properties = (NBTTagCompound) compound.getTag(EXT_PROP_NAME);

     this.currentMana = properties.getInteger("CurrentMana");
     this.maxMana = properties.getInteger("MaxMana");
}
Эти методы вызываются при заходе/выходе с мира?
Получается, cmpound это "системное" НБТ для сохранения параметров?
[merge_posts_bbcode]Добавлено: 31.03.2015 13:26:58[/merge_posts_bbcode]

Или если я буду, прям объекте изменять переменные, они сохранятся, без этих методов?
Почитай побольше из того тутора, там объясняется в какой момент происходит вызов этих методов
 
Эти методы вызываются при загрузке/сохранении энтити. compound - общее нбт всех IExtendedEntityProperites энтити.
 
Dragon2488 написал(а):
Эти методы вызываются при загрузке/сохранении энтити. compound - общее нбт всех IExtendedEntityProperites энтити.
Понятно, то-есть объект удалится, останется лишь НБТ? Или как? Получается нам надо создавать объект самим в евенте onEntityConstructing?
 
Назад
Сверху