---
title: Prefab Editor
type: docs
weight: 3
---

The prefab editor allows creating, editing, and managing prefabricated structures that can be placed in the world.

**Package:** `com.hypixel.hytale.builtin.buildertools.prefabeditor`

## Architecture

```
Prefab Editor
├── Session Management
│   ├── PrefabEditSession - Active edit session
│   └── PrefabEditSessionManager - Session coordinator
├── Components
│   ├── PrefabAnchor - Anchor point definitions
│   └── PrefabEditorCreationSettings
├── Interactions
│   ├── PrefabSelectionInteraction
│   └── PrefabSetAnchorInteraction
├── Systems
│   ├── PrefabDirtySystems - Track changes
│   └── PrefabMarkerProvider - Anchor markers
└── Commands
    └── PrefabEditCommand
```

## Prefab Edit Session

### Starting a Session

```
/prefabedit <prefab_id>
```

This enters prefab editing mode where:
- Selection tools work within prefab bounds
- Changes are tracked separately
- Anchors can be set

### PrefabEditSession

```java
public class PrefabEditSession {
    // Active editing session for a prefab
    // Tracks modifications and anchors
}
```

### Session Manager

```java
PrefabEditSessionManager manager = BuilderToolsPlugin.get().getPrefabEditSessionManager();

// Check if player is editing
boolean isEditing = manager.isEditing(player);

// Get active session
PrefabEditSession session = manager.getSession(player);
```

## Prefab Anchors

Anchors define special points within a prefab:

### PrefabAnchor

```java
public class PrefabAnchor {
    // Position relative to prefab origin
    // Name identifier
    // Anchor type
}
```

### Setting Anchors

Use the anchor interaction or command:

```
/prefab anchor set <name> [x y z]
/prefab anchor remove <name>
/prefab anchor list
```

### Anchor Types

| Type | Description |
|------|-------------|
| `origin` | Prefab placement origin |
| `spawn` | Entity spawn point |
| `connection` | Connection to other prefabs |
| `custom` | User-defined anchor |

## Prefab Commands

### /prefab

Main prefab management command:

```
/prefab save <name>       Save selection as prefab
/prefab load <name>       Load prefab to clipboard
/prefab list              List available prefabs
/prefab delete <name>     Delete a prefab
/prefab info <name>       Show prefab information
```

### /prefabedit

Enter prefab editing mode:

```
/prefabedit <prefab_id>   Edit existing prefab
/prefabedit exit          Exit editing mode
/prefabedit save          Save changes
/prefabedit discard       Discard changes
```

## Interactions

### PrefabSelectionInteraction

Select prefabs in the world:

```java
// Registered interaction type
getCodecRegistry(Interaction.CODEC).register(
    "PrefabSelection",
    PrefabSelectionInteraction.class,
    PrefabSelectionInteraction.CODEC
);
```

### PrefabSetAnchorInteraction

Set anchors via interaction:

```java
// Allows clicking to place anchors
getCodecRegistry(Interaction.CODEC).register(
    "PrefabSetAnchor",
    PrefabSetAnchorInteraction.class,
    PrefabSetAnchorInteraction.CODEC
);
```

## Creation Settings

### PrefabEditorCreationSettings

Configuration for creating new prefabs:

```java
public class PrefabEditorCreationSettings {
    // Settings for prefab creation
    // Include entities flag
    // Compression settings
}
```

## Systems

### PrefabDirtySystems

Tracks modifications to prefabs:

```java
// Marks prefab as modified when changes occur
// Prompts save on exit
```

### PrefabMarkerProvider

Provides visual markers for anchors:

```java
// Displays anchor positions in creative mode
// Shows connection points
```

## API Usage

### Save Selection as Prefab

```java
BuilderToolsPlugin tools = BuilderToolsPlugin.get();
// Selection must be defined first
// Use /prefab save command or API
```

### Load and Place Prefab

```java
// Load to clipboard
// /prefab load <name>

// Paste at location
// /paste
```

### Check Edit Mode

```java
PrefabEditSessionManager manager =
    BuilderToolsPlugin.get().getPrefabEditSessionManager();

if (manager.isEditing(player)) {
    PrefabEditSession session = manager.getSession(player);
    // Work with session
}
```

## Prefab Storage

Prefabs are stored in the world data:

```
worlds/<world>/prefabs/<name>.prefab
```

Structure includes:
- Block data
- Entity data (if included)
- Anchor definitions
- Metadata
