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

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()));
но он увы не работает....
 
Пробую записать в конфиг ItemStack[] игрока.
Код:
config.set("Inventory." + player.getName(), player.getInventory().getContents());
Вроде в файл записывается... Но вот как обратно записать в player.getInventory().setContents() не пойму, как только не побывал. Вот последний вариант:
Код:
player.getInventory().setContents((ItemStack[]) config.get("Inventory." + player.getName()));
но он увы не работает....
Не пробовал помещать ItemStack в коллекцию и потом уже записывать в конфиг ?
 
ItemStack[] это массив ItemStack'ов. Чтобы записать его в файл его нужно преобразовать к List. Для этого нужно выполнить следующий код (за работоспособность не ручаюсь, делал давно):

Код:
ItemStack[] array = .... //Твой массив
List list = Collections.asList(array);

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

Код:
ItemStack[] array = .... //Твой массив
List list = Collections.asList(array);

После чего записывай это дело в конфиг.
The method asList(ItemStack[]) is undefined for the type Collections
 
И проблема не в записи как я говорил, а в прочтении.
Если есть возможность пояснить как это точно сделать, буду очень рад.
 
The method asList(ItemStack[]) is undefined for the type Collections

Да, возможно, но лучше использовать List - для него есть специальные методы чтения и не придется мучиться с кастингом объектов
 
А зачем тогда этот раздел на этом форуме? ))) Отправить человека учить проще всего!

На самом деле он прав - это тема создана для помощи разработки ПЛАГИНОВ Bukkit, а не для помощи по основам Java.
 
Код:
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;
    }
}
 
Код:
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;
    }
}
На незакрытый стрим похрен?
 
Вот по этой схеме должно всё работать... но не работает(((
Код:
List<?> InvList = config.getList("Inventory." + player.getName());
                    
                    ItemStack[] inv = InvList.toArray(new ItemStack[InvList.size()]);
                                        
                    player.getInventory().setContents(inv);
 
Вот по этой схеме должно всё работать... но не работает(((
Код:
List<?> InvList = config.getList("Inventory." + player.getName());
                   
                    ItemStack[] inv = InvList.toArray(new ItemStack[InvList.size()]);
                                       
                    player.getInventory().setContents(inv);

Ты сохраняешь массив, но пытаешься получить List.
 
Да не в этом дело, у меня же все без твоих шедевров работает, значит у него косяк в другом
Я просто на будущее. Когда пойдет срачь почему не все стаки восстанавливаются как должны.
 
Назад
Верх