diff --git a/src/main/java/net/minecraft/entity/player/EntityPlayerMP.java b/src/main/java/net/minecraft/entity/player/EntityPlayerMP.java index bbd2cf3..c054ea6 100644 --- a/src/main/java/net/minecraft/entity/player/EntityPlayerMP.java +++ b/src/main/java/net/minecraft/entity/player/EntityPlayerMP.java @@ -124,7 +124,7 @@ public double managedPosZ; public final List loadedChunks = new LinkedList(); private final List destroyedItemsNetCache = new LinkedList(); - private final StatisticsFile field_147103_bO; + private StatisticsFile field_147103_bO; private float field_130068_bO = Float.MIN_VALUE; private float lastHealth = -1.0E8F; private int lastFoodLevel = -99999999; @@ -147,7 +147,6 @@ this.theItemInWorldManager = p_i45285_4_; this.mcServer = p_i45285_1_; - this.field_147103_bO = p_i45285_1_.getConfigurationManager().func_152602_a(this); this.stepHeight = 0.0F; this.yOffset = 0.0F; @@ -1028,4 +1027,9 @@ this.lastHealth = -1.0F; this.lastFoodLevel = -1; } + + public void setStatisticsFile(StatisticsFile stats) + { + this.field_147103_bO = stats; + } } diff --git a/src/main/java/net/minecraft/server/management/ServerConfigurationManager.java b/src/main/java/net/minecraft/server/management/ServerConfigurationManager.java index d299118..0348b3b 100644 --- a/src/main/java/net/minecraft/server/management/ServerConfigurationManager.java +++ b/src/main/java/net/minecraft/server/management/ServerConfigurationManager.java @@ -1080,7 +1080,13 @@ { UUID uuid = p_152602_1_.getUniqueID(); StatisticsFile statisticsfile = uuid == null ? null : (StatisticsFile)this.field_148547_k.get(uuid); + return statisticsfile; + } + public StatisticsFile loadStatisticsFile_Async(GameProfile profile) //Method splited for async loading + { + UUID uuid = profile.getId(); + StatisticsFile statisticsfile = null; if (statisticsfile == null) { File file1 = new File(this.mcServer.worldServerForDimension(0).getSaveHandler().getWorldDirectory(), "stats"); @@ -1088,7 +1094,7 @@ if (!file2.exists()) { - File file3 = new File(file1, p_152602_1_.getCommandSenderName() + ".json"); + File file3 = new File(file1, profile.getName() + ".json"); if (file3.exists() && file3.isFile()) { @@ -1098,11 +1104,15 @@ statisticsfile = new StatisticsFile(this.mcServer, file2); statisticsfile.func_150882_a(); - this.field_148547_k.put(uuid, statisticsfile); } return statisticsfile; } + + public void addStatFile(GameProfile profile, StatisticsFile statisticsfile) + { + this.field_148547_k.put(profile.getId(), statisticsfile); + } public void func_152611_a(int p_152611_1_) { diff --git a/src/main/java/org/ultramine/server/data/ServerDataLoader.java b/src/main/java/org/ultramine/server/data/ServerDataLoader.java index 9ba6d80..1c64820 100644 --- a/src/main/java/org/ultramine/server/data/ServerDataLoader.java +++ b/src/main/java/org/ultramine/server/data/ServerDataLoader.java @@ -24,6 +24,7 @@ import net.minecraft.network.NetHandlerPlayServer; import net.minecraft.network.NetworkManager; import net.minecraft.server.management.ServerConfigurationManager; +import net.minecraft.stats.StatisticsFile; import net.minecraft.world.storage.SaveHandler; import net.minecraft.world.storage.WorldInfo; import net.minecraftforge.event.ForgeEventFactory; @@ -162,16 +163,18 @@ } else { - //PlayerDataIOExecutor.requestData(getDataProvider(), network, player, nethandler, this, !playerDataCache.containsKey(player.getGameProfile().getId())); + final GameProfile profile = player.getGameProfile(); final boolean loadData = !playerDataCache.containsKey(player.getGameProfile().getId()); + final StatisticsFile loadedStats = mgr.func_152602_a(player); executor.execute(new Function() { @Override public LoadedDataStruct apply(Void input) //async { - NBTTagCompound nbt = getDataProvider().loadPlayer(player.getGameProfile()); - PlayerData data = loadData ? getDataProvider().loadPlayerData(player.getGameProfile()) : null; - return new LoadedDataStruct(nbt, data); + NBTTagCompound nbt = getDataProvider().loadPlayer(profile); + PlayerData data = loadData ? getDataProvider().loadPlayerData(profile) : null; + StatisticsFile stats = loadedStats != null ? loadedStats : mgr.loadStatisticsFile_Async(profile); + return new LoadedDataStruct(nbt, data, stats); } }, new Function() { @@ -180,7 +183,7 @@ { if(data.getNBT() != null) player.readFromNBT(data.getNBT()); - playerLoadCallback(network, player, nethandler, data.getNBT(), data.getPlayerData()); + playerLoadCallback(network, player, nethandler, data.getNBT(), data.getPlayerData(), data.getStats()); return null; } @@ -188,7 +191,7 @@ } } - public void playerLoadCallback(NetworkManager network, EntityPlayerMP player, NetHandlerPlayServer nethandler, NBTTagCompound nbt, PlayerData data) + private void playerLoadCallback(NetworkManager network, EntityPlayerMP player, NetHandlerPlayServer nethandler, NBTTagCompound nbt, PlayerData data, StatisticsFile stats) { if(data != null) { @@ -200,6 +203,8 @@ { player.setData(playerDataCache.get(player.getGameProfile().getId())); } + mgr.addStatFile(player.getGameProfile(), stats); + player.setStatisticsFile(stats); if(nbt == null) //first login { WarpLocation spawnWarp = getWarp(isClient ? "spawn" : ConfigurationHandler.getServerConfig().settings.spawnLocations.firstSpawn); @@ -234,11 +239,13 @@ { private final NBTTagCompound nbt; private final PlayerData data; + private final StatisticsFile stats; - public LoadedDataStruct(NBTTagCompound nbt, PlayerData data) + public LoadedDataStruct(NBTTagCompound nbt, PlayerData data, StatisticsFile stats) { this.nbt = nbt; this.data = data; + this.stats = stats; } public NBTTagCompound getNBT() @@ -250,5 +257,10 @@ { return data; } + + public StatisticsFile getStats() + { + return stats; + } } }