ToolOperation class

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

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

implements: TriIntObjPredicate<Void>

Поля (181)

МодификаторыТипИмя
final HytaleLogger LOGGER
break
break
break
break
break
break
break
break
break
break
break
break
break
break
break
break
break
return
PrototypePlayerBuilderToolSettings var1
var1
Object var1
var1
BuilderTool var10
double var10
int var10
int var10
Object var10
ItemStack var11
boolean var11
int var11
var11
BlockMask var11
var11
BuilderTool.ArgData var12
double var12
World var12
boolean var12
int var12
var12
BlockMask var12
var12
var12
Object var13
UUIDComponent var13
int var13
BlockMask var13
var13
var13
Object var14
float var14
PrototypePlayerBuilderToolSettings var14
int var14
BlockMask var14
var14
var14
Object var15
float var15
Vector3i var15
BlockMask var15
var15
var15
Object var16
int var16
Vector3d var16
int var16
var16
BlockMask var16
var16
var16
Object var17
BlockMask var17
Object var18
float var18
int var18
var18
Object var18
Object var19
int var19
Object var2
var2
int var2
Object var2
String var2
Object var20
int var20
int var20
var20
int var21
int var21
int var22
int var22
boolean var23
boolean var24
int[] var26
Vector3i var28
int var29
Transform var3
var3
var3
var3
var3
var3
var3
var3
int[] var3
int var3
boolean var3
BlockMask var3
int var30
int var31
int var32
var32
int var33
int var34
int var35
int var36
BlockSelection var37
Vector3i var38
Vector3i var39
World var4
World var4
int[] var4
int var4
Transform var4
Object var4
Object var4
Vector3d var40
Object var41
Object var42
BrushOrigin var43
boolean var44
int var45
var45
Transform var46
Vector3i var47
Vector3i var48
Vector3i var49
Player var5
ArrayList var5
HeadRotation var5
int[] var5
Transform var5
Object var5
BrushAxis var5
BuilderTool var5
PlayerRef var6
double var6
int var6
var6
var6
var6
var6
var6
var6
BrushAxis var6
HeadRotation var6
String var6
Object var6
UUIDComponent var7
int var7
int var7
var7
var7
var7
var7
var7
var7
Rotation var7
OperationFactory var7
Object var7
UUID var8
double var8
int var8
HeadRotation var8
Object var8
PrototypePlayerBuilderToolSettings var9
var9
int var9
int var9
Object var9

Методы (67)

МодификаторыВозвратСигнатура
abstract throw new Exceptionthrow new Exception("No tool found matching id " + var6)
abstract throw new IllegalStateExceptionthrow new IllegalStateException("No builder tool active on player")
abstract return new Vector3ireturn new Vector3i(this.x, this.y, this.z)
static int evenSnapSignint evenSnapSign(boolean var0, int var1, int var2, boolean var3, int var4)
public void executevoid execute(ComponentAccessor<EntityStore> var1)
public void executeAsBrushConfigvoid executeAsBrushConfig(@Nonnull PrototypePlayerBuilderToolSettings var1, @Nonnull BuilderToolOnUseInteraction var2, ComponentAccessor<EntityStore> var3)
public void executeAtvoid executeAt(int var1, int var2, int var3, ComponentAccessor<EntityStore> var4)
abstract abstract boolean executeBlockboolean executeBlock(int var1, int var2, int var3)
static void executeShapeOperationvoid executeShapeOperation(int var0, int var1, int var2, @Nonnull TriIntObjPredicate<Void> var3, @Nonnull BrushShape var4, int var5, int var6, int var7, boolean var8)
abstract executeShapeOperation executeShapeOperation(this.x, this.y, this.z, this, this.shape, this.shapeRange, this.shapeHeight, this.shapeThickness, this.capped)
abstract executeShapeOperation executeShapeOperation(var1, var2, var3, this, this.shape, this.shapeRange, this.shapeHeight, this.shapeThickness, this.capped)
for for(int var17 = 1; var17 <= var16; var17++)
for for(int var13 = -1; var13 <= 1; var13 += 2)
for for(int var14 = -1; var14 <= 1; var14 += 2)
for for(int var15 = -1; var15 <= 1; var15 += 2)
for for(int var10 = 0; var10 < var6; var10++)
public int getBrushHeightint getBrushHeight()
public Transform getBrushRotationTransform getBrushRotation(ComponentAccessor<EntityStore> var1)
public int getBrushSpacingint getBrushSpacing()
public int getBrushWidthint getBrushWidth()
static Transform getMirrorTransform getMirror(@Nonnull Ref<EntityStore> var0, @Nonnull BuilderTool.ArgData var1, @Nonnull Vector3i var2, @Nonnull ComponentAccessor<EntityStore> var3)
static int[] getRotatedEvenSnapAxesint[] getRotatedEvenSnapAxes(String var0, boolean var1, boolean var2)
static Transform getRotationTransform getRotation(@Nonnull Ref<EntityStore> var0, @Nonnull BuilderTool.ArgData var1, @Nonnull Vector3i var2, @Nonnull ComponentAccessor<EntityStore> var3)
static Transform getTransformTransform getTransform(@Nonnull Ref<EntityStore> var0, @Nonnull BuilderTool.ArgData var1, @Nonnull Vector3i var2, @Nonnull ComponentAccessor<EntityStore> var3)
if if(var9 == null)
if if(var28 != null)
if if(var26[0] > 0 && var40.x - var28.x >= 0.5)
if if(var26[1] > 0 && var40.y - var28.y >= 0.5)
if if(var26[2] > 0 && var40.z - var28.z >= 0.5)
if if(this.shape == BrushShape.Torus)
if if(var1 == null)
if if(var0 == null)
if if(var4 == 0)
if if(var12 <= var15)
if if(var2 instanceof String var4)
if if(var15 == null)
if if(var11 != null)
if if(var16 != null)
if if(this.transform == Transform.NONE)
if if(var5 <= 1 && var6 <= 1 && var4 != BrushShape.Torus)
if if(var9 < 1 && var4 != BrushShape.Torus)
if if(var10 < 1)
if if(var3 != BrushOrigin.Lowest && var3 != BrushOrigin.Highest)
if if(var5 instanceof Rotate var23)
if if(var0 && var1 != 0)
if if(var6 == BrushAxis.Auto)
if if(var5 == BrushAxis.Auto)
if if(var5 == null)
if if(var7 == null)
if if(var0 == null)
if if(var18 != null)
if if(var6 != null)
if if(var7 != null)
if if(var8 != null)
if if(var9 != null)
if if(var10 != null)
if if(var17 != null)
if if(var3 != null && var3 != BlockMask.EMPTY)
abstract return parseMaskEntriesreturn parseMaskEntries(var5, var1)
static void rotate90void rotate90(int[] var0, int var1)
abstract rotate90 rotate90(var3, var7)
abstract rotate90 rotate90(var4, var7)
abstract rotate90 rotate90(var5, var7)
public boolean showEditNotificationboolean showEditNotification()
switch switch(var4)
switch switch(var1)
final boolean testboolean test(int var1, int var2, int var3, Void var4)

