ReplaceBlockTypeEffect class

Пакет: com.hypixel.hytale.builtin.triggervolumes.effect.builtin

Файл: com/hypixel/hytale/builtin/triggervolumes/effect/builtin/ReplaceBlockTypeEffect.java

extends: TriggerEffect

Поля (80)

МодификаторыТипИмя
SHAPE, AABB
return
BlockFilter.BlocksAndFluids var1
Vector3d var10
int var10
FluidSection var10
Vector3d var11
BlockType var11
Ref var11
double var11
LongOpenHashSet var12
int var12
BlockChunk var12
BlockBoundingBoxes.RotatedVariantBoxes var13
WorldChunk var13
double var13
TriggerVolumeShape var15
double var15
Vector3d var16
Vector3d var17
int var18
int var19
World var2
int var2
IntOpenHashSet var2
int var20
int var21
int var22
Ref var26
BlockChunk var27
BlockSection var28
int var29
ReplaceBlockTypeEffect.TargetType var3
int var3
IntIterator var3
int var3
int var30
boolean var31
WorldChunk var32
boolean var33
boolean var34
int var35
int var36
BlockFilter.BlocksAndFluids var4
IntIterator var4
int var4
Store var4
Vector3d var4
Vector3d var4
IntSet var5
int var5
BlockType var5
Ref var5
Store var5
double var5
IntSet var6
BlockType var6
BlockType var6
ChunkColumn var6
BlockChunk var6
Fluid var6
ChunkColumn var6
ChunkStore var7
BlockType var7
Ref var7
int var7
Store var7
Ref var7
double var7
Store var8
IntIterator var8
FluidSection var8
int var8
ChunkColumn var8
FluidSection var8
Vector3d var9
int var9
int var9
Ref var9
double var9

Методы (42)

МодификаторыВозвратСигнатура
Bounds Bounds()
private record TargetTyperecord TargetType(int blockId, int fluidId)
static void clearFluidvoid clearFluid(@Nonnull ChunkStore var0, @Nonnull Ref<ChunkStore> var1, int var2, int var3, int var4)
abstract clearFluid clearFluid(var0, var1, var5, var6, var7)
static void clearStructureAtvoid clearStructureAt(@Nonnull ChunkStore var0, int var1, int var2, int var3)
private boolean containsBlockboolean containsBlock(@Nonnull TriggerVolumeShape var1, @Nonnull Vector3d var2, @Nonnull Vector3d var3, @Nonnull Vector3d var4, @Nonnull Vector3d var5, int var6, int var7, int var8)
for for(int var23 = var36; var23 <= var20; var23++)
for for(int var24 = var18; var24 <= var21; var24++)
for for(int var25 = var19; var25 <= var22; var25++)
private void getConfiguredAABBvoid getConfiguredAABB(@Nonnull Vector3d var1, @Nonnull Vector3d var2, @Nonnull Vector3d var3)
if if(var3 != null)
if if(this.bounds == ReplaceBlockTypeEffect.Bounds.AABB)
if if(var24 >= 0 && var24 < 320)
if if(var27 != null)
if if(var32 != null)
if if(var2 + var3 != 1)
if if(var2 == 1)
if if(var7 == null)
if if(var6 == null)
if if(var6 == null)
if if(var8 == null)
if if(!var4)
if if(!var4)
if if(var11 != null)
if if(var13 != null)
if if(var13 != null)
if if(var2 >= 0 && var2 < 320)
if if(var6 != null)
if if(var9 >= 0 && var9 < 320)
if if(var12 != null)
if if(var13 != null)
if if(var6 != null)
if if(var8 != null)
if if(var6 != null)
if if(var8 != null)
if if(this.origin == EffectOrigin.VOLUME_ORIGIN)
if if(var3 > 0)
if if(this.rotation != null)
static boolean matchesFluidboolean matchesFluid(@Nonnull Store<ChunkStore> var0, @Nonnull Ref<ChunkStore> var1, @Nonnull IntSet var2, int var3, int var4, int var5)
static void replaceMatchedCellvoid replaceMatchedCell(@Nonnull ChunkStore var0, @Nonnull Ref<ChunkStore> var1, @Nonnull WorldChunk var2, @Nonnull BlockSection var3, boolean var4, int var5, int var6, int var7, @Nonnull ReplaceBlockTypeEffect.TargetType var8, int var9, @Nonnull LongOpenHashSet var10)
abstract replaceMatchedCell replaceMatchedCell(var7, var26, var32, var28, var33, var23, var24, var25, var3, var35, var12)
static void setFluidvoid setFluid(@Nonnull ChunkStore var0, @Nonnull Ref<ChunkStore> var1, int var2, int var3, int var4, int var5)

