54 lines
1.8 KiB
Java
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);
|
|
}
|
|
}
|
|
}
|
|
}
|