110 lines
		
	
	
	
		
			3.5 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
			
		
		
	
	
			110 lines
		
	
	
	
		
			3.5 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
| package net.minecraft.world.flag;
 | |
| 
 | |
| import com.google.common.collect.Sets;
 | |
| import com.mojang.logging.LogUtils;
 | |
| import com.mojang.serialization.Codec;
 | |
| import com.mojang.serialization.DataResult;
 | |
| import java.util.Arrays;
 | |
| import java.util.HashSet;
 | |
| import java.util.LinkedHashMap;
 | |
| import java.util.List;
 | |
| import java.util.Map;
 | |
| import java.util.Set;
 | |
| import java.util.function.Consumer;
 | |
| import net.minecraft.resources.ResourceLocation;
 | |
| import org.slf4j.Logger;
 | |
| 
 | |
| public class FeatureFlagRegistry {
 | |
| 	private static final Logger LOGGER = LogUtils.getLogger();
 | |
| 	private final FeatureFlagUniverse universe;
 | |
| 	private final Map<ResourceLocation, FeatureFlag> names;
 | |
| 	private final FeatureFlagSet allFlags;
 | |
| 
 | |
| 	FeatureFlagRegistry(FeatureFlagUniverse universe, FeatureFlagSet allFlags, Map<ResourceLocation, FeatureFlag> names) {
 | |
| 		this.universe = universe;
 | |
| 		this.names = names;
 | |
| 		this.allFlags = allFlags;
 | |
| 	}
 | |
| 
 | |
| 	public boolean isSubset(FeatureFlagSet set) {
 | |
| 		return set.isSubsetOf(this.allFlags);
 | |
| 	}
 | |
| 
 | |
| 	public FeatureFlagSet allFlags() {
 | |
| 		return this.allFlags;
 | |
| 	}
 | |
| 
 | |
| 	public FeatureFlagSet fromNames(Iterable<ResourceLocation> names) {
 | |
| 		return this.fromNames(names, resourceLocation -> LOGGER.warn("Unknown feature flag: {}", resourceLocation));
 | |
| 	}
 | |
| 
 | |
| 	public FeatureFlagSet subset(FeatureFlag... flags) {
 | |
| 		return FeatureFlagSet.create(this.universe, Arrays.asList(flags));
 | |
| 	}
 | |
| 
 | |
| 	public FeatureFlagSet fromNames(Iterable<ResourceLocation> names, Consumer<ResourceLocation> onError) {
 | |
| 		Set<FeatureFlag> set = Sets.newIdentityHashSet();
 | |
| 
 | |
| 		for (ResourceLocation resourceLocation : names) {
 | |
| 			FeatureFlag featureFlag = (FeatureFlag)this.names.get(resourceLocation);
 | |
| 			if (featureFlag == null) {
 | |
| 				onError.accept(resourceLocation);
 | |
| 			} else {
 | |
| 				set.add(featureFlag);
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		return FeatureFlagSet.create(this.universe, set);
 | |
| 	}
 | |
| 
 | |
| 	public Set<ResourceLocation> toNames(FeatureFlagSet set) {
 | |
| 		Set<ResourceLocation> set2 = new HashSet();
 | |
| 		this.names.forEach((resourceLocation, featureFlag) -> {
 | |
| 			if (set.contains(featureFlag)) {
 | |
| 				set2.add(resourceLocation);
 | |
| 			}
 | |
| 		});
 | |
| 		return set2;
 | |
| 	}
 | |
| 
 | |
| 	public Codec<FeatureFlagSet> codec() {
 | |
| 		return ResourceLocation.CODEC.listOf().comapFlatMap(list -> {
 | |
| 			Set<ResourceLocation> set = new HashSet();
 | |
| 			FeatureFlagSet featureFlagSet = this.fromNames(list, set::add);
 | |
| 			return !set.isEmpty() ? DataResult.error(() -> "Unknown feature ids: " + set, featureFlagSet) : DataResult.success(featureFlagSet);
 | |
| 		}, featureFlagSet -> List.copyOf(this.toNames(featureFlagSet)));
 | |
| 	}
 | |
| 
 | |
| 	public static class Builder {
 | |
| 		private final FeatureFlagUniverse universe;
 | |
| 		private int id;
 | |
| 		private final Map<ResourceLocation, FeatureFlag> flags = new LinkedHashMap();
 | |
| 
 | |
| 		public Builder(String id) {
 | |
| 			this.universe = new FeatureFlagUniverse(id);
 | |
| 		}
 | |
| 
 | |
| 		public FeatureFlag createVanilla(String id) {
 | |
| 			return this.create(ResourceLocation.withDefaultNamespace(id));
 | |
| 		}
 | |
| 
 | |
| 		public FeatureFlag create(ResourceLocation location) {
 | |
| 			if (this.id >= 64) {
 | |
| 				throw new IllegalStateException("Too many feature flags");
 | |
| 			} else {
 | |
| 				FeatureFlag featureFlag = new FeatureFlag(this.universe, this.id++);
 | |
| 				FeatureFlag featureFlag2 = (FeatureFlag)this.flags.put(location, featureFlag);
 | |
| 				if (featureFlag2 != null) {
 | |
| 					throw new IllegalStateException("Duplicate feature flag " + location);
 | |
| 				} else {
 | |
| 					return featureFlag;
 | |
| 				}
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		public FeatureFlagRegistry build() {
 | |
| 			FeatureFlagSet featureFlagSet = FeatureFlagSet.create(this.universe, this.flags.values());
 | |
| 			return new FeatureFlagRegistry(this.universe, featureFlagSet, Map.copyOf(this.flags));
 | |
| 		}
 | |
| 	}
 | |
| }
 |