Skip to content

Commit

Permalink
Some improvements to BlockPatternCondition
Browse files Browse the repository at this point in the history
  • Loading branch information
Gaming32 committed May 30, 2024
1 parent a11c63d commit cc80441
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 9 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@
import com.mojang.serialization.codecs.RecordCodecBuilder;
import io.github.gaming32.bingo.util.BingoCodecs;
import io.github.gaming32.bingo.util.BlockPattern;
import net.minecraft.Util;
import net.minecraft.advancements.critereon.BlockPredicate;
import net.minecraft.advancements.critereon.LocationPredicate;
import net.minecraft.core.BlockPos;
Expand All @@ -19,22 +18,22 @@
import org.apache.commons.lang3.ArrayUtils;
import org.jetbrains.annotations.NotNull;

import java.util.AbstractMap;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.function.Predicate;
import java.util.stream.Collectors;

public class BlockPatternCondition implements LootItemCondition {
public static final MapCodec<BlockPatternCondition> CODEC = RecordCodecBuilder.mapCodec(instance ->
public static final MapCodec<BlockPatternCondition> CODEC = BingoCodecs.catchIAE(RecordCodecBuilder.mapCodec(instance ->
instance.group(
Codec.STRING.listOf().listOf().fieldOf("aisles").forGetter(BlockPatternCondition::aisles),
Codec.unboundedMap(BingoCodecs.CHAR, LocationPredicate.CODEC).fieldOf("where").forGetter(BlockPatternCondition::where),
BlockPattern.Rotations.CODEC.optionalFieldOf("rotations", BlockPattern.Rotations.HORIZONTAL).forGetter(BlockPatternCondition::rotations)
).apply(instance, BlockPatternCondition::new)
);
));

private final List<List<String>> aisles;
private final Map<Character, LocationPredicate> where;
Expand All @@ -55,14 +54,17 @@ public BlockPatternCondition(

@SuppressWarnings("unchecked")
private static BlockPattern buildBlockPattern(List<List<String>> patternChars, Map<Character, LocationPredicate> where) {
Map<Character, Predicate<BlockInWorld>> predicates = where.entrySet().stream()
.map(entry -> new AbstractMap.SimpleEntry<>(entry.getKey(), new BlockPredicateAdapter(entry.getValue())))
.collect(Util.toMap());
Map<Character, Predicate<BlockInWorld>> predicates = where.entrySet()
.stream()
.collect(Collectors.toMap(Map.Entry::getKey, e -> new BlockPredicateAdapter(e.getValue())));
if (predicates.containsKey(' ')) {
throw new IllegalArgumentException("Block predicate ' ' is predefined and may not be overridden");
}
return new BlockPattern(patternChars.stream().map(aisle -> {
Predicate<BlockInWorld>[][] aislePredicates = aisle.stream().map(row -> row.chars().mapToObj(ch -> {
Predicate<BlockInWorld> predicate = ch == ' ' ? blockInWorld -> true : predicates.get((char) ch);
if (predicate == null) {
throw new IllegalStateException("Block pattern uses undefined char '" + (char) ch + "'");
throw new IllegalArgumentException("Block pattern uses undefined char '" + (char) ch + "'");
}
return predicate;
}).toArray(Predicate[]::new)).toArray(Predicate[][]::new);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,10 @@
import com.mojang.serialization.Dynamic;
import com.mojang.serialization.DynamicOps;
import com.mojang.serialization.JsonOps;
import com.mojang.serialization.KeyCompressor;
import com.mojang.serialization.MapCodec;
import com.mojang.serialization.MapDecoder;
import com.mojang.serialization.MapLike;
import it.unimi.dsi.fastutil.ints.Int2IntMap;
import it.unimi.dsi.fastutil.ints.Int2IntOpenHashMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
Expand All @@ -28,6 +31,7 @@
import java.util.OptionalInt;
import java.util.Set;
import java.util.function.Function;
import java.util.stream.Stream;

public final class BingoCodecs {
/**
Expand Down Expand Up @@ -85,7 +89,30 @@ public <T> DataResult<Pair<A, T>> decode(DynamicOps<T> ops, T input) {
return DataResult.error(e::getMessage);
}
}
});
}, "CatchIAE[" + codec + "]");
}

public static <A> MapCodec<A> catchIAE(MapCodec<A> codec) {
return MapCodec.of(codec, new MapDecoder<>() {
@Override
public <T> DataResult<A> decode(DynamicOps<T> ops, MapLike<T> input) {
try {
return codec.decode(ops, input);
} catch (IllegalArgumentException e) {
return DataResult.error(e::getMessage);
}
}

@Override
public <T> KeyCompressor<T> compressor(DynamicOps<T> ops) {
return codec.compressor(ops);
}

@Override
public <T> Stream<T> keys(DynamicOps<T> ops) {
return codec.keys(ops);
}
}, () -> "CatchIAE[" + codec + "]");
}

public static <A> Codec<Set<A>> setOf(Codec<A> elementCodec) {
Expand Down

0 comments on commit cc80441

Please sign in to comment.