194 lines
		
	
	
	
		
			6.4 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
			
		
		
	
	
			194 lines
		
	
	
	
		
			6.4 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
| package net.minecraft.server.packs.repository;
 | |
| 
 | |
| import com.mojang.logging.LogUtils;
 | |
| import java.util.List;
 | |
| import java.util.function.Function;
 | |
| import net.minecraft.SharedConstants;
 | |
| import net.minecraft.network.chat.Component;
 | |
| import net.minecraft.server.packs.FeatureFlagsMetadataSection;
 | |
| import net.minecraft.server.packs.OverlayMetadataSection;
 | |
| import net.minecraft.server.packs.PackLocationInfo;
 | |
| import net.minecraft.server.packs.PackResources;
 | |
| import net.minecraft.server.packs.PackSelectionConfig;
 | |
| import net.minecraft.server.packs.PackType;
 | |
| import net.minecraft.server.packs.metadata.pack.PackMetadataSection;
 | |
| import net.minecraft.util.InclusiveRange;
 | |
| import net.minecraft.world.flag.FeatureFlagSet;
 | |
| import org.jetbrains.annotations.Nullable;
 | |
| import org.slf4j.Logger;
 | |
| 
 | |
| public class Pack {
 | |
| 	private static final Logger LOGGER = LogUtils.getLogger();
 | |
| 	private final PackLocationInfo location;
 | |
| 	private final Pack.ResourcesSupplier resources;
 | |
| 	private final Pack.Metadata metadata;
 | |
| 	private final PackSelectionConfig selectionConfig;
 | |
| 
 | |
| 	@Nullable
 | |
| 	public static Pack readMetaAndCreate(PackLocationInfo location, Pack.ResourcesSupplier resources, PackType packType, PackSelectionConfig selectionConfig) {
 | |
| 		int i = SharedConstants.getCurrentVersion().packVersion(packType);
 | |
| 		Pack.Metadata metadata = readPackMetadata(location, resources, i);
 | |
| 		return metadata != null ? new Pack(location, resources, metadata, selectionConfig) : null;
 | |
| 	}
 | |
| 
 | |
| 	public Pack(PackLocationInfo location, Pack.ResourcesSupplier resources, Pack.Metadata metadata, PackSelectionConfig selectionConfig) {
 | |
| 		this.location = location;
 | |
| 		this.resources = resources;
 | |
| 		this.metadata = metadata;
 | |
| 		this.selectionConfig = selectionConfig;
 | |
| 	}
 | |
| 
 | |
| 	@Nullable
 | |
| 	public static Pack.Metadata readPackMetadata(PackLocationInfo location, Pack.ResourcesSupplier resources, int version) {
 | |
| 		try {
 | |
| 			Pack.Metadata var11;
 | |
| 			try (PackResources packResources = resources.openPrimary(location)) {
 | |
| 				PackMetadataSection packMetadataSection = packResources.getMetadataSection(PackMetadataSection.TYPE);
 | |
| 				if (packMetadataSection == null) {
 | |
| 					LOGGER.warn("Missing metadata in pack {}", location.id());
 | |
| 					return null;
 | |
| 				}
 | |
| 
 | |
| 				FeatureFlagsMetadataSection featureFlagsMetadataSection = packResources.getMetadataSection(FeatureFlagsMetadataSection.TYPE);
 | |
| 				FeatureFlagSet featureFlagSet = featureFlagsMetadataSection != null ? featureFlagsMetadataSection.flags() : FeatureFlagSet.of();
 | |
| 				InclusiveRange<Integer> inclusiveRange = getDeclaredPackVersions(location.id(), packMetadataSection);
 | |
| 				PackCompatibility packCompatibility = PackCompatibility.forVersion(inclusiveRange, version);
 | |
| 				OverlayMetadataSection overlayMetadataSection = packResources.getMetadataSection(OverlayMetadataSection.TYPE);
 | |
| 				List<String> list = overlayMetadataSection != null ? overlayMetadataSection.overlaysForVersion(version) : List.of();
 | |
| 				var11 = new Pack.Metadata(packMetadataSection.description(), packCompatibility, featureFlagSet, list);
 | |
| 			}
 | |
| 
 | |
| 			return var11;
 | |
| 		} catch (Exception var14) {
 | |
| 			LOGGER.warn("Failed to read pack {} metadata", location.id(), var14);
 | |
| 			return null;
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	private static InclusiveRange<Integer> getDeclaredPackVersions(String id, PackMetadataSection metadata) {
 | |
| 		int i = metadata.packFormat();
 | |
| 		if (metadata.supportedFormats().isEmpty()) {
 | |
| 			return new InclusiveRange(i);
 | |
| 		} else {
 | |
| 			InclusiveRange<Integer> inclusiveRange = (InclusiveRange<Integer>)metadata.supportedFormats().get();
 | |
| 			if (!inclusiveRange.isValueInRange(i)) {
 | |
| 				LOGGER.warn("Pack {} declared support for versions {} but declared main format is {}, defaulting to {}", id, inclusiveRange, i, i);
 | |
| 				return new InclusiveRange(i);
 | |
| 			} else {
 | |
| 				return inclusiveRange;
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	public PackLocationInfo location() {
 | |
| 		return this.location;
 | |
| 	}
 | |
| 
 | |
| 	public Component getTitle() {
 | |
| 		return this.location.title();
 | |
| 	}
 | |
| 
 | |
| 	public Component getDescription() {
 | |
| 		return this.metadata.description();
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * @param green used to indicate either a successful operation or datapack enabled status
 | |
| 	 */
 | |
| 	public Component getChatLink(boolean green) {
 | |
| 		return this.location.createChatLink(green, this.metadata.description);
 | |
| 	}
 | |
| 
 | |
| 	public PackCompatibility getCompatibility() {
 | |
| 		return this.metadata.compatibility();
 | |
| 	}
 | |
| 
 | |
| 	public FeatureFlagSet getRequestedFeatures() {
 | |
| 		return this.metadata.requestedFeatures();
 | |
| 	}
 | |
| 
 | |
| 	public PackResources open() {
 | |
| 		return this.resources.openFull(this.location, this.metadata);
 | |
| 	}
 | |
| 
 | |
| 	public String getId() {
 | |
| 		return this.location.id();
 | |
| 	}
 | |
| 
 | |
| 	public PackSelectionConfig selectionConfig() {
 | |
| 		return this.selectionConfig;
 | |
| 	}
 | |
| 
 | |
| 	public boolean isRequired() {
 | |
| 		return this.selectionConfig.required();
 | |
| 	}
 | |
| 
 | |
| 	public boolean isFixedPosition() {
 | |
| 		return this.selectionConfig.fixedPosition();
 | |
| 	}
 | |
| 
 | |
| 	public Pack.Position getDefaultPosition() {
 | |
| 		return this.selectionConfig.defaultPosition();
 | |
| 	}
 | |
| 
 | |
| 	public PackSource getPackSource() {
 | |
| 		return this.location.source();
 | |
| 	}
 | |
| 
 | |
| 	public boolean equals(Object object) {
 | |
| 		if (this == object) {
 | |
| 			return true;
 | |
| 		} else {
 | |
| 			return !(object instanceof Pack pack) ? false : this.location.equals(pack.location);
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	public int hashCode() {
 | |
| 		return this.location.hashCode();
 | |
| 	}
 | |
| 
 | |
| 	public record Metadata(Component description, PackCompatibility compatibility, FeatureFlagSet requestedFeatures, List<String> overlays) {
 | |
| 	}
 | |
| 
 | |
| 	public static enum Position {
 | |
| 		TOP,
 | |
| 		BOTTOM;
 | |
| 
 | |
| 		public <T> int insert(List<T> list, T element, Function<T, PackSelectionConfig> packFactory, boolean flipPosition) {
 | |
| 			Pack.Position position = flipPosition ? this.opposite() : this;
 | |
| 			if (position == BOTTOM) {
 | |
| 				int i;
 | |
| 				for (i = 0; i < list.size(); i++) {
 | |
| 					PackSelectionConfig packSelectionConfig = (PackSelectionConfig)packFactory.apply(list.get(i));
 | |
| 					if (!packSelectionConfig.fixedPosition() || packSelectionConfig.defaultPosition() != this) {
 | |
| 						break;
 | |
| 					}
 | |
| 				}
 | |
| 
 | |
| 				list.add(i, element);
 | |
| 				return i;
 | |
| 			} else {
 | |
| 				int i;
 | |
| 				for (i = list.size() - 1; i >= 0; i--) {
 | |
| 					PackSelectionConfig packSelectionConfig = (PackSelectionConfig)packFactory.apply(list.get(i));
 | |
| 					if (!packSelectionConfig.fixedPosition() || packSelectionConfig.defaultPosition() != this) {
 | |
| 						break;
 | |
| 					}
 | |
| 				}
 | |
| 
 | |
| 				list.add(i + 1, element);
 | |
| 				return i + 1;
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		public Pack.Position opposite() {
 | |
| 			return this == TOP ? BOTTOM : TOP;
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	public interface ResourcesSupplier {
 | |
| 		PackResources openPrimary(PackLocationInfo location);
 | |
| 
 | |
| 		PackResources openFull(PackLocationInfo location, Pack.Metadata metadata);
 | |
| 	}
 | |
| }
 |