PrefabFarmingStageData class

Пакет: com.hypixel.hytale.builtin.adventure.farming.config.stages

Файл: com/hypixel/hytale/builtin/adventure/farming/config/stages/PrefabFarmingStageData.java

extends: FarmingStageData

Поля (87)

МодификаторыТипИмя
public static final Codec<PrefabFarmingStageData.PrefabStage> CODEC
public static final PrefabFarmingStageData.PrefabStage[] EMPTY_ARRAY
protected String path
return
return
return
return
return
double var1
Path var1
int var10
int var10
boolean var10
int var10
double var11
int var11
RotationTuple var11
FarmingBlock var11
int var12
ChunkSection var12
IPrefabBuffer var12
BlockType var13
int var13
BlockSection var13
BlockSection var14
int var14
boolean var14
RotationTuple var14
int var15
int var15
boolean var15
double var15
int var16
IPrefabBuffer var16
int var17
int var17
int var17
World var17
int var18
int var18
int var18
int var19
BlockSection var19
int var19
World var20
int var20
int var20
int var20
CachedAccessor var21
int var21
BlockSection var21
FastRandom var22
BlockSection var22
BlockType var22
PrefabRotation var23
int var23
int var23
BlockTypeAssetMap var24
int var24
Ref var24
int var25
BlockComponentSection var25
IPrefabBuffer var26
int var26
double var27
BlockSection var27
int var28
int var29
double var3
BlockTypeAssetMap var3
BlockType var3
Ref var30
Ref var31
BlockComponentSection var32
BlockType var33
BlockType var4
double var5
double var7
ChunkSection var7
FarmingBlock var8
int var8
int var8
double var9
BlockSection var9
int var9
int var9
protected int weight

Методы (48)

МодификаторыВозвратСигнатура
abstract throw new IllegalStateExceptionthrow new IllegalStateException("Invalid prefab path: " + this.path)
public PrefabStagepublic PrefabStage()
private boolean canReplaceboolean canReplace(int var1, @Nonnull BlockTypeAssetMap<String, BlockType> var2)
static double computeParticlesRatedouble computeParticlesRate(@Nonnull IPrefabBuffer var0)
private boolean doesBlockObstructboolean doesBlockObstruct(int var1, int var2)
for for(int var7 : this.replaceMaskTagIndices)
for for(int var1 = 0; var1 < this.replaceMaskTags.length; var1++)
public IWeightedMap<PrefabFarmingStageData.PrefabStage> getPrefabStagesIWeightedMap<PrefabFarmingStageData.PrefabStage> getPrefabStages()
public Path getResolvedPathpublic Path getResolvedPath()
public double getWeightpublic double getWeight()
if if(var14 == null)
if if(var15 != var7)
if if(var10 < 1.0F)
if if(var8 == null)
if if(var12 == null)
if if(var7 instanceof PrefabFarmingStageData var25)
if if(var14)
if if(var8x == 0 || var8x == Integer.MIN_VALUE)
if if(var22 == null)
if if(var15)
if if(var27 == null)
if if(var13x != 0 && var13x != Integer.MIN_VALUE)
if if(var33 == null)
if if(var17x != 0)
if if(var31 == null)
if if(var14x != null)
if if(var32 == null)
if if(var30 == null)
if if(var9x == 0 || var9x == Integer.MIN_VALUE)
if if(var19 == null)
if if(var10)
if if(var21 != null)
if if(var10x != 0 && var10x != Integer.MIN_VALUE)
if if(var22 == null)
if if(var14x != 0)
if if(var24 == null)
if if(var11x != null)
if if(var25 == null)
if if(var7 == null)
if if(var11 == null)
if if(var13 == null)
if if(this.belowToleranceMaxY >= this.aboveToleranceMinY)
if if(var1 == null)
private boolean isObstructionToleratedboolean isObstructionTolerated(int var1)
static boolean isPrefabBlockIntactboolean isPrefabBlockIntact(@Nonnull CachedAccessor var0, int var1, int var2, int var3, int var4, int var5, int var6, int var7, int var8, @Nonnull PrefabRotation var9)
private boolean isPrefabIntactboolean isPrefabIntact(@Nonnull IPrefabBuffer var1, @Nonnull CachedAccessor var2, int var3, int var4, int var5, @Nonnull PrefabRotation var6, @Nonnull FastRandom var7)
private void processConfigvoid processConfig()
public String toStringpublic String toString()

