Sampling enum

Пакет: com.hypixel.hytale.builtin.buildertools.tooloperations

Файл: com/hypixel/hytale/builtin/buildertools/tooloperations/RevolveOperation.java

Поля (1)

МодификаторыТипИмя
Neighbor, Reverse, Disabled

Исходный код

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

class="kw">import com.hypixel.hytale.builtin.buildertools.BuilderToolsPlugin;
class="kw">import com.hypixel.hytale.builtin.buildertools.utils.Material;
class="kw">import com.hypixel.hytale.component.AddReason;
class="kw">import com.hypixel.hytale.component.ComponentAccessor;
class="kw">import com.hypixel.hytale.component.Holder;
class="kw">import com.hypixel.hytale.component.Ref;
class="kw">import com.hypixel.hytale.component.Store;
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.Rotation3f;
class="kw">import com.hypixel.hytale.math.vector.Vector3iUtil;
class="kw">import com.hypixel.hytale.protocol.packets.buildertools.BuilderToolOnUseInteraction;
class="kw">import com.hypixel.hytale.protocol.packets.interface_.NotificationStyle;
class="kw">import com.hypixel.hytale.server.core.Message;
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.entity.UUIDComponent;
class="kw">import com.hypixel.hytale.server.core.entity.entities.Player;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.HeadRotation;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.TransformComponent;
class="kw">import com.hypixel.hytale.server.core.modules.entity.tracker.EntityTrackerSystems;
class="kw">import com.hypixel.hytale.server.core.modules.entity.tracker.NetworkId;
class="kw">import com.hypixel.hytale.server.core.prefab.selection.standard.BlockSelection;
class="kw">import com.hypixel.hytale.server.core.universe.PlayerRef;
class="kw">import com.hypixel.hytale.server.core.universe.world.World;
class="kw">import com.hypixel.hytale.server.core.universe.world.accessor.OverridableChunkAccessor;
class="kw">import com.hypixel.hytale.server.core.universe.world.chunk.WorldChunk;
class="kw">import com.hypixel.hytale.server.core.universe.world.storage.ChunkStore;
class="kw">import com.hypixel.hytale.server.core.universe.world.storage.EntityStore;
class="kw">import it.unimi.dsi.fastutil.objects.ReferenceArrayList;
class="kw">import java.util.List;
class="kw">import java.util.UUID;
class="kw">import javax.annotation.Nonnull;
class="kw">import org.joml.Vector3d;
class="kw">import org.joml.Vector3f;
class="kw">import org.joml.Vector3i;

class="kw">public class RevolveOperation class="kw">extends ToolOperation {
   class="kw">private Vector3f center;
   class="kw">private BlockSelection currentSelection;
   class="kw">private RevolveOperation.Sampling samplingMode = RevolveOperation.Sampling.Neighbor;
   class="kw">private int copyCount = 6;
   class="kw">private double stepRadians;
   class="kw">private double stepDegrees;
   class="kw">private int bufferX;
   class="kw">private int bufferZ;
   class="kw">private Material[][][] materialBuffer;
   class="kw">private class="kw">static class="kw">final double DISTANCE_TO_NEXT_BLOCK = 0.33;
   class="kw">private class="kw">static class="kw">final int REVOLVE_COPY_LIMIT = 1000000;
   class="kw">private class="kw">static class="kw">final int MAX_ENTITIES = 1000;
   class="kw">private class="kw">static class="kw">final int MIN_COPY_FULL = 10;
   class="kw">private class="kw">static class="kw">final int MAX_COPY_FULL = 2000;
   class="kw">private class="kw">static class="kw">final int REVOLVE_DENSITY = 12;
   class="kw">private class="kw">static class="kw">final int[][] NEIGHBOR_OFFSETS_XZ = new int[][]{{1, 0}, {-1, 0}, {0, 1}, {0, -1}, {1, 1}, {-1, 1}, {1, -1}, {-1, -1}};