Исходный код

Показать/скрыть
class="kw">package com.hypixel.hytale.builtin.triggervolumes.effect.builtin;

class="kw">import com.hypixel.hytale.builtin.triggervolumes.YawRotation;
class="kw">import com.hypixel.hytale.builtin.triggervolumes.effect.EffectOrigin;
class="kw">import com.hypixel.hytale.builtin.triggervolumes.effect.TriggerContext;
class="kw">import com.hypixel.hytale.builtin.triggervolumes.effect.TriggerEffect;
class="kw">import com.hypixel.hytale.builtin.triggervolumes.manager.VolumeEntry;
class="kw">import com.hypixel.hytale.builtin.triggervolumes.shape.TriggerVolumeShape;
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.EnumCodec;
class="kw">import com.hypixel.hytale.component.Ref;
class="kw">import com.hypixel.hytale.component.Store;
class="kw">import com.hypixel.hytale.logger.HytaleLogger;
class="kw">import com.hypixel.hytale.math.block.BlockUtil;
class="kw">import com.hypixel.hytale.math.util.ChunkUtil;
class="kw">import com.hypixel.hytale.math.util.MathUtil;
class="kw">import com.hypixel.hytale.math.vector.Vector3dUtil;
class="kw">import com.hypixel.hytale.server.core.asset.type.blockhitbox.BlockBoundingBoxes;
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.fluid.Fluid;
class="kw">import com.hypixel.hytale.server.core.prefab.selection.mask.BlockFilter;
class="kw">import com.hypixel.hytale.server.core.universe.world.World;
class="kw">import com.hypixel.hytale.server.core.universe.world.chunk.BlockChunk;
class="kw">import com.hypixel.hytale.server.core.universe.world.chunk.ChunkColumn;
class="kw">import com.hypixel.hytale.server.core.universe.world.chunk.WorldChunk;
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.FluidSection;
class="kw">import com.hypixel.hytale.server.core.universe.world.storage.ChunkStore;
class="kw">import com.hypixel.hytale.server.core.util.FillerBlockUtil;
class="kw">import it.unimi.dsi.fastutil.ints.IntIterator;
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.longs.LongOpenHashSet;
class="kw">import java.util.logging.Level;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;
class="kw">import org.joml.Vector3d;

