diff --git a/src/main/java/foxz/command/CmdDialog.java b/src/main/java/foxz/command/CmdDialog.java index ddca58150..6f807a962 100644 --- a/src/main/java/foxz/command/CmdDialog.java +++ b/src/main/java/foxz/command/CmdDialog.java @@ -50,7 +50,7 @@ public class CmdDialog extends ChMcLogger { } for(PlayerData playerdata : data){ playerdata.dialogData.dialogsRead.add(diagid); - playerdata.saveNBTData(null); + playerdata.savePlayerDataOnFile(); } return true; } @@ -76,7 +76,7 @@ public class CmdDialog extends ChMcLogger { } for(PlayerData playerdata : data){ playerdata.dialogData.dialogsRead.remove(diagid); - playerdata.saveNBTData(null); + playerdata.savePlayerDataOnFile(); } return true; } diff --git a/src/main/java/foxz/command/CmdNoppes.java b/src/main/java/foxz/command/CmdNoppes.java index 8c2cc2e8c..581edb266 100644 --- a/src/main/java/foxz/command/CmdNoppes.java +++ b/src/main/java/foxz/command/CmdNoppes.java @@ -101,7 +101,7 @@ public class CmdNoppes extends ChMcLogger { cmdfaction.processCommand(this.pcParam, args); for(PlayerData playerdata : cmdfaction.data){ - playerdata.saveNBTData(null); + playerdata.savePlayerDataOnFile(); } return true; } diff --git a/src/main/java/foxz/command/CmdQuest.java b/src/main/java/foxz/command/CmdQuest.java index d531d8943..0cd4fcd76 100644 --- a/src/main/java/foxz/command/CmdQuest.java +++ b/src/main/java/foxz/command/CmdQuest.java @@ -56,7 +56,7 @@ public class CmdQuest extends ChMcLogger{ continue; QuestData questdata = new QuestData(quest); playerdata.questData.activeQuests.put(questid, questdata); - playerdata.saveNBTData(null); + playerdata.savePlayerDataOnFile(); if(playerdata.player != null){ Server.sendData((EntityPlayerMP)playerdata.player, EnumPacketClient.MESSAGE, "quest.newquest", quest.title); Server.sendData((EntityPlayerMP)playerdata.player, EnumPacketClient.CHAT, "quest.newquest", ": ", quest.title); @@ -93,7 +93,7 @@ public class CmdQuest extends ChMcLogger{ } for(PlayerData playerdata : data){ playerdata.questData.finishedQuests.put(questid, System.currentTimeMillis()); - playerdata.saveNBTData(null); + playerdata.savePlayerDataOnFile(); } return true; } @@ -124,7 +124,7 @@ public class CmdQuest extends ChMcLogger{ } for(PlayerData playerdata : data){ playerdata.questData.activeQuests.remove(questid); - playerdata.saveNBTData(null); + playerdata.savePlayerDataOnFile(); } return true; } @@ -156,7 +156,7 @@ public class CmdQuest extends ChMcLogger{ for(PlayerData playerdata : data){ playerdata.questData.activeQuests.remove(questid); playerdata.questData.finishedQuests.remove(questid); - playerdata.saveNBTData(null); + playerdata.savePlayerDataOnFile(); } return true; } diff --git a/src/main/java/noppes/npcs/NoppesUtilServer.java b/src/main/java/noppes/npcs/NoppesUtilServer.java index 4d4e1f2c3..37985f05f 100644 --- a/src/main/java/noppes/npcs/NoppesUtilServer.java +++ b/src/main/java/noppes/npcs/NoppesUtilServer.java @@ -479,7 +479,7 @@ public class NoppesUtilServer { if(pl != null){ playerdata.setNBT(new NBTTagCompound()); sendPlayerData(type, player, name); - playerdata.saveNBTData(null); + playerdata.savePlayerDataOnFile(); return; } } @@ -488,27 +488,27 @@ public class NoppesUtilServer { int questId = buffer.readInt(); data.activeQuests.remove(questId); data.finishedQuests.remove(questId); - playerdata.saveNBTData(null); + playerdata.savePlayerDataOnFile(); } if(type == EnumPlayerData.Dialog){ PlayerDialogData data = playerdata.dialogData; data.dialogsRead.remove(buffer.readInt()); - playerdata.saveNBTData(null); + playerdata.savePlayerDataOnFile(); } if(type == EnumPlayerData.Transport){ PlayerTransportData data = playerdata.transportData; data.transports.remove(buffer.readInt()); - playerdata.saveNBTData(null); + playerdata.savePlayerDataOnFile(); } if(type == EnumPlayerData.Bank){ PlayerBankData data = playerdata.bankData; data.banks.remove(buffer.readInt()); - playerdata.saveNBTData(null); + playerdata.savePlayerDataOnFile(); } if(type == EnumPlayerData.Factions){ PlayerFactionData data = playerdata.factionData; data.factionData.remove(buffer.readInt()); - playerdata.saveNBTData(null); + playerdata.savePlayerDataOnFile(); } sendPlayerData(type, player, name); } diff --git a/src/main/java/noppes/npcs/ServerEventsHandler.java b/src/main/java/noppes/npcs/ServerEventsHandler.java index 1f7a81cde..1aa56df59 100644 --- a/src/main/java/noppes/npcs/ServerEventsHandler.java +++ b/src/main/java/noppes/npcs/ServerEventsHandler.java @@ -27,6 +27,7 @@ import net.minecraftforge.event.entity.living.LivingDeathEvent; import net.minecraftforge.event.entity.living.LivingHurtEvent; import net.minecraftforge.event.entity.player.EntityInteractEvent; import net.minecraftforge.event.entity.player.EntityItemPickupEvent; +import net.minecraftforge.event.entity.player.PlayerEvent; import net.minecraftforge.event.entity.player.PlayerInteractEvent; import net.minecraftforge.event.entity.player.PlayerInteractEvent.Action; import net.minecraftforge.event.terraingen.PopulateChunkEvent; @@ -276,7 +277,7 @@ public class ServerEventsHandler { } if(event.entityLiving instanceof EntityPlayer){ PlayerData data = PlayerDataController.instance.getPlayerData((EntityPlayer)event.entityLiving); - data.saveNBTData(null); + data.savePlayerDataOnFile(); } } @@ -360,6 +361,12 @@ public class ServerEventsHandler { data.updateCompanion(event.world); } + @SubscribeEvent + public void world(PlayerEvent.SaveToFile event){ + PlayerData data = PlayerDataController.instance.getPlayerData((EntityPlayer) event.entity); + data.savePlayerDataOnFile(); + } + @SubscribeEvent public void populateChunk(PopulateChunkEvent.Post event){ NPCSpawning.performWorldGenSpawning(event.world, event.chunkX, event.chunkZ, event.rand); diff --git a/src/main/java/noppes/npcs/controllers/PlayerDataController.java b/src/main/java/noppes/npcs/controllers/PlayerDataController.java index e3b929502..ee1976176 100644 --- a/src/main/java/noppes/npcs/controllers/PlayerDataController.java +++ b/src/main/java/noppes/npcs/controllers/PlayerDataController.java @@ -4,7 +4,10 @@ import java.io.File; import java.io.FileInputStream; import java.util.HashMap; import java.util.Map; +import java.util.concurrent.Executor; +import java.util.concurrent.Executors; +import cpw.mods.fml.common.FMLLog; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.CompressedStreamTools; import net.minecraft.nbt.NBTTagCompound; @@ -86,21 +89,24 @@ public class PlayerDataController { return new NBTTagCompound(); } + private static Executor executor = Executors.newSingleThreadExecutor(); public void savePlayerData(PlayerData data){ NBTTagCompound compound = data.getNBT(); - String filename = data.uuid + ".json"; - try { - File saveDir = getSaveDir(); - File file = new File(saveDir, filename+"_new"); - File file1 = new File(saveDir, filename); - NBTJsonUtil.SaveFile(file, compound); - if(file1.exists()){ - file1.delete(); + executor.execute(() -> { + String filename = data.uuid + ".json"; + try { + File saveDir = getSaveDir(); + File file = new File(saveDir, filename+"_new"); + File file1 = new File(saveDir, filename); + NBTJsonUtil.SaveFile(file, compound); + if(file1.exists()){ + file1.delete(); + } + file.renameTo(file1); + } catch (Exception e) { + LogWriter.except(e); } - file.renameTo(file1); - } catch (Exception e) { - LogWriter.except(e); - } + }); } public PlayerBankData getBankData(EntityPlayer player, int bankId) { @@ -117,7 +123,7 @@ public class PlayerDataController { if(data == null){ player.registerExtendedProperties("CustomNpcsData", data = new PlayerData()); data.player = player; - data.loadNBTData(null); + data.loadPlayerDataFromFile(); } data.player = player; return data; diff --git a/src/main/java/noppes/npcs/controllers/data/PlayerData.java b/src/main/java/noppes/npcs/controllers/data/PlayerData.java index 6fa62f017..26a1f3673 100644 --- a/src/main/java/noppes/npcs/controllers/data/PlayerData.java +++ b/src/main/java/noppes/npcs/controllers/data/PlayerData.java @@ -49,12 +49,20 @@ public class PlayerData implements IExtendedEntityProperties, IPlayerData { public boolean isGUIOpen = false; @Override - public void saveNBTData(NBTTagCompound compound) { + public void saveNBTData(NBTTagCompound nbtTagCompound) { + //Do Nothing + } + + public void savePlayerDataOnFile() { PlayerDataController.instance.savePlayerData(this); } @Override public void loadNBTData(NBTTagCompound compound) { + //Do Nothing + } + + public void loadPlayerDataFromFile() { NBTTagCompound data = PlayerDataController.instance.loadPlayerData(player.getPersistentID().toString()); if(data.hasNoTags()){ data = PlayerDataController.instance.loadPlayerDataOld(player.getCommandSenderName()); @@ -130,11 +138,11 @@ public class PlayerData implements IExtendedEntityProperties, IPlayerData { public void setGUIOpen(boolean bool) { isGUIOpen = bool; - saveNBTData(null); + savePlayerDataOnFile(); } public boolean getGUIOpen() { - loadNBTData(null); + loadPlayerDataFromFile(); return isGUIOpen; } @@ -149,7 +157,7 @@ public class PlayerData implements IExtendedEntityProperties, IPlayerData { activeCompanion = npc; if(npc != null) ((RoleCompanion)npc.roleInterface).companionID = companionID; - saveNBTData(null); + savePlayerDataOnFile(); } public void updateCompanion(World world) { diff --git a/src/main/java/noppes/npcs/quests/QuestDialog.java b/src/main/java/noppes/npcs/quests/QuestDialog.java index b54721fd2..8d6294a00 100644 --- a/src/main/java/noppes/npcs/quests/QuestDialog.java +++ b/src/main/java/noppes/npcs/quests/QuestDialog.java @@ -99,13 +99,13 @@ public class QuestDialog extends QuestInterface implements IQuestDialog { if (progress == 0 && completed) { data.dialogData.dialogsRead.remove(this.dialog.id); data.questData.checkQuestCompletion(data, EnumQuestType.values()[1]); - data.saveNBTData(data.getNBT()); + data.savePlayerDataOnFile(); } if (progress == 1 && !completed) { data.dialogData.dialogsRead.add(this.dialog.id); data.questData.checkQuestCompletion(data, EnumQuestType.values()[1]); - data.saveNBTData(data.getNBT()); + data.savePlayerDataOnFile(); } } else { diff --git a/src/main/java/noppes/npcs/quests/QuestKill.java b/src/main/java/noppes/npcs/quests/QuestKill.java index d3595d0f4..576ba31bf 100644 --- a/src/main/java/noppes/npcs/quests/QuestKill.java +++ b/src/main/java/noppes/npcs/quests/QuestKill.java @@ -161,7 +161,7 @@ public class QuestKill extends QuestInterface implements IQuestKill { this.parent.setKilled(questdata, killed); data.questData.checkQuestCompletion(data, EnumQuestType.values()[2]); data.questData.checkQuestCompletion(data, EnumQuestType.values()[4]); - data.saveNBTData(data.getNBT()); + data.savePlayerDataOnFile(); } } else { throw new CustomNPCsException("Progress has to be between 0 and " + this.amount, new Object[0]); diff --git a/src/main/java/noppes/npcs/quests/QuestLocation.java b/src/main/java/noppes/npcs/quests/QuestLocation.java index 93c4757a7..50360753d 100644 --- a/src/main/java/noppes/npcs/quests/QuestLocation.java +++ b/src/main/java/noppes/npcs/quests/QuestLocation.java @@ -166,7 +166,7 @@ public class QuestLocation extends QuestInterface implements IQuestLocation { if ((!completed || progress != 1) && (completed || progress != 0)) { questData.extraData.setBoolean(this.nbtName, progress == 1); data.questData.checkQuestCompletion(data, EnumQuestType.values()[3]); - data.saveNBTData(data.getNBT()); + data.savePlayerDataOnFile(); } } else { throw new CustomNPCsException("Progress has to be 0 or 1", new Object[0]);