120 lines
		
	
	
	
		
			3.3 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
			
		
		
	
	
			120 lines
		
	
	
	
		
			3.3 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
| package net.minecraft.advancements;
 | |
| 
 | |
| import com.google.common.collect.Sets;
 | |
| import com.mojang.serialization.Codec;
 | |
| import com.mojang.serialization.DataResult;
 | |
| import it.unimi.dsi.fastutil.objects.ObjectOpenHashSet;
 | |
| import java.util.Collection;
 | |
| import java.util.List;
 | |
| import java.util.Set;
 | |
| import java.util.function.Predicate;
 | |
| import net.minecraft.network.FriendlyByteBuf;
 | |
| 
 | |
| public record AdvancementRequirements(List<List<String>> requirements) {
 | |
| 	public static final Codec<AdvancementRequirements> CODEC = Codec.STRING
 | |
| 		.listOf()
 | |
| 		.listOf()
 | |
| 		.xmap(AdvancementRequirements::new, AdvancementRequirements::requirements);
 | |
| 	public static final AdvancementRequirements EMPTY = new AdvancementRequirements(List.of());
 | |
| 
 | |
| 	public AdvancementRequirements(FriendlyByteBuf buffer) {
 | |
| 		this(buffer.readList(friendlyByteBuf -> friendlyByteBuf.readList(FriendlyByteBuf::readUtf)));
 | |
| 	}
 | |
| 
 | |
| 	public void write(FriendlyByteBuf buffer) {
 | |
| 		buffer.writeCollection(this.requirements, (friendlyByteBuf, list) -> friendlyByteBuf.writeCollection(list, FriendlyByteBuf::writeUtf));
 | |
| 	}
 | |
| 
 | |
| 	public static AdvancementRequirements allOf(Collection<String> requirements) {
 | |
| 		return new AdvancementRequirements(requirements.stream().map(List::of).toList());
 | |
| 	}
 | |
| 
 | |
| 	public static AdvancementRequirements anyOf(Collection<String> criteria) {
 | |
| 		return new AdvancementRequirements(List.of(List.copyOf(criteria)));
 | |
| 	}
 | |
| 
 | |
| 	public int size() {
 | |
| 		return this.requirements.size();
 | |
| 	}
 | |
| 
 | |
| 	public boolean test(Predicate<String> predicate) {
 | |
| 		if (this.requirements.isEmpty()) {
 | |
| 			return false;
 | |
| 		} else {
 | |
| 			for (List<String> list : this.requirements) {
 | |
| 				if (!anyMatch(list, predicate)) {
 | |
| 					return false;
 | |
| 				}
 | |
| 			}
 | |
| 
 | |
| 			return true;
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	public int count(Predicate<String> filter) {
 | |
| 		int i = 0;
 | |
| 
 | |
| 		for (List<String> list : this.requirements) {
 | |
| 			if (anyMatch(list, filter)) {
 | |
| 				i++;
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		return i;
 | |
| 	}
 | |
| 
 | |
| 	private static boolean anyMatch(List<String> requirements, Predicate<String> predicate) {
 | |
| 		for (String string : requirements) {
 | |
| 			if (predicate.test(string)) {
 | |
| 				return true;
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		return false;
 | |
| 	}
 | |
| 
 | |
| 	public DataResult<AdvancementRequirements> validate(Set<String> requirements) {
 | |
| 		Set<String> set = new ObjectOpenHashSet<>();
 | |
| 
 | |
| 		for (List<String> list : this.requirements) {
 | |
| 			if (list.isEmpty() && requirements.isEmpty()) {
 | |
| 				return DataResult.error(() -> "Requirement entry cannot be empty");
 | |
| 			}
 | |
| 
 | |
| 			set.addAll(list);
 | |
| 		}
 | |
| 
 | |
| 		if (!requirements.equals(set)) {
 | |
| 			Set<String> set2 = Sets.<String>difference(requirements, set);
 | |
| 			Set<String> set3 = Sets.<String>difference(set, requirements);
 | |
| 			return DataResult.error(() -> "Advancement completion requirements did not exactly match specified criteria. Missing: " + set2 + ". Unknown: " + set3);
 | |
| 		} else {
 | |
| 			return DataResult.success(this);
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	public boolean isEmpty() {
 | |
| 		return this.requirements.isEmpty();
 | |
| 	}
 | |
| 
 | |
| 	public String toString() {
 | |
| 		return this.requirements.toString();
 | |
| 	}
 | |
| 
 | |
| 	public Set<String> names() {
 | |
| 		Set<String> set = new ObjectOpenHashSet<>();
 | |
| 
 | |
| 		for (List<String> list : this.requirements) {
 | |
| 			set.addAll(list);
 | |
| 		}
 | |
| 
 | |
| 		return set;
 | |
| 	}
 | |
| 
 | |
| 	public interface Strategy {
 | |
| 		AdvancementRequirements.Strategy AND = AdvancementRequirements::allOf;
 | |
| 		AdvancementRequirements.Strategy OR = AdvancementRequirements::anyOf;
 | |
| 
 | |
| 		AdvancementRequirements create(Collection<String> collection);
 | |
| 	}
 | |
| }
 |