class="kw">public class ReplaceBlockTypeEffect class="kw">extends TriggerEffect {
   @Nonnull
   class="kw">private class="kw">static class="kw">final HytaleLogger LOGGER = HytaleLogger.forEnclosingClass();
   class="kw">private class="kw">static class="kw">final String[] STRINGS = new String[0];
   @Nonnull
   class="kw">public class="kw">static class="kw">final BuilderCodec<ReplaceBlockTypeEffect> CODEC = BuilderCodec.builder(ReplaceBlockTypeEffect.class, ReplaceBlockTypeEffect::new, BASE_CODEC)
      .append(
         new KeyedCodec<>("FromBlockTypes", Codec.STRING_ARRAY),
         (var0, var1) -> var0.fromBlockTypes = var1 != null ? var1 : STRINGS,
         var0 -> var0.fromBlockTypes.length == 0 ? null : var0.fromBlockTypes
      )
      .add()
      .append(new KeyedCodec<>("FromBlockState", Codec.STRING, false), (var0, var1) -> var0.fromBlockState = var1, var0 -> var0.fromBlockState)
      .add()
      .append(new KeyedCodec<>("ToBlockType", Codec.STRING), (var0, var1) -> var0.toBlockType = var1, var0 -> var0.toBlockType)
      .add()
      .append(new KeyedCodec<>("ToBlockState", Codec.STRING, false), (var0, var1) -> var0.toBlockState = var1, var0 -> var0.toBlockState)
      .add()
      .append(
         new KeyedCodec<>("Bounds", new EnumCodec<>(ReplaceBlockTypeEffect.Bounds.class), false),
         (var0, var1) -> var0.bounds = var1 != null ? var1 : ReplaceBlockTypeEffect.Bounds.SHAPE,
         var0 -> var0.bounds
      )
      .add()
      .append(new KeyedCodec<>("X", Codec.FLOAT, false), (var0, var1) -> var0.sizeX = var1 != null ? var1 : 0.0F, var0 -> var0.sizeX)
      .add()
      .append(new KeyedCodec<>("Y", Codec.FLOAT, false), (var0, var1) -> var0.sizeY = var1 != null ? var1 : 0.0F, var0 -> var0.sizeY)
      .add()
      .append(new KeyedCodec<>("Z", Codec.FLOAT, false), (var0, var1) -> var0.sizeZ = var1 != null ? var1 : 0.0F, var0 -> var0.sizeZ)
      .add()
      .append(new KeyedCodec<>("Offset", Vector3dUtil.CODEC, false), (var0, var1) -> var0.offset = var1 != null ? var1 : new Vector3d(), var0 -> var0.offset)
      .add()
      .append(
         new KeyedCodec<>("Origin", new EnumCodec<>(EffectOrigin.class), false),
         (var0, var1) -> var0.origin = var1 != null ? var1 : EffectOrigin.VOLUME_ORIGIN,
         var0 -> var0.origin
      )
      .add()
      .append(new KeyedCodec<>("Rotation", new EnumCodec<>(Rotation.class), false), (var0, var1) -> var0.rotation = var1, var0 -> var0.rotation)
      .add()
      .append(new KeyedCodec<>("Pitch", new EnumCodec<>(Rotation.class), false), (var0, var1) -> var0.pitch = var1, var0 -> var0.pitch)
      .add()
      .append(new KeyedCodec<>("Roll", new EnumCodec<>(Rotation.class), false), (var0, var1) -> var0.roll = var1, var0 -> var0.roll)
      .add()
      .build();
   @Nonnull
   class="kw">private String[] fromBlockTypes = STRINGS;
   @Nullable
   class="kw">private String fromBlockState;
   @Nullable
   class="kw">private String toBlockType;
   @Nullable
   class="kw">private String toBlockState;
   @Nonnull
   class="kw">private ReplaceBlockTypeEffect.Bounds bounds = ReplaceBlockTypeEffect.Bounds.SHAPE;
   class="kw">private float sizeX;
   class="kw">private float sizeY;
   class="kw">private float sizeZ;
   @Nonnull
   class="kw">private Vector3d offset = new Vector3d();
   @Nonnull
   class="kw">private EffectOrigin origin = EffectOrigin.VOLUME_ORIGIN;
   @Nonnull
   class="kw">private Rotation rotation = Rotation.None;
   @Nonnull
   class="kw">private Rotation pitch = Rotation.None;
   @Nonnull
   class="kw">private Rotation roll = Rotation.None;

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

