CircleOffsetFromArgOperation class

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

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

extends: SequenceBrushOperation

Поля (18)

МодификаторыТипИмя
final int MAX_REPETITIONS
return
return
return
return
return
return
return
int var1
Object var10
Vector3i var11
int var2
double var3
BuilderTool var5
ItemStack var6
BuilderTool.ArgData var7
Map var8
Object var9

Методы (10)

МодификаторыВозвратСигнатура
private int doubleToNearestIntint doubleToNearestInt(double var1)
for for(int var5 = 0; var5 < var1; var5++)
if if(this.rotateArg)
if if(this.flipArg)
if if(this.repetitionsRemaining == -1)
if if(var5 == null)
if if(var6 == null)
if if(this.numCirclePointsArgVal > 100)
if if(this.repetitionsRemaining == 0)
abstract super super("Loop Previous And Set Offset In Circle", "Loops specified instructions and changes the offset after each loop in order to execute around a circle", false)

Исходный код

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

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.operations.system.SequenceBrushOperation;
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.component.ComponentAccessor;
class="kw">import com.hypixel.hytale.component.Ref;
class="kw">import com.hypixel.hytale.server.core.asset.type.buildertool.config.BuilderTool;
class="kw">import com.hypixel.hytale.server.core.inventory.InventoryComponent;
class="kw">import com.hypixel.hytale.server.core.inventory.ItemStack;
class="kw">import com.hypixel.hytale.server.core.universe.world.storage.EntityStore;
class="kw">import it.unimi.dsi.fastutil.objects.ObjectArrayList;
class="kw">import java.util.List;
class="kw">import java.util.Map;
class="kw">import javax.annotation.Nonnull;
class="kw">import org.joml.Vector3i;
class="kw">import org.joml.Vector3ic;

class="kw">public class CircleOffsetFromArgOperation class="kw">extends SequenceBrushOperation {
   class="kw">public class="kw">static class="kw">final int MAX_REPETITIONS = 100;
   class="kw">public class="kw">static class="kw">final int IDLE_STATE = -1;
   class="kw">public class="kw">static class="kw">final double TWO_PI = Math.PI * 2;
   class="kw">public class="kw">static class="kw">final BuilderCodec<CircleOffsetFromArgOperation> CODEC = BuilderCodec.builder(
         CircleOffsetFromArgOperation.class, CircleOffsetFromArgOperation::new
      )
      .append(new KeyedCodec<>("StoredIndexName", Codec.STRING), (var0, var1) -> var0.indexNameArg = var1, var0 -> var0.indexNameArg)
      .documentation("The name of the previously stored index to begin the loop at. Note: This can only be an index previous to the current.")
      .add()
      .<String>append(
         new KeyedCodec<>("NumberCirclePointsArg", Codec.STRING, true), (var0, var1) -> var0.numCirclePointsArg = var1, var0 -> var0.numCirclePointsArg
      )
      .documentation("The name of the Int tool arg to load the value from")
      .add()
      .<String>append(new KeyedCodec<>("CircleRadiusArg", Codec.STRING, true), (var0, var1) -> var0.circleRadiusArg = var1, var0 -> var0.circleRadiusArg)
      .documentation("The name of the Int tool arg to load the value from")
      .add()
      .<Boolean>append(new KeyedCodec<>("FlipDirection", Codec.BOOLEAN, true), (var0, var1) -> var0.flipArg = var1, var0 -> var0.flipArg)
      .documentation("Whether to invert the direction of the circle. Useful for non-zero offset modifiers.")
      .add()
      .<Boolean>append(new KeyedCodec<>("RotateDirection", Codec.BOOLEAN, true), (var0, var1) -> var0.rotateArg = var1, var0 -> var0.rotateArg)
      .documentation("Whether to invert the direction of the circle. Useful for non-zero offset modifiers.")
      .add()
      .build();
   @Nonnull
   class="kw">public String indexNameArg = "Undefined";
   class="kw">public String numCirclePointsArg = "";
   class="kw">private int numCirclePointsArgVal = 3;
   class="kw">public String circleRadiusArg = "";
   class="kw">private int circleRadiusArgVal = 5;
   class="kw">private int previousCirclePointsVal = 3;
   class="kw">private int previousCircleRadiusVal = 5;
   class="kw">public boolean flipArg = false;
   class="kw">public boolean rotateArg = false;
   class="kw">private int repetitionsRemaining = -1;
   @Nonnull
   class="kw">private List<Vector3i> offsetsInCircle = new ObjectArrayList();
   @Nonnull
   class="kw">private class="kw">final Vector3i offsetWhenFirstReachedOperation = new Vector3i();
   @Nonnull
   class="kw">private class="kw">final Vector3i previousCircleOffset = new Vector3i();

