FluidAction enum

Пакет: com.hypixel.hytale.builtin.buildertools.scriptedbrushes.operations.sequential

Файл: com/hypixel/hytale/builtin/buildertools/scriptedbrushes/operations/sequential/FluidFixOperation.java

Поля (1)

МодификаторыТипИмя
Fill, Clear

Исходный код

Показать/скрыть
class="kw">package com.hypixel.hytale.builtin.buildertools.scriptedbrushes.operations.sequential;

class="kw">import com.hypixel.hytale.builtin.buildertools.scriptedbrushes.BrushConfig;
class="kw">import com.hypixel.hytale.builtin.buildertools.scriptedbrushes.BrushConfigCommandExecutor;
class="kw">import com.hypixel.hytale.builtin.buildertools.scriptedbrushes.BrushConfigEditStore;
class="kw">import com.hypixel.hytale.builtin.buildertools.scriptedbrushes.operations.system.SequenceBrushOperation;
class="kw">import com.hypixel.hytale.builtin.buildertools.tooloperations.SculptOperation;
class="kw">import com.hypixel.hytale.builtin.buildertools.utils.Material;
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.ComponentAccessor;
class="kw">import com.hypixel.hytale.component.Ref;
class="kw">import com.hypixel.hytale.logger.HytaleLogger;
class="kw">import com.hypixel.hytale.server.core.asset.type.fluid.Fluid;
class="kw">import com.hypixel.hytale.server.core.universe.world.storage.EntityStore;
class="kw">import it.unimi.dsi.fastutil.ints.Int2IntOpenHashMap;
class="kw">import java.util.ArrayDeque;
class="kw">import java.util.logging.Level;
class="kw">import javax.annotation.Nonnull;
class="kw">import org.joml.Vector3i;

class="kw">public class FluidFixOperation class="kw">extends SequenceBrushOperation {
   class="kw">public class="kw">static class="kw">final BuilderCodec<FluidFixOperation> CODEC = BuilderCodec.builder(FluidFixOperation.class, FluidFixOperation::new)
      .append(
         new KeyedCodec<>("FluidAction", new EnumCodec<>(FluidFixOperation.FluidAction.class)),
         (var0, var1) -> var0.fluidAction = var1,
         var0 -> var0.fluidAction
      )
      .documentation("Fill flood-fills fluids into air pockets. Clear removes all fluids in the brush area.")
      .add()
      .documentation("Fixes or clears fluids in the brush area after terrain modifications")
      .build();
   @Nonnull
   class="kw">private FluidFixOperation.FluidAction fluidAction = FluidFixOperation.FluidAction.Fill;
   class="kw">private class="kw">static class="kw">final int BUFFER_MARGIN = 1;
   class="kw">private class="kw">static class="kw">final long MAX_BUFFER_VOLUME = 1000000L;
   class="kw">private class="kw">static class="kw">final HytaleLogger LOGGER = HytaleLogger.forEnclosingClass();
   class="kw">private int originX;
   class="kw">private int originY;
   class="kw">private int originZ;
   class="kw">private int bufferWidth;
   class="kw">private int bufferHeight;
   class="kw">private int halfBufferWidth;
   class="kw">private int halfBufferHeight;

   class="kw">public FluidFixOperation() {
      super("Fluid Fix", "Fixes or clears fluids in the brush area after terrain modifications", true);
   }

   @Override
   class="kw">public void modifyBrushConfig(
      @Nonnull Ref<EntityStore> var1, @Nonnull BrushConfig var2, @Nonnull BrushConfigCommandExecutor var3, @Nonnull ComponentAccessor<EntityStore> var4
   ) {
      Vector3i var5 = var2.getOrigin();
      this.originX = var5.x;
      this.originY = var5.y;
      this.originZ = var5.z;
      this.bufferWidth = var2.getShapeWidth() + 2;
      this.bufferHeight = var2.getShapeHeight() + 2;
      this.halfBufferWidth = this.bufferWidth / 2;
      this.halfBufferHeight = this.bufferHeight / 2;
      if (this.fluidAction == FluidFixOperation.FluidAction.Fill) {
         long var6 = (long)this.bufferWidth * this.bufferHeight * this.bufferWidth;
         if (var6 > 1000000L) {
            LOGGER.at(Level.WARNING)
               .log("Skipping fluid fill for oversized brush buffer %dx%dx%d (%d cells)", this.bufferWidth, this.bufferHeight, this.bufferWidth, var6);
            class="kw">return;
         }

         BrushConfigEditStore var8 = var3.getEdit();
         int[][][] var9 = new int[this.bufferWidth][this.bufferHeight][this.bufferWidth];
         int[][][] var10 = new int[this.bufferWidth][this.bufferHeight][this.bufferWidth];
         this.buildBuffers(var8, var9, var10);
         this.floodFillFluids(var8, var9, var10);
      }
   }

   @Override
   class="kw">public boolean modifyBlocks(
      Ref<EntityStore> var1,
      BrushConfig var2,
      BrushConfigCommandExecutor var3,
      @Nonnull BrushConfigEditStore var4,
      int var5,
      int var6,
      int var7,
      ComponentAccessor<EntityStore> var8
   ) {
      if (this.fluidAction == FluidFixOperation.FluidAction.Clear) {
         int var9 = var4.getFluid(var5, var6, var7);
         if (var9 != 0) {
            var4.setMaterial(var5, var6, var7, Material.fluid(0, (byte)0));
         }
      }

      class="kw">return true;
   }

   class="kw">private void buildBuffers(BrushConfigEditStore var1, int[][][] var2, int[][][] var3) {
      Int2IntOpenHashMap var4 = new Int2IntOpenHashMap();
      var4.defaultReturnValue(Integer.MIN_VALUE);