   class="kw">public RevolveOperation(
      @Nonnull Ref<EntityStore> var1,
      @Nonnull Player var2,
      @Nonnull PlayerRef var3,
      @Nonnull BuilderToolOnUseInteraction var4,
      @Nonnull ComponentAccessor<EntityStore> var5
   ) {
      super(var1, var4, var5);
      BuilderToolsPlugin.BuilderState var6 = BuilderToolsPlugin.getState(var2, var3);
      BlockSelection var7 = var6.getSelection();
      if (var7 == null) {
         BuilderToolsPlugin.sendFeedback(Message.translation("server.builderTools.noSelection"), var3, NotificationStyle.Warning, var5);
      } else if (!var7.hasSelectionBounds()) {
         BuilderToolsPlugin.sendFeedback(Message.translation("server.builderTools.noSelectionBounds"), var3, NotificationStyle.Warning, var5);
      } else {
         OverridableChunkAccessor var8 = this.edit.getAccessor();

         this.samplingMode = class="kw">switch ((String)this.args.tool().getOrDefault("aSampling", "structural")) {
            case "natural" -> RevolveOperation.Sampling.Reverse;
            case "none" -> RevolveOperation.Sampling.Disabled;
            class="kw">default -> RevolveOperation.Sampling.Neighbor;
         };
         this.copyCount = (Integer)this.args.tool().getOrDefault("bCount", 6);
         boolean var46 = (Boolean)this.args.tool().getOrDefault("cFullRevolve", false);
         boolean var47 = (Boolean)this.args.tool().getOrDefault("eUseDistance", false);
         boolean var11 = (Boolean)this.args.tool().getOrDefault("eCopyEntities", false);
         class="kw">switch ((String)this.args.tool().getOrDefault("dCenter", "target")) {
            case "player":
               Vector3d var14 = var3.getTransform().getPosition();
               this.center = new Vector3f((float)var14.x, (float)var14.y, (float)var14.z).floor().add(0.5F, 0.5F, 0.5F);
               break;
            class="kw">default:
               this.center = new Vector3f(this.x + 0.5F, this.y + this.originOffsetY, this.z + 0.5F);
         }

         int var48 = 0;
         if (var47) {
            var48 = (Integer)this.args.tool().getOrDefault("fDistance", 20);
         }

         Vector3i var49 = Vector3iUtil.min(var7.getSelectionMin(), var7.getSelectionMax());
         Vector3i var50 = Vector3iUtil.max(var7.getSelectionMin(), var7.getSelectionMax());
         int var15 = var49.x();
         int var16 = var50.x();
         int var17 = var49.y();
         int var18 = var50.y();
         int var19 = var49.z();
         int var20 = var50.z();
         this.currentSelection = new BlockSelection();
         this.bufferX = var16 - var15 + 1;
         int var21 = var18 - var17 + 1;
         this.bufferZ = var20 - var19 + 1;
         this.currentSelection.setPosition(var15, var17, var19);
         if (this.samplingMode.equals(RevolveOperation.Sampling.Neighbor)) {
            this.materialBuffer = new Material[this.bufferX][var21][this.bufferZ];
         }

         int var22 = var15 >> 5;
         int var23 = var16 >> 5;
         int var24 = var19 >> 5;
         int var25 = var20 >> 5;

         for (int var26 = var22; var26 <= var23; var26++) {
            for (int var27 = var24; var27 <= var25; var27++) {
               WorldChunk var28 = var8.getChunk(ChunkUtil.indexChunk(var26, var27));
               if (var28 != null) {
                  int var29 = Math.max(var15, var26 << 5);
                  int var30 = Math.min(var16, (var26 << 5) + 31);
                  int var31 = Math.max(var19, var27 << 5);
                  int var32 = Math.min(var20, (var27 << 5) + 31);

                  for (int var33 = var29; var33 <= var30; var33++) {
                     for (int var34 = var31; var34 <= var32; var34++) {
                        for (int var35 = var18; var35 >= var17; var35--) {
                           int var36 = var28.getBlock(var33, var35, var34);
                           int var37 = var28.getRotationIndex(var33, var35, var34);
                           int var38 = var28.getSupportValue(var33, var35, var34);
                           int var39 = var28.getFiller(var33, var35, var34);
                           int var40 = var28.getFluidId(var33, var35, var34);
                           byte var41 = var28.getFluidLevel(var33, var35, var34);
                           Holder var42 = var28.getBlockComponentHolder(var33, var35, var34);
                           if (var36 != 0
                              && var39 == 0
                              && (this.edit.getBlockMask() == null || !this.edit.getBlockMask().isExcluded(var8, var33, var35, var34, var49, var50, var36, 0))) {
                              this.currentSelection.addBlockAtWorldPos(var33, var35, var34, var36, var37, var39, var38, var42);
                           }

                           if (var40 != 0
                              && (this.edit.getBlockMask() == null || !this.edit.getBlockMask().isExcluded(var8, var33, var35, var34, var49, var50, 0, var40))) {
                              this.currentSelection.addFluidAtWorldPos(var33, var35, var34, var40, var41);
                           }

                           if (this.samplingMode == RevolveOperation.Sampling.Neighbor) {
                              this.materialBuffer[var33 - var15][var35 - var17][var34 - var19] = Material.full(var36, var37, var38, var39, var42, var40, var41);
                           }

                           this.edit.setMaterial(var33, var35, var34, Material.EMPTY);
                        }
                     }
                  }
               }
            }
         }

         List var51 = new ReferenceArrayList();
         if (!var46 && var11) {
            World var52 = var5.getExternalData().getWorld();
            Store var55 = var52.getEntityStore().getStore();
            List var56 = new ReferenceArrayList();
            BuilderToolsPlugin.forEachCopyableInSelection(var52, var15, var17, var19, var16 - var15, var18 - var17, var20 - var19, var56::add);
            int var59 = var56.size() * this.copyCount;
            if (var59 <= 1000) {
               for (Ref var63 : var56) {
                  Holder var64 = var55.copyEntity(var63);
                  this.currentSelection.addEntityFromWorld(var64);
                  var51.add(var63);
               }
            } else {
               BuilderToolsPlugin.sendFeedback(
                  Message.translation("server.builderTools.errorTooManyEntities").param("count", 1000), var3, NotificationStyle.Warning, var5
               );
            }
         }

         if (var48 > 0) {
            double var53 = (var15 + var16) / 2.0;
            double var57 = (var19 + var20) / 2.0;
            double var62 = var53 - this.center.x;
            double var65 = var57 - this.center.z;
            double var66 = Math.sqrt(var62 * var62 + var65 * var65);
            if (var66 > 0.0) {
               double var67 = var48 / var66;
               int var68 = (int)Math.floor(this.center.x + var62 * var67) - (var16 - var15) / 2;
               int var69 = (int)Math.floor(this.center.z + var65 * var67) - (var20 - var19) / 2;
               this.currentSelection.setPosition(var68, var17, var69);
               int var70 = var68 - var15;
               int var71 = var69 - var19;

               for (Ref var44 : var51) {
                  this.edit.trackMovedEntity(var44, var5);
                  TransformComponent var45 = var5.getComponent(var44, TransformComponent.getComponentType());
                  if (var45 != null) {
                     var45.getPosition().add(var70, 0.0, var71);
                  }
               }
            }
         }

         if (var46) {
            this.samplingMode = RevolveOperation.Sampling.Disabled;
            double var54 = computeRadiusXZ(var15, var16, var19, var20, this.center);
            this.copyCount = MathUtil.clamp((int)Math.round(var54 * 12.0), 10, 2000);
            int var58 = this.currentSelection.getBlockCount() + this.currentSelection.getFluidCount();
            if (var58 == 0) {
               class="kw">return;
            }

            int var60 = MathUtil.clamp(1000000 / var58, 10, 2000);
            this.copyCount = Math.min(this.copyCount, var60);
         }

         this.stepRadians = Math.toRadians(360.0 / this.copyCount);
         this.stepDegrees = 360.0 / this.copyCount;
      }
   }