Исходный код

Показать/скрыть
class="kw">package com.hypixel.hytale.builtin.adventure.farming.config.stages;

class="kw">import com.hypixel.hytale.assetstore.AssetRegistry;
class="kw">import com.hypixel.hytale.assetstore.map.BlockTypeAssetMap;
class="kw">import com.hypixel.hytale.builtin.adventure.farming.states.FarmingBlock;
class="kw">import com.hypixel.hytale.codec.Codec;
class="kw">import com.hypixel.hytale.codec.KeyedCodec;
class="kw">import com.hypixel.hytale.codec.builder.BuilderCodec;
class="kw">import com.hypixel.hytale.codec.codecs.array.ArrayCodec;
class="kw">import com.hypixel.hytale.codec.validation.Validators;
class="kw">import com.hypixel.hytale.common.map.IWeightedElement;
class="kw">import com.hypixel.hytale.common.map.IWeightedMap;
class="kw">import com.hypixel.hytale.component.ComponentAccessor;
class="kw">import com.hypixel.hytale.component.Ref;
class="kw">import com.hypixel.hytale.logger.HytaleLogger;
class="kw">import com.hypixel.hytale.math.util.ChunkUtil;
class="kw">import com.hypixel.hytale.math.util.FastRandom;
class="kw">import com.hypixel.hytale.math.util.HashUtil;
class="kw">import com.hypixel.hytale.math.util.MathUtil;
class="kw">import com.hypixel.hytale.protocol.BlockMaterial;
class="kw">import com.hypixel.hytale.server.core.asset.type.blocktype.config.BlockType;
class="kw">import com.hypixel.hytale.server.core.asset.type.blocktype.config.Rotation;
class="kw">import com.hypixel.hytale.server.core.asset.type.blocktype.config.RotationTuple;
class="kw">import com.hypixel.hytale.server.core.asset.type.blocktype.config.farming.FarmingStageData;
class="kw">import com.hypixel.hytale.server.core.codec.WeightedMapCodec;
class="kw">import com.hypixel.hytale.server.core.modules.block.BlockEntity;
class="kw">import com.hypixel.hytale.server.core.prefab.PrefabRotation;
class="kw">import com.hypixel.hytale.server.core.prefab.PrefabStore;
class="kw">import com.hypixel.hytale.server.core.prefab.selection.buffer.PrefabBufferCall;
class="kw">import com.hypixel.hytale.server.core.prefab.selection.buffer.PrefabBufferUtil;
class="kw">import com.hypixel.hytale.server.core.prefab.selection.buffer.impl.IPrefabBuffer;
class="kw">import com.hypixel.hytale.server.core.universe.world.World;
class="kw">import com.hypixel.hytale.server.core.universe.world.chunk.AbstractCachedAccessor;
class="kw">import com.hypixel.hytale.server.core.universe.world.chunk.BlockOperations;
class="kw">import com.hypixel.hytale.server.core.universe.world.chunk.CachedAccessor;
class="kw">import com.hypixel.hytale.server.core.universe.world.chunk.section.BlockComponentSection;
class="kw">import com.hypixel.hytale.server.core.universe.world.chunk.section.BlockSection;
class="kw">import com.hypixel.hytale.server.core.universe.world.chunk.section.ChunkSection;
class="kw">import com.hypixel.hytale.server.core.universe.world.storage.ChunkStore;
class="kw">import com.hypixel.hytale.server.core.util.PrefabUtil;
class="kw">import java.nio.file.Path;
class="kw">import java.util.Arrays;
class="kw">import java.util.concurrent.TimeUnit;
class="kw">import java.util.logging.Level;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;
class="kw">import org.joml.Vector3i;

