diff --git a/src/main/java/fr/moribus/imageonmap/image/Renderer.java b/src/main/java/fr/moribus/imageonmap/image/Renderer.java index 8cf4d8a..1aa306f 100644 --- a/src/main/java/fr/moribus/imageonmap/image/Renderer.java +++ b/src/main/java/fr/moribus/imageonmap/image/Renderer.java @@ -18,6 +18,7 @@ package fr.moribus.imageonmap.image; +import fr.zcraft.zlib.tools.PluginLogger; import java.awt.image.BufferedImage; import org.bukkit.Bukkit; import org.bukkit.entity.Player; @@ -29,6 +30,7 @@ public class Renderer extends MapRenderer { static public boolean isHandled(MapView map) { + if(map == null) return false; for(MapRenderer renderer : map.getRenderers()) { if(renderer instanceof Renderer) return true; @@ -46,7 +48,15 @@ public class Renderer extends MapRenderer static public void installRenderer(BufferedImage image, short mapID) { - installRenderer(Bukkit.getMap(mapID)).setImage(image); + MapView map = Bukkit.getMap(mapID); + if(map == null) + { + PluginLogger.warning("Could not install renderer for map {0} : the Minecraft map does not exist", mapID); + } + else + { + installRenderer(map).setImage(image); + } } static public Renderer installRenderer(MapView map) diff --git a/src/main/java/fr/moribus/imageonmap/map/MapManager.java b/src/main/java/fr/moribus/imageonmap/map/MapManager.java index eb59656..fa58f99 100644 --- a/src/main/java/fr/moribus/imageonmap/map/MapManager.java +++ b/src/main/java/fr/moribus/imageonmap/map/MapManager.java @@ -307,6 +307,23 @@ abstract public class MapManager return mapCount; } + /** + * Returns if the given map ID is valid and exists in the current save. + * @param mapId the map ID. + * @return true if the given map ID is valid and exists in the current save, false otherwise. + */ + static public boolean mapIdExists(short mapId) + { + try + { + return Bukkit.getMap(mapId) != null; + } + catch(Throwable ex) + { + return false; + } + } + static private PlayerMapStore getPlayerMapStore(UUID playerUUID) { PlayerMapStore store; diff --git a/src/main/java/fr/moribus/imageonmap/migration/OldSavedMap.java b/src/main/java/fr/moribus/imageonmap/migration/OldSavedMap.java index 39d99f3..6751aa9 100644 --- a/src/main/java/fr/moribus/imageonmap/migration/OldSavedMap.java +++ b/src/main/java/fr/moribus/imageonmap/migration/OldSavedMap.java @@ -19,6 +19,7 @@ package fr.moribus.imageonmap.migration; import fr.moribus.imageonmap.map.ImageMap; +import fr.moribus.imageonmap.map.MapManager; import fr.moribus.imageonmap.map.SingleMap; import java.util.ArrayList; import java.util.List; @@ -73,6 +74,11 @@ class OldSavedMap configuration.set(mapName, data); } + public boolean isMapValid() + { + return MapManager.mapIdExists(mapId); + } + public short getMapId() {return mapId;} public String getUserName() {return userName;} } diff --git a/src/main/java/fr/moribus/imageonmap/migration/OldSavedPoster.java b/src/main/java/fr/moribus/imageonmap/migration/OldSavedPoster.java index df7b47c..0c1b7d5 100644 --- a/src/main/java/fr/moribus/imageonmap/migration/OldSavedPoster.java +++ b/src/main/java/fr/moribus/imageonmap/migration/OldSavedPoster.java @@ -19,6 +19,7 @@ package fr.moribus.imageonmap.migration; import fr.moribus.imageonmap.map.ImageMap; +import fr.moribus.imageonmap.map.MapManager; import fr.moribus.imageonmap.map.PosterMap; import java.util.ArrayList; import java.util.List; @@ -94,5 +95,16 @@ class OldSavedPoster } + public boolean isMapValid() + { + for(short mapId : mapsIds) + { + if(!MapManager.mapIdExists(mapId)) + return false; + } + return true; + } + public String getUserName() {return userName;} + public short[] getMapsIds() {return mapsIds;} } diff --git a/src/main/java/fr/moribus/imageonmap/migration/V3Migrator.java b/src/main/java/fr/moribus/imageonmap/migration/V3Migrator.java index ccde458..3c37e97 100644 --- a/src/main/java/fr/moribus/imageonmap/migration/V3Migrator.java +++ b/src/main/java/fr/moribus/imageonmap/migration/V3Migrator.java @@ -39,9 +39,12 @@ import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.ArrayDeque; import java.util.ArrayList; +import java.util.Arrays; import java.util.HashSet; import java.util.Map; import java.util.UUID; +import org.apache.commons.lang.ArrayUtils; +import org.apache.commons.lang.StringUtils; /** * This class represents and executes the ImageOnMap v3.x migration process @@ -241,7 +244,7 @@ public class V3Migrator implements Runnable */ private void backupMapData() throws IOException { - PluginLogger.info("Backing up map data before migrating..."); + PluginLogger.info(I.t("Backing up map data before migrating...")); if(!backupsPrev3Directory.exists()) backupsPrev3Directory.mkdirs(); if(!backupsPostv3Directory.exists()) backupsPostv3Directory.mkdirs(); @@ -265,7 +268,7 @@ public class V3Migrator implements Runnable verifiedBackupCopy(mapFile, backupFile); } - PluginLogger.info("Backup complete."); + PluginLogger.info(I.t("Backup complete.")); } /** @@ -307,7 +310,7 @@ public class V3Migrator implements Runnable } catch(InvalidConfigurationException ex) { - PluginLogger.warning("Could not read poster data for key '{0}'", ex, key); + PluginLogger.warning("Could not read poster data for key {0}", ex, key); } } } @@ -424,6 +427,8 @@ public class V3Migrator implements Runnable ArrayDeque remainingMaps = new ArrayDeque<>(); ArrayDeque remainingPosters = new ArrayDeque<>(); + ArrayDeque missingMapIds = new ArrayDeque<>(); + UUID playerUUID; OldSavedMap map; while(!mapsToMigrate.isEmpty()) @@ -434,6 +439,10 @@ public class V3Migrator implements Runnable { remainingMaps.add(map); } + else if(!map.isMapValid()) + { + missingMapIds.add(map.getMapId()); + } else { MapManager.insertMap(map.toImageMap(playerUUID)); @@ -450,12 +459,23 @@ public class V3Migrator implements Runnable { remainingPosters.add(poster); } + else if(!poster.isMapValid()) + { + missingMapIds.addAll(Arrays.asList(ArrayUtils.toObject(poster.getMapsIds()))); + } else { MapManager.insertMap(poster.toImageMap(playerUUID)); } } postersToMigrate.addAll(remainingPosters); + + if(!missingMapIds.isEmpty()) + { + PluginLogger.warning(I.tn("{0} registered minecraft map is missing from the save.", "{0} registered minecraft maps are missing from the save.", missingMapIds.size())); + PluginLogger.warning(I.t("These maps will not be migrated, but this could mean the save has been altered or corrupted.")); + PluginLogger.warning(I.t("The following maps are missing : {0} ", StringUtils.join(missingMapIds, ','))); + } } private void saveChanges() diff --git a/src/main/resources/i18n/fr_FR.po b/src/main/resources/i18n/fr_FR.po index d3c8176..0a81ed3 100644 --- a/src/main/resources/i18n/fr_FR.po +++ b/src/main/resources/i18n/fr_FR.po @@ -403,7 +403,7 @@ msgstr "Terminé." #: src/main/java/fr/moribus/imageonmap/migration/V3Migrator.java:229 msgid "Backup directories already exists." -msgstr "Les répertoires de sauvegarde existe déjà." +msgstr "Les répertoires de sauvegarde existent déjà." #: src/main/java/fr/moribus/imageonmap/migration/V3Migrator.java:230 msgid "" @@ -441,7 +441,7 @@ msgstr "Le processus de migration a été interrompu." msgid "Fetching done. {0} UUID have been retrieved." msgid_plural "Fetching done. {0} UUIDs have been retrieved." msgstr[0] "Récupération achevée. {0} UUID a été retrouvé." -msgstr[1] "Récupération achevée. {0} UUID ont été retrouvé." +msgstr[1] "Récupération achevée. {0} UUIDs ont été retrouvés." #: src/main/java/fr/moribus/imageonmap/migration/V3Migrator.java:371 #, java-format @@ -511,7 +511,7 @@ msgstr[1] "{0} posters n'ont pas pu être migrés." msgid "Data that has not been migrated will be kept in the old data files." msgstr "" "Les données qui n'ont pas été migrées seront conservées dans les vieux " -"fichiers de donnée." +"fichiers de données." #. The name of a map item given to a player, if splatter maps are not used. 0 = map name; 1 = row; 2 = column. #: src/main/java/fr/moribus/imageonmap/ui/MapItemManager.java:118