   @Override
   class="kw">public void execute(ComponentAccessor<EntityStore> var1) {
   }

   @Override
   class="kw">public void executeAt(int var1, int var2, int var3, ComponentAccessor<EntityStore> var4) {
      if (this.currentSelection != null) {
         double[] var5 = new double[this.copyCount + 1];
         double[] var6 = new double[this.copyCount + 1];
         double[] var7 = new double[this.copyCount + 1];

         for (int var8 = 0; var8 <= this.copyCount; var8++) {
            double var9 = this.stepRadians * var8;
            var5[var8] = Math.cos(var9);
            var6[var8] = Math.sin(var9);
            var7[var8] = this.stepDegrees * var8;
         }

         if (this.samplingMode.equals(RevolveOperation.Sampling.Reverse)) {
            this.reverseSample();
            this.rotateEntities(var4, var6, var5, var7);
         } else {
            BlockSelection var12 = new BlockSelection();
            BlockSelection var13 = new BlockSelection();
            int[][] var10 = NEIGHBOR_OFFSETS_XZ;
            Vector3i var11 = new Vector3i();
            this.currentSelection
               .forEachBlock(
                  (var8x, var9x, var10x, var11x) -> {
                     int var12 = this.checkNeighbours(var10, var11x.blockId(), var8x, var9x, var10x, false);
                     int var13 = Integer.bitCount(var12);
                     double var14 = var8x + this.currentSelection.getX() + 0.5 - this.center.x;
                     double var16 = var10x + this.currentSelection.getZ() + 0.5 - this.center.z;

                     for (int var18 = 1; var18 <= this.copyCount; var18++) {
                        int var19 = rotateBlock(var11x, var7[var18]);
                        if (this.samplingMode == RevolveOperation.Sampling.Neighbor && var13 > 0) {
                           for (int var20 = 0; var20 < var10.length; var20++) {
                              if ((var12 & 1 << var20) != 0) {
                                 double var21 = var10[var20][0] * 0.33 + var14;
                                 double var23 = var10[var20][1] * 0.33 + var16;
                                 this.rotate(var11, var18, var21, var9x, var23, var6, var5);
                                 var12.addBlockAtWorldPos(var11.x, var11.y, var11.z, var11x.blockId(), var19, var11x.filler(), var11x.supportValue());
                              }
                           }
                        }

                        this.rotate(var11, var18, var14, var9x, var16, var6, var5);
                        if (var13 > 0) {
                           var12.addBlockAtWorldPos(var11.x, var11.y, var11.z, var11x.blockId(), var19, var11x.filler(), var11x.supportValue());
                        } else {
                           var13.addBlockAtWorldPos(var11.x, var11.y, var11.z, var11x.blockId(), var19, var11x.filler(), var11x.supportValue());
                           this.edit
                              .setMaterial(
                                 var11.x, var11.y, var11.z, Material.full(var11x.blockId(), var19, var11x.supportValue(), var11x.filler(), var11x.holder())
                              );
                        }
                     }
                  }
               );
            this.currentSelection.forEachFluid((var5x, var6x, var7x, var8x, var9x) -> {
               int var10 = this.checkNeighbours(var10, var8x, var5x, var6x, var7x, true);
               int var11 = Integer.bitCount(var10);
               double var12 = var5x + this.currentSelection.getX() + 0.5 - this.center.x;
               double var14 = var7x + this.currentSelection.getZ() + 0.5 - this.center.z;

               for (int var16 = 1; var16 <= this.copyCount; var16++) {
                  if (this.samplingMode == RevolveOperation.Sampling.Neighbor && var11 > 0) {
                     for (int var17 = 0; var17 < var10.length; var17++) {
                        if ((var10 & 1 << var17) != 0) {
                           double var18 = var10[var17][0] * 0.33 + var12;
                           double var20 = var10[var17][1] * 0.33 + var14;
                           this.rotate(var11, var16, var18, var6x, var20, var6, var5);
                           this.edit.setMaterial(var11.x, var11.y, var11.z, Material.fluid(var8x, var9x));
                        }
                     }
                  }

                  this.rotate(var11, var16, var12, var6x, var14, var6, var5);
                  this.edit.setMaterial(var11.x, var11.y, var11.z, Material.fluid(var8x, var9x));
               }
            });
            var12.forEachBlock(
               (var2x, var3x, var4x, var5x) -> {
                  if (!var13.hasBlockAtWorldPos(var2x, var3x, var4x)) {
                     this.edit
                        .setMaterial(
                           var2x, var3x, var4x, Material.full(var5x.blockId(), var5x.rotation(), var5x.supportValue(), var5x.filler(), var5x.holder())
                        );
                  }
               }
            );
            this.rotateEntities(var4, var6, var5, var7);
         }
      }
   }