class="kw">public class PrefabFarmingStageData class="kw">extends FarmingStageData {
   @Nonnull
   class="kw">private class="kw">static class="kw">final HytaleLogger LOGGER = HytaleLogger.forEnclosingClass();
   class="kw">public class="kw">static class="kw">final float MIN_VOLUME_PREFAB = 125.0F;
   class="kw">public class="kw">static class="kw">final float MAX_VOLUME_PREFAB = 1000.0F;
   class="kw">public class="kw">static class="kw">final float MIN_BROKEN_PARTICLE_RATE = 0.25F;
   class="kw">public class="kw">static class="kw">final float MAX_BROKEN_PARTICLE_RATE = 0.75F;
   @Nonnull
   class="kw">private class="kw">static class="kw">final String[] EMPTY_REPLACE_MASK = new String[0];
   @Nonnull
   class="kw">public class="kw">static class="kw">final BuilderCodec<PrefabFarmingStageData> CODEC = BuilderCodec.builder(
         PrefabFarmingStageData.class, PrefabFarmingStageData::new, FarmingStageData.BASE_CODEC
      )
      .append(
         new KeyedCodec<>("Prefabs", new WeightedMapCodec<>(PrefabFarmingStageData.PrefabStage.CODEC, PrefabFarmingStageData.PrefabStage.EMPTY_ARRAY)),
         (var0, var1) -> var0.prefabStages = var1,
         var0 -> var0.prefabStages
      )
      .add()
      .append(
         new KeyedCodec<>("ReplaceMaskTags", new ArrayCodec<>(Codec.STRING, String[]::new)),
         (var0, var1) -> var0.replaceMaskTags = var1,
         var0 -> var0.replaceMaskTags
      )
      .add()
      .append(
         new KeyedCodec<>("TolerateObstructionsBelowY", Codec.INTEGER),
         (var0, var1) -> var0.tolerateObstructionsBelowY = var1,
         var0 -> var0.tolerateObstructionsBelowY
      )
      .add()
      .append(
         new KeyedCodec<>("TolerateObstructionsAboveY", Codec.INTEGER),
         (var0, var1) -> var0.tolerateObstructionsAboveY = var1,
         var0 -> var0.tolerateObstructionsAboveY
      )
      .add()
      .afterDecode(PrefabFarmingStageData::processConfig)
      .build();
   class="kw">private class="kw">static class="kw">final AbstractCachedAccessor.Registry REGISTRY = new AbstractCachedAccessor.Registry();
   class="kw">private class="kw">static class="kw">final AbstractCachedAccessor.Key<BlockSection> BLOCK_SECTION = REGISTRY.forSection(BlockSection::getComponentType);
   class="kw">private class="kw">static class="kw">final AbstractCachedAccessor.Key<BlockComponentSection> BLOCK_COMPONENT_SECTION = REGISTRY.forSection(BlockComponentSection::getComponentType);
   class="kw">private class="kw">static class="kw">final AbstractCachedAccessor.InitFunction ACCESSOR = REGISTRY.threadLocal();
   class="kw">protected IWeightedMap<PrefabFarmingStageData.PrefabStage> prefabStages;
   class="kw">private String[] replaceMaskTags = EMPTY_REPLACE_MASK;
   class="kw">private int[] replaceMaskTagIndices;
   @Nullable
   class="kw">private Integer tolerateObstructionsBelowY;
   @Nullable
   class="kw">private Integer tolerateObstructionsAboveY;
   class="kw">private int belowToleranceMaxY = Integer.MIN_VALUE;
   class="kw">private int aboveToleranceMinY = Integer.MAX_VALUE;

   class="kw">public PrefabFarmingStageData() {
   }

