From 62e1ace7b5c836e1261f96e93e1246596e82c430 Mon Sep 17 00:00:00 2001 From: Jules Date: Sat, 27 Jul 2024 20:59:07 -0700 Subject: [PATCH] Fixed loot chests not loading. Requires latest ML --- .../api/player/profess/PlayerClass.java | 2 +- .../command/rpg/admin/ExportDataTreeNode.java | 95 +----------- .../mmocore/manager/AttributeManager.java | 4 +- .../Indyuce/mmocore/manager/ClassManager.java | 3 +- .../mmocore/manager/ConfigManager.java | 3 +- .../mmocore/manager/DropTableManager.java | 2 +- .../mmocore/manager/ExperienceManager.java | 3 +- .../mmocore/manager/LootChestManager.java | 5 +- .../Indyuce/mmocore/manager/QuestManager.java | 3 +- .../Indyuce/mmocore/manager/SkillManager.java | 2 +- .../mmocore/manager/SkillTreeManager.java | 2 +- .../mmocore/manager/WaypointManager.java | 3 +- .../manager/profession/ProfessionManager.java | 3 +- .../net/Indyuce/mmocore/util/FileUtils.java | 138 ------------------ 14 files changed, 21 insertions(+), 247 deletions(-) delete mode 100644 MMOCore-API/src/main/java/net/Indyuce/mmocore/util/FileUtils.java diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/profess/PlayerClass.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/profess/PlayerClass.java index fb83b81a..034833cd 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/profess/PlayerClass.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/api/player/profess/PlayerClass.java @@ -11,6 +11,7 @@ import io.lumine.mythic.lib.skill.SimpleSkill; import io.lumine.mythic.lib.skill.Skill; import io.lumine.mythic.lib.skill.handler.MythicLibSkillHandler; import io.lumine.mythic.lib.skill.trigger.TriggerType; +import io.lumine.mythic.lib.util.FileUtils; import io.lumine.mythic.lib.util.PostLoadAction; import io.lumine.mythic.lib.util.PreloadedObject; import io.lumine.mythic.lib.version.VParticle; @@ -33,7 +34,6 @@ import net.Indyuce.mmocore.skill.RegisteredSkill; import net.Indyuce.mmocore.skill.binding.SkillSlot; import net.Indyuce.mmocore.skill.cast.ComboMap; import net.Indyuce.mmocore.skilltree.tree.SkillTree; -import net.Indyuce.mmocore.util.FileUtils; import net.md_5.bungee.api.ChatColor; import org.bukkit.Location; import org.bukkit.Material; diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/command/rpg/admin/ExportDataTreeNode.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/command/rpg/admin/ExportDataTreeNode.java index 223d09bd..c87e0ebf 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/command/rpg/admin/ExportDataTreeNode.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/command/rpg/admin/ExportDataTreeNode.java @@ -1,23 +1,13 @@ package net.Indyuce.mmocore.command.rpg.admin; -import io.lumine.mythic.lib.api.player.MMOPlayerData; import io.lumine.mythic.lib.command.api.CommandTreeNode; +import io.lumine.mythic.lib.data.DataExport; import io.lumine.mythic.lib.data.sql.SQLDataSource; import net.Indyuce.mmocore.MMOCore; -import net.Indyuce.mmocore.api.player.PlayerData; import net.Indyuce.mmocore.manager.data.sql.SQLDataHandler; import net.Indyuce.mmocore.manager.data.yaml.YAMLPlayerDataHandler; import org.bukkit.command.CommandSender; -import org.bukkit.scheduler.BukkitRunnable; - -import java.io.File; -import java.text.DecimalFormat; -import java.util.Arrays; -import java.util.List; -import java.util.UUID; -import java.util.logging.Level; -import java.util.stream.Collectors; - +import org.jetbrains.annotations.NotNull; /** * This command allows to transfer data from your actual storage type @@ -28,84 +18,15 @@ public class ExportDataTreeNode extends CommandTreeNode { super(parent, "exportdata"); } - /** - * Amount of requests generated every batch - */ - private static final int BATCH_AMOUNT = 50; - - /** - * Period in ticks - */ - private static final int BATCH_PERIOD = 20; - - private static final DecimalFormat decFormat = new DecimalFormat("0.#"); - @Override + @NotNull public CommandResult execute(CommandSender sender, String[] strings) { - if (!MMOCore.plugin.playerDataManager.getLoaded().isEmpty()) { - sender.sendMessage("Please make sure no players are logged in when using this command. " + - "If you are still seeing this message, restart your server and execute this command before any player logs in."); - return CommandResult.FAILURE; - } + // Export YAML to SQL + final boolean result = new DataExport<>(MMOCore.plugin.playerDataManager, sender).start( + () -> new YAMLPlayerDataHandler(MMOCore.plugin), + () -> new SQLDataHandler(new SQLDataSource(MMOCore.plugin))); - final List playerIds = Arrays.stream(new File(MMOCore.plugin.getDataFolder() + "/userdata").listFiles()) - .map(file -> UUID.fromString(file.getName().replace(".yml", ""))) - .toList(); - - // Initialize fake SQL & YAML data provider - final SQLDataHandler sqlHandler; - final YAMLPlayerDataHandler ymlHandler; - try { - sqlHandler = new SQLDataHandler(new SQLDataSource(MMOCore.plugin)); - ymlHandler = new YAMLPlayerDataHandler(MMOCore.plugin); - } catch (RuntimeException exception) { - sender.sendMessage("Could not initialize SQL/YAML provider (see console for stack trace): " + exception.getMessage()); - exception.printStackTrace(); - return CommandResult.FAILURE; - } - - final double timeEstimation = (double) playerIds.size() / BATCH_AMOUNT * BATCH_PERIOD / 20; - sender.sendMessage("Exporting " + playerIds.size() + " player data(s).. See console for details"); - sender.sendMessage("Minimum expected time: " + decFormat.format(timeEstimation) + "s"); - - // Save player data - new BukkitRunnable() { - int errorCount = 0; - int batchCounter = 0; - - @Override - public void run() { - for (int i = 0; i < BATCH_AMOUNT; i++) { - final int index = BATCH_AMOUNT * batchCounter + i; - - /* - * Saving is done. Close connection to avoid memory - * leaks and ouput the results to the command executor - */ - if (index >= playerIds.size()) { - cancel(); - - sqlHandler.close(); - MMOCore.plugin.getLogger().log(Level.WARNING, "Exported " + playerIds.size() + " player datas to SQL database. Total errors: " + errorCount); - return; - } - - final UUID playerId = playerIds.get(index); - try { - final PlayerData offlinePlayerData = new PlayerData(new MMOPlayerData(playerId)); - ymlHandler.loadData(offlinePlayerData); - sqlHandler.saveData(offlinePlayerData, false); - } catch (RuntimeException exception) { - errorCount++; - exception.printStackTrace(); - } - } - - batchCounter++; - } - }.runTaskTimerAsynchronously(MMOCore.plugin, 0, BATCH_PERIOD); - - return CommandResult.SUCCESS; + return result ? CommandResult.SUCCESS : CommandResult.FAILURE; } } diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/AttributeManager.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/AttributeManager.java index c767e516..284a33bc 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/AttributeManager.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/AttributeManager.java @@ -1,12 +1,11 @@ package net.Indyuce.mmocore.manager; import io.lumine.mythic.lib.MythicLib; +import io.lumine.mythic.lib.util.FileUtils; import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.api.ConfigFile; import net.Indyuce.mmocore.api.player.attribute.MMOCoreAttributeStatHandler; import net.Indyuce.mmocore.api.player.attribute.PlayerAttribute; -import net.Indyuce.mmocore.api.util.MMOCoreUtils; -import net.Indyuce.mmocore.util.FileUtils; import org.bukkit.configuration.ConfigurationSection; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -14,7 +13,6 @@ import org.jetbrains.annotations.Nullable; import java.util.Collection; import java.util.HashMap; import java.util.Map; -import java.util.logging.Level; public class AttributeManager implements MMOCoreManager { private final Map map = new HashMap<>(); diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/ClassManager.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/ClassManager.java index 1d94c479..1054011a 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/ClassManager.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/ClassManager.java @@ -1,12 +1,11 @@ package net.Indyuce.mmocore.manager; +import io.lumine.mythic.lib.util.FileUtils; import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.api.player.profess.ClassOption; import net.Indyuce.mmocore.api.player.profess.PlayerClass; import net.Indyuce.mmocore.api.player.profess.event.EventTriggerHandler; import net.Indyuce.mmocore.api.player.profess.event.trigger.*; -import net.Indyuce.mmocore.api.util.MMOCoreUtils; -import net.Indyuce.mmocore.util.FileUtils; import org.apache.commons.lang.Validate; import org.bukkit.Bukkit; import org.bukkit.Material; diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/ConfigManager.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/ConfigManager.java index 566548fc..da71efa3 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/ConfigManager.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/ConfigManager.java @@ -1,6 +1,7 @@ package net.Indyuce.mmocore.manager; import io.lumine.mythic.lib.UtilityMethods; +import io.lumine.mythic.lib.util.FileUtils; import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.api.ConfigFile; import net.Indyuce.mmocore.api.ConfigMessage; @@ -8,7 +9,6 @@ import net.Indyuce.mmocore.api.util.input.ChatInput; import net.Indyuce.mmocore.api.util.input.PlayerInput; import net.Indyuce.mmocore.api.util.input.PlayerInput.InputType; import net.Indyuce.mmocore.command.api.CommandVerbose; -import net.Indyuce.mmocore.util.FileUtils; import org.bukkit.ChatColor; import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.file.FileConfiguration; @@ -18,7 +18,6 @@ import org.bukkit.util.Consumer; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import java.io.File; import java.util.ArrayList; import java.util.List; import java.util.logging.Level; diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/DropTableManager.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/DropTableManager.java index cece9dff..c3e457bd 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/DropTableManager.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/DropTableManager.java @@ -1,8 +1,8 @@ package net.Indyuce.mmocore.manager; +import io.lumine.mythic.lib.util.FileUtils; import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.loot.droptable.DropTable; -import net.Indyuce.mmocore.util.FileUtils; import org.bukkit.Bukkit; import org.bukkit.configuration.ConfigurationSection; import org.jetbrains.annotations.NotNull; diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/ExperienceManager.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/ExperienceManager.java index 75b2d289..6479cfa2 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/ExperienceManager.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/ExperienceManager.java @@ -1,12 +1,11 @@ package net.Indyuce.mmocore.manager; +import io.lumine.mythic.lib.util.FileUtils; import net.Indyuce.mmocore.MMOCore; -import net.Indyuce.mmocore.api.util.MMOCoreUtils; import net.Indyuce.mmocore.experience.ExpCurve; import net.Indyuce.mmocore.experience.droptable.ExperienceTable; import net.Indyuce.mmocore.experience.source.type.ExperienceSource; import net.Indyuce.mmocore.manager.profession.ExperienceSourceManager; -import net.Indyuce.mmocore.util.FileUtils; import org.apache.commons.lang.Validate; import org.bukkit.configuration.ConfigurationSection; import org.jetbrains.annotations.NotNull; diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/LootChestManager.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/LootChestManager.java index 7447c3d3..fa489b4b 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/LootChestManager.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/LootChestManager.java @@ -1,10 +1,9 @@ package net.Indyuce.mmocore.manager; +import io.lumine.mythic.lib.util.FileUtils; import net.Indyuce.mmocore.MMOCore; -import net.Indyuce.mmocore.api.util.MMOCoreUtils; import net.Indyuce.mmocore.loot.chest.LootChest; import net.Indyuce.mmocore.loot.chest.LootChestRegion; -import net.Indyuce.mmocore.util.FileUtils; import net.Indyuce.mmocore.util.HashableLocation; import org.bukkit.Location; import org.jetbrains.annotations.NotNull; @@ -69,7 +68,7 @@ public class LootChestManager implements MMOCoreManager { } FileUtils.loadObjectsFromFolder(MMOCore.plugin, "loot-chests", false, (key, config) -> { - LootChestRegion region = new LootChestRegion(config.getConfigurationSection(key)); + LootChestRegion region = new LootChestRegion(config); regions.put(region.getId(), region); }, "Could not load loot chest region '%s' from file '%s': %s"); } diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/QuestManager.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/QuestManager.java index f80bbfe8..19169232 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/QuestManager.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/QuestManager.java @@ -1,9 +1,8 @@ package net.Indyuce.mmocore.manager; +import io.lumine.mythic.lib.util.FileUtils; import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.api.quest.Quest; -import net.Indyuce.mmocore.api.util.MMOCoreUtils; -import net.Indyuce.mmocore.util.FileUtils; import org.apache.commons.lang.Validate; import java.util.Collection; diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/SkillManager.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/SkillManager.java index f4c95388..fd0cdc4b 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/SkillManager.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/SkillManager.java @@ -3,13 +3,13 @@ package net.Indyuce.mmocore.manager; import io.lumine.mythic.lib.MythicLib; import io.lumine.mythic.lib.UtilityMethods; import io.lumine.mythic.lib.skill.handler.SkillHandler; +import io.lumine.mythic.lib.util.FileUtils; import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.api.ConfigFile; import net.Indyuce.mmocore.skill.RegisteredSkill; import net.Indyuce.mmocore.skill.list.Ambers; import net.Indyuce.mmocore.skill.list.Neptune_Gift; import net.Indyuce.mmocore.skill.list.Sneaky_Picky; -import net.Indyuce.mmocore.util.FileUtils; import org.apache.commons.lang.Validate; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/SkillTreeManager.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/SkillTreeManager.java index 15c495a2..d4743acd 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/SkillTreeManager.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/SkillTreeManager.java @@ -1,11 +1,11 @@ package net.Indyuce.mmocore.manager; +import io.lumine.mythic.lib.util.FileUtils; import net.Indyuce.mmocore.MMOCore; import net.Indyuce.mmocore.manager.registry.MMOCoreRegister; import net.Indyuce.mmocore.skilltree.ParentType; import net.Indyuce.mmocore.skilltree.SkillTreeNode; import net.Indyuce.mmocore.skilltree.tree.SkillTree; -import net.Indyuce.mmocore.util.FileUtils; import java.util.Collection; import java.util.HashMap; diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/WaypointManager.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/WaypointManager.java index 23478a93..30cdafb9 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/WaypointManager.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/WaypointManager.java @@ -1,8 +1,7 @@ package net.Indyuce.mmocore.manager; +import io.lumine.mythic.lib.util.FileUtils; import net.Indyuce.mmocore.MMOCore; -import net.Indyuce.mmocore.api.util.MMOCoreUtils; -import net.Indyuce.mmocore.util.FileUtils; import net.Indyuce.mmocore.waypoint.Waypoint; import org.apache.commons.lang.Validate; import org.bukkit.entity.Player; diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/profession/ProfessionManager.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/profession/ProfessionManager.java index 0c71c157..4cc56524 100644 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/profession/ProfessionManager.java +++ b/MMOCore-API/src/main/java/net/Indyuce/mmocore/manager/profession/ProfessionManager.java @@ -1,10 +1,9 @@ package net.Indyuce.mmocore.manager.profession; +import io.lumine.mythic.lib.util.FileUtils; import net.Indyuce.mmocore.MMOCore; -import net.Indyuce.mmocore.api.util.MMOCoreUtils; import net.Indyuce.mmocore.experience.Profession; import net.Indyuce.mmocore.manager.MMOCoreManager; -import net.Indyuce.mmocore.util.FileUtils; import org.apache.commons.lang.Validate; import org.bukkit.configuration.ConfigurationSection; import org.jetbrains.annotations.NotNull; diff --git a/MMOCore-API/src/main/java/net/Indyuce/mmocore/util/FileUtils.java b/MMOCore-API/src/main/java/net/Indyuce/mmocore/util/FileUtils.java deleted file mode 100644 index 1ade21f3..00000000 --- a/MMOCore-API/src/main/java/net/Indyuce/mmocore/util/FileUtils.java +++ /dev/null @@ -1,138 +0,0 @@ -package net.Indyuce.mmocore.util; - -import net.Indyuce.mmocore.MMOCore; -import org.apache.commons.lang.Validate; -import org.bukkit.configuration.ConfigurationSection; -import org.bukkit.configuration.file.FileConfiguration; -import org.bukkit.configuration.file.YamlConfiguration; -import org.bukkit.plugin.Plugin; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.io.File; -import java.nio.file.Files; -import java.util.Arrays; -import java.util.List; -import java.util.function.BiConsumer; -import java.util.function.Consumer; -import java.util.function.Function; -import java.util.logging.Level; - -public class FileUtils { - - public static void iterateConfigSectionList(@NotNull ConfigurationSection config, - @NotNull List list, - @NotNull Function subconfigHandler, - @NotNull Function fill, - @NotNull BiConsumer errorHandler) { - int expectedOrdinal = 1; - - for (String key : config.getKeys(false)) - try { - final int index = Integer.parseInt(key); - final ConfigurationSection subconfig = config.getConfigurationSection(key); - Validate.notNull(subconfig, "Not a configuration section"); - - // Replace - if (index < expectedOrdinal) list.set(index, subconfigHandler.apply(subconfig)); - else { - while (expectedOrdinal < index) - list.add(fill.apply(expectedOrdinal++)); - list.add(subconfigHandler.apply(subconfig)); - expectedOrdinal++; - } - - } catch (RuntimeException exception) { - errorHandler.accept(key, exception); - } - } - - public static void loadObjectsFromFolder(@NotNull Plugin plugin, - @NotNull String path, - boolean singleObject, - @NotNull BiConsumer action, - @NotNull String errorMessageFormat) { - - // Action to perform - final Consumer fileAction = file -> { - final FileConfiguration config = YamlConfiguration.loadConfiguration(file); - if (singleObject) try { - final String name = file.getName().substring(0, file.getName().length() - 4); - action.accept(name, config); - } catch (Throwable throwable) { - MMOCore.plugin.getLogger().log(Level.WARNING, errorMessageFormat.formatted(file.getName(), throwable.getMessage())); - } - else for (String key : config.getKeys(false)) - try { - action.accept(key, config.getConfigurationSection(key)); - } catch (Throwable throwable) { - MMOCore.plugin.getLogger().log(Level.WARNING, errorMessageFormat.formatted(key, file.getName(), throwable.getMessage())); - } - }; - - // Perform on all paths - exploreFolderRecursively(getFile(plugin, path), fileAction); - } - - public static void loadObjectsFromFolderRaw(@NotNull Plugin plugin, - @NotNull String path, - @NotNull Consumer action, - @NotNull String errorMessageFormat) { - - // Action to perform - final Consumer fileAction = file -> { - try { - action.accept(file); - } catch (Throwable throwable) { - MMOCore.plugin.getLogger().log(Level.WARNING, errorMessageFormat.formatted(file.getName(), throwable.getMessage())); - } - }; - - // Perform on all paths - exploreFolderRecursively(getFile(plugin, path), fileAction); - } - - private static void exploreFolderRecursively(@Nullable File file, @NotNull Consumer action) { - if (!file.exists()) return; - if (file.isFile()) action.accept(file); - else Arrays.stream(file.listFiles()).sorted().forEach(subfile -> exploreFolderRecursively(subfile, action)); - } - - @NotNull - public static File getFile(@NotNull Plugin plugin, @NotNull String path) { - return new File(plugin.getDataFolder() + "/" + path); - } - - public static boolean moveIfExists(@NotNull Plugin plugin, - @NotNull String filePath, - @NotNull String newFolderPath) { - final File existing = getFile(plugin, filePath); - final boolean result = existing.exists(); - if (result) { - final String fullPath = newFolderPath + "/" + filePath; - mkdirFolders(plugin, fullPath); - Validate.isTrue(existing.renameTo(getFile(plugin, fullPath)), "Could not move '%s' to '%s'".formatted(filePath, newFolderPath)); - } - return result; - } - - private static void mkdirFolders(@NotNull Plugin plugin, @NotNull String fullPath) { - String currentPath = ""; - final String[] subpaths = fullPath.split("/"); - for (int i = 0; i < subpaths.length - 1; i++) { - currentPath += "/" + subpaths[i]; - getFile(plugin, currentPath).mkdir(); - } - } - - public static void copyDefaultFile(@NotNull Plugin plugin, @NotNull String path) { - mkdirFolders(plugin, path); - - final File file = new File(plugin.getDataFolder(), path); - if (!file.exists()) try { - Files.copy(MMOCore.plugin.getResource("default/" + path), file.getAbsoluteFile().toPath()); - } catch (Throwable throwable) { - throw new RuntimeException("Could not load default file '" + path + "'", throwable); - } - } -}