diff --git a/src/main/java/org/ultramine/server/UltramineServerModContainer.java b/src/main/java/org/ultramine/server/UltramineServerModContainer.java index 5811a6f..df3ebba 100644 --- a/src/main/java/org/ultramine/server/UltramineServerModContainer.java +++ b/src/main/java/org/ultramine/server/UltramineServerModContainer.java @@ -20,6 +20,7 @@ import cpw.mods.fml.common.event.FMLPostInitializationEvent; import cpw.mods.fml.common.event.FMLPreInitializationEvent; import cpw.mods.fml.common.event.FMLServerAboutToStartEvent; +import cpw.mods.fml.common.event.FMLServerStartedEvent; import cpw.mods.fml.common.event.FMLServerStartingEvent; import cpw.mods.fml.common.event.FMLServerStoppedEvent; import cpw.mods.fml.common.network.NetworkCheckHandler; @@ -96,6 +97,12 @@ } @Subscribe + public void serverStarted(FMLServerStartedEvent e) + { + MinecraftServer.getServer().getConfigurationManager().getDataLoader().loadCache(); + } + + @Subscribe public void serverStopped(FMLServerStoppedEvent e) { MinecraftServer.getServer().getMultiWorld().unregister(); diff --git a/src/main/java/org/ultramine/server/data/ServerDataLoader.java b/src/main/java/org/ultramine/server/data/ServerDataLoader.java index 8f904c2..689be1a 100644 --- a/src/main/java/org/ultramine/server/data/ServerDataLoader.java +++ b/src/main/java/org/ultramine/server/data/ServerDataLoader.java @@ -1,7 +1,10 @@ package org.ultramine.server.data; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import java.util.UUID; import org.ultramine.server.data.player.PlayerData; import org.ultramine.server.data.player.PlayerDataExtension; @@ -9,6 +12,8 @@ import org.ultramine.server.data.player.io.PlayerDataIOExecutor; import org.ultramine.server.util.GlobalExecutors; +import com.mojang.authlib.GameProfile; + import cpw.mods.fml.common.FMLCommonHandler; import net.minecraft.entity.player.EntityPlayerMP; import net.minecraft.nbt.NBTTagCompound; @@ -24,6 +29,7 @@ private final ServerConfigurationManager mgr; private final IDataProvider dataProvider; private final List dataExtinfos = new ArrayList(); + private final Map playerDataCache = new HashMap(); public ServerDataLoader(ServerConfigurationManager mgr) { @@ -36,6 +42,27 @@ return dataProvider; } + public PlayerData getPlayerData(GameProfile profile) + { + return playerDataCache.get(profile.getId()); + } + + public PlayerData getPlayerData(UUID id) + { + return playerDataCache.get(id); + } + + public PlayerData getPlayerData(String username) + { + return playerDataCache.get(mgr.getServerInstance().func_152358_ax().func_152655_a(username)); + } + + public void loadCache() + { + for(PlayerData data : dataProvider.loadAllPlayerData()) + playerDataCache.put(data.getProfile().getId(), data); + } + public void initializeConnectionToPlayer(NetworkManager network, EntityPlayerMP player, NetHandlerPlayServer nethandler) { if(isClient) @@ -46,14 +73,21 @@ } else { - PlayerDataIOExecutor.requestData(getDataProvider(), network, player, nethandler, this, true); + PlayerDataIOExecutor.requestData(getDataProvider(), network, player, nethandler, this, !playerDataCache.containsKey(player.getGameProfile().getId())); } } public void plyaerLoadCallback(NetworkManager network, EntityPlayerMP player, NetHandlerPlayServer nethandler, NBTTagCompound nbt, PlayerData data) { if(data != null) + { player.setData(data); + playerDataCache.put(data.getProfile().getId(), data); + } + else + { + player.setData(playerDataCache.get(player.getGameProfile().getId())); + } ForgeEventFactory.firePlayerLoadingEvent(player, ((SaveHandler)mgr.getPlayerNBTLoader()).getPlayerSaveDir(), player.getUniqueID().toString()); mgr.initializeConnectionToPlayer_body(network, player, nethandler, nbt); }