Исходный код

Показать/скрыть
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.EditOperation;
class="kw">import com.hypixel.hytale.builtin.buildertools.PrototypePlayerBuilderToolSettings;
class="kw">import com.hypixel.hytale.builtin.buildertools.tooloperations.transform.Mirror;
class="kw">import com.hypixel.hytale.builtin.buildertools.tooloperations.transform.Rotate;
class="kw">import com.hypixel.hytale.builtin.buildertools.tooloperations.transform.Transform;
class="kw">import com.hypixel.hytale.component.ComponentAccessor;
class="kw">import com.hypixel.hytale.component.Ref;
class="kw">import com.hypixel.hytale.function.predicate.TriIntObjPredicate;
class="kw">import com.hypixel.hytale.logger.HytaleLogger;
class="kw">import com.hypixel.hytale.math.block.BlockConeUtil;
class="kw">import com.hypixel.hytale.math.block.BlockCubeUtil;
class="kw">import com.hypixel.hytale.math.block.BlockCylinderUtil;
class="kw">import com.hypixel.hytale.math.block.BlockDiamondUtil;
class="kw">import com.hypixel.hytale.math.block.BlockDomeUtil;
class="kw">import com.hypixel.hytale.math.block.BlockInvertedDomeUtil;
class="kw">import com.hypixel.hytale.math.block.BlockPyramidUtil;
class="kw">import com.hypixel.hytale.math.block.BlockSphereUtil;
class="kw">import com.hypixel.hytale.math.block.BlockTorusUtil;
class="kw">import com.hypixel.hytale.protocol.InteractionType;
class="kw">import com.hypixel.hytale.protocol.Rotation;
class="kw">import com.hypixel.hytale.protocol.packets.buildertools.BrushAxis;
class="kw">import com.hypixel.hytale.protocol.packets.buildertools.BrushOrigin;
class="kw">import com.hypixel.hytale.protocol.packets.buildertools.BrushShape;
class="kw">import com.hypixel.hytale.protocol.packets.buildertools.BuilderToolOnUseInteraction;
class="kw">import com.hypixel.hytale.server.core.asset.type.buildertool.config.BuilderTool;
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.inventory.InventoryComponent;
class="kw">import com.hypixel.hytale.server.core.inventory.ItemStack;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.HeadRotation;
class="kw">import com.hypixel.hytale.server.core.prefab.selection.mask.BlockFilter;
class="kw">import com.hypixel.hytale.server.core.prefab.selection.mask.BlockMask;
class="kw">import com.hypixel.hytale.server.core.prefab.selection.mask.BlockPattern;
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.storage.EntityStore;
class="kw">import com.hypixel.hytale.server.core.util.TargetUtil;
class="kw">import java.util.ArrayList;
class="kw">import java.util.List;
class="kw">import java.util.Locale;
class="kw">import java.util.Map;
class="kw">import java.util.Random;
class="kw">import java.util.UUID;
class="kw">import java.util.concurrent.ConcurrentHashMap;
class="kw">import java.util.logging.Level;
class="kw">import java.util.regex.Pattern;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;
class="kw">import org.joml.Vector3d;
class="kw">import org.joml.Vector3i;