   class="kw">private class="kw">static double computeParticlesRate(@Nonnull IPrefabBuffer var0) {
      double var1 = var0.getMaxX() - var0.getMinX();
      double var3 = var0.getMaxY() - var0.getMinY();
      double var5 = var0.getMaxZ() - var0.getMinZ();
      double var7 = var1 * var3 * var5;
      double var9 = -5.7142857E-4F;
      double var11 = (var7 - 125.0) * -5.7142857E-4F;
      class="kw">return MathUtil.clamp(var11 + 0.75, 0.25, 0.75);
   }

   class="kw">private class="kw">static boolean isPrefabBlockIntact(
      @Nonnull CachedAccessor var0, int var1, int var2, int var3, int var4, int var5, int var6, int var7, int var8, @Nonnull PrefabRotation var9
   ) {
      int var10 = var9.getX(var4, var6) + var1;
      int var11 = var5 + var2;
      int var12 = var9.getZ(var4, var6) + var3;
      BlockType var13 = BlockType.getAssetMap().getAsset(var7);
      if (var13 != null && var13.getMaterial() != BlockMaterial.Empty) {
         BlockSection var14 = var0.getComponentSectionAtBlock(var10, var11, var12, BLOCK_SECTION);
         if (var14 == null) {
            class="kw">return false;
         }

         int var15 = var14.get(var10, var11, var12);
         if (var15 != var7) {
            class="kw">return false;
         }

         int var16 = var9.getRotation(var8);
         int var17 = var14.getRotationIndex(var10, var11, var12);
         class="kw">return var17 == var16;
      } else {
         class="kw">return true;
      }
   }

   class="kw">private boolean isPrefabIntact(
      @Nonnull IPrefabBuffer var1, @Nonnull CachedAccessor var2, int var3, int var4, int var5, @Nonnull PrefabRotation var6, @Nonnull FastRandom var7
   ) {
      class="kw">return var1.forEachRaw(IPrefabBuffer.iterateAllColumns(), (var6x, var7x, var8, var9, var10, var11, var12, var13, var14, var15) -> {
         if (var10 < 1.0F) {
            class="kw">return true;
         } else if (var14 != 0) {
            class="kw">return true;
         } else {
            class="kw">return this.isObstructionTolerated(var7x) ? true : isPrefabBlockIntact(var2, var3, var4, var5, var6x, var7x, var8, var9, var13, var6);
         }
      }, (var0, var1x, var2x, var3x, var4x, var5x) -> true, null, new PrefabBufferCall(var7, var6));
   }

   class="kw">private boolean isObstructionTolerated(int var1) {
      class="kw">return var1 <= this.belowToleranceMaxY || var1 >= this.aboveToleranceMinY;
   }

   @Override
   class="kw">public boolean consumesRemainingTime() {
      class="kw">return true;
   }

   class="kw">public IWeightedMap<PrefabFarmingStageData.PrefabStage> getPrefabStages() {
      class="kw">return this.prefabStages;
   }

