From 3a29be6d9a6479c32d4d06d705d9ff85f6f8257c Mon Sep 17 00:00:00 2001 From: Pahimar Date: Wed, 11 May 2016 15:59:52 -0400 Subject: [PATCH] Emagherd work on the 1.7.10 version! --- .../com/pahimar/ee3/EquivalentExchange3.java | 8 ++ .../ee3/exchange/EnergyValueRegistry.java | 17 ++- .../ee3/exchange/NewEnergyValueRegistry.java | 103 ++++++++++++++++++ .../message/MessageSetEnergyValue.java | 15 ++- .../message/MessageSyncEnergyValues.java | 12 +- .../MessageTransmutationKnowledgeUpdate.java | 14 ++- .../java/com/pahimar/ee3/reference/Files.java | 33 +++++- .../pahimar/ee3/util/CompressionHelper.java | 44 +++----- .../pahimar/ee3/util/SerializationHelper.java | 4 +- 9 files changed, 206 insertions(+), 44 deletions(-) create mode 100644 src/main/java/com/pahimar/ee3/exchange/NewEnergyValueRegistry.java diff --git a/src/main/java/com/pahimar/ee3/EquivalentExchange3.java b/src/main/java/com/pahimar/ee3/EquivalentExchange3.java index b7806b7d..2bd20842 100644 --- a/src/main/java/com/pahimar/ee3/EquivalentExchange3.java +++ b/src/main/java/com/pahimar/ee3/EquivalentExchange3.java @@ -4,6 +4,7 @@ import com.pahimar.ee3.array.AlchemyArrayRegistry; import com.pahimar.ee3.command.CommandEE; import com.pahimar.ee3.exchange.CachedOreDictionary; import com.pahimar.ee3.exchange.EnergyValueRegistry; +import com.pahimar.ee3.exchange.NewEnergyValueRegistry; import com.pahimar.ee3.handler.*; import com.pahimar.ee3.init.*; import com.pahimar.ee3.knowledge.AbilityRegistry; @@ -30,6 +31,7 @@ import cpw.mods.fml.common.network.NetworkRegistry; import cpw.mods.fml.common.registry.GameRegistry; import java.io.File; +import java.io.IOException; @Mod(modid = Reference.MOD_ID, name = Reference.MOD_NAME, certificateFingerprint = Reference.FINGERPRINT, version = Reference.MOD_VERSION, dependencies = Reference.DEPENDENCIES, guiFactory = Reference.GUI_FACTORY_CLASS) public class EquivalentExchange3 @@ -117,6 +119,12 @@ public class EquivalentExchange3 { CachedOreDictionary.getInstance(); Abilities.initNotLearnables(); + + try { + NewEnergyValueRegistry.INSTANCE.save(); + } catch (IOException e) { + e.printStackTrace(); + } } @EventHandler diff --git a/src/main/java/com/pahimar/ee3/exchange/EnergyValueRegistry.java b/src/main/java/com/pahimar/ee3/exchange/EnergyValueRegistry.java index 6cead7a7..c902da62 100644 --- a/src/main/java/com/pahimar/ee3/exchange/EnergyValueRegistry.java +++ b/src/main/java/com/pahimar/ee3/exchange/EnergyValueRegistry.java @@ -52,6 +52,7 @@ public class EnergyValueRegistry implements JsonSerializer, energyValueRegistry = new EnergyValueRegistry(); } + return energyValueRegistry; } @@ -692,7 +693,7 @@ public class EnergyValueRegistry implements JsonSerializer, energyValuesDataDirectory.mkdirs(); if (shouldRegenNextRestart) { - File staticEnergyValuesJsonFile = new File(energyValuesDataDirectory, Files.STATIC_ENERGY_VALUES_JSON); + File staticEnergyValuesJsonFile = new File(energyValuesDataDirectory, Files.ENERGY_VALUES_JSON); File md5EnergyValuesJsonFile = new File(energyValuesDataDirectory, SerializationHelper.getModListMD5() + ".json"); // JSON @@ -705,21 +706,31 @@ public class EnergyValueRegistry implements JsonSerializer, shouldRegenNextRestart = false; } else { - SerializationHelper.compressEnergyValueStackMapToFile(new File(energyValuesDataDirectory, Files.STATIC_ENERGY_VALUES_JSON), energyValueRegistry.stackMappings); + SerializationHelper.compressEnergyValueStackMapToFile(new File(energyValuesDataDirectory, Files.ENERGY_VALUES_JSON), energyValueRegistry.stackMappings); SerializationHelper.compressEnergyValueStackMapToFile(new File(energyValuesDataDirectory, SerializationHelper.getModListMD5() + ".json.gz"), energyValueRegistry.stackMappings); } } + public boolean loadFromFile(File energyValueFile) { + if (energyValueFile != null) { + LogHelper.info(ENERGY_VALUE_MARKER, "Attempting to load energy values from file: {}", energyValueFile.getAbsolutePath()); + } + + return false; + } + public boolean loadEnergyValueRegistryFromFile() { File energyValuesDataDirectory = new File(FMLCommonHandler.instance().getMinecraftServerInstance().getEntityWorld().getSaveHandler().getWorldDirectory(), "data" + File.separator + Reference.LOWERCASE_MOD_ID + File.separator + "energyvalues"); energyValuesDataDirectory.mkdirs(); - File staticEnergyValuesFile = new File(energyValuesDataDirectory, Files.STATIC_ENERGY_VALUES_JSON); + File staticEnergyValuesFile = new File(energyValuesDataDirectory, Files.ENERGY_VALUES_JSON); File md5EnergyValuesFile = new File(energyValuesDataDirectory, SerializationHelper.getModListMD5() + ".json.gz"); Map stackValueMap = null; + loadFromFile(new File(Files.Global.dataDirectory, Files.ENERGY_VALUES_JSON)); + if (!Settings.DynamicEnergyValueGeneration.regenerateEnergyValuesWhen.equalsIgnoreCase("Always")) { if (Settings.DynamicEnergyValueGeneration.regenerateEnergyValuesWhen.equalsIgnoreCase("When Mods Change")) { if (md5EnergyValuesFile.exists()) { diff --git a/src/main/java/com/pahimar/ee3/exchange/NewEnergyValueRegistry.java b/src/main/java/com/pahimar/ee3/exchange/NewEnergyValueRegistry.java new file mode 100644 index 00000000..2e33ffd5 --- /dev/null +++ b/src/main/java/com/pahimar/ee3/exchange/NewEnergyValueRegistry.java @@ -0,0 +1,103 @@ +package com.pahimar.ee3.exchange; + +import com.google.common.reflect.TypeToken; +import com.google.gson.*; +import com.pahimar.ee3.api.exchange.EnergyValue; +import com.pahimar.ee3.reference.Files; +import com.pahimar.ee3.util.LogHelper; +import net.minecraft.init.Items; +import net.minecraft.nbt.NBTTagCompound; +import org.apache.logging.log4j.Marker; +import org.apache.logging.log4j.MarkerManager; + +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileWriter; +import java.io.IOException; +import java.lang.reflect.Type; +import java.util.Map; +import java.util.TreeMap; + +public class NewEnergyValueRegistry implements JsonSerializer, JsonDeserializer { + + public static final Marker ENERGY_VALUE_MARKER = MarkerManager.getMarker("EE3_ENERGY_VALUE", LogHelper.MOD_MARKER); + public static final NewEnergyValueRegistry INSTANCE = new NewEnergyValueRegistry(); + private static final Type ENERGY_VALUE_MAP_TYPE = new TypeToken>(){}.getType(); + + private final Map preCalculationMappings; + private final Map postCalculationMappings; + + private NewEnergyValueRegistry() { + preCalculationMappings = new TreeMap<>(); + // Loading up some dummy values for testing serialization + preCalculationMappings.put(WrappedStack.wrap(Items.apple), new EnergyValue(1)); + preCalculationMappings.put(WrappedStack.wrap(Items.arrow), new EnergyValue(2)); + preCalculationMappings.put(WrappedStack.wrap(Items.baked_potato), new EnergyValue(3)); + preCalculationMappings.put(WrappedStack.wrap(Items.bed), new EnergyValue(4)); + + postCalculationMappings = new TreeMap<>(); + } + + public String toJson() { + // FIXME This shouldn't be a new object all the time - we should be using an instance of a single serializer + return new GsonBuilder().setPrettyPrinting().registerTypeAdapter(NewEnergyValueRegistry.class, new NewEnergyValueRegistry()).create().toJson(this); + } + + /** + * @see net.minecraft.nbt.CompressedStreamTools#safeWrite(NBTTagCompound, File) + */ + public void save() throws IOException { + + // TODO We should probably keep the references to the energy value data dir and file in this class and not in Files. You know, anti-patterns and stuff. + File file = Files.energyValuesDataFile; + File tempFile = new File(file.getAbsolutePath() + "_tmp"); + + if (tempFile.exists()) { + tempFile.delete(); + } + + BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(tempFile)); + bufferedWriter.write(this.toJson()); + bufferedWriter.close(); + + if (file.exists()) { + file.delete(); + } + + if (file.exists()) { + throw new IOException("Failed to delete " + file); + } + else { + tempFile.renameTo(file); + } + } + + public void load() { + + } + + @Override + public NewEnergyValueRegistry deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException { + + if (json.isJsonObject()) { + JsonObject jsonRegistry = new JsonObject(); + + if (jsonRegistry.getAsJsonObject("pre_calculation_value_mappings") instanceof JsonObject) { // TODO String constant for property name + Map tempMap = context.deserialize(jsonRegistry.getAsJsonObject("pre_calculation_value_mappings"), ENERGY_VALUE_MAP_TYPE); + this.preCalculationMappings.clear(); + this.preCalculationMappings.putAll(tempMap); + } + } + + return null; + } + + @Override + public JsonElement serialize(NewEnergyValueRegistry src, Type typeOfSrc, JsonSerializationContext context) { + + JsonObject jsonRegistry = new JsonObject(); + jsonRegistry.add("pre_calculation_value_mappings", context.serialize(src.preCalculationMappings, ENERGY_VALUE_MAP_TYPE)); // TODO String constant for property name + jsonRegistry.add("post_calculation_value_mappings", context.serialize(src.postCalculationMappings, ENERGY_VALUE_MAP_TYPE)); // TODO String constant for property name + return jsonRegistry; + } +} diff --git a/src/main/java/com/pahimar/ee3/network/message/MessageSetEnergyValue.java b/src/main/java/com/pahimar/ee3/network/message/MessageSetEnergyValue.java index ca68810f..f0bc9d5a 100644 --- a/src/main/java/com/pahimar/ee3/network/message/MessageSetEnergyValue.java +++ b/src/main/java/com/pahimar/ee3/network/message/MessageSetEnergyValue.java @@ -11,6 +11,8 @@ import cpw.mods.fml.common.network.simpleimpl.IMessageHandler; import cpw.mods.fml.common.network.simpleimpl.MessageContext; import io.netty.buffer.ByteBuf; +import java.io.IOException; + public class MessageSetEnergyValue implements IMessage, IMessageHandler { public EnergyValueStackMapping energyValueStackMapping; @@ -37,7 +39,12 @@ public class MessageSetEnergyValue implements IMessage, IMessageHandler @@ -82,7 +83,12 @@ public class MessageTransmutationKnowledgeUpdate implements IMessage, IMessageHa if (compressedString != null) { - String uncompressedString = CompressionHelper.decompressStringFromByteArray(compressedString); + String uncompressedString = null; + try { + uncompressedString = CompressionHelper.decompress(compressedString); + } catch (IOException e) { + e.printStackTrace(); + } this.transmutationKnowledge = TransmutationKnowledge.createFromJson(uncompressedString); } } @@ -98,7 +104,11 @@ public class MessageTransmutationKnowledgeUpdate implements IMessage, IMessageHa if (transmutationKnowledge != null) { - compressedString = CompressionHelper.compressStringToByteArray(transmutationKnowledge.toJson()); + try { + compressedString = CompressionHelper.compress(transmutationKnowledge.toJson()); + } catch (IOException e) { + e.printStackTrace(); + } } if (compressedString != null) diff --git a/src/main/java/com/pahimar/ee3/reference/Files.java b/src/main/java/com/pahimar/ee3/reference/Files.java index 83976972..ec953bfc 100644 --- a/src/main/java/com/pahimar/ee3/reference/Files.java +++ b/src/main/java/com/pahimar/ee3/reference/Files.java @@ -4,13 +4,38 @@ import cpw.mods.fml.common.event.FMLPreInitializationEvent; import java.io.File; -public class Files -{ +public class Files { public static final String PRE_CALCULATION_ENERGY_VALUES = "pre-calculation-energy-values.json"; public static final String POST_CALCULATION_ENERGY_VALUES = "post-calculation-energy-values.json"; public static final String TEMPLATE_JSON_FILE = "template.json"; public static final String ABILITIES_JSON_FILE = "abilities.json"; - public static final String STATIC_ENERGY_VALUES_JSON = "energy-values.json.gz"; + public static final String ENERGY_VALUES_JSON = "energy-values.json"; + + public static File dataDirectory; + public static File energyValuesDataDirectory; + public static File abilitiesDataDirectory; + public static File knowledgeDataDirectory; + + public static File energyValuesDataFile; + public static File abilitiesDataFile; + public static File knowledgeDataFile; + + public static void init(FMLPreInitializationEvent event) { + + dataDirectory = new File(event.getModConfigurationDirectory().getParentFile(), "data" + File.separator + Reference.LOWERCASE_MOD_ID); + + energyValuesDataDirectory = new File(dataDirectory, "energy-values"); + energyValuesDataDirectory.mkdirs(); + energyValuesDataFile = new File(energyValuesDataDirectory, ENERGY_VALUES_JSON); + + abilitiesDataDirectory = new File(dataDirectory, "abilities"); + abilitiesDataDirectory.mkdirs(); + abilitiesDataFile = new File(abilitiesDataDirectory, ABILITIES_JSON_FILE); + + knowledgeDataDirectory = new File(dataDirectory, "knowledge"); + knowledgeDataDirectory.mkdirs(); + knowledgeDataFile = new File(knowledgeDataDirectory, TEMPLATE_JSON_FILE); + } public static class Global { @@ -28,7 +53,7 @@ public class Files dataDirectory = new File(event.getModConfigurationDirectory().getParentFile(), "data" + File.separator + Reference.LOWERCASE_MOD_ID); dataDirectory.mkdirs(); - File energyValueDataDirectory = new File(dataDirectory, "energyvalues"); + File energyValueDataDirectory = new File(dataDirectory, "energy-values"); energyValueDataDirectory.mkdirs(); preCalcluationEnergyValueFile = new File(energyValueDataDirectory, PRE_CALCULATION_ENERGY_VALUES); postCalcluationEnergyValueFile = new File(energyValueDataDirectory, POST_CALCULATION_ENERGY_VALUES); diff --git a/src/main/java/com/pahimar/ee3/util/CompressionHelper.java b/src/main/java/com/pahimar/ee3/util/CompressionHelper.java index b176aa80..55d8c9b5 100644 --- a/src/main/java/com/pahimar/ee3/util/CompressionHelper.java +++ b/src/main/java/com/pahimar/ee3/util/CompressionHelper.java @@ -1,47 +1,33 @@ package com.pahimar.ee3.util; import java.io.*; +import java.nio.charset.StandardCharsets; import java.util.zip.GZIPInputStream; import java.util.zip.GZIPOutputStream; public class CompressionHelper { - public static byte[] compressStringToByteArray(String uncompressedString) - { + public static byte[] compress(String uncompressedString) throws IOException { + ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); - GZIPOutputStream gzipOutputStream; - try - { - gzipOutputStream = new GZIPOutputStream(byteArrayOutputStream); - gzipOutputStream.write(uncompressedString.getBytes("UTF-8")); - gzipOutputStream.close(); - } - catch (IOException e) - { - e.printStackTrace(); - } + GZIPOutputStream gzipOutputStream = new GZIPOutputStream(byteArrayOutputStream); + gzipOutputStream.write(uncompressedString.getBytes(StandardCharsets.UTF_8)); + gzipOutputStream.close(); return byteArrayOutputStream.toByteArray(); } - public static String decompressStringFromByteArray(byte[] compressedString) - { - StringBuilder stringBuilder = new StringBuilder(); - try - { - GZIPInputStream gzipInputStream = new GZIPInputStream(new ByteArrayInputStream(compressedString)); - BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(gzipInputStream, "UTF-8")); + public static String decompress(byte[] compressedString) throws IOException { - String line; - while ((line = bufferedReader.readLine()) != null) - { - stringBuilder.append(line); - } - } - catch (IOException e) - { - e.printStackTrace(); + GZIPInputStream gzipInputStream = new GZIPInputStream(new ByteArrayInputStream(compressedString)); + BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(gzipInputStream, StandardCharsets.UTF_8)); + + StringBuilder stringBuilder = new StringBuilder(); + String line; + while ((line = bufferedReader.readLine()) != null) { + stringBuilder.append(line); } + return stringBuilder.toString(); } } diff --git a/src/main/java/com/pahimar/ee3/util/SerializationHelper.java b/src/main/java/com/pahimar/ee3/util/SerializationHelper.java index f8f253ea..dc413ba5 100644 --- a/src/main/java/com/pahimar/ee3/util/SerializationHelper.java +++ b/src/main/java/com/pahimar/ee3/util/SerializationHelper.java @@ -270,7 +270,7 @@ public class SerializationHelper { try { - byte[] energyValueRegistryArray = CompressionHelper.compressStringToByteArray(EnergyValueRegistry.getInstance().toJson()); + byte[] energyValueRegistryArray = CompressionHelper.compress(EnergyValueRegistry.getInstance().toJson()); FileOutputStream fos = new FileOutputStream(file); fos.write(energyValueRegistryArray); fos.close(); @@ -301,7 +301,7 @@ public class SerializationHelper try { - String jsonEnergyValueStackMap = CompressionHelper.decompressStringFromByteArray(Files.toByteArray(file)); + String jsonEnergyValueStackMap = CompressionHelper.decompress(Files.toByteArray(file)); JsonReader jsonReader = new JsonReader(new StringReader(jsonEnergyValueStackMap)); jsonReader.beginArray(); while (jsonReader.hasNext())