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

Помогите записать ItemStack[] в фаил

Тема в разделе "Разработка плагинов для новичков", создана пользователем EvgeniyND, 31 янв 2018.

  1. Автор темы
    EvgeniyND

    EvgeniyND Новичок Пользователь

    Баллы:
    11
    Имя в Minecraft:
    EvgeniyND
    Пробую записать в конфиг ItemStack[] игрока.
    Код:
    config.set("Inventory." + player.getName(), player.getInventory().getContents());
    Вроде в файл записывается... Но вот как обратно записать в player.getInventory().setContents() не пойму, как только не побывал. Вот последний вариант:
    Код:
    player.getInventory().setContents((ItemStack[]) config.get("Inventory." + player.getName()));
    но он увы не работает....
     
  2. TorwaldOswarld

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

    Баллы:
    78
    Имя в Minecraft:
    PuxTa4
    Не пробовал помещать ItemStack в коллекцию и потом уже записывать в конфиг ?
     
  3. Автор темы
    EvgeniyND

    EvgeniyND Новичок Пользователь

    Баллы:
    11
    Имя в Minecraft:
    EvgeniyND
    Подскажешь как?
     
  4. AtomicScience

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

    Баллы:
    76
    Имя в Minecraft:
    AtomicScience
    ItemStack[] это массив ItemStack'ов. Чтобы записать его в файл его нужно преобразовать к List. Для этого нужно выполнить следующий код (за работоспособность не ручаюсь, делал давно):

    Код:
    ItemStack[] array = .... //Твой массив
    List list = Collections.asList(array);
    После чего записывай это дело в конфиг.
     
  5. Автор темы
    EvgeniyND

    EvgeniyND Новичок Пользователь

    Баллы:
    11
    Имя в Minecraft:
    EvgeniyND
    The method asList(ItemStack[]) is undefined for the type Collections
     
  6. Автор темы
    EvgeniyND

    EvgeniyND Новичок Пользователь

    Баллы:
    11
    Имя в Minecraft:
    EvgeniyND
    И проблема не в записи как я говорил, а в прочтении.
    Если есть возможность пояснить как это точно сделать, буду очень рад.
     
  7. AtomicScience

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

    Баллы:
    76
    Имя в Minecraft:
    AtomicScience
    Да, возможно, но лучше использовать List - для него есть специальные методы чтения и не придется мучиться с кастингом объектов
     
  8. hyndorik

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

    Баллы:
    98
    Имя в Minecraft:
    hyndo
    Ну вот иди и учи Collections framework
     
  9. Автор темы
    EvgeniyND

    EvgeniyND Новичок Пользователь

    Баллы:
    11
    Имя в Minecraft:
    EvgeniyND
    А зачем тогда этот раздел на этом форуме? ))) Отправить человека учить проще всего!
     
  10. AtomicScience

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

    Баллы:
    76
    Имя в Minecraft:
    AtomicScience
    На самом деле он прав - это тема создана для помощи разработки ПЛАГИНОВ Bukkit, а не для помощи по основам Java.
     
  11. alexandrage

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

    Баллы:
    173
    Типичная ошибка. Итемстак далеко не полностью сериализуется в yml.
     
  12. alexandrage

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

    Баллы:
    173
    Код:
    package nbtkits;
    
    
    import org.bukkit.Material;
    import org.bukkit.Sound;
    import org.bukkit.craftbukkit.v1_12_R1.inventory.CraftInventoryCustom;
    import org.bukkit.craftbukkit.v1_12_R1.inventory.CraftItemStack;
    import org.bukkit.entity.Player;
    import org.*********ventory.Inventory;
    import org.*********ventory.ItemStack;
    
    import net.minecraft.server.v1_12_R1.NBTCompressedStreamTools;
    import net.minecraft.server.v1_12_R1.NBTTagCompound;
    import net.minecraft.server.v1_12_R1.NBTTagList;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map.Entry;
    
    public class InventoryNBTSer {
    
        public static void setInv(Player p, File folder) throws IOException{
            File folderinv = new File(folder+"/saveinv");
            folderinv.mkdirs();
            NBTTagList Arm = toNBTTagList(p.getInventory().getArmorContents());
            NBTTagList Inv = toNBTTagList(p.getInventory().getContents());
            NBTTagCompound NBT = new NBTTagCompound();
            NBT.set("Arm", Arm);
            NBT.set("Inv", Inv);
            try {
                NBTCompressedStreamTools.a(NBT, new FileOutputStream(folderinv+"/"+p.getName()));
                p.getInventory().clear();
                ItemStack[] in = p.getInventory().getArmorContents();
                for (int i = 0; i < in.length; i++) {
                    in[i] = new ItemStack(Material.AIR, 0);
                }
                p.getInventory().setArmorContents(in); 
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
        }
    
        public static void getInv(Player p, File folder) throws IOException {
            File folderinv = new File(folder+"/saveinv");
            folderinv.mkdirs();
            if(!new File(folderinv+"/"+p.getName()).exists()) {
                return;
            }
            NBTTagCompound NBT = fromNBTTagCompound(folderinv+"/"+p.getName());
            p.getInventory().setArmorContents(fromInventory(NBT.getList("Arm", 10)).getContents());
            p.getInventory().setContents(fromInventory(NBT.getList("Inv", 10)).getContents());
            new File(folderinv+"/"+p.getName()).delete();
        }
    
        public static void getKit(Player p, File folder, String name, boolean b) throws IOException {
            if(!new File(folder+"/kits/"+name.toLowerCase()+".kit").exists()) {
                p.sendMessage("§4Такого набора нет!");
                p.playSound(p.getLocation(), Sound.ENTITY_GENERIC_EXPLODE, 1, 2);
                return;
            }
            NBTTagCompound NBT = fromNBTTagCompound(folder+"/kits/"+name.toLowerCase()+".kit");
            long time = NBT.getLong("time");
            NBTTagList Inv  = NBT.getList("kit", 10);
    
            if(!b) {
                if(new File(folder+"/players/"+name.toLowerCase()+"-"+p.getName()).exists()) {
                    NBTTagCompound temp = fromNBTTagCompound(folder+"/players/"+name.toLowerCase()+"-"+p.getName());
                    long tpl = temp.getLong("time");
                    long  calc = (System.currentTimeMillis()-tpl)/1000;
                    Time t = new Time(time-calc);
                    if(calc<time) {
                        p.sendMessage("§4Вы не можете получить этот набор, раньше чем через §c"+t.getFormat());
                        p.playSound(p.getLocation(), Sound.BLOCK_ANVIL_BREAK, 1, 0);
                        return;
                    }
                }
            }
    
            ItemStack[] st = fromInventory(Inv).getContents();
            for(ItemStack s : st) {
                if(s != null) {
                    HashMap<Integer, ItemStack> over = p.getInventory().addItem(s);
                    for(Entry<Integer, ItemStack> entry : over.entrySet()) {   
                        p.getWorld().dropItemNaturally(p.getLocation(), entry.getValue());
                    }
                }
            }
            p.sendMessage("§6Получен набор §c"+name.toLowerCase());
            p.playSound(p.getLocation(), Sound.BLOCK_ANVIL_LAND, 1, 0);
            new File(folder+"/players/").mkdirs();
            NBTTagCompound temp = new NBTTagCompound();
            temp.setLong("time", System.currentTimeMillis());
            NBTCompressedStreamTools.a(temp, new FileOutputStream(folder+"/players/"+name.toLowerCase()+"-"+p.getName()));
        }
    
        public static void setKit(Player p, File folder, String name, long time) throws IOException {
            new File(folder+"/kits").mkdirs();
            NBTTagCompound NBT = new NBTTagCompound();
            NBTTagList kit = toNBTTagList(p.getInventory().getContents());
            NBT.set("kit", kit);
            NBT.setLong("time", time);
            try {
                NBTCompressedStreamTools.a(NBT, new FileOutputStream(folder+"/kits/"+name.toLowerCase()+".kit"));
                p.sendMessage("§2Набор сохранен.");
                p.playSound(p.getLocation(), Sound.BLOCK_ANVIL_USE, 1, 1);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
        }
    
        public static void setTime(Player p, File folder, String name, long time) throws IOException {
            if(!new File(folder+"/kits/"+name.toLowerCase()+".kit").exists()) {
                p.sendMessage("§4Такого набора нет!");
                p.playSound(p.getLocation(), Sound.ENTITY_GENERIC_EXPLODE, 1, 2);
                return;
            }
            NBTTagCompound NBT = fromNBTTagCompound(folder+"/kits/"+name.toLowerCase()+".kit");
            NBT.setLong("time", time);
            try {
                NBTCompressedStreamTools.a(NBT, new FileOutputStream(folder+"/kits/"+name.toLowerCase()+".kit"));
                p.sendMessage("§2Время изменено.");
                p.playSound(p.getLocation(), Sound.BLOCK_ANVIL_USE, 1, 1);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
        }
    
        public static void delKit(File folder, String name, Player p) {
            File k = new File(folder+"/kits/"+name.toLowerCase()+".kit");
            if(k.exists()) {
                k.delete();
                p.sendMessage("§2Набор удален.");
                p.playSound(p.getLocation(), Sound.BLOCK_ANVIL_USE, 1, 1);
            } else {
                p.sendMessage("§4Такого набора нет!");
                p.playSound(p.getLocation(), Sound.ENTITY_GENERIC_EXPLODE, 1, 0);
            }
        }   
    
        public static List<String> getLogs(File folder) {
            List<String> l = new ArrayList<String>();
            File Logs = new File(folder+"/kits");
            Logs.mkdirs();
            for (File file : Logs.listFiles()) {
                String kit = file.toString().substring(file.toString().lastIndexOf(File.separator)+1);
                if(kit.contains(".kit")) {
                    l.add(kit.replace(".kit", ""));
                }
            }
            return l;
        }
    
        public static NBTTagList toNBTTagList(ItemStack[] inventory) {
            NBTTagList itemList = new NBTTagList();
            for (int i = 0; i < inventory.length; i++) {
                NBTTagCompound outputObject = new NBTTagCompound();
                boolean b = false;
                if(inventory[i] != null) {
                    b = inventory[i].getType() == Material.AIR;
                }
                if(b) {
                    inventory[i] = null;
                }
                CraftItemStack craft = getCraftVersion(inventory[i]);
                if (craft != null)
                    CraftItemStack.asNMSCopy(craft).save(outputObject);
                    itemList.add(outputObject);
            }
            return itemList;
        }
    
        public static NBTTagCompound fromNBTTagCompound(String p) throws IOException{
            try {
                return NBTCompressedStreamTools.a(new FileInputStream(p));
            } catch (FileNotFoundException e) {
                e.printStackTrace();
                NBTTagCompound nul = new NBTTagCompound();
                return nul;
            }
        }
    
        private static Inventory fromInventory(NBTTagList itemList) {
            Inventory inventory = new CraftInventoryCustom(null, itemList.size());
            for (int i = 0; i < itemList.size(); i++) {
                NBTTagCompound inputObject = (NBTTagCompound) itemList.get(i);
                if (!inputObject.isEmpty()) {
                    inventory.setItem(i, CraftItemStack.asBukkitCopy(new net.minecraft.server.v1_12_R1.ItemStack(inputObject)));
                }
            }
            return inventory;
        }
    
        private static CraftItemStack getCraftVersion(ItemStack stack) {
            if (stack instanceof CraftItemStack)
                return (CraftItemStack) stack;
            else if (stack != null)
                return CraftItemStack.asCraftCopy(stack);
            else
                return null;
        }
    }
     
  13. hyndorik

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

    Баллы:
    98
    Имя в Minecraft:
    hyndo
    На незакрытый стрим похрен?
     
  14. alexandrage

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

    Баллы:
    173
    А че сильно утекает? Ну окай.
     
  15. hyndorik

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

    Баллы:
    98
    Имя в Minecraft:
    hyndo
    Это же трудно его закрыть, тем более когда уже есть try конструкция и надо только вписать стрим туда а не в аргументы метода
     
  16. AtomicScience

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

    Баллы:
    76
    Имя в Minecraft:
    AtomicScience
    Да не в этом дело, у меня же все без твоих шедевров работает, значит у него косяк в другом
     
  17. Автор темы
    EvgeniyND

    EvgeniyND Новичок Пользователь

    Баллы:
    11
    Имя в Minecraft:
    EvgeniyND
    Вот по этой схеме должно всё работать... но не работает(((
    Код:
    List<?> InvList = config.getList("Inventory." + player.getName());
                        
                        ItemStack[] inv = InvList.toArray(new ItemStack[InvList.size()]);
                                            
                        player.getInventory().setContents(inv);
     
  18. AtomicScience

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

    Баллы:
    76
    Имя в Minecraft:
    AtomicScience
    Ты сохраняешь массив, но пытаешься получить List.
     
  19. alexandrage

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

    Баллы:
    173
    Я просто на будущее. Когда пойдет срачь почему не все стаки восстанавливаются как должны.
     
  20. AtomicScience

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

    Баллы:
    76
    Имя в Minecraft:
    AtomicScience
    Надо все-таки решать проблемы по мере их поступления
     

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