   @Override
   class="kw">public void apply(
      @Nonnull ComponentAccessor<ChunkStore> var1,
      @Nonnull Ref<ChunkStore> var2,
      @Nonnull Ref<ChunkStore> var3,
      int var4,
      int var5,
      int var6,
      @Nullable FarmingStageData var7
   ) {
      FarmingBlock var8 = var1.getComponent(var3, FarmingBlock.getComponentType());
      if (var8 == null) {
         ((HytaleLogger.Api)LOGGER.at(Level.WARNING).atMostEvery(1, TimeUnit.MINUTES))
            .log("Missing farming block component when applying prefab farming stage at (%d, %d, %d)", var4, var5, var6);
      } else {
         BlockSection var9 = var1.getComponent(var2, BlockSection.getComponentType());
         int var10 = HashUtil.randomInt(var4, var5, var6, Rotation.VALUES.length);
         RotationTuple var11 = RotationTuple.of(Rotation.VALUES[var10], Rotation.None);
         ChunkSection var12 = var1.getComponent(var2, ChunkSection.getComponentType());
         if (var12 == null) {
            ((HytaleLogger.Api)LOGGER.at(Level.WARNING).atMostEvery(1, TimeUnit.MINUTES))
               .log("Missing chunk section component when applying prefab farming stage at (%d, %d, %d)", var4, var5, var6);
         } else {
            int var13 = ChunkUtil.worldCoordFromLocalCoord(var12.getX(), var4);
            int var14 = ChunkUtil.worldCoordFromLocalCoord(var12.getY(), var5);
            int var15 = ChunkUtil.worldCoordFromLocalCoord(var12.getZ(), var6);
            IPrefabBuffer var16 = this.getCachedPrefab(var13, var14, var15, var8.getGeneration());
            if (var8.getPreviousBlockType() == null) {
               var8.setPreviousBlockType(BlockType.getAssetMap().getAsset(var9.get(var4, var5, var6)).getId());
            }

            int var17 = var16.getMaxX() - var16.getMinX();
            int var18 = var16.getMaxY() - var16.getMinY();
            int var19 = var16.getMaxZ() - var16.getMinZ();
            World var20 = var1.getExternalData().getWorld();
            CachedAccessor var21 = ACCESSOR.getAtBlock(var1, var13, var14, var15, var17, var18, var19);
            FastRandom var22 = new FastRandom();
            PrefabRotation var23 = PrefabRotation.fromRotation(var11.yaw());
            BlockTypeAssetMap var24 = BlockType.getAssetMap();
            if (var7 class="kw">instanceof PrefabFarmingStageData var25) {
               IPrefabBuffer var26 = var25.getCachedPrefab(var13, var14, var15, var8.getGeneration() - 1);
               double var27 = computeParticlesRate(var16);
               var20.execute(
                  () -> {
                     boolean var14 = var25.isPrefabIntact(var26, var21, var13, var14, var15, var23, var22);
                     if (var14) {
                        boolean var15 = var16.compare(
                           (var5x, var6x, var7x, var8x, var9x, var10x, var11x, var12x, var13x, var14x, var15x, var16x, var17x, var18x) -> {
                              int var19 = var13 + var5x;
                              int var20 = var14 + var6x;
                              int var21 = var15 + var7x;
                              if (var8x == 0 || var8x == Integer.MIN_VALUE) {
                                 class="kw">return true;
                              }

                              if (this.isObstructionTolerated(var6x)) {
                                 class="kw">return true;
                              }

                              BlockSection var22 = var21.getComponentSectionAtBlock(var19, var20, var21, BLOCK_SECTION);
                              if (var22 == null) {
                                 class="kw">return false;
                              }

                              int var23 = var22.get(var19, var20, var21);
                              class="kw">return var23 == var13x ? true : !this.doesBlockObstruct(var8x, var23);
                           }, new PrefabBufferCall(var22, var23), var26
                        );
                        if (var15) {
                           var16.compare(
                              (var10x, var11x, var12x, var13x, var14x, var15x, var16x, var17x, var18x, var19x, var20x, var21x, var22x, var23x) -> {
                                 int var24 = var13 + var10x;
                                 int var25 = var14 + var11x;
                                 int var26 = var15 + var12x;
                                 BlockSection var27 = var21.getComponentSectionAtBlock(var24, var25, var26, BLOCK_SECTION);
                                 if (var27 == null) {
                                    class="kw">return true;
                                 }

                                 int var28 = 2;
                                 if (var22.nextDouble() > var27) {
                                    var28 |= 4;
                                 }

                                 int var29 = var27.get(var24, var25, var26);
                                 if (var13x != 0 && var13x != Integer.MIN_VALUE) {
                                    BlockType var33 = var24.getAsset(var13x);
                                    if (var33 == null) {
                                       ((HytaleLogger.Api)LOGGER.at(Level.WARNING).atMostEvery(1, TimeUnit.MINUTES))
                                          .log(
                                             "Invalid block ID %d in prefab at (%d, %d, %d) for farming stage at (%d, %d, %d)",
                                             var13x,
                                             var10x,
                                             var11x,
                                             var12x,
                                             var13,
                                             var14,
                                             var15
                                          );
                                       class="kw">return true;
                                    }

                                    if (var17x != 0) {
                                       class="kw">return true;
                                    }

                                    if ((var18x == 0 || var18x == Integer.MIN_VALUE) && !this.canReplace(var29, var24)) {
                                       class="kw">return true;
                                    }

                                    if (var18x != 0 && var18x != Integer.MIN_VALUE && var18x != var29 && !this.canReplace(var29, var24)) {
                                       class="kw">return true;
                                    }

                                    Ref var31 = var21.getSectionAtBlock(var24, var25, var26);
                                    if (var31 == null) {
                                       class="kw">return true;
                                    }

                                    BlockOperations.setBlock(var1.getExternalData(), var31, var24, var25, var26, var13x, var33, var16x, var17x, var28);
                                    if (var14x != null) {
                                       BlockComponentSection var32 = var21.getComponentSectionAtBlock(var24, var25, var26, BLOCK_COMPONENT_SECTION);
                                       if (var32 == null) {
                                          class="kw">return true;
                                       }

                                       BlockEntity.setBlockEntity(var1, var31, var32, var24, var25, var26, var33, var16x, var14x.clone());
                                    }
                                 } else if (var18x != 0 && var18x != Integer.MIN_VALUE && var29 == var18x) {
                                    Ref var30 = var21.getSectionAtBlock(var24, var25, var26);
                                    if (var30 == null) {
                                       class="kw">return true;
                                    }

                                    BlockOperations.setBlock(var1.getExternalData(), var30, var24, var25, var26, 0, BlockType.EMPTY, 0, 0, var28);
                                 }

                                 class="kw">return true;
                              },
                              new PrefabBufferCall(var22, var23),
                              var26
                           );
                        }
                     }
                  }
               );
            } else {
               super.apply(var1, var2, var3, var4, var5, var6, var7);
               var20.execute(
                  () -> {
                     boolean var10 = var16.forEachRaw(
                        IPrefabBuffer.iterateAllColumns(), (var6x, var7x, var8x, var9x, var10x, var11x, var12x, var13x, var14x, var15x) -> {
                           int var16 = var13 + var23.getX(var6x, var8x);
                           int var17 = var14 + var7x;
                           int var18 = var15 + var23.getZ(var6x, var8x);
                           if (var9x == 0 || var9x == Integer.MIN_VALUE) {
                              class="kw">return true;
                           }

                           if (this.isObstructionTolerated(var7x)) {
                              class="kw">return true;
                           }

                           BlockSection var19 = var21.getComponentSectionAtBlock(var16, var17, var18, BLOCK_SECTION);
                           if (var19 == null) {
                              class="kw">return false;
                           }

                           int var20 = var19.get(var16, var17, var18);
                           class="kw">return !this.doesBlockObstruct(var9x, var20);
                        }, (var0, var1x, var2x, var3x, var4x, var5x) -> true, null, new PrefabBufferCall(var22, var23)
                     );
                     if (var10) {
                        var16.forEach(
                           IPrefabBuffer.iterateAllColumns(),
                           (var7x, var8x, var9x, var10x, var11x, var12x, var13x, var14x, var15x, var16x, var17x) -> {
                              int var18 = var13 + var7x;
                              int var19 = var14 + var8x;
                              int var20 = var15 + var9x;
                              BlockSection var21 = var21.getComponentSectionAtBlock(var18, var19, var20, BLOCK_SECTION);
                              if (var21 != null) {
                                 if (var10x != 0 && var10x != Integer.MIN_VALUE) {
                                    BlockType var22 = var24.getAsset(var10x);
                                    if (var22 == null) {
                                       ((HytaleLogger.Api)LOGGER.at(Level.WARNING).atMostEvery(1, TimeUnit.MINUTES))
                                          .log(
                                             "Invalid block ID %d in prefab at (%d, %d, %d) for farming stage at (%d, %d, %d)",
                                             var10x,
                                             var7x,
                                             var8x,
                                             var9x,
                                             var13,
                                             var14,
                                             var15
                                          );
                                       class="kw">return;
                                    }

                                    if (var14x != 0) {
                                       class="kw">return;
                                    }

                                    int var23 = var21.get(var18, var19, var20);
                                    if (!this.canReplace(var23, var24)) {
                                       class="kw">return;
                                    }

                                    Ref var24 = var21.getSectionAtBlock(var18, var19, var20);
                                    if (var24 == null) {
                                       class="kw">return;
                                    }

                                    BlockOperations.setBlock(var1.getExternalData(), var24, var18, var19, var20, var10x, var22, var13x, var14x, 2);
                                    if (var11x != null) {
                                       BlockComponentSection var25 = var21.getComponentSectionAtBlock(var18, var19, var20, BLOCK_COMPONENT_SECTION);
                                       if (var25 == null) {
                                          class="kw">return;
                                       }

                                       BlockEntity.setBlockEntity(var1, var24, var25, var18, var19, var20, var22, var13x, var11x.clone());
                                    }
                                 }
                              }
                           },
                           null,
                           null,
                           new PrefabBufferCall(var22, var23)
                        );
                     }
                  }
               );
            }
         }
      }
   }

