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

Помогите Проблемы с преобразованием String[] в примитивный тип

Тема в разделе "Разработка плагинов для новичков", создана пользователем Energy warrior, 8 авг 2019.

  1. Автор темы
    Energy warrior

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

    Баллы:
    76
    Я хочу с помощью PersistentDataContainer'а хранить масив строк в предмете. Готового типа для масива нет. Я решил сделать свой. Написал всё как в PrimitivePersistentDataType только вместо дженериков юзал String[]. Когда я пытаюсь засунуть массив в предмет. У меня вылетает IllegalArgumentException с жалобой на то, что не может найти валидную имплементацию TagAdapter для запрашиваемого String[].
     
  2. alexandrage

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

    Баллы:
    173
    Ты ее сам должен создать. Оно же не из воздуха сериализует.
     
    Последнее редактирование: 8 авг 2019
  3. Автор темы
    Energy warrior

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

    Баллы:
    76
    То есть не достаточно реализовывать PersistentDataType?
     
  4. alexandrage

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

    Баллы:
    173
    Его тебе и надо реализовать.
     
  5. Автор темы
    Energy warrior

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

    Баллы:
    76
    Так я его и реализовал!
    Код:
    public class StringArrayType implements PersistentDataType<String[], String[]>{
    
        private final Class<String[]> primitiveType;
    
        public StringArrayType() {
            this.primitiveType = String[].class;
        }
    
        
        public Class<String[]> getPrimitiveType() {
            return this.primitiveType;
        }
    
        
        public Class<String[]> getComplexType() {
            return this.primitiveType;
        }
    
        
        public String[] toPrimitive( String[] complex,  PersistentDataAdapterContext context) {
            return complex;
        }
    
        
        public String[] fromPrimitive( String[] primitive,  PersistentDataAdapterContext context) {
            return primitive;
        }
        
        
        


    Я зашёл в сурцы CraftPersistentDataTypeRegistry и заметил странный класс TagAdapter у которого я не могу посмотреть сурцы. Класс, судя по импорту, вложенный. Но в файле его нет. Я нашёл как создать то что мне нужно но я не знаю в какой момент времени вызываются эти классы, да и правильно ли я сделал.
     
    Последнее редактирование: 8 авг 2019
  6. AbstractCoder

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

    Баллы:
    76
    Имя в Minecraft:
    AbstractCoder
    Ну ты глупыш шо ль, те нужно конвертировать из какого-то примитивного типа в массив строк, а не из массива строк в массив строк пздц.
     
  7. Автор темы
    Energy warrior

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

    Баллы:
    76
    Мне в нбт надо хранить масив, и доставать тоже масив!
     
  8. alexandrage

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

    Баллы:
    173
    В nbt нету сериализатора на String[]
     
  9. alexandrage

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

    Баллы:
    173
    Тебе нужно сконвертить в примитив (int, long, double, float, byte, short), примитив массив или строку.
     
  10. Автор темы
    Energy warrior

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

    Баллы:
    76
    Мда. придётся делать свой адаптер!
     
  11. alexandrage

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

    Баллы:
    173
    Код:
    public class ItemTagTypeArray implements PersistentDataType<byte[], String[]> {
    
        @Override
        public Class<byte[]> getPrimitiveType() {
            return byte[].class;
        }
    
        @Override
        public Class<String[]> getComplexType() {
            return String[].class;
        }
    
        @Override
        public byte[] toPrimitive(String[] strings, PersistentDataAdapterContext tag) {
            ByteBuf buf = Unpooled.buffer();
            PacketBuffer pbuf = new PacketBuffer(buf);
            pbuf.writeVarInt(strings.length);
            for (String string : strings) {
                pbuf.writeString(string);
            }
            byte[] bytes = new byte[buf.readableBytes()];
            buf.readBytes(bytes);
            return bytes;
        }
    
        @Override
        public String[] fromPrimitive(byte[] bytes, PersistentDataAdapterContext tag) {
            ByteBuf buf = Unpooled.buffer();
            PacketBuffer pbuf = new PacketBuffer(buf);
            pbuf.writeBytes(bytes);
            int length = pbuf.readVarInt();
            List<String> tmp = new ArrayList<String>();
            for (int i = 0; i < length; i++) {
                tmp.add(pbuf.readString(256));
            }
            return tmp.toArray(new String[] {});
        }
    }
     
  12. alexandrage

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

    Баллы:
    173
    Сам nbt не может в массив строк.
     
  13. Автор темы
    Energy warrior

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

    Баллы:
    76
    PacketBuffer'а нет!
     
  14. alexandrage

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

    Баллы:
    173
  15. alexandrage

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

    Баллы:
    173
    Класс из майна так то. Урезанная версия.
     
  16. Ission

    Ission Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    lokivava
    Это с какого момента NBT не может массив строк?
     
  17. AbstractCoder

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

    Баллы:
    76
    Имя в Minecraft:
    AbstractCoder
    Ну нбт лист со стрингами можно, а так просто засунуть String[] - нет
     
  18. alexandrage

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

    Баллы:
    173
    Никогда не мог. Очнулся блин.
     
  19. Ission

    Ission Старожил Девелопер Пользователь

    Баллы:
    173
    Skype:
    lokivava
    Да, попутал со стринг листами.
     
  20. Автор темы
    Energy warrior

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

    Баллы:
    76
    Токо как мне добавить это через PersistentDataHolder. В адаптере я не видел листы
     

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