async-pack-scan/src/client/java/io/gitlab/jfronny/aps/client/mixin/ResourcePackOrganizerMixin....

54 lines
1.8 KiB
Java

package io.gitlab.jfronny.aps.client.mixin;
import io.gitlab.jfronny.libjf.LibJf;
import net.minecraft.client.gui.screen.pack.ResourcePackOrganizer;
import net.minecraft.resource.ResourcePackManager;
import net.minecraft.resource.ResourcePackProfile;
import org.spongepowered.asm.mixin.*;
import org.spongepowered.asm.mixin.injection.At;
import org.spongepowered.asm.mixin.injection.Inject;
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
import java.util.List;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
@Mixin(ResourcePackOrganizer.class)
public class ResourcePackOrganizerMixin {
@Shadow
@Final
private ResourcePackManager resourcePackManager;
@Shadow @Final private List<ResourcePackProfile> enabledPacks;
@Shadow @Final private List<ResourcePackProfile> disabledPacks;
@Unique private Future<Void> aps$packScan = null;
/**
* @author JFronny
* @reason Make reloading asynchronous
*/
@Overwrite
public void refresh() {
if (aps$packScan != null) aps$packScan.cancel(true);
Future<Void>[] task = new Future[1];
aps$packScan = task[0] = resourcePackManager.scanPacksAsync(() -> {
enabledPacks.retainAll(resourcePackManager.getProfiles());
disabledPacks.clear();
disabledPacks.addAll(resourcePackManager.getProfiles());
disabledPacks.removeAll(enabledPacks);
if (aps$packScan == task[0]) aps$packScan = null;
});
}
@Inject(method = "apply()V", at = @At("HEAD"))
void onApply(CallbackInfo ci) {
if (aps$packScan != null) {
try {
aps$packScan.get();
} catch (InterruptedException | ExecutionException e) {
LibJf.LOGGER.error("Pack scan was interrupted", e);
}
}
}
}