class="kw">public class="kw">abstract class ToolOperation class="kw">implements TriIntObjPredicate<Void> {
   class="kw">private class="kw">static class="kw">final HytaleLogger LOGGER = HytaleLogger.forEnclosingClass();
   class="kw">protected class="kw">static class="kw">final int RANDOM_MAX = 100;
   @Nonnull
   class="kw">public class="kw">static class="kw">final Map<String, OperationFactory> OPERATIONS = new ConcurrentHashMap<>();
   @Nonnull
   class="kw">public class="kw">static class="kw">final Map<UUID, PrototypePlayerBuilderToolSettings> PROTOTYPE_TOOL_SETTINGS = new ConcurrentHashMap<>();
   class="kw">public class="kw">static class="kw">final double MAX_DISTANCE = 400.0;
   class="kw">public class="kw">static class="kw">final int DEFAULT_BRUSH_SPACING = 0;
   class="kw">private class="kw">static class="kw">final Pattern NEWLINES_PATTERN = Pattern.compile("\\r?\\n");
   class="kw">protected class="kw">final int x;
   class="kw">protected class="kw">final int y;
   class="kw">protected class="kw">final int z;
   class="kw">protected class="kw">final InteractionType interactionType;
   class="kw">protected class="kw">final int shapeRange;
   class="kw">protected class="kw">final int shapeHeight;
   class="kw">protected class="kw">final int shapeThickness;
   class="kw">protected class="kw">final boolean capped;
   class="kw">protected class="kw">final int originOffsetX;
   class="kw">protected class="kw">final int originOffsetY;
   class="kw">protected class="kw">final int originOffsetZ;
   class="kw">protected class="kw">final BrushShape shape;
   class="kw">protected class="kw">final BlockPattern pattern;
   class="kw">protected class="kw">final int density;
   class="kw">protected class="kw">final int spacing;
   @Nonnull
   class="kw">protected class="kw">final EditOperation edit;
   @Nonnull
   class="kw">protected class="kw">final BuilderTool.ArgData args;
   @Nonnull
   class="kw">protected class="kw">final Random random;
   @Nonnull
   class="kw">protected class="kw">final Player player;
   @Nonnull
   class="kw">protected class="kw">final PlayerRef playerRef;
   @Nonnull
   class="kw">protected class="kw">final Ref<EntityStore> playerEntityRef;
   @Nonnull
   class="kw">protected class="kw">final BuilderToolsPlugin.BuilderState builderState;
   class="kw">private Transform transform;
   class="kw">private class="kw">final Vector3i vector = new Vector3i();
   class="kw">protected int currentCenterX;
   class="kw">protected int currentCenterY;
   class="kw">protected int currentCenterZ;
   @Nullable
   class="kw">private class="kw">final BlockMask mask;

   class="kw">public ToolOperation(@Nonnull Ref<EntityStore> var1, @Nonnull BuilderToolOnUseInteraction var2, @Nonnull ComponentAccessor<EntityStore> var3) {
      this.playerEntityRef = var1;
      World var4 = var3.getExternalData().getWorld();
      Player var5 = var3.getComponent(var1, Player.getComponentType());
      assert var5 != null;
      PlayerRef var6 = var3.getComponent(var1, PlayerRef.getComponentType());
      assert var6 != null;
      this.player = var5;
      this.playerRef = var6;
      this.builderState = BuilderToolsPlugin.getState(var5, var6);
      UUIDComponent var7 = var3.getComponent(var1, UUIDComponent.getComponentType());
      assert var7 != null;
      UUID var8 = var7.getUuid();
      PrototypePlayerBuilderToolSettings var9 = PROTOTYPE_TOOL_SETTINGS.get(var8);
      if (var9 == null) {
         var9 = new PrototypePlayerBuilderToolSettings(var8);
         PROTOTYPE_TOOL_SETTINGS.put(var8, var9);
      }

      var9.setMaxLengthOfIgnoredPaintOperations(var2.maxLengthToolIgnoreHistory);
      if (!var2.isHoldDownInteraction && (this class="kw">instanceof PaintOperation || this class="kw">instanceof SculptOperation)) {
         var9.getIgnoredPaintOperations().clear();
         var9.clearLastBrushPosition();
      }

      BuilderTool var10 = BuilderTool.getActiveBuilderTool(var1, var3);
      ItemStack var11 = InventoryComponent.getItemInHand(var3, var1);
      BuilderTool.ArgData var12 = this.args = var10.getItemArgData(var11);
      Object var13 = var12.tool().get("builtin_Width");
      Object var14 = var12.tool().get("builtin_Height");
      Object var15 = var12.tool().get("builtin_Thickness");
      Object var16 = var12.tool().get("builtin_Capped");
      Object var17 = var12.tool().get("builtin_Shape");
      Object var18 = var12.tool().get("builtin_Density");
      Object var19 = var12.tool().get("builtin_Spacing");
      Object var20 = var12.tool().get("builtin_Material");
      int var21 = var13 != null ? (Integer)var13 : 5;
      int var22 = var14 != null ? (Integer)var14 : 5;
      boolean var23 = var21 % 2 == 0;
      boolean var24 = var22 % 2 == 0;
      int[] var26 = getRotatedEvenSnapAxes(var12.tool().get("builtin_RotationFace") class="kw">instanceof String var27 ? var27 : "Up", var23, var24);
      if (var2.isDoServerRaytraceForPosition && (this class="kw">instanceof PaintOperation || this class="kw">instanceof SculptOperation)) {
         Vector3d var40 = new Vector3d();
         Vector3i var28 = this.getTargetBlockAvoidingPaint(
            var1,
            400.0,
            var3,
            var2.raycastOriginX,
            var2.raycastOriginY,
            var2.raycastOriginZ,
            var2.raycastDirectionX,
            var2.raycastDirectionY,
            var2.raycastDirectionZ,
            var40
         );
         if (var28 != null) {
            int var29 = var28.x + var2.offsetForPaintModeX;
            int var30 = var28.y + var2.offsetForPaintModeY;
            int var31 = var28.z + var2.offsetForPaintModeZ;
            if (var26[0] > 0 && var40.x - var28.x >= 0.5) {
               var29++;
            } else if (var26[0] < 0 && var40.x - var28.x < 0.5) {
               var29--;
            }

            if (var26[1] > 0 && var40.y - var28.y >= 0.5) {
               var30++;
            } else if (var26[1] < 0 && var40.y - var28.y < 0.5) {
               var30--;
            }

            if (var26[2] > 0 && var40.z - var28.z >= 0.5) {
               var31++;
            } else if (var26[2] < 0 && var40.z - var28.z < 0.5) {
               var31--;
            }

            this.x = var29;
            this.y = var30;
            this.z = var31;
         } else {
            this.x = var2.x;
            this.y = var2.y;
            this.z = var2.z;
         }
      } else {
         this.x = var2.x;
         this.y = var2.y;
         this.z = var2.z;
      }

