BlockFilter class
Пакет: com.hypixel.hytale.server.core.prefab.selection.mask
Файл: com/hypixel/hytale/server/core/prefab/selection/mask/BlockFilter.java
Поля (56)
| Модификаторы | Тип | Имя |
|---|---|---|
|
public static final String |
ABOVE_BLOCK_PREFIX |
|
public static final String |
ADJACENT_BLOCK_PREFIX |
|
public static final String |
BELOW_BLOCK_PREFIX |
|
public static final String |
CARDINAL_EAST_PREFIX |
|
public static final String |
CARDINAL_NORTH_PREFIX |
|
public static final String |
CARDINAL_SOUTH_PREFIX |
|
public static final String |
CARDINAL_WEST_PREFIX |
|
public static final String |
DIAGONAL_XY_PREFIX |
|
public static final String |
DIAGONAL_XZ_PREFIX |
|
public static final String |
DIAGONAL_ZY_PREFIX |
final |
BlockFilter[] |
EMPTY_ARRAY |
|
public static final String |
INVERT_PREFIX |
|
public static final String |
NEIGHBOR_BLOCK_PREFIX |
|
public static final String |
SELECTION_PREFIX |
|
public static final String |
TARGET_BLOCK_PREFIX |
|
private static final BlockFilter.FilterType[] |
VALUES_TO_PARSE |
|
|
VALUES_TO_PARSE |
|
|
continue |
|
|
continue |
|
|
continue |
|
private final boolean |
hasBlocks |
|
private final String |
prefix |
|
BlockFilter.FilterType[] |
var0 |
|
BlockFilter.BlocksAndFluids |
var1 |
|
StringBuilder |
var1 |
|
BlockFilter.ParsedFilterParts |
var1 |
|
boolean |
var1 |
|
IntSet |
var1 |
|
Map |
var1 |
|
BlockFilter.FilterType[] |
var1 |
|
boolean |
var10 |
|
int |
var10 |
|
String |
var10 |
|
BlockType |
var11 |
|
int |
var11 |
|
BlockTypeListAsset |
var12 |
|
Item |
var15 |
|
int |
var16 |
|
int |
var17 |
|
int |
var18 |
|
String |
var2 |
|
String[] |
var2 |
|
int |
var2 |
|
IntSet |
var2 |
|
String |
var2 |
|
int |
var2 |
|
BlockFilter.FilterType |
var3 |
|
boolean |
var3 |
|
|
var3 |
|
RootInteraction |
var3 |
|
String |
var4 |
|
Item |
var8 |
|
Interaction |
var8 |
|
boolean |
var9 |
|
boolean |
var9 |
|
int |
var9 |
Методы (44)
| Модификаторы | Возврат | Сигнатура |
|---|---|---|
public |
record |
BlocksAndFluidsrecord BlocksAndFluids(@Nonnull IntSet blocks, @Nullable IntSet fluids, boolean hasInvalidBlocks) |
|
|
FilterType FilterType(String nullxx) |
|
|
FilterType FilterType(String nullxx, boolean nullxxx) |
abstract |
throw new |
IllegalArgumentExceptionthrow new IllegalArgumentException("Unknown filter type: " + this.blockFilterType) |
public |
record |
ParsedFilterPartsrecord ParsedFilterParts(BlockFilter.FilterType type, boolean inverted, String blocks) |
abstract |
|
Selection Selection("#", false) |
|
|
for for(int var11 = -1; var11 < 2; var11++) |
|
|
for for(int var12 = -1; var12 < 2; var12++) |
|
|
for for(int var13 = -1; var13 < 2; var13++) |
|
|
for for(int var3 = 0; var3 < this.blocks.length; var3++) |
|
|
for for(String var7 : var0) |
|
|
for for(BlockFilter.FilterType var5 : VALUES_TO_PARSE) |
|
|
for for(BlockFilter.FilterType var6 : var0) |
static |
int |
getFluidIdFromItemint getFluidIdFromItem(@Nonnull Item var0) |
|
public String |
getPrefixpublic String getPrefix() |
|
public boolean |
hasBlockspublic boolean hasBlocks() |
public |
boolean |
hasInvalidBlocksboolean hasInvalidBlocks() |
|
|
if if(this.resolvedBlocks == null) |
|
|
if if(var5 != null && var6 != null) |
|
|
if if(this.blocks.length > 1) |
|
|
if if(var3 != this.blocks.length - 1) |
|
|
if if(this.blocks.length > 1) |
|
|
if if(var8 != null) |
|
|
if if(var9 >= 0) |
|
|
if if(var17 >= 0) |
|
|
if if(var17 == 0) |
|
|
if if(var12 != null) |
|
|
if if(var15 != null) |
|
|
if if(var16 >= 0) |
|
|
if if(var2 == null) |
|
|
if if(var3 == null) |
|
|
if if(var8 instanceof PlaceFluidInteraction var9) |
|
|
if if(var10 != null) |
|
|
if if(var11 >= 0) |
|
|
if if(var6 != TargetBlock) |
public |
boolean |
isExcludedboolean isExcluded(@Nonnull ChunkAccessor var1, int var2, int var3, int var4, @Nullable Vector3i var5, @Nullable Vector3i var6, int var7) |
public |
boolean |
isExcludedboolean isExcluded(@Nonnull ChunkAccessor var1, int var2, int var3, int var4, @Nullable Vector3i var5, @Nullable Vector3i var6, int var7, int var8) |
private |
boolean |
isIncludedboolean isIncluded(@Nonnull ChunkAccessor var1, int var2, int var3, int var4, @Nullable Vector3i var5, @Nullable Vector3i var6, int var7) |
private |
boolean |
isIncludedboolean isIncluded(@Nonnull ChunkAccessor var1, int var2, int var3, int var4, @Nullable Vector3i var5, @Nullable Vector3i var6, int var7, int var8) |
public |
boolean |
isInvertedboolean isInverted() |
private |
boolean |
matchesAtboolean matchesAt(@Nonnull ChunkAccessor var1, int var2, int var3, int var4) |
|
public static BlockFilter.FilterType |
parsepublic static BlockFilter.FilterType parse(@Nonnull String var0, int var1) |
public |
void |
resolvevoid resolve() |
|
|
switch switch(this.blockFilterType) |
Исходный код
Показать/скрыть
class="kw">package com.hypixel.hytale.server.core.prefab.selection.mask;
class="kw">import com.hypixel.hytale.codec.Codec;
class="kw">import com.hypixel.hytale.codec.function.FunctionCodec;
class="kw">import com.hypixel.hytale.common.util.ArrayUtil;
class="kw">import com.hypixel.hytale.protocol.InteractionType;
class="kw">import com.hypixel.hytale.server.core.asset.type.blocktype.config.BlockType;
class="kw">import com.hypixel.hytale.server.core.asset.type.buildertool.config.BlockTypeListAsset;
class="kw">import com.hypixel.hytale.server.core.asset.type.fluid.Fluid;
class="kw">import com.hypixel.hytale.server.core.asset.type.item.config.Item;
class="kw">import com.hypixel.hytale.server.core.modules.interaction.interaction.config.Interaction;
class="kw">import com.hypixel.hytale.server.core.modules.interaction.interaction.config.RootInteraction;
class="kw">import com.hypixel.hytale.server.core.modules.interaction.interaction.config.client.PlaceFluidInteraction;
class="kw">import com.hypixel.hytale.server.core.universe.world.accessor.ChunkAccessor;
class="kw">import it.unimi.dsi.fastutil.ints.IntOpenHashSet;
class="kw">import it.unimi.dsi.fastutil.ints.IntSet;
class="kw">import it.unimi.dsi.fastutil.ints.IntSets;
class="kw">import java.util.Map;
class="kw">import java.util.Objects;
class="kw">import java.util.regex.Pattern;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;
class="kw">import org.joml.Vector3i;
class="kw">public class BlockFilter {
class="kw">public class="kw">static class="kw">final BlockFilter[] EMPTY_ARRAY = new BlockFilter[0];
class="kw">public class="kw">static class="kw">final Codec<BlockFilter> CODEC = new FunctionCodec<>(Codec.STRING, BlockFilter::parse, BlockFilter::toString);
class="kw">public class="kw">static class="kw">final String BLOCK_SEPARATOR = "|";
class="kw">public class="kw">static class="kw">final Pattern BLOCK_SEPARATOR_PATTERN = Pattern.compile(Pattern.quote("|"));
@Nonnull
class="kw">private class="kw">final BlockFilter.FilterType blockFilterType;
@Nonnull
class="kw">private class="kw">final String[] blocks;
class="kw">private class="kw">final boolean inverted;
@Nonnull
class="kw">private class="kw">final class="kw">transient String toString0;
class="kw">private IntSet resolvedBlocks;
class="kw">private IntSet resolvedFluids;
class="kw">private boolean hasInvalidBlocks;
class="kw">public BlockFilter(@Nonnull BlockFilter.FilterType var1, @Nonnull String[] var2, boolean var3) {
Objects.requireNonNull(var1);
Objects.requireNonNull(var2);
this.blockFilterType = var1;
this.blocks = var2;
this.inverted = var3;
this.toString0 = this.toString0();
}
class="kw">public void resolve() {
if (this.resolvedBlocks == null) {
BlockFilter.BlocksAndFluids var1 = parseBlocksAndFluids(this.blocks);
this.resolvedBlocks = var1.blocks();
this.resolvedFluids = var1.fluids();
this.hasInvalidBlocks = var1.hasInvalidBlocks();
}
}
class="kw">public boolean hasInvalidBlocks() {
this.resolve();
class="kw">return this.hasInvalidBlocks;
}
@Nonnull
class="kw">public BlockFilter.FilterType getBlockFilterType() {
class="kw">return this.blockFilterType;
}
@Nonnull
class="kw">public String[] getBlocks() {
class="kw">return this.blocks;
}
class="kw">public boolean isInverted() {
class="kw">return this.inverted;
}
@Nullable
class="kw">public IntSet getResolvedBlocks() {
class="kw">return this.resolvedBlocks;
}
@Nullable
class="kw">public IntSet getResolvedFluids() {
class="kw">return this.resolvedFluids;
}
class="kw">public boolean isExcluded(@Nonnull ChunkAccessor var1, int var2, int var3, int var4, @Nullable Vector3i var5, @Nullable Vector3i var6, int var7) {
class="kw">return this.isExcluded(var1, var2, var3, var4, var5, var6, var7, -1);
}
class="kw">public boolean isExcluded(@Nonnull ChunkAccessor var1, int var2, int var3, int var4, @Nullable Vector3i var5, @Nullable Vector3i var6, int var7, int var8) {
boolean var9 = !this.isIncluded(var1, var2, var3, var4, var5, var6, var7, var8);
class="kw">return this.inverted != var9;
}
class="kw">private boolean isIncluded(@Nonnull ChunkAccessor var1, int var2, int var3, int var4, @Nullable Vector3i var5, @Nullable Vector3i var6, int var7) {
class="kw">return this.isIncluded(var1, var2, var3, var4, var5, var6, var7, -1);
}
class="kw">private boolean isIncluded(@Nonnull ChunkAccessor var1, int var2, int var3, int var4, @Nullable Vector3i var5, @Nullable Vector3i var6, int var7, int var8) {
class="kw">switch (this.blockFilterType) {
case TargetBlock:
this.resolve();
boolean var9 = this.resolvedBlocks.contains(var7);
boolean var10 = var8 >= 0 && this.resolvedFluids != null && this.resolvedFluids.contains(var8);
class="kw">return var9 || var10;
case AboveBlock:
class="kw">return this.matchesAt(var1, var2, var3 - 1, var4);
case BelowBlock:
class="kw">return this.matchesAt(var1, var2, var3 + 1, var4);
case AdjacentBlock:
class="kw">return this.matchesAt(var1, var2 - 1, var3, var4)
|| this.matchesAt(var1, var2 + 1, var3, var4)
|| this.matchesAt(var1, var2, var3, var4 - 1)
|| this.matchesAt(var1, var2, var3, var4 + 1);
case NeighborBlock:
for (int var11 = -1; var11 < 2; var11++) {
for (int var12 = -1; var12 < 2; var12++) {
for (int var13 = -1; var13 < 2; var13++) {
if ((var11 != 0 || var12 != 0 || var13 != 0) && this.matchesAt(var1, var2 + var11, var3 + var12, var4 + var13)) {
class="kw">return true;
}
}
}
}
class="kw">return false;
case NorthBlock:
class="kw">return this.matchesAt(var1, var2, var3, var4 - 1);
case EastBlock:
class="kw">return this.matchesAt(var1, var2, var3, var4 + 1);
case SouthBlock:
class="kw">return this.matchesAt(var1, var2, var3, var4 + 1);
case WestBlock:
class="kw">return this.matchesAt(var1, var2, var3, var4 - 1);
case DiagonalXy:
class="kw">return this.matchesAt(var1, var2 - 1, var3 + 1, var4)
|| this.matchesAt(var1, var2 - 1, var3 - 1, var4)
|| this.matchesAt(var1, var2 + 1, var3 + 1, var4)
|| this.matchesAt(var1, var2 + 1, var3 - 1, var4);
case DiagonalXz:
class="kw">return this.matchesAt(var1, var2 - 1, var3, var4 + 1)
|| this.matchesAt(var1, var2 - 1, var3, var4 - 1)
|| this.matchesAt(var1, var2 + 1, var3, var4 + 1)
|| this.matchesAt(var1, var2 + 1, var3, var4 - 1);
case DiagonalZy:
class="kw">return this.matchesAt(var1, var2, var3 - 1, var4 + 1)
|| this.matchesAt(var1, var2, var3 - 1, var4 - 1)
|| this.matchesAt(var1, var2, var3 + 1, var4 + 1)
|| this.matchesAt(var1, var2, var3 + 1, var4 - 1);
case Selection:
if (var5 != null && var6 != null) {
class="kw">return var2 >= var5.x && var3 >= var5.y && var4 >= var5.z && var2 <= var6.x && var3 <= var6.y && var4 <= var6.z;
}
class="kw">return false;
class="kw">default:
throw new IllegalArgumentException("Unknown filter type: " + this.blockFilterType);
}
}
class="kw">private boolean matchesAt(@Nonnull ChunkAccessor var1, int var2, int var3, int var4) {
this.resolve();
class="kw">return this.resolvedBlocks.contains(var1.getBlock(var2, var3, var4))
? true
: this.resolvedFluids != null && this.resolvedFluids.contains(var1.getFluidId(var2, var3, var4));
}
@Nonnull
@Override
class="kw">public String toString() {
class="kw">return this.toString0;
}
@Nonnull
class="kw">public String toString0() {
class="kw">return (this.inverted ? "!" : "") + this.blockFilterType.getPrefix() + String.join("|", this.blocks);
}
@Nonnull
class="kw">public String informativeToString() {
StringBuilder var1 = new StringBuilder();
String var2 = (this.inverted ? "!" : "") + this.blockFilterType.getPrefix();
if (this.blocks.length > 1) {
var1.append("(");
}
for (int var3 = 0; var3 < this.blocks.length; var3++) {
var1.append(var2).append(this.blocks[var3]);
if (var3 != this.blocks.length - 1) {
var1.append(" OR ");
}
}
if (this.blocks.length > 1) {
var1.append(")");
}
class="kw">return var1.toString();
}
@Nonnull
class="kw">public class="kw">static BlockFilter parse(@Nonnull String var0) {
BlockFilter.ParsedFilterParts var1 = parseComponents(var0);
String[] var2 = var1.type.hasBlocks() ? BLOCK_SEPARATOR_PATTERN.split(var1.blocks) : ArrayUtil.EMPTY_STRING_ARRAY;
class="kw">return new BlockFilter(var1.type, var2, var1.inverted);
}
@Nonnull
class="kw">public class="kw">static BlockFilter.ParsedFilterParts parseComponents(@Nonnull String var0) {
boolean var1 = var0.startsWith("!");
int var2 = var1 ? 1 : 0;
BlockFilter.FilterType var3 = BlockFilter.FilterType.parse(var0, var2);
var2 += var3.getPrefix().length();
String var4 = var0.substring(var2);
class="kw">return new BlockFilter.ParsedFilterParts(var3, var1, var4);
}
@Nonnull
class="kw">public class="kw">static IntSet parseBlocks(@Nonnull String[] var0) {
class="kw">return parseBlocksAndFluids(var0).blocks();
}
@Nonnull
class="kw">public class="kw">static BlockFilter.BlocksAndFluids parseBlocksAndFluids(@Nonnull String[] var0) {
IntSet var1 = new IntOpenHashSet();
IntSet var2 = new IntOpenHashSet();
boolean var3 = false;
for (String var7 : var0) {
Item var8 = Item.getAssetMap().getAsset(var7);
if (var8 != null) {
int var9 = getFluidIdFromItem(var8);
if (var9 >= 0) {
var2.add(var9);
class="kw">continue;
}
}
int var17 = Fluid.getAssetMap().getIndex(var7);
if (var17 >= 0) {
if (var17 == 0) {
var1.add(0);
} else {
var2.add(var17);
}
} else {
int var10 = BlockPattern.parseBlock(var7);
if (var10 == 0 && !var7.equalsIgnoreCase("Empty")) {
var3 = true;
}
BlockType var11 = BlockType.getAssetMap().getAsset(var10);
if (var11 != null && var11.getBlockListAssetId() != null) {
BlockTypeListAsset var12 = BlockTypeListAsset.getAssetMap().getAsset(var11.getBlockListAssetId());
if (var12 != null) {
for (String var14 : var12.getBlockTypeKeys()) {
Item var15 = Item.getAssetMap().getAsset(var14);
if (var15 != null) {
int var16 = getFluidIdFromItem(var15);
if (var16 >= 0) {
var2.add(var16);
class="kw">continue;
}
}
int var18 = BlockPattern.parseBlock(var14);
if (BlockPattern.canParseBlock(var14)) {
var1.add(var18);
}
}
class="kw">continue;
}
}
var1.add(var10);
}
}
class="kw">return new BlockFilter.BlocksAndFluids(IntSets.unmodifiable(var1), var2.isEmpty() ? null : IntSets.unmodifiable(var2), var3);
}
class="kw">private class="kw">static int getFluidIdFromItem(@Nonnull Item var0) {
Map var1 = var0.getInteractions();
String var2 = var1.get(InteractionType.Secondary);
if (var2 == null) {
class="kw">return -1;
}
RootInteraction var3 = RootInteraction.getAssetMap().getAsset(var2);
if (var3 == null) {
class="kw">return -1;
}
for (String var7 : var3.getInteractionIds()) {
Interaction var8 = Interaction.getAssetMap().getAsset(var7);
if (var8 class="kw">instanceof PlaceFluidInteraction var9) {
String var10 = var9.getFluidKey();
if (var10 != null) {
int var11 = Fluid.getAssetMap().getIndex(var10);
if (var11 >= 0) {
class="kw">return var11;
}
}
}
}
class="kw">return -1;
}
class="kw">public record BlocksAndFluids(@Nonnull IntSet blocks, @Nullable IntSet fluids, boolean hasInvalidBlocks) {
class="kw">public BlocksAndFluids {
}
}
class="kw">public enum FilterType {
TargetBlock(""),
AboveBlock(">"),
BelowBlock("<"),
AdjacentBlock("~"),
NeighborBlock("^"),
NorthBlock("+n"),
EastBlock("+e"),
SouthBlock("+s"),
WestBlock("+w"),
DiagonalXy("%xy"),
DiagonalXz("%xz"),
DiagonalZy("%zy"),
Selection("#", false);
class="kw">public class="kw">static class="kw">final String INVERT_PREFIX = "!";
class="kw">public class="kw">static class="kw">final String TARGET_BLOCK_PREFIX = "";
class="kw">public class="kw">static class="kw">final String ABOVE_BLOCK_PREFIX = ">";
class="kw">public class="kw">static class="kw">final String BELOW_BLOCK_PREFIX = "<";
class="kw">public class="kw">static class="kw">final String ADJACENT_BLOCK_PREFIX = "~";
class="kw">public class="kw">static class="kw">final String NEIGHBOR_BLOCK_PREFIX = "^";
class="kw">public class="kw">static class="kw">final String SELECTION_PREFIX = "#";
class="kw">public class="kw">static class="kw">final String CARDINAL_NORTH_PREFIX = "+n";
class="kw">public class="kw">static class="kw">final String CARDINAL_EAST_PREFIX = "+e";
class="kw">public class="kw">static class="kw">final String CARDINAL_SOUTH_PREFIX = "+s";
class="kw">public class="kw">static class="kw">final String CARDINAL_WEST_PREFIX = "+w";
class="kw">public class="kw">static class="kw">final String DIAGONAL_XY_PREFIX = "%xy";
class="kw">public class="kw">static class="kw">final String DIAGONAL_XZ_PREFIX = "%xz";
class="kw">public class="kw">static class="kw">final String DIAGONAL_ZY_PREFIX = "%zy";
@Nonnull
class="kw">private class="kw">static class="kw">final BlockFilter.FilterType[] VALUES_TO_PARSE;
class="kw">private class="kw">final String prefix;
class="kw">private class="kw">final boolean hasBlocks;
FilterType(String nullxx) {
this.prefix = nullxx;
this.hasBlocks = true;
}
FilterType(String nullxx, boolean nullxxx) {
this.prefix = nullxx;
this.hasBlocks = nullxxx;
}
class="kw">public boolean hasBlocks() {
class="kw">return this.hasBlocks;
}
class="kw">public String getPrefix() {
class="kw">return this.prefix;
}
@Nonnull
class="kw">public class="kw">static BlockFilter.FilterType parse(@Nonnull String var0, int var1) {
for (BlockFilter.FilterType var5 : VALUES_TO_PARSE) {
if (var0.startsWith(var5.prefix, var1)) {
class="kw">return var5;
}
}
class="kw">return TargetBlock;
}
class="kw">static {
BlockFilter.FilterType[] var0 = values();
BlockFilter.FilterType[] var1 = new BlockFilter.FilterType[var0.length - 1];
int var2 = 0;
for (BlockFilter.FilterType var6 : var0) {
if (var6 != TargetBlock) {
var1[var2++] = var6;
}
}
VALUES_TO_PARSE = var1;
}
}
class="kw">public record ParsedFilterParts(BlockFilter.FilterType type, boolean inverted, String blocks) {
class="kw">public ParsedFilterParts {
}
}
}