From f77b24278a4d8a444d5b17019a7a393d8161cd31 Mon Sep 17 00:00:00 2001 From: pahimar Date: Sat, 31 Jan 2015 23:47:45 -0500 Subject: [PATCH] Lots of stuff in various stages of working --- .../com/pahimar/ee3/EquivalentExchange3.java | 8 +- .../pahimar/ee3/exchange/JsonItemStack.java | 18 +++- .../pahimar/ee3/exchange/WrappedStack.java | 6 +- .../TransmutationKnowledgeHandler.java | 1 + .../ee3/knowledge/KnowledgeRegistry.java | 43 +++++++--- .../pahimar/ee3/knowledge/SkillRegistry.java | 9 ++ .../ee3/knowledge/TransmutationKnowledge.java | 82 +++++++++++++++---- .../java/com/pahimar/ee3/reference/Files.java | 2 +- .../pahimar/ee3/util/SerializationHelper.java | 43 +++++++++- 9 files changed, 181 insertions(+), 31 deletions(-) diff --git a/src/main/java/com/pahimar/ee3/EquivalentExchange3.java b/src/main/java/com/pahimar/ee3/EquivalentExchange3.java index fdf1277b..fc88e6eb 100644 --- a/src/main/java/com/pahimar/ee3/EquivalentExchange3.java +++ b/src/main/java/com/pahimar/ee3/EquivalentExchange3.java @@ -7,6 +7,7 @@ import com.pahimar.ee3.command.CommandSyncValues; import com.pahimar.ee3.exchange.EnergyValueRegistry; import com.pahimar.ee3.handler.*; import com.pahimar.ee3.init.*; +import com.pahimar.ee3.knowledge.KnowledgeRegistry; import com.pahimar.ee3.knowledge.SkillRegistry; import com.pahimar.ee3.network.PacketHandler; import com.pahimar.ee3.proxy.IProxy; @@ -52,10 +53,13 @@ public class EquivalentExchange3 @EventHandler public void onServerStarting(FMLServerStartingEvent event) { + SerializationHelper.initModDataDirectories(); + + KnowledgeRegistry.getInstance(); + event.registerServerCommand(new CommandSetValue()); event.registerServerCommand(new CommandSetCurrentItemValue()); event.registerServerCommand(new CommandSyncValues()); - SerializationHelper.initModDataDirectories(); } @EventHandler @@ -127,6 +131,8 @@ public class EquivalentExchange3 SerializationHelper.writeNBTToFile(SerializationHelper.getDataDirectory(), SerializationHelper.getModListMD5() + "." + Reference.MOD_ID.toLowerCase(), getEnergyValueRegistry()); } + KnowledgeRegistry.getInstance().saveAll(); + WorldEventHandler.hasInitilialized = false; } diff --git a/src/main/java/com/pahimar/ee3/exchange/JsonItemStack.java b/src/main/java/com/pahimar/ee3/exchange/JsonItemStack.java index f96b3477..7c4e4b7a 100644 --- a/src/main/java/com/pahimar/ee3/exchange/JsonItemStack.java +++ b/src/main/java/com/pahimar/ee3/exchange/JsonItemStack.java @@ -1,10 +1,26 @@ package com.pahimar.ee3.exchange; +import net.minecraft.item.Item; +import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; public class JsonItemStack { public String itemName; public int itemDamage; - public NBTTagCompound nbtTagCompound; + public NBTTagCompound itemNBTTagCompound; + + public JsonItemStack() { + this.itemName = null; + this.itemDamage = 0; + this.itemNBTTagCompound = null; + } + + public JsonItemStack(ItemStack itemStack) { + this.itemName = Item.itemRegistry.getNameForObject(itemStack.getItem()); + this.itemDamage = itemStack.getItemDamage(); + if (itemStack.stackTagCompound != null) { + this.itemNBTTagCompound = itemStack.getTagCompound(); + } + } } diff --git a/src/main/java/com/pahimar/ee3/exchange/WrappedStack.java b/src/main/java/com/pahimar/ee3/exchange/WrappedStack.java index 3f14e6d0..74b7b711 100644 --- a/src/main/java/com/pahimar/ee3/exchange/WrappedStack.java +++ b/src/main/java/com/pahimar/ee3/exchange/WrappedStack.java @@ -398,9 +398,9 @@ public class WrappedStack implements Comparable, JsonDeserializer< if (stackSize > 0 && item != null) { itemStack = new ItemStack(item, stackSize, jsonItemStack.itemDamage); - if (jsonItemStack.nbtTagCompound != null) + if (jsonItemStack.itemNBTTagCompound != null) { - itemStack.stackTagCompound = jsonItemStack.nbtTagCompound; + itemStack.stackTagCompound = jsonItemStack.itemNBTTagCompound; } } stackObject = itemStack; @@ -475,7 +475,7 @@ public class WrappedStack implements Comparable, JsonDeserializer< jsonItemStack.itemDamage = ((ItemStack) wrappedStack.wrappedStack).getItemDamage(); if (((ItemStack) wrappedStack.wrappedStack).stackTagCompound != null) { - jsonItemStack.nbtTagCompound = ((ItemStack) wrappedStack.wrappedStack).stackTagCompound; + jsonItemStack.itemNBTTagCompound = ((ItemStack) wrappedStack.wrappedStack).stackTagCompound; } jsonWrappedStack.add("data", gson.toJsonTree(jsonItemStack, JsonItemStack.class)); } diff --git a/src/main/java/com/pahimar/ee3/handler/TransmutationKnowledgeHandler.java b/src/main/java/com/pahimar/ee3/handler/TransmutationKnowledgeHandler.java index 424ce41a..42a3595c 100644 --- a/src/main/java/com/pahimar/ee3/handler/TransmutationKnowledgeHandler.java +++ b/src/main/java/com/pahimar/ee3/handler/TransmutationKnowledgeHandler.java @@ -14,6 +14,7 @@ import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; +// TODO Remove public class TransmutationKnowledgeHandler { public static File playerDataDirectory; diff --git a/src/main/java/com/pahimar/ee3/knowledge/KnowledgeRegistry.java b/src/main/java/com/pahimar/ee3/knowledge/KnowledgeRegistry.java index 7155fc33..cd4ae0d3 100644 --- a/src/main/java/com/pahimar/ee3/knowledge/KnowledgeRegistry.java +++ b/src/main/java/com/pahimar/ee3/knowledge/KnowledgeRegistry.java @@ -1,5 +1,6 @@ package com.pahimar.ee3.knowledge; +import com.pahimar.ee3.reference.Files; import com.pahimar.ee3.util.SerializationHelper; import net.minecraft.entity.player.EntityPlayer; @@ -16,9 +17,11 @@ public class KnowledgeRegistry private KnowledgeRegistry() { - knowledgeDirectory = new File(SerializationHelper.getPlayerDataDirectory(), "knowledge"); + knowledgeDirectory = new File(SerializationHelper.getPlayerDataDirectory(), "knowledge" + File.separator + "transmutation"); knowledgeDirectory.mkdirs(); + loadTemplateKnowledgeFromDisk(); + playerKnowledgeMap = new HashMap(); } @@ -34,14 +37,24 @@ public class KnowledgeRegistry public TransmutationKnowledge getTemplateKnowledge() { - if (templateKnowledge == null) - { - - } - return templateKnowledge; } + public void loadTemplateKnowledgeFromDisk() { + File templateFile = new File(knowledgeDirectory, Files.TEMPLATE_JSON_FILE); + + if (!templateFile.exists()) { + templateKnowledge = new TransmutationKnowledge(); + SerializationHelper.writeTransmutationKnowledgeToFile(knowledgeDirectory, Files.TEMPLATE_JSON_FILE, templateKnowledge); + } else { + templateKnowledge = SerializationHelper.readTransmutationKnowledgeFromFile(knowledgeDirectory, Files.TEMPLATE_JSON_FILE); + } + } + + public void saveTemplateKnowledgeToDisk() { + SerializationHelper.writeTransmutationKnowledgeToFile(knowledgeDirectory, Files.TEMPLATE_JSON_FILE, templateKnowledge); + } + public void loadPlayerFromDisk(EntityPlayer entityPlayer) { TransmutationKnowledge playerTransmutationKnowledge = new TransmutationKnowledge(); @@ -50,8 +63,7 @@ public class KnowledgeRegistry if (playerKnowledgeFile.exists() && playerKnowledgeFile.isFile()) { - // TODO Load from disk as JSON and not as NBT - playerTransmutationKnowledge = TransmutationKnowledge.readTransmutationKnowledgeFromNBT(SerializationHelper.readNBTFromFile(playerKnowledgeFile)); + playerTransmutationKnowledge = SerializationHelper.readTransmutationKnowledgeFromFile(knowledgeDirectory, entityPlayer.getUniqueID().toString() + ".json"); } playerKnowledgeMap.put(entityPlayer.getUniqueID(), playerTransmutationKnowledge); @@ -59,7 +71,18 @@ public class KnowledgeRegistry public void savePlayerKnowledgeToDisk(EntityPlayer entityPlayer) { - // TODO Save to disk as JSON and not as NBT - SerializationHelper.writeNBTToFile(knowledgeDirectory, entityPlayer.getUniqueID().toString() + ".json", playerKnowledgeMap.get(entityPlayer.getUniqueID())); + if (playerKnowledgeMap.containsKey(entityPlayer.getUniqueID())) { + SerializationHelper.writeTransmutationKnowledgeToFile(knowledgeDirectory, entityPlayer.getUniqueID().toString() + ".json", playerKnowledgeMap.get(entityPlayer.getUniqueID())); + } else { + SerializationHelper.writeTransmutationKnowledgeToFile(knowledgeDirectory, entityPlayer.getUniqueID().toString() + ".json", new TransmutationKnowledge()); + } + } + + public void saveAll() { + saveTemplateKnowledgeToDisk(); + + for (UUID playerUUID : playerKnowledgeMap.keySet()) { + SerializationHelper.writeTransmutationKnowledgeToFile(knowledgeDirectory, playerUUID.toString() + ".json", playerKnowledgeMap.get(playerUUID)); + } } } diff --git a/src/main/java/com/pahimar/ee3/knowledge/SkillRegistry.java b/src/main/java/com/pahimar/ee3/knowledge/SkillRegistry.java index f5cce4e0..7af7b5a0 100644 --- a/src/main/java/com/pahimar/ee3/knowledge/SkillRegistry.java +++ b/src/main/java/com/pahimar/ee3/knowledge/SkillRegistry.java @@ -1,18 +1,25 @@ package com.pahimar.ee3.knowledge; import com.pahimar.ee3.exchange.EnergyValueRegistry; +import com.pahimar.ee3.exchange.WrappedStack; import com.pahimar.ee3.handler.TransmutationKnowledgeHandler; import com.pahimar.ee3.reference.Settings; import com.pahimar.ee3.util.ItemHelper; import net.minecraft.item.ItemStack; +import java.util.Set; import java.util.SortedMap; import java.util.TreeMap; +import java.util.TreeSet; +// TODO Change up so that we only track what is not learnable, and what is not recoverable +// Everything that has an EnergyValue is learnable and recoverable unless there is an entry for it in either of these lists public class SkillRegistry { private static SkillRegistry SkillRegistry = null; private SortedMap transmutationSkills; + private Set notLearnableSet; + private Set notRecoverableSet; private SkillRegistry() { @@ -32,6 +39,8 @@ public class SkillRegistry private void init() { transmutationSkills = new TreeMap(ItemHelper.comparator); + notLearnableSet = new TreeSet(); + notRecoverableSet = new TreeSet(); } public void addSkill(ItemStack itemStack, boolean learnable, boolean recoverable) diff --git a/src/main/java/com/pahimar/ee3/knowledge/TransmutationKnowledge.java b/src/main/java/com/pahimar/ee3/knowledge/TransmutationKnowledge.java index 4b27c805..6d403a01 100644 --- a/src/main/java/com/pahimar/ee3/knowledge/TransmutationKnowledge.java +++ b/src/main/java/com/pahimar/ee3/knowledge/TransmutationKnowledge.java @@ -1,6 +1,8 @@ package com.pahimar.ee3.knowledge; import com.google.gson.*; +import com.google.gson.stream.JsonReader; +import com.google.gson.stream.JsonWriter; import com.pahimar.ee3.exchange.JsonItemStack; import com.pahimar.ee3.reference.Names; import com.pahimar.ee3.util.INBTTaggable; @@ -11,6 +13,7 @@ import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; +import java.io.*; import java.lang.reflect.Type; import java.util.*; @@ -197,7 +200,7 @@ public class TransmutationKnowledge implements INBTTaggable, JsonSerializer itemStackSet = new TreeSet(ItemHelper.comparator); + Set itemStacks = new TreeSet(ItemHelper.comparator); Iterator iterator = jsonArray.iterator(); while (iterator.hasNext()) { @@ -209,16 +212,18 @@ public class TransmutationKnowledge implements INBTTaggable, JsonSerializer iterator = transmutationKnowledge.getKnownTransmutations().iterator(); + + while (iterator.hasNext()) + { + ItemStack itemStack = iterator.next(); + jsonSerializer.toJson(new JsonItemStack(itemStack), JsonItemStack.class, jsonWriter); + } + + jsonWriter.endArray(); + jsonWriter.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + public static TransmutationKnowledge readFromFile(File file) { + Set itemStacks = new TreeSet(ItemHelper.comparator); + JsonReader jsonReader; + + try { + jsonReader = new JsonReader(new FileReader(file)); + jsonReader.beginArray(); + while (jsonReader.hasNext()) { + JsonItemStack jsonItemStack = jsonSerializer.fromJson(jsonReader, JsonItemStack.class); + + ItemStack itemStack = null; + Item item = (Item) Item.itemRegistry.getObject(jsonItemStack.itemName); + if (item != null) { + itemStack = new ItemStack(item, 1, jsonItemStack.itemDamage); + if (jsonItemStack.itemNBTTagCompound != null) { + itemStack.stackTagCompound = jsonItemStack.itemNBTTagCompound; + } + } + + if (itemStack != null) { + itemStacks.add(itemStack); + } + } + jsonReader.endArray(); + jsonReader.close(); + } catch (FileNotFoundException ignored) { + // NOOP + } catch (IOException e) { + e.printStackTrace(); + } + + return new TransmutationKnowledge(itemStacks); + } } diff --git a/src/main/java/com/pahimar/ee3/reference/Files.java b/src/main/java/com/pahimar/ee3/reference/Files.java index df23f3b9..d607f941 100644 --- a/src/main/java/com/pahimar/ee3/reference/Files.java +++ b/src/main/java/com/pahimar/ee3/reference/Files.java @@ -2,7 +2,7 @@ package com.pahimar.ee3.reference; public class Files { - public static final String PRE_ASSIGNED_ENERGY_VALUES = "pre-assigned-energy-values.json"; public static final String POST_ASSIGNED_ENERGY_VALUES = "post-assigned-energy-values.json"; + public static final String TEMPLATE_JSON_FILE = "template.json"; } diff --git a/src/main/java/com/pahimar/ee3/util/SerializationHelper.java b/src/main/java/com/pahimar/ee3/util/SerializationHelper.java index 4f2f57aa..65042758 100644 --- a/src/main/java/com/pahimar/ee3/util/SerializationHelper.java +++ b/src/main/java/com/pahimar/ee3/util/SerializationHelper.java @@ -5,6 +5,7 @@ import com.google.gson.stream.JsonWriter; import com.pahimar.ee3.api.EnergyValue; import com.pahimar.ee3.exchange.EnergyValueStackMapping; import com.pahimar.ee3.exchange.WrappedStack; +import com.pahimar.ee3.knowledge.TransmutationKnowledge; import com.pahimar.ee3.reference.Reference; import cpw.mods.fml.common.FMLCommonHandler; import cpw.mods.fml.common.Loader; @@ -126,10 +127,50 @@ public class SerializationHelper } } catch (Exception exception) { + LogHelper.warn(String.format("Failed to save %s to file: %s%s", nbtTaggable.getTagLabel(), directory.getAbsolutePath(), fileName)); + } + } + } + + public static TransmutationKnowledge readTransmutationKnowledgeFromFile(File directory, String fileName) { + if (!directory.exists()) { + directory.mkdirs(); + } + + return TransmutationKnowledge.readFromFile(new File(directory, fileName)); + } + + public static void writeTransmutationKnowledgeToFile(File directory, String fileName, TransmutationKnowledge transmutationKnowledge) { + writeTransmutationKnowledgeToFile(directory, fileName, transmutationKnowledge, false); + } + + public static void writeTransmutationKnowledgeToFile(File directory, String fileName, TransmutationKnowledge transmutationKnowledge, boolean verboseLogging) { + if (directory != null && fileName != null) { + if (!directory.exists()) { + directory.mkdirs(); + } + + if (transmutationKnowledge == null) { + transmutationKnowledge = new TransmutationKnowledge(); + } + + try { + File file1 = new File(directory, fileName + ".tmp"); + File file2 = new File(directory, fileName); + TransmutationKnowledge.saveToFile(file1, transmutationKnowledge); + + if (file2.exists()) { + file2.delete(); + } + + file1.renameTo(file2); + if (verboseLogging) { - LogHelper.warn(String.format("Failed to save %s to file: %s%s", nbtTaggable.getTagLabel(), directory.getAbsolutePath(), fileName)); + LogHelper.info(String.format("Successfully saved TransmutationKnowledge to file: %s", file2.getAbsolutePath())); } + } catch (Exception exception) { + LogHelper.error(String.format("Failed to save TransmutationKnowledge to file: %s%s", directory.getAbsolutePath(), fileName)); } } }