package de.tobiyas.racesandclasses.saving.serializer; import java.io.File; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; import java.util.UUID; import de.tobiyas.racesandclasses.RacesAndClasses; import de.tobiyas.racesandclasses.saving.PlayerSavingData; import de.tobiyas.util.config.YAMLConfigExtended; import de.tobiyas.util.schedule.DebugBukkitRunnable; public class YAMLPlayerDataSerializer implements PlayerDataSerializer { /** * The Plugin to use. */ private final RacesAndClasses plugin; /** * The Root for saving. */ private final File saveDir; public YAMLPlayerDataSerializer(RacesAndClasses plugin) { this.plugin = plugin; this.saveDir = new File(plugin.getDataFolder(), "PlayerDataYML"); if(!saveDir.exists()) saveDir.mkdirs(); } @Override public void saveData(PlayerSavingData data) { boolean sync = RacesAndClasses.isBukkitInShutdownMode(); saveData(data, sync); } private void saveData(PlayerSavingData data, boolean sync){ UUID playerID = data.getPlayerId(); File playerFile = new File(saveDir, playerID.toString() + ".yml"); YAMLConfigExtended config = new YAMLConfigExtended(playerFile); config.set(UUID_PATH, playerID.toString()); config.set(LAST_NAME_PATH, data.getLastName()); config.set(RACE_PATH, data.getRaceName()); config.set(CLASS_PATH, data.getClassName()); config.set(LEVEL_PATH, data.getLevel()); config.set(EXP_PATH, data.getLevelExp()); config.set(LAST_PLAYED_PATH, data.getLastLogin()); config.set(GOD_MODE_PATH, data.isGodModeEnabled()); //Save Hotkeys: for(Map.Entry<Integer,String> entry : data.getHotKeys().entrySet()){ config.set(HOTKEY_PATH + "." + entry.getKey(), entry.getValue()); } //Save SkillTree: for(Map.Entry<String,Integer> entry : data.getSkillTree().entrySet()){ config.set(SKILL_TREE_PATH + "." + entry.getKey(), entry.getValue()); } //Do saving: if(sync) config.save(); else config.saveAsync(); } @Override public void loadData(final UUID id, final PlayerDataLoadedCallback callback) { new DebugBukkitRunnable("RaCSingleLoader") { @Override protected void runIntern() { PlayerSavingData data = loadDataNow(id); callback.playerDataLoaded(data); } }.runTaskAsynchronously(plugin); } @Override public void bulkLoadData(final Set<UUID> ids, final PlayerDataLoadedCallback callback) { new DebugBukkitRunnable("RaCBulkLoader") { @Override protected void runIntern() { for(UUID id : ids){ PlayerSavingData data = loadDataNow(id); callback.playerDataLoaded(data); } } }.runTaskAsynchronously(plugin); } @Override public Set<PlayerSavingData> bulkLoadDataNow(Set<UUID> ids) { Set<PlayerSavingData> datas = new HashSet<>(); for(UUID id : ids){ PlayerSavingData data = loadDataNow(id); if(data != null) datas.add(data); } return datas; } @Override public PlayerSavingData loadDataNow(UUID id) { File playerFile = new File(saveDir, id.toString()+".yml"); if(!playerFile.exists()) return new PlayerSavingData(id); YAMLConfigExtended config = new YAMLConfigExtended(playerFile).load(); if(!config.getValidLoad()) { plugin.logDebug("Could not load PlayerData: " + id.toString()); return new PlayerSavingData(id); } String raceName = config.getString(RACE_PATH, ""); String className = config.getString(CLASS_PATH, ""); String lastName = config.getString(LAST_NAME_PATH, ""); boolean godMode = config.getBoolean(GOD_MODE_PATH, false); int level = config.getInt(LEVEL_PATH, 1); int exp = config.getInt(EXP_PATH, 0); long lastPlayed = config.getLong(LAST_PLAYED_PATH, 0); //Load HotKeys: Map<Integer,String> hotkeys = new HashMap<>(); for(String keyName : config.getChildren(HOTKEY_PATH)){ try{ int key = Integer.parseInt(keyName); String trait = config.getString(HOTKEY_PATH+"."+key, ""); if(!trait.isEmpty()) hotkeys.put(key, trait); }catch(Throwable e){} } //Load SkillTrees: Map<String,Integer> skillTree = new HashMap<>(); for(String trait : config.getChildren(SKILL_TREE_PATH)){ try{ int traitLevel = config.getInt(HOTKEY_PATH+"."+trait, 0); if(traitLevel > 0) skillTree.put(trait, traitLevel); }catch(Throwable e){} } return new PlayerSavingData(id, lastPlayed, lastName, raceName, className, level, exp, godMode, hotkeys, skillTree); } @Override public Set<UUID> getAllIDsPresent() { File[] files = saveDir.listFiles(); Set<UUID> ids = new HashSet<>(); if(files == null || files.length == 0) return ids; //Parse the IDs: for(File file : files){ try{ String name = file.getName().replace(".yml", ""); UUID id = UUID.fromString(name); if(id != null) ids.add(id); }catch(Throwable exp){} } return ids; } @Override public void shutdown() { //Nothing to do here. } @Override public boolean isFunctional() { return true; } }