Clears and sets advancements programaticaly.

https://github.com/BentoBoxWorld/Boxed/issues/7
This commit is contained in:
tastybento 2021-03-13 11:36:55 -08:00
parent 5e536dfa63
commit d7a52d2103
4 changed files with 76 additions and 35 deletions

View File

@ -59,13 +59,13 @@
<powermock.version>2.0.2</powermock.version>
<!-- More visible way how to change dependency versions -->
<spigot.version>1.16.5-R0.1-SNAPSHOT</spigot.version>
<bentobox.version>1.16.0</bentobox.version>
<bentobox.version>1.16.1-SNAPSHOT</bentobox.version>
<!-- Revision variable removes warning about dynamic version -->
<revision>${build.version}-SNAPSHOT</revision>
<!-- Do not change unless you want different name for local builds. -->
<build.number>-LOCAL</build.number>
<!-- This allows to change between versions. -->
<build.version>1.0.1</build.version>
<build.version>1.0.2</build.version>
<sonar.projectKey>BentoBoxWorld_Boxed</sonar.projectKey>
<sonar.organization>bentobox-world</sonar.organization>

View File

@ -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<String> 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;
}
}

View File

@ -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<String> list) {
if (!user.isOnline()) {
return;
}
if (clear) {
// Clear advancements
Iterator<Advancement> 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<Advancement> 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);
}
}
});
}
}

View File

@ -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