--- title: Tool Operations type: docs weight: 4 --- Tool operations handle the actual block editing mechanics when using builder tools. **Package:** `com.hypixel.hytale.builtin.buildertools.tooloperations` ## Architecture ``` Tool Operations ├── Base │ └── ToolOperation - Operation base class ├── Operations │ ├── PaintOperation - Block painting │ └── EditOperation - Edit tracking ├── Materials │ └── Material - Block material wrapper └── Utilities └── CopyCutSettings - Copy/cut configuration ``` ## ToolOperation Base class for all tool operations: ```java public class ToolOperation { // Base operation that modifies blocks // Tracked for undo/redo } ``` ## PaintOperation Handles block painting with brush tools: ```java public class PaintOperation extends ToolOperation { // Applies blocks in brush shape // Supports patterns and masks } ``` ### Usage When a player uses a brush tool: 1. PaintOperation is created 2. Shape is calculated based on tool settings 3. Blocks are modified according to pattern 4. Operation is added to history ## EditOperation Tracks changes for undo/redo: ```java public class EditOperation { // Records block changes // Enables reversal } ``` ## Material System ### Material Wrapper for block materials: ```java public class Material { // Block type reference // Additional properties (rotation, tint) } ``` ### Block Patterns Patterns define how blocks are selected: | Pattern | Description | |---------|-------------| | `[Stone]` | Single block type | | `[50%Stone, 50%Dirt]` | Weighted random | | `[Stone, Dirt, Grass]` | Equal weights | ### Block Masks Masks filter which blocks are affected: | Mask | Description | |------|-------------| | `[Stone]` | Only affect stone | | `[!Air]` | Affect non-air blocks | | `[!^Fluid]` | Exclude fluid tagged blocks | ## Copy/Cut Settings ### CopyCutSettings Configuration for copy and cut operations: ```java public class CopyCutSettings { // Include entities flag // Include biome data flag // Compression level } ``` ## Tool Arguments Builder tools support configurable arguments: ### Argument Types | Type | Class | Description | |------|-------|-------------| | Block | `BlockArg` | Block type selection | | Bool | `BoolArg` | Boolean flag | | Int | `IntArg` | Integer value | | Float | `FloatArg` | Decimal value | | Mask | `MaskArg` | Block mask | | String | `StringArg` | Text value | | BrushShape | `BrushShapeArg` | Sphere, Cube, etc. | | BrushOrigin | `BrushOriginArg` | Center, Surface, etc. | ### Tool Argument Packets Arguments sync via network packets: ```java // BuilderToolArgUpdate packet // Syncs tool argument changes to server ``` ## Brush Configuration ### Brush Shape ```java public enum BrushShape { Sphere, Cube, Cylinder, // ... } ``` ### Brush Origin ```java public enum BrushOrigin { Center, // Brush centered on click Surface, // Brush on surface Offset // Custom offset } ``` ### Brush Axis ```java public enum BrushAxis { Y, // Always vertical View, // Follow view direction Surface // Normal to surface } ``` ## API Usage ### Access Tool Settings ```java BuilderToolsPlugin tools = BuilderToolsPlugin.get(); BuilderToolsUserData userData = tools.getUserData(player); ``` ### Get Current Tool ```java BuilderTool currentTool = userData.getCurrentTool(); BuilderToolData toolData = currentTool.getData(); ``` ## Tool State ### BuilderToolState Tracks current tool state: ```java // BuilderToolState packet // Syncs tool state to client ``` ### Brush Data ```java // BuilderToolBrushData packet // Contains brush size, shape, pattern ```