HyCodeYourTale
classpublicPriority 3

SculptOperation

com.hypixel.hytale.builtin.buildertools.tooloperations.SculptOperation

extends ToolOperation

0

Methods

0

Public Methods

5

Fields

1

Constructors

Constructors

public
SculptOperation(Ref<EntityStore> ref, Player player, BuilderToolOnUseInteraction packet, ComponentAccessor<EntityStore> componentAccessor)

Fields

Private/Package Fields (5)

privateint brushDensity
privateboolean isAltPlaySculptBrushModDown
privateLongOpenHashSet packedPlacedBlockPositions
privateint smoothRadius
privateint smoothVolume

Inheritance

Parent
Current
Interface
Child

Use mouse wheel to zoom, drag to pan. Click nodes to navigate.

Related Classes

Source Code

package com.hypixel.hytale.builtin.buildertools.tooloperations;

import com.hypixel.hytale.builtin.buildertools.BuilderToolsPlugin;
import com.hypixel.hytale.builtin.buildertools.PrototypePlayerBuilderToolSettings;
import com.hypixel.hytale.builtin.buildertools.utils.Material;
import com.hypixel.hytale.component.ComponentAccessor;
import com.hypixel.hytale.component.Ref;
import com.hypixel.hytale.math.block.BlockUtil;
import com.hypixel.hytale.protocol.InteractionType;
import com.hypixel.hytale.protocol.packets.buildertools.BuilderToolOnUseInteraction;
import com.hypixel.hytale.server.core.entity.UUIDComponent;
import com.hypixel.hytale.server.core.entity.entities.Player;
import com.hypixel.hytale.server.core.universe.world.storage.EntityStore;
import it.unimi.dsi.fastutil.longs.LongOpenHashSet;
import javax.annotation.Nonnull;

public class SculptOperation extends ToolOperation {
   private final int smoothVolume;
   private final int smoothRadius;
   private final boolean isAltPlaySculptBrushModDown;
   private final int brushDensity;
   private LongOpenHashSet packedPlacedBlockPositions;

   public SculptOperation(
      @Nonnull Ref<EntityStore> ref,
      @Nonnull Player player,
      @Nonnull BuilderToolOnUseInteraction packet,
      @Nonnull ComponentAccessor<EntityStore> componentAccessor
   ) {
      super(ref, packet, componentAccessor);
      UUIDComponent uuidComponent = componentAccessor.getComponent(ref, UUIDComponent.getComponentType());

      assert uuidComponent != null;

      this.isAltPlaySculptBrushModDown = packet.isAltPlaySculptBrushModDown;
      PrototypePlayerBuilderToolSettings prototypePlayerBuilderToolSettings = ToolOperation.PROTOTYPE_TOOL_SETTINGS.get(uuidComponent.getUuid());
      this.packedPlacedBlockPositions = prototypePlayerBuilderToolSettings.addIgnoredPaintOperation();
      int smoothStrength = (Integer)this.args.tool().get("SmoothStrength");
      this.smoothRadius = Math.min(smoothStrength, 4);
      int smoothRange = this.smoothRadius * 2 + 1;
      this.smoothVolume = smoothRange * smoothRange * smoothRange;
      this.brushDensity = this.getBrushDensity();
   }

   @Override
   boolean execute0(int x, int y, int z) {
      int currentBlock = this.edit.getBlock(x, y, z);
      if (this.isAltPlaySculptBrushModDown) {
         BuilderToolsPlugin.BuilderState.BlocksSampleData data = BuilderToolsPlugin.getState(this.player, this.player.getPlayerRef())
            .getBlocksSampleData(this.edit.getAccessor(), x, y, z, 2);
         if (currentBlock != data.mainBlock && (float)data.mainBlockCount > (float)this.smoothVolume * 0.5F) {
            this.edit.setMaterial(x, y, z, Material.block(data.mainBlock));
         }
      } else if (this.interactionType == InteractionType.Primary) {
         if (currentBlock > 0 && this.builderState.isAsideAir(this.edit.getAccessor(), x, y, z) && this.random.nextInt(100) <= this.brushDensity) {
            this.edit.setMaterial(x, y, z, Material.EMPTY);
         }
      } else if (this.interactionType == InteractionType.Secondary && currentBlock <= 0 && this.builderState.isAsideBlock(this.edit.getAccessor(), x, y, z)) {
         if (this.edit.getBlock(x, y, z) == 0) {
            this.packedPlacedBlockPositions.add(BlockUtil.pack(x, y, z));
         }

         if (this.random.nextInt(100) <= this.brushDensity) {
            Material material = Material.fromPattern(this.pattern, this.random);
            if (material.isEmpty()) {
               BuilderToolsPlugin.BuilderState.BlocksSampleData data = this.builderState.getBlocksSampleData(this.edit.getAccessor(), x, y, z, 1);
               material = Material.block(data.mainBlockNotAir);
            }

            this.edit.setMaterial(x, y, z, material);
         }
      }

      return true;
   }
}