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

Помогите Прочесть инвентарь из player.dat и превратить в Inventory

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

Статус темы:
Закрыта.
  1. Автор темы
    NukerFall

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

    Баллы:
    76
    В заголовке вроде всё понятно.
    У меня есть файл и Инвентарь:
    Код:
    File inventoryFile = new File(getServer().getWorldContainer()
    + getConfig().getString("world-i-need") + File.separator
    + "playerdata", id.toString() + ".dat");
    Inventory inv;
    
    Нужно прочесть Inventory из .dat файла и заполнить inv. Осталось понять, как это сделать.
    upload_2020-4-6_16-36-34.png
     
  2. alexandrage

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

    Баллы:
    173
  3. CriticaMobslps

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

    Баллы:
    76
    Имя в Minecraft:
    CriticaMobs
    Ужасное объяснение того что нужно сделать, то нужно просто из файла сделать инвентарь если ответ выше тебя не устроил и я прав, то пиши сюда https://t.me/evg_onegin
     
  4. LOVEC3327

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

    Баллы:
    76
    Имя в Minecraft:
    LOVEC3327
    Получаешь инвентарь игрока ну и далее заполняешь свой inv.
    Код:
        private static CraftInventory getOfflineInventory(OfflinePlayer player) {
            ServerNBTManager nbtManager = (ServerNBTManager) MinecraftServer.getServer().getWorldServer(0).getDataManager();
            NBTTagCompound data = nbtManager.getPlayerData(player.getUniqueId().toString());
            NBTTagList nbt = (NBTTagList) data.get("Inventory");
            PlayerInventory virtual = new PlayerInventory(null);
            virtual.b(nbt);
            return new CraftInventory(virtual);
        }
    Код:
        public static Inventory offlineInventory(OfflinePlayer player) {
            Inventory inventory = Bukkit.createInventory(null, InventoryType.PLAYER, "OfflineInventory");
            for(int i = 0; i < inventory.getSize(); i++){
                inventory.setItem(i, getOfflineInventory(player).getItem(i));
            }
            return inventory;
        }
    Ну и сохраняешь уже измененный инвентарь при закрытии

    Код:
       
        public static void saveInventoryContents(Inventory i, OfflinePlayer player) throws IOException {
            ServerNBTManager nbtManager = (ServerNBTManager) MinecraftServer.getServer().getWorldServer(0).getDataManager();
            NBTTagCompound data = nbtManager.getPlayerData(player.getUniqueId().toString());
            PlayerInventory inv = new PlayerInventory(null);
            CraftInventory craftInventory = new CraftInventory(inv);
            craftInventory.setContents(i.getContents());
            craftInventory.setItem(36, getOfflineArmorContents(player)[0]);
            craftInventory.setItem(37, getOfflineArmorContents(player)[1]);
            craftInventory.setItem(38, getOfflineArmorContents(player)[2]);
            craftInventory.setItem(39 ,getOfflineArmorContents(player)[3]);
            craftInventory.setItem(40, getOfflineInventoryContents(player).getItem(40));
            data.set("Inventory", inv.a(new NBTTagList()));
            try (FileOutputStream out = new FileOutputStream(new File(nbtManager.getPlayerDir(), player.getUniqueId() + ".dat"))) {
                NBTCompressedStreamTools.a(data, out);
            }
        }
    
    Да и все в принципе
     
  5. Автор темы
    NukerFall

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

    Баллы:
    76
    Так ща пойму юзну как заработает скажу
     
  6. Автор темы
    NukerFall

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

    Баллы:
    76
    Откуда этот код, ибо в обычном 1.15.2 API нету getOfflineArmorContents и ServerNBTManager. Мб не все методы скопипащены и библиотеки не хватает какой-нибудь
     
  7. LOVEC3327

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

    Баллы:
    76
    Имя в Minecraft:
    LOVEC3327
    Код из моего плагина. Забыл сказать, что версия API - 1.12.2. getOfflineArmorContents - метод, с помощью которого я получаю броню игрока. ServerNBTManager видимо был заменен в 1.15.2 на что-то другое. Вот сам метод getOfflineArmorContents, который я забыл вставить:

    Код:
        private static ItemStack[] getOfflineArmorContents(OfflinePlayer player) {
            ServerNBTManager nbtManager = (ServerNBTManager) MinecraftServer.getServer().getWorldServer(0).getDataManager();
            NBTTagCompound data = nbtManager.getPlayerData(player.getUniqueId().toString());
            NBTTagList nbt = (NBTTagList) data.get("Inventory");
            PlayerInventory virtual = new PlayerInventory(null);
            CraftInventoryPlayer craftInventoryPlayer = new CraftInventoryPlayer(virtual);
            virtual.b(nbt);
            return craftInventoryPlayer.getArmorContents();
        }
     
  8. Автор темы
    NukerFall

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

    Баллы:
    76
    Код:
    public void getInv(Player p) {
        File f = new File(plugin.getServer().getWorldContainer() + "/world/playerdata", p.getUniqueId().toString() + ".dat");
        try {
            NBTTagCompound nbt = NBTCompressedStreamTools.a(new FileInputStream(f));
            NBTTagList inv = (NBTTagList) nbt.get("Inventory");
            for (NBTBase tag : inv) {
                //doStuff();
            }
        } catch (IOException e) {}
    }
    
     
    Последнее редактирование: 23 ноя 2021
Статус темы:
Закрыта.

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