   class="kw">public CircleOffsetFromArgOperation() {
      super(
         "Loop Previous And Set Offset In Circle",
         "Loops specified instructions and changes the offset after each loop in order to execute around a circle",
         false
      );
   }

   @Override
   class="kw">public void resetInternalState() {
      this.repetitionsRemaining = -1;
      this.offsetsInCircle.clear();
      this.offsetWhenFirstReachedOperation.zero();
      this.previousCircleOffset.zero();
      int var1 = this.numCirclePointsArgVal;
      int var2 = this.circleRadiusArgVal;
      double var3 = (Math.PI * 2) / var1;

      for (int var5 = 0; var5 < var1; var5++) {
         if (this.rotateArg) {
            this.offsetsInCircle
               .add(new Vector3i(this.doubleToNearestInt(var2 * Math.cos(var3 * var5)) * -1, 0, this.doubleToNearestInt(var2 * Math.sin(var3 * var5)) * -1));
         } else {
            this.offsetsInCircle
               .add(new Vector3i(this.doubleToNearestInt(var2 * Math.cos(var3 * var5)), 0, this.doubleToNearestInt(var2 * Math.sin(var3 * var5))));
         }
      }

      if (this.flipArg) {
         this.offsetsInCircle = this.offsetsInCircle.reversed();
      }
   }

   class="kw">private int doubleToNearestInt(double var1) {
      class="kw">return (int)Math.floor(var1 + 0.5);
   }

   @Override
   class="kw">public void modifyBrushConfig(
      @Nonnull Ref<EntityStore> var1, @Nonnull BrushConfig var2, @Nonnull BrushConfigCommandExecutor var3, @Nonnull ComponentAccessor<EntityStore> var4
   ) {
      if (this.repetitionsRemaining == -1) {
         BuilderTool var5 = BuilderTool.getActiveBuilderTool(var1, var4);
         if (var5 == null) {
            var2.setErrorFlag("CircleOffsetFromArg: No active builder tool");
            class="kw">return;
         }

         ItemStack var6 = InventoryComponent.getItemInHand(var4, var1);
         if (var6 == null) {
            var2.setErrorFlag("CircleOffsetFromArg: No item in hand");
            class="kw">return;
         }

         BuilderTool.ArgData var7 = var5.getItemArgData(var6);
         Map var8 = var7.tool();
         if (var8 == null || !var8.containsKey(this.numCirclePointsArg)) {
            var2.setErrorFlag("CircleOffsetFromArg: Tool arg '" + this.numCirclePointsArg + "' not found");
            class="kw">return;
         }

         if (!var8.containsKey(this.circleRadiusArg)) {
            var2.setErrorFlag("CircleOffsetFromArg: Tool arg '" + this.circleRadiusArg + "' not found");
            class="kw">return;
         }

         Object var9 = var8.get(this.numCirclePointsArg);
         Object var10 = var8.get(this.circleRadiusArg);
         if (!(var9 class="kw">instanceof Integer)) {
            var2.setErrorFlag("LoadCircleLoop: Tool arg '" + this.numCirclePointsArg + "' is not an Int type (found " + var9.getClass().getSimpleName() + ")");
            class="kw">return;
         }

         if (!(var10 class="kw">instanceof Integer)) {
            var2.setErrorFlag("LoadCircleLoop: Tool arg '" + this.circleRadiusArg + "' is not an Int type (found " + var10.getClass().getSimpleName() + ")");
            class="kw">return;
         }

         this.numCirclePointsArgVal = (Integer)var9;
         this.circleRadiusArgVal = (Integer)var10;
         this.previousCirclePointsVal = this.numCirclePointsArgVal;
         this.previousCircleRadiusVal = this.circleRadiusArgVal;
         this.resetInternalState();
         this.offsetWhenFirstReachedOperation.set(var2.getOriginOffset());
         if (this.numCirclePointsArgVal > 100) {
            var2.setErrorFlag("Cannot have more than 100 repetitions");
            class="kw">return;
         }

         this.repetitionsRemaining = this.numCirclePointsArgVal;
      }

      if (this.repetitionsRemaining == 0) {
         this.repetitionsRemaining = -1;
         var2.setOriginOffset(this.offsetWhenFirstReachedOperation);
      } else {
         Vector3i var11 = var2.getOriginOffset()
            .sub(this.previousCircleOffset)
            .add(new Vector3i((Vector3ic)this.offsetsInCircle.get(this.repetitionsRemaining - 1)));
         this.previousCircleOffset.set((Vector3ic)this.offsetsInCircle.get(this.repetitionsRemaining - 1));
         var2.setOriginOffset(var11);
         var3.loadOperatingIndex(this.indexNameArg, false);
         this.repetitionsRemaining--;
      }
   }
}