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 {
      }
   }
}