Skip to content

Commit 111e4bf

Browse files
authored
Fix advancements dissapearing & Unwanted toasts on join (#174)
* 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
1 parent 4e76a93 commit 111e4bf

File tree

26 files changed

+2510
-2308
lines changed

26 files changed

+2510
-2308
lines changed

core/pom.xml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
<parent>
1111
<groupId>me.tippie</groupId>
1212
<artifactId>customadvancements-parent</artifactId>
13-
<version>1.2.10</version>
13+
<version>1.2.11</version>
1414
</parent>
1515

1616
<properties>
@@ -26,8 +26,8 @@
2626
<artifactId>maven-compiler-plugin</artifactId>
2727
<version>3.8.1</version>
2828
<configuration>
29-
<source>${java.version}</source>
30-
<target>${java.version}</target>
29+
<source>8</source>
30+
<target>8</target>
3131
</configuration>
3232
</plugin>
3333
<plugin>

core/src/main/java/me/tippie/customadvancements/InternalsProvider.java

Lines changed: 32 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import me.tippie.customadvancements.advancement.CAdvancement;
77
import me.tippie.customadvancements.advancement.InvalidAdvancementException;
88
import me.tippie.customadvancements.advancement.requirement.types.Advancement;
9+
import org.bukkit.Bukkit;
910
import org.bukkit.entity.Player;
1011

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

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

21-
CompletableFuture<Void> updateAdvancement(Player player, CAdvancement... advancements);
22-
23-
24-
default CompletableFuture<Void> updateAdvancementAndChildren(Player player, CAdvancement... advancements){
25-
Set<CAdvancement> advancementsWithChildren = new HashSet<>();
26-
Queue<CAdvancement> advancementQueue = new LinkedList<>(Arrays.asList(advancements));
27-
28-
while (!advancementQueue.isEmpty()) {
29-
CAdvancement advancement = advancementQueue.poll();
30-
if (advancementsWithChildren.contains(advancement)) continue;
31-
advancementsWithChildren.add(advancement);
32-
val children = advancement.getRequirements().stream()
33-
.filter(req -> req.getType() instanceof Advancement)
34-
.map(req -> req.getValue())
35-
.map(req -> {
36-
try {
37-
return CustomAdvancements.getInstance().getAdvancementManager().getAdvancement(req);
38-
} catch ( InvalidAdvancementException e) {
39-
return null;
40-
}
41-
})
42-
.filter(Objects::nonNull)
43-
.collect(Collectors.toList());
44-
45-
advancementQueue.addAll(children);
46-
}
47-
48-
49-
return updateAdvancement(player, advancementsWithChildren.toArray(new CAdvancement[0]));
22+
@Deprecated CompletableFuture<Void> updateAdvancement(Player player, CAdvancement... advancements);
23+
24+
25+
@Deprecated default CompletableFuture<Void> updateAdvancementAndChildren(Player player, CAdvancement... advancements){
26+
// Set<CAdvancement> advancementsWithChildren = new HashSet<>();
27+
// Queue<CAdvancement> advancementQueue = new LinkedList<>(Arrays.asList(advancements));
28+
//
29+
// while (!advancementQueue.isEmpty()) {
30+
// CAdvancement advancement = advancementQueue.poll();
31+
// if (advancementsWithChildren.contains(advancement)) continue;
32+
// advancementsWithChildren.add(advancement);
33+
// val children = advancement.getRequirements().stream()
34+
// .filter(req -> req.getType() instanceof Advancement)
35+
// .map(req -> req.getValue())
36+
// .map(req -> {
37+
// try {
38+
// return CustomAdvancements.getInstance().getAdvancementManager().getAdvancement(req);
39+
// } catch ( InvalidAdvancementException e) {
40+
// return null;
41+
// }
42+
// })
43+
// .filter(Objects::nonNull)
44+
// .collect(Collectors.toList());
45+
//
46+
// advancementQueue.addAll(children);
47+
// }
48+
// return updateAdvancement(player, advancementsWithChildren.toArray(new CAdvancement[0]));
49+
50+
return sendAdvancements(player, false);
5051
};
5152

5253

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

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

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

7273
sendAdvancementPacketImpl(player, clear,
7374
new ArrayList<>(),
74-
remove,
75+
advancementQueue.stream().flatMap(Collection::stream).map(this::getNmsLocationFromAdvancement).collect(Collectors.toSet()),
7576
new HashMap<>()
7677
).join();
7778

core/src/main/java/me/tippie/customadvancements/advancement/AdvancementTree.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@ public class AdvancementTree {
4343
*/
4444
@Getter private final String label;
4545

46+
@Getter private AdvancementTreeList treeList;
47+
4648
/**
4749
* Creates a new {@link AdvancementTree} out of the given file
4850
*
@@ -301,6 +303,7 @@ public class AdvancementTree {
301303
//Finishing up
302304
this.options = new AdvancementTreeOptions(autoActive, guiLocation, treeRewards, displayName, description, displayItem, minecraftGuiDisplay, minecraftGuiBackground);
303305

306+
this.treeList = AdvancementTreeList.build(this);
304307

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

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
package me.tippie.customadvancements.advancement;
2+
3+
import com.google.common.collect.ImmutableSet;
4+
import lombok.AccessLevel;
5+
import lombok.AllArgsConstructor;
6+
import lombok.Getter;
7+
import lombok.RequiredArgsConstructor;
8+
import me.tippie.customadvancements.advancement.requirement.AdvancementRequirement;
9+
import me.tippie.customadvancements.advancement.requirement.types.Advancement;
10+
import org.jetbrains.annotations.Nullable;
11+
12+
import java.util.*;
13+
14+
@Getter
15+
@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
16+
public class AdvancementTreeList {
17+
private final ImmutableSet<ChildAdvancement> nodes;
18+
19+
public static AdvancementTreeList build(AdvancementTree tree) {
20+
Set<ChildAdvancement> parentList = makeParents(tree);
21+
makeChildren(tree, parentList);
22+
return new AdvancementTreeList(ImmutableSet.copyOf(parentList));
23+
}
24+
25+
private static Set<ChildAdvancement> makeParents(AdvancementTree tree) {
26+
Set<ChildAdvancement> advancements = new HashSet<>();
27+
for (CAdvancement advancement : tree.getAdvancements()) {
28+
Optional<CAdvancement> parent = getParent(tree, advancement);
29+
if (parent.isPresent()) {
30+
advancements.add(new ChildAdvancement(advancement, parent.get()));
31+
} else {
32+
advancements.add(new ChildAdvancement(advancement, null));
33+
}
34+
}
35+
return advancements;
36+
}
37+
38+
private static void makeChildren(AdvancementTree tree, Set<ChildAdvancement> advancements) {
39+
for (ChildAdvancement child : advancements) {
40+
if (child.parent != null) {
41+
advancements.stream()
42+
.filter(parent -> parent.advancement == child.parent)
43+
.forEach(parent -> parent.children.add(child));
44+
}
45+
}
46+
}
47+
48+
private static Optional<CAdvancement> getParent(AdvancementTree tree, CAdvancement advancement) {
49+
return advancement.getRequirements().stream()
50+
.filter(req -> req.getType() instanceof Advancement)
51+
.map(AdvancementRequirement::getValue)
52+
.map(req -> {
53+
try {
54+
return tree.getAdvancement(req.split("\\.")[1]);
55+
} catch ( InvalidAdvancementException e) {
56+
return null;
57+
}
58+
})
59+
.filter(Objects::nonNull)
60+
.findFirst();
61+
}
62+
63+
@AllArgsConstructor (access = AccessLevel.PRIVATE) @Getter
64+
public static class ChildAdvancement{
65+
private CAdvancement advancement;
66+
private @Nullable CAdvancement parent;
67+
private final Set<ChildAdvancement> children = new HashSet<>();
68+
}
69+
}

core/src/main/java/me/tippie/customadvancements/player/CAPlayer.java

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package me.tippie.customadvancements.player;
22

33
import lombok.Getter;
4+
import lombok.SneakyThrows;
45
import lombok.val;
56
import me.tippie.customadvancements.CustomAdvancements;
67
import me.tippie.customadvancements.InternalsProvider;
@@ -427,4 +428,30 @@ public void save() {
427428
this.getAdvancementProgressFile().saveFile();
428429
this.savePendingRewards();
429430
}
431+
432+
public void fixProgressFile() {
433+
CustomAdvancements.getAdvancementManager().getAdvancementTrees().stream()
434+
.flatMap(tree -> tree.getAdvancements().stream())
435+
.filter(adv -> {
436+
try {
437+
return !checkIfAdvancementCompleted(adv.getPath());
438+
} catch (InvalidAdvancementException e) {
439+
throw new RuntimeException(e);
440+
}
441+
})
442+
.forEach(adv -> {
443+
try {
444+
checkCompleted(adv.getPath());
445+
} catch (InvalidAdvancementException e) {
446+
throw new RuntimeException(e);
447+
}
448+
});
449+
// .forEach(adv -> {
450+
// AdvancementProgress progress = advancementProgress.get(adv.getPath());
451+
// progress.setActive(false);
452+
// progress.setAnnounced(true);
453+
// progress.setCompleted(true);
454+
// });
455+
save();
456+
}
430457
}

core/src/main/java/me/tippie/customadvancements/player/CAPlayerListener.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ private void onJoin(final PlayerJoinEvent event) {
2626

2727
CustomAdvancements.getInstance().getServer().getScheduler().runTaskLater(CustomAdvancements.getInstance(), () -> {
2828
CAPlayer caPlayer = CustomAdvancements.getCaPlayerManager().getPlayer(event.getPlayer().getUniqueId());
29+
caPlayer.fixProgressFile();
2930
caPlayer.givePendingRewards();
3031
caPlayer.sendMinecraftGUI();
3132
}, 25L);

dist/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
<parent>
1111
<artifactId>customadvancements-parent</artifactId>
1212
<groupId>me.tippie</groupId>
13-
<version>1.2.10</version>
13+
<version>1.2.11</version>
1414
</parent>
1515

1616
<build>

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
<groupId>me.tippie</groupId>
88
<artifactId>customadvancements-parent</artifactId>
9-
<version>1.2.10</version>
9+
<version>1.2.11</version>
1010
<packaging>pom</packaging>
1111

1212
<name>CustomAdvancements</name>

spigot_1_17_R1/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
<parent>
1111
<groupId>me.tippie</groupId>
1212
<artifactId>customadvancements-parent</artifactId>
13-
<version>1.2.10</version>
13+
<version>1.2.11</version>
1414
</parent>
1515

1616
<properties>

0 commit comments

Comments
 (0)