# EliteShop

### Plugin features.

● Support ItemsAdder, Oraxen, MythicCrucible items libraries as drops&#x20;


# Permissions and commands

## Permissions

| Permissions     | Fuctions                                          |
| --------------- | ------------------------------------------------- |
|                 |                                                   |
|                 |                                                   |
|                 |                                                   |
| eliteshop.admin | aadds all of the above permissions and /es reload |

## Commands

<table><thead><tr><th width="372">Commands</th><th>Fuctions</th></tr></thead><tbody><tr><td>/es add &#x3C;name></td><td>To create a new shop</td></tr><tr><td>/es list</td><td>To see the all shops from player wolrds</td></tr><tr><td>/es merge yml</td><td>Merge all data from yml to mysql</td></tr><tr><td>/es reload</td><td>Reload plugin</td></tr><tr><td>/es remove &#x3C;name></td><td>To remove the shop</td></tr><tr><td>/es show</td><td>To show te limitation</td></tr><tr><td>/es tp &#x3C;name></td><td>To teleport to that shop</td></tr><tr><td>/es help</td><td>Help commands</td></tr><tr><td>/es items</td><td>To view the information of item commands</td></tr></tbody></table>

### Add shop

| Commands | Fuctions                   |
| -------- | -------------------------- |
| 0        | To display the shop border |
| 1        | To set de first location   |
| 2        | To set the second location |
| save     | Save new shop              |
| q        | Remove and do not save     |

### Items

| Commands                   | Fuctions                       |
| -------------------------- | ------------------------------ |
| /es items add \<name>      | Add an item to the shop        |
| /es items edit \<name>     | Edit an existing item          |
| /es items get \<name>      | Obtain an existing item        |
| /es items info \<shopname> | list of all items in the store |
| /es items list             | list of all items              |
| /es items remove \<name>   | To delete an item              |

### Items Add

| Commands | Fuctions                                           |
| -------- | -------------------------------------------------- |
| 0        | To add or remove a shop to the item                |
| 1        | To add or remove a permission                      |
| 2        | To add or remove a commands                        |
| 3        | To set the amount to be given                      |
| 4        | To set the title to be sent                        |
| 5        | To set the subtitle to be sent                     |
| 6        | To set the price                                   |
| 7        | To set the level                                   |
| 8        | To set the message-no-required                     |
| 9        | To set the custom-name (Used to set a displayname) |
| save     | To add or save the item                            |
| q        | Remove and do not save                             |


# Example-config

## Tutorial

{% embed url="<https://www.youtube.com/watch?feature=emb_title&v=Scd6DrFZYqk>" %}

## Example per item.yml

```yaml
Item-Shop:
    # List of names of shops where you can buy the item.
    # If you remove this section, you can buy it in any store.
    shop:
      - name-shop:name-world
    # Quantity of items that will be given when purchasing.
    # If you delete this section only 1 item will be given.
    count:
    # This title will be sent when a player is in the shop and look at the item.
    # If you delete this section will be sent the general-title (config.yml).
    send-title:
    # This subtitle will be sent when a player is in the shop and look at the item.
    # If you delete this section will be sent the general-subtitle (config.yml)
    # If you set to "null", won't send anything
    send-subtitle: null
    # The price that the item costs.
    # If you delete this section the price will be 0.
    price:
    # The level that the player will need to buy the item.
    # If you delete this section the level will be 0.
    required-level:
    # The permissions that the player will need to purchase the item.
    # If you remove this section, he will not need permissions.
    required-permissions:
      # If you use %ef-required% and the show-name is set to false, it will not show the missing permission.
      # If you remove this section, name will be false.
      show-name: false
      # If player have all permissions or list is empty, the %ef-item-permission% will be this message.
      # If you remove this section, the replacement will be empty.
      have-all: "none"
      list:
        - group.example
    required-items:
        message: you need %ef-item-needed% x %ef-item-needed-amount%
        items:
            item1:
                # Amount required to buy the item
                amount:
                id: itemsadder:elitefantasy:chair_2 #or oraxen:table |  mythicmobs:table
                # If you want a normal item, the section "id" have to be deleted. id > custom-id/material
                material:
                custom-id:
                display-name:
                lore:
                  - "example"
    # command to be executed when the player buys the item.
    # If you remove this section, no commands will be executed.
    commands:
      - [CONSOLE] tp %ef-player% 0 0 0

    # Message to be sent to the player if he/she does not meet the requirements to purchase the item
    # If you delete this section won't be sent anything.
    message-no-required: "%ef-required%"
    # The name that replaces %ef-item-name%.
    # If you delete this section, the name will be display-name.
    custom-name: "Epic Chair"
    item:
      id: itemsadder:elitefantasy:chair_2 #or oraxen:table |  mythicmobs:table
      # If you want a normal item, the section "id" have to be deleted. id > custom-id/material
      material:
      custom-id:
      display-name:
      lore:
        - "example"
    # Item to be given when a player buy it, if this section is empty the item to give will be the section "item"
    item_to_give:
      id: itemsadder:elitefantasy:chair_2 #or oraxen:table |  mythicmobs:table
      # If you want a normal item, the section "id" have to be deleted. id > custom-id/material
      material:
      custom-id:
      display-name:
      lore:
        - "example"
```


# EliteFurniture


# Permissions and commands

### Permissions

| Permissions          | Fuctions                                          |
| -------------------- | ------------------------------------------------- |
| elitefurniture.craft | access to /ef crafts                              |
| elitefurniture.merge | access to /ef merge yml                           |
| elitefurniture.model | access to /ef model                               |
| elitefurniture.admin | aadds all of the above permissions and /ef reload |

### Commands

<table><thead><tr><th width="372">Commands</th><th>Fuctions</th></tr></thead><tbody><tr><td>/ef help</td><td>see all commands</td></tr><tr><td>/ef crafts</td><td>add tables/crafts to the plugin</td></tr><tr><td>/ef reload</td><td>reload plugin</td></tr><tr><td>/ef model</td><td>assigning a pattern when several items of a material are joined together (you need to have the item in hand)</td></tr><tr><td>/ef merge yml</td><td>transfer all your data to MySQL</td></tr></tbody></table>


# InGame configuration

## Basic Configuration

EliteFurtniture has the option to configure it in the game through the **/ef add** command.

