Reworked AssetRepository to link every Asset to a UUID

UUIDs are now being stored in the Replay File and loaded
This commit is contained in:
CrushedPixel
2015-07-07 20:14:40 +02:00
parent 40acb3f72d
commit 89cc6938f8
5 changed files with 97 additions and 25 deletions

View File

@@ -3,6 +3,7 @@ package eu.crushedpixel.replaymod.assets;
import eu.crushedpixel.replaymod.ReplayMod; import eu.crushedpixel.replaymod.ReplayMod;
import eu.crushedpixel.replaymod.replay.ReplayHandler; import eu.crushedpixel.replaymod.replay.ReplayHandler;
import eu.crushedpixel.replaymod.utils.ReplayFile; import eu.crushedpixel.replaymod.utils.ReplayFile;
import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
import org.apache.commons.io.FilenameUtils; import org.apache.commons.io.FilenameUtils;
import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.ArrayUtils;
@@ -10,48 +11,81 @@ import java.io.File;
import java.io.FileOutputStream; import java.io.FileOutputStream;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.util.ArrayList; import java.util.*;
import java.util.List;
public class AssetRepository { public class AssetRepository {
private List<ReplayAsset> replayAssets; private Map<UUID, ReplayAsset> replayAssets;
public AssetRepository() { public AssetRepository() {
replayAssets = new ArrayList<ReplayAsset>(); replayAssets = new HashMap<UUID, ReplayAsset>();
} }
public ReplayAsset addAsset(String assetFileName, InputStream inputStream) throws IOException { public ReplayAsset addAsset(String assetFileName, InputStream inputStream) throws IOException {
return addAsset(assetFileName, inputStream, null);
}
public ReplayAsset addAsset(String assetFileName, InputStream inputStream, UUID uuid) throws IOException {
if(uuid == null) {
uuid = UUID.randomUUID();
} else {
assetFileName = assetFileName.replace(uuid.toString()+"_", "");
}
ReplayAsset asset = assetFromFileName(assetFileName); ReplayAsset asset = assetFromFileName(assetFileName);
asset.loadFromStream(inputStream); asset.loadFromStream(inputStream);
replayAssets.add(asset); replayAssets.put(uuid, asset);
return asset; return asset;
} }
public void removeAsset(ReplayAsset asset) { public void removeAsset(ReplayAsset asset) {
replayAssets.remove(asset); for(Map.Entry<UUID, ReplayAsset> e :
new HashSet<Map.Entry<UUID, ReplayAsset>>(replayAssets.entrySet()))
if(e.getValue().equals(asset))
replayAssets.remove(e.getKey());
} }
public void saveAssets() { public void saveAssets() {
for(ReplayAsset asset : replayAssets) {
try { try {
String filepath = ReplayFile.ENTRY_ASSET_FOLDER + asset.getDisplayString() + "." + asset.getSavedFileExtension(); ReplayFile replayFile = new ReplayFile(ReplayHandler.getReplayFile());
Enumeration<ZipArchiveEntry> entries = replayFile.getEntries();
while(entries.hasMoreElements()) {
ZipArchiveEntry entry = entries.nextElement();
if(entry.getName().startsWith(ReplayFile.ENTRY_ASSET_FOLDER)) {
ReplayMod.replayFileAppender.registerModifiedFile(null, entry.getName(), ReplayHandler.getReplayFile());
}
}
replayFile.close();
ReplayMod.replayFileAppender.deleteAllFilesByFolder(ReplayFile.ENTRY_ASSET_FOLDER, ReplayHandler.getReplayFile());
for(Map.Entry<UUID, ReplayAsset> e : replayAssets.entrySet()) {
UUID uuid = e.getKey();
ReplayAsset asset = e.getValue();
try {
String filepath = ReplayFile.ENTRY_ASSET_FOLDER + uuid.toString()+ "_" + asset.getDisplayString() + "." + asset.getSavedFileExtension();
File toAdd = File.createTempFile(asset.getDisplayString(), asset.getSavedFileExtension()); File toAdd = File.createTempFile(asset.getDisplayString(), asset.getSavedFileExtension());
FileOutputStream fos = new FileOutputStream(toAdd); FileOutputStream fos = new FileOutputStream(toAdd);
asset.writeToStream(fos); asset.writeToStream(fos);
ReplayMod.replayFileAppender.registerModifiedFile(toAdd, filepath, ReplayHandler.getReplayFile()); ReplayMod.replayFileAppender.registerModifiedFile(toAdd, filepath, ReplayHandler.getReplayFile());
} catch(IOException io) {
io.printStackTrace();
}
}
} catch(IOException e) { } catch(IOException e) {
e.printStackTrace(); e.printStackTrace();
} }
} }
}
public static ReplayAsset assetFromFileName(String filename) { public static ReplayAsset assetFromFileName(String filename) {
String baseName = FilenameUtils.getBaseName(filename); String baseName = FilenameUtils.getBaseName(filename);
String extension = FilenameUtils.getExtension(filename); String extension = FilenameUtils.getExtension(filename);
@@ -63,6 +97,8 @@ public class AssetRepository {
throw new UnsupportedOperationException("Can't create ReplayAsset from File "+filename); throw new UnsupportedOperationException("Can't create ReplayAsset from File "+filename);
} }
public List<ReplayAsset> getCopyOfReplayAssets() {
return new ArrayList<ReplayAsset>(replayAssets.values());
}
} }

View File

@@ -1,7 +1,6 @@
package eu.crushedpixel.replaymod.events.handlers; package eu.crushedpixel.replaymod.events.handlers;
import eu.crushedpixel.replaymod.ReplayMod; import eu.crushedpixel.replaymod.ReplayMod;
import eu.crushedpixel.replaymod.assets.AssetRepository;
import eu.crushedpixel.replaymod.entities.CameraEntity.MoveDirection; import eu.crushedpixel.replaymod.entities.CameraEntity.MoveDirection;
import eu.crushedpixel.replaymod.gui.GuiAssetManager; import eu.crushedpixel.replaymod.gui.GuiAssetManager;
import eu.crushedpixel.replaymod.gui.GuiKeyframeRepository; import eu.crushedpixel.replaymod.gui.GuiKeyframeRepository;
@@ -204,7 +203,7 @@ public class KeyInputHandler {
} }
if(kb.getKeyDescription().equals(KeybindRegistry.KEY_ASSET_MANAGER) && (kb.isPressed() || kb.getKeyCode() == keyCode)) { if(kb.getKeyDescription().equals(KeybindRegistry.KEY_ASSET_MANAGER) && (kb.isPressed() || kb.getKeyCode() == keyCode)) {
mc.displayGuiScreen(new GuiAssetManager(new AssetRepository())); mc.displayGuiScreen(new GuiAssetManager());
} }
} }
} }

