From 26f27bdd768fe76a31c42459458a7f2292786a7b Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Sun, 27 Feb 2022 11:00:28 +0800 Subject: [PATCH] [Adventure] Try to load old save file - override mismatch --- .../adventure/stage/WorldBackground.java | 2 +- .../forge/adventure/util/SaveFileData.java | 39 ++++++++++++++++++- .../src/forge/adventure/world/World.java | 6 ++- 3 files changed, 44 insertions(+), 3 deletions(-) diff --git a/forge-gui-mobile/src/forge/adventure/stage/WorldBackground.java b/forge-gui-mobile/src/forge/adventure/stage/WorldBackground.java index 5aec3c1a7f8..98e39d23a24 100644 --- a/forge-gui-mobile/src/forge/adventure/stage/WorldBackground.java +++ b/forge-gui-mobile/src/forge/adventure/stage/WorldBackground.java @@ -116,7 +116,7 @@ public class WorldBackground extends Actor { sprites = chunksSpritesBackground[x][y]; if (sprites != null) { for (Actor sprite : sprites) { - stage.GetSpriteGroup().removeActor(sprite); + stage.GetBackgroundSprites().removeActor(sprite); } } } diff --git a/forge-gui-mobile/src/forge/adventure/util/SaveFileData.java b/forge-gui-mobile/src/forge/adventure/util/SaveFileData.java index 8516b4919d3..4ec638f73dd 100644 --- a/forge-gui-mobile/src/forge/adventure/util/SaveFileData.java +++ b/forge-gui-mobile/src/forge/adventure/util/SaveFileData.java @@ -9,8 +9,10 @@ import forge.Forge; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; +import java.io.InputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; +import java.io.ObjectStreamClass; import java.util.HashMap; public class SaveFileData extends HashMap @@ -181,7 +183,7 @@ public class SaveFileData extends HashMap try { ByteArrayInputStream stream=new ByteArrayInputStream(get(key)); - ObjectInputStream objStream=new ObjectInputStream(stream); + ObjectInputStream objStream=new DecompressibleInputStream(stream); return objStream.readObject(); } catch (IOException | ClassNotFoundException e) { @@ -327,5 +329,40 @@ public class SaveFileData extends HashMap return false; } + class DecompressibleInputStream extends ObjectInputStream { + //private static Logger logger = LoggerFactory.getLogger(DecompressibleInputStream.class); + + public DecompressibleInputStream(InputStream in) throws IOException { + super(in); + } + + @Override + protected ObjectStreamClass readClassDescriptor() throws IOException, ClassNotFoundException { + ObjectStreamClass resultClassDescriptor = super.readClassDescriptor(); // initially streams descriptor + Class localClass; // the class in the local JVM that this descriptor represents. + try { + localClass = Class.forName(resultClassDescriptor.getName()); + } catch (ClassNotFoundException e) { + //logger.error("No local class for " + resultClassDescriptor.getName(), e); + System.err.println("[Class Not Found Exception]\nNo local class for " + resultClassDescriptor.getName()); + return resultClassDescriptor; + } + ObjectStreamClass localClassDescriptor = ObjectStreamClass.lookup(localClass); + if (localClassDescriptor != null) { // only if class implements serializable + final long localSUID = localClassDescriptor.getSerialVersionUID(); + final long streamSUID = resultClassDescriptor.getSerialVersionUID(); + if (streamSUID != localSUID) { // check for serialVersionUID mismatch. + final StringBuffer s = new StringBuffer("Overriding serialized class version mismatch: "); + s.append("local serialVersionUID = ").append(localSUID); + s.append(" stream serialVersionUID = ").append(streamSUID); + //Exception e = new InvalidClassException(s.toString()); + //logger.error("Potentially Fatal Deserialization Operation.", e); + System.err.println("[Invalid Class Exception\n]"+s); + resultClassDescriptor = localClassDescriptor; // Use local class descriptor for deserialization + } + } + return resultClassDescriptor; + } + } } diff --git a/forge-gui-mobile/src/forge/adventure/world/World.java b/forge-gui-mobile/src/forge/adventure/world/World.java index 3cf516e4e57..cad5cfc0af2 100644 --- a/forge-gui-mobile/src/forge/adventure/world/World.java +++ b/forge-gui-mobile/src/forge/adventure/world/World.java @@ -214,7 +214,11 @@ public class World implements Disposable, SaveFileContent { } public long getBiome(int x, int y) { - return biomeMap[x][height - y]; + try { + return biomeMap[x][height - y]; + } catch (ArrayIndexOutOfBoundsException e) { + return biomeMap[biomeMap.length-1][biomeMap[biomeMap.length-1].length-1]; + } } public WorldData getData() {