   class="kw">private void rotateEntities(ComponentAccessor<EntityStore> var1, double[] var2, double[] var3, double[] var4) {
      World var5 = var1.getExternalData().getWorld();
      Store var6 = var5.getEntityStore().getStore();
      this.currentSelection.forEachEntity(var6x -> {
         TransformComponent var7 = var6x.getComponent(TransformComponent.getComponentType());
         double var8 = var7.getPosition().x();
         double var10 = var7.getPosition().y();
         double var12 = var7.getPosition().z();
         double var14 = var8 + this.currentSelection.getX() - this.center.x;
         double var16 = var12 + this.currentSelection.getZ() - this.center.z;

         for (int var18 = 1; var18 < this.copyCount; var18++) {
            double var19 = var14 * var3[var18] - var16 * var2[var18];
            double var21 = var14 * var2[var18] + var16 * var3[var18];
            float var23 = (float)Math.toRadians(-var4[var18]);
            Holder var24 = var6x.clone();
            TransformComponent var25 = var24.getComponent(TransformComponent.getComponentType());
            Rotation3f var26 = var25.getRotation();
            var26.addYaw(var23);
            HeadRotation var27 = var24.getComponent(HeadRotation.getComponentType());
            if (var27 != null) {
               var27.getRotation().addYaw(var23);
            }

            var25.getPosition().set(var19 + this.center.x, var10 + this.currentSelection.getY(), var21 + this.center.z);
            var24.putComponent(UUIDComponent.getComponentType(), new UUIDComponent(UUID.randomUUID()));
            var24.removeComponent(EntityTrackerSystems.Visible.getComponentType());
            var24.removeComponent(NetworkId.getComponentType());
            Ref var28 = new Ref<>(var6);
            var5.execute(() -> var6.addEntity(var24, var28, AddReason.LOAD));
            this.edit.trackSpawnedEntity(var28);
         }
      });
   }

