Skip to content

Commit

Permalink
Fix resource loading issues
Browse files Browse the repository at this point in the history
Null references had struck again!

(cherry picked from commit 56a55bc)
  • Loading branch information
StartsMercury committed Feb 1, 2025
1 parent 2ec7280 commit 7cad577
Show file tree
Hide file tree
Showing 3 changed files with 86 additions and 8 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
package io.github.startsmercury.visual_snowy_leaves.impl.client.util;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.concurrent.CompletableFuture;
import java.util.function.Consumer;
import java.util.function.IntFunction;

public final class SequencedCompletableFuture {
public static <T> CompletableFuture<List<T>> tryFilter(
final Collection<? extends CompletableFuture<? extends T>> actions,
final Consumer<? super Throwable> catcher
) {
return tryFilter(actions, ArrayList::new, catcher);
}

public static <C extends Collection<T>, T> CompletableFuture<C> tryFilter(
final Collection<? extends CompletableFuture<? extends T>> actions,
final IntFunction<C> collectionProvider,
final Consumer<? super Throwable> catcher
) {
final C collection;
final CompletableFuture<?>[] buffer;

{
final var n = actions.size();
collection = collectionProvider.apply(n);
buffer = new CompletableFuture[n];
}

var idx = 0;
for (final var action : actions) {
buffer[idx++] = action.handle((result, throwable) -> {
if (throwable != null) {
catcher.accept(throwable);
} else {
collection.add(result);
}

return (Void) null;
});
}

return CompletableFuture.allOf(buffer).thenApply(x -> collection);
}

private SequencedCompletableFuture() {}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package io.github.startsmercury.visual_snowy_leaves.impl.client.util;

import net.minecraft.resources.ResourceLocation;

public class UnknownBlockStateDefinitionException extends RuntimeException {
private final ResourceLocation resourceLocation;

public UnknownBlockStateDefinitionException(final ResourceLocation resourceLocation) {
super(resourceLocation.toString());

this.resourceLocation = resourceLocation;
}

public ResourceLocation getResourceLocation() {
return this.resourceLocation;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,8 @@
import com.llamalad7.mixinextras.sugar.Local;
import io.github.startsmercury.visual_snowy_leaves.impl.client.SpriteWhitener;
import io.github.startsmercury.visual_snowy_leaves.impl.client.VslConstants;
import net.minecraft.Util;
import io.github.startsmercury.visual_snowy_leaves.impl.client.util.SequencedCompletableFuture;
import io.github.startsmercury.visual_snowy_leaves.impl.client.util.UnknownBlockStateDefinitionException;
import net.minecraft.client.Minecraft;
import net.minecraft.client.color.block.BlockColors;
import net.minecraft.client.renderer.block.model.BlockModelDefinition;
Expand All @@ -25,6 +26,7 @@
import java.util.ArrayList;
import java.util.Map;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.CompletionException;
import java.util.concurrent.Executor;
import java.util.function.Consumer;

Expand Down Expand Up @@ -74,12 +76,7 @@ private CompletableFuture<Void> modifySprites(
final var stateDefinition = function.apply(resourceLocation);

if (stateDefinition == null) {
logger.debug(
"[{}] Discovered unknown block state definition {}, ignoring",
VslConstants.NAME,
resourceLocation
);
return null;
throw new UnknownBlockStateDefinitionException(resourceLocation);
}

final var resources = entry.getValue();
Expand All @@ -106,7 +103,22 @@ private CompletableFuture<Void> modifySprites(
}, executor));
}

return Util.sequence(list);
return SequencedCompletableFuture.tryFilter(list, throwable -> {
if (throwable instanceof CompletionException) {
throwable = throwable.getCause();
}
if (throwable instanceof final Error error) {
throw error;
} else if (throwable instanceof final UnknownBlockStateDefinitionException cause) {
logger.debug(
"[{}] Discovered unknown block state definition {}, ignoring",
VslConstants.NAME,
cause.getResourceLocation()
);
} else {
logger.error("[{}] Uncaught exception", VslConstants.NAME, throwable);
}
});
});

final var spriteWhitenerFuture = modelDiscoveryFuture.thenCompose(modelDiscovery -> {
Expand Down

0 comments on commit 7cad577

Please sign in to comment.