2020-11-24 22:04:13 +01:00
|
|
|
package io.gitlab.jfronny.respackopts.mixin;
|
|
|
|
|
2021-06-10 16:11:19 +02:00
|
|
|
import com.google.gson.Gson;
|
|
|
|
import com.google.gson.JsonElement;
|
|
|
|
import com.google.gson.JsonObject;
|
2020-11-24 22:04:13 +01:00
|
|
|
import io.gitlab.jfronny.respackopts.Respackopts;
|
2021-06-10 16:07:22 +02:00
|
|
|
import io.gitlab.jfronny.respackopts.data.Respackmeta;
|
2021-06-10 16:11:19 +02:00
|
|
|
import io.gitlab.jfronny.respackopts.data.entry.SyncMode;
|
2020-11-24 22:04:13 +01:00
|
|
|
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.Map;
|
|
|
|
|
|
|
|
@Mixin(ResourcePackManager.class)
|
|
|
|
public class ResourcePackManagerMixin {
|
|
|
|
@Shadow private Map<String, ResourcePackProfile> profiles;
|
|
|
|
|
|
|
|
@Inject(at = @At("TAIL"), method = "scanPacks()V")
|
|
|
|
private void scanPacks(CallbackInfo info) {
|
|
|
|
profiles.forEach((s, v) -> {
|
2021-06-10 13:10:12 +02:00
|
|
|
if (rpo$hasMetadata(v)) {
|
2020-11-24 22:04:13 +01:00
|
|
|
try {
|
2021-06-10 13:10:12 +02:00
|
|
|
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");
|
2020-12-28 11:31:12 +01:00
|
|
|
return;
|
|
|
|
}
|
2021-06-10 13:10:12 +02:00
|
|
|
if (!Respackopts.CONFIG_BRANCH.containsKey(conf.id))
|
|
|
|
Respackopts.CONFIG_BRANCH.put(conf.id, conf.conf);
|
|
|
|
else
|
2021-06-10 14:55:03 +02:00
|
|
|
Respackopts.CONFIG_BRANCH.get(conf.id).sync(conf.conf, SyncMode.RESPACK_LOAD);
|
2020-12-28 11:31:12 +01:00
|
|
|
Respackopts.load(conf.id);
|
2020-11-25 20:14:58 +01:00
|
|
|
} catch (Throwable e) {
|
2021-06-10 13:10:12 +02:00
|
|
|
Respackopts.LOGGER.error(e);
|
2020-11-24 22:04:13 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2021-06-10 13:10:12 +02:00
|
|
|
private boolean rpo$hasMetadata(ResourcePackProfile v) {
|
|
|
|
return v.createResourcePack().contains(ResourceType.CLIENT_RESOURCES, Respackopts.CONF_ID);
|
2020-11-24 22:04:13 +01:00
|
|
|
}
|
|
|
|
|
2021-06-10 13:10:12 +02:00
|
|
|
private JsonObject rpo$readMetadata(ResourcePackProfile v, Gson g) throws IOException {
|
|
|
|
InputStream is = v.createResourcePack().open(ResourceType.CLIENT_RESOURCES, Respackopts.CONF_ID);
|
2020-11-24 22:04:13 +01:00
|
|
|
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();
|
|
|
|
}
|
|
|
|
}
|