From d45fcb8a34fac6d10f6d3a53f220b35c35877f65 Mon Sep 17 00:00:00 2001 From: CrushedPixel Date: Thu, 16 Jul 2015 13:26:12 +0200 Subject: [PATCH] Only register changes in ReplayFileAppender if something changed - this applies to GuiKeyframeRepository, GuiObjectManager, GuiPlayerOverview, GuiAssetManager Added equals method to ReplayImageAsset which is based on the BufferedImage's hash code (which is calculated only once) --- .../replaymod/assets/AssetRepository.java | 14 +++++++++++++- .../replaymod/assets/CustomImageObject.java | 2 ++ .../crushedpixel/replaymod/assets/ReplayAsset.java | 2 ++ .../replaymod/assets/ReplayImageAsset.java | 13 +++++++++++++ .../replaymod/gui/GuiAssetManager.java | 7 ++++++- .../replaymod/gui/GuiKeyframeRepository.java | 6 ++++++ .../replaymod/gui/GuiObjectManager.java | 9 ++++++++- .../replaymod/gui/GuiPlayerOverview.java | 6 ++++++ .../replaymod/utils/BufferedImageUtils.java | 13 +++++++++++++ 9 files changed, 69 insertions(+), 3 deletions(-) create mode 100644 src/main/java/eu/crushedpixel/replaymod/utils/BufferedImageUtils.java diff --git a/src/main/java/eu/crushedpixel/replaymod/assets/AssetRepository.java b/src/main/java/eu/crushedpixel/replaymod/assets/AssetRepository.java index db1abb54..16292f55 100644 --- a/src/main/java/eu/crushedpixel/replaymod/assets/AssetRepository.java +++ b/src/main/java/eu/crushedpixel/replaymod/assets/AssetRepository.java @@ -3,6 +3,7 @@ package eu.crushedpixel.replaymod.assets; import eu.crushedpixel.replaymod.ReplayMod; import eu.crushedpixel.replaymod.replay.ReplayHandler; import eu.crushedpixel.replaymod.utils.ReplayFile; +import lombok.EqualsAndHashCode; import org.apache.commons.compress.archivers.zip.ZipArchiveEntry; import org.apache.commons.io.FilenameUtils; import org.apache.commons.lang3.ArrayUtils; @@ -13,14 +14,25 @@ import java.io.IOException; import java.io.InputStream; import java.util.*; +@EqualsAndHashCode public class AssetRepository { - private Map replayAssets; + private final Map replayAssets; public AssetRepository() { replayAssets = new HashMap(); } + public AssetRepository(AssetRepository toCopy) { + HashMap newAssetList = new HashMap(); + + for(Map.Entry e : toCopy.replayAssets.entrySet()) { + newAssetList.put(e.getKey(), e.getValue().copy()); + } + + this.replayAssets = newAssetList; + } + public ReplayAsset addAsset(String assetFileName, InputStream inputStream) throws IOException { return addAsset(assetFileName, inputStream, null); } diff --git a/src/main/java/eu/crushedpixel/replaymod/assets/CustomImageObject.java b/src/main/java/eu/crushedpixel/replaymod/assets/CustomImageObject.java index 5e4c7de6..990a497d 100644 --- a/src/main/java/eu/crushedpixel/replaymod/assets/CustomImageObject.java +++ b/src/main/java/eu/crushedpixel/replaymod/assets/CustomImageObject.java @@ -4,6 +4,7 @@ import eu.crushedpixel.replaymod.holders.GuiEntryListEntry; import eu.crushedpixel.replaymod.holders.Transformations; import eu.crushedpixel.replaymod.registry.ResourceHelper; import eu.crushedpixel.replaymod.replay.ReplayHandler; +import lombok.EqualsAndHashCode; import lombok.Getter; import lombok.Setter; import net.minecraft.client.Minecraft; @@ -14,6 +15,7 @@ import java.awt.image.BufferedImage; import java.io.IOException; import java.util.UUID; +@EqualsAndHashCode public class CustomImageObject implements GuiEntryListEntry { public CustomImageObject(String name, UUID assetUUID) throws IOException { diff --git a/src/main/java/eu/crushedpixel/replaymod/assets/ReplayAsset.java b/src/main/java/eu/crushedpixel/replaymod/assets/ReplayAsset.java index d4a71f48..6bce2f33 100644 --- a/src/main/java/eu/crushedpixel/replaymod/assets/ReplayAsset.java +++ b/src/main/java/eu/crushedpixel/replaymod/assets/ReplayAsset.java @@ -17,6 +17,8 @@ public interface ReplayAsset extends GuiEntryListEntry { void setAssetName(String name); + ReplayAsset copy(); + T getObject(); } diff --git a/src/main/java/eu/crushedpixel/replaymod/assets/ReplayImageAsset.java b/src/main/java/eu/crushedpixel/replaymod/assets/ReplayImageAsset.java index 9e355b38..9ae04d1a 100644 --- a/src/main/java/eu/crushedpixel/replaymod/assets/ReplayImageAsset.java +++ b/src/main/java/eu/crushedpixel/replaymod/assets/ReplayImageAsset.java @@ -3,6 +3,8 @@ package eu.crushedpixel.replaymod.assets; import eu.crushedpixel.replaymod.registry.ResourceHelper; import eu.crushedpixel.replaymod.replay.ReplayHandler; import eu.crushedpixel.replaymod.utils.BoundingUtils; +import eu.crushedpixel.replaymod.utils.BufferedImageUtils; +import lombok.EqualsAndHashCode; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.Gui; import net.minecraft.client.renderer.texture.DynamicTexture; @@ -16,14 +18,24 @@ import java.io.InputStream; import java.io.OutputStream; import java.util.UUID; +@EqualsAndHashCode(of={"name", "bufferedImageHashCode"}) public class ReplayImageAsset implements ReplayAsset { private final Minecraft mc = Minecraft.getMinecraft(); private BufferedImage object; + private int bufferedImageHashCode; private String name; + public ReplayImageAsset copy() { + ReplayImageAsset newReplay = new ReplayImageAsset(name); + newReplay.object = object; + newReplay.bufferedImageHashCode = bufferedImageHashCode; + + return newReplay; + } + public ReplayImageAsset(String name) { this.name = name; } @@ -46,6 +58,7 @@ public class ReplayImageAsset implements ReplayAsset { @Override public void loadFromStream(InputStream inputStream) throws IOException { this.object = ImageIO.read(inputStream); + this.bufferedImageHashCode = BufferedImageUtils.hashCode(object); ResourceHelper.freeResource(previewResource); for(CustomImageObject object : ReplayHandler.getCustomImageObjects()) { diff --git a/src/main/java/eu/crushedpixel/replaymod/gui/GuiAssetManager.java b/src/main/java/eu/crushedpixel/replaymod/gui/GuiAssetManager.java index 8b508f94..a8c486e1 100644 --- a/src/main/java/eu/crushedpixel/replaymod/gui/GuiAssetManager.java +++ b/src/main/java/eu/crushedpixel/replaymod/gui/GuiAssetManager.java @@ -34,10 +34,13 @@ public class GuiAssetManager extends GuiScreen { private AssetRepository assetRepository; + private final AssetRepository initialRepository; + private ReplayAsset currentAsset; public GuiAssetManager() { - this.assetRepository = ReplayHandler.getAssetRepository(); + this.initialRepository = ReplayHandler.getAssetRepository(); + this.assetRepository = new AssetRepository(ReplayHandler.getAssetRepository()); } @Override @@ -190,6 +193,8 @@ public class GuiAssetManager extends GuiScreen { new Thread(new Runnable() { @Override public void run() { + if(assetRepository.equals(initialRepository)) return; + ReplayHandler.setAssetRepository(assetRepository); assetRepository.saveAssets(); } }, "replaymod-asset-saver").start(); diff --git a/src/main/java/eu/crushedpixel/replaymod/gui/GuiKeyframeRepository.java b/src/main/java/eu/crushedpixel/replaymod/gui/GuiKeyframeRepository.java index 7f3a4014..e69b98eb 100644 --- a/src/main/java/eu/crushedpixel/replaymod/gui/GuiKeyframeRepository.java +++ b/src/main/java/eu/crushedpixel/replaymod/gui/GuiKeyframeRepository.java @@ -15,6 +15,7 @@ import net.minecraft.client.gui.GuiTextField; import net.minecraft.client.resources.I18n; import org.apache.commons.lang3.time.DurationFormatUtils; import org.lwjgl.input.Keyboard; +import scala.actors.threadpool.Arrays; import java.awt.*; import java.io.IOException; @@ -40,8 +41,11 @@ public class GuiKeyframeRepository extends GuiScreen implements GuiReplayOverlay private int currentSetTimeKeyframeCount, currentSetPositionKeyframeCount, currentSetDuration; + private final List initialKeyframeSets; + public GuiKeyframeRepository(KeyframeSet[] keyframeRepository) { this.keyframeRepository = keyframeRepository; + this.initialKeyframeSets = new ArrayList(Arrays.asList(keyframeRepository)); ReplayMod.replaySender.setReplaySpeed(0); } @@ -230,6 +234,8 @@ public class GuiKeyframeRepository extends GuiScreen implements GuiReplayOverlay private void saveOnQuit() { ArrayList copy = new ArrayList(keyframeSetList.getCopyOfElements()); + if(initialKeyframeSets.equals(copy)) return; + this.keyframeRepository = copy.toArray(new KeyframeSet[copy.size()]); ReplayHandler.setKeyframeRepository(keyframeRepository, true); } diff --git a/src/main/java/eu/crushedpixel/replaymod/gui/GuiObjectManager.java b/src/main/java/eu/crushedpixel/replaymod/gui/GuiObjectManager.java index b081f79c..a75beb92 100644 --- a/src/main/java/eu/crushedpixel/replaymod/gui/GuiObjectManager.java +++ b/src/main/java/eu/crushedpixel/replaymod/gui/GuiObjectManager.java @@ -42,6 +42,8 @@ public class GuiObjectManager extends GuiScreen { private GuiString dropdownLabel; private GuiDropdown> assetDropdown; + private final List initialObjects = ReplayHandler.getCustomImageObjects(); + private GuiDraggingNumberInput anchorXInput, anchorYInput, anchorZInput; private GuiDraggingNumberInput positionXInput, positionYInput, positionZInput; private GuiDraggingNumberInput orientationXInput, orientationYInput, orientationZInput; @@ -173,7 +175,7 @@ public class GuiObjectManager extends GuiScreen { nameInput = new GuiAdvancedTextField(fontRendererObj, 0, 0, 0, 20); nameInput.hint = I18n.format("replaymod.gui.objects.properties.name"); - for(CustomImageObject customImageObject : ReplayHandler.getCustomImageObjects()) { + for(CustomImageObject customImageObject : initialObjects) { objectList.addElement(customImageObject); } @@ -366,6 +368,11 @@ public class GuiObjectManager extends GuiScreen { private void saveOnQuit() { List objects = objectList.getCopyOfElements(); + + if(objects.equals(initialObjects)) { + return; + } + ReplayHandler.setCustomImageObjects(objects); if(objects.size() > 0) { diff --git a/src/main/java/eu/crushedpixel/replaymod/gui/GuiPlayerOverview.java b/src/main/java/eu/crushedpixel/replaymod/gui/GuiPlayerOverview.java index cca64532..b2cecf7d 100755 --- a/src/main/java/eu/crushedpixel/replaymod/gui/GuiPlayerOverview.java +++ b/src/main/java/eu/crushedpixel/replaymod/gui/GuiPlayerOverview.java @@ -54,7 +54,11 @@ public class GuiPlayerOverview extends GuiScreen implements GuiReplayOverlay.NoO private final String screenTitle = I18n.format("replaymod.input.playeroverview"); + private final Set initialHiddenPlayers; + public GuiPlayerOverview(List players) { + initialHiddenPlayers = new HashSet(PlayerHandler.getHiddenPlayers()); + Collections.sort(players, new PlayerComparator()); this.players = new ArrayList>(); @@ -304,6 +308,7 @@ public class GuiPlayerOverview extends GuiScreen implements GuiReplayOverlay.NoO private void saveOnQuit() { if(rememberHidden.isChecked()) { + if(initialHiddenPlayers.equals(PlayerHandler.getHiddenPlayers())) return; try { File f = File.createTempFile(ReplayFile.ENTRY_VISIBILITY, "json"); ReplayFileIO.write(getVisibilityInstance(), f); @@ -312,6 +317,7 @@ public class GuiPlayerOverview extends GuiScreen implements GuiReplayOverlay.NoO e.printStackTrace(); } } else { + if(initialHiddenPlayers.isEmpty()) return; ReplayMod.replayFileAppender.registerModifiedFile(null, ReplayFile.ENTRY_VISIBILITY, ReplayHandler.getReplayFile()); } } diff --git a/src/main/java/eu/crushedpixel/replaymod/utils/BufferedImageUtils.java b/src/main/java/eu/crushedpixel/replaymod/utils/BufferedImageUtils.java new file mode 100644 index 00000000..fce4c25b --- /dev/null +++ b/src/main/java/eu/crushedpixel/replaymod/utils/BufferedImageUtils.java @@ -0,0 +1,13 @@ +package eu.crushedpixel.replaymod.utils; + +import java.awt.image.BufferedImage; +import java.awt.image.DataBufferByte; +import java.util.Arrays; + +public class BufferedImageUtils { + + public static int hashCode(BufferedImage bi) { + byte[] data = ((DataBufferByte) bi.getData().getDataBuffer()).getData(); + return Arrays.hashCode(data); + } +}