> For the complete documentation index, see [llms.txt](https://wiki.incredibleplugins.com/betterfarming/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://wiki.incredibleplugins.com/betterfarming/gameplay/farm-types.md).

# Farm Types

## Farm Types

Farm types are configured in `farms.yml` under `types`.

Most farm-type changes should be made while the server is stopped, followed by a restart. Existing placed farms store their current level values and may not update cleanly if a type is removed or heavily restructured while the server is running.

At least one farm type must be enabled and valid. BetterFarming disables itself on startup if no farm types are configured.

## Type Key and Name

Each entry under `types` has a key:

```yaml
types:
  crop:
    enabled: true
    name: "&eCrop Farm"
```

The key is used for the generated limit ID, such as `player_farms_crop`.

The player command uses the display name with spaces replaced by dashes and color removed. For example, `name: "&eCrop Farm"` is obtained with:

`/farm get Crop-Farm`

Names are case-insensitive.

The first enabled farm type that loads successfully becomes the default type for `/farm get` when no type is entered.

## Farm Mode

`type` controls the farm behavior:

| Type     | Use it for                                                        |
| -------- | ----------------------------------------------------------------- |
| `NORMAL` | Crops or blocks that BetterFarming grows by age or interval.      |
| `TREE`   | Saplings and tree-like growth handled through tree growth events. |

## Item

`item` defines the farm item given by `/farm get` and `/farm admin give`.

The item supports names, lore, materials, custom heads, custom model data, and compatible custom item providers used by PluginFramework.

## Farmland

`farmland` controls whether BetterFarming replaces the ground around the farm.

Set it to `AIR` to disable farmland creation.

The replacement filter is configured in `config.yml` under `farm.creation.farm-land.filter`.

## Cost and Economy

`cost` is the price of one farm item from `/farm get`.

The active economy comes from `config.yml`: Vault, experience, levels, or item currency.

## Fuel

Enable `fuel` if farms should pause when they run out of time.

```yaml
fuel:
  enabled: true
  initial: 6h
  max: 7d
  items:
    bone_meal:
      material: "BONE_MEAL"
      strict: false
      data:
        seconds: 25
```

`initial` is the fuel time a new farm starts with. `max` is the maximum stored fuel time. Each fuel item adds the configured number of seconds per item.

If `strict` is true, the item name and lore must match too. Otherwise, BetterFarming compares the item more loosely.

### Shared Fuel Item Presets

If multiple farm types use the same fuel items, define them once under a top-level `fuel-items` section (a sibling of `types`) and reference the preset by name instead of repeating the list:

```yaml
fuel-items:
  default:
    bone_meal:
      material: "BONE_MEAL"
      strict: false
      data:
        seconds: 25

types:
  crop:
    fuel:
      enabled: true
      items-preset: default
```

`items-preset` replaces `items` entirely for that farm type - a type using `items-preset` does not also need its own `items` list.

### Buying Fuel

Let players buy fuel time directly with their currency instead of requiring a physical fuel item:

```yaml
fuel:
  purchase:
    enabled: true
    seconds-per-unit: 1800
    cost: 100.0
```

When enabled, the fuel menu gets a purchase option that adds `seconds-per-unit` of fuel time for `cost`, using the same economy configured in `config.yml`. Purchases still respect the farm's `max` fuel cap.

### Low Fuel Warning

```yaml
fuel:
  warning:
    threshold-seconds: 300
```

When a farm's remaining fuel drops below `threshold-seconds`, the owner gets a one-time warning if they are online. Set this to `0` to disable the warning. Defaults to `300` (5 minutes).

## Levels

Farm levels define upgrade paths.

BetterFarming supports these level types:

| Level      | What it controls                                                                                    |
| ---------- | --------------------------------------------------------------------------------------------------- |
| `interval` | Seconds between growth cycles. Lower values are better, so they are sorted from slowest to fastest. |
| `storage`  | Internal storage slots.                                                                             |
| `radius`   | Horizontal farm radius.                                                                             |

Each level key must be unique. The first sorted level is used for newly created farm items.

```yaml
levels:
  interval:
    1:
      value: 120
      cost: 0
    2:
      value: 60
      cost: 7500.0
  storage:
    1:
      value: 9
      cost: 0
  radius:
    1:
      value: 1
      cost: 0
```

## Growth

`growth.visualization.enabled` controls whether BetterFarming visually updates block growth stages.

`growth.visualization.instant` controls whether visual growth updates happen immediately.

`growth.stages` controls whether crops use multiple growth stages. If enabled, total time until harvest is based on the interval and the crop's stages.

## Owner Online Requirement

`require-owner-online` pauses farms of this type while their owner is offline.

## World Blacklist

`world-blacklist` blocks a specific farm type from being placed in listed worlds.

The global list of worlds where any farm can be created is configured in `config.yml` under `general.worlds_list`.

## Auto-Sell

Instead of storing harvested items or draining them into a hopper, a farm type can automatically sell them for currency:

```yaml
types:
  crop:
    auto-sell:
      enabled: true
```

Auto-sell and hopper output are mutually exclusive per farm - a farm with auto-sell enabled is skipped by the hopper transfer task. Players toggle it per-farm from the storage menu; the toggle is hidden if the farm type has no items with a configured `sell-price` (see [Harvestable Blocks](#harvestable-blocks) below). How often auto-sell runs and whether owners are notified are configured in `config.yml` under `farm.auto-sell`.

## Recipe

Use `recipe` to allow players to craft a farm item.

```yaml
recipe:
  - "IRON_INGOT,CHEST,IRON_INGOT"
  - "IRON_INGOT,REDSTONE,IRON_INGOT"
  - "AIR,IRON_INGOT,AIR"
```

Use an empty list to disable crafting.

## Minion NPC

If `minion.enabled` is true, BetterFarming places the configured armor stand instead of the farm block.

```yaml
minion:
  enabled: true
  helmet: "skin:925a32560831c295b00527926255e608a039776f3523b92edf788149aae67d6a"
  chestplate: "LEATHER_CHESTPLATE"
  leggings: "LEATHER_LEGGINGS"
  boots: "LEATHER_BOOTS"
  tool: "IRON_HOE"
```

## Harvestable Blocks

`blocks` defines what the farm can track, grow, and harvest.

The section key is used as the material unless you set `block`.

```yaml
blocks:
  carrots:
    item:
      name: ""
      material: "CARROT"
    harvest:
      carrot:
        name: ""
        material: "CARROT"
        data:
          min: 1
          max: 1
          chance: 100
          sell-price: 0
```

`item` is the item players place or plant. `harvest` is the list of item drops the farm adds to storage when the block is harvested.

`min` and `max` randomize the drop amount. `chance` controls the drop chance.

Set a harvest item to `enabled: false` to disable that drop. For enabled harvest items, chance values are treated as percentages.

`sell-price` is the per-unit amount auto-sell pays for this item. It defaults to `0`, meaning the item cannot be auto-sold and is only ever collected manually or moved through a hopper. Set it above `0` to make the item sellable - see [Auto-Sell](#auto-sell) above.

## Custom Items and Model Data

You can apply custom model data, names, lore, enchantments, and custom heads to farm items, fuel items, planted items, and harvest drops.

Example custom head harvest:

```yaml
blocks:
  somehead:
    block: "PLAYER_HEAD"
    item:
      name: "Pineapple"
      material: "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNTdjNWU5MjVhOTQ5ZTU1ZGIyYzI1ZWZhYWQ2NDUxMmViNmRhYjc0YWZmYjJlOWYzMDRjMzg1YjRmNGIzMGJhNSJ9fX0="
    harvest:
      pineapple_slice:
        name: "Pineapple Slice"
        material: "PAPER"
        model-data: 1000
        data:
          min: 1
          max: 4
```

General item options are documented in [GUI Menus](https://wiki.incredibleplugins.com/general/gui-menus/gui-menus).
