Skip to content

Commit

Permalink
Fix advancements dissapearing & Unwanted toasts on join (#174)
Browse files Browse the repository at this point in the history
* Fixed trees not being complete after reopening

* Rewrite the tree friendly list algorithm

* Check completion on join to prevent toasts on join

* Remove debug messages

* Version change to 1.2.11
  • Loading branch information
rowan-vr authored Dec 9, 2023
1 parent 4e76a93 commit 111e4bf
Show file tree
Hide file tree
Showing 26 changed files with 2,510 additions and 2,308 deletions.
6 changes: 3 additions & 3 deletions core/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
<parent>
<groupId>me.tippie</groupId>
<artifactId>customadvancements-parent</artifactId>
<version>1.2.10</version>
<version>1.2.11</version>
</parent>

<properties>
Expand All @@ -26,8 +26,8 @@
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<source>8</source>
<target>8</target>
</configuration>
</plugin>
<plugin>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import me.tippie.customadvancements.advancement.CAdvancement;
import me.tippie.customadvancements.advancement.InvalidAdvancementException;
import me.tippie.customadvancements.advancement.requirement.types.Advancement;
import org.bukkit.Bukkit;
import org.bukkit.entity.Player;

import java.util.*;
Expand All @@ -18,35 +19,35 @@ public interface InternalsProvider<T, T1, T2> {

CompletableFuture<Void> sendAdvancements(Player player, boolean clear);

CompletableFuture<Void> updateAdvancement(Player player, CAdvancement... advancements);


default CompletableFuture<Void> updateAdvancementAndChildren(Player player, CAdvancement... advancements){
Set<CAdvancement> advancementsWithChildren = new HashSet<>();
Queue<CAdvancement> advancementQueue = new LinkedList<>(Arrays.asList(advancements));

while (!advancementQueue.isEmpty()) {
CAdvancement advancement = advancementQueue.poll();
if (advancementsWithChildren.contains(advancement)) continue;
advancementsWithChildren.add(advancement);
val children = advancement.getRequirements().stream()
.filter(req -> req.getType() instanceof Advancement)
.map(req -> req.getValue())
.map(req -> {
try {
return CustomAdvancements.getInstance().getAdvancementManager().getAdvancement(req);
} catch ( InvalidAdvancementException e) {
return null;
}
})
.filter(Objects::nonNull)
.collect(Collectors.toList());

advancementQueue.addAll(children);
}


return updateAdvancement(player, advancementsWithChildren.toArray(new CAdvancement[0]));
@Deprecated CompletableFuture<Void> updateAdvancement(Player player, CAdvancement... advancements);


@Deprecated default CompletableFuture<Void> updateAdvancementAndChildren(Player player, CAdvancement... advancements){
// Set<CAdvancement> advancementsWithChildren = new HashSet<>();
// Queue<CAdvancement> advancementQueue = new LinkedList<>(Arrays.asList(advancements));
//
// while (!advancementQueue.isEmpty()) {
// CAdvancement advancement = advancementQueue.poll();
// if (advancementsWithChildren.contains(advancement)) continue;
// advancementsWithChildren.add(advancement);
// val children = advancement.getRequirements().stream()
// .filter(req -> req.getType() instanceof Advancement)
// .map(req -> req.getValue())
// .map(req -> {
// try {
// return CustomAdvancements.getInstance().getAdvancementManager().getAdvancement(req);
// } catch ( InvalidAdvancementException e) {
// return null;
// }
// })
// .filter(Objects::nonNull)
// .collect(Collectors.toList());
//
// advancementQueue.addAll(children);
// }
// return updateAdvancement(player, advancementsWithChildren.toArray(new CAdvancement[0]));

return sendAdvancements(player, false);
};


Expand All @@ -64,14 +65,14 @@ default T1 getNmsLocationFromAdvancement(T advancement) {

CompletableFuture<Void> sendAdvancementPacketImpl(Player player, boolean clear, Collection<T> advancements, Set<T1> remove, Map<T1, T2> progress);

default CompletableFuture<Void> sendAdvancementPacket(Player player, boolean clear, Collection<T> advancements, Set<T1> remove, Map<T1, T2> progress) {
default CompletableFuture<Void> sendAdvancementPacket(Player player, boolean clear, Collection<T> advancements, @Deprecated Set<T1> remove, Map<T1, T2> progress) {
return CompletableFuture.runAsync(() -> {
Queue<Collection<T>> advancementQueue = new LinkedList<>(Lists.partition(getTreeFriendlyListList(advancements), CustomAdvancements.ADVANCEMENTS_PER_PACKET));
Queue<List<Map.Entry<T1, T2>>> progressQueue = new LinkedList<>(Lists.partition(new ArrayList<>(progress.entrySet()), CustomAdvancements.PROGRESS_PER_PACKET));

sendAdvancementPacketImpl(player, clear,
new ArrayList<>(),
remove,
advancementQueue.stream().flatMap(Collection::stream).map(this::getNmsLocationFromAdvancement).collect(Collectors.toSet()),
new HashMap<>()
).join();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,8 @@ public class AdvancementTree {
*/
@Getter private final String label;

@Getter private AdvancementTreeList treeList;

/**
* Creates a new {@link AdvancementTree} out of the given file
*
Expand Down Expand Up @@ -301,6 +303,7 @@ public class AdvancementTree {
//Finishing up
this.options = new AdvancementTreeOptions(autoActive, guiLocation, treeRewards, displayName, description, displayItem, minecraftGuiDisplay, minecraftGuiBackground);

this.treeList = AdvancementTreeList.build(this);

CustomAdvancements.getInstance().getLogger().log(Level.INFO, "Loaded advancement tree " + config.getName());

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
package me.tippie.customadvancements.advancement;

import com.google.common.collect.ImmutableSet;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import me.tippie.customadvancements.advancement.requirement.AdvancementRequirement;
import me.tippie.customadvancements.advancement.requirement.types.Advancement;
import org.jetbrains.annotations.Nullable;

import java.util.*;

@Getter
@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
public class AdvancementTreeList {
private final ImmutableSet<ChildAdvancement> nodes;

public static AdvancementTreeList build(AdvancementTree tree) {
Set<ChildAdvancement> parentList = makeParents(tree);
makeChildren(tree, parentList);
return new AdvancementTreeList(ImmutableSet.copyOf(parentList));
}

private static Set<ChildAdvancement> makeParents(AdvancementTree tree) {
Set<ChildAdvancement> advancements = new HashSet<>();
for (CAdvancement advancement : tree.getAdvancements()) {
Optional<CAdvancement> parent = getParent(tree, advancement);
if (parent.isPresent()) {
advancements.add(new ChildAdvancement(advancement, parent.get()));
} else {
advancements.add(new ChildAdvancement(advancement, null));
}
}
return advancements;
}

private static void makeChildren(AdvancementTree tree, Set<ChildAdvancement> advancements) {
for (ChildAdvancement child : advancements) {
if (child.parent != null) {
advancements.stream()
.filter(parent -> parent.advancement == child.parent)
.forEach(parent -> parent.children.add(child));
}
}
}

private static Optional<CAdvancement> getParent(AdvancementTree tree, CAdvancement advancement) {
return advancement.getRequirements().stream()
.filter(req -> req.getType() instanceof Advancement)
.map(AdvancementRequirement::getValue)
.map(req -> {
try {
return tree.getAdvancement(req.split("\\.")[1]);
} catch ( InvalidAdvancementException e) {
return null;
}
})
.filter(Objects::nonNull)
.findFirst();
}

@AllArgsConstructor (access = AccessLevel.PRIVATE) @Getter
public static class ChildAdvancement{
private CAdvancement advancement;
private @Nullable CAdvancement parent;
private final Set<ChildAdvancement> children = new HashSet<>();
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package me.tippie.customadvancements.player;

import lombok.Getter;
import lombok.SneakyThrows;
import lombok.val;
import me.tippie.customadvancements.CustomAdvancements;
import me.tippie.customadvancements.InternalsProvider;
Expand Down Expand Up @@ -427,4 +428,30 @@ public void save() {
this.getAdvancementProgressFile().saveFile();
this.savePendingRewards();
}

public void fixProgressFile() {
CustomAdvancements.getAdvancementManager().getAdvancementTrees().stream()
.flatMap(tree -> tree.getAdvancements().stream())
.filter(adv -> {
try {
return !checkIfAdvancementCompleted(adv.getPath());
} catch (InvalidAdvancementException e) {
throw new RuntimeException(e);
}
})
.forEach(adv -> {
try {
checkCompleted(adv.getPath());
} catch (InvalidAdvancementException e) {
throw new RuntimeException(e);
}
});
// .forEach(adv -> {
// AdvancementProgress progress = advancementProgress.get(adv.getPath());
// progress.setActive(false);
// progress.setAnnounced(true);
// progress.setCompleted(true);
// });
save();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ private void onJoin(final PlayerJoinEvent event) {

CustomAdvancements.getInstance().getServer().getScheduler().runTaskLater(CustomAdvancements.getInstance(), () -> {
CAPlayer caPlayer = CustomAdvancements.getCaPlayerManager().getPlayer(event.getPlayer().getUniqueId());
caPlayer.fixProgressFile();
caPlayer.givePendingRewards();
caPlayer.sendMinecraftGUI();
}, 25L);
Expand Down
2 changes: 1 addition & 1 deletion dist/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
<parent>
<artifactId>customadvancements-parent</artifactId>
<groupId>me.tippie</groupId>
<version>1.2.10</version>
<version>1.2.11</version>
</parent>

<build>
Expand Down
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

<groupId>me.tippie</groupId>
<artifactId>customadvancements-parent</artifactId>
<version>1.2.10</version>
<version>1.2.11</version>
<packaging>pom</packaging>

<name>CustomAdvancements</name>
Expand Down
2 changes: 1 addition & 1 deletion spigot_1_17_R1/pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
<parent>
<groupId>me.tippie</groupId>
<artifactId>customadvancements-parent</artifactId>
<version>1.2.10</version>
<version>1.2.11</version>
</parent>

<properties>
Expand Down
Loading

0 comments on commit 111e4bf

Please sign in to comment.