   @Override
   class="kw">public void execute(@Nonnull TriggerContext var1) {
      if (this.fromBlockTypes.length != 0 && this.toBlockType != null && !this.toBlockType.isBlank()) {
         World var2 = var1.getStore().getExternalData().getWorld();
         ReplaceBlockTypeEffect.TargetType var3 = this.resolveToTarget();
         if (var3 != null) {
            BlockFilter.BlocksAndFluids var4 = BlockFilter.parseBlocksAndFluids(this.fromBlockTypes);
            IntSet var5 = this.resolveFromBlocks(var4.blocks());
            IntSet var6 = var4.fluids();
            if (!var5.isEmpty() || var6 != null && !var6.isEmpty()) {
               ChunkStore var7 = var2.getChunkStore();
               Store var8 = var7.getStore();
               Vector3d var9 = new Vector3d();
               Vector3d var10 = new Vector3d();
               Vector3d var11 = new Vector3d();
               LongOpenHashSet var12 = new LongOpenHashSet();

               for (VolumeEntry var14 : var1.getSpatialVolumes()) {
                  TriggerVolumeShape var15 = var14.getShape();
                  Vector3d var16 = var14.getPosition();
                  if (this.bounds == ReplaceBlockTypeEffect.Bounds.AABB) {
                     Vector3d var17 = this.origin == EffectOrigin.VOLUME_ORIGIN
                        ? var16
                        : var1.resolveOrigin(this.origin, null, TriggerContext.MissingActor.FALLBACK_TO_VOLUME);
                     this.getConfiguredAABB(var17, var9, var10);
                  } else {
                     var15.getWorldAABB(var16, var9, var10);
                  }

                  int var36 = MathUtil.floor(var9.x());
                  int var18 = MathUtil.floor(var9.y());
                  int var19 = MathUtil.floor(var9.z());
                  int var20 = MathUtil.floor(var10.x());
                  int var21 = MathUtil.floor(var10.y());
                  int var22 = MathUtil.floor(var10.z());

                  for (int var23 = var36; var23 <= var20; var23++) {
                     for (int var24 = var18; var24 <= var21; var24++) {
                        if (var24 >= 0 && var24 < 320) {
                           for (int var25 = var19; var25 <= var22; var25++) {
                              if (this.containsBlock(var15, var16, var9, var10, var11, var23, var24, var25)) {
                                 Ref var26 = var7.getChunkReference(ChunkUtil.indexChunkFromBlock(var23, var25));
                                 if (var26 != null && var26.isValid()) {
                                    BlockChunk var27 = var8.getComponent(var26, BlockChunk.getComponentType());
                                    if (var27 != null) {
                                       BlockSection var28 = var27.getSectionAtBlockY(var24);
                                       int var29 = var27.getBlock(var23, var24, var25);
                                       int var30 = var28.getFiller(var23, var24, var25);
                                       boolean var31 = var6 != null && !var6.isEmpty() && matchesFluid(var8, var26, var6, var23, var24, var25);
                                       if ((var30 == 0 || var31) && (var5.contains(var29) || var31)) {
                                          WorldChunk var32 = var8.getComponent(var26, WorldChunk.getComponentType());
                                          if (var32 != null) {
                                             boolean var33 = var30 != 0;
                                             boolean var34 = this.rotation != Rotation.None || this.pitch != Rotation.None || this.roll != Rotation.None;
                                             int var35 = var34 ? RotationTuple.index(this.rotation, this.pitch, this.roll) : -1;
                                             replaceMatchedCell(var7, var26, var32, var28, var33, var23, var24, var25, var3, var35, var12);
                                          }
                                       }
                                    }
                                 }
                              }
                           }
                        }
                     }
                  }
               }
            }
         }
      }
   }

   @Nullable
   class="kw">private ReplaceBlockTypeEffect.TargetType resolveToTarget() {
      BlockFilter.BlocksAndFluids var1 = BlockFilter.parseBlocksAndFluids(new String[]{this.toBlockType});
      if (var1.hasInvalidBlocks()) {
         LOGGER.at(Level.FINE).log("ReplaceBlockType: unknown ToBlockType '%s'", this.toBlockType);
         class="kw">return null;
      }

      int var2 = var1.blocks().size();
      int var3 = var1.fluids() != null ? var1.fluids().size() : 0;
      if (var2 + var3 != 1) {
         LOGGER.at(Level.FINE).log("ReplaceBlockType: ToBlockType '%s' resolves to %d blocks and %d fluids", this.toBlockType, var2, var3);
         class="kw">return null;
      }

      if (var2 == 1) {
         IntIterator var8 = var1.blocks().iterator();
         int var5 = var8.nextInt();
         if (this.toBlockState != null && !this.toBlockState.isBlank()) {
            BlockType var6 = BlockType.getAssetMap().getAsset(var5);
            BlockType var7 = var6 != null ? var6.getBlockForState(this.toBlockState) : null;
            if (var7 == null) {
               LOGGER.at(Level.FINE).log("ReplaceBlockType: ToBlockType '%s' does not define BlockState '%s'", this.toBlockType, this.toBlockState);
               class="kw">return null;
            } else {
               class="kw">return new ReplaceBlockTypeEffect.TargetType(BlockType.getAssetMap().getIndex(var7.getId()), 0);
            }
         } else {
            class="kw">return new ReplaceBlockTypeEffect.TargetType(var5, 0);
         }
      } else {
         IntIterator var4 = var1.fluids().iterator();
         class="kw">return new ReplaceBlockTypeEffect.TargetType(0, var4.nextInt());
      }
   }

   @Nonnull
   class="kw">private IntSet resolveFromBlocks(@Nonnull IntSet var1) {
      if (this.fromBlockState != null && !this.fromBlockState.isBlank()) {
         IntOpenHashSet var2 = new IntOpenHashSet(var1.size());
         IntIterator var3 = var1.iterator();

         while (var3.hasNext()) {
            int var4 = var3.nextInt();
            BlockType var5 = BlockType.getAssetMap().getAsset(var4);
            BlockType var6 = var5 != null ? var5.getBlockForState(this.fromBlockState) : null;
            if (var6 == null) {
               LOGGER.at(Level.FINE)
                  .log(
                     "ReplaceBlockType: FromBlockType '%s' does not define BlockState '%s'",
                     var5 != null ? var5.getId() : String.valueOf(var4),
                     this.fromBlockState
                  );
            } else {
               var2.add(BlockType.getAssetMap().getIndex(var6.getId()));
            }
         }

         class="kw">return var2;
      } else {
         class="kw">return var1;
      }
   }