View File

@@ -6,6 +6,7 @@ import eu.crushedpixel.replaymod.assets.ReplayAsset;
import eu.crushedpixel.replaymod.gui.elements.*; import eu.crushedpixel.replaymod.gui.elements.*;
import eu.crushedpixel.replaymod.gui.elements.listeners.FileChooseListener; import eu.crushedpixel.replaymod.gui.elements.listeners.FileChooseListener;
import eu.crushedpixel.replaymod.gui.elements.listeners.SelectionListener; import eu.crushedpixel.replaymod.gui.elements.listeners.SelectionListener;
import eu.crushedpixel.replaymod.replay.ReplayHandler;
import eu.crushedpixel.replaymod.utils.MouseUtils; import eu.crushedpixel.replaymod.utils.MouseUtils;
import net.minecraft.client.gui.GuiScreen; import net.minecraft.client.gui.GuiScreen;
import net.minecraft.client.resources.I18n; import net.minecraft.client.resources.I18n;
@@ -35,8 +36,8 @@ public class GuiAssetManager extends GuiScreen {
private ReplayAsset currentAsset; private ReplayAsset currentAsset;
public GuiAssetManager(AssetRepository assetRepository) { public GuiAssetManager() {
this.assetRepository = assetRepository; this.assetRepository = ReplayHandler.getAssetRepository();
} }
@Override @Override
@@ -110,6 +111,10 @@ public class GuiAssetManager extends GuiScreen {
fileChooser.setAllowedExtensions(currentAsset != null ? AssetFileUtils.fileExtensionsForAssetClass(currentAsset.getClass()) : new String[0]); fileChooser.setAllowedExtensions(currentAsset != null ? AssetFileUtils.fileExtensionsForAssetClass(currentAsset.getClass()) : new String[0]);
} }
}); });
for(ReplayAsset asset : assetRepository.getCopyOfReplayAssets()) {
assetGuiEntryList.addElement(asset);
}
} }
int visibleEntries = (int)Math.floor(((double)this.height-(45+20+15+20))/14); int visibleEntries = (int)Math.floor(((double)this.height-(45+20+15+20))/14);
@@ -165,6 +170,11 @@ public class GuiAssetManager extends GuiScreen {
protected void keyTyped(char typedChar, int keyCode) throws IOException { protected void keyTyped(char typedChar, int keyCode) throws IOException {
Point mousePos = MouseUtils.getMousePos(); Point mousePos = MouseUtils.getMousePos();
composedElement.buttonPressed(mc, mousePos.getX(), mousePos.getY(), typedChar, keyCode); composedElement.buttonPressed(mc, mousePos.getX(), mousePos.getY(), typedChar, keyCode);
if(currentAsset != null) {
currentAsset.setAssetName(assetNameInput.getText());
}
super.keyTyped(typedChar, keyCode); super.keyTyped(typedChar, keyCode);
} }
@@ -172,4 +182,14 @@ public class GuiAssetManager extends GuiScreen {
public void updateScreen() { public void updateScreen() {
composedElement.tick(mc); composedElement.tick(mc);
} }
@Override
public void onGuiClosed() {
new Thread(new Runnable() {
@Override
public void run() {
assetRepository.saveAssets();
}
}, "replaymod-asset-saver").start();
}
} }

