package io.gitlab.jfronny.respackopts.mixin; import com.google.gson.*; import io.gitlab.jfronny.respackopts.Respackopts; import io.gitlab.jfronny.respackopts.data.ConfigBranch; import io.gitlab.jfronny.respackopts.data.in.Respackmeta; import net.minecraft.resource.ResourcePackManager; import net.minecraft.resource.ResourcePackProfile; import net.minecraft.resource.ResourceType; 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.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.LinkedHashSet; 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) { profiles.forEach((s, v) -> { if (rpo$hasMetadata(v)) { try { Respackmeta conf = Respackopts.GSON.fromJson(rpo$readMetadata(v, Respackopts.GSON), Respackmeta.class); if (!Respackopts.META_VERSION.equals(conf.version)) { Respackopts.LOGGER.error(s + " was not loaded as it specifies a different respackopts version than is installed"); return; } if (!Respackopts.CONFIG_BRANCH.containsKey(conf.id)) Respackopts.CONFIG_BRANCH.put(conf.id, conf.conf); else Respackopts.CONFIG_BRANCH.get(conf.id).loadValues(conf.conf, true); Respackopts.resPackMetas.put(v.getDisplayName().asString(), conf); Respackopts.load(conf.id); } catch (Throwable e) { Respackopts.LOGGER.error(e); } } }); } private boolean rpo$hasMetadata(ResourcePackProfile v) { return v.createResourcePack().contains(ResourceType.CLIENT_RESOURCES, Respackopts.CONF_ID); } private JsonObject rpo$readMetadata(ResourcePackProfile v, Gson g) throws IOException { InputStream is = v.createResourcePack().open(ResourceType.CLIENT_RESOURCES, Respackopts.CONF_ID); ByteArrayOutputStream bais = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int length; while ((length = is.read(buffer)) != -1) { bais.write(buffer, 0, length); } return g.fromJson(bais.toString(), JsonElement.class).getAsJsonObject(); } }