   class="kw">private boolean doesBlockObstruct(int var1, int var2) {
      BlockTypeAssetMap var3 = BlockType.getAssetMap();
      BlockType var4 = var3.getAsset(var1);
      class="kw">return var4 != null && var4.getMaterial() != BlockMaterial.Empty ? !this.canReplace(var2, var3) : false;
   }

   class="kw">private boolean canReplace(int var1, @Nonnull BlockTypeAssetMap<String, BlockType> var2) {
      BlockType var3 = var2.getAsset(var1);
      if (var3 != null && var3.getMaterial() != BlockMaterial.Empty) {
         for (int var7 : this.replaceMaskTagIndices) {
            if (var2.getIndexesForTag(var7).contains(var1)) {
               class="kw">return true;
            }
         }

         class="kw">return false;
      } else {
         class="kw">return true;
      }
   }

   @Override
   class="kw">public void remove(@Nonnull ComponentAccessor<ChunkStore> var1, @Nonnull Ref<ChunkStore> var2, @Nonnull Ref<ChunkStore> var3, int var4, int var5, int var6) {
      super.remove(var1, var2, var3, var4, var5, var6);
      ChunkSection var7 = var1.getComponent(var2, ChunkSection.getComponentType());
      if (var7 == null) {
         ((HytaleLogger.Api)LOGGER.at(Level.WARNING).atMostEvery(1, TimeUnit.MINUTES))
            .log("Missing chunk section component when removing prefab farming stage at (%d, %d, %d)", var4, var5, var6);
      } else {
         int var8 = ChunkUtil.worldCoordFromLocalCoord(var7.getX(), var4);
         int var9 = ChunkUtil.worldCoordFromLocalCoord(var7.getY(), var5);
         int var10 = ChunkUtil.worldCoordFromLocalCoord(var7.getZ(), var6);
         FarmingBlock var11 = var1.getComponent(var3, FarmingBlock.getComponentType());
         if (var11 == null) {
            ((HytaleLogger.Api)LOGGER.at(Level.WARNING).atMostEvery(1, TimeUnit.MINUTES))
               .log("Missing farming block component when removing prefab farming stage at (%d, %d, %d)", var8, var9, var10);
         } else {
            IPrefabBuffer var12 = this.getCachedPrefab(var8, var9, var10, var11.getGeneration() - 1);
            BlockSection var13 = var1.getComponent(var2, BlockSection.getComponentType());
            if (var13 == null) {
               ((HytaleLogger.Api)LOGGER.at(Level.WARNING).atMostEvery(1, TimeUnit.MINUTES))
                  .log("Missing block section component when removing prefab farming stage at (%d, %d, %d)", var8, var9, var10);
            } else {
               RotationTuple var14 = var13.getRotation(var4, var5, var6);
               double var15 = computeParticlesRate(var12);
               World var17 = var1.getExternalData().getWorld();
               var17.execute(() -> {
                  int var8 = 1;
                  int var9 = 2;
                  PrefabUtil.remove(var12, var17, new Vector3i(var8, var9, var10), var14.yaw(), new FastRandom(), 1, 2, var15);
               });
            }
         }
      }
   }