View File

@@ -2,6 +2,7 @@ package eu.crushedpixel.replaymod.replay;
import com.mojang.authlib.GameProfile; import com.mojang.authlib.GameProfile;
import eu.crushedpixel.replaymod.ReplayMod; import eu.crushedpixel.replaymod.ReplayMod;
import eu.crushedpixel.replaymod.assets.AssetRepository;
import eu.crushedpixel.replaymod.entities.CameraEntity; import eu.crushedpixel.replaymod.entities.CameraEntity;
import eu.crushedpixel.replaymod.events.KeyframesModifyEvent; import eu.crushedpixel.replaymod.events.KeyframesModifyEvent;
import eu.crushedpixel.replaymod.events.ReplayExitEvent; import eu.crushedpixel.replaymod.events.ReplayExitEvent;
@@ -11,6 +12,8 @@ import eu.crushedpixel.replaymod.settings.RenderOptions;
import eu.crushedpixel.replaymod.utils.ReplayFile; import eu.crushedpixel.replaymod.utils.ReplayFile;
import eu.crushedpixel.replaymod.utils.ReplayFileIO; import eu.crushedpixel.replaymod.utils.ReplayFileIO;
import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelHandlerContext;
import lombok.Getter;
import lombok.Setter;
import net.minecraft.client.Minecraft; import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiYesNo; import net.minecraft.client.gui.GuiYesNo;
import net.minecraft.client.gui.GuiYesNoCallback; import net.minecraft.client.gui.GuiYesNoCallback;
@@ -52,6 +55,9 @@ public class ReplayHandler {
private static KeyframeSet[] keyframeRepository = new KeyframeSet[]{}; private static KeyframeSet[] keyframeRepository = new KeyframeSet[]{};
@Getter @Setter
private static AssetRepository assetRepository;
private static List<CustomImageObject> customImageObjects = new ArrayList<CustomImageObject>(); private static List<CustomImageObject> customImageObjects = new ArrayList<CustomImageObject>();
/** /**
@@ -555,6 +561,10 @@ public class ReplayHandler {
PlayerVisibility visibility = currentReplayFile.visibility().get(); PlayerVisibility visibility = currentReplayFile.visibility().get();
PlayerHandler.loadPlayerVisibilityConfiguration(visibility); PlayerHandler.loadPlayerVisibilityConfiguration(visibility);
//load assets
AssetRepository assets = currentReplayFile.assetRepository().get();
assetRepository = assets;
ReplayMod.replaySender = new ReplaySender(currentReplayFile, asyncMode); ReplayMod.replaySender = new ReplaySender(currentReplayFile, asyncMode);
channel.pipeline().addFirst(ReplayMod.replaySender); channel.pipeline().addFirst(ReplayMod.replaySender);
channel.pipeline().fireChannelActive(); channel.pipeline().fireChannelActive();

View File

@@ -18,6 +18,7 @@ import java.io.*;
import java.util.Enumeration; import java.util.Enumeration;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.UUID;
public class ReplayFile extends ZipFile { public class ReplayFile extends ZipFile {
@@ -238,11 +239,17 @@ public class ReplayFile extends ZipFile {
try { try {
ZipArchiveEntry entry = entries.nextElement(); ZipArchiveEntry entry = entries.nextElement();
if(entry.getName().startsWith(ENTRY_ASSET_FOLDER)) { String entryName = entry.getName();
if(entryName.startsWith(ENTRY_ASSET_FOLDER)) {
String name = entry.getName().substring(ENTRY_ASSET_FOLDER.length()); String name = entry.getName().substring(ENTRY_ASSET_FOLDER.length());
assetRepository.addAsset(name, getInputStream(entry));
String[] split = name.split("_");
UUID uuid = UUID.fromString(split[0]);
assetRepository.addAsset(name, getInputStream(entry), uuid);
} }
} catch(IOException e) { } catch(Exception e) {
e.printStackTrace(); e.printStackTrace();
} }
} }