      for (int var5 = 0; var5 < this.bufferWidth; var5++) {
         int var6 = this.originX - this.halfBufferWidth + var5;

         for (int var7 = 0; var7 < this.bufferWidth; var7++) {
            int var8 = this.originZ - this.halfBufferWidth + var7;

            for (int var9 = 0; var9 < this.bufferHeight; var9++) {
               int var10 = this.originY - this.halfBufferHeight + var9;
               var2[var5][var9][var7] = SculptOperation.filterFullBlockForBuffer(var1.getBlock(var6, var10, var8), var4);
               var3[var5][var9][var7] = var1.getFluid(var6, var10, var8);
            }
         }
      }
   }

   class="kw">private void floodFillFluids(BrushConfigEditStore var1, int[][][] var2, int[][][] var3) {
      boolean[][] var4 = new boolean[this.bufferWidth][this.bufferWidth];
      int[][] var5 = new int[this.bufferWidth][this.bufferWidth];
      boolean[][] var6 = new boolean[this.bufferWidth][this.bufferWidth];
      ArrayDeque var7 = new ArrayDeque<>(this.bufferWidth * this.bufferWidth);

      for (int var8 = this.bufferHeight - 1; var8 >= 0; var8--) {
         int var9 = this.originY - this.halfBufferHeight + var8;

         for (int var10 = 0; var10 < this.bufferWidth; var10++) {
            for (int var11 = 0; var11 < this.bufferWidth; var11++) {
               var6[var10][var11] = false;
               int var12 = var3[var10][var8][var11];
               boolean var13 = var4[var10][var11];
               var4[var10][var11] = false;
               int var14 = var12 != 0 ? var12 : var5[var10][var11];
               var5[var10][var11] = 0;
               if (var14 != 0 || var13) {
                  if (var2[var10][var8][var11] <= 0) {
                     var7.add(new FluidFixOperation.FluidFillEntry(var10, var11, var14));
                     var6[var10][var11] = true;
                  } else {
                     var4[var10][var11] = true;
                     if (var14 != 0) {
                        var5[var10][var11] = var14;
                     }
                  }
               }
            }
         }

         while (!var7.isEmpty()) {
            FluidFixOperation.FluidFillEntry var19 = var7.poll();
            int var20 = var19.bx();
            int var21 = var19.bz();
            int var22 = var19.fluidId();
            var4[var20][var21] = true;
            int var23 = var3[var20][var8][var21];
            if (var23 != 0) {
               var22 = var23;
            } else if (var22 == 0) {
               var22 = this.findNearbyFluid(var3, var20, var8, var21);
            }

            if (var22 != 0) {
               int var15 = this.originX - this.halfBufferWidth + var20;
               int var16 = this.originZ - this.halfBufferWidth + var21;
               Fluid var17 = Fluid.getAssetMap().getAsset(var22);
               byte var18 = (byte)(var17 != null ? var17.getMaxFluidLevel() : 8);
               var1.setMaterial(var15, var9, var16, Material.fluid(var22, var18));
               var3[var20][var8][var21] = var22;
               var5[var20][var21] = var22;
            }

            if (var20 > 0 && !var6[var20 - 1][var21] && var2[var20 - 1][var8][var21] <= 0) {
               var6[var20 - 1][var21] = true;
               var7.add(new FluidFixOperation.FluidFillEntry(var20 - 1, var21, var22));
            }

            if (var20 < this.bufferWidth - 1 && !var6[var20 + 1][var21] && var2[var20 + 1][var8][var21] <= 0) {
               var6[var20 + 1][var21] = true;
               var7.add(new FluidFixOperation.FluidFillEntry(var20 + 1, var21, var22));
            }

            if (var21 > 0 && !var6[var20][var21 - 1] && var2[var20][var8][var21 - 1] <= 0) {
               var6[var20][var21 - 1] = true;
               var7.add(new FluidFixOperation.FluidFillEntry(var20, var21 - 1, var22));
            }

            if (var21 < this.bufferWidth - 1 && !var6[var20][var21 + 1] && var2[var20][var8][var21 + 1] <= 0) {
               var6[var20][var21 + 1] = true;
               var7.add(new FluidFixOperation.FluidFillEntry(var20, var21 + 1, var22));
            }
         }
      }
   }

   class="kw">private int findNearbyFluid(int[][][] var1, int var2, int var3, int var4) {
      if (var3 + 1 < this.bufferHeight) {
         int var5 = var1[var2][var3 + 1][var4];
         if (var5 != 0) {
            class="kw">return var5;
         }
      }

      if (var2 > 0) {
         int var6 = var1[var2 - 1][var3][var4];
         if (var6 != 0) {
            class="kw">return var6;
         }
      }

      if (var2 < this.bufferWidth - 1) {
         int var7 = var1[var2 + 1][var3][var4];
         if (var7 != 0) {
            class="kw">return var7;
         }
      }

      if (var4 > 0) {
         int var8 = var1[var2][var3][var4 - 1];
         if (var8 != 0) {
            class="kw">return var8;
         }
      }

      if (var4 < this.bufferWidth - 1) {
         int var9 = var1[var2][var3][var4 + 1];
         if (var9 != 0) {
            class="kw">return var9;
         }
      }

      if (var3 > 0) {
         int var10 = var1[var2][var3 - 1][var4];
         if (var10 != 0) {
            class="kw">return var10;
         }
      }

      class="kw">return 0;
   }

   class="kw">public enum FluidAction {
      Fill,
      Clear;

      FluidAction() {
      }
   }

   class="kw">private record FluidFillEntry(int bx, int bz, int fluidId) {
      class="kw">private FluidFillEntry {
      }
   }
}