Нешаблонный NBT

Версия Minecraft
1.7.10
API
Forge

VeniVidiVici

Санта Барбарис
327
15
198
Доброго времени суток. Немного подтупливаю под вечер, поэтому хочу спросить совета сограждан.

У меня есть Set состоящий из классов А, которые в свою очередь содержат String, int, int.
Мне нужно обернуть этот Set в toByte / fromByte для отправки пакета, но я тут несколько подзавис.

Появилось предположение, что я могу сделать в этом классе А метод по типу writeToNBT / readToNBT, и в дальнейшем вызывать их при записи всего Set для каждого элемента. Но на этом этапе я как раз и поплыл, как именно обернуть это в BaseTag / CompoundTag , чтобы получилось корректно? Помогите, пожалуйста, разобраться.

Или может есть какой-то более грамотный подход для передачи такой конструкции?
 
Решение
Я так и не понял, тебе нужно отправить пакет с этим Set или записать в NBTTagCompound?
В пакет:
Java:
void writePacketData(ByteBuf buf){
    buf.writeInt(mySet.size());
    for(MyObject obj : mySet){
        buf.writeInt(obj.myInt);
        buf.writeByte(obj.myByte);
        ...
    }
}

void readPacketData(ByteBuf buf){
    int count = buf.readInt();
    mySet = new HashSet<MyObject>();
    for(int i = 0; i < count; i++){
        mySet.add(new MyObject(buf.readInt(), buf.readByte(), ...));
    }
}
В NBT:
Java:
void writeToTag(NBTTagCompound nbt){
    NBTTagList tagList = new NBTTagList();
    for(MyObject obj : mySet){
        NBTTagCompound tagObj = new NBTTagCompound();
        tagObj.setInteger("myInt", obj.myInt)...

tox1cozZ

aka Agravaine
8,455
598
2,892
Я так и не понял, тебе нужно отправить пакет с этим Set или записать в NBTTagCompound?
В пакет:
Java:
void writePacketData(ByteBuf buf){
    buf.writeInt(mySet.size());
    for(MyObject obj : mySet){
        buf.writeInt(obj.myInt);
        buf.writeByte(obj.myByte);
        ...
    }
}

void readPacketData(ByteBuf buf){
    int count = buf.readInt();
    mySet = new HashSet<MyObject>();
    for(int i = 0; i < count; i++){
        mySet.add(new MyObject(buf.readInt(), buf.readByte(), ...));
    }
}
В NBT:
Java:
void writeToTag(NBTTagCompound nbt){
    NBTTagList tagList = new NBTTagList();
    for(MyObject obj : mySet){
        NBTTagCompound tagObj = new NBTTagCompound();
        tagObj.setInteger("myInt", obj.myInt);
        tagObj.setByte("myByte", obj.myByte);
        ...
        tagList.appendTag(tagObj);
    }
    nbt.setTag("mySet", tagList);
}

void readFromTag(NBTTagCompound nbt){
    mySet = new HashSet<MyObject>();
    NBTTagList tagList = nbt.getTagList("mySet", NBT.TAG_COMPOUND);
    for(int i = 0; i < tagList.tagCount(); i++){
        NBTTagCompound tagObj = tagList.getCompoundTag(i);
        mySet.add(new MyObject(tagObj.getInteget("myInt"), tagObj.getByte("myByte")));
    }
}
 

VeniVidiVici

Санта Барбарис
327
15
198
Спасибо!

отправить пакет

Вот так сделать корректно, если сетов несколько?
Пакет:
    @Override
    public void fromBytes(ByteBuf buffer) {
        readFromNBT(buffer, set1);
        readFromNBT(buffer, set2);
        ....
    }

    @Override
    public void toBytes(ByteBuf buffer) {
        writeToNBT(buffer, set1);
        writeToNBT(buffer, set2);
        ...
    }

    public void writeToNBT(ByteBuf buf, Set set) {
        buf.writeInt(set.size());
        for(Object obj : set){
            ByteBufUtils.writeUTF8String(buf, ((MyClass)obj).par1);
            buf.writeInt(((MyClass)obj).par2);
            buf.writeInt(((MyClass)obj).par3;
        }
    }
    
    public void readFromNBT(ByteBuf buf, Set set) {
        int count = buf.readInt();
        set = new HashSet<MyClass>();
        for(int i = 0; i < count; i++){
            set.add(new MyClass(ByteBufUtils.readUTF8String(buf), buf.readInt(), buf.readInt()));
        }
    }
 
Сверху