package tv.mineinthebox.essentials.managers; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.Comparator; import java.util.HashSet; import java.util.LinkedHashMap; import java.util.List; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.World; import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.material.MaterialData; import tv.mineinthebox.essentials.xEssentials; import tv.mineinthebox.essentials.instances.RegenObject; public class RegenManager { public final HashSet<RegenObject> getList = new HashSet<RegenObject>(); private final xEssentials pl; public RegenManager(xEssentials pl) { this.pl = pl; } /** * @author xize * @param saves all the regen schedulers */ public void saveRegenObjects() { for(RegenObject regen : getList) { File f = new File(pl.getDataFolder() + File.separator + "regen" + File.separator + "regen_"+regen.getId()+".dat"); FileConfiguration con = YamlConfiguration.loadConfiguration(f); List<String> serializedLocations = getSerializedLocations(Arrays.asList(regen.getData().keySet().toArray(new Location[regen.getData().size()]))); List<String> serializedMaterials = getSerializedMaterialData(Arrays.asList(regen.getData().values().toArray(new MaterialData[regen.getData().size()]))); con.set("locations", serializedLocations); con.set("materials", serializedMaterials); try { con.save(f); } catch (IOException e) { e.printStackTrace(); } } } /** * @author xize * @param loads all the regen schedulers! */ public void loadRegenObjects() { File dir = new File(pl.getDataFolder() + File.separator + "regen"); if(dir.isDirectory()) { for(File f : dir.listFiles()) { FileConfiguration con = YamlConfiguration.loadConfiguration(f); List<Location> locdata = getDeserializedLocations(con.getStringList("locations")); List<MaterialData> data = getDeserializedMaterialData(con.getStringList("materials")); LinkedHashMap<Location, MaterialData> datamap = new LinkedHashMap<Location, MaterialData>(); for(int i = 0; i < locdata.size(); i++) { datamap.put(locdata.get(i), data.get(i)); } List<Location> locs = new ArrayList<Location>(); for(Location loc : locdata) { locs.add(loc); } Collections.sort(locs, new Comparator<Location>() { @Override public int compare(Location o1, Location o2) { return Double.compare(o1.getY(), o2.getY()); } }); RegenObject regen = new RegenObject(datamap, pl); getList.add(regen); f.delete(); } } } private List<String> getSerializedLocations(List<Location> list) { List<String> serialized = new ArrayList<String>(); for(Location loc : list) { String s = loc.getWorld().getName()+":"+loc.getBlockX() +":"+loc.getBlockY()+":"+loc.getBlockZ(); serialized.add(s); } return serialized; } private List<Location> getDeserializedLocations(List<String> list) { List<Location> deSerialized = new ArrayList<Location>(); for(String string : list) { String[] args = string.split(":"); World w = Bukkit.getWorld(args[0]); int x = Integer.parseInt(args[1]); int y = Integer.parseInt(args[2]); int z = Integer.parseInt(args[3]); deSerialized.add(new Location(w, x, y, z)); } return deSerialized; } @SuppressWarnings("deprecation") private List<String> getSerializedMaterialData(List<MaterialData> list) { List<String> serialized = new ArrayList<String>(); for(MaterialData data : list) { String s = data.getItemType().name()+":"+data.getData(); serialized.add(s); } return serialized; } @SuppressWarnings("deprecation") private List<MaterialData> getDeserializedMaterialData(List<String> list) { List<MaterialData> deSerialized = new ArrayList<MaterialData>(); for(String string : list) { String[] args = string.split(":"); Material mat = Material.getMaterial(args[0]); byte sub = Byte.parseByte(args[1]); deSerialized.add(new MaterialData(mat, sub)); } return deSerialized; } }