diff --git a/pom.xml b/pom.xml index 8249006..285ff5e 100644 --- a/pom.xml +++ b/pom.xml @@ -59,13 +59,13 @@ 2.0.2 1.16.5-R0.1-SNAPSHOT - 1.16.0 + 1.16.1-SNAPSHOT ${build.version}-SNAPSHOT -LOCAL - 1.0.1 + 1.0.2 BentoBoxWorld_Boxed bentobox-world diff --git a/src/main/java/world/bentobox/boxed/Settings.java b/src/main/java/world/bentobox/boxed/Settings.java index 010b779..7727631 100644 --- a/src/main/java/world/bentobox/boxed/Settings.java +++ b/src/main/java/world/bentobox/boxed/Settings.java @@ -332,7 +332,7 @@ public class Settings implements WorldSettings { @ConfigComment("Reset advancements.") @ConfigEntry(path = "area.reset.on-leave.reset-advancements") - private boolean oLeaveResetAdvancements = false; + private boolean onLeaveResetAdvancements = false; @ConfigComment("Grant these advancements") @ConfigEntry(path = "area.reset.on-leave.grant-advancements") @@ -1707,20 +1707,6 @@ public class Settings implements WorldSettings { this.onJoinGrantAdvancements = onJoinGrantAdvancements; } - /** - * @return the oLeaveResetAdvancements - */ - public boolean isoLeaveResetAdvancements() { - return oLeaveResetAdvancements; - } - - /** - * @param oLeaveResetAdvancements the oLeaveResetAdvancements to set - */ - public void setoLeaveResetAdvancements(boolean oLeaveResetAdvancements) { - this.oLeaveResetAdvancements = oLeaveResetAdvancements; - } - /** * @return the onLeaveGrantAdvancements */ @@ -1734,4 +1720,19 @@ public class Settings implements WorldSettings { public void setOnLeaveGrantAdvancements(List onLeaveGrantAdvancements) { this.onLeaveGrantAdvancements = onLeaveGrantAdvancements; } + + /** + * @return the onLeaveResetAdvancements + */ + public boolean isOnLeaveResetAdvancements() { + return onLeaveResetAdvancements; + } + + /** + * @param onLeaveResetAdvancements the onLeaveResetAdvancements to set + */ + public void setOnLeaveResetAdvancements(boolean onLeaveResetAdvancements) { + this.onLeaveResetAdvancements = onLeaveResetAdvancements; + } + } diff --git a/src/main/java/world/bentobox/boxed/listeners/AdvancementListener.java b/src/main/java/world/bentobox/boxed/listeners/AdvancementListener.java index c170d56..dce7417 100644 --- a/src/main/java/world/bentobox/boxed/listeners/AdvancementListener.java +++ b/src/main/java/world/bentobox/boxed/listeners/AdvancementListener.java @@ -1,5 +1,7 @@ package world.bentobox.boxed.listeners; +import java.util.Iterator; +import java.util.List; import java.util.Spliterator; import java.util.Spliterators; import java.util.stream.StreamSupport; @@ -7,17 +9,19 @@ import java.util.stream.StreamSupport; import org.bukkit.Bukkit; import org.bukkit.Sound; import org.bukkit.advancement.Advancement; +import org.bukkit.advancement.AdvancementProgress; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerAdvancementDoneEvent; import org.bukkit.event.player.PlayerPortalEvent; -import org.bukkit.event.player.PlayerTeleportEvent; import org.bukkit.event.player.PlayerTeleportEvent.TeleportCause; +import world.bentobox.bentobox.api.events.island.IslandNewIslandEvent; +import world.bentobox.bentobox.api.events.team.TeamJoinedEvent; +import world.bentobox.bentobox.api.events.team.TeamLeaveEvent; import world.bentobox.bentobox.api.localization.TextVariables; -import world.bentobox.bentobox.api.metadata.MetaDataValue; import world.bentobox.bentobox.api.user.User; import world.bentobox.bentobox.util.Util; import world.bentobox.boxed.Boxed; @@ -96,23 +100,59 @@ public class AdvancementListener implements Listener { } } - @EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true) - public void onFirstTime(PlayerTeleportEvent e) { - User user = User.getInstance(e.getPlayer()); - boolean firstTime = user.getMetaData("Boxed-first-time").map(MetaDataValue::asBoolean).orElse(true); - if (firstTime - && e.getTo() != null - && e.getTo().getWorld() != null - && addon.getOverWorld().equals(Util.getWorld(e.getTo().getWorld())) - && addon.getIslands().hasIsland(addon.getOverWorld(), user) // Owner of island - ) { - // Clear advancements - addon.getPlugin().logDebug("Clear advancements"); - // Add meta data - user.putMetaData("Boxed-first-time", new MetaDataValue(false)); - addon.getPlayers().save(user.getUniqueId()); + @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true) + public void onTeamJoinTime(TeamJoinedEvent e) { + User user = User.getInstance(e.getPlayerUUID()); + if (addon.getSettings().isOnJoinResetAdvancements() && user.isOnline() + && addon.getOverWorld().equals(Util.getWorld(user.getWorld()))) { + // Clear and set advancements + clearAndSetAdv(user, addon.getSettings().isOnJoinResetAdvancements(), addon.getSettings().getOnJoinGrantAdvancements()); + } } + + @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true) + public void onTeamLeaveTime(TeamLeaveEvent e) { + User user = User.getInstance(e.getPlayerUUID()); + if (addon.getSettings().isOnJoinResetAdvancements() && user.isOnline() + && addon.getOverWorld().equals(Util.getWorld(user.getWorld()))) { + // Clear and set advancements + clearAndSetAdv(user, addon.getSettings().isOnLeaveResetAdvancements(), addon.getSettings().getOnLeaveGrantAdvancements()); + + } + } + + @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true) + public void onFirstTime(IslandNewIslandEvent e) { + clearAndSetAdv(User.getInstance(e.getPlayerUUID()), addon.getSettings().isOnJoinResetAdvancements(), addon.getSettings().getOnJoinGrantAdvancements()); + } + + private void clearAndSetAdv(User user, boolean clear, List list) { + if (!user.isOnline()) { + return; + } + if (clear) { + // Clear advancements + Iterator it = Bukkit.advancementIterator(); + while (it.hasNext()) { + Advancement a = it.next(); + AdvancementProgress p = user.getPlayer().getAdvancementProgress(a); + p.getAwardedCriteria().forEach(p::revokeCriteria); + } + } + // Grant advancements + list.forEach(k -> { + Iterator it = Bukkit.advancementIterator(); + while (it.hasNext()) { + Advancement a = it.next(); + if (a.getKey().toString().equals(k)) { + // Award + a.getCriteria().forEach(user.getPlayer().getAdvancementProgress(a)::awardCriteria); + } + } + }); + + } } diff --git a/src/main/resources/config.yml b/src/main/resources/config.yml index 117868e..8711146 100644 --- a/src/main/resources/config.yml +++ b/src/main/resources/config.yml @@ -352,7 +352,7 @@ area: reset-advancements: true # Grant these advancements grant-advancements: - - "minecraft/story:root": true + - minecraft:story/root on-leave: # What the plugin should reset when the player leaves or is kicked from an area # Reset Money - if this is true, will reset the player's money to the starting money