      this.interactionType = var2.type;
      this.transform = getTransform(var1, var12, this.vector, var3);
      this.shapeRange = var21;
      this.shapeHeight = var22;
      this.shapeThickness = var15 != null ? (Integer)var15 : 0;
      this.capped = var16 != null ? (Boolean)var16 : false;
      this.shape = var17 != null ? BrushShape.valueOf((String)var17) : BrushShape.Sphere;
      this.density = var18 != null ? (Integer)var18 : 100;
      this.spacing = var19 != null ? (Integer)var19 : 0;
      this.pattern = var20 != null ? (BlockPattern)var20 : BlockPattern.EMPTY;
      this.mask = combineMasks(var12, this.builderState.getGlobalMask());
      Object var41 = var12.tool().get("builtin_Origin");
      Object var42 = var12.tool().get("builtin_OriginRotation");
      BrushOrigin var43 = var41 != null ? BrushOrigin.valueOf((String)var41) : BrushOrigin.Center;
      boolean var44 = var42 != null ? (Boolean)var42 : false;
      int var45 = this.shapeRange;
      int var32 = this.shapeHeight;
      if (this.shape == BrushShape.Torus) {
         int var33 = this.shapeRange / 2;
         int var34 = Math.max(1, this.shapeHeight / 4);
         int var35 = Math.max(1, var33 - var34);
         int var36 = var35 + var34;
         var45 = this.shapeRange % 2 == 0 ? var36 * 2 : var36 * 2 + 1;
         var32 = this.shapeHeight % 2 == 0 ? var34 * 2 : var34 * 2 + 1;
      }

      Transform var46 = this.getBrushRotation(var3);
      Vector3i var47 = getOffsets(var45, var32, var44, var43, this.transform, var46, this.vector);
      this.originOffsetX = var47.x();
      this.originOffsetY = var47.y();
      this.originOffsetZ = var47.z();
      this.random = this.builderState.getRandom();
      this.currentCenterX = this.x;
      this.currentCenterY = this.y;
      this.currentCenterZ = this.z;
      Vector3i var48 = new Vector3i(this.x - this.shapeRange, this.y - this.shapeHeight, this.z - this.shapeRange);
      Vector3i var49 = new Vector3i(this.x + this.shapeRange, this.y + this.shapeHeight, this.z + this.shapeRange);
      BlockSelection var37 = BuilderToolsPlugin.getMaskSelection(this.builderState.getSelection());
      Vector3i var38 = var37 == null ? null : var37.getSelectionMin();
      Vector3i var39 = var37 == null ? null : var37.getSelectionMax();
      this.edit = new EditOperation(var4, this.x, this.y, this.z, this.shapeRange, var48, var49, var38, var39, this.mask);
   }

   @Nonnull
   class="kw">public class="kw">static PrototypePlayerBuilderToolSettings getOrCreatePrototypeSettings(UUID var0) {
      PrototypePlayerBuilderToolSettings var1 = PROTOTYPE_TOOL_SETTINGS.get(var0);
      if (var1 == null) {
         var1 = new PrototypePlayerBuilderToolSettings(var0);
         PROTOTYPE_TOOL_SETTINGS.put(var0, var1);
      }

      class="kw">return var1;
   }

   @Nonnull
   class="kw">public class="kw">static List<Vector3i> calculateInterpolatedPositions(@Nullable Vector3i var0, @Nonnull Vector3i var1, int var2, int var3, int var4) {
      ArrayList var5 = new ArrayList<>();
      if (var0 == null) {
         var5.add(var1);
         class="kw">return var5;
      }

      double var6 = var1.x() - var0.x();
      double var8 = var1.y() - var0.y();
      double var10 = var1.z() - var0.z();
      double var12 = Math.sqrt(var6 * var6 + var8 * var8 + var10 * var10);
      if (var4 == 0) {
         float var14 = Math.max(var2, var3);
         float var15 = Math.max(1.0F, var14 * 0.5F);
         if (var12 <= var15) {
            var5.add(var1);
            class="kw">return var5;
         }

         int var16 = (int)Math.ceil(var12 / var15);

         for (int var17 = 1; var17 <= var16; var17++) {
            float var18 = (float)var17 / var16;
            int var19 = (int)Math.round(var0.x() + var6 * var18);
            int var20 = (int)Math.round(var0.y() + var8 * var18);
            int var21 = (int)Math.round(var0.z() + var10 * var18);
            var5.add(new Vector3i(var19, var20, var21));
         }
      } else if (var12 >= var4) {
         var5.add(var1);
      }

