package io.gitlab.jfronny.respackopts.mixin; import io.gitlab.jfronny.respackopts.util.MetaCache; import io.gitlab.jfronny.respackopts.Respackopts; import io.gitlab.jfronny.respackopts.model.PackMeta; import net.minecraft.resource.*; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import java.io.InputStream; import java.io.InputStreamReader; import java.nio.file.Path; import java.util.Map; @Mixin(ResourcePackManager.class) public class ResourcePackManagerMixin { @Shadow private Map profiles; @Inject(at = @At("TAIL"), method = "scanPacks()V") private void scanPacks(CallbackInfo info) { MetaCache.clear(); profiles.forEach((s, v) -> { ResourcePack rpi = v.createResourcePack(); ResourceType packConfType = null; for (ResourceType type : ResourceType.values()) { if (rpi.contains(type, Respackopts.CONF_ID)) { packConfType = type; } } if (packConfType != null) { try (InputStream is = rpi.open(packConfType, Respackopts.CONF_ID); InputStreamReader isr = new InputStreamReader(is)) { String displayName = v.getDisplayName().asString(); String packName = rpi.getName(); PackMeta conf = Respackopts.GSON.fromJson(isr, PackMeta.class); if (Respackopts.CONFIG.debugLogs) Respackopts.LOGGER.info("Discovered pack: " + conf.id); if (Respackopts.META_VERSION < conf.version) { Respackopts.LOGGER.error(displayName + " was not loaded as it specifies a newer respackopts version than is installed"); return; } if (rpi instanceof AbstractFileResourcePack arr) { Path pack = ((AbstractFileResourcePackAccessor)arr).getBase().toPath(); Path packData = pack.getParent().resolve(pack.getFileName().toString() + Respackopts.FILE_EXTENSION); MetaCache.addFromScan(displayName, packName, conf, packData); } else { MetaCache.addFromScan(displayName, packName, conf, Respackopts.FALLBACK_CONF_DIR.resolve(conf.id + ".json")); } } catch (Throwable e) { Respackopts.LOGGER.error("Could not initialize pack meta for " + s, e); } } }); MetaCache.save(); } }