Skip to content

Commit 444f5ad

Browse files
committed
Merge remote-tracking branch 'origin/1.18' into 1.19.2
2 parents 618698a + 32aa479 commit 444f5ad

File tree

1 file changed

+65
-0
lines changed

1 file changed

+65
-0
lines changed
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
package org.embeddedt.modernfix.forge.mixin.perf.faster_advancements;
2+
3+
import it.unimi.dsi.fastutil.objects.ReferenceOpenHashSet;
4+
import net.minecraft.advancements.Advancement;
5+
import net.minecraft.advancements.AdvancementProgress;
6+
import net.minecraft.server.PlayerAdvancements;
7+
import org.spongepowered.asm.mixin.Final;
8+
import org.spongepowered.asm.mixin.Mixin;
9+
import org.spongepowered.asm.mixin.Overwrite;
10+
import org.spongepowered.asm.mixin.Shadow;
11+
12+
import java.util.Map;
13+
import java.util.Set;
14+
15+
@Mixin(PlayerAdvancements.class)
16+
public abstract class PlayerAdvancementsMixin {
17+
18+
@Shadow protected abstract boolean shouldBeVisible(Advancement advancement);
19+
20+
@Shadow @Final private Set<Advancement> visible;
21+
22+
@Shadow @Final private Set<Advancement> visibilityChanged;
23+
24+
@Shadow @Final private Map<Advancement, AdvancementProgress> advancements;
25+
26+
@Shadow @Final private Set<Advancement> progressChanged;
27+
28+
/**
29+
* Avoids checking the same advancement many times.
30+
*/
31+
private void ensureVisibilityDfs(Advancement advancement, Set<Advancement> visited) {
32+
if(visited.add(advancement)) {
33+
boolean bl = this.shouldBeVisible(advancement);
34+
boolean bl2 = this.visible.contains(advancement);
35+
if (bl && !bl2) {
36+
this.visible.add(advancement);
37+
this.visibilityChanged.add(advancement);
38+
if (this.advancements.containsKey(advancement)) {
39+
this.progressChanged.add(advancement);
40+
}
41+
} else if (!bl && bl2) {
42+
this.visible.remove(advancement);
43+
this.visibilityChanged.add(advancement);
44+
}
45+
46+
for(Advancement child : advancement.getChildren()) {
47+
ensureVisibilityDfs(child, visited);
48+
}
49+
50+
Advancement parent = advancement.getParent();
51+
if (bl != bl2 && parent != null) {
52+
ensureVisibilityDfs(parent, visited);
53+
}
54+
}
55+
}
56+
57+
/**
58+
* @author embeddedt
59+
* @reason avoid checking the same advancement many times
60+
*/
61+
@Overwrite
62+
private void ensureVisibility(Advancement advancement) {
63+
ensureVisibilityDfs(advancement, new ReferenceOpenHashSet<>());
64+
}
65+
}

0 commit comments

Comments
 (0)