   @Nonnull
   class="kw">private IPrefabBuffer getCachedPrefab(int var1, int var2, int var3, int var4) {
      class="kw">return PrefabBufferUtil.getCached(this.prefabStages.get(HashUtil.random(var1, var2, var3, var4)).getResolvedPath());
   }

   class="kw">private void processConfig() {
      this.replaceMaskTagIndices = new int[this.replaceMaskTags.length];

      for (int var1 = 0; var1 < this.replaceMaskTags.length; var1++) {
         this.replaceMaskTagIndices[var1] = AssetRegistry.getOrCreateTagIndex(this.replaceMaskTags[var1]);
      }

      this.belowToleranceMaxY = this.tolerateObstructionsBelowY != null ? this.tolerateObstructionsBelowY : Integer.MIN_VALUE;
      this.aboveToleranceMinY = this.tolerateObstructionsAboveY != null ? this.tolerateObstructionsAboveY : Integer.MAX_VALUE;
      if (this.belowToleranceMaxY >= this.aboveToleranceMinY) {
         LOGGER.at(Level.WARNING)
            .log(
               "Overlapping obstruction tolerance on prefab farming stage (TolerateObstructionsBelowY=%d >= TolerateObstructionsAboveY=%d); all obstructions will be tolerated",
               this.belowToleranceMaxY,
               this.aboveToleranceMinY
            );
      }
   }

