diff --git a/src/main/java/world/bentobox/challenges/ChallengesManager.java b/src/main/java/world/bentobox/challenges/ChallengesManager.java index 9a7c54f..f8bca18 100644 --- a/src/main/java/world/bentobox/challenges/ChallengesManager.java +++ b/src/main/java/world/bentobox/challenges/ChallengesManager.java @@ -112,6 +112,77 @@ public class ChallengesManager this.playerCacheData = new HashMap<>(); this.load(); + + // TODO: Remove this code after some time, as this is just a protective code against invalid world names. + if (Bukkit.getBukkitVersion().startsWith("1.14")) + { + Set updatedChallenges = new HashSet<>(); + + this.challengeCacheData.values().forEach(challengeObject -> { + if (challengeObject.getUniqueId().matches(".*[A-Z]+.*")) + { + challengeObject.setUniqueId(challengeObject.getUniqueId().toLowerCase()); + challengeObject.setLevel(challengeObject.getLevel().toLowerCase()); + + updatedChallenges.add(challengeObject); + + this.addon.logWarning("Challenge addon fixed your data for Challenge " + + challengeObject.getUniqueId() + + ". 1.14 does not allow to use capital letters in world names."); + } + }); + + Set updatedLevels = new HashSet<>(); + + this.levelCacheData.values().forEach(levelObject -> { + if (levelObject.getUniqueId().matches(".*[A-Z]+.*")) + { + levelObject.setUniqueId(levelObject.getUniqueId().toLowerCase()); + levelObject.setWorld(levelObject.getWorld().toLowerCase()); + + Set correctNames = levelObject.getChallenges().stream(). + map(String::toLowerCase). + collect(Collectors.toSet()); + + levelObject.setChallenges(correctNames); + + updatedLevels.add(levelObject); + + this.addon.logWarning("Challenge addon fixed your data for Challenge Level " + + levelObject.getUniqueId() + + ". 1.14 does not allow to use capital letters in world names."); + } + }); + + // As at least one challenge or level was corrupted we must update all player data objects! + if (!updatedLevels.isEmpty() || !updatedChallenges.isEmpty()) + { + List playerDataList = this.playersDatabase.loadObjects(); + + playerDataList.forEach(challengesPlayerData -> { + + Map fixedChallengeStatus = new HashMap<>(); + challengesPlayerData.getChallengeStatus().forEach((challenge, count) -> + fixedChallengeStatus.put(challenge.toLowerCase(), count)); + challengesPlayerData.setChallengeStatus(fixedChallengeStatus); + + Map fixedChallengeTimestamp = new HashMap<>(); + challengesPlayerData.getChallengesTimestamp().forEach((challenge, count) -> + fixedChallengeTimestamp.put(challenge.toLowerCase(), count)); + challengesPlayerData.setChallengesTimestamp(fixedChallengeTimestamp); + + Set fixedLevelsDone = new HashSet<>(); + challengesPlayerData.getLevelsDone().forEach(level -> fixedLevelsDone.add(level.toLowerCase())); + challengesPlayerData.setLevelsDone(fixedLevelsDone); + + this.playersDatabase.saveObject(challengesPlayerData); + + this.addon.logWarning("Challenge addon fixed your data for PlayerData " + + challengesPlayerData.getUniqueId() + + ". 1.14 does not allow to use capital letters in world names."); + }); + } + } }