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:
@@ -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,46 +11,79 @@ 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 {
|
ReplayFile replayFile = new ReplayFile(ReplayHandler.getReplayFile());
|
||||||
String filepath = ReplayFile.ENTRY_ASSET_FOLDER + asset.getDisplayString() + "." + asset.getSavedFileExtension();
|
|
||||||
|
|
||||||
File toAdd = File.createTempFile(asset.getDisplayString(), asset.getSavedFileExtension());
|
Enumeration<ZipArchiveEntry> entries = replayFile.getEntries();
|
||||||
FileOutputStream fos = new FileOutputStream(toAdd);
|
while(entries.hasMoreElements()) {
|
||||||
asset.writeToStream(fos);
|
ZipArchiveEntry entry = entries.nextElement();
|
||||||
|
if(entry.getName().startsWith(ReplayFile.ENTRY_ASSET_FOLDER)) {
|
||||||
ReplayMod.replayFileAppender.registerModifiedFile(toAdd, filepath, ReplayHandler.getReplayFile());
|
ReplayMod.replayFileAppender.registerModifiedFile(null, entry.getName(), ReplayHandler.getReplayFile());
|
||||||
} catch(IOException e) {
|
}
|
||||||
e.printStackTrace();
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
|
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());
|
||||||
|
FileOutputStream fos = new FileOutputStream(toAdd);
|
||||||
|
asset.writeToStream(fos);
|
||||||
|
|
||||||
|
|
||||||
|
ReplayMod.replayFileAppender.registerModifiedFile(toAdd, filepath, ReplayHandler.getReplayFile());
|
||||||
|
} catch(IOException io) {
|
||||||
|
io.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch(IOException e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static ReplayAsset assetFromFileName(String filename) {
|
public static ReplayAsset assetFromFileName(String 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());
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user