   class="kw">private class="kw">static int rotateBlock(BlockSelection.BlockHolder var0, double var1) {
      Rotation var3 = Rotation.ofDegrees((int)(Math.round(-var1 / 90.0) * 90L));
      RotationTuple var4 = RotationTuple.get(var0.rotation());
      RotationTuple var5 = RotationTuple.of(var4.yaw().add(var3), var4.pitch(), var4.roll());
      if (var5 == null) {
         var5 = var4;
      }

      class="kw">return var5.index();
   }

   class="kw">private int checkNeighbours(int[][] var1, int var2, int var3, int var4, int var5, boolean var6) {
      int var7 = 0;
      if (this.samplingMode == RevolveOperation.Sampling.Neighbor) {
         for (int var8 = 0; var8 < var1.length; var8++) {
            int var9 = var3 + var1[var8][0];
            int var10 = var5 + var1[var8][1];
            if (var9 >= 0 && var9 < this.bufferX && var10 >= 0 && var10 < this.bufferZ) {
               boolean var11 = !var6
                  ? this.materialBuffer[var9][var4][var10].getBlockId() == var2
                  : this.materialBuffer[var9][var4][var10].getFluidId() == var2;
               if (var11) {
                  var7 |= 1 << var8;
               }
            }
         }
      }

      class="kw">return var7;
   }

   class="kw">private void rotate(Vector3i var1, int var2, double var3, int var5, double var6, double[] var8, double[] var9) {
      double var10 = var3 * var9[var2] - var6 * var8[var2];
      double var12 = var3 * var8[var2] + var6 * var9[var2];
      var1.set((int)Math.floor(var10 + this.center.x), var5 + this.currentSelection.getY(), (int)Math.floor(var12 + this.center.z));
   }

   class="kw">private void reverseSample() {
      this.currentSelection
         .setAnchor(
            (int)(this.center.x - this.currentSelection.getX()),
            (int)this.center.y - this.currentSelection.getY(),
            (int)(this.center.z - this.currentSelection.getZ())
         );

      for (int var2 = 1; var2 <= this.copyCount; var2++) {
         BlockSelection var1 = this.currentSelection.cloneSelection().rotateArbitrary((float)this.stepDegrees * var2, 0.0F, 0.0F);
         var1.forEachBlock(
            (var1x, var2x, var3, var4) -> this.edit
               .setMaterial(
                  var1x + this.currentSelection.getX(),
                  var2x + this.currentSelection.getY(),
                  var3 + this.currentSelection.getZ(),
                  Material.full(var4.blockId(), var4.rotation(), var4.supportValue(), var4.filler(), var4.holder())
               )
         );
         var1.forEachFluid(
            (var1x, var2x, var3, var4, var5) -> this.edit
               .setMaterial(
                  var1x + this.currentSelection.getX(), var2x + this.currentSelection.getY(), var3 + this.currentSelection.getZ(), Material.fluid(var4, var5)
               )
         );
      }
   }

   class="kw">private class="kw">static double computeRadiusXZ(int var0, int var1, int var2, int var3, Vector3f var4) {
      double var5 = 0.0;
      int[] var7 = new int[]{var0, var1};
      int[] var8 = new int[]{var2, var3};

      for (int var12 : var7) {
         for (int var16 : var8) {
            double var17 = var12 + 0.5 - var4.x;
            double var19 = var16 + 0.5 - var4.z;
            double var21 = var17 * var17 + var19 * var19;
            if (var21 > var5) {
               var5 = var21;
            }
         }
      }

      class="kw">return Math.sqrt(var5);
   }

   @Override
   class="kw">protected boolean executeBlock(int var1, int var2, int var3) {
      class="kw">return false;
   }

   class="kw">private enum Sampling {
      Neighbor,
      Reverse,
      Disabled;

      Sampling() {
      }
   }
}