Помогите Как заменить строку в конфиге

Статус
Закрыто для дальнейших ответов.

Den_Blade

Активный участник
Пользователь
Баллы
66
Имя в Minecraft
Den_Blade
Нужно заменить одну строчку на другую, если точнее мне нужно поменять sumka на malruk, при этом сохранив содержимое, как реализовать?
Код:
e57a78ab-a096-375c-80aa-bcf846bf0786:
  sumka:
    '0': {}
    '1': {}
    '2': {}
    '3': {}
    '4': {}
    '5': {}
    '6': {}
    '7': {}
    '8':
      item:
        ==: org.*********ventory.ItemStack
        type: STONE
        damage: 1
 
Получаешь список секций конфига, проходишься по ним. Там, где то, что тебе нужно заменить, сохраняешь содержимое и записываешь в новый ключ по тому же пути, а старое удаляешь.
 
Получаешь список секций конфига, проходишься по ним. Там, где то, что тебе нужно заменить, сохраняешь содержимое и записываешь в новый ключ по тому же пути, а старое удаляешь.
Сделал что-то такое, но не работает
Код:
    @EventHandler
    public void onInventoryClick(InventoryClickEvent e) {

        if (e.getInventory() != null && e.getInventory().getName().equalsIgnoreCase(ChatColor.GOLD + "Улучшение рюкзака")) {
            final Player p = (Player)e.getWhoClicked();
            e.setCancelled(true);
            if (e.getCurrentItem() == null) {
                return;
            }
            File playerFile = new File(Main.instance.getDataFolder(), "/backpack" + "/" + p.getName() + ".yml");
            FileConfiguration playerData = YamlConfiguration.loadConfiguration(playerFile);
            if (e.getCurrentItem().getItemMeta().getDisplayName().equalsIgnoreCase("§aУлучшение: §5Маленький рюкзак§5")) {
                ConfigurationSection section = playerData.getConfigurationSection(p.getUniqueId().toString() + ".sumka");
                for(String key : section.getKeys(false))
                {
                ConfigurationSection keySection = section.getConfigurationSection(key);
                playerData.set(p.getUniqueId().toString() + ".sumka", null);
                playerData.set(p.getUniqueId().toString() + ".malruk", keySection);
                }
                Main.BackPack(p, "backpack1");
            }
            
        }
    }
    
}
 
Сделал что-то такое, но не работает
Код:
    @EventHandler
    public void onInventoryClick(InventoryClickEvent e) {

        if (e.getInventory() != null && e.getInventory().getName().equalsIgnoreCase(ChatColor.GOLD + "Улучшение рюкзака")) {
            final Player p = (Player)e.getWhoClicked();
            e.setCancelled(true);
            if (e.getCurrentItem() == null) {
                return;
            }
            File playerFile = new File(Main.instance.getDataFolder(), "/backpack" + "/" + p.getName() + ".yml");
            FileConfiguration playerData = YamlConfiguration.loadConfiguration(playerFile);
            if (e.getCurrentItem().getItemMeta().getDisplayName().equalsIgnoreCase("§aУлучшение: §5Маленький рюкзак§5")) {
                ConfigurationSection section = playerData.getConfigurationSection(p.getUniqueId().toString() + ".sumka");
                for(String key : section.getKeys(false))
                {
                ConfigurationSection keySection = section.getConfigurationSection(key);
                playerData.set(p.getUniqueId().toString() + ".sumka", null);
                playerData.set(p.getUniqueId().toString() + ".malruk", keySection);
                }
                Main.BackPack(p, "backpack1");
            }
          
        }
    }
  
}
А разве не прощще не перезаписывпть путь а просто хранить все данные в конфиге изначально (в твоем случае скорее всего размер сумки и ее тип) . Так и мароки меньше и тд.
 
Сделал что-то такое, но не работает
Код:
    @EventHandler
    public void onInventoryClick(InventoryClickEvent e) {

        if (e.getInventory() != null && e.getInventory().getName().equalsIgnoreCase(ChatColor.GOLD + "Улучшение рюкзака")) {
            final Player p = (Player)e.getWhoClicked();
            e.setCancelled(true);
            if (e.getCurrentItem() == null) {
                return;
            }
            File playerFile = new File(Main.instance.getDataFolder(), "/backpack" + "/" + p.getName() + ".yml");
            FileConfiguration playerData = YamlConfiguration.loadConfiguration(playerFile);
            if (e.getCurrentItem().getItemMeta().getDisplayName().equalsIgnoreCase("§aУлучшение: §5Маленький рюкзак§5")) {
                ConfigurationSection section = playerData.getConfigurationSection(p.getUniqueId().toString() + ".sumka");
                for(String key : section.getKeys(false))
                {
                ConfigurationSection keySection = section.getConfigurationSection(key);
                playerData.set(p.getUniqueId().toString() + ".sumka", null);
                playerData.set(p.getUniqueId().toString() + ".malruk", keySection);
                }
                Main.BackPack(p, "backpack1");
            }
          
        }
    }
  
}
Во-первых, ты не сохранил конфиг. Во-вторых, сначала перенеси все, а потом выставляй в том пути null, да и убери эту строку из цикла, ты ведь ее один раз должен только выполнить. На остальное я не особо смотрел, так что если все равно не будет работать - пиши.
 
