Code/net/minecraft/world/level/block/state/pattern/BlockPatternBuilder.java

102 lines
3.5 KiB
Java

package net.minecraft.world.level.block.state.pattern;
import com.google.common.base.Joiner;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import java.lang.reflect.Array;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.function.Predicate;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.StringUtils;
public class BlockPatternBuilder {
private static final Joiner COMMA_JOINED = Joiner.on(",");
private final List<String[]> pattern = Lists.newArrayList();
private final Map<Character, Predicate<BlockInWorld>> lookup = Maps.newHashMap();
private int height;
private int width;
private BlockPatternBuilder() {
this.lookup.put(' ', p_187549_ -> true);
}
public BlockPatternBuilder aisle(String... p_61248_) {
if (!ArrayUtils.isEmpty((Object[])p_61248_) && !StringUtils.isEmpty(p_61248_[0])) {
if (this.pattern.isEmpty()) {
this.height = p_61248_.length;
this.width = p_61248_[0].length();
}
if (p_61248_.length != this.height) {
throw new IllegalArgumentException(
"Expected aisle with height of " + this.height + ", but was given one with a height of " + p_61248_.length + ")"
);
} else {
for (String s : p_61248_) {
if (s.length() != this.width) {
throw new IllegalArgumentException(
"Not all rows in the given aisle are the correct width (expected " + this.width + ", found one with " + s.length() + ")"
);
}
for (char c0 : s.toCharArray()) {
if (!this.lookup.containsKey(c0)) {
this.lookup.put(c0, null);
}
}
}
this.pattern.add(p_61248_);
return this;
}
} else {
throw new IllegalArgumentException("Empty pattern for aisle");
}
}
public static BlockPatternBuilder start() {
return new BlockPatternBuilder();
}
public BlockPatternBuilder where(char p_61245_, Predicate<BlockInWorld> p_61246_) {
this.lookup.put(p_61245_, p_61246_);
return this;
}
public BlockPattern build() {
return new BlockPattern(this.createPattern());
}
private Predicate<BlockInWorld>[][][] createPattern() {
this.ensureAllCharactersMatched();
Predicate<BlockInWorld>[][][] predicate = (Predicate<BlockInWorld>[][][])Array.newInstance(
Predicate.class, this.pattern.size(), this.height, this.width
);
for (int i = 0; i < this.pattern.size(); i++) {
for (int j = 0; j < this.height; j++) {
for (int k = 0; k < this.width; k++) {
predicate[i][j][k] = this.lookup.get(this.pattern.get(i)[j].charAt(k));
}
}
}
return predicate;
}
private void ensureAllCharactersMatched() {
List<Character> list = Lists.newArrayList();
for (Entry<Character, Predicate<BlockInWorld>> entry : this.lookup.entrySet()) {
if (entry.getValue() == null) {
list.add(entry.getKey());
}
}
if (!list.isEmpty()) {
throw new IllegalStateException("Predicates for character(s) " + COMMA_JOINED.join(list) + " are missing");
}
}
}