      class="kw">return var5;
   }

   @Nonnull
   class="kw">public Vector3i getPosition() {
      class="kw">return new Vector3i(this.x, this.y, this.z);
   }

   class="kw">public int getBrushWidth() {
      class="kw">return this.shapeRange;
   }

   class="kw">public int getBrushHeight() {
      class="kw">return this.shapeHeight;
   }

   class="kw">public int getBrushSpacing() {
      Object var1 = this.args.tool().get("builtin_BrushSpacing");
      class="kw">return var1 class="kw">instanceof Number ? ((Number)var1).intValue() : 0;
   }

   class="kw">public Transform getBrushRotation(ComponentAccessor<EntityStore> var1) {
      Object var2 = this.args.tool().get("builtin_RotationFace");
      Transform var3 = Transform.NONE;
      if (var2 class="kw">instanceof String var4) {
         if (var4.equalsIgnoreCase("down")) {
            var3 = Rotate.forAxisAndAngle(BrushAxis.X, Rotation.OneEighty);
         } else if (var4.equalsIgnoreCase("north")) {
            var3 = Rotate.forAxisAndAngle(BrushAxis.X, Rotation.TwoSeventy);
         } else if (var4.equalsIgnoreCase("south")) {
            var3 = Rotate.forAxisAndAngle(BrushAxis.X, Rotation.Ninety);
         } else if (var4.equalsIgnoreCase("east")) {
            var3 = Rotate.forAxisAndAngle(BrushAxis.Z, Rotation.TwoSeventy);
         } else if (var4.equalsIgnoreCase("west")) {
            var3 = Rotate.forAxisAndAngle(BrushAxis.Z, Rotation.Ninety);
         } else if (var4.equalsIgnoreCase("camera")) {
            HeadRotation var5 = var1.getComponent(this.playerEntityRef, HeadRotation.getComponentType());
            assert var5 != null;
            var3 = Rotate.forDirection(var5.getAxisDirection(), Rotation.None);
         }
      }

      class="kw">return var3;
   }

   class="kw">public void executeAsBrushConfig(
      @Nonnull PrototypePlayerBuilderToolSettings var1, @Nonnull BuilderToolOnUseInteraction var2, ComponentAccessor<EntityStore> var3
   ) {
      World var4 = var3.getExternalData().getWorld();
      var1.setUndoGroupSize(var2.undoGroupSize);
      var1.getBrushConfigCommandExecutor()
         .execute(this.playerEntityRef, var4, new Vector3i(this.x, this.y, this.z), var2.isHoldDownInteraction, var2.type, var2x -> {
            var2x.setPattern(this.pattern);
            var2x.setDensity(this.density);
            var2x.setShapeHeight(this.shapeHeight);
            var2x.setShapeWidth(this.shapeRange);
            var2x.setShape(this.shape);
            var2x.setCapped(this.capped);
            var2x.setTransform(this.getBrushRotation(var3));
            var2x.setTransformOrigin(new Vector3i(this.x, this.y, this.z));
            var2x.modifyOriginOffset(new Vector3i(this.originOffsetX, this.originOffsetY, this.originOffsetZ));
            var2x.setBrushMask(this.mask);
            var2x.setShapeThickness(this.shapeThickness);
         }, var3);
   }

   @Nullable
   class="kw">public Vector3i getTargetBlockAvoidingPaint(
      @Nonnull Ref<EntityStore> var1,
      double var2,
      @Nonnull ComponentAccessor<EntityStore> var4,
      float var5,
      float var6,
      float var7,
      float var8,
      float var9,
      float var10
   ) {
      class="kw">return this.getTargetBlockAvoidingPaint(var1, var2, var4, var5, var6, var7, var8, var9, var10, null);
   }

   @Nullable
   class="kw">public Vector3i getTargetBlockAvoidingPaint(
      @Nonnull Ref<EntityStore> var1,
      double var2,
      @Nonnull ComponentAccessor<EntityStore> var4,
      float var5,
      float var6,
      float var7,
      float var8,
      float var9,
      float var10,
      @Nullable Vector3d var11
   ) {
      World var12 = var4.getExternalData().getWorld();
      UUIDComponent var13 = var4.getComponent(var1, UUIDComponent.getComponentType());
      assert var13 != null;
      PrototypePlayerBuilderToolSettings var14 = PROTOTYPE_TOOL_SETTINGS.get(var13.getUuid());
      if (var14 == null || var14.getIgnoredPaintOperations().isEmpty()) {
         Vector3i var15 = TargetUtil.getTargetBlock(var12, (var0, var1x) -> var0 != 0, var5, var6, var7, var8, var9, var10, var2);
         if (var15 == null) {
            class="kw">return null;
         }

         if (var11 != null) {
            Vector3d var16 = TargetUtil.getTargetLocation(var12, var0 -> var0 != 0, var5, var6, var7, var8, var9, var10, var2);
            if (var16 != null) {
               var11.x = var16.x;
               var11.y = var16.y;
               var11.z = var16.z;
            }
         }

         class="kw">return var15;
      } else {
         class="kw">return var11 != null
            ? TargetUtil.getTargetBlockAvoidLocations(
               var12, var0 -> var0 != 0, var5, var6, var7, var8, var9, var10, var2, var14.getIgnoredPaintOperations(), var11
            )
            : TargetUtil.getTargetBlockAvoidLocations(var12, var0 -> var0 != 0, var5, var6, var7, var8, var9, var10, var2, var14.getIgnoredPaintOperations());
      }
   }

