FilterType enum

Пакет: com.hypixel.hytale.server.core.prefab.selection.mask

Файл: com/hypixel/hytale/server/core/prefab/selection/mask/BlockFilter.java

Поля (21)

МодификаторыТипИмя
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
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
private final boolean hasBlocks
private final String prefix
BlockFilter.FilterType[] var0
BlockFilter.FilterType[] var1
int var2

Методы (7)

МодификаторыВозвратСигнатура
abstract Selection Selection("#", false)
for for(BlockFilter.FilterType var5 : VALUES_TO_PARSE)
for for(BlockFilter.FilterType var6 : var0)
public String getPrefixpublic String getPrefix()
public boolean hasBlockspublic boolean hasBlocks()
if if(var6 != TargetBlock)
public static BlockFilter.FilterType parsepublic static BlockFilter.FilterType parse(@Nonnull String var0, int var1)

Исходный код

Показать/скрыть
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 {
      }
   }
}