diff --git a/src/main/java/org/ultramine/server/ConfigurationHandler.java b/src/main/java/org/ultramine/server/ConfigurationHandler.java index 5f96287..c38c896 100644 --- a/src/main/java/org/ultramine/server/ConfigurationHandler.java +++ b/src/main/java/org/ultramine/server/ConfigurationHandler.java @@ -5,6 +5,7 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.ultramine.server.util.AsyncIOUtils; import org.ultramine.server.util.Resources; import org.ultramine.server.util.YamlConfigProvider; @@ -37,9 +38,15 @@ serverConfig = YamlConfigProvider.getOrCreateConfig(serverConfigFile, UltramineServerConfig.class); if(!worldsConfigFile.exists()) - YamlConfigProvider.writeFile(worldsConfigFile, Resources.getAsString("/org/ultramine/defaults/defaultworlds.yml") - .replace("{seed}", Long.toString(Math.abs(new Random().nextLong())))); - worldsConfig = YamlConfigProvider.readConfig(worldsConfigFile, WorldsConfig.class); + { + String def = Resources.getAsString("/org/ultramine/defaults/defaultworlds.yml").replace("{seed}", Long.toString(Math.abs(new Random().nextLong()))); + AsyncIOUtils.writeString(worldsConfigFile, def); + worldsConfig = YamlConfigProvider.readConfig(def, WorldsConfig.class); + } + else + { + worldsConfig = YamlConfigProvider.readConfig(worldsConfigFile, WorldsConfig.class); + } } public static File getSettingDir() diff --git a/src/main/java/org/ultramine/server/data/IDataProvider.java b/src/main/java/org/ultramine/server/data/IDataProvider.java index 247d3ff..39eb470 100644 --- a/src/main/java/org/ultramine/server/data/IDataProvider.java +++ b/src/main/java/org/ultramine/server/data/IDataProvider.java @@ -1,22 +1,34 @@ package org.ultramine.server.data; import java.util.List; +import java.util.Map; import org.ultramine.server.data.player.PlayerData; +import org.ultramine.server.util.WarpLocation; import com.mojang.authlib.GameProfile; import net.minecraft.nbt.NBTTagCompound; +/** + * Все запросы на запись выполняются синхронно. На чтение могут быть выполнены + * как синхронно, так и асинхронно. + */ public interface IDataProvider { NBTTagCompound loadPlayer(GameProfile player); - + void savePlayer(GameProfile player, NBTTagCompound nbt); - + PlayerData loadPlayerData(GameProfile player); - + List loadAllPlayerData(); - + void savePlayerData(PlayerData data); + + Map loadWarps(); + + void saveWarp(String name, WarpLocation warp); + + void removeWarp(String name); } diff --git a/src/main/java/org/ultramine/server/data/NBTFileDataProvider.java b/src/main/java/org/ultramine/server/data/NBTFileDataProvider.java index 84f2bc1..f0781d7 100644 --- a/src/main/java/org/ultramine/server/data/NBTFileDataProvider.java +++ b/src/main/java/org/ultramine/server/data/NBTFileDataProvider.java @@ -5,7 +5,9 @@ import java.io.FileOutputStream; import java.io.IOException; import java.util.ArrayList; +import java.util.Collections; import java.util.List; +import java.util.Map; import java.util.UUID; import org.apache.logging.log4j.LogManager; @@ -13,6 +15,9 @@ import org.ultramine.server.data.player.PlayerData; import org.ultramine.server.data.player.PlayerDataExtension; import org.ultramine.server.data.player.PlayerDataExtensionInfo; +import org.ultramine.server.util.AsyncIOUtils; +import org.ultramine.server.util.WarpLocation; +import org.ultramine.server.util.YamlConfigProvider; import com.mojang.authlib.GameProfile; @@ -56,7 +61,7 @@ @Override public void savePlayer(GameProfile player, NBTTagCompound nbt) { - safeWriteNBT(new File(((SaveHandler)mgr.getPlayerNBTLoader()).getPlayerSaveDir(), player.getId().toString() + ".dat"), nbt); + AsyncIOUtils.safeWriteNBT(new File(((SaveHandler)mgr.getPlayerNBTLoader()).getPlayerSaveDir(), player.getId().toString() + ".dat"), nbt); } @Override @@ -103,7 +108,32 @@ nbt.setTag(info.getTagName(), extnbt); } - safeWriteNBT(new File(umPlayerDir, data.getProfile().getId().toString() + ".dat"), nbt); + AsyncIOUtils.safeWriteNBT(new File(umPlayerDir, data.getProfile().getId().toString() + ".dat"), nbt); + } + + @Override + public Map loadWarps() + { + File file = mgr.getServerInstance().getFile("warps.yml"); + if(file.exists()) + { + YamlWarpList warps = YamlConfigProvider.getOrCreateConfig(file, YamlWarpList.class); + return warps.warps; + } + + return Collections.emptyMap(); + } + + @Override + public void saveWarp(String name, WarpLocation warp) + { + writeWarpList(); + } + + @Override + public void removeWarp(String name) + { + writeWarpList(); } private void checkPlayerDir() @@ -166,4 +196,17 @@ log.warn("Failed to write file: "+file.getAbsolutePath(), e); } } + + private void writeWarpList() + { + File file = mgr.getServerInstance().getFile("warps.yml"); + YamlWarpList warps = new YamlWarpList(); + warps.warps = mgr.getDataLoader().getWarps(); + YamlConfigProvider.saveConfig(file, warps); + } + + private static class YamlWarpList + { + public Map warps; + } } diff --git a/src/main/java/org/ultramine/server/data/ServerDataLoader.java b/src/main/java/org/ultramine/server/data/ServerDataLoader.java index 689be1a..405a850 100644 --- a/src/main/java/org/ultramine/server/data/ServerDataLoader.java +++ b/src/main/java/org/ultramine/server/data/ServerDataLoader.java @@ -10,7 +10,7 @@ import org.ultramine.server.data.player.PlayerDataExtension; import org.ultramine.server.data.player.PlayerDataExtensionInfo; import org.ultramine.server.data.player.io.PlayerDataIOExecutor; -import org.ultramine.server.util.GlobalExecutors; +import org.ultramine.server.util.WarpLocation; import com.mojang.authlib.GameProfile; @@ -30,6 +30,7 @@ private final IDataProvider dataProvider; private final List dataExtinfos = new ArrayList(); private final Map playerDataCache = new HashMap(); + private final Map warps = new HashMap(); public ServerDataLoader(ServerConfigurationManager mgr) { @@ -57,10 +58,34 @@ return playerDataCache.get(mgr.getServerInstance().func_152358_ax().func_152655_a(username)); } + public WarpLocation getWarp(String name) + { + return warps.get(name); + } + + public void setWarp(String name, WarpLocation warp) + { + warps.put(name, warp); + dataProvider.saveWarp(name, warp); + } + + public void removeWarp(String name) + { + if(warps.remove(name) != null) + dataProvider.removeWarp(name); + } + + public Map getWarps() + { + return warps; + } + public void loadCache() { for(PlayerData data : dataProvider.loadAllPlayerData()) playerDataCache.put(data.getProfile().getId(), data); + warps.putAll(dataProvider.loadWarps()); + } public void initializeConnectionToPlayer(NetworkManager network, EntityPlayerMP player, NetHandlerPlayServer nethandler) @@ -77,7 +102,7 @@ } } - public void plyaerLoadCallback(NetworkManager network, EntityPlayerMP player, NetHandlerPlayServer nethandler, NBTTagCompound nbt, PlayerData data) + public void playerLoadCallback(NetworkManager network, EntityPlayerMP player, NetHandlerPlayServer nethandler, NBTTagCompound nbt, PlayerData data) { if(data != null) { @@ -92,20 +117,14 @@ mgr.initializeConnectionToPlayer_body(network, player, nethandler, nbt); } - public void savePlayer(final EntityPlayerMP player) + public void savePlayer(EntityPlayerMP player) { ForgeEventFactory.firePlayerSavingEvent(player, ((SaveHandler)mgr.getPlayerNBTLoader()).getPlayerSaveDir(), player.getUniqueID().toString()); - final NBTTagCompound nbt = new NBTTagCompound(); + NBTTagCompound nbt = new NBTTagCompound(); player.writeToNBT(nbt); - GlobalExecutors.writingIOExecutor().execute(new Runnable() - { - @Override - public void run() - { - getDataProvider().savePlayer(player.getGameProfile(), nbt); - getDataProvider().savePlayerData(player.getData()); - } - }); + + getDataProvider().savePlayer(player.getGameProfile(), nbt); + getDataProvider().savePlayerData(player.getData()); } public void registerPlayerDataExt(Class clazz, String nbtTagName) diff --git a/src/main/java/org/ultramine/server/data/player/io/PlayerDataIOProvider.java b/src/main/java/org/ultramine/server/data/player/io/PlayerDataIOProvider.java index ac804c9..18719b0 100644 --- a/src/main/java/org/ultramine/server/data/player/io/PlayerDataIOProvider.java +++ b/src/main/java/org/ultramine/server/data/player/io/PlayerDataIOProvider.java @@ -39,6 +39,6 @@ @Override public void callStage3(QueuedPlayer param, LoadedDataStruct data, ServerDataLoader callback) throws RuntimeException { - callback.plyaerLoadCallback(param.getNetwork(), param.getPlayer(), param.getNethandler(), data.getNBT(), data.getPlayerData()); + callback.playerLoadCallback(param.getNetwork(), param.getPlayer(), param.getNethandler(), data.getNBT(), data.getPlayerData()); } } diff --git a/src/main/java/org/ultramine/server/util/AsyncIOUtils.java b/src/main/java/org/ultramine/server/util/AsyncIOUtils.java index 0e3a8fc..a70710a 100644 --- a/src/main/java/org/ultramine/server/util/AsyncIOUtils.java +++ b/src/main/java/org/ultramine/server/util/AsyncIOUtils.java @@ -7,6 +7,7 @@ import net.minecraft.nbt.CompressedStreamTools; import net.minecraft.nbt.NBTTagCompound; +import org.apache.commons.io.Charsets; import org.apache.commons.io.FileUtils; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -24,7 +25,7 @@ { try { - FileUtils.writeStringToFile(file, data); + FileUtils.writeStringToFile(file, data, Charsets.UTF_8); } catch(IOException e) { diff --git a/src/main/java/org/ultramine/server/util/WarpLocation.java b/src/main/java/org/ultramine/server/util/WarpLocation.java index 20ece9c..9a7d1b8 100644 --- a/src/main/java/org/ultramine/server/util/WarpLocation.java +++ b/src/main/java/org/ultramine/server/util/WarpLocation.java @@ -13,6 +13,7 @@ public float pitch; public double randomRadius; + public WarpLocation(){} public WarpLocation(int dimension, double x, double y, double z, float yaw, float pitch, double randomRadius) { this.dimension = dimension; diff --git a/src/main/java/org/ultramine/server/util/YamlConfigProvider.java b/src/main/java/org/ultramine/server/util/YamlConfigProvider.java index cd26dfd..ae21f59 100644 --- a/src/main/java/org/ultramine/server/util/YamlConfigProvider.java +++ b/src/main/java/org/ultramine/server/util/YamlConfigProvider.java @@ -76,20 +76,13 @@ } } - public static void saveConfig(File configFile, Object o) + public static T readConfig(String config, Class clazz) { - writeFile(configFile, YAML.dumpAsMap(o)); + return YAML.loadAs(config, clazz); } - public static void writeFile(File configFile, String text) + public static void saveConfig(File configFile, Object o) { - try - { - FileUtils.write(configFile, text, Charsets.UTF_8); - } - catch (IOException e) - { - throw new RuntimeException("Failed to save config: " + configFile.getPath(), e); - } + AsyncIOUtils.writeString(configFile, YAML.dumpAsMap(o)); } }