   class="kw">private class="kw">static boolean matchesFluid(@Nonnull Store<ChunkStore> var0, @Nonnull Ref<ChunkStore> var1, @Nonnull IntSet var2, int var3, int var4, int var5) {
      ChunkColumn var6 = var0.getComponent(var1, ChunkColumn.getComponentType());
      if (var6 == null) {
         class="kw">return false;
      }

      Ref var7 = var6.getSection(ChunkUtil.chunkCoordinate(var4));
      if (var7 != null && var7.isValid()) {
         FluidSection var8 = var0.getComponent(var7, FluidSection.getComponentType());
         if (var8 == null) {
            class="kw">return false;
         }

         int var9 = var8.getFluidId(var3, var4, var5);
         class="kw">return var2.contains(var9);
      } else {
         class="kw">return false;
      }
   }

   class="kw">private class="kw">static void replaceMatchedCell(
      @Nonnull ChunkStore var0,
      @Nonnull Ref<ChunkStore> var1,
      @Nonnull WorldChunk var2,
      @Nonnull BlockSection var3,
      boolean var4,
      int var5,
      int var6,
      int var7,
      @Nonnull ReplaceBlockTypeEffect.TargetType var8,
      int var9,
      @Nonnull LongOpenHashSet var10
   ) {
      if (var8.fluidId() != 0) {
         if (!var4) {
            var2.setBlock(var5, var6, var7, 0, BlockType.EMPTY, 0, 0, 256);
         }

         setFluid(var0, var1, var5, var6, var7, var8.fluidId());
      } else {
         clearFluid(var0, var1, var5, var6, var7);
         if (!var4) {
            BlockType var11 = BlockType.getAssetMap().getAsset(var8.blockId());
            if (var11 != null) {
               int var12 = var9 >= 0 ? var9 : var3.getRotationIndex(var5, var6, var7);
               BlockBoundingBoxes.RotatedVariantBoxes var13 = FillerBlockUtil.multiCellFootprint(var8.blockId(), var12);
               if (var13 != null) {
                  if (!FillerBlockUtil.isFootprintFree(var10, var5, var6, var7, var13)) {
                     class="kw">return;
                  }

                  FillerBlockUtil.forEachFillerBlock(var13, (var4x, var5x, var6x) -> clearStructureAt(var0, var5 + var4x, var6 + var5x, var7 + var6x));
               }

               var2.setBlock(var5, var6, var7, var8.blockId(), var11, var12, 0, 256);
               if (var13 != null) {
                  FillerBlockUtil.markFootprint(var10, var5, var6, var7, var13);
               } else {
                  var10.add(BlockUtil.pack(var5, var6, var7));
               }
            }
         }
      }
   }

   class="kw">private class="kw">static void clearStructureAt(@Nonnull ChunkStore var0, int var1, int var2, int var3) {
      if (var2 >= 0 && var2 < 320) {
         Store var4 = var0.getStore();
         Ref var5 = var0.getChunkReference(ChunkUtil.indexChunkFromBlock(var1, var3));
         if (var5 != null && var5.isValid()) {
            BlockChunk var6 = var4.getComponent(var5, BlockChunk.getComponentType());
            if (var6 != null) {
               int var7 = var6.getSectionAtBlockY(var2).getFiller(var1, var2, var3);
               int var8 = var1 - FillerBlockUtil.unpackX(var7);
               int var9 = var2 - FillerBlockUtil.unpackY(var7);
               int var10 = var3 - FillerBlockUtil.unpackZ(var7);
               if (var9 >= 0 && var9 < 320) {
                  Ref var11 = var0.getChunkReference(ChunkUtil.indexChunkFromBlock(var8, var10));
                  if (var11 != null && var11.isValid()) {
                     BlockChunk var12 = var4.getComponent(var11, BlockChunk.getComponentType());
                     if (var12 != null) {
                        if (var12.getBlock(var8, var9, var10) != 0) {
                           WorldChunk var13 = var4.getComponent(var11, WorldChunk.getComponentType());
                           if (var13 != null) {
                              var13.setBlock(var8, var9, var10, 0, BlockType.EMPTY, 0, 0, 256);
                           }
                        }
                     }
                  }
               }
            }
         }
      }
   }

