package net.minecraft.server.packs; import com.google.gson.JsonObject; import com.mojang.logging.LogUtils; import com.mojang.serialization.JsonOps; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.nio.charset.StandardCharsets; import net.minecraft.server.packs.metadata.MetadataSectionType; import net.minecraft.server.packs.resources.IoSupplier; import net.minecraft.util.GsonHelper; import org.jetbrains.annotations.Nullable; import org.slf4j.Logger; public abstract class AbstractPackResources implements PackResources { private static final Logger LOGGER = LogUtils.getLogger(); private final PackLocationInfo location; protected AbstractPackResources(PackLocationInfo location) { this.location = location; } @Nullable @Override public T getMetadataSection(MetadataSectionType type) throws IOException { IoSupplier ioSupplier = this.getRootResource(new String[]{"pack.mcmeta"}); if (ioSupplier == null) { return null; } else { InputStream inputStream = ioSupplier.get(); Object var4; try { var4 = getMetadataFromStream(type, inputStream); } catch (Throwable var7) { if (inputStream != null) { try { inputStream.close(); } catch (Throwable var6) { var7.addSuppressed(var6); } } throw var7; } if (inputStream != null) { inputStream.close(); } return (T)var4; } } @Nullable public static T getMetadataFromStream(MetadataSectionType type, InputStream stream) { JsonObject jsonObject; try { BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(stream, StandardCharsets.UTF_8)); try { jsonObject = GsonHelper.parse(bufferedReader); } catch (Throwable var7) { try { bufferedReader.close(); } catch (Throwable var6) { var7.addSuppressed(var6); } throw var7; } bufferedReader.close(); } catch (Exception var8) { LOGGER.error("Couldn't load {} metadata", type.name(), var8); return null; } return (T)(!jsonObject.has(type.name()) ? null : type.codec() .parse(JsonOps.INSTANCE, jsonObject.get(type.name())) .ifError(error -> LOGGER.error("Couldn't load {} metadata: {}", type.name(), error)) .result() .orElse(null)); } @Override public PackLocationInfo location() { return this.location; } }