From aa0336d62a10682e5bb3e52125491058b183701c Mon Sep 17 00:00:00 2001 From: BONNe Date: Fri, 24 Sep 2021 12:26:44 +0300 Subject: [PATCH] Fixes #187 Add a new method that updates unlocked level list without changing active level. This method returns if last unlocked level was changed, and in that case it triggers whole gui rebuilding. --- .../panel/user/ChallengesPanel.java | 62 +++++++++++++++++-- 1 file changed, 58 insertions(+), 4 deletions(-) diff --git a/src/main/java/world/bentobox/challenges/panel/user/ChallengesPanel.java b/src/main/java/world/bentobox/challenges/panel/user/ChallengesPanel.java index 13e97d2..4e0494b 100644 --- a/src/main/java/world/bentobox/challenges/panel/user/ChallengesPanel.java +++ b/src/main/java/world/bentobox/challenges/panel/user/ChallengesPanel.java @@ -14,6 +14,7 @@ import org.eclipse.jdt.annotation.Nullable; import java.io.File; import java.util.ArrayList; import java.util.List; +import java.util.Optional; import java.util.stream.Collectors; import world.bentobox.bentobox.api.panels.PanelItem; @@ -149,6 +150,9 @@ public class ChallengesPanel extends CommonPanel } + /** + * Updates level status list and selects last unlocked level. + */ private void updateLevelList() { this.levelList = this.manager.getAllChallengeLevelStatus(this.user, this.world); @@ -167,6 +171,35 @@ public class ChallengesPanel extends CommonPanel } + /** + * Updates level status list and returns if any new level has been unlocked. + * @return {code true} if a new level was unlocked, {@code false} otherwise. + */ + private boolean updateLevelListSilent() + { + Optional firstLockedLevel = + this.levelList.stream().filter(levelStatus -> !levelStatus.isUnlocked()).findFirst(); + + if (firstLockedLevel.isPresent()) + { + // If there still exist any locked level, update level status list. + this.levelList = this.manager.getAllChallengeLevelStatus(this.user, this.world); + + // Find a new first locked level. + Optional newLockedLevel = + this.levelList.stream().filter(levelStatus -> !levelStatus.isUnlocked()).findFirst(); + + return newLockedLevel.isEmpty() || + firstLockedLevel.get().getLevel() != newLockedLevel.get().getLevel(); + } + else + { + // If locked level is not present, return false. + return false; + } + } + + @Nullable private PanelItem createChallengeButton(ItemTemplateRecord template, TemplatedPanel.ItemSlot slot) { @@ -257,8 +290,18 @@ public class ChallengesPanel extends CommonPanel this.topLabel, this.permissionPrefix)) { - panel.getInventory().setItem(i, - this.createChallengeButton(template, challenge).getItem()); + if (this.updateLevelListSilent()) + { + // Need to rebuild all because completing a challenge + // may unlock a new level. #187 + this.build(); + } + else + { + // There was no unlocked levels. + panel.getInventory().setItem(i, + this.createChallengeButton(template, challenge).getItem()); + } } break; case "COMPLETE_MAX": @@ -272,8 +315,18 @@ public class ChallengesPanel extends CommonPanel this.permissionPrefix, Integer.MAX_VALUE)) { - panel.getInventory().setItem(i, - this.createChallengeButton(template, challenge).getItem()); + if (this.updateLevelListSilent()) + { + // Need to rebuild all because completing a challenge + // may unlock a new level. #187 + this.build(); + } + else + { + // There was no unlocked levels. + panel.getInventory().setItem(i, + this.createChallengeButton(template, challenge).getItem()); + } } } break; @@ -290,6 +343,7 @@ public class ChallengesPanel extends CommonPanel this.permissionPrefix, value); + this.updateLevelListSilent(); this.build(); }); }