   class="kw">private class="kw">static void setFluid(@Nonnull ChunkStore var0, @Nonnull Ref<ChunkStore> var1, int var2, int var3, int var4, int var5) {
      Fluid var6 = Fluid.getAssetMap().getAsset(var5);
      if (var6 != null) {
         Store var7 = var0.getStore();
         ChunkColumn var8 = var7.getComponent(var1, ChunkColumn.getComponentType());
         if (var8 != null) {
            Ref var9 = var8.getSection(ChunkUtil.chunkCoordinate(var3));
            if (var9 != null && var9.isValid()) {
               FluidSection var10 = var7.ensureAndGetComponent(var9, FluidSection.getComponentType());
               var10.setFluid(var2, var3, var4, var5, (byte)var6.getMaxFluidLevel());
            }
         }
      }
   }

   class="kw">private class="kw">static void clearFluid(@Nonnull ChunkStore var0, @Nonnull Ref<ChunkStore> var1, int var2, int var3, int var4) {
      Store var5 = var0.getStore();
      ChunkColumn var6 = var5.getComponent(var1, ChunkColumn.getComponentType());
      if (var6 != null) {
         Ref var7 = var6.getSection(ChunkUtil.chunkCoordinate(var3));
         if (var7 != null && var7.isValid()) {
            FluidSection var8 = var5.getComponent(var7, FluidSection.getComponentType());
            if (var8 != null) {
               if (var8.getFluidId(var2, var3, var4) != 0) {
                  var8.setFluid(var2, var3, var4, 0, (byte)0);
               }
            }
         }
      }
   }

   class="kw">private boolean containsBlock(
      @Nonnull TriggerVolumeShape var1,
      @Nonnull Vector3d var2,
      @Nonnull Vector3d var3,
      @Nonnull Vector3d var4,
      @Nonnull Vector3d var5,
      int var6,
      int var7,
      int var8
   ) {
      var5.set(var6 + 0.5, var7 + 0.5, var8 + 0.5);
      class="kw">return this.bounds != ReplaceBlockTypeEffect.Bounds.AABB
         ? var1.contains(var2, var5)
         : var5.x() >= var3.x() && var5.x() <= var4.x() && var5.y() >= var3.y() && var5.y() <= var4.y() && var5.z() >= var3.z() && var5.z() <= var4.z();
   }

   @Override
   class="kw">public void rotateInPlace(float var1, @Nonnull Vector3d var2) {
      if (this.origin == EffectOrigin.VOLUME_ORIGIN) {
         int var3 = YawRotation.quarterTurns(var1);
         if (var3 > 0) {
            Vector3d var4 = new Vector3d(this.offset).add(this.sizeX, 0.0, this.sizeZ);
            YawRotation.rotateBlockOffset(var4, var1, var2);
            YawRotation.rotateBlockOffset(this.offset, var1, var2);
            this.sizeX = (float)(var4.x() - this.offset.x());
            this.sizeZ = (float)(var4.z() - this.offset.z());
            if (this.rotation != null) {
               this.rotation = YawRotation.rotate(this.rotation, var3);
            }
         } else {
            YawRotation.rotateBlockOffset(this.offset, var1, var2);
         }
      }
   }

   class="kw">private void getConfiguredAABB(@Nonnull Vector3d var1, @Nonnull Vector3d var2, @Nonnull Vector3d var3) {
      Vector3d var4 = this.offset != null ? this.offset : new Vector3d();
      var2.set(var1).add(var4);
      var3.set(var2).add(this.sizeX, this.sizeY, this.sizeZ);
      double var5 = Math.min(var2.x(), var3.x());
      double var7 = Math.min(var2.y(), var3.y());
      double var9 = Math.min(var2.z(), var3.z());
      double var11 = Math.max(var2.x(), var3.x());
      double var13 = Math.max(var2.y(), var3.y());
      double var15 = Math.max(var2.z(), var3.z());
      var2.set(var5, var7, var9);
      var3.set(var11, var13, var15);
   }

   class="kw">public enum Bounds {
      SHAPE,
      AABB;

      Bounds() {
      }
   }

   class="kw">private record TargetType(int blockId, int fluidId) {
      class="kw">private TargetType {
      }
   }
}