![](https://cdn.discordapp.com/attachments/896841738621177896/1000102260929474661/unknown.png)

In this menu you can add any Furtniture or Custom Block of the plugins compatible with the plugin, you have to **click** on the object to add it and to remove it is **shift plus right click** and to receive the table is **right click**.

![](https://cdn.discordapp.com/attachments/896841738621177896/1000103073152237618/unknown.png)

In this menu you can add the results of the items that can be made using the table, now to set a crafting of these you must click on the object in the GUI.

{% hint style="info" %}
Adding objects, deleting them and receiving them is the same way
{% endhint %}

![](https://cdn.discordapp.com/attachments/896841738621177896/1000103987934134302/unknown.png)

Once all the crafteos in all the objects have been established, it is ready to work.

{% embed url="<https://cdn.discordapp.com/attachments/896841738621177896/1000105979767169124/2022-07-22_13-23-43.mp4>" %}

{% hint style="info" %}
if you click in the middle of the mouse on an item (which has its recipes) the Copy option will be made. and if you click on another item with the middle mouse button it does the paste
{% endhint %}

{% embed url="<https://youtu.be/8RMG35g5UM0>" %}

## How do I configure commands?

{% embed url="<https://youtu.be/yORZsXfu8y8>" %}


# Example Config

{% embed url="<https://cdn.discordapp.com/attachments/992865320098344961/1015797546259582986/2022-09-03_20-35-34.mp4>" %}

### Example

<pre class="language-yaml"><code class="lang-yaml">Inventory:
  Tables:
    table:
      id: ia:example_table #mm/o
#      material: Stone
      displayname: "&#x3C;Example>"
#      custom-id:
#      lore:
<strong>#      - "Example"
</strong>#      enchants:
#        - DURABILITY:1 //Enchantment:level
#      itemFlags:
#        - HIDE_ATTRIBUTES
    items:
      unique-name-item:
        recipes:
          unique-name-recipe:
            id: ia/mm/o
            material:
            displayname:
            custom-id:
            lore:
            enchants:
              - DURABILITY:1 //Enchantment:level
            itemFlags:
              - HIDE_ATTRIBUTES
        item:
          id: ia/mm/o
          material:
          displayname:
          custom-id:
          lore:
          enchants:
            - DURABILITY:1 //Enchantment:level
          itemFlags:
            - HIDE_ATTRIBUTES
</code></pre>

### Other Example

```yaml
Inventory:
  Tables:
    table:
      id: ia:elitefantasy:furniture_table
    items:
      item1:
        item:
          id: ia:elitefantasy:mullet_fish_silver_star
        recipes:
          Recipe1:
            id: ia:elitefantasy:mullet_fish
          Recipe2:
            id: ia:elitefantasy:mullet_fish
          Recipe3:
            id: ia:elitefantasy:mullet_fish
      item2:
        item:
          id: ia:elitefantasy:mullet_fish_golden_star
        recipes:
          Recipe1:
            id: ia:elitefantasy:mullet_fish
          Recipe2:
            id: ia:elitefantasy:mullet_fish
          Recipe3:
            id: ia:elitefantasy:mullet_fish
          Recipe4:
            id: ia:elitefantasy:mullet_fish
```


# Utils

## Shop

```yaml
# List of names of shops where you can buy the item.
    # If you remove this section, you can buy it in any store.
    shop:
      - example
```


# MaskyCheckpoints

### Plugin features.

● Mysql Support\
● Checkpoints\
● SubCheckpoints\
● Area Checkpoints


# Permissions and commands

## Permissions

| Permissions                              | Fuctions                                    |
| ---------------------------------------- | ------------------------------------------- |
| maskycheckpoints.command.reload          | /mcp reload all                             |
| maskycheckpoints.command.tp              | /mcp tp \<checkpoint>                       |
| maskycheckpoints.tp.others.\<checkpoint> | /mcp tp \<checkpoint> (optional)\<player>   |
| maskycheckpoints.command.add             | /mcp add \<newcheckpoint>                   |
| maskycheckpoints.command.help            | /mcp help                                   |
| maskycheckpoints.command.lastcheckpoint  | /mcp lastcheckpoint \<player> \<checkpoint> |

## Commands

<table><thead><tr><th width="372">Commands</th><th>Fuctions</th></tr></thead><tbody><tr><td>/mcp reload all</td><td>reload plugin configs</td></tr><tr><td>/mcp tp &#x3C;checkpoint> (optional)&#x3C;player></td><td>Teleport player to checkpoint</td></tr><tr><td>/mcp add &#x3C;newcheckpoint></td><td>Create a new checkpoint in config</td></tr><tr><td>/mcp lastcheckpoint &#x3C;player> &#x3C;checkpoint></td><td>Set last checkpoint to player</td></tr><tr><td>/mcp help</td><td>Help message</td></tr></tbody></table>

{% hint style="info" %}
if you set `null` with the lastcheckpoint command, the plugin will stop affecting that player, use it in case you want to use another system.
{% endhint %}


# Example-config

## Tutorial

{% embed url="<https://www.youtube.com/watch?v=UoaXnyiRAE4>" %}

## Example checkpoints.yml

{% hint style="info" %}
Use permission "maskycheckpoints.tp.\<checkpoints>"\
\
Use permission "menu.\<subcheckpoint>" for subcheckpoints
{% endhint %}

```yaml
checkpoints:
  checkpoints_west:
    displayname: "<red>West" #TITLE DISPLAY IF CHECKPOINT HAVE SUBCHECKPOINTS
    hasGUI: true #if you want subcheckpoint GUI
    coordinates: #checkpoint base location
      world: world
      x: -25
      y: 80
      z: 25
      yaw: 90
      pitch: 0
    # OPTIONAL CONFIGS
    options:
      area: 
      #This option means that if the player dies within that area he will
      #appear at that checkpoint, otherwise he will only appear at his last checkpoint.
        maxpoint:
          x: -500
          y: 256
          z: 500
        minpoint:
          x: 0.500
          y: -64
          z: 0.500
    subcheckpoints:
    #The subcheckpoints are extra options that serve to give more options of locations,
    #if the player dies and this has subcheckpoint will open this menu 
    #with the available subcheckpoints, not to exceed 54.
      checkpoint1:
        displayname: "<red>West subCheckpoint 1" #Item Name in GUI
        Material: PAPER
        CustomModelData: 20 #If you dont want it put it in 0
        Lore: #Use MiniMessage Format
          - "<gray>TEST checkpoint1"
        coordinates:
          world: world
          x: -51.500
          y: 80
          z: 45.500
          yaw: -13.2
          pitch: 12
      checkpoint2:
        displayname: "<red>West subCheckpoint 2"
        Material: DIAMOND
        Lore:
          - "<gray>TEST checkpoint2"
          - "<rainbow>TEST checkpoint2"
        coordinates:
          world: world
          x: -51.500
          y: 80
          z: 49.500
          yaw: -171
          pitch: 6
```


# MaskyCrops

## Dependencies

| list        | required | format for Material:      |
| ----------- | -------- | ------------------------- |
| CustomCrops | true     | null                      |
| MythicMobs  | true     | mythic:\<itemid>          |
| CraftEngine | false    | ce:\<namespace>:\<itemid> |
| ItemsAdder  | false    | ia:\<namespace>:\<itemid> |
| Nexo        | false    | nexo:\<itemid>            |
| Oraxen      | false    | or:\<itemid>              |

## Config Examples

<pre><code>📦MaskyCrops
  ├── 📁configs
<strong>  │     └── 📝end_crops.yml
</strong>  └── 📝settings.yml
</code></pre>

### settings.yml

```yaml
settings:
  debug: false
  grow_display:
    display_height: 2
    MythicMobsCropGrowSkill: "endcrops_skill_grow1" #Mob used when growing a crop
    MythicMobsCropSummonSkill: "_summon" #This references skill <CropId>_summon
```

### end\_crops.yml

All the "crops" needs a skill named in MythicMobs for example `<CropId>_summon` / `boreal_gummy_summon`

```yaml
crops:
  - "boreal_gummy"
  - "eye_berries"
  - "slime_tune"
  - "void_spire"
  - "end_betroot"
pots:
  - "end_pot"
tools:
  end_scythe_diamond:
    Material: "ia:elitefantasy:end_scythe_diamond"
    Radius: 1 #0 = 1x1, 1 = 3x3, 2 = 5x5, 3 = 7x7
seeds:
  boreal_gummy_seed_pack_golden:
    Material: "ia:elitefantasy:boreal_gummy_seed_pack_golden"
    Radius: 3
    Random: false
    Crops:
      - "boreal_gummy"
  end_randomseed:
    Material: "ia:elitefantasy:end_randomseed"
    Radius: 0
    Random: true
    Crops:
      - "boreal_gummy"
      - "eye_berries"
      - "slime_tune"
      - "void_spire"
      - "end_betroot"
  end_randomseed_pack:
    Material: "ia:elitefantasy:end_randomseed_pack"
    Radius: 1
    Random: true
    Crops:
      - "boreal_gummy"
      - "eye_berries"
      - "slime_tune"
      - "void_spire"
      - "end_betroot"
  end_randomseed_pack_silver:
    Material: "ia:elitefantasy:end_randomseed_pack_silver"
    Radius: 2
    Random: true
    Crops:
      - "boreal_gummy"
      - "eye_berries"
      - "slime_tune"
      - "void_spire"
      - "end_betroot"
meals:
  end_meal:
    Material: "ia:elitefantasy:end_meal"
    Radius: 1
  end_meal_silver:
    Material: "ia:elitefantasy:end_meal_silver"
    Radius: 2
  end_meal_golden:
    Material: "ia:elitefantasy:end_meal_golden"
    Radius: 3
```


# Soil System

## Introduction

MaskyCrops adds an optional soil health system on top of CustomCrops. Its goal is to reward crop rotation and land recovery without replacing the standard CustomCrops systems.

## Enable this on settings

The system is fully optional. With `soil-enabled: false`, all existing CustomCrops gameplay works exactly as before.

settings.yml

```yaml
settings:
  soil-enabled: true
```

### Water and Hydration

Water management remains the responsibility of CustomCrops.

* The pots retain their water capacity, water bar, watering can, rain, and nearby water absorption.
* MaskyCrops does not fill or consume water from the pot.
* A crop still requires a valid pot and the normal watering conditions configured in CustomCrops.

The soil system is an additional layer: water and nutrients are handled separately.

### Game Cycle

1. A player plants a CustomCrops crop in a pot.
2. If that ID is included in soils.\<id>.crops, MaskyCrops creates or restores the plot's state.
3. During growth, soil fertility and chemistry determine how many growth points the crop receives.
4. When a mature crop is harvested, the plot loses fertility and consumes/restores nutrients based on its profile.
5. An unused plot slowly regains fertility and soil chemistry.
6. The player can use configured fertilizers to restore the soil.

All state data is saved in H2, within plugins/MaskyCrops/database/soil.

### Fertility and Growth Curve

Fertility is the general value inherited from the initial system, typically between 0 and 100

```yaml
    growth:
      100: 1.00
      75: 0.85
      50: 0.65
      25: 0.40
      0: 0.00
```

The curve is interpolated between points. For example, with a fertility level of 50, the crop achieves 65% of the required growth points before applying soil chemicals.

### Soil Chemistry

Each plot stores the following values:

| Value          | Current function                                                               |
| -------------- | ------------------------------------------------------------------------------ |
| Nitrogen (N)   | It affects the rate of growth.                                                 |
| Phosphorus (P) | It limits the effective absorption of nutrients.                               |
| Potassium (K)  | It is saved and remains available for performance/quality analysis.            |
| Organic matter | It stabilizes the growth multiplier.                                           |
| pH             | It limits absorption; each crop has an ideal pH and a certain tolerance range. |
| Compaction     | It reduces growth efficiency.                                                  |

The N/P/K, organic matter, and compaction values use a scale of `0–100`. The pH uses a scale of `0–14`

Currently, the chemical growth multiplier combines nitrogen, phosphorus, pH, organic matter, and compaction. The system also provides a yield multiplier based on P/K, but it does not yet automatically modify MythicMobs drops; a specific harvest/drop hook is required for that.

### Crop rotation

```yaml
crop-profiles:
  pepper:
    family: "nightshades"
    root-depth: "SHALLOW"
    consumes: { nitrogen: 8.0, phosphorus: 5.0, potassium: 7.0 }
    ideal-ph: 6.3
    ph-tolerance: 1.5
    compaction-change: 1.5
```

The crop rotation bonus requires:

* a family different from the last crop harvested, and
* a different root depth.

For example, pepper → eggplant is not a good rotation: both are nightshades. Alternating a shallow-rooted Brassica with a deep-rooted crop from another family can earn the bonus.

Legumes can restore nitrogen:

```yaml
crop-profiles:
  soybean:
    family: "legumes"
    root-depth: "DEEP"
    consumes: { phosphorus: 2.0, potassium: 2.0 }
    restores: { nitrogen: 8.0 }
    organic-matter-change: 3.0
    compaction-change: -2.0
```

### Fertilizers

Soil fertilizers are configured in fertilizers

```yaml
fertilizers:
  bone_meal_compost:
    Material: "mc:bone_meal"
    Radius: 1
    Fertility: 10.0
    Cooldown: 30
    nitrogen: 3.0
    phosphorus: 6.0
    potassium: 2.0
    organic-matter: 2.0
    ph-change: 0.0
    compaction-change: -1.0
```

`Radius`: 1 covers an area of 3×3 pots. The fertilizer increases fertility and applies the configured chemical values.

CustomCrops’ native fertilizers—such as `quality_1`, `yield_increase_1`, or `speed_grow_1`—remain mechanics independent of the pot. It is not recommended to register them as soil fertilizers as well, unless a dual effect is deliberately desired.

{% hint style="info" %}
Technical note: Cooldown is loaded in seconds. It must be enforced by the fertilizer listener/manager to prevent repeated use; verify this before announcing it as an active limitation in production.
{% endhint %}

### Deterioration of the pot

When fertility reaches “depleted-at,” the original pot is saved and replaced with the configured block. When it recovers to “recovered-at,” MaskyCrops restores the original pot.

```yaml
    deterioration:
      enabled: true
      depleted-at: 0.0
      recovered-at: 25.0
      block: "mc:coarse_dirt"
```

If a player breaks or replaces that deteriorated block, MaskyCrops removes the status from the plot and never overwrites the player’s block.

### Agricultural Governance

It is designed to transform the land-use system into a territorial system using “Lands.” The idea is to separate agriculture into two layers: a broad strategic decision and a specific, active policy

“development-philosophies” defines the agricultural philosophy of the state or nation

firts example:

```yaml
  development-philosophies:
    sustainable:
      display-name: "Sustainable"
      description: "Lower volume, lower long-term risk, stronger recovery and upkeep stability."
      allowed-policies:
        - fallow_rest
        - autarky_isolationism
        - communal_shifts
        - boutique_agronomy
        - nomadic_foraging
      effects:
        upkeep-multiplier: 0.90
        production-multiplier: 0.95
        recovery-multiplier: 1.15
```

This represents the long-term direction. For example, sustainable farming yields less, but it restores the soil more effectively and requires less maintenance. Industrial farming yields more, but it takes a greater toll on the soil and is more expensive to maintain.

second example

```yaml
  policies:
    fallow_rest:
      display-name: "Fallow Rest"
      philosophy: "sustainable"
      category: "ecological"
      description: "Temporarily protects farmland so soil health and organic matter recover quickly."
      transition-days: 7
      requirements:
        resting-land-required: true
        prevents-planting: true
        prevents-harvesting: true
      maintenance:
        upkeep-multiplier: 0.00
      effects:
        soil-health-recovery-multiplier: 2.50
        organic-recovery-multiplier: 2.50
        production-multiplier: 0.00
      consequences:
        - "No production while resting."
        - "Encourages territorial crop rotation and recovery zones."
```

A policy has:

| type            | description                                                          |
| --------------- | -------------------------------------------------------------------- |
| philosophy      | the philosophy to which it belongs.                                  |
| category        | type of policy, such as ecological, economic, labor, or territorial. |
| transition-days | the time required to switch from one policy to another.              |
| requirements    | conditions for using it.                                             |
| maintenance     | costs or fees to maintain it.                                        |
| effects         | gameplay modifiers.                                                  |
| consequences    | descriptive text for documentation or future GUI.                    |

`agricultural-governance` isn't just a list of buffs. It's a framework that allows each territory to have its own agricultural identity: sustainable, industrial, specialized, communal, nomadic, etc. First, it defines the direction in which the agricultural civilization is heading, and then it defines how that strategy is being implemented on a day-to-day basis.

## Configurations

### Soils Configuration

```yaml
soils:
  default:
    crops:
      - apple
      - cabbage
      - chinese_cabbage
      - corn
      - default
      - eggplant
      - garlic
      - grape
      - hop
      - pepper
      - pineapple
      - pitaya
      - redpacket

    # Existing fertility layer. It remains useful for deterioration and the
    # legacy growth curve; chemistry adds the more detailed simulation below.
    initial-fertility: 100.0
    min-fertility: 0.0
    max-fertility: 100.0
    harvest-depletion: 8.0
    repeat-crop-penalty: 6.0
    rotation-bonus: 3.0
    recovery-per-minute: 0.25
    growth:
      100: 1.00
      75: 0.85
      50: 0.65
      25: 0.40
      0: 0.00

    # Values are 0..100 except pH, which uses 0..14.
    chemistry:
      initial-nitrogen: 70.0
      initial-phosphorus: 65.0
      initial-potassium: 65.0
      initial-organic-matter: 50.0
      initial-ph: 6.5
      initial-compaction: 0.0
      nitrogen-recovery-per-minute: 0.03
      phosphorus-recovery-per-minute: 0.02
      potassium-recovery-per-minute: 0.02
      organic-matter-recovery-per-minute: 0.01
      ph-recovery-per-minute: 0.01
      compaction-recovery-per-minute: 0.05
      max-compaction-growth-penalty: 0.50

    # Safe first-test setting: disable this until all crop IDs are confirmed.
    # When enabled, a fully depleted pot becomes coarse dirt and returns only
    # when its tracked fertility recovers and the dirt was not replaced.
    deterioration:
      enabled: false
      depleted-at: 0.0
      recovered-at: 25.0
      block: "mc:coarse_dirt"
```

### Crop Profiles Configuration

```yaml
# Crop profiles: family drives rotation, root-depth rewards alternating shallow
# and deep crops, and consumes/restores are applied per harvest.
crop-profiles:
  apple:
    family: "orchard"
    root-depth: "DEEP"
    consumes: { nitrogen: 6.0, phosphorus: 5.0, potassium: 8.0 }
    ideal-ph: 6.5
    ph-tolerance: 1.5
    compaction-change: 1.0

  cabbage:
    family: "brassicas"
    root-depth: "SHALLOW"
    consumes: { nitrogen: 9.0, phosphorus: 4.0, potassium: 4.0 }
    ideal-ph: 6.5
    ph-tolerance: 1.4
    compaction-change: 1.0

  chinese_cabbage:
    family: "brassicas"
    root-depth: "SHALLOW"
    consumes: { nitrogen: 8.0, phosphorus: 4.0, potassium: 3.0 }
    ideal-ph: 6.5
    ph-tolerance: 1.4
    compaction-change: 1.0

  corn:
    family: "grasses"
    root-depth: "DEEP"
    consumes: { nitrogen: 10.0, phosphorus: 4.0, potassium: 6.0 }
    ideal-ph: 6.2
    ph-tolerance: 1.8
    compaction-change: 2.0

  # The pack's default.yml crop. It is a neutral fallback profile.
  default:
    family: "generic"
    root-depth: "SHALLOW"
    consumes: { nitrogen: 6.0, phosphorus: 4.0, potassium: 4.0 }
    ideal-ph: 6.5
    ph-tolerance: 2.0
    compaction-change: 1.0

  eggplant:
    family: "nightshades"
    root-depth: "DEEP"
    consumes: { nitrogen: 9.0, phosphorus: 5.0, potassium: 7.0 }
    ideal-ph: 6.3
    ph-tolerance: 1.5
    compaction-change: 2.0

  garlic:
    family: "alliums"
    root-depth: "SHALLOW"
    consumes: { nitrogen: 5.0, phosphorus: 4.0, potassium: 5.0 }
    ideal-ph: 6.5
    ph-tolerance: 1.8
    compaction-change: 0.5

  grape:
    family: "vines"
    root-depth: "DEEP"
    consumes: { nitrogen: 5.0, phosphorus: 5.0, potassium: 8.0 }
    ideal-ph: 6.2
    ph-tolerance: 1.3
    compaction-change: 1.0

  hop:
    family: "vines"
    root-depth: "DEEP"
    consumes: { nitrogen: 7.0, phosphorus: 4.0, potassium: 6.0 }
    ideal-ph: 6.4
    ph-tolerance: 1.5
    compaction-change: 1.0

  pepper:
    family: "nightshades"
    root-depth: "SHALLOW"
    consumes: { nitrogen: 8.0, phosphorus: 5.0, potassium: 7.0 }
    ideal-ph: 6.3
    ph-tolerance: 1.5
    compaction-change: 1.5

  pineapple:
    family: "bromeliads"
    root-depth: "SHALLOW"
    consumes: { nitrogen: 5.0, phosphorus: 3.0, potassium: 8.0 }
    ideal-ph: 5.8
    ph-tolerance: 1.6
    compaction-change: 0.5

  pitaya:
    family: "cacti"
    root-depth: "DEEP"
    consumes: { nitrogen: 3.0, phosphorus: 4.0, potassium: 7.0 }
    ideal-ph: 6.0
    ph-tolerance: 2.0
    compaction-change: 0.5
  redpacket:
    family: "ornamental"
    root-depth: "SHALLOW"
    consumes: { nitrogen: 4.0, phosphorus: 4.0, potassium: 4.0 }
    ideal-ph: 6.5
    ph-tolerance: 2.0
    compaction-change: 0.5
```

### Fertilizers Configuration

```yaml
fertilizers:
  bone_meal_compost:
    Material: "mc:bone_meal"
    Radius: 1
    Fertility: 10.0
    Cooldown: 30
    nitrogen: 3.0
    phosphorus: 6.0
    potassium: 2.0
    organic-matter: 2.0
    ph-change: 0.0
    compaction-change: -1.0

  # Example only
  # rich_compost:
  #   Material: "ce:your_namespace:rich_compost"
  #   Radius: 2
  #   Fertility: 25.0
  #   Cooldown: 60
  #   nitrogen: 10.0
  #   phosphorus: 8.0
  #   potassium: 8.0
  #   organic-matter: 12.0
  #   ph-change: 0.0
  #   compaction-change: -4.0
```

### Agricultural Governance Configuration

```yaml
agricultural-governance:
  # Layer 1: one long-term direction per Land/Nation.
  default-philosophy: "sustainable"
  default-policy: "fallow_rest"
  development-philosophies:
    sustainable:
      display-name: "Sustainable"
      description: "Lower volume, lower long-term risk, stronger recovery and upkeep stability."
      allowed-policies:
        - fallow_rest
        - autarky_isolationism
        - communal_shifts
        - boutique_agronomy
        - nomadic_foraging
      effects:
        upkeep-multiplier: 0.90
        production-multiplier: 0.95
        recovery-multiplier: 1.15
    industrial:
      display-name: "Industrial"
      description: "Higher output through chemicals, specialization, and territorial pressure."
      allowed-policies:
        - slash_and_burn
        - cash_crop_monopoly
        - guild_specialization
        - tech_agri
        - feudal_serfdom
      effects:
        upkeep-multiplier: 1.20
        production-multiplier: 1.20
        recovery-multiplier: 0.85

  # Layer 2: one active agricultural policy at a time.
  policies:
    fallow_rest:
      display-name: "Fallow Rest"
      philosophy: "sustainable"
      category: "ecological"
      description: "Temporarily protects farmland so soil health and organic matter recover quickly."
      transition-days: 7
      requirements:
        resting-land-required: true
        prevents-planting: true
        prevents-harvesting: true
      maintenance:
        upkeep-multiplier: 0.00
      effects:
        soil-health-recovery-multiplier: 2.50
        organic-recovery-multiplier: 2.50
        production-multiplier: 0.00
      consequences:
        - "No production while resting."
        - "Encourages territorial crop rotation and recovery zones."

    slash_and_burn:
      display-name: "Slash and Burn"
      philosophy: "industrial"
      category: "ecological"
      description: "Converts organic matter into short-term output at the cost of severe degradation."
      effects:
        production-multiplier: 2.50
        growth-time-multiplier: 0.50
        organic-recovery-multiplier: 0.25
        harvest-depletion-multiplier: 3.00
        monocrop-penalty-multiplier: 2.50
      consequences:
        - "Soil health collapses rapidly."
        - "Recovery becomes difficult after prolonged exploitation."
        - "Land can become barren if fully depleted."

    cash_crop_monopoly:
      display-name: "Cash Crop Monopoly"
      philosophy: "industrial"
      category: "economic"
      description: "Specializes the land around one crop family for export-focused production."
      requirements:
        specialization: "tomato"
      maintenance:
        quota-crop: "tomato"
        quota-amount: 500.0
      effects:
        production-multiplier: 2.50
        growth-time-multiplier: 0.90
        monocrop-penalty-multiplier: 1.80
      consequences:
        - "Other crops become inefficient."
        - "The economy becomes vulnerable to shortages and market shifts."

    autarky_isolationism:
      display-name: "Autarky Isolationism"
      philosophy: "sustainable"
      category: "economic"
      description: "Rewards self-sufficient nations with high crop diversity."
      requirements:
        crop-diversity-min: 80.0
      maintenance:
        upkeep-multiplier: 0.80
      effects:
        production-multiplier: 1.05
        organic-recovery-multiplier: 1.10
      consequences:
        - "Slower monetary growth."
        - "Lower dependency on external markets."

    guild_specialization:
      display-name: "Guild Specialization"
      philosophy: "industrial"
      category: "labor"
      description: "Turns Lands roles into agricultural jobs such as sower, caretaker, and harvester."
      requirements:
        players-required: 3
      effects:
        growth-time-multiplier: 0.90
        fertilizer-efficiency-multiplier: 1.20
        yield-bonus: 0.10
        premium-quality-bonus: 0.05
        seed-recovery-bonus: 0.05
      consequences:
        - "Manual teamwork becomes more valuable."
        - "Players outside their specialization can be penalized by future role hooks."

    communal_shifts:
      display-name: "Communal Shifts"
      philosophy: "sustainable"
      category: "labor"
      description: "Rewards coordinated harvest seasons where several nation members work together."
      maintenance:
        no-tool-durability-consumption: true
      effects:
        organic-recovery-multiplier: 1.15
        compaction-recovery-multiplier: 1.10
        yield-bonus: 0.05
      consequences:
        - "Solo farming is less efficient than organized work."

    boutique_agronomy:
      display-name: "Boutique Agronomy"
      philosophy: "sustainable"
      category: "labor"
      description: "Focuses on craftsmanship, quality, mutation chances, and low-volume premium crops."
      effects:
        production-multiplier: 0.60
        premium-quality-bonus: 0.15
        mutation-bonus: 0.10
        seed-recovery-bonus: 0.10
        harvest-depletion-multiplier: 0.75
        rotation-bonus-multiplier: 1.25
        organic-recovery-multiplier: 1.20
      consequences:
        - "Cannot support mass food production alone."

    nomadic_foraging:
      display-name: "Nomadic Foraging"
      philosophy: "sustainable"
      category: "territorial"
      description: "Integrates crops into forests, meadows, and scattered landscapes."
      effects:
        harvest-depletion-multiplier: 0.00
        compaction-recovery-multiplier: 1.50
        max-water-storage-multiplier: 1.25
        production-multiplier: 0.45
      consequences:
        - "Requires much larger territories for the same total output."
```

## Lands Integration

### Enable this on settings

settings.yml

```yaml
settings:
  soil-enabled: true
  lands:
    # Nothing is loaded or calculated unless this is enabled and a supported territory plugin is found.
    # provider: auto, lands, towny
    enabled: false
    provider: "towny" # auto, lands, towny
    # false = track each Towny town separately. true = track the whole Towny nation together.
    towny-use-nations: false
    # Cache values once a real Lands API hook is connected; 300 = five minutes    # Cache values once a real territory hook is connected; 300 = five minutes.
    cache-refresh-seconds: 300
    default-philosophy: "sustainable"
    default-policy: "sustainable"
    policies:
      sustainable:
        rotation-bonus-multiplier: 1.10
        organic-recovery-multiplier: 1.20
        yield-bonus: 0.05
        monocrop-penalty-multiplier: 1.00
      industrial:
        rotation-bonus-multiplier: 1.00
        organic-recovery-multiplier: 0.90
        yield-bonus: 0.10
        monocrop-penalty-multiplier: 2.00
```

### How this works?

1. MaskyCrops detects that \`settings.lands.enabled\` is true and that the Lands plugin is installed.
2. When planting, harvesting, fertilizing, or reclaiming a plot, MaskyCrops queries Lands: “Which claim does this location belong to?”
3. If the plot is within a claim, its H2 status is grouped under that claim’s ID.

Every cache-refresh-seconds, MaskyCrops recalculates the claim’s statistics:

### Placeholders

|                                      | Info                                                                                                                                                                                       |
| ------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `%maskycrops_land_soil_health%`      | Shows the overall agricultural health of the claim, on a scale from 0 to 100. It combines fertility, N/P/K, organic matter, pH, compaction, and diversity.                                 |
| `%maskycrops_land_crop_diversity%`   | Shows the agricultural diversity of the claim, on a scale from 0 to 100. It increases when you harvest crops from different families, such as nightshades, brassicas, legumes, or grasses. |
| `%maskycrops_land_average_nitrogen%` | Displays the average nitrogen level for all plots recorded within the claim, on a scale from 0 to 100. A low value reduces effective crop growth.                                          |
| `%maskycrops_land_specialization%`   | Shows the predominant crop family in the claim based on the most recent recorded harvests. For example: `nightshades`, `legumes`, `grasses`, or “`none`” if there are no harvests yet.     |


# MaskyArena

## Permissions

| Permissions                        | Fuctions                                    |
| ---------------------------------- | ------------------------------------------- |
| maskyarena.command.reload          | /ma reload all                              |
| maskyarena.arena.\<arena>          | /ma arena join \<arena>                     |
| maskyarena.arena.admin.\<arena>    | /ma arena join \<arena> (optional)\<player> |
| maskyarena.arena.leave             | /ma arena leave                             |
| maskyarena.arena.spectate.\<arena> | /ma spectate \<arena>                       |

## Commands

<table><thead><tr><th width="372">Commands</th><th>Fuctions</th></tr></thead><tbody><tr><td>/ma reload all</td><td>reload plugin configs</td></tr><tr><td>/ma arena join &#x3C;arena> (optional)&#x3C;player></td><td>Join a player to a Game</td></tr><tr><td>/mcp help</td><td>Help message</td></tr><tr><td>/ma arena spectate &#x3C;arena></td><td>Spectate a game if is available</td></tr></tbody></table>


# Example-config

```yaml
arenas:
  test_arena_hunters:
    display-name: "Test"
    type: HUNTERS #SURVIVAL
    worldgen-type: BEFORE_GAME
    world-view-distance: 8
    world-simulation-distance: 4
    bossbar-color: PURPLE
    max-instances: 3
    resistance-time: 200 #seconds (Only in RESISTANCE type)
    time-before-starting: 10 #seconds
    world: "test_arena"
    schematic: "fnaf1_map.schem"
    paste-location: "-33.5,-60,-43.5"
    spawn-survivors:
      - "-33.5,-60,-43.5"
    spawn-hunter: "-33.5,-59,-76.5"
    players:
      min-players: 2
      max-players: 5
    hunters:
      min-hunters: 1
      max-hunters: 1
    start-commands:
      - "say Started %arena_id%"
      - "minecraft:give %hunters% minecraft:iron_sword 1"
      - "title %hunters% title {\"text\":\"Hunt!\",\"color\":\"red\"}"
      - "title %survivors% title {\"text\":\"Survive the hunt!\",\"color\":\"green\"}"
    end-commands:
      - "say End %arena_id%"
    end-win-commands:
      - "say Winners (%winners_size%): %winners_csv%"
```

Explanation of functions

| Variable      | Fuction                                                                                                                      |
| ------------- | ---------------------------------------------------------------------------------------------------------------------------- |
| max-instances | The number of Instances or Worlds that can be created at the same time by the same Arena                                     |
| world         | The world that will be used as a basis to then create the instance with the name, for example `test_arena_instance_<number>` |

### Start Commands

| Variables       | Fuction                                                                                                                              |
| --------------- | ------------------------------------------------------------------------------------------------------------------------------------ |
| %world%         | The name of the world generated in the Arena.                                                                                        |
| %arena\_id%     | The id of the Arena Selected                                                                                                         |
| %arena\_name%   | The DisplayName of the Arena                                                                                                         |
| %players\_size% | The number of players available in the Arena                                                                                         |
| %hunters%       | This is a list of all possible hunters, and it will be replaced with their names. It will be executed for each available hunter.     |
| %survivors%     | This is a list of all possible survivors, and it will be replaced with their names. It will be executed for each available survivor. |

### End Commands

| Variables     | Fuction                                                                                                                              |
| ------------- | ------------------------------------------------------------------------------------------------------------------------------------ |
| %world%       | The name of the world generated in the Arena.                                                                                        |
| %arena\_id%   | The id of the Arena Selected                                                                                                         |
| %arena\_name% | The DisplayName of the Arena                                                                                                         |
| %hunters%     | This is a list of all possible hunters, and it will be replaced with their names. It will be executed for each available hunter.     |
| %survivors%   | This is a list of all possible survivors, and it will be replaced with their names. It will be executed for each available survivor. |

### End Win Commands

| Variables       | Fuction                                                                                                                              |
| --------------- | ------------------------------------------------------------------------------------------------------------------------------------ |
| %world%         | The name of the world generated in the Arena.                                                                                        |
| %arena\_id%     | The id of the Arena Selected                                                                                                         |
| %arena\_name%   | The DisplayName of the Arena                                                                                                         |
| %winners\_size% | The number of winners                                                                                                                |
| %winners\_csv%  |                                                                                                                                      |
| %winner%        | The first winner on the list                                                                                                         |
| %winners%       | This is a list of all Winnetrs, and it will be replaced with their names. It will be executed for each available hunter.             |
| %hunters%       | This is a list of all possible hunters, and it will be replaced with their names. It will be executed for each available hunter.     |
| %survivors%     | This is a list of all possible survivors, and it will be replaced with their names. It will be executed for each available survivor. |

## Types

### HUNTERS

In this mode, there are Survivors and Hunters. The Hunters have the task of eliminating the Survivors.

It is designed to be used with other plugins.

The Survivors win if the Hunters die.

The Hunters win if the Survivors die.

### SURVIVAL

In this mode, there are only Survivors; there is no way to win.&#x20;

The game ends when all Survivors die.

### RESISTANCE

In this mode, there are only survivors, and they only win if the counter reaches 0.

The game ends when all Survivors die.

If the counter reaches 0 and there are players still alive, the Survivors win.

## Worldgen Types

Both types are completely Empty new Worlds that depend on a schematic

with gamerules, `DISABLE_RAIDS`, `DO_PATROL_SPAWNING`, `DO_MOB_SPAWNING`, `DO_DAYLIGHT_CYCLE` in `false` with World Time in 12000 ticks, `viewDistance(4)`, `simulationDistance(2)`, `keepSpawnLoaded` in `false`

### BEFORE\_GAME

Arena worlds are created when the server starts (depending on the maximum number of instances), lightening the load on the server, and are used when needed.

### IN\_GAME

Worlds are created immediately before the game starts, up to the maximum number of instances possible, and are deleted once the game ends.

## Languages

This option exists in settings.yml, allowing you to change the plugin messages that are sent.

```yaml
lang: en
```

en.yml

```yml
messages:
  nopermission:
    message:
      - "%prefix% <red>You dont have perms to do that"
  reload:
    message:
      - "%prefix% <green>Plugin configuration has been reloaded"
  hunter_role:
    message:
      - "%prefix% <red>You are the Hunter!"
  survivor_role:
    message:
      - "%prefix% <green>You are a Guard!"
  game_started:
    message:
      - "%prefix% <gray>The game in arena %arena_name%"
      - "%prefix% <gray>Has started with <gold>%players_size%<gray> players!"
  enter_queue:
    message:
      - "%prefix% <green>You have entered in the queue of %game%."
  leave_queue:
    message:
      - "%prefix% <red>You have left the queue."
  full_queue:
    message:
      - "%prefix% <red>The queue is full, you can't get in!"
  already_in_game:
    message:
      - "%prefix% <red>You are already in a game."
  already_in_queue:
    message:
      - "%prefix% <gold>You're already in queue of %game%."
  game_no_found:
    message:
      - "%prefix% <red>The %game% could not be found."

  hunter_stray: "<gray>Animatronics Stray<dark_gray>: <gold>"
  survivor_alive: "<gray>Guards Alive<dark_gray>: <gold>"

  hunter_win: "<red>The Animatronics has won!"
  survivor_win: "<green>The Guards have won!"
  resistance_won: "<green>You have won by persevering!"

  not_enough_players: "<red>Not enough players to start the Game."
  survivors_failed_survive: "<red>The Guards failed to survive."
  game_type_scoreboard: "<gray>Game Type<dark_gray>: <gold>%type%"
  game_starting: "<gray>The game begins!"
  game_waiting_players: "<gray>Waiting for players..."
  game_finished: "<gold>End of the game."

  resistance_resist: "<gold>RESIST"
  resistance_time_left: "<gray>Time remaining<dark_gray>: <yellow>"
```


# MaskyCore


# Datapack integration

## Information

MaskyCore has special integration for CraftEngine structures. Originally, CraftEngine blocks are saved as `craftengine:custom_xxx`, but in this case, permission is added to allow them to be edited and use the exact format, such as `craftengine:elitefantasy:termite_nest[stage=empty]`

## What's the point of all this?

CraftEngine often assigns them a different ID, so when loading structures, they will have the wrong blocks instead of the correct ones, so when using MaskyCore, the plugin will search the NBT tags of the Craftengine structures for `craftengine:elitefantasy:termite_nest[stage=empty]`, and from there it will look up the correct ID on the server, convert it to `craftengine:custom_71101`, and then implement the datapack.

## Usage

Place the datapack in the `plugins/MaskyCore/datapacks/<name>/` directory along with its folder, for example, `MaskyCore/datapacks/masky_biomes_expansion/data`...etc.

The datapack will correct itself and be applied to `world/datapack/`

use `/maskycore datapack build`

{% hint style="warning" %}
For packages that use worldgen, the server must be restarted once the plugin has loaded.
{% endhint %}


# Modular World Generation

## Introduction

MaskyCore extends Minecraft datapacks with portable CraftEngine structures and configurable world generation modules.

Datapacks retain Minecraft’s standard resource format. Additional JSON definitions allow MaskyCore to apply generation logic supplied by registered modules.

The system is extensible: the volcanic caldera is one implementation, and future implementations can use the same loading, registration, and generation interfaces.

### Requirements

* Paper 26.2.
* Java 25.
* A MaskyCore build containing the modular world generation system.
* CraftEngine for portable structure conversion and custom block integration.

For developers building the plugin:

* JDK 25.
* Gradle 9.1 through the project’s Gradle Wrapper.
* Kotlin 2.3.0.
* The dependencies declared by the project.

The current project references a local `libs/Adapter-1.0.6.4.jar`. This file must be available when compiling.

### How It Works

The datapack and the plugin have separate responsibilities:

| Component                   | Responsibility                                                                                 |
| --------------------------- | ---------------------------------------------------------------------------------------------- |
| Standard datapack resources | Define biomes, configured features, placed features, structures, and other Minecraft resources |
| MaskyCore JSON definitions  | Select and configure registered generation modules                                             |
| Generation modules          | Implement terrain, surface, cave, and biome selection logic                                    |
| Portable structure compiler | Convert stable CraftEngine block references into server-specific states                        |

A datapack can configure multiple instances of an existing module type.

A new generation algorithm requires a new module implementation. Adding an unknown value to `type` does not automatically create that algorithm.

### Datapack Folder Structure

Place each extracted source datapack inside:

```
plugins/MaskyCore/datapacks/<pack>/
```

The pack must contain `pack.mcmeta` directly inside its folder.

Example:

```yaml
plugins/
└── MaskyCore/
    └── datapacks/
        └── example_pack/
            ├── pack.mcmeta
            └── data/
                └── example_pack/
                    ├── worldgen/
                    │   ├── biome/
                    │   ├── configured_feature/
                    │   ├── placed_feature/
                    │   └── structure/
                    ├── structure/
                    │   └── example.nbt
                    └── maskycore/
                        └── worldgen/
                            └── definitions/
                                └── example.json
```

Use the `pack.mcmeta` format required by your Minecraft version.

> Extract the datapack before placing it in the source directory. The module loader reads JSON files from directories, not from ZIP archives.

#### Source, Cache, and Installed Copies

| Location                                   | Purpose                      |
| ------------------------------------------ | ---------------------------- |
| `plugins/MaskyCore/datapacks/<pack>/`      | Editable source              |
| `plugins/MaskyCore/datapack-cache/<pack>/` | Compiled cache               |
| `<world>/datapacks/maskycore-<pack>/`      | Installed Minecraft datapack |

Always edit the source. Generated copies may be overwritten when the pack is rebuilt.

### Installation

#### 1. Add the source datapack

Place the extracted datapack in:

```
plugins/MaskyCore/datapacks/<pack>/
```

#### 2. Configure the destination world

In `plugins/MaskyCore/config.yml`:

```
datapacks:
  auto-build: true
  fallback-block: minecraft:stone
  register-structures-live: true
  install-to-world: true
  world-folder: world
  reload-after-install: true
```

Replace `world` with the destination world folder.

When `world-folder` is empty, MaskyCore reads `level-name` from `server.properties`.

#### 3. Build and inspect the datapack

After CraftEngine and MaskyCore have loaded:

```
/maskycore datapack build
/maskycore datapack status
```

| Command                      | Purpose                              |
| ---------------------------- | ------------------------------------ |
| `/maskycore datapack build`  | Compile and install source datapacks |
| `/maskycore datapack status` | Inspect datapack status and paths    |

#### 4. Enable modular generation

For a world using MaskyCore generation modules, configure `bukkit.yml`:

```yaml
worlds:
  world:
    generator: MaskyCore:worldgen
```

Replace `world` with the actual world name.

`MaskyCore:biomes` is also accepted as an alias.

#### 5. Restart the server

Restart the server completely after installing or updating world generation resources.

> During the first installation, MaskyCore may copy the datapack after Minecraft has already loaded its world generation registries. Another full startup is required before those resources become available.

Test generation in new chunks. Existing terrain is not rebuilt automatically.

### Reload Behavior

`/maskycore datapack build` compiles and installs resources. It does not replace the generator of an already loaded world.

A full restart is required when changing:

* World generation registries.
* Custom biomes.
* Generation module definitions.
* Generator configuration.

The `reload-after-install` option applies to resources that can safely reload. It does not make world generation registries reloadable.

### Portable CraftEngine Structures

CraftEngine assigns server-specific registry states to custom blocks. These identifiers may change between installations.

To keep structures portable, their NBT palettes can reference stable CraftEngine states:

```
craftengine:elitefantasy:termite_nest[stage=empty]
```

When MaskyCore compiles the datapack, it resolves that reference through CraftEngine and replaces it with the current server’s registry state, for example:

```
craftengine:custom_71101
```

The numeric identifier is only an example. Keep stable references in the source datapack.

#### Supported Structure Paths

Conversion applies to structure NBT files under:

```
data/<namespace>/structure/**/*.nbt
data/<namespace>/structures/**/*.nbt
```

Other resources are copied without this conversion.

Missing CraftEngine states use `datapacks.fallback-block` and are listed in the compilation report.

### Module Definition Format

Module definitions are stored in:

```
data/<namespace>/maskycore/worldgen/definitions/<name>.json
```

Common fields:

```
{
  "id": "example_pack:custom_region",
  "type": "example_plugin:registered_type",
  "enabled": true,
  "priority": 50
}
```

This example describes the format. `example_plugin:registered_type` must have an actual registered factory.

| Field             | Required       | Description                                                                |
| ----------------- | -------------- | -------------------------------------------------------------------------- |
| `id`              | No             | Instance identifier. Derived from the namespace and file path when omitted |
| `type`            | Yes            | Registered factory responsible for interpreting the definition             |
| `enabled`         | No             | Defaults to `true`. Set to `false` to exclude the instance                 |
| `priority`        | No             | Defaults to `0`. Controls module ordering                                  |
| Additional fields | Type-dependent | Parsed and validated by the selected factory                               |

Use lowercase namespaced identifiers without spaces or accented characters.

Multiple definitions can use the same `type`, provided they have distinct instance IDs.

#### Definition Precedence

MaskyCore reads cached definitions first, followed by source definitions.

A valid source definition replaces a cached definition with the same `id`.

Avoid duplicate IDs across packs.

> To disable a module, keep its definition and set `enabled` to `false`. Deleting only the source file may leave an older definition in the cache.

### Module Priority

Higher values take precedence, with different execution rules for biome selection and block generation:

* **Biome selection:** modules are consulted from highest to lowest priority. The first resolvable biome result is used.
* **Terrain, surface, and cave generation:** lower-priority modules execute first within each phase; higher-priority modules write afterward.

Priority does not automatically merge geometries or prevent overlapping modifications.

A later generation phase may also modify blocks written during an earlier phase.

Use distinct priorities when ordering matters.

### Included Type: Volcanic Caldera

The built-in volcanic implementation uses:

```
maskycore:volcanic_caldera
```

Example definition using the expansion datapack’s biome IDs:

```json
{
  "id": "masky_biomes_expansion:sulfur_caldera",
  "type": "maskycore:volcanic_caldera",
  "enabled": true,
  "priority": 100,
  "biomes": {
    "crater": "masky_biomes_expansion:sulfur_caldera/caldera",
    "fumarolic_fields": "masky_biomes_expansion:sulfur_caldera/fumarolic_fields",
    "ash_slopes": "masky_biomes_expansion:sulfur_caldera/ash_slopes",
    "lava_tubes": "masky_biomes_expansion:sulfur_caldera/lava_tubes",
    "allowed_vanilla_biomes": [
      "minecraft:desert",
      "minecraft:badlands",
      "minecraft:eroded_badlands",
      "minecraft:savanna",
      "minecraft:savanna_plateau"
    ]
  },
  "placement": {
    "spacing": 3072,
    "separation": 1100,
    "salt": 26100262,
    "rarity": 0.38,
    "sample_radius": 128,
    "required_allowed_samples": 3
  },
  "terrain": {
    "radius_min": 280.0,
    "radius_max": 440.0,
    "base_height": 72,
    "rim_height": 92.0,
    "crater_depth": 32.0,
    "crater_radius_ratio": 0.34,
    "blend_width_ratio": 0.24,
    "lava_level": 58
  }
}
```

The referenced biome resources must exist in the datapack and be registered during startup.

#### Configuration Sections

| Section     | Purpose                                                               |
| ----------- | --------------------------------------------------------------------- |
| `biomes`    | Select biome IDs and allowed placement biomes                         |
| `placement` | Configure candidate spacing, rarity, sampling, and seed variation     |
| `terrain`   | Configure size, elevation, crater shape, deformation, and transitions |
| `surface`   | Configure foundation blocks, palettes, and materials                  |
| `tubes`     | Configure lava tube generation                                        |
| `fumaroles` | Configure vent generation                                             |

`rarity` is a probability per candidate grid cell. It is not the percentage of the world occupied by the biome.

Placement eligibility samples nine positions around the candidate center. `required_allowed_samples` specifies how many must match the allowed biome list.

An empty `allowed_vanilla_biomes` list removes that restriction.

These fields belong to the volcanic implementation. Other module types may define different settings.

### Generator Blocks and Palettes

The volcanic module accepts vanilla materials as strings:

```
{
  "foundation": "minecraft:basalt"
}
```

Custom materials can specify a fallback:

```json
{
  "foundation": {
    "id": "elitefantasy:custom_rock",
    "fallback": "minecraft:basalt"
  }
}
```

Palettes support positive relative weights:

```json
{
  "ash": [
    {
      "block": {
        "id": "elitefantasy:ashes_block",
        "fallback": "minecraft:tuff"
      },
      "weight": 7
    },
    {
      "block": "minecraft:basalt",
      "weight": 3
    }
  ]
}
```

Place these fields inside the definition’s `surface` object.

Weights control relative selection. They do not guarantee an exact block percentage in each chunk.

#### Generator IDs Versus Structure States

The generator resolves a CraftEngine block by its ID and uses its **default state**:

```
elitefantasy:custom_rock
```

The portable NBT syntax is different:

```
craftengine:elitefantasy:termite_nest[stage=empty]
```

The generator’s current block resolver does not interpret that portable state syntax.

Per-block worldgen fallbacks are separate from `datapacks.fallback-block`, which belongs to structure compilation.

Use a consistent fallback for each custom ID because generator block resolution is cached by ID.

### Developer API

A new implementation supplies a `WorldgenModuleFactory`.

The factory receives:

* `WorldgenDefinition`: common fields, complete JSON configuration, and source path.
* `WorldgenFactoryContext`: block resolver and logger.

It parses and validates its configuration before returning a module.

Example integration, assuming `CanyonModule` has been implemented:

```java
class CanyonModuleFactory : WorldgenModuleFactory {
    override val type = "myplugin:canyon"

    override fun create(
        definition: WorldgenDefinition,
        context: WorldgenFactoryContext
    ): WorldgenModule {
        return CanyonModule(definition, context)
    }
}
```

This example shows the extension point. It does not implement a canyon algorithm.

#### Available Interfaces

| Interface                  | Responsibility                                          |
| -------------------------- | ------------------------------------------------------- |
| `WorldgenModule`           | Identity, priority, managed biomes, and biome selection |
| `NoiseWorldgenModule`      | Base terrain modifications                              |
| `SurfaceWorldgenModule`    | Surface modifications                                   |
| `CaveWorldgenModule`       | Cave modifications                                      |
| `BlockStateResolver`       | Material resolution                                     |
| `WorldgenDefinitionSource` | Definition loading                                      |

Modules implement only the generation phases they need.

`biomeIdAt` should return `null` outside the module’s area of influence. A module that does not assign biomes can return `null` everywhere and declare an empty `managedBiomeIds` set.

`legacyBiomeFallbackId` optionally replaces managed biome results from the underlying distribution outside the module’s area. Use `null` when this behavior is unnecessary.

Generation callbacks receive a `WorldgenChunkContext` containing world information, chunk coordinates, `ChunkData`, and the block resolver.

Implementations should:

* Restrict writes to the supplied chunk and world height limits.
* Produce consistent results for the same seed and coordinates.
* Handle concurrent generation calls safely.
* Avoid depending on chunk generation order.

#### Registering an Included Module

Add the factory’s fully qualified class name to:

```
src/main/resources/META-INF/services/io.elitefantasy.maskyCore.worldgen.api.WorldgenModuleFactory
```

Example entry:

```
my.package.CanyonModuleFactory
```

Keep existing provider entries. Factories discovered through Java SPI must be


# Unique behaviors of CraftEngine

Behaviors specifically programmed for CraftEngine :)

## Item Behaviors

### Shift Place Block Item Behavior

Allows you to place a block while sneaking

```yaml
items:
  minecraft:oak_slab:
    behaviors:
      - type: painter:shift_place_block
        block: elitefantasy:oak_vertical_slab
```

### Termite Bucket Item Behavior

Store mythicmobs "Termite" mob

```yaml
items:
  elitefantasy:termite_bucket:
    material: BUCKET
    texture: elitefantasy:item/termite_bucket
    data:
      item-name: "<!i><white><l10n:item.termite_bucket>"
      lore:
        - '<gray>Right click a block to release one termite.'
    behaviors:
      - type: painter:termite_bucket
        empty-bucket-material: BUCKET
```

### Block Speed Item Behavior

```yaml
items:
  elitefantasy:ostrich_boots:
    material: leather_boots
    texture: elitefantasy:item/ostrich_boots
    data:
      unbreakable: false
      max_damage: 195
      dyed_color: 255,255,255
    settings:
      equipment:
        asset_id: elitefantasy:ostrich_boots
        slot: feet
    behaviors:
      - type: painter:block_speed
        speed-amplifier: 0
        duration-ticks: 40
        blocks:
          - SAND
          - RED_SAND
          - SUSPICIOUS_SAND
```

### Crop Accelerator Item Behavior

```yaml
items:
  elitefantasy:sawdust:
    material: SUGAR
    data:
      item-name: "<!i><white><l10n:item.sawdust>"
      lore:
        - '<gray>Sprinkle onto crops before harvesting.'
    behaviors:
      - type: painter:crop_accelerator
        multiplier: 2
        consume-item: true
        mark-duration-ticks: 1200
        valid-crops:
          - WHEAT
          - CARROTS
          - POTATOES
          - BEETROOTS
          - NETHER_WART
```

### Frozen Totem of Undying Item Behavior

```yaml
items:
  elitefantasy:frozen_totem_of_undying:
    data:
      item_name: "<!i><white>Frozen Totem of Undying"
    material: totem_of_undying
    texture: elitefantasy:item/frozen_totem_of_undying
    behaviors:
      - type: painter:frozen_totem_of_undying
        item-model: elitefantasy:frozen_totem_of_undying
        radius: 6.0
        freeze-ticks: 140
        slowness-duration: 120
        slowness-amplifier: 2
```

## Block Behaviors

### Column Block Behavior

| Property Name | Property Type | Required |
| ------------- | ------------- | -------- |
| up            | string        | yes      |
| middle        | string        | yes      |
| down          | string        | yes      |
| single        | string        | yes      |

```yaml
  painter:white_column:
    behavior:
      - type: painter:column_block
    states:
      properties:
        position:
          type: painter:column_block
          default: down
      appearances:
        position=up:
          auto-state: cactus
          model:
            path: "painter:block/white_column_up"
        position=middle:
          auto-state: cactus
          model:
            path: "painter:block/white_column_middle"
        position=down:
          auto-state: cactus
          model:
            path: "painter:block/white_column_down"
        position=single:
          auto-state: cactus
          model:
            path: "painter:block/white_column_down"
      variants:
        position=up:
          appearance: "position=up"
        position=middle:
          appearance: "position=middle"
        position=down:
          appearance: "position=down"
        position=single:
          appearance: "position=single"
```

### Window Connect Tile Block Behavior

| Property Name | Property Type | Required |
| ------------- | ------------- | -------- |
| single        | string        | yes      |
| left          | string        | yes      |
| middle        | string        | yes      |
| right         | string        | yes      |
| up\_left      | string        | yes      |
| up            | string        | yes      |
| up\_right     | string        | yes      |
| down\_left    | string        | yes      |
| down          | string        | yes      |
| down\_right   | string        | yes      |

```yaml
templates:
  painter:block/oak_window_directional:
    behavior:
      - type: painter:window_connect_tile
    states:
      properties:
        tile:
          type: painter:window_connect_tile
          default: single
        facing:
          type: 4-direction
          default: north
      appearances:
############
## SINGLE ##
############
      # EAST #      
        facing=east,tile=single:
          state: iron_door[facing=east,half=lower,hinge=left,open=false,powered=true]
          transparent: true
          entity-renderer:
            item: ${item}
            yaw: -90
            translation: 0,0,-0.81
      # NORTH #
        facing=north,tile=single:
          state: iron_door[facing=north,half=lower,hinge=left,open=false,powered=true]
          transparent: true
          entity-renderer:
            item: ${item}
            yaw: 180
            translation: 0,0,-0.81
      # SOUTH #
        facing=south,tile=single:
          state: iron_door[facing=south,half=lower,hinge=left,open=false,powered=true]
          transparent: true
          entity-renderer:
            item: ${item}
            #yaw: 0
            translation: 0,0,-0.81
      # WEST #
        facing=west,tile=single:
          state: iron_door[facing=west,half=lower,hinge=left,open=false,powered=true]
          transparent: true
          entity-renderer:
            item: ${item}
            yaw: 90
            translation: 0,0,-0.81
######################
## OTHER_PROPERTIES ##
######################
            
       variants:
        facing=east,tile=single:
          appearance: facing=east,tile=single
        facing=north,tile=single:
          appearance: facing=north,tile=single
        facing=south,tile=single:
          appearance: facing=south,tile=single
        facing=west,tile=single:
          appearance: facing=west,tile=single
```

### Sofa Connect Tile Block Behavior

| Property Name | Property Type | Required |
| ------------- | ------------- | -------- |
| single        | string        | yes      |
| left          | string        | yes      |
| middle        | string        | yes      |
| right         | string        | yes      |

```yaml
templates:
  painter:block/oak_window_directional:
    behavior:
      - type: painter:sofa_connect_tile
    states:
      properties:
        tile:
          type: painter:sofa_connect_tile
          default: single
        facing:
          type: 4-direction
          default: north
      appearances:
############
## SINGLE ##
############
      # EAST #      
        facing=east,tile=single:
          state: iron_door[facing=east,half=lower,hinge=left,open=false,powered=true]
          transparent: true
          entity-renderer:
            item: ${item}
            yaw: -90
            translation: 0,0,-0.81
      # NORTH #
        facing=north,tile=single:
          state: iron_door[facing=north,half=lower,hinge=left,open=false,powered=true]
          transparent: true
          entity-renderer:
            item: ${item}
            yaw: 180
            translation: 0,0,-0.81
      # SOUTH #
        facing=south,tile=single:
          state: iron_door[facing=south,half=lower,hinge=left,open=false,powered=true]
          transparent: true
          entity-renderer:
            item: ${item}
            #yaw: 0
            translation: 0,0,-0.81
      # WEST #
        facing=west,tile=single:
          state: iron_door[facing=west,half=lower,hinge=left,open=false,powered=true]
          transparent: true
          entity-renderer:
            item: ${item}
            yaw: 90
            translation: 0,0,-0.81
######################
## OTHER_PROPERTIES ##
######################
            
      variants:
        facing=east,tile=single:
          appearance: facing=east,tile=single
        facing=north,tile=single:
          appearance: facing=north,tile=single
        facing=south,tile=single:
          appearance: facing=south,tile=single
        facing=west,tile=single:
          appearance: facing=west,tile=single
```

### FishTank Block Behavior

This behavior has no other unique properties; the supported fishes are `COD`, `SALMON`, `TROPICAL_FISH`, `PUFFERFISH`, `AXOLOTL` & `TADPOLE`

```yaml
templates:
  painter:block/oak_window_directional:
    behavior:
      - type: painter:fish_tank
    states:
      properties:
        fish:
          type: painter:fish_type
```

### AshesMerge Behavior

This needs a custom stuff to work fine

```yaml
  elitefantasy:block/elitefantasy_block_ashes_block:
    behaviors:
      - type: painter:ashes_merge
      - type: stackable_block
        property: layers
        items:
          - elitefantasy:ashes_block
    states:
      properties:
        layers:
          type: int
          default: 1
          range: 1~8
      appearances:
        layers=8:
          ## ..etc
        layers=7:
          ## ..etc
        layers=6:
          ## ..etc
        layers=5:
          ## ..etc
        ## ..etc
      variants:
        layers=1:
          appearance: layers=1
        layers=2:
          appearance: layers=2
        layers=3:
          appearance: layers=3
        ## ..etc
```

### Curtain Block Behavior

| Property Name | Property Type | Required |
| ------------- | ------------- | -------- |
| single        | string        | yes      |
| bottom        | string        | yes      |
| middle        | string        | yes      |
| top           | string        | yes      |

```yaml
items:
  elitefantasy:curtain_blue:
    behavior:
      type: block_item
      block:
        behaviors:
          - type: painter:curtain_block
        states:
          template: elitefantasy:block_state/curtain
          arguments:
            color: blue
templates:
  elitefantasy:block_state/curtain:
    properties:
      facing:
        type: 4-direction
        default: north
      open:
        type: boolean
        default: false
      powered:
        type: boolean
        default: false
      ypos:
        type: painter:curtain_ypos
        default: single
    appearances:
      # false,false,none
      facing=east,open=false,powered=false,ypos=single:
        state: minecraft:glow_lichen[down=false,east=true,north=false,south=false,up=false,waterlogged=false,west=false]
        transparent: true
        entity_renderer:
          item: elitefantasy:curtain_single_closed_${color}
          rotation: 90
      facing=north,open=false,powered=false,ypos=single:
        state: minecraft:glow_lichen[down=false,east=false,north=true,south=false,up=false,waterlogged=false,west=false]
        transparent: true
        entity_renderer:
          item: elitefantasy:curtain_single_closed_${color}
          rotation: 0
```

### Shower Curtain Block Behavior

| Property Name | Property Type | Required |
| ------------- | ------------- | -------- |
| single        | string        | yes      |
| left          | string        | yes      |
| middle        | string        | yes      |
| right         | string        | yes      |

```yaml
items:
  elitefantasy:shower_curtain:
    behavior:
      type: block_item
      block:
        behavior:
          - type: painter:shower_curtain_block
        states:
          properties:
            facing:
              type: 4-direction
              default: north
            pos:
              type: elitefantasy:sofa_connect_tile
              default: single
            open:
              type: boolean
              default: false
            powered:
              type: boolean
              default: false
          appearances:
            facing=east,pos=single,open=false,powered=false:
              state: minecraft:glow_lichen[down=false,east=true,north=false,south=false,up=false,waterlogged=false,west=false]
              transparent: true
              entity-renderer:
                item: elitefantasy:shower_curtain_single_closed
                rotation: 90
                translation: 0,-1,0
## ETC
```

### Mini Cubes Block Behavior

```yaml
templates:
  painter:block/mini_cubes_8x8_oak:
    loot:
      template: painter:loot_table/mini_cubes
      arguments:
        item: ${item}
    behaviors:
      - type: painter:mini_cubes
        cubes: mini_cubes
        item: ${item}
        material: ${material:-default}
        mode: full_8
        remove-with-shift: true
        flip-x: true
        flip-y: false
        flip-z: true
        sounds:
          place-sound: minecraft:block.${sound_type}.place
          break-sound: minecraft:block.${sound_type}.break
    states:
      template: painter:states/mini_cubes_8x8
      arguments:
        item: ${item}

  painter:states/mini_cubes_8x8:
    properties:
      mini_cubes:
        type: painter:mini_cubes
        default: c1
    appearances:
      mini_cubes=c1:
        state: barrier
        transparent: true
        entity-renderer:
          item: ${item}_shape_1
          translation: 0,0,0
      mini_cubes=c2:
        state: barrier
        transparent: true
        entity-renderer:
          item: ${item}_shape_10
          translation: 0,0,0
      mini_cubes=c3:
        state: barrier
        transparent: true
        entity-renderer:
          item: ${item}_shape_11
          translation: 0,0,0
      mini_cubes=c4:
        state: barrier
        transparent: true
        entity-renderer:
          item: ${item}_shape_100
          translation: 0,0,0
      mini_cubes=c5:
        state: barrier
        transparent: true
        entity-renderer:
          item: ${item}_shape_101
          translation: 0,0,0
#..etc
    variants:
      mini_cubes=c245:
        appearance: mini_cubes=c245
      mini_cubes=c246:
        appearance: mini_cubes=c246
      mini_cubes=c247:
        appearance: mini_cubes=c247
      mini_cubes=c248:
        appearance: mini_cubes=c248
      mini_cubes=c249:
        appearance: mini_cubes=c249
      mini_cubes=c250:
        appearance: mini_cubes=c250
      mini_cubes=c251:
        appearance: mini_cubes=c251
      mini_cubes=c252:
        appearance: mini_cubes=c252
      mini_cubes=c253:
        appearance: mini_cubes=c253
      mini_cubes=c254:
        appearance: mini_cubes=c254
      mini_cubes=c255:
        appearance: mini_cubes=c255
```

### Pointed Dripstone Block Behavior

It lets you create unique pointed dripstones

#### Thickness

| Property Name | Property Type | Required |
| ------------- | ------------- | -------- |
| tip           | string        | yes      |
| tip\_merge    | string        | yes      |
| frustrum      | string        | yes      |
| middle        | string        | yes      |
| base          | string        | yes      |

#### Vertical direction

| Property Name | Property Type | Required |
| ------------- | ------------- | -------- |
| up            | string        | yes      |
| down          | string        | yes      |

```yaml
blocks:
  elitefantasy:ice_pointed_dripstone:
    behaviors:
      - type: "painter:pointed_dripstone"
    settings:
      item: elitefantasy:ice_pointed_dripstone
      hardness: 1.5
      resistance: 3.0
      map_color: 31
      replaceable: false
      is_randomly_ticking: true
      push-reaction: destroy
      sounds:
        break: minecraft:block.pointed_dripstone.break
        step: minecraft:block.pointed_dripstone.step
        place: minecraft:block.pointed_dripstone.place
        hit: minecraft:block.pointed_dripstone.hit
        fall: minecraft:block.pointed_dripstone.fall
    states:
      properties:
        thickness:
          type: "painter:pointed_dripstone_thickness"
          default: tip
        vertical_direction:
          type: "painter:pointed_dripstone_vertical_direction"
          default: up
      appearances:
        thickness=base,vertical_direction=down:
          auto_state: cactus
          model:
            path: "elitefantasy:block/ice_pointed_dripstone_down_base"
            generation:
              parent: "minecraft:block/pointed_dripstone"
              textures:
                cross: "elitefantasy:block/ice_pointed_dripstone_down_base"
        thickness=base,vertical_direction=up:
          auto_state: tripwire
          model:
            path: "elitefantasy:block/ice_pointed_dripstone_up_base"
            generation:
              parent: "minecraft:block/pointed_dripstone"
              textures:
                cross: "elitefantasy:block/ice_pointed_dripstone_up_base"
#..etc
```

### Amethyst Crystal Block Behavior

```yaml
templates:
  elitefantasy:block/frozen_crystal_bud:
    behaviors:
      - type: "painter:amethyst_crystal"
    settings:
      item: ${__NAMESPACE__}:${__ID__}
    states:
      properties:
        facing:
          type: "painter:amethyst_facing"
          default: up
      appearances:
        down:
          auto_state: tripwire
          model:
            x: 180
            path: "${model_path}"
            generation:
              parent: minecraft:block/cross
              textures:
                cross: "${model_path}"
        east:
          auto_state: tripwire
          model:
            x: 90
            y: 90
            path: "${model_path}"
            generation:
              parent: minecraft:block/cross
              textures:
                cross: "${model_path}"
        north:
          auto_state: tripwire
          model:
            x: 90
            path: "${model_path}"
            generation:
              parent: minecraft:block/cross
              textures:
                cross: "${model_path}"
#..etc
      variants:
        facing=down:
          appearance: down
        facing=east:
          appearance: east
        facing=north:
          appearance: north
        facing=south:
          appearance: south
        facing=up:
          appearance: up
        facing=west:
          appearance: west
```

### Budding Amethyst Block Behavior

```yaml
blocks:
  elitefantasy:budding_frozen_crystal:
    behaviors:
      - type: "painter:budding_amethyst"
        small-bud: elitefantasy:small_frozen_crystal_bud
        medium-bud: elitefantasy:medium_frozen_crystal_bud
        large-bud: elitefantasy:large_frozen_crystal_bud
        cluster: elitefantasy:frozen_crystal_cluster
        chance: 5
    settings:
      item: elitefantasy:budding_frozen_crystal
    state:
      auto_state: solid
      model:
        path: "elitefantasy:block/budding_frozen_crystal"
        generation:
          parent: "minecraft:block/cube_all"
          textures:
            all: "elitefantasy:block/budding_frozen_crystal"
```

### Brittle Ice Block Behavior

```yaml
items:
  elitefantasy:brittle_ice:
    model:
      path: "elitefantasy:block/brittle_ice_0"
    behavior:
      type: block_item
      block:
        behavior:
          - type: painter:brittle_ice
            break-delay-ticks: 60
            cracked-delay-ticks: 20
            middle-delay-ticks: 40
            broken-delay-ticks: 52
            instant-break-fall-distance: 3.0
            instant-break-radius: 1 # 0 = 1x1, 1 = 3x3, 2 = 5x5
            crack-sound: minecraft:block.glass.hit
            break-sound: minecraft:block.glass.break
            particle: minecraft:snowflake
            stage-sound-volume: 0.18
        states:
          properties:
            stage:
              type: painter:brittle_ice_stage
              default: normal
          appearances:
            stage=normal:
              auto_state: solid
              model:
                path: "elitefantasy:block/brittle_ice_0"
            stage=cracked:
              auto_state: solid
              model:
                path: "elitefantasy:block/brittle_ice_1"
                generation:
                  parent: "minecraft:block/cube_all"
                  textures:
                    all: "minecraft:block/frosted_ice_1"
#..etc
          variants:
            stage=normal:
              appearance: stage=normal
            stage=cracked:
              appearance: stage=cracked
            stage=middle:
              appearance: stage=middle
            stage=broken:
              appearance: stage=broken
```

### MultiFace Atacched Block Behavior

```yml
blocks:
  elitefantasy:ice_layer:
    behaviors:
      - type: painter:multiface_attached_block
    states:
      properties:
        down:
          type: boolean
          default: false
        east:
          type: boolean
          default: false
        north:
          type: boolean
          default: false
        south:
          type: boolean
          default: false
        up:
          type: boolean
          default: false
        west:
          type: boolean
          default: false
      appearances:
        none:
          state: minecraft:barrier
        down:
          state: minecraft:tripwire[attached=false,disarmed=false,east=false,north=false,powered=false,south=false,west=false]
          transparent: true
          entity_renderer:
            - type: item_display
              item: elitefantasy:ice_layer_render_down
              display_transform: fixed
              billboard: fixed
              translation: 0,0,0
              scale: 1
        east:
          state: minecraft:tripwire[attached=false,disarmed=false,east=false,north=false,powered=false,south=false,west=false]
          transparent: true
          entity_renderer:
            - type: item_display
              item: elitefantasy:ice_layer_render_west
              display_transform: fixed
              billboard: fixed
              translation: 0,0,0
              scale: 1
#..etc
      variants:
        down=false,east=false,north=false,south=false,up=false,west=false:
          appearance: none
        down=true,east=false,north=false,south=false,up=false,west=false:
          appearance: down
        down=false,east=true,north=false,south=false,up=false,west=false:
          appearance: east
        down=true,east=true,north=false,south=false,up=false,west=false:
          appearance: down_east
        down=false,east=false,north=true,south=false,up=false,west=false:
          appearance: north
        down=true,east=false,north=true,south=false,up=false,west=false:
          appearance: down_north
        down=false,east=true,north=true,south=false,up=false,west=false:
          appearance: east_north
        down=true,east=true,north=true,south=false,up=false,west=false:
          appearance: down_east_north
        down=false,east=false,north=false,south=true,up=false,west=false:
          appearance: south
        down=true,east=false,north=false,south=true,up=false,west=false:
          appearance: down_south
        down=false,east=true,north=false,south=true,up=false,west=false:
          appearance: east_south
        down=true,east=true,north=false,south=true,up=false,west=false:
          appearance: down_east_south
        down=false,east=false,north=true,south=true,up=false,west=false:
          appearance: north_south
        down=true,east=false,north=true,south=true,up=false,west=false:
          appearance: down_north_south
        down=false,east=true,north=true,south=true,up=false,west=false:
          appearance: east_north_south
        down=true,east=true,north=true,south=true,up=false,west=false:
          appearance: down_east_north_south 
```

### Timed Redstone Delay Block Behavior

```yaml
blocks:
  elitefantasy:frozen_crystal_block:
    behaviors:
      - type: painter:timed_redstone_relay
        seconds-per-power: 60
        property: redstone_power
    states:
      properties:
        redstone_power:
          type: int
          range: 0~15
          default: 0
      appearances:
        off:
          auto_state: solid
          model:
            path: elitefantasy:block/frozen_crystal_block
        on:
          auto_state: solid
          model:
            path: elitefantasy:block/frozen_crystal_block_powered
      variants:
        redstone_power=0:
          appearance: off
          settings:
            luminance: 0
        redstone_power=1:
          appearance: on
          settings:
            luminance: 1
        redstone_power=2:
          appearance: on
          settings:
            luminance: 2
        redstone_power=3:
          appearance: on
          settings:
            luminance: 3
        redstone_power=4:
          appearance: on
          settings:
            luminance: 4
        redstone_power=5:
          appearance: on
          settings:
            luminance: 5
        redstone_power=6:
          appearance: on
          settings:
            luminance: 6
        redstone_power=7:
          appearance: on
          settings:
            luminance: 7
        redstone_power=8:
          appearance: on
          settings:
            luminance: 8
#..etc
```

### Wall Block Behavior

```yaml
items:
  painter:snow_bricks_wall:
    material: BRICK
    client-bound-data:
      item-name: <!i><white><l10n:item.snow_bricks_wall>
    model:
      template: painter:model/painter_snow_bricks_wall_inventory
      arguments:
        model: elitefantasy:block/snow_bricks
    behavior:
      type: block_item
      block:
        template: painter:block/painter_snow_bricks_wall
        arguments:
          item: painter:snow_bricks_wall
          block_model: elitefantasy:block/snow_bricks
          wall_post_item: painter:snow_bricks_wall_post
          wall_side_item: painter:snow_bricks_wall_side
          wall_side_tall_item: painter:snow_bricks_wall_side_tall
          sound_type: snow
  painter:snow_bricks_wall_post:
    material: BRICK
    model:
      template: painter:model/painter_snow_bricks_wall_post
      arguments:
        model: elitefantasy:block/snow_bricks
  painter:snow_bricks_wall_side:
    material: BRICK
    model:
      template: painter:model/painter_snow_bricks_wall_side
      arguments:
        model: elitefantasy:block/snow_bricks
  painter:snow_bricks_wall_side_tall:
    material: BRICK
    model:
      template: painter:model/painter_snow_bricks_wall_side_tall
      arguments:
        model: elitefantasy:block/snow_bricks
          
templates:
  painter:block/painter_snow_bricks_wall:
    behaviors:
      - type: painter:wall_block
    loot:
      pools:
        - rolls: 1
          conditions:
            - type: survives_explosion
          entries:
            - type: item
              item: ${item}
    settings:
      item: ${item}
      map-color: 8
      hardness: 0.75
      resistance: 1.5
      tags:
        - minecraft:mineable/pickaxe
        - minecraft:walls
      is_suffocating: false
      is_redstone_conductor: false
      sounds:
        break: minecraft:block.${sound_type}.break
        step: minecraft:block.${sound_type}.step
        place: minecraft:block.${sound_type}.place
        hit: minecraft:block.${sound_type}.hit
        fall: minecraft:block.${sound_type}.fall
        destroy: minecraft:block.anvil.destroy
    states:
      template: painter:block_state/snow_bricks_wall
      arguments:
        base_block: stone_brick_wall
        wall_post_item: ${wall_post_item}
        wall_side_item: ${wall_side_item}
        wall_side_tall_item: ${wall_side_tall_item}
        item: ${item}
        
  painter:block_state/snow_bricks_wall:
    properties:
      up:
        type: boolean
        default: true
      north:
        type: painter:wall_connection
        default: none
      east:
        type: painter:wall_connection
        default: none
      south:
        type: painter:wall_connection
        default: none
      west:
        type: painter:wall_connection
        default: none
      waterlogged:
        type: boolean
        default: false
    appearances:
      up=true,north=none,east=none,south=none,west=none,waterlogged=false:
        state: ${base_block}[up=true,north=none,east=none,south=none,west=none,waterlogged=false]
        entity-renderer:
          - item: ${wall_post_item}
            rotation: 180
            scale: 1.0003
            translation: 0,0.0001,0
        transparent: true
      up=true,north=none,east=none,south=none,west=low,waterlogged=false:
        state: ${base_block}[up=true,north=none,east=none,south=none,west=low,waterlogged=false]
        entity-renderer:
          - item: ${wall_post_item}
            rotation: 180
            scale: 1.0003
            translation: 0,0.0001,0
          - item: ${wall_side_item}
            rotation: 90
        transparent: true
      up=true,north=none,east=none,south=none,west=tall,waterlogged=false:
        state: ${base_block}[up=true,north=none,east=none,south=none,west=tall,waterlogged=false]
        entity-renderer:
          - item: ${wall_post_item}
            rotation: 180
            scale: 1.0003
            translation: 0,0.0001,0
          - item: ${wall_side_tall_item}
            rotation: 90
        transparent: true
      up=true,north=none,east=none,south=low,west=none,waterlogged=false:
        state: ${base_block}[up=true,north=none,east=none,south=low,west=none,waterlogged=false]
        entity-renderer:
          - item: ${wall_post_item}
            rotation: 180
            scale: 1.0003
            translation: 0,0.0001,0
          - item: ${wall_side_item}
            rotation: 0
        transparent: true
#..etc
    variants:
      up=true,north=none,east=none,south=none,west=none,waterlogged=false:
        appearance: up=true,north=none,east=none,south=none,west=none,waterlogged=false
      up=true,north=none,east=none,south=none,west=low,waterlogged=false:
        appearance: up=true,north=none,east=none,south=none,west=low,waterlogged=false
      up=true,north=none,east=none,south=none,west=tall,waterlogged=false:
        appearance: up=true,north=none,east=none,south=none,west=tall,waterlogged=false
      up=true,north=none,east=none,south=low,west=none,waterlogged=false:
        appearance: up=true,north=none,east=none,south=low,west=none,waterlogged=false
      up=true,north=none,east=none,south=low,west=low,waterlogged=false:
        appearance: up=true,north=none,east=none,south=low,west=low,waterlogged=false
      up=true,north=none,east=none,south=low,west=tall,waterlogged=false:
        appearance: up=true,north=none,east=none,south=low,west=tall,waterlogged=false
      up=true,north=none,east=none,south=tall,west=none,waterlogged=false:
        appearance: up=true,north=none,east=none,south=tall,west=none,waterlogged=false
      up=true,north=none,east=none,south=tall,west=low,waterlogged=false:
        appearance: up=true,north=none,east=none,south=tall,west=low,waterlogged=false
      up=true,north=none,east=none,south=tall,west=tall,waterlogged=false:
        appearance: up=true,north=none,east=none,south=tall,west=tall,waterlogged=false
      up=true,north=none,east=low,south=none,west=none,waterlogged=false:
        appearance: up=true,north=none,east=low,south=none,west=none,waterlogged=false
      up=true,north=none,east=low,south=none,west=low,waterlogged=false:
        appearance: up=true,north=none,east=low,south=none,west=low,waterlogged=false
      up=true,north=none,east=low,south=none,west=tall,waterlogged=false:
        appearance: up=true,north=none,east=low,south=none,west=tall,waterlogged=false
      up=true,north=none,east=low,south=low,west=none,waterlogged=false:
        appearance: up=true,north=none,east=low,south=low,west=none,waterlogged=false
      up=true,north=none,east=low,south=low,west=low,waterlogged=false:
        appearance: up=true,north=none,east=low,south=low,west=low,waterlogged=false
      up=true,north=none,east=low,south=low,west=tall,waterlogged=false:
        appearance: up=true,north=none,east=low,south=low,west=tall,waterlogged=false
      up=true,north=none,east=low,south=tall,west=none,waterlogged=false:
        appearance: up=true,north=none,east=low,south=tall,west=none,waterlogged=false
      up=true,north=none,east=low,south=tall,west=low,waterlogged=false:
        appearance: up=true,north=none,east=low,south=tall,west=low,waterlogged=false
      up=true,north=none,east=low,south=tall,west=tall,waterlogged=false:
```

### Redstone Field Block Behavior

```yaml
blocks:
  elitefantasy:abyssal_crystal_block:
```

#### ICE

```yaml
    behaviors:
      - type: painter:redstone_field
        field-type: ice
        property: redstone_power
        max-radius: 6
        scan-interval-ticks: 20
        particle-count: 8
        safe-radius: 2.25
        ice:
          slowness-amplifier: 4
          slow-falling-amplifier: 0
          mining-fatigue-amplifier: 2
```

#### FIRE

```yaml
    behaviors:
      - type: painter:redstone_field
        field-type: fire
        property: redstone_power
        max-radius: 6
        scan-interval-ticks: 20
        particle-count: 8
        safe-radius: 2.25
        fire:
          fire-ticks: 80
          ignite-blocks: true
          block-ignite-attempts: 12
```

```yaml
    states:
      properties:
        redstone_power:
          type: int
          range: 0~15
          default: 0
      appearances:
        off:
          auto_state: solid
          model:
            path: elitefantasy:block/abyssal_crystal_block
        on:
          auto_state: solid
          model:
            path: elitefantasy:block/abyssal_crystal_block_powered
      variants:
        redstone_power=0:
          appearance: off
          settings:
            luminance: 0
        redstone_power=1:
          appearance: on
          settings:
            luminance: 1
        redstone_power=2:
          appearance: on
          settings:
            luminance: 2
        redstone_power=3:
          appearance: on
          settings:
            luminance: 3
        redstone_power=4:
          appearance: on
          settings:
            luminance: 4
        redstone_power=5:
          appearance: on
          settings:
            luminance: 5
        redstone_power=6:
          appearance: on
          settings:
            luminance: 6
        redstone_power=7:
          appearance: on
          settings:
            luminance: 7
        redstone_power=8:
          appearance: on
          settings:
            luminance: 8
#..etc
```

### Redstone Field Resonator Block Behavior

```yaml
blocks:
  elitefantasy:abyssal_crystal_cluster:
```

#### ICE

```yaml
    behaviors:
      - type: painter:redstone_field
        trigger-field-types: "ice"
        output-field-type: "inherit"
        resonance-radius: 3
        particle-count: 24
        safe-radius: 0.5
        resonance-ticks: 45
        ice:
          slowness-amplifier: 7"
          slow-falling-amplifier: 1
          leather-armor-effect-reduction: 1
          full-leather-prevents-freeze: true
```

#### FIRE

```yaml
    behaviors:
      - type: painter:redstone_field
        trigger-field-types: fire
        output-field-type: "inherit"
        resonance-radius: 3
        particle-count: 24
        safe-radius: 0.5
        resonance-ticks: 45
        fire:
          fire-ticks: "140"
          ignite-blocks: true
          block-ignite-attempts: 20
```

### Multi Sapling Block Behavior

```yaml
items:
  elitefantasy:baobab_sapling:
    material: PAPER
    settings:
      fuel-time: 100
    data:
      item-name: "<!i><white><l10n:item.baobab_sapling>"
    texture: elitefantasy:block/baobab_sappling
    behavior:
      type: block_item
      block:
        settings:
          template: elitefantasy:settings/sapling
        behaviors:
          - type: painter:multi_sapling
            grow_speed: 0.07
            bone_meal_success_chance: 0.45
            max_stage: 1
            consume_saplings: true
            patterns:
              - size_x: 4
                size_y: 1
                size_z: 4
                required_stage: 1
                saplings:
                  - painter:baobab_sapling
```

#### Feature

```yaml
            generators:
              - type: feature
                id: painter:baobab_tree
                offset_x: 1
                offset_y: 0
                offset_z: 1
```

#### Structure

```yaml
            generators:
              - type: structure
                id: painter:baobab_tree
                offset_x: 1
                offset_y: 0
                offset_z: 1
```

#### Command

```yaml
            generators:
              - type: command
                command: "execute in {dimension} positioned {x} {y} {z} run place feature painter:baobab_tree"
```


# UnearthMechanic

Installing the UnearthMechanic plugin

## Dependency

[Mechanics](https://www.spigotmc.org/resources/mechanics-core-api.111934/) (Is no longer neccesary)

## Common Issues

Q: How do I install this?\
A: place `UnearthMechanic.jar` inside `plugins/` and it will be ready, everything will be found from this add-on inside `plugins/UnearthMechanic`

### What is this?

UnearthMechanic is a plugin that allows you to create variations when clicking on furnitures and Blocks, such as being able to make a fan that turns on when you click on it and turn it off when you click on it again.


# Compatibilities

## Important Info

{% hint style="warning" %}
The only blocks that work inside "base" and "stages" are **ItemsAdder, CraftEngine, Nexo,** **Oraxen** and **Minecraft**, the others are supported as drop only.
{% endhint %}

### Minecraft Items

To use vanilla Minecraft items use the `mc:item_id` prefix

{% hint style="info" %}
On blocks it supports blockstates like `minecraft:mc:oak_door[open=false]`
{% endhint %}

### CraftEngine

This plugin is compatible with CraftEngine, to use this compatibility in the `"material"` section you will have to use `ce:namespace:item_id`

{% hint style="info" %}
On blocks it supports blockstates like `ce:painter:oak_door_red[facing=east,open=true]`
{% endhint %}

{% hint style="info" %}
On furniture it supports variants like `ce:painter:oak_chair[variant=ground]`
{% endhint %}

### ItemsAdder

This plugin is compatible with ItemsAdder, to use this compatibility in the `"material"` section you will have to use `ia:namespace:item_id`

### Nexo

This plugin is compatible with Nexo, to use this compatibility in the `"material"` section you will have to use `nexo:item_id`

### Oraxen

This plugin is compatible with Oraxen, to use this compatibility in the `"material"` section you will have to use `or:item_id`

### MythicCrucible

This plugin is compatible with MythicCrucible, to use this compatibility in the `"material"` section you will have to use `crucible:item_id`

{% hint style="warning" %}
This is still in beta, but it should work as a “base”; block/furniture\_id should work too
{% endhint %}

### MythicMobs

This plugin is compatible with MythicMobs, to use this compatibility in the `"material"` section you will have to use `mythic:item_id`

{% hint style="info" %}
This only works for the "tools", "items\_add" and "drops" options.
{% endhint %}

### MMOItems

This plugin is compatible with MMoItems, to use this compatibility in the `"material"` section you will have to use `mmoitems:type:id(:level:tier)` the (Level:Tier) is optional, but if you place one of the two, you need to place both.

{% hint style="info" %}
This only works for the "tools", "items\_add" and "drops" options.
{% endhint %}

### CustomItems

This plugin is compatible with CustomItems, to use this compatibility in the `"material"` section you will have to use `cui:item_id`

{% hint style="info" %}
This only works for the "tools", "items\_add" and "drops" options.
{% endhint %}

### Executable blocks

This plugin is compatible with Executable blocks, to use this compatibility in the `"material"` section you will have to use `eb:item_id`

{% hint style="info" %}
This only works for the "tools", "items\_add" and "drops" options.
{% endhint %}

### Executable Items

This plugin is compatible with Executable Items, to use this compatibility in the `"material"` section you will have to use `ei:item_id`

{% hint style="info" %}
This only works for the "tools", "items\_add" and "drops" options.
{% endhint %}

### Soft Depend:

|                 |                  |
| --------------- | ---------------- |
| Oraxen          | ItemsAdder       |
| ExecutableItems | ExecutableBlocks |
| CustomItems     | MythicMobs       |
| MMOItems        | CraftEngine      |
| Nexo            | MythicCrucible   |

## Protections Plugins

|                  |                 |
| ---------------- | --------------- |
| BentoBox         | CrashClaim      |
| Dominion         | FabledSkyBlock  |
| FactionsUUID     | GriefDefender   |
| GriefPrevention  | HuskClaims      |
| HuskTowns        | IridiumSkyBlock |
| KingdomsX        | Landlord        |
| Lands            | NoBuildPlus     |
| PlotSquared      | PreciousStones  |
| ProtectionStones | RedProtect      |
| Residence        | SaberFactions   |
| SuperiorSkyBlock | Towny           |
| UltimateClaims   | UltimateClans   |
| WorldGuard       | XClaim          |

### WorldGuard

<figure><img src="https://1551547750-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FI274d7fpHGzB0SWG1XuM%2Fuploads%2Fd3yVNIyBI0YnV3rsBSbe%2Fimage.png?alt=media&amp;token=f378c1b0-45aa-4a45-ba6e-ef371446023b" alt=""><figcaption></figcaption></figure>


# Config Examples

## Furniture

```yaml
unearth:
  furniture:
    fish_destroyed_1:
      no_protect: false #If true, the furniture will not protected by protections plugins
      base: "ia:elitefantasy:fish_destroyed_sand_1" #Item base
      tool: #With which tool do you want to make the change, if you want to use your hand, remove it.
        - ia:elitefantasy:copper_shovel
      transformation:
        stages: #The stages are as to what next model it will change to
          1:
            furniture_id: "ia:elitefantasy:fish_destroyed_sand_2"
            # remove_item_main_hand: true
            # reduce_item_main_hand: 1
            # only_one_drop: true
            # reduce_durability: 100
            # reduce_usages_ia: 1
          2:
            furniture_id: "ia:elitefantasy:fish_destroyed_sand_3"
          3:
            drops: #Which item do you want to drop when you reach the last state
              - "ia:elitefantasy:fish_destroyed_3;1;100"
            #only_one_drop: true
            remove: true #Eliminate the furniture from the floor
```

#### furniture\_random\_id

Only 1 random piece of furniture is selected from the list to be the stage 1

\<furniture\_id;chance> The sum of all the listed probabilities must equal `100`

This supports up to two decimal places in the probability, for example, `0.01`

```yml
            furniture_random_id:
              - "ia:glozz:furniture_1;75"
              - "ia:glozz:furniture_2;5"
              - "ia:glozz:furniture_3;5"
              - "ia:glozz:furniture_4;5"
              - "ia:glozz:furniture_5;5"
              - "ia:glozz:furniture_6;5"
```

## Block

```yaml
unearth:
  block:
    fish_destroyed_1:
      no_protect: false #If true, the block will not protected by protections plugin
      base: "ia:elitefantasy:fish_destroyed_sand_1" #Item base
      tool: #With which tool do you want to make the change, if you want to use your hand, remove it.
        - ia:elitefantasy:copper_shovel
      transformation:
        stages: The stages are as to what next model it will change to
          1:
            block_id: "ia:elitefantasy:fish_destroyed_sand_2"
          2:
            block_id: "ia:elitefantasy:fish_destroyed_sand_3"
          3:
            drops: #Which item do you want to drop when you reach the last state
              - "ia:elitefantasy:fish_destroyed_3;1;100"
            remove: true #Eliminate the block from the floor
```

#### block\_random\_id

Only 1 random piece of furniture is selected from the list to be the stage 1

\<block\_id;chance> The sum of all the listed probabilities must equal `100`

This supports up to two decimal places in the probability, for example, `0.01`

```yml
            block_random_id:
              - "ia:glozz:furniture_1;75"
              - "ia:glozz:furniture_2;5"
              - "ia:glozz:furniture_3;5"
              - "ia:glozz:furniture_4;5"
              - "ia:glozz:furniture_5;5"
              - "ia:glozz:furniture_6;5"
```

{% file src="/files/IiXU6qFRK3VIPWY6t906" %}

## Interaction Mode

### `INTERACT`

{% hint style="success" %}
Unless otherwise specified, this will be the default
{% endhint %}

```yaml
unearth:
  furniture:
    campfire_open:
      mode: INTERACT
      base: "ce:elitefantasy:campfire"
      tool:
        - "mc:air"
      transformation:
        stages:
          1:
            furniture_id: "ce:elitefantasy:campfire_open"
```

### `INTERACT_SHIFT`

```yaml
unearth:
  furniture:
    campfire_menu:
      mode: INTERACT_SHIFT
      base: "ce:elitefantasy:campfire"
      tool:
        - "mc:air"
      transformation:
        stages:
          1:
            execute_commands:
              - command: "menu open campfire {player}"
                as_console: true
```

## Some more examples

### reduce\_item

`reduce_item_inventory` - instead of taking the items from your hand, it takes it from your inventory

`batch_item_inventory` - if set to `true`, it will take items from your inventory in batches rather than taking all of the items in your inventory. e.g. if `reduce_item_inventory` is set to 9, it will take 9 of the items from your inventory each time you click when `batch_item_inventory` is set to **TRUE**

```yaml
          2:
            reduce_item_main_hand: 1
            reduce_item_inventory: 1
            batch_item_inventory: true
```

other example of batch

this is the block

```yaml
    crate_packer_apple:
      base: "nexo:crate_packer"
      tool:
        - "mc:apple"
      transformation:
        stages:
          1:
            furniture_id: "nexo:crate_packer"
            reduce_item_inventory: <NUMBER>
            batch_item_inventory: <TRUE/FALSE>
            drops:
              - "nexo:apple_crate;1;100"
```

two scenarios

scenario 1:

`reduce_item_inventory: 9` \
`batch_item_inventory: false`

When I right click block it will take all 64 apples, divide it by 9 and give me 7 apple crates and 1 apple

scenario 2:

`reduce_item_inventory: 9`\
`batch_item_inventory: true`&#x20;

When I right click block it will take only 9 apples and give me 1 crate. I keep to keep clicking for it to take apples in groups ("batches") of nine to turn into crate

### Drops & Items\_add

`"<item_id>;<quantity>;<probability>"`

This can be used to drop various items

```yaml
          3:
            drops: #Which item do you want to drop when you reach the last state
              - "ia:elitefantasy:fish_destroyed_3;1;35"
              - "mc:stone;1-13;:65"
              - "mc:charcoal;1-6:95"
            #only_one_drop: true
            remove: true #Eliminate the furniture from the floor
```

```yaml
          3:
            items_add: #the item will be added to the inventory instead of dropping it
              - "ia:elitefantasy:fish_destroyed_3;1;35"
              - "mc:stone;1-13;:65"
              - "mc:charcoal;1-6:95"
            #only_one_add: true
```

#### Another Example

In this example, it's a simple swap, clicking switches the model to off or on state, either one or the other :)

```yaml
    big_lantern_on:
      base: "ia:elitefantasy:big_lantern_on" #Item base
      transformation:
        stages: #The stages are as to what next model it will change to
          1:
            furniture_id: "ia:elitefantasy:big_lantern_off"
    big_lantern_off:
      base: "ia:elitefantasy:big_lantern_off" #Item base
      transformation:
        stages: #The stages are as to what next model it will change to
          1:
            furniture_id: "ia:elitefantasy:big_lantern_on"
```

### Permission on Stages

If the player does not have the specified permission, they will not do anything.

```yaml
        stages:
          1:
            block_id: "ia:elitefantasy:fish_destroyed_sand_2"
            permission: "unearth.test1"
          2:
            block_id: "ia:elitefantasy:fish_destroyed_sand_3"
            permission: "unearth.test2"
```

### Multiple Base

This allows you to create configurations with multiple bases, making it easier to create configurations, it is important to specify at the end `“mc:example;example_1”` as it will end up being the id `“mc:example_example_1”` and will fix errors.

```yaml
unearth:
  block:
    white_stripped_log_1:
      base:
        - "mc:stripped_oak_log;1"
        - "mc:stripped_spruce_log;2"
        - "mc:stripped_birch_log;3"
        - "mc:stripped_jungle_log;4"
        - "mc:stripped_acacia_log;5"
        - "mc:stripped_dark_oak_log;6"
        - "mc:stripped_mangrove_log;7"
        - "mc:stripped_cherry_log;8"
        - "mc:stripped_warped_log;9"
        - "or:white_stripped_log;10"
        - "or:orange_stripped_log;11"
        - "or:magenta_stripped_log;12"
        - "or:light_blue_stripped_log;13"
        - "or:lime_stripped_log;14"
        - "or:yellow_stripped_log;15"
        - "or:pink_stripped_log;16"
        - "or:gray_stripped_log;17"
        - "or:light_gray_stripped_log;18"
        - "or:cyan_stripped_log;19"
        - "or:purple_stripped_log;20"
        - "or:blue_stripped_log;21"
        - "or:brown_stripped_log;22"
        - "or:green_stripped_log;23"
        - "or:red_stripped_log;24"
        - "or:black_stripped_log;25"
      tool:
        - "or:white_brush"
      transformation:
        stages:
          1:
            block_id: "or:white_stripped_log"
            reduce_durability: 1
```

### Sounds in Stages

<pre class="language-yaml"><code class="lang-yaml">unearth:
  block:
    white_stripped_log_1:
      transformation:
        stages:
          1:
<strong>            sounds:
</strong>              - sound: "minecraft:block.sand.break"
                volume: 1.0
                pitch: 1.0
                delay: 0
</code></pre>

### Delay on Stages

This is used to add delay when swapping blocks, for example when clicking it will take 1 second to swap, works on tool and stage.

```yaml
        stages:
          1:
            block_id: "or:white_stripped_log"
            delay: 6
            tool_anim_on_delay: true
```

### Execute Commands

If the command isn't run from the console, the player will run it

```yaml
      transformation:
        stages:
          1:
            furniture_id: "ia:glozz:furniture_0"
            execute_commands:
              - command: "clear {player}"
                as_console: true #true/false
```

### Region Conditions

{% hint style="warning" %}
This is for WorldGuard regions
{% endhint %}

| Types Available | Description                                                |
| --------------- | ---------------------------------------------------------- |
| `whitelist`     | Works only within the regions on the list                  |
| `blacklist`     | Foesn't work within the regions on the list                |
| `only_global`   | Works only outside WorldGuard regions (no list argument)   |
| `deny_global`   | It only works inside WorldGuard regions (no list argument) |

This only will works on regions `hospital` & `house`

```yaml
unearth:
  block:
    pattern_bricks_test:
      base: "ce:painter:pattern_bricks"
      transformation:
        stages:
          1:
            region-conditions:
              - type: whitelist
                list:
                  - hospital
                  - house
            block_id: "ce:painter:pattern_bricks[pattern=2]"
```

This only works if you're inside a region, but not inside the `spawn` or `safe_zone`

```yaml
           region-conditions:
              - type: deny_global
              - type: blacklist
                list:
                  - spawn
                  - safe_zone
```

### Food Feature

You can use this to make cake decorations

```yaml
      transformation:
        stages:
          1:
            food_add: 4
            saturation_add: 3.0
```

### CustomCrops special Support

This stage option allows UnearthMechanic to validate and consume water from watering cans registered by CustomCrops.

CustomCrops must be installed and enabled. If the integration is unavailable, stages using `customcrops_watering_can` will be blocked and a warning will be printed to the console.

{% hint style="info" %}
The regular `tool` option still controls which items can activate the transformation. The `cans` option performs an additional check against the watering cans registered by CustomCrops.
{% endhint %}

**Options**

| Option             | Type    | Default    | Description                                                                                                                                    |
| ------------------ | ------- | ---------- | ---------------------------------------------------------------------------------------------------------------------------------------------- |
| cans               | List    | \["\*"]    | Accepted CustomCrops watering cans. Use \* to accept every registered watering can. Item IDs and watering-can configuration IDs are supported. |
| water.require      | Integer | 1          | Minimum amount of water required to execute the stage.                                                                                         |
| water.consume      | Integer | 1          | Amount of water removed after the stage succeeds.                                                                                              |
| water.consume\_on  | String  | success    | Determines when water is consumed. Currently, only success is supported.                                                                       |
| charge\_mode       | String  | activation | Controls whether water is consumed once per interaction or once per affected target.                                                           |
| respect\_infinite  | Boolean | true       | Infinite watering cans bypass water validation and consumption.                                                                                |
| creative           | String  | consume    | Controls water validation and consumption for players in Creative mode.                                                                        |
| on\_fail.actionbar | String  |            | My packages use some things that aren't in bettermodel                                                                                         |
| on\_fail.sound     | String  |            | Sound played when validation fails.                                                                                                            |

Negative values in `water.require` and `water.consume` are automatically converted to `0`.

The effective minimum water requirement is the highest value between `water.require` and `water.consume`. This prevents a stage from succeeding when the watering can does not contain enough water to pay its consumption cost.

**Charge modes**

| Value        | Description                                                                                        |
| ------------ | -------------------------------------------------------------------------------------------------- |
| `activation` | Consumes water once for the entire interaction. Recommended for tools that affect multiple blocks. |
| `target`     | Consumes water separately for every affected block or furniture target.                            |

**Creative modes**

| Value     | Description                                                           |
| --------- | --------------------------------------------------------------------- |
| `consume` | Creative players must have enough water and will consume it normally. |
| `bypass`  | Creative players bypass both water validation and consumption.        |

**Failure placeholders**

The following placeholders can be used inside `on_fail.actionbar` and `on_fail.sound`:

| Placeholder  | Description                                                              |
| ------------ | ------------------------------------------------------------------------ |
| `{water}`    | Current water stored in the watering can.                                |
| `{capacity}` | Maximum capacity of the watering can.                                    |
| `{require}`  | Effective minimum amount of water required.                              |
| `{consume}`  | Amount of water that will be consumed.                                   |
| `{can}`      | Detected watering-can item ID, or `unknown` when no valid can was found. |

**Complete example**

```yml
unearth:
  block:
    clean_relic:
      base: "ce:example:dirty_relic"
      # UnearthMechanic still requires the held item to be configured as a tool.
      tool:
        - "ce:example:watering_can"
      transformation:
        stages:
          1:
            block_id: "ce:example:clean_relic"
            customcrops_watering_can:
              # Use "*" to accept any watering can registered by CustomCrops.
              cans:
                - "*"
              water:
                # Minimum amount of water required to perform the transformation.
                require: 1
                # Amount of water consumed after a successful transformation.
                consume: 1
                # Currently supported value: success.
                consume_on: success
              # activation: consume once per interaction.
              # target: consume once for every affected target.
              charge_mode: activation
              # Infinite watering cans bypass validation and consumption.
              respect_infinite: true
              # consume: Creative players consume water normally.
              # bypass: Creative players ignore validation and consumption.
              creative: consume
              on_fail:
                actionbar: "<red>The watering can does not have enough water. <gray>({water}/{require})"
                sound: "minecraft:item.bucket.empty"
```

Water is consumed only after the stage has been applied successfully. UnearthMechanic uses the CustomCrops API to update the watering can, including its stored water, lore, appearance, durability, and configured consumption actions.

**Restricting accepted watering cans**

Replace `*` with specific CustomCrops item or watering-can configuration IDs:

```yaml
customcrops_watering_can:
  cans:
    - "example:basic_watering_can"
    - "example:golden_watering_can"

  water:
    require: 3
    consume: 2
    consume_on: success

  charge_mode: activation
  respect_infinite: true
  creative: bypass

  on_fail:
    actionbar: "<red>You need {require} water. <gray>Available: {water}/{capacity}"
    sound: "minecraft:block.note_block.bass"
```

## Sequence in Stages

{% hint style="info" %}
This only supports some features, the list is [`<furniture/block>_id`](#furniture)*,* [*`<furniture/block>_random_id`*](#furniture_random_id)*,* [*`execute_commands`*](#execute-commands)*, and etc*
{% endhint %}

The sequence system is a way to add animations such as wait times between stages, allowing for greater customization when creating things.

```yaml
  block:
    black_bricks_test:
      base: "ia:painter:black_bricks"
      tool:
        - "mc:air"
      transformation:
        stages:
          1:
            block_id: "ia:painter:blue_bricks"
            sequence: #Each step is executed in sequence, followed by step 1.
              20: #delay step 2
                block_id: "ia:painter:yellow_bricks" # step 2
              40: #delay step 3
                furniture_id: "ia:painter:paint_mixer_2" # step 3
              60: #delay step 4
                block_id: "ia:painter:red_bricks" # step 4
          2:
            block_id: "ia:painter:white_bricks" #does not interfere with the sequence, a click is required to execute this stage
          3:
            block_id: "ia:painter:green_bricks"
```

For example, here, first `20` will be executed, then after another `20` ticks, `40` will be executed, and then after another `60`, like a kind of timeline

For example, in this example here, first `ia:painter:white_bricks` will be executed, then `ia:painter:pink_bricks`, then `ia:painter:lime_bricks`, and `finally ia:painter:yellow_bricks`

```yaml
        stages:
          1:
            block_id: "ia:painter:white_bricks" # step 1
            sequence:
              100:
                block_id: "ia:painter:yellow_bricks" # step 4
              10:
                block_id: "ia:painter:pink_bricks" # step 2
              20:
                block_id: "ia:painter:lime_bricks" # step 3
```

Example of logs

```json
[20:32:11 INFO]: handleStage applied for ia:painter:white_bricks in 67070
[20:32:11 INFO]: handleStage in Location{world=world,x=-429.0,y=92.0,z=401.0} - TICK: 67070
[20:32:11 INFO]: Stage 0 has 3 sequence steps.
[20:32:11 INFO]: handleStage applied for ia:painter:pink_bricks
[20:32:11 INFO]: handleStage in Location{world=world,x=-429.0,y=92.0,z=401.0} - TICK: 67080
[20:32:12 INFO]: handleStage applied for ia:painter:lime_bricks
[20:32:12 INFO]: handleStage in Location{world=world,x=-429.0,y=92.0,z=401.0} - TICK: 67090
[20:32:16 INFO]: handleStage applied for ia:painter:yellow_bricks
[20:32:16 INFO]: handleStage in Location{world=world,x=-429.0,y=92.0,z=401.0} - TICK: 67170
[20:32:16 INFO]: Sequence completed in Location{world=world,x=-429.0,y=92.0,z=401.0}
```

#### [furniture\_random\_id](#furniture_random_id) & [block\_random\_id](#block_random_id) also works here!

```yml
        stages:
          1:
            furniture_id: "ia:glozz:furniture_1"
            sequence:
              100:
                furniture_random_id:
                  - "ia:glozz:furniture_2;20"
                  - "ia:glozz:furniture_3;40"
                  - "ia:glozz:furniture_4;60"
                  - "ia:glozz:furniture_5;70"
                  - "ia:glozz:furniture_6;90"
```

#### [execute\_commands](#execute-commands) works here too!

```yaml
            sequence:
              20:
                furniture_id: "ia:glozz:furniture_2"
                execute_commands:
                  - command: "say {player} sequence 1"
                    as_console: true
              40:
                furniture_id: "ia:glozz:furniture_3"
                execute_commands:
                  - command: "clear {player}"
                    as_console: true
```

#### remove

This will immediately cancel the sequence

```yml
        stages:
          1:
            block_id: "ia:painter:white_bricks" # step 1
            sequence:
              100:
                remove: true
```

#### large example of a lot of features

```yaml
      transformation:
        stages:
          1:
            furniture_id: "ia:glozz:furniture_0_sequence"
            execute_commands:
              - command: "msg {player} 1"
                as_console: true #true/false
            items_add:
              - "ia:glozz:tomate;1;100"
            sounds:
              - sound: "minecraft:block.copper_grate.break"
                volume: 1
                pitch: 0.5
            sequence:
              20:
                furniture_id: "ia:glozz:furniture_1"
                execute_commands:
                  - command: "msg {player} 2"
                    as_console: true
                items_add:
                  - "ia:glozz:lechuga;1;100"
                sounds:
                  - sound: "minecraft:block.copper_grate.break"
                    volume: 1
                    pitch: 0.5
              40:
                furniture_id: "ia:glozz:furniture_2"
                execute_commands:
                  - command: "msg {player} 3"
                    as_console: true
                items_add:
                  - "ia:glozz:zanahoria;1;100"
                sounds:
                  - sound: "minecraft:block.copper_grate.break"
                    volume: 1
                    pitch: 0.5
```

### Timed Interaction

| Option           | Description                                                    |
| ---------------- | -------------------------------------------------------------- |
| `collect_window` | It is the time available for interaction                       |
| `outcomes`       | A list of possible outcomes depending on who you interact with |

```yaml
      transformation:
        stages:
          1:
            furniture_id: "ce:kitchen:pan_cooking"
            sequence:
              60:
                furniture_id: "ce:kitchen:pan_half_cooked"
              120:
                furniture_id: "ce:kitchen:pan_ready"
                timed_interaction:
                  collect_window: 60
                  outcomes:
                    spatula:
                      tool:
                        - "ce:kitchen:spatula"
                      success:
                        furniture_id: "ce:kitchen:empty_pan"
                        items_add:
                          - "mc:cooked_beef;100;1"
                    plate:
                      tool:
                        - "mc:bowl"
                      success:
                        reduce_item_main_hand: 1
                        furniture_id: "ce:kitchen:empty_pan"
                        items_add:
                          - "mc:beef_stew;100;1"
                    fallback:
                      success:
                        furniture_id: "ce:kitchen:pan_burned"
                        sounds:
                          - sound: "minecraft:block.fire.extinguish"
                            volume: 1.0
                            pitch: 0.7
              200:
                furniture_id: "ce:kitchen:pan_burned"
                sounds:
                  - sound: "minecraft:block.fire.extinguish"
                    volume: 1.0
                    pitch: 0.7
```

{% hint style="danger" %}
This no Supports&#x20;

```yaml
                      tool:                 
                        - "mc:bowl;delay=6"
                        - "nexo:white_large_brush;depth=1;size=3;deep=3"
                      success:
                        delay: 6
```

{% endhint %}

## Remember the previous Block/Furniture

On apply changes

```yaml
      tool:
        - "ce:painter:magenta_brush;anim=ce:painter:z_magenta_brush_animation;delayAnim=15;sound=painter:painting_brush;delay=6;replaceOnBreak=ce:painter:painting_brush"
      transformation:
        stages:
          1:
            block_id: "ce:painter:magenta_planks"
            reduce_durability: 1
            remember_previous: true
```

To retrieve the block that existed before it was transformed, you must use `um:previous` id

{% hint style="danger" %}
Don't forget to include a `fallback_block_id` or `fallback_furniture_id`
{% endhint %}

```yaml
      tool:
        - "ce:painter:paint_remover;anim=ce:painter:z_paint_remover_animation;delayAnim=5;sound=painter:spray_can;delay=4"
      transformation:
        stages:
          1:
            block_id: "um:previous"
            fallback_block_id: "mc:oak_planks"
            reduce_durability: 1
```

## Tools Configurations

### Affect more than one 1x1 area

```yaml
      tool:
        - "or:white_brush;depth=1;size=3;deep=3"
      transformation:
        stages:
          1:
            block_id: "or:white_stripped_log"
            reduce_durability: 1
```

depth, deep, size

{% hint style="info" %}
if you add a value and do not add the others, it will automatically set the others to 1

durability will be subtracted depending on the number of blocks being replaced
{% endhint %}

### Item Animations on Tools

The animations for example are when you are interacting, you can use another item to simulate that you are painting it or something like that.

```
anim=<item_id>
```

```yaml
delayAnim=<number> 
#These are the ticks at which the tool will continue with its animation item when you stop painting.
```

```yaml
      tool:
        - "nexo:black_brush;anim=nexo:z_black_brush_animation;delayAnim=15;blockInteractions=true"
```

`blockInteractions` is set to `true` by default; while the animation is running, you won't be able to interact with other blocks or furniture

### Sounds on Tools

```yaml
      tool:
        - "nexo:black_brush;sound=mc:item.brush.brushing.generic"
```

### Delay on Tools

This is used to add delay when swapping blocks, for example when clicking it will take 1 second to swap, works on tool and stage.

```yaml
      tool:
        - "or:white_brush;delay=6"
```

### replaceOnBreak

This will allow that for example, when the item you are using loses all its durability, you can give another item with a broken model or something like that that you can reuse instead of crafting another one.

```yaml
      tool:
        - "nexo:black_large_roller;replaceOnBreak=nexo:large_paint_roller"
```

### Permission Per Tool

If the player does not have the specified permission, they will not do anything.

```yaml
      tool:
        - "ia:painter:blue_brush;permission=unearth.webo1"
        - "ia:painter:blue_roller;permission=unearth.webo2"
        - "ia:painter:blue_spray_can;permission=unearth.webo3"
        - "ia:painter:blue_large_roller;permission=unearth.webo4"
```

### TintFurniture Tool

```yaml
      tool:
        - "nexo:black_brush;tintfurniture=255,255,255"
```

## Unique CraftEngine examples

Change the BlockState of Craftengine Block

<pre class="language-yaml"><code class="lang-yaml"><strong>  block:
</strong>    pattern_bricks_test:
      base: "ce:painter:pattern_bricks[pattern=1]"
      tool:
        - "mc:air"
      transformation:
        stages:
          1:
            block_id: "ce:painter:pattern_bricks[pattern=2]"
</code></pre>

Change the Variant of Craftengine Furniture

```yaml
  furniture:
    oak_chair_test:
      base: "ce:painter:oak_chair[variant=ground]"
      tool:
        - "mc:air"
      transformation:
        stages:
          1:
            furniture_id: "ce:painter:oak_chair[variant=wall]"
```


# Template System

## Introduction <a href="#introduction" id="introduction"></a>

The template system allows you to reuse configurations across blocks, furniture, stages and other sections of UnearthMechanic.

Templates are expanded before UnearthMechanic processes the configuration. Therefore, once they have been resolved, the system continues to use the same configuration format and behaviour as usual.

Creating a template

Templates can be declared at the root of any YAML file:

```yaml
templates:
  unearth:brushable:
    base: "${base}"
    tool:
      - mc:brush
    transformation:
      stages:
        1:
          block_id: "${first_stage}"
        2:
          block_id: "${final_stage}"
```

It is also valid to declare them within `undeath.templates`:

```yaml
unearth:
  templates:
    unearth:brushable:
      base: "${base}"
      tool:
        - mc:brush
```

The template identifier must be unique. We recommend using the following format:

```
namespace:template_id
```

Templates can be used from within other YAML files.

Using a template

To apply a template, use the \`template\` property:

```yaml
unearth:
  block:
    archaeology:suspicious_sand:
      template: unearth:brushable
      arguments:
        base: ce:archaeology:suspicious_sand
        first_stage: ce:archaeology:suspicious_sand_1
        final_stage: mc:sand
```

The above configuration is processed as if it had been written as follows:

```yaml
unearth:
  block:
    archaeology:suspicious_sand:
      base: ce:archaeology:suspicious_sand
      tool:
        - mc:brush
      transformation:
        stages:
          1:
            block_id: ce:archaeology:suspicious_sand_1

          2:
            block_id: mc:sand
```

## Arguments

Arguments replace placeholders in the format `${argument}`

```yaml
templates:
  unearth:drop_stage:
    block_id: "${target}"
    drops:
      - "${drop};1;${chance}"
```

```yaml
unearth:
  block:
    archaeology:sand:
      template: unearth:drop_stage
      arguments:
        target: mc:sand
        drop: ce:archaeology:artifact
        chance: 25
```

Arguments are processed in the order in which they are written. An argument may use one that has been declared previously

```yaml
arguments:
  material: mud
  variant: bricks
  result: "${material}_${variant}"
```

When a placeholder occupies the entire value, it retains its original type:

```yaml
arguments:
  protected: true
  delay: 20
  tools:
    - mc:brush
    - mc:shovel
```

```yaml
no_protect: "${protected}"
delay: "${delay}"
tool: "${tools}"
```

### Default values

You can specify a default value using `-`

```yaml
delay: "${delay:-0}"
remove: "${remove:-false}"
permission: "${permission:-unearth.use}"
```

The default value is used when the argument has not been provided.

The following simple default values are currently supported:

* Text.
* Numbers.
* Booleans.
* null.
* Numbers with the suffixes d and f.

### Namespace and ID

Each configuration automatically receives two special arguments:

`${__NAMESPACE__}`

`${__ID__}`

Example:

```yaml
unearth:
  block:
    archaeology:suspicious_sand:
      template: unearth:named
```

```yaml
templates:
  unearth:named:
    permission: "unearth.${__NAMESPACE__}.${__ID__}"
```

Result:

```yaml
permission: unearth.archaeology.suspicious_sand
```

If the identifier does not contain a namespace, `unearth` is used as the default namespace.

### Text modifiers

#### Capitalising words

```yml
arguments:
  material: suspicious_sand
```

```yml
${material^}
```

Result:

```yml
Suspicious Sand
```

#### Convert to uppercase

```yml
${material^^}
```

Result:

```yml
SUSPICIOUS_SAND
```

### Multiple templates

A configuration can use several templates:

```yaml
unearth:
  block:
    archaeology:suspicious_sand:
      template:
        - unearth:brushable
        - unearth:with_drops
        - unearth:with_sounds
```

Templates are applied from top to bottom:

* Maps are combined recursively.
* Lists are concatenated.
* The individual values from the last template replace the previous ones.

Example:

```yaml
templates:
  unearth:first:
    tool:
      - mc:brush
    delay: 10

  unearth:second:
    tool:
      - mc:shovel
    delay: 20
```

The result will be:

```yaml
tool:
  - mc:brush
  - mc:shovel

delay: 20
```

### Merges

merges allows you to add values to the generated configuration:

```yaml
unearth:
  block:
    archaeology:suspicious_sand:
      template: unearth:brushable
      arguments:
        base: ce:archaeology:suspicious_sand
        first_stage: ce:archaeology:suspicious_sand_1
        final_stage: mc:sand
      merges:
        transformation:
          stages:
            1:
              sounds:
                - sound: minecraft:block.sand.break
                  volume: 1.0
                  pitch: 1.0
```

Maps are combined recursively and lists are appended to existing ones.

### Overrides

'overrides' completely replaces the specified value:

```yaml
unearth:
  block:
    archaeology:suspicious_sand:
      template: unearth:brushable
      overrides:
        tool:
          - ce:archaeology:soft_brush
```

Even if the template already contains tools, the list will be completely replaced:

```yaml
tool:
  - ce:archaeology:soft_brush
```

### Order of application

The configuration is built in the following order:

1. Templates, in the order specified.
2. Properties entered directly in the configuration.
3. merges.
4. overrides.

This means that overrides always take precedence.

### Nested templates

A template can use another template:

```yaml
templates:
  unearth:base_stage:
    block_id: "${target}"
    delay: "${delay:-0}"

  unearth:brushable:
    base: "${base}"

    transformation:
      stages:
        1:
          template: unearth:base_stage

          arguments:
            target: "${first_stage}"
            delay: 10
```

Templates can also be used directly within stages, sequences or other nested sections.

UnearthMechanic detects circular references:

```yaml
templates:
  unearth:first:
    template: unearth:second

  unearth:second:
    template: unearth:first
```

This configuration will be rejected and a warning will be displayed in the console.

### Conditional arguments

The `condition` type selects a value based on a condition:

```yaml
arguments:
  remove_stage:
    type: condition
    condition: "${should_remove:-false}"
    on_true: true
    on_false: false
```

#### Selection using `when`

when allows you to transform a value using different cases:

```yaml
arguments:
  tool:
    type: when
    source: "${material}"
    when:
      sand: mc:brush
      stone: mc:pickaxe
      dirt: mc:shovel
    fallback: mc:air
```

Uppercase and lowercase conversion

```yaml
arguments:
  uppercase_material:
    type: to_upper_case
    value: "${material}"
    locale: en
```

```yaml
arguments:
  lowercase_material:
    type: to_lower_case
    value: "${material}"
    locale: en
```

### Maps containing 'type'

A map used as an argument may contain a property called `type`. To prevent UnearthMechanic from interpreting this as a special type of argument, use:

```yaml
arguments:
  custom_data:
    __skip_template_argument__: {}
    type: custom
    value: example
```

The marker will not appear in the resulting settings.

### Escaping placeholders

To write ${argument} as literal text, add a backslash:

```yaml
message: "\${argument}"
```

Result:

```yaml
${argument}
```

Individual keys may also go missing:

```yaml
\{
\}
```

## Configuration errors

UnearthMechanic will display a warning and skip the affected settings when it encounters:

* A non-existent template.
* A circular reference.
* A template whose content is not a YAML section.
* An unsupported special argument.
* An invalid value for merges, overrides or arguments.

If two files declare the same template identifier, the most recently loaded definition will override the previous one. You should not rely on this behaviour; always use unique identifiers.


# Install Guide

Install Guide for Painter Addon Pack

## UnearthMechanic

Install [Mechanics](https://www.spigotmc.org/resources/mechanics-core-api.111934/).jar Plugin and UnearthMechanic.jar\
Full Wiki [here](/mechanics/unearthmechanic)

## ItemsAdder

Install [DirectionalBlocks](https://www.spigotmc.org/resources/directionalblock-itemsadder-addon.104485/) Addon

Open `product.zip` and go to “`ItemsAdder Content`”, drag and drop it to your plugins folder and it will be there.

## Nexo

Open `product.zip` and go to “`Nexo Content`”, drag it to your plugins folder, then go to Nexo `settings.yml` and put in **false** `Pack.validate.models`

```yaml
Pack:
  validate:
    models: false
    atlas: false
```

If you have more than one Painter pack, the zip file contains folders named `atlas for original pack & tuff & copper & quartz` You should replace your `blocks.json` file located in `assets/minecraft/atlases`, since Nexo doesn't have a very useful atlas merge feature.

## Oraxen

Open `product.zip` and go to “`Oraxen Content`”, drag it to your plugins folder, then go to `Oraxen/settings.yml` and put in **false** `Pack.atlas.generate`

```yaml
Pack:
  generation:
    atlas:
      exclude_malformed_from_atlas: false
      generate: false
```

{% hint style="info" %}
The Plugin still does not accept “paletted\_permutations” so it will show a warning in the console that the textures do not exist, but other than that they will work correctly.
{% endhint %}

### All my textures stopped working

What i can do, this is because `Oraxen` normally takes care of generating the atlases for your custom paths, in this case you need to manually add them to your package, each of the folders that are in `textures/` and `models/` this way to the `assets/minecraft/atlases/blocks.json`

for example

```yaml
📁assets
  └── 📁painter
       ├── 📁textures
       │     └── 📁entities
       │     └── 📁block
       └── 📁models
             └── 📁cosmetics
```

```json
        {
            "type": "directory",
            "source": "entities",
            "prefix": "entities/"
        },
        {
            "type": "directory",
            "source": "block",
            "prefix": "block/"
        },
        {
            "type": "directory",
            "source": "cosmetics",
            "prefix": "cosmetics/"
        },
```

## How do I delete content?

{% hint style="info" %}
Example with Nether bricks
{% endhint %}

To delete content you must go to

<pre><code><strong>📁assets
</strong>  └── 📁minecraft
       └── 📁atlases
            └── 📑blocks.json
</code></pre>

and for example remove "`nether bricks`" from there following the json format, to verify that you have done it right use [jsonlint.com](https://jsonlint.com/), then go to

```
📁assets
  └── 📁painter
       └── 📁textures
            └── 📁block
                 └── 📁color_palettes
```

And there remove the pallets from the block you do not want, for example with `nether bricks` would be to remove

```
📁assets
  └── 📁painter
       └── 📁textures
            └── 📁block
                 └── 📁color_palettes
                      ├── 📑nether_bricks_black.png
                      ├── 📑nether_bricks_blue.png
                      ├── 📑nether_bricks_brown.png
                      ├── 📑nether_bricks_cyan.png
                      ├── 📑nether_bricks_gray.png
                      ├── 📑nether_bricks_green.png
                      ├── 📑nether_bricks_light_blue.png
                      ├── 📑nether_bricks_light_gray.png
                      ├── 📑nether_bricks_lime.png
                      ├── 📑nether_bricks_magenta.png
                      ├── 📑nether_bricks_orange.png
                      ├── 📑nether_bricks_palette.png
                      ├── 📑nether_bricks_pink.png
                      ├── 📑nether_bricks_purple.png
                      ├── 📑nether_bricks_red.png
                      ├── 📑nether_bricks_white.png
                      └── 📑nether_bricks_yellow.png
```

And once you remove that, you can go to either `ItemsAdder` or `Oraxen` and remove their configuration files from your, And as a last step go to `UnearthMechanic` and remove traces of Nether Bricks from your configurations :)<br>


# Carpenty

For everything to work properly, remember to go to CraftEngine's `config.yml` and change this value from `2000` to `35000-75000`

```yaml
block:
  # This decides the amount of real blocks on serverside. You should only consider increasing this value when your server state is insufficient.
  # It is recommended to increase it by 500 each time. This option requires a restart to apply.
  serverside-blocks: 75000
```


# introduction

MaskyBiomesExpansion is an ever-expanding pack that will periodically add “updates” to the Minecraft world, aiming to integrate the various mechanics into the Survival mode

| Dependencies              | Version |
| ------------------------- | ------- |
| CraftEngine               | 26.8    |
| MaskyCore                 | +1.0    |
| MythicMobsPremium         | 5.13    |
| ModelEngine               | R4.1.0  |
| Paper / Minecraft Version | 26.1.2  |
| Datapack                  | 26.1.2  |

## Install Important

For everything to work properly, remember to go to CraftEngine's `config.yml` and change this value from `2000` to `75000`

```yaml
block:
  # This decides the amount of real blocks on serverside. You should only consider increasing this value when your server state is insufficient.
  # It is recommended to increase it by 500 each time. This option requires a restart to apply.
  serverside-blocks: 75000
```

enable on CraftEngine's `config.yml`&#x20;

```yaml
sync-custom-blocks-on-chunk-load: true
```

#### Enable in MythicMobs/config/config-spawning.yml

`GenerateSpawnPoints: true`

## Biomes

### [Ice Caves](https://plugins.elitefantasy.net/maskybiomesexpansion/ice-caves)

<figure><img src="https://1551547750-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FI274d7fpHGzB0SWG1XuM%2Fuploads%2F7VvDYaAPDy82invwe9XV%2Fimage17.png?alt=media&amp;token=386bc1e7-919f-4818-90a3-e9126b57c009" alt=""><figcaption></figcaption></figure>

### [Baobab Avenue](https://plugins.elitefantasy.net/maskybiomesexpansion/baobab-avenue)

<figure><img src="https://1551547750-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FI274d7fpHGzB0SWG1XuM%2Fuploads%2FZCDRjmcXZPNT08HKr6Gc%2Fimage9.png?alt=media&amp;token=f44be0d9-2320-424b-bc79-8b68bd93f9e6" alt=""><figcaption></figcaption></figure>

### [Oasis](https://plugins.elitefantasy.net/maskybiomesexpansion/oasis)

<figure><img src="https://1551547750-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FI274d7fpHGzB0SWG1XuM%2Fuploads%2Fi840tJmRAqQltXwkq3iL%2Fimage12.png?alt=media&amp;token=f94ed955-d7a2-479f-b851-d3220154a692" alt=""><figcaption></figcaption></figure>

<figure><img src="https://1551547750-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FI274d7fpHGzB0SWG1XuM%2Fuploads%2FI19agDFThmOCAjv092PL%2Fimage14.png?alt=media&amp;token=f72302a3-4e94-452c-a2cb-d9f2632d6312" alt=""><figcaption></figcaption></figure>


# Baobab Avenue

## General Information

Baobab Avenues are medium-sized biomes located near savannas that contain baobab trees and acacia trees.

In this biome, you can find various animals and wildlife.

<figure><img src="https://1551547750-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FI274d7fpHGzB0SWG1XuM%2Fuploads%2FZCDRjmcXZPNT08HKr6Gc%2Fimage9.png?alt=media&amp;token=f44be0d9-2320-424b-bc79-8b68bd93f9e6" alt=""><figcaption></figcaption></figure>

### Ostrich

[More info here!](#ostrich)

<figure><img src="https://1551547750-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FI274d7fpHGzB0SWG1XuM%2Fuploads%2FlBdDVOrECRQtT4dx1J1G%2Fimage.png?alt=media&amp;token=848ef148-3018-46cd-9ac9-64fe4cf76a14" alt=""><figcaption></figcaption></figure>

Termites

[More info here!](https://plugins.elitefantasy.net/maskybiomesexpansion/mobs#termites)

<figure><img src="https://1551547750-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FI274d7fpHGzB0SWG1XuM%2Fuploads%2FFXmKFOcvz1FJUER7U87o%2Fimage4.png?alt=media&amp;token=bf3395b5-0f75-43f0-b17a-a9525974b247" alt=""><figcaption></figcaption></figure>


# Desert

## General Information

Deserts are vast sandy plains inhabited by cacti, biznaga, and nopales; while they are generally hostile to living creatures, their caves strangely contain the Oasis Sand Caves

<div><figure><img src="https://1551547750-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FI274d7fpHGzB0SWG1XuM%2Fuploads%2FYB2l3QQUBsdZe6u1buTU%2Fimage44.png?alt=media&amp;token=62f66a5b-1645-432c-a512-506e8a29befb" alt=""><figcaption></figcaption></figure> <figure><img src="https://1551547750-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FI274d7fpHGzB0SWG1XuM%2Fuploads%2FPLv3RDuLn68xuq6dE2qn%2Fimage45.png?alt=media&amp;token=f264c141-8ac2-4c43-8212-b0eaa4fddb5d" alt=""><figcaption></figcaption></figure></div>

In addition to the typical Husks and Parcheds, the deserts now feature their own type of spider that burrows into the sand, shoots webs, and then attacks you.

<figure><img src="https://1551547750-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FI274d7fpHGzB0SWG1XuM%2Fuploads%2FuxylXTLy5xR8MMLjGQwr%2Fimage46.png?alt=media&amp;token=b440b8a7-2a30-4e80-8feb-ca7a3023764d" alt=""><figcaption></figcaption></figure>

## Oasis Sand Caves

<figure><img src="https://1551547750-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FI274d7fpHGzB0SWG1XuM%2Fuploads%2FLMUyWNJvt0bI7geZinPh%2Fimage42.png?alt=media&amp;token=d4fa1fe4-e427-41fb-89e5-ce188e923614" alt=""><figcaption></figcaption></figure>

<figure><img src="https://1551547750-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FI274d7fpHGzB0SWG1XuM%2Fuploads%2FDyodovMq8ubejBv9bQZ1%2Fimage43.png?alt=media&amp;token=fc22b852-f696-4001-9c58-1259602da61d" alt=""><figcaption></figcaption></figure>

## Sandstorms

Sometimes, while traveling through the desert, you'll start to see sandstorms, which will cause you to hallucinate, reduce your visibility, and make you see items in your inventory that don't exist.

To get rid of these effects, just jump into the water or drink a bottle of water.

<figure><img src="https://1551547750-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FI274d7fpHGzB0SWG1XuM%2Fuploads%2FVJsAWm2H0dneCSuYUGZv%2Fimage58.png?alt=media&amp;token=da0cf7a8-37f6-40cb-8855-457836c57927" alt=""><figcaption></figcaption></figure>

<div><figure><img src="https://1551547750-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FI274d7fpHGzB0SWG1XuM%2Fuploads%2FFM3N9L59nDTDCCTEcGqb%2Fimage59.png?alt=media&amp;token=c2c802d3-41d4-4260-949d-073cad120eea" alt=""><figcaption></figcaption></figure> <figure><img src="https://1551547750-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FI274d7fpHGzB0SWG1XuM%2Fuploads%2FIOAspj6fKNxwJUB39dBY%2Fimage60.png?alt=media&amp;token=172add06-802b-4a1d-b313-a8eb4f4680e4" alt=""><figcaption></figcaption></figure></div>

## Desert Pyramid

<div><figure><img src="https://1551547750-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FI274d7fpHGzB0SWG1XuM%2Fuploads%2FypNM0nQyP7ftKwcRKcDh%2Fimage57.png?alt=media&amp;token=f6724175-da90-429f-8114-336710f4045f" alt=""><figcaption></figcaption></figure> <figure><img src="https://1551547750-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FI274d7fpHGzB0SWG1XuM%2Fuploads%2F5H4HCcKfrZ9X0FHyYJTA%2Fimage56.png?alt=media&amp;token=515bcc60-779e-43a3-bd58-363b55cb6a64" alt=""><figcaption></figcaption></figure></div>

The deserts feature a new version of the Desert Pyramids, which present a new challenge for players, based on the Trial Chambers. Minecraft Dungeons aims to offer you a new experience, divided into three phases: Crypts, the Sand Vault, and Tombs.

### The Crypts

<figure><img src="https://1551547750-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FI274d7fpHGzB0SWG1XuM%2Fuploads%2FdY2ZU9rCLhJqNlf4ppTg%2Fimage61.png?alt=media&amp;token=2de05a8d-9cfc-408b-9bbe-e8919f8eb734" alt=""><figcaption></figcaption></figure>

This section is characterized by being composed mainly of sandstone, with hallways and rooms containing secrets

#### Vaules and Spawners

This version of the Desert Pyramid contains its own chests and spawners, with unique mobs such as mummies and the Sift.

They feature unique loot specific to the structure and a special item, and of course, they also include their Ominous version.

Mobs that spawn in the spawner: PARCHED, HUSK, MUMMY, PARCHED SPIDER, THE SIFT (WITHER SKELETON in ominous version too)

<div><figure><img src="https://1551547750-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FI274d7fpHGzB0SWG1XuM%2Fuploads%2F1NZD3oFEjpSVocR8N8PF%2Fimage48.png?alt=media&amp;token=f0c43ae4-72fd-42a8-a57f-28211ffb7ce5" alt=""><figcaption></figcaption></figure> <figure><img src="https://1551547750-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FI274d7fpHGzB0SWG1XuM%2Fuploads%2FDVY31tsAR5UTtd8ecTr1%2Fimage49.png?alt=media&amp;token=6a5fe9a3-70e8-4239-af13-8f02170e225d" alt=""><figcaption></figcaption></figure></div>

<div><figure><img src="https://1551547750-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FI274d7fpHGzB0SWG1XuM%2Fuploads%2F449UPcHOdthTgwkca3td%2Fimage50.png?alt=media&amp;token=a9db4a12-0ac2-4fe2-af43-882f0c7e9e00" alt=""><figcaption></figcaption></figure> <figure><img src="https://1551547750-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FI274d7fpHGzB0SWG1XuM%2Fuploads%2Fw1Ga5pK8VBn2dTklvcoY%2Fimage51.png?alt=media&amp;token=0320d190-77dd-47ce-bf66-32828cc26349" alt=""><figcaption></figcaption></figure></div>

#### Dowsing Key

<figure><img src="https://1551547750-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FI274d7fpHGzB0SWG1XuM%2Fuploads%2FNTrbQj7W42LzyJY6Ablb%2Fimage74.png?alt=media&amp;token=5afeeaee-8b3b-40b6-ab9e-2ac88f30af44" alt=""><figcaption></figcaption></figure>

This is an item dropped by the Ominous Vaules with a low probability; its function is to reveal all nearby ores around you, and it can only be used once.

### The Sand Vault

This section is where the challenges involving spawners and vaults are concentrated, and where the vast majority of rewards will be found.

<figure><img src="https://1551547750-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FI274d7fpHGzB0SWG1XuM%2Fuploads%2FATUDBxo7mAtbCBllblto%2Fimage62.png?alt=media&amp;token=61804511-6ead-4323-92e8-fe34c40d8946" alt=""><figcaption></figcaption></figure>

<figure><img src="https://1551547750-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FI274d7fpHGzB0SWG1XuM%2Fuploads%2F4hpHlWSVLkiRqNbXwvIW%2Fimage63.png?alt=media&amp;token=b31aa601-b84f-4bc6-b171-972b63af6eeb" alt=""><figcaption></figcaption></figure>

<figure><img src="https://1551547750-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FI274d7fpHGzB0SWG1XuM%2Fuploads%2FOaEf5AN4mtMYOVzQo62A%2Fimage64.png?alt=media&amp;token=86a95d67-d57c-42db-b432-abb4007f865a" alt=""><figcaption></figcaption></figure>

#### The Mummies

<figure><img src="https://1551547750-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FI274d7fpHGzB0SWG1XuM%2Fuploads%2FPbtTqLqFWToAOr3bGnDJ%2Fimage65.png?alt=media&amp;token=6f1dfb5d-529a-4f0f-9736-ab0b90ac057b" alt=""><figcaption></figcaption></figure>

These mobs contain a kind of mummified, corrupted allay inside them; they will gradually wear down as they take damage and have a low chance of dropping a unique item, the Glaive of Gea

#### Glaive of Gea

This mob has a 30% chance of dropping this weapon, which has a special use and lets you grab onto walls. Here's a video that explains it better:

{% embed url="<https://youtu.be/OxgcN4_v_oY>" %}

#### The Sift Mob

<figure><img src="https://1551547750-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FI274d7fpHGzB0SWG1XuM%2Fuploads%2FgMT0HeJRIu9Fa64ndWld%2Fimage66.png?alt=media&amp;token=9489b0fe-d1bc-4363-a2d4-14b6d7df7dcd" alt=""><figcaption></figcaption></figure>

Sifts are a different kind of blaze; they'll shoot a sand block that will prevent you from moving. You'll have to break them with a sword, and their job is to interrupt you.

### The Tombs

The vaults are likely to drop the Desert Monuments, which are used to open a door that grants you access to this area

{% hint style="info" %}
They're more likely to drop them in their “Ominous” version
{% endhint %}

<div><figure><img src="https://1551547750-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FI274d7fpHGzB0SWG1XuM%2Fuploads%2FACGofZHsUsD1OxE1XNSD%2Fimage67.png?alt=media&amp;token=ce2864a6-5acf-4c39-a14f-c9e8d46b8250" alt=""><figcaption></figcaption></figure> <figure><img src="https://1551547750-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FI274d7fpHGzB0SWG1XuM%2Fuploads%2FXbMhpBv3xufTtuVVS96A%2Fimage68.png?alt=media&amp;token=c3712b38-5412-4fed-af88-b04a7b5eb099" alt=""><figcaption></figcaption></figure></div>

<div><figure><img src="https://1551547750-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FI274d7fpHGzB0SWG1XuM%2Fuploads%2FF6LvuNju3y2BsOn7AH4Q%2Fimage70.png?alt=media&amp;token=9bc574b1-d97c-4cf1-88b8-cb5fcacc17e7" alt=""><figcaption></figcaption></figure> <figure><img src="https://1551547750-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FI274d7fpHGzB0SWG1XuM%2Fuploads%2FrTKwYOAO25t5LlHE0vdd%2Fimage71.png?alt=media&amp;token=68ff537a-7bba-460d-8bb4-ae0718d0f73e" alt=""><figcaption></figcaption></figure> <figure><img src="https://1551547750-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FI274d7fpHGzB0SWG1XuM%2Fuploads%2FYP1SRlozVsyaaim8qQzd%2Fimage72.png?alt=media&amp;token=00c25839-6982-4d7b-af0b-c49bb5314b9c" alt=""><figcaption></figcaption></figure></div>

## Sandsnake Boss

The snake is an entity/block that will move toward you like in the game “Snake”; it will try to bite you and kill you. The only way to defeat it is to gradually reduce its health by mining away at its body.

Its size and health increase as the number of players grows. It is activated by placing a redstone block next to the core.

<figure><img src="https://1551547750-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FI274d7fpHGzB0SWG1XuM%2Fuploads%2FnIwREa2e7WKlEIILrZDH%2Fimage73.png?alt=media&amp;token=ac26cd69-f1d6-42a0-8133-5e88e54a2910" alt=""><figcaption></figcaption></figure>

### Unique Drop

<figure><img src="https://1551547750-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FI274d7fpHGzB0SWG1XuM%2Fuploads%2FdqUBIzx2kRb21D2xPCDI%2Fimage75.png?alt=media&amp;token=82987f90-627b-4533-b24b-75a0fbc3d482" alt=""><figcaption></figcaption></figure>

The Hourglass of Return allows you to save your location when you interact with it, and if you interact with it again within the next 5 seconds, it will return you to that location, using up one use


# Oasis

## General Information

Oases are small biomes found in deserts; this biome features palm trees and small pools of water, and it is here that meerkats take refuge

{% embed url="<https://youtu.be/KnmeV78eriM>" %}

<figure><img src="https://1551547750-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FI274d7fpHGzB0SWG1XuM%2Fuploads%2Fi840tJmRAqQltXwkq3iL%2Fimage12.png?alt=media&amp;token=f94ed955-d7a2-479f-b851-d3220154a692" alt=""><figcaption></figcaption></figure>

<figure><img src="https://1551547750-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FI274d7fpHGzB0SWG1XuM%2Fuploads%2FAScOq3HTRf3wovxIrQy4%2Fimage10.png?alt=media&amp;token=b9f2ce4b-c25e-4ab5-b69b-80bfb395181f" alt=""><figcaption></figcaption></figure>

### Meerkats

[More info here!](https://plugins.elitefantasy.net/maskybiomesexpansion/mobs#meerkat)

<figure><img src="https://1551547750-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FI274d7fpHGzB0SWG1XuM%2Fuploads%2FGs8u4YJDndCEUMePlOiL%2Fimage2.png?alt=media&amp;token=bbfba030-c952-48e3-a788-3924ea51df0e" alt=""><figcaption></figcaption></figure>

## Oasis Caves

<figure><img src="https://1551547750-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FI274d7fpHGzB0SWG1XuM%2Fuploads%2FI19agDFThmOCAjv092PL%2Fimage14.png?alt=media&amp;token=f72302a3-4e94-452c-a2cb-d9f2632d6312" alt=""><figcaption></figcaption></figure>

<figure><img src="https://1551547750-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FI274d7fpHGzB0SWG1XuM%2Fuploads%2FOzznW6jBseoHan2JooIf%2Fimage15.png?alt=media&amp;token=5780dcd8-6f50-492d-bdc9-430daa588c2f" alt=""><figcaption></figcaption></figure>

<figure><img src="https://1551547750-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FI274d7fpHGzB0SWG1XuM%2Fuploads%2FQEAHUJodtaGJQhCbQu2U%2Fimage16.png?alt=media&amp;token=b75b9f71-24b1-4cad-8223-74ae881ad1cf" alt=""><figcaption></figcaption></figure>

Oasis caves are just like regular caves, but they're covered in terracotta, red sand, hanging roots, and unique versions of terracotta minerals


# Ice Caves

## General Information

Ice caves generate in cold biomes and are large in size, consisting of three subbiomes:

Ice Caves, Fossil Aquifer, and Reinforced Depths

## Ice Caves

<figure><img src="https://1551547750-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FI274d7fpHGzB0SWG1XuM%2Fuploads%2F7VvDYaAPDy82invwe9XV%2Fimage17.png?alt=media&amp;token=386bc1e7-919f-4818-90a3-e9126b57c009" alt=""><figcaption></figcaption></figure>

<figure><img src="https://1551547750-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FI274d7fpHGzB0SWG1XuM%2Fuploads%2FlYwVD4mV3jZ4XFSB2wXE%2Fimage18.png?alt=media&amp;token=57621554-aa72-4994-a47d-142368ffe720" alt=""><figcaption></figcaption></figure>

The ice caves are filled with Ice, Packed Ice, and Brittle Ice

Stone is replaced by ice\_stone and deepslate by ice\_deepslate, and there are ice spakes hanging from the ceiling

All minerals in this area are replaced by their frozen versions

### Ice Pointed Dripstone

The caves are full of these spikes; they grow naturally in this biome and can cause damage if you fall on them

### Frozen Crystal

Frozen Crystals are amethyst-like formations found on the ceilings of ice caves

They are used to craft `Ice Bricks` and as fuel for the `Iceologer Staff`

#### Frozen Crystal Block

It functions as a block that “stores” a Redstone signal for a limited time

Example:

`receives a signal of 1` -> `turns on with power 1 for 1 minute`

`receives a signal of 5` -> `turns on with power 5 for 5 minutes`

`receives a signal of 15` -> `turns on with power 15 for 15 minutes`

While active: changes its redstone\_power state

emits Redstone with that same strength, may have different brightness depending on the power

### Structures

You can find 3 different pillager settlements in these areas with loot

<figure><img src="https://1551547750-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FI274d7fpHGzB0SWG1XuM%2Fuploads%2FBDkUX7Q841kGdo4KOcUw%2Fimage23.png?alt=media&amp;token=c269655f-f641-4e66-aff2-2ee225d361bb" alt=""><figcaption></figcaption></figure>

## Fossil Aquifer

<figure><img src="https://1551547750-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FI274d7fpHGzB0SWG1XuM%2Fuploads%2FO2rhyzCOeqcSsITnpTrN%2Fimage22.png?alt=media&amp;token=b642a232-a869-4e5b-9d6c-2fb2dc67760a" alt=""><figcaption></figcaption></figure>

<figure><img src="https://1551547750-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FI274d7fpHGzB0SWG1XuM%2Fuploads%2FGKA3q3L4i29z4ZOfsubV%2Fimage21.png?alt=media&amp;token=619e631f-d2e9-4cad-b2e0-7e1af859e406" alt=""><figcaption></figcaption></figure>

These are biomes near ice caves filled with water, treasures & bones

### Frozen Fossils

<figure><img src="https://1551547750-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FI274d7fpHGzB0SWG1XuM%2Fuploads%2FS6fFNyyMRlBT3tmsvNRT%2Fimage20.png?alt=media&amp;token=3a353962-c731-4f0c-b917-616ff49567d6" alt=""><figcaption></figcaption></figure>

You may find blocks containing items; when you mine them, they can yield interesting items \
such as the `Frozen Totem of Undying`

### Frozen Totem of Undying

<figure><img src="https://1551547750-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FI274d7fpHGzB0SWG1XuM%2Fuploads%2FkArRjOx1dMzX4UOr1S3l%2Fimage24.png?alt=media&amp;token=e5a031a0-f905-49e0-bee7-1d96c3910ceb" alt=""><figcaption></figcaption></figure>

It works similarly to the original totem, but when used, it freezes nearby entities for a few seconds

## Reinforced Depths

<figure><img src="https://1551547750-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FI274d7fpHGzB0SWG1XuM%2Fuploads%2FrkKLaHi7sibW4U6XAJ4z%2Fimage36.png?alt=media&amp;token=31dfecf0-7a89-4373-8b70-326487b4ff29" alt=""><figcaption></figcaption></figure>

<figure><img src="https://1551547750-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FI274d7fpHGzB0SWG1XuM%2Fuploads%2Fx8CJi1uwHtPGrsuoYaxR%2Fimage37.png?alt=media&amp;token=2ea3ee3d-cffc-482e-82db-a893d8be0b00" alt=""><figcaption></figcaption></figure>

These are the rarest and deepest caves; they are filled with abyssal crystals and deepslate-reinforced stone.

### Abyssal Crystal Block

It functions as a block that creates a freezing field when it receives a Redstone signal.

Example:

`receives a signal of 1` -> `activates a small ice field`

`receives a signal of 5` -> `activates a medium ice field`

`receives a signal of 15` -> `activates the largest ice field`

While active:

changes its redstone\_power state, may change its appearance and brightness depending on the power, generates freezing particles in the area

applies slowness to entities within the field, applies slow fall

freezes entities outside the safe zone

### Abyssal Crystal Cluster

When the cluster is within the field created by an Abyssal Crystal Block, it begins to resonate.

While resonating:

it generates many vibration particles, it produces a crystalline sound

it creates a smaller freezing field, that field is more powerful than the normal field

it applies stronger ice effects within a smaller area

it remains active for a few seconds as long as it continues to be affected by the main field


# Mobs

## Meerkat

<figure><img src="https://1551547750-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FI274d7fpHGzB0SWG1XuM%2Fuploads%2FGs8u4YJDndCEUMePlOiL%2Fimage2.png?alt=media&amp;token=bbfba030-c952-48e3-a788-3924ea51df0e" alt=""><figcaption></figcaption></figure>

Their main characteristic is that they search for objects and bury them in the sand

They are the only animals capable of placing objects back in the suspicious sand

These can be retrieved by using the brush on these blocks<br>

At night, meerkats will hide by building burrows or hunt spiders

<figure><img src="https://1551547750-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FI274d7fpHGzB0SWG1XuM%2Fuploads%2F1D0QFThxuytLtdeBzXxt%2Fimage3.png?alt=media&amp;token=b10e1625-1f8b-49fe-9229-f4dc334d171b" alt=""><figcaption></figcaption></figure>

### Reproduction & Growing

Meerkats can reproduce using `SPIDER_EYE`

The babies will grow to adulthood in 12,000 ticks (10 minutes)

### NameTag

Meerkats will disappear if they don't find a player within 70 blocks (the main reason they leave if placed in Creative mode); to prevent this, you need to place a nametag on them

## Ostrich

<figure><img src="https://1551547750-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FI274d7fpHGzB0SWG1XuM%2Fuploads%2FlBdDVOrECRQtT4dx1J1G%2Fimage.png?alt=media&amp;token=848ef148-3018-46cd-9ac9-64fe4cf76a14" alt=""><figcaption></figcaption></figure>

Ostriches are wild animals, but they can be tamed if you give them `WHEAT_SEEDS`

They tuck their heads in if they feel threatened

### Reproduction & Growing

Ostriches can breed with `WHEAT` and will lay an egg

Ostriches will fiercely protect their eggs, so they should not be disturbed

and after 3,600 ticks (3 minutes) have passed, this egg will hatch, and it will grow back to its adult state in 12,000 ticks (10 minutes)

### Tame & Mounting

Tame a ostrich with `WHEAT_SEEDS`

A tamed can be ridden using a Saddle on it

When ridden, it can move faster than any other animal, but its speed decreases when climbing blocks, so it requires a smooth path to reach its full potential

<figure><img src="https://1551547750-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FI274d7fpHGzB0SWG1XuM%2Fuploads%2FsVQ3FRtfuC6wPBeenKSD%2Fimage1.png?alt=media&amp;token=5c0662fa-16e6-49b8-ba3f-35757df1d6de" alt=""><figcaption></figcaption></figure>

### NameTag

Ostriches will disappear if they don't find a player within 70 blocks (the main reason they leave if placed in Creative mode); to prevent this, you need to place a nametag on them

### Ostrich Boots

<figure><img src="https://1551547750-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FI274d7fpHGzB0SWG1XuM%2Fuploads%2F8rkBXivEweZiQnjLUy1C%2Fimage13.png?alt=media&amp;token=c92f1ef6-12e4-40ec-91be-d90c3be1d3c0" alt=""><figcaption></figcaption></figure>

With the feathers, you can craft unique boots that give you speed in the arena

## Termites

<figure><img src="https://1551547750-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FI274d7fpHGzB0SWG1XuM%2Fuploads%2FFXmKFOcvz1FJUER7U87o%2Fimage4.png?alt=media&amp;token=bf3395b5-0f75-43f0-b17a-a9525974b247" alt=""><figcaption></figcaption></figure>

Termites are creatures that appear near their own nests

They are generally hostile toward players and will sometimes retreat to their nests

If you attack a nest, all the termites will come out to attack

Termites can be caught in a bucket for transport

### Hollow Blocks

<figure><img src="https://1551547750-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FI274d7fpHGzB0SWG1XuM%2Fuploads%2FkYYhv0SMTwABGNb2kKyO%2Fimage5.png?alt=media&amp;token=d026a6a3-1347-4e50-8ccf-f8d4ceb0fa7d" alt=""><figcaption></figcaption></figure>

Their main behavior is to seek out tree trunks to eat and hollow out

<figure><img src="https://1551547750-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FI274d7fpHGzB0SWG1XuM%2Fuploads%2FUda564iCUe4XbZMH8Eee%2Fimage6.png?alt=media&amp;token=03d8e4d4-4a34-4f21-b695-4fe390f1b834" alt=""><figcaption></figcaption></figure>

You can place `moss_carpet` on top of the hollow logs, and then you can place `flowers`  & `saplings` on top for a nicer decoration.

<figure><img src="https://1551547750-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FI274d7fpHGzB0SWG1XuM%2Fuploads%2FpfBPtn6OnKAJQW8WRm7C%2Fimage8.png?alt=media&amp;token=e16186f4-a642-494f-a276-0f05410d1b31" alt=""><figcaption></figcaption></figure>

<figure><img src="https://1551547750-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FI274d7fpHGzB0SWG1XuM%2Fuploads%2FAnkXnJnZPRGiLmRYTcaq%2Fimage7.png?alt=media&amp;token=963173de-d319-4271-9b1c-165eff62b507" alt=""><figcaption></figcaption></figure>

When termites chew through wood, they may randomly drop sawdust

### Sawdust

This item ensures that when a crop is fully grown, interacting with it triggers the double harvest and automatically replants it

It can be used in dispensers

### Composter

To craft a composter, you need 4 termite nest blocks. Then, place them around a nest and drop, example, 64 oak logs on top of it to feed the termite mound.

You can use a bucket to carry them to another location—they won’t attack you.

## Iceologer

<figure><img src="https://1551547750-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FI274d7fpHGzB0SWG1XuM%2Fuploads%2FQh7dHpwkcar1pNu3iZSk%2Fimage27.png?alt=media&amp;token=44acf129-4881-4263-b340-c118e8b9bb0f" alt=""><figcaption></figcaption></figure>

This is a mob that appears in frozen mountains or caves; when it sees you, it will summon an ice cube that will head toward the player and then fall

<div><figure><img src="https://1551547750-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FI274d7fpHGzB0SWG1XuM%2Fuploads%2FXJM7jdm4V44OQjuecsYs%2Fimage25.png?alt=media&amp;token=6cb6ebd9-e14e-4195-804f-93c623bc6bcd" alt=""><figcaption></figcaption></figure> <figure><img src="https://1551547750-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FI274d7fpHGzB0SWG1XuM%2Fuploads%2F6kdlIkmh74jPKVLhAphV%2Fimage26.png?alt=media&amp;token=c84e9016-a064-4d4f-a060-828b69c42e3b" alt=""><figcaption></figcaption></figure></div>

## Frozen Zombie

<figure><img src="https://1551547750-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FI274d7fpHGzB0SWG1XuM%2Fuploads%2F0xz47FnEWGeqcNvaghuK%2Fimage29.png?alt=media&amp;token=05c071cc-76e1-4098-bb67-06ca1e2167eb" alt=""><figcaption></figcaption></figure>

Frost Zombies are a variant of Zombies found in frozen biomes; when they attack, they inflict a freezing effect and throw snowballs if the target is far away

Frozen Zombies can sometimes be found in large blocks of ice; when you get close, they'll thaw out and attack you.

<div><figure><img src="https://1551547750-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FI274d7fpHGzB0SWG1XuM%2Fuploads%2FKY2I1D4soIpl0idqnnoe%2Fimage53.png?alt=media&amp;token=a617a80b-e29a-4021-8fbc-74e7ddd1bc50" alt=""><figcaption></figcaption></figure> <figure><img src="https://1551547750-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FI274d7fpHGzB0SWG1XuM%2Fuploads%2Fgt2OggoknGhmdWGKEo4I%2Fimage54.png?alt=media&amp;token=636c50ba-6cda-4ad4-b8bd-9ad87723cd34" alt=""><figcaption></figcaption></figure></div>

## Cryoceratops

<div><figure><img src="https://1551547750-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FI274d7fpHGzB0SWG1XuM%2Fuploads%2FlDj8lLOW4N0oGiRwRonZ%2Fimage40.png?alt=media&amp;token=d61e7682-05b6-4365-ab7a-ce26fdcf52cc" alt=""><figcaption></figcaption></figure> <figure><img src="https://1551547750-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FI274d7fpHGzB0SWG1XuM%2Fuploads%2FduItxrlc9yOgUEktYu2U%2Fimage41.png?alt=media&amp;token=2d5ef469-7dca-4250-8c79-fade36715020" alt=""><figcaption></figcaption></figure></div>

The Cryoceratops is a peaceful mob found in ice caves. Its crystals glow with brightness, and every so often they “mature.” When they are mature, the player can use a BRUSH to harvest Frozen Crystal Shard without killing it.

Additionally, if it has mature crystals, it creates a Glacial Sanctuary: it grants resistance and fire resistance to nearby players, extinguishes fires, and slows down or freezes hostile mobs in the area. If attacked, it releases a cloud of frost to defend itself and flee

## Frozen Spiders

This unique variant of spiders will freeze you when it attacks and shoot webs to slow you down.

<figure><img src="https://1551547750-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FI274d7fpHGzB0SWG1XuM%2Fuploads%2FdHX1qpS22SWSZc0kFEd9%2Fimage55.png?alt=media&amp;token=f70b2fb9-00b2-4afb-903e-f69bef25b317" alt=""><figcaption></figcaption></figure>

## Parched Spiders

This unique variant of spiders will trigger a hunger effect when they attack; they'll hide under the sand to try to surprise you and shoot webs to slow you down.

<figure><img src="https://1551547750-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FI274d7fpHGzB0SWG1XuM%2Fuploads%2FuxylXTLy5xR8MMLjGQwr%2Fimage46.png?alt=media&amp;token=b440b8a7-2a30-4e80-8feb-ca7a3023764d" alt=""><figcaption></figcaption></figure>

## The Mummies (Pyramid Desert Exclusive)

<figure><img src="https://1551547750-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FI274d7fpHGzB0SWG1XuM%2Fuploads%2FPbtTqLqFWToAOr3bGnDJ%2Fimage65.png?alt=media&amp;token=6f1dfb5d-529a-4f0f-9736-ab0b90ac057b" alt=""><figcaption></figcaption></figure>

These mobs contain a kind of mummified, corrupted allay inside them; they will gradually wear down as they take damage and have a low chance of dropping a unique item, the Glaive of Gea

#### The Sift Mob (Pyramid Desert Exclusive)

<figure><img src="https://1551547750-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FI274d7fpHGzB0SWG1XuM%2Fuploads%2FgMT0HeJRIu9Fa64ndWld%2Fimage66.png?alt=media&amp;token=9489b0fe-d1bc-4363-a2d4-14b6d7df7dcd" alt=""><figcaption></figcaption></figure>

Sifts are a different kind of blaze; they'll shoot a sand block that will prevent you from moving. You'll have to break them with a sword, and their job is to interrupt you.


# Blocks

## Boobab Wood Set

<figure><img src="https://1551547750-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FI274d7fpHGzB0SWG1XuM%2Fuploads%2FfmRAZpmWAygyY89pMF8U%2Fimage38.png?alt=media&amp;token=dcac740c-8719-42c4-bf9a-10b920e1eabf" alt=""><figcaption></figcaption></figure>

### Palm Wood Set

<figure><img src="https://1551547750-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FI274d7fpHGzB0SWG1XuM%2Fuploads%2FhTQ2geA7KwFjOXcUbKek%2Fimage39.png?alt=media&amp;token=493a314d-8c27-4f4f-93e5-7299b6faff7e" alt=""><figcaption></figcaption></figure>

## Ice Bricks Set

<figure><img src="https://1551547750-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FI274d7fpHGzB0SWG1XuM%2Fuploads%2FabZdfKykCkJmCifVO4DU%2Fimage30.png?alt=media&amp;token=e170674c-723a-49af-9ee6-287c0445ef46" alt=""><figcaption></figcaption></figure>

## Snow Bricks Set

<figure><img src="https://1551547750-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FI274d7fpHGzB0SWG1XuM%2Fuploads%2F3YW9FH4CalbUIszLs3mS%2Fimage31.png?alt=media&amp;token=708459e3-3e0a-4589-bbff-95870a8c2bc3" alt=""><figcaption></figcaption></figure>

## Ice Stone

<figure><img src="https://1551547750-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FI274d7fpHGzB0SWG1XuM%2Fuploads%2FMVZ5NM4y9BzoEL5qhg9o%2Fimage32.png?alt=media&amp;token=03c85c9b-df7c-4531-bafb-f5407fe0aad2" alt=""><figcaption></figcaption></figure>

## Ice Deepslate

<figure><img src="https://1551547750-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FI274d7fpHGzB0SWG1XuM%2Fuploads%2F8I5tRcqowATqGrVOSK8w%2Fimage33.png?alt=media&amp;token=5dacc899-764d-40ae-9b48-fb57eb78d854" alt=""><figcaption></figcaption></figure>

## Reinforced Ice Deepslate

<figure><img src="https://1551547750-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FI274d7fpHGzB0SWG1XuM%2Fuploads%2FqIEC6gRI86CvMsXBTDkc%2Fimage34.png?alt=media&amp;token=856ef965-6458-4222-8562-538b5fb3e1a2" alt=""><figcaption></figcaption></figure>

## Terracotta

<figure><img src="https://1551547750-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FI274d7fpHGzB0SWG1XuM%2Fuploads%2FyAVKzTfW7I1sd3cMLNie%2Fimage35.png?alt=media&amp;token=ca5f4235-98ea-4118-84b0-ecfaae4c9e14" alt=""><figcaption></figcaption></figure>

## Sand Stone Bricks

<figure><img src="https://1551547750-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FI274d7fpHGzB0SWG1XuM%2Fuploads%2FBNzu09kq5FgZvKPwsvkJ%2Fimage77.png?alt=media&amp;token=fe628953-9c18-4cf5-838d-0e18878632fd" alt=""><figcaption></figcaption></figure>


# Install Guide

Install Guide for Masky Kits

## ItemsAdder

Open `product.zip` and go to “`ItemsAdder Content`”, drag and drop it to your plugins, then go to Nexo `settings.yml` and put in **false** resource-pack.pre\_1\_21\_2\_shaders\_fix.enabled

```yaml
resource-pack:
  pre_1_21_2_shaders_fix:
    enabled: false
entities:
  custom_entities:
    expert_users:
      extract_emotes_shaders: false
text_effects:
  enabled: false
```

## Nexo

Open `product.zip` and go to “`Nexo Content`”, drag it to your plugins folder, then go to Nexo `settings.yml` and put in **false** `CustomArmor.auto_asign_settings`

```yaml
CustomArmor:
  type: COMPONENT
  auto_assign_settings: false

```


# Install Guide

Install Guide for Masky Kits

## CraftEngine

To create new items in CraftEngine, simply duplicate this part and change the names to the texture you want to use

```yaml
  elitefantasy:diamond_common:
    material: diamond
    data:
      components:
        minecraft:rarity: common
    model:
      template: elitefantasy:model/tiers
      arguments:
        item: minecraft:item/diamond
  elitefantasy:diamond_uncommon:
    material: diamond
    data:
      components:
        minecraft:rarity: uncommon
        item_model: elitefantasy:diamond_common
  elitefantasy:diamond_rare:
    material: diamond
    data:
      components:
        minecraft:rarity: rare
        item_model: elitefantasy:diamond_common
  elitefantasy:diamond_epic:
    material: diamond
    data:
      components:
        minecraft:rarity: epic
        item_model: elitefantasy:diamond_common
```

## Nexo

Since Nexo does not have an ItemModels generator for these things, you will have to do more manual work, so first go to `Nexo/pack/assets/elitefantasy/items`, and duplicate `diamond_common.json` and rename it, for example, to `paper_common`

Change the names inside that JSON, and then in Nexo/Items, the configuration should look something like this:

```yaml
paper_common:
  material: paper
  Components:
    item_model: elitefantasy:paper_common
    rarity: common
paper_uncommon:
  material: paper
  Components:
    item_model: elitefantasy:paper_common
    rarity: uncommon
paper_rare:
  material: paper
  Components:
    item_model: elitefantasy:paper_common
    rarity: rare
paper_epic:
  material: paper
  Components:
    item_model: elitefantasy:paper_common
    rarity: epic
```


# Reproduction Items

### Items to reproduce animals

| Mob           | Item             |
| ------------- | ---------------- |
| Alligator     | COOKED\_COD      |
| Deer          | SWEET\_BERRIES   |
| Golden Monkey | MELON\_SLICE     |
| Ostrich       | WHEAT            |
| Meerkat       | SHORT\_GRASS     |
| Vulture       | EGG              |
| Crab          | MANGROVE\_LEAVES |
| Penguin       | COOKED\_SALMON   |

### Eggs Growing Time

| Mob         | Time in Ticks | Time      |
| ----------- | ------------- | --------- |
| Ostrich Egg | 3600          | 3 minutes |
| Vulture Egg | 3600          | 3 minutes |
| Penguin Egg | 3600          | 3 minutes |

Baby Growing Time

| Mob            | Time in Ticks | Time       |
| -------------- | ------------- | ---------- |
| Baby Alligator | 12000         | 10 minutes |
| Baby Deer      | 12000         | 10 minutes |
| Baby Monkey    | 12000         | 10 minutes |
| Baby Ostrich   | 12000         | 10 minutes |
| Baby Meerkat   | 12000         | 10 minutes |
| Baby Vulture   | 12000         | 10 minutes |
| Baby Penguin   | 12000         | 10 minutes |
| Baby Crab      | 12000         | 10 minutes |


