Advancement recursion speedup on Forge, based off Advancements Debug
This commit is contained in:
parent
39e1ac0896
commit
db223b62a0
|
|
@ -0,0 +1,65 @@
|
||||||
|
package org.embeddedt.modernfix.forge.mixin.perf.faster_advancements;
|
||||||
|
|
||||||
|
import it.unimi.dsi.fastutil.objects.ReferenceOpenHashSet;
|
||||||
|
import net.minecraft.advancements.Advancement;
|
||||||
|
import net.minecraft.advancements.AdvancementProgress;
|
||||||
|
import net.minecraft.server.PlayerAdvancements;
|
||||||
|
import org.spongepowered.asm.mixin.Final;
|
||||||
|
import org.spongepowered.asm.mixin.Mixin;
|
||||||
|
import org.spongepowered.asm.mixin.Overwrite;
|
||||||
|
import org.spongepowered.asm.mixin.Shadow;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
@Mixin(PlayerAdvancements.class)
|
||||||
|
public abstract class PlayerAdvancementsMixin {
|
||||||
|
|
||||||
|
@Shadow protected abstract boolean shouldBeVisible(Advancement advancement);
|
||||||
|
|
||||||
|
@Shadow @Final private Set<Advancement> visible;
|
||||||
|
|
||||||
|
@Shadow @Final private Set<Advancement> visibilityChanged;
|
||||||
|
|
||||||
|
@Shadow @Final private Map<Advancement, AdvancementProgress> advancements;
|
||||||
|
|
||||||
|
@Shadow @Final private Set<Advancement> progressChanged;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Avoids checking the same advancement many times.
|
||||||
|
*/
|
||||||
|
private void ensureVisibilityDfs(Advancement advancement, Set<Advancement> visited) {
|
||||||
|
if(visited.add(advancement)) {
|
||||||
|
boolean bl = this.shouldBeVisible(advancement);
|
||||||
|
boolean bl2 = this.visible.contains(advancement);
|
||||||
|
if (bl && !bl2) {
|
||||||
|
this.visible.add(advancement);
|
||||||
|
this.visibilityChanged.add(advancement);
|
||||||
|
if (this.advancements.containsKey(advancement)) {
|
||||||
|
this.progressChanged.add(advancement);
|
||||||
|
}
|
||||||
|
} else if (!bl && bl2) {
|
||||||
|
this.visible.remove(advancement);
|
||||||
|
this.visibilityChanged.add(advancement);
|
||||||
|
}
|
||||||
|
|
||||||
|
for(Advancement child : advancement.getChildren()) {
|
||||||
|
ensureVisibilityDfs(child, visited);
|
||||||
|
}
|
||||||
|
|
||||||
|
Advancement parent = advancement.getParent();
|
||||||
|
if (bl != bl2 && parent != null) {
|
||||||
|
ensureVisibilityDfs(parent, visited);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author embeddedt
|
||||||
|
* @reason avoid checking the same advancement many times
|
||||||
|
*/
|
||||||
|
@Overwrite
|
||||||
|
private void ensureVisibility(Advancement advancement) {
|
||||||
|
ensureVisibilityDfs(advancement, new ReferenceOpenHashSet<>());
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue
Block a user