--- title: Farming type: docs weight: 2 --- The farming system provides crop growth, harvesting, and animal coop mechanics. **Package:** `com.hypixel.hytale.builtin.adventure.farming` ## Architecture ``` FarmingPlugin ├── Block Components (ChunkStore) │ ├── TilledSoilBlock - Farmland state │ ├── FarmingBlock - Crop growth tracking │ ├── FarmingBlockState - Block growth state │ └── CoopBlock - Animal coop state ├── Entity Components (EntityStore) │ └── CoopResidentComponent - Animals in coops ├── Growth Modifiers │ ├── FertilizerGrowthModifier │ ├── WaterGrowthModifier │ └── LightLevelGrowthModifier └── Farming Stages ├── BlockTypeFarmingStageData ├── BlockStateFarmingStageData ├── PrefabFarmingStageData └── SpreadFarmingStageData ``` ## Block Components ### TilledSoilBlock Tracks tilled soil state on ChunkStore: ```java ComponentType type = FarmingPlugin.get().getTiledSoilBlockComponentType(); ``` ### FarmingBlock Tracks crop growth progress: ```java public class FarmingBlock { // Growth rate modifier (0 = no spread on newly generated) public void setSpreadRate(float rate); } ``` ### FarmingBlockState Current farming state for a block position. ### CoopBlock Animal coop block state for housing creatures. ## Growth Modifiers Growth modifiers affect crop growth rate: | Modifier | Type ID | Description | |----------|---------|-------------| | `FertilizerGrowthModifierAsset` | `Fertilizer` | Boosts growth with fertilizer | | `WaterGrowthModifierAsset` | `Water` | Water proximity bonus | | `LightLevelGrowthModifierAsset` | `LightLevel` | Light-based growth | ### Asset Configuration ```yaml # Farming/Modifiers/bone_meal.json { "Id": "bone_meal", "Type": "Fertilizer", "GrowthMultiplier": 2.0 } ``` ## Farming Stages Crops progress through stages defined as assets: | Stage Type | Type ID | Description | |------------|---------|-------------| | `BlockTypeFarmingStageData` | `BlockType` | Changes block type | | `BlockStateFarmingStageData` | `BlockState` | Changes block state | | `PrefabFarmingStageData` | `Prefab` | Places a prefab structure | | `SpreadFarmingStageData` | `Spread` | Spreads to adjacent blocks | ### Spread Growth Behavior ```java public interface SpreadGrowthBehaviour { // Directional growth (vines, etc.) } public class DirectionalGrowthBehaviour implements SpreadGrowthBehaviour { // Grows in specified direction } ``` ## Interactions Registered farming interactions: | Interaction | Type ID | Description | |-------------|---------|-------------| | `HarvestCropInteraction` | `HarvestCrop` | Harvest mature crops | | `FertilizeSoilInteraction` | `FertilizeSoil` | Apply fertilizer | | `ChangeFarmingStageInteraction` | `ChangeFarmingStage` | Force stage change | | `UseWateringCanInteraction` | `UseWateringCan` | Water crops | | `UseCoopInteraction` | `UseCoop` | Interact with animal coop | | `UseCaptureCrateInteraction` | `UseCaptureCrate` | Capture animals | ### Interaction Example ```yaml # Item interaction definition { "Type": "HarvestCrop", "DropTable": "wheat_drops" } ``` ## Animal Coops ### FarmingCoopAsset Define coop configurations: ```yaml # Farming/Coops/chicken_coop.json { "Id": "chicken_coop", "Capacity": 4, "NPCGroups": ["chickens"], "Drops": "egg_drops" } ``` ### CoopResidentComponent Entity component for animals living in coops: ```java ComponentType type = FarmingPlugin.get().getCoopResidentComponentType(); ``` ## Systems The farming plugin registers these ECS systems: | System | Description | |--------|-------------| | `OnSoilAdded` | Initialize soil when tilled | | `OnFarmBlockAdded` | Initialize crop when planted | | `Ticking` | Process growth each tick | | `MigrateFarming` | Migration for old data | | `OnCoopAdded` | Initialize coop blocks | | `CoopResidentEntitySystem` | Manage coop residents | | `CoopResidentTicking` | Coop production ticking | ## Events ```java // Prevent spread on newly generated chunks getEventRegistry().registerGlobal( EventPriority.LAST, ChunkPreLoadProcessEvent.class, FarmingPlugin::preventSpreadOnNew ); ``` ## API Usage ```java FarmingPlugin farming = FarmingPlugin.get(); // Get component types for queries ComponentType farmingType = farming.getFarmingBlockComponentType(); // Check farming state FarmingBlock block = holder.getComponent(farmingType); if (block != null) { block.setSpreadRate(1.0f); } ``` ## Configuration Assets loaded from `Farming/` directory: - `Farming/Modifiers/` - Growth modifier definitions - `Farming/Coops/` - Animal coop definitions