2020-11-24 22:04:13 +01:00
|
|
|
package io.gitlab.jfronny.respackopts.mixin;
|
|
|
|
|
2022-08-28 20:06:59 +02:00
|
|
|
import io.gitlab.jfronny.respackopts.RespackoptsConfig;
|
2022-07-28 14:10:59 +02:00
|
|
|
import io.gitlab.jfronny.respackopts.integration.SaveHook;
|
2022-03-27 11:39:01 +02:00
|
|
|
import io.gitlab.jfronny.respackopts.model.cache.CacheKey;
|
2021-11-19 15:16:08 +01:00
|
|
|
import io.gitlab.jfronny.respackopts.util.MetaCache;
|
2020-11-24 22:04:13 +01:00
|
|
|
import io.gitlab.jfronny.respackopts.Respackopts;
|
2021-11-14 15:37:01 +01:00
|
|
|
import io.gitlab.jfronny.respackopts.model.PackMeta;
|
2021-11-19 15:16:08 +01:00
|
|
|
import net.minecraft.resource.*;
|
2020-11-24 22:04:13 +01:00
|
|
|
import org.spongepowered.asm.mixin.Mixin;
|
|
|
|
import org.spongepowered.asm.mixin.Shadow;
|
2021-11-25 19:15:50 +01:00
|
|
|
import org.spongepowered.asm.mixin.Unique;
|
2020-11-24 22:04:13 +01:00
|
|
|
import org.spongepowered.asm.mixin.injection.At;
|
|
|
|
import org.spongepowered.asm.mixin.injection.Inject;
|
|
|
|
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
|
|
|
|
|
2022-08-28 20:43:13 +02:00
|
|
|
import java.io.*;
|
2021-11-19 15:16:08 +01:00
|
|
|
import java.nio.file.Path;
|
2021-11-25 19:15:50 +01:00
|
|
|
import java.util.HashSet;
|
2020-11-24 22:04:13 +01:00
|
|
|
import java.util.Map;
|
2021-11-25 19:15:50 +01:00
|
|
|
import java.util.Set;
|
2020-11-24 22:04:13 +01:00
|
|
|
|
|
|
|
@Mixin(ResourcePackManager.class)
|
|
|
|
public class ResourcePackManagerMixin {
|
|
|
|
@Shadow private Map<String, ResourcePackProfile> profiles;
|
2021-11-28 16:56:37 +01:00
|
|
|
@Unique private final Set<Path> dataLocations = new HashSet<>();
|
2020-11-24 22:04:13 +01:00
|
|
|
|
|
|
|
@Inject(at = @At("TAIL"), method = "scanPacks()V")
|
|
|
|
private void scanPacks(CallbackInfo info) {
|
2021-11-28 16:56:37 +01:00
|
|
|
Set<Path> toRemove = new HashSet<>(dataLocations);
|
|
|
|
dataLocations.clear();
|
2020-11-24 22:04:13 +01:00
|
|
|
profiles.forEach((s, v) -> {
|
2022-08-28 20:43:13 +02:00
|
|
|
try (ResourcePack rpi = v.createResourcePack()) {
|
2022-08-28 20:52:27 +02:00
|
|
|
rpo$checkProfile(s, v.getDisplayName().getString(), rpi, toRemove);
|
2020-11-24 22:04:13 +01:00
|
|
|
}
|
|
|
|
});
|
2021-11-28 16:56:37 +01:00
|
|
|
for (Path s : toRemove) {
|
2022-03-27 11:39:01 +02:00
|
|
|
CacheKey k = MetaCache.getKeyByDataLocation(s);
|
|
|
|
if (k != null) MetaCache.remove(k);
|
2021-11-25 19:15:50 +01:00
|
|
|
}
|
2022-07-28 14:10:59 +02:00
|
|
|
MetaCache.save(SaveHook.Arguments.DO_NOTHING);
|
2020-11-24 22:04:13 +01:00
|
|
|
}
|
2022-08-28 20:43:13 +02:00
|
|
|
|
2022-08-28 20:52:27 +02:00
|
|
|
private void rpo$checkProfile(String profileName, String displayName, ResourcePack rpi, Set<Path> toRemove) {
|
|
|
|
Path dataLocation = null;
|
|
|
|
if (rpi instanceof AbstractFileResourcePack arr) {
|
|
|
|
Path pack = arr.getBase().toPath();
|
|
|
|
dataLocation = pack.getParent().resolve(pack.getFileName().toString() + Respackopts.FILE_EXTENSION);
|
|
|
|
}
|
|
|
|
|
|
|
|
try (InputStream is = rpi.openRoot(Respackopts.ID + ".json5")) {
|
|
|
|
rpo$readConfiguration(is, dataLocation, rpi.getName(), displayName, toRemove);
|
|
|
|
return;
|
2022-08-30 17:28:21 +02:00
|
|
|
} catch (FileNotFoundException ignored) {
|
2022-08-28 20:52:27 +02:00
|
|
|
} catch (IOException e) {
|
|
|
|
Respackopts.LOGGER.error("Could not read respackopts config in root for " + profileName, e);
|
|
|
|
}
|
|
|
|
|
|
|
|
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)) {
|
|
|
|
rpo$readConfiguration(is, dataLocation, rpi.getName(), displayName, toRemove);
|
|
|
|
} catch (Throwable e) {
|
|
|
|
Respackopts.LOGGER.error("Could not initialize pack meta for " + profileName, e);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private void rpo$readConfiguration(InputStream is, Path dataLocation, String packName, String displayName, Set<Path> toRemove) throws IOException {
|
2022-08-28 20:43:13 +02:00
|
|
|
try (InputStreamReader isr = new InputStreamReader(is)) {
|
|
|
|
PackMeta conf = Respackopts.GSON.fromJson(isr, PackMeta.class);
|
|
|
|
if (RespackoptsConfig.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 (dataLocation == null) dataLocation = Respackopts.FALLBACK_CONF_DIR.resolve(conf.id + ".json");
|
|
|
|
MetaCache.addFromScan(displayName, packName, conf, dataLocation);
|
|
|
|
dataLocations.add(dataLocation);
|
|
|
|
toRemove.remove(dataLocation);
|
|
|
|
}
|
|
|
|
}
|
2020-11-24 22:04:13 +01:00
|
|
|
}
|