Сделал что-то такое, но не работает
Код:
    @EventHandler
    public void onInventoryClick(InventoryClickEvent e) {

        if (e.getInventory() != null && e.getInventory().getName().equalsIgnoreCase(ChatColor.GOLD + "Улучшение рюкзака")) {
            final Player p = (Player)e.getWhoClicked();
            e.setCancelled(true);
            if (e.getCurrentItem() == null) {
                return;
            }
            File playerFile = new File(Main.instance.getDataFolder(), "/backpack" + "/" + p.getName() + ".yml");
            FileConfiguration playerData = YamlConfiguration.loadConfiguration(playerFile);
            if (e.getCurrentItem().getItemMeta().getDisplayName().equalsIgnoreCase("§aУлучшение: §5Маленький рюкзак§5")) {
                ConfigurationSection section = playerData.getConfigurationSection(p.getUniqueId().toString() + ".sumka");
                for(String key : section.getKeys(false))
                {
                ConfigurationSection keySection = section.getConfigurationSection(key);
                playerData.set(p.getUniqueId().toString() + ".sumka", null);
                playerData.set(p.getUniqueId().toString() + ".malruk", keySection);
                }
                Main.BackPack(p, "backpack1");
            }
           
        }
    }
   
}
Ой нафиг, даже комментировать этот ужас не хочется. :D
 
Во-первых, ты не сохранил конфиг. Во-вторых, сначала перенеси все, а потом выставляй в том пути null, да и убери эту строку из цикла, ты ведь ее один раз должен только выполнить. На остальное я не особо смотрел, так что если все равно не будет работать - пиши.
Сделал так, заменяет, но айтемы не перекидывает, создается пустой рюкзак
Код:
    @EventHandler
    public void onInventoryClick(InventoryClickEvent e) {

        if (e.getInventory() != null && e.getInventory().getName().equalsIgnoreCase(ChatColor.GOLD + "Улучшение рюкзака")) {
            final Player p = (Player)e.getWhoClicked();
            e.setCancelled(true);
            if (e.getCurrentItem() == null) {
                return;
            }
            File playerFile = new File(Main.instance.getDataFolder(), "/backpack" + "/" + p.getName() + ".yml");
            FileConfiguration playerData = YamlConfiguration.loadConfiguration(playerFile);
            if (e.getCurrentItem().getItemMeta().getDisplayName().equalsIgnoreCase("§aУлучшение: §5Маленький рюкзак§5")) {
                ConfigurationSection section = playerData.getConfigurationSection(p.getUniqueId().toString() + ".sumka");
                for(String key : section.getKeys(false))
                {
                ConfigurationSection keySection = section.getConfigurationSection(key);

                playerData.set(p.getUniqueId().toString() + ".malruk", keySection);
                
                }
                playerData.set(p.getUniqueId().toString() + ".sumka", null);
                Main.instance.saveCustomYml(playerData, playerFile);
                Main.BackPack(p, "backpack1");
            }
            
        }
    }
 
PHP:
public static void renameSection(ConfigurationSection parentSection, String oldName, String newName) {
    ConfigurationSection oldSection = parentSection.getConfigurationSection(oldName);
    if (oldSection == null) {
        throw new IllegalArgumentException("Секция не имеет раздела " + oldName);
    }
    if (parentSection.contains(newName)) {
        throw new IllegalArgumentException("Секция уже имеет раздел " + newName);
    }
    parentSection.createSection(newName, oldSection.getValues(true));
    parentSection.set(oldName, null);
}

Пример использования:
ConfigurationSection data = config.getConfigurationSection(p.getUniqueId().toString());
renameSection(data, "sumka", "malruk");

После этого не забудь сохранить конфиг в файл, если это требуется
 
Статус
Закрыто для дальнейших ответов.
Назад
Верх