Files
MinecraftForge/src/main/java/net/minecraftforge/common/AdvancementLoadFix.java
T
be5446b91c Update to 1.17
Update to Official classnames
Patchwork
Make the game compile and run
Merge in the new HUD overlay API
Merge in the new render properties API
PEEL
Use Gradle 7.2 snapshot to fix eclipse integration bug in 7.1, Would use 7.0 but FG needs 7.1 for some reason.
New FML installer
Update to 1.17.1

Co-authored-by: LexManos <lexmanos@gmail.com>
Co-authored-by: SizableShrimp <sizableshrimp@sizableshrimp.me>
Co-authored-by: cpw <cpw+github@weeksfamily.ca>
Co-authored-by: Curle <curle@gemwire.uk>
Co-authored-by: Unnoen <Unnoen@users.noreply.github.com>
Co-authored-by: covers1624 <laughlan.cov@internode.on.net>
Co-authored-by: DaemonUmbra <daemon.umbra@gmail.com>
Co-authored-by: gigaherz <gigaherz@gmail.com>
Signed-off-by: SizableShrimp <sizableshrimp@sizableshrimp.me>
2021-07-22 19:57:02 +01:00

105 lines
4.6 KiB
Java

/*
* Minecraft Forge
* Copyright (c) 2016-2021.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation version 2.1
* of the License.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
package net.minecraftforge.common;
import com.google.common.graph.Graph;
import com.google.common.graph.GraphBuilder;
import com.google.common.graph.MutableGraph;
import net.minecraft.advancements.Advancement;
import net.minecraft.advancements.AdvancementProgress;
import net.minecraft.server.PlayerAdvancements;
import net.minecraftforge.fml.loading.toposort.TopologicalSort;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import java.util.Collection;
import java.util.Comparator;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.stream.Collectors;
/**
* New implementation of {@link net.minecraft.advancements.PlayerAdvancements#ensureAllVisible()}
*/
public class AdvancementLoadFix {
private static final Logger LOGGER = LogManager.getLogger();
private static Map<Advancement, List<Advancement>> roots;
public static void loadVisibility(final PlayerAdvancements playerAdvancements, final Set<Advancement> visible, final Set<Advancement> visibilityChanged, final Map<Advancement, AdvancementProgress> progress, final Set<Advancement> progressChanged, final Predicate<Advancement> shouldBeVisible) {
LOGGER.info("Using new advancement loading for {}", playerAdvancements);
if (roots == null) throw new RuntimeException("Why did the advancements not load yet?!");
final Set<Advancement> set = new HashSet<>();
for(Map.Entry<Advancement, AdvancementProgress> entry : progress.entrySet()) {
if (entry.getValue().isDone()) {
set.add(entry.getKey());
progressChanged.add(entry.getKey());
}
}
roots.values().stream().flatMap(Collection::stream).filter(adv -> containsAncestor(adv, set)).forEach(adv->updateVisibility(adv, visible, visibilityChanged, progress, progressChanged, shouldBeVisible));
}
private static boolean containsAncestor(final Advancement adv, final Set<Advancement> set) {
return set.contains(adv) || (adv.getParent() != null && containsAncestor(adv.getParent(), set));
}
private static void updateVisibility(final Advancement adv, final Set<Advancement> visible, final Set<Advancement> visibilityChanged, final Map<Advancement, AdvancementProgress> progress, final Set<Advancement> progressChanged, Predicate<Advancement> shouldBeVisible) {
boolean flag = shouldBeVisible.test(adv);
boolean flag1 = visible.contains(adv);
if (flag && !flag1) {
visible.add(adv);
visibilityChanged.add(adv);
if (progress.containsKey(adv)) {
progressChanged.add(adv);
}
} else if (!flag && flag1) {
visible.remove(adv);
visibilityChanged.add(adv);
}
if (flag!=flag1 && adv.getParent()!=null)
updateVisibility(adv.getParent(), visible, visibilityChanged, progress, progressChanged, shouldBeVisible);
}
public static void buildSortedTrees(final Set<Advancement> roots) {
AdvancementLoadFix.roots = roots.stream()
.map(AdvancementLoadFix::buildGraph)
.map(g -> TopologicalSort.topologicalSort(g, Comparator.comparing(Advancement::getId)))
.collect(Collectors.toMap(lst -> lst.get(0), Function.identity()));
}
private static Graph<Advancement> buildGraph(final Advancement root) {
final MutableGraph<Advancement> tree = GraphBuilder.directed().build();
addEdgesAndChildren(root, tree);
return tree;
}
private static void addEdgesAndChildren(final Advancement root, final MutableGraph<Advancement> tree) {
tree.addNode(root);
for (Advancement adv: root.getChildren()) {
addEdgesAndChildren(adv, tree);
tree.putEdge(root, adv);
}
}
}