   @Nonnull
   class="kw">public EditOperation getEditOperation() {
      class="kw">return this.edit;
   }

   class="kw">public class="kw">final boolean test(int var1, int var2, int var3, Void var4) {
      if (this.transform == Transform.NONE) {
         class="kw">return this.executeBlock(var1 + this.originOffsetX, var2 + this.originOffsetY, var3 + this.originOffsetZ);
      }

      this.vector.set(var1 - this.currentCenterX, var2 - this.currentCenterY, var3 - this.currentCenterZ);
      this.transform.apply(this.vector);
      var1 = this.currentCenterX + this.originOffsetX + this.vector.x;
      var2 = this.currentCenterY + this.originOffsetY + this.vector.y;
      var3 = this.currentCenterZ + this.originOffsetZ + this.vector.z;
      class="kw">return this.executeBlock(var1, var2, var3);
   }

   class="kw">public boolean showEditNotification() {
      class="kw">return true;
   }

   class="kw">protected class="kw">abstract boolean executeBlock(int var1, int var2, int var3);

   class="kw">public void execute(ComponentAccessor<EntityStore> var1) {
      executeShapeOperation(this.x, this.y, this.z, this, this.shape, this.shapeRange, this.shapeHeight, this.shapeThickness, this.capped);
   }

   class="kw">public void executeAt(int var1, int var2, int var3, ComponentAccessor<EntityStore> var4) {
      this.currentCenterX = var1;
      this.currentCenterY = var2;
      this.currentCenterZ = var3;
      executeShapeOperation(var1, var2, var3, this, this.shape, this.shapeRange, this.shapeHeight, this.shapeThickness, this.capped);
   }

   class="kw">public class="kw">static void executeShapeOperation(
      int var0, int var1, int var2, @Nonnull TriIntObjPredicate<Void> var3, @Nonnull BrushShape var4, int var5, int var6, int var7, boolean var8
   ) {
      if (var5 <= 1 && var6 <= 1 && var4 != BrushShape.Torus) {
         var3.test(var0, var1, var2, null);
      } else {
         int var9 = var5 / 2;
         int var10 = var6 / 2;
         boolean var11 = var5 % 2 == 0;
         boolean var12 = var6 % 2 == 0;
         if (var9 < 1 && var4 != BrushShape.Torus) {
            BlockCubeUtil.forEachBlock(var0, var1, var2, 0, var6, 0, false, var12, null, var3);
            class="kw">return;
         }

         class="kw">switch (var4) {
            case Cube:
            class="kw">default:
               BlockCubeUtil.forEachBlock(var0, var1, var2, var9, var6, var9, var7, var8, var8, false, var11, var12, null, var3);
               break;
            case Sphere:
               if (var10 < 1) {
                  BlockCylinderUtil.forEachBlock(var0, var1, var2, var9, var6, var9, var7, var8, var11, false, null, var3);
               } else {
                  BlockSphereUtil.forEachBlock(var0, var1, var2, var9, var10, var9, var7, var11, var12, null, var3);
               }
               break;
            case Cylinder:
               BlockCylinderUtil.forEachBlock(var0, var1 - var10, var2, var9, var6, var9, var7, var8, var11, var12, null, var3);
               break;
            case Cone:
               BlockConeUtil.forEachBlock(var0, var1 - var10, var2, var9, var6, var9, var7, var8, var11, var12, null, var3);
               break;
            case InvertedCone:
               BlockConeUtil.forEachBlockInverted(var0, var1 - var10, var2, var9, var6, var9, var7, var8, var11, var12, null, var3);
               break;
            case Pyramid:
               BlockPyramidUtil.forEachBlock(var0, var1 - var10, var2, var9, var6, var9, var7, var8, var11, var12, null, var3);
               break;
            case InvertedPyramid:
               BlockPyramidUtil.forEachBlockInverted(var0, var1 - var10, var2, var9, var6, var9, var7, var8, var11, var12, null, var3);
               break;
            case Dome:
               BlockDomeUtil.forEachBlock(var0, var1 - var10, var2, var9, var6, var9, var7, var8, var11, var12, null, var3);
               break;
            case InvertedDome:
               BlockInvertedDomeUtil.forEachBlock(var0, var1 + (var6 - 1) / 2, var2, var9, var6, var9, var7, var8, var11, var12, null, var3);
               break;
            case Diamond:
               BlockDiamondUtil.forEachBlock(var0, var1, var2, var9, var6 / 2, var9, var7, var8, var11, var12, null, var3);
               break;
            case Torus:
               int var13 = Math.max(1, var6 / 4);
               int var14 = Math.max(1, var9);
               BlockTorusUtil.forEachBlock(var0, var1, var2, var14, var13, var7, var8, var11, var12, null, var3);
         }
      }
   }