   @Nonnull
   @Override
   class="kw">public String toString() {
      class="kw">return "PrefabFarmingStageData{replaceMaskTags="
         + Arrays.toString(this.replaceMaskTags)
         + ", tolerateObstructionsBelowY="
         + this.tolerateObstructionsBelowY
         + ", tolerateObstructionsAboveY="
         + this.tolerateObstructionsAboveY
         + ", prefabStages="
         + this.prefabStages
         + "}";
   }

   class="kw">public class="kw">static class PrefabStage class="kw">implements IWeightedElement {
      @Nonnull
      class="kw">public class="kw">static class="kw">final PrefabFarmingStageData.PrefabStage[] EMPTY_ARRAY = new PrefabFarmingStageData.PrefabStage[0];
      @Nonnull
      class="kw">public class="kw">static class="kw">final Codec<PrefabFarmingStageData.PrefabStage> CODEC = BuilderCodec.builder(
            PrefabFarmingStageData.PrefabStage.class, PrefabFarmingStageData.PrefabStage::new
         )
         .append(new KeyedCodec<>("Weight", Codec.INTEGER), (var0, var1) -> var0.weight = var1, var0 -> var0.weight)
         .addValidator(Validators.greaterThanOrEqual(1))
         .add()
         .<String>append(new KeyedCodec<>("Path", Codec.STRING), (var0, var1) -> var0.path = var1, var0 -> var0.path)
         .addValidator(Validators.nonNull())
         .add()
         .build();
      class="kw">protected int weight = 1;
      class="kw">protected String path;

      class="kw">public PrefabStage() {
      }

      @Override
      class="kw">public double getWeight() {
         class="kw">return this.weight;
      }

      @Nonnull
      class="kw">public Path getResolvedPath() {
         Path var1 = PrefabStore.get().findAssetPrefabPath(this.path);
         if (var1 == null) {
            throw new IllegalStateException("Invalid prefab path: " + this.path);
         } else {
            class="kw">return var1;
         }
      }

      @Nonnull
      @Override
      class="kw">public String toString() {
         class="kw">return "PrefabStage{weight=" + this.weight + ", path='" + this.path + "'}";
      }
   }
}