   @Nonnull
   class="kw">private class="kw">static Vector3i getOffsets(
      int var0, int var1, boolean var2, BrushOrigin var3, @Nonnull Transform var4, @Nonnull Transform var5, @Nonnull Vector3i var6
   ) {
      int var7 = var1 / 2;
      int var8 = var2 ? var0 / 2 : 0;
      if (var3 != BrushOrigin.Lowest && var3 != BrushOrigin.Highest) {
         var6.set(0, var7, 0);
         var4.apply(var6);
         int var16 = var6.x();
         int var18 = var6.z();
         var6.set(var8, var7, -var8);
         var4.apply(var6);
         int var20 = var6.y();
         var16 = var3 == BrushOrigin.Center ? 0 : (var3 == BrushOrigin.Bottom ? var16 : -var16);
         var20 = var3 == BrushOrigin.Center ? 0 : (var3 == BrushOrigin.Bottom ? var20 : -var20);
         var18 = var3 == BrushOrigin.Center ? 0 : (var3 == BrushOrigin.Bottom ? var18 : -var18);
         class="kw">return var6.set(var16, var20, var18);
      }

      int var9 = var0 / 2;
      int var10 = (var0 - 1) / 2;
      int var11 = Integer.MAX_VALUE;
      int var12 = Integer.MIN_VALUE;

      for (int var13 = -1; var13 <= 1; var13 += 2) {
         for (int var14 = -1; var14 <= 1; var14 += 2) {
            for (int var15 = -1; var15 <= 1; var15 += 2) {
               var6.set(var13 < 0 ? -var9 : var10, var14 < 0 ? -var7 : var7, var15 < 0 ? -var9 : var10);
               var5.apply(var6);
               var11 = Math.min(var11, var6.y());
               var12 = Math.max(var12, var6.y());
            }
         }
      }

      int var22 = var3 == BrushOrigin.Lowest ? -var11 : -var12;
      var6.set(0, var22, 0);
      if (var5 class="kw">instanceof Rotate var23) {
         var23.inverse().apply(var6);
      }

      class="kw">return var6;
   }

   class="kw">private class="kw">static int[] getRotatedEvenSnapAxes(String var0, boolean var1, boolean var2) {
      int[] var3 = new int[]{1, 0, 0};
      int[] var4 = new int[]{0, 1, 0};
      int[] var5 = new int[]{0, 0, 1};
      int var6;
      int var7;
      class="kw">switch (var0.toLowerCase(Locale.ROOT)) {
         case "down":
            var7 = 0;
            var6 = 2;
            break;
         case "north":
            var7 = 0;
            var6 = 3;
            break;
         case "south":
            var7 = 0;
            var6 = 1;
            break;
         case "east":
            var7 = 2;
            var6 = 3;
            break;
         case "west":
            var7 = 2;
            var6 = 1;
            break;
         class="kw">default:
            var7 = 0;
            var6 = 0;
      }

      for (int var10 = 0; var10 < var6; var10++) {
         rotate90(var3, var7);
         rotate90(var4, var7);
         rotate90(var5, var7);
      }

      class="kw">return new int[]{
         evenSnapSign(var1, var3[0], var5[0], var2, var4[0]),
         evenSnapSign(var1, var3[1], var5[1], var2, var4[1]),
         evenSnapSign(var1, var3[2], var5[2], var2, var4[2])
      };
   }

   class="kw">private class="kw">static void rotate90(int[] var0, int var1) {
      class="kw">switch (var1) {
         case 0: {
            int var4 = var0[1];
            var0[1] = -var0[2];
            var0[2] = var4;
            break;
         }
         case 1: {
            int var3 = var0[0];
            var0[0] = var0[2];
            var0[2] = -var3;
            break;
         }
         case 2: {
            int var2 = var0[0];
            var0[0] = -var0[1];
            var0[1] = var2;
         }
      }
   }

   class="kw">private class="kw">static int evenSnapSign(boolean var0, int var1, int var2, boolean var3, int var4) {
      if (var0 && var1 != 0) {
         class="kw">return var1;
      } else if (var0 && var2 != 0) {
         class="kw">return var2;
      } else {
         class="kw">return var3 && var4 != 0 ? var4 : 0;
      }
   }

   class="kw">private class="kw">static Transform getTransform(
      @Nonnull Ref<EntityStore> var0, @Nonnull BuilderTool.ArgData var1, @Nonnull Vector3i var2, @Nonnull ComponentAccessor<EntityStore> var3
   ) {
      Transform var4 = getRotation(var0, var1, var2, var3);
      Transform var5 = getMirror(var0, var1, var2, var3);
      class="kw">return var4.then(var5);
   }

   class="kw">private class="kw">static Transform getRotation(
      @Nonnull Ref<EntityStore> var0, @Nonnull BuilderTool.ArgData var1, @Nonnull Vector3i var2, @Nonnull ComponentAccessor<EntityStore> var3
   ) {
      Object var4 = var1.tool().get("builtin_RotationAxis");
      Object var5 = var1.tool().get("builtin_RotationAngle");
      BrushAxis var6 = var4 != null ? BrushAxis.valueOf((String)var4) : BrushAxis.None;
      Rotation var7 = var5 != null ? Rotation.valueOf((String)var5) : Rotation.None;
      if (var6 == BrushAxis.Auto) {
         HeadRotation var8 = var3.getComponent(var0, HeadRotation.getComponentType());
         assert var8 != null;
         class="kw">return Rotate.forDirection(var8.getAxisDirection(var2), var7);
      } else {
         class="kw">return Rotate.forAxisAndAngle(var6, var7);
      }
   }

   class="kw">private class="kw">static Transform getMirror(
      @Nonnull Ref<EntityStore> var0, @Nonnull BuilderTool.ArgData var1, @Nonnull Vector3i var2, @Nonnull ComponentAccessor<EntityStore> var3
   ) {
      Object var4 = var1.tool().get("builtin_MirrorAxis");
      BrushAxis var5 = var4 != null ? BrushAxis.valueOf((String)var4) : BrushAxis.None;
      if (var5 == BrushAxis.Auto) {
         HeadRotation var6 = var3.getComponent(var0, HeadRotation.getComponentType());
         assert var6 != null;
         class="kw">return Mirror.forDirection(var6.getAxisDirection(var2), false);
      } else {
         class="kw">return Mirror.forAxis(var5);
      }
   }

   @Nonnull
   class="kw">public class="kw">static ToolOperation fromPacket(
      @Nonnull Ref<EntityStore> var0,
      @Nonnull Player var1,
      @Nonnull PlayerRef var2,
      @Nonnull BuilderToolOnUseInteraction var3,
      @Nonnull ComponentAccessor<EntityStore> var4
   ) class="kw">throws Exception {
      BuilderTool var5 = BuilderTool.getActiveBuilderTool(var0, var4);
      if (var5 == null) {
         throw new IllegalStateException("No builder tool active on player");
      } else {
         String var6 = var5.getId();
         OperationFactory var7 = OPERATIONS.get(var6);
         if (var7 == null) {
            throw new Exception("No tool found matching id " + var6);
         } else {
            class="kw">return var7.create(var0, var1, var2, var3, var4);
         }
      }
   }

   @Nullable
   class="kw">public class="kw">static BlockMask combineMasks(@Nullable BuilderTool.ArgData var0, @Nullable BlockMask var1) {
      if (var0 == null) {
         class="kw">return var1;
      } else {
         Object var2 = var0.tool().get("builtin_InvertMask");
         boolean var3 = var2 != null ? (Boolean)var2 : false;
         if (var0.tool().get("builtin_MaskEntries") class="kw">instanceof String var5 && !var5.isEmpty()) {
            class="kw">return parseMaskEntries(var5, var1);
         } else {
            Object var18 = var0.tool().get("builtin_Mask");
            Object var6 = var0.tool().get("builtin_MaskAbove");
            Object var7 = var0.tool().get("builtin_MaskNot");
            Object var8 = var0.tool().get("builtin_MaskBelow");
            Object var9 = var0.tool().get("builtin_MaskAdjacent");
            Object var10 = var0.tool().get("builtin_MaskNeighbor");
            BlockMask var11 = BlockMask.EMPTY;
            BlockMask var12 = BlockMask.EMPTY;
            BlockMask var13 = BlockMask.EMPTY;
            BlockMask var14 = BlockMask.EMPTY;
            BlockMask var15 = BlockMask.EMPTY;
            BlockMask var16 = BlockMask.EMPTY;
            if (var18 != null) {
               var11 = (BlockMask)var18;
            }

            if (var6 != null) {
               var12 = (BlockMask)var6;
               var12 = var12.withOptions(BlockFilter.FilterType.AboveBlock, false);
            }

            if (var7 != null) {
               var13 = (BlockMask)var7;
               var13 = var13.withOptions(BlockFilter.FilterType.TargetBlock, true);
            }

            if (var8 != null) {
               var14 = (BlockMask)var8;
               var14 = var14.withOptions(BlockFilter.FilterType.BelowBlock, false);
            }

            if (var9 != null) {
               var15 = (BlockMask)var9;
               var15 = var15.withOptions(BlockFilter.FilterType.AdjacentBlock, false);
            }

            if (var10 != null) {
               var16 = (BlockMask)var10;
               var16 = var16.withOptions(BlockFilter.FilterType.NeighborBlock, false);
            }

            BlockMask var17 = BlockMask.combine(var11, var12, var13, var14, var15, var16, var1);
            if (var17 != null) {
               var17.setInverted(var3);
            }

            class="kw">return var17;
         }
      }
   }

   @Nullable
   class="kw">private class="kw">static BlockMask parseMaskEntries(@Nonnull String var0, @Nullable BlockMask var1) {
      try {
         String var2 = var0.replace("{", "").replace("}", "");
         BlockMask var3 = BlockMask.parse(var2);
         if (var3 != null && var3 != BlockMask.EMPTY) {
            class="kw">return var1 != null ? BlockMask.combine(var3, var1) : var3;
         } else {
            class="kw">return var1;
         }
      } catch (Exception var4) {
         ((HytaleLogger.Api)LOGGER.at(Level.WARNING).withCause(var4)).log("Failed to parse mask entries: %s", var0);
         class="kw">return var1;
      }
   }

   class="kw">static {
      OPERATIONS.put("Noise", NoiseOperation::new);
      OPERATIONS.put("Scatter", ScatterOperation::new);
      OPERATIONS.put("Smooth", (var0, var1, var2, var3, var4) -> new SmoothOperation(var0, var3, var4));
      OPERATIONS.put("Tint", TintOperation::new);
      OPERATIONS.put("Paint", PaintOperation::new);
      OPERATIONS.put("OldSculpt", OldSculptOperation::new);
      OPERATIONS.put("Sculpt", SculptOperation::new);
      OPERATIONS.put("Layers", LayersOperation::new);
      OPERATIONS.put("LaserPointer", LaserPointerOperation::new);
      OPERATIONS.put("Revolve", RevolveOperation::new);
      OPERATIONS.put("ScriptedBrushTemplate", PaintOperation::new);
   }
}