Data

TFC’s data types can be created through the TFCEvents.data event in the server_scripts folder

If FirmaLife Modrinth Link CurseForge Link is installed, the following data types are supported

If Beneath Modrinth Link CurseForge Link is installed, the following data types are supported

Most of these methods have an optional final argument which specifies the id of the virtual json file the data will be placed in. For instance, if an id of fish:get_pierced was used for an entity damage resistance, the resulting file would effectively be at data/fish/tfc/entity_damage_restances/get_pierced.json; the tfc/<data_type> folders do not need to be provided

If no id is provided, one will automatically be generated with the namespace kubejs and, unless other wise noted, a path matching the base 16 hash of the (usually) data type’s .toString() value

Additionally, for data types that use ingredients, if there are multiple definitions with the same valid item/block/fluid/entity, then there is no guarantee as to which will take precedence. This situation can be confirmed by using the search command and fixed by either overriding the existing definition or changing the entries in the tag it uses

Climate Range

Defines the values of an existing, registered climate range, does not create new ones

Method Signature

event.climateRange(
    range: {
        minHydration?: int,
        maxHydration?: int,
        hydrationWiggleRange?: int,
        minTemperature?: number,
        maxTemperature?: number,
        temperatureWiggleRange?: number
    },
    id: ResourceLocation
)
  • 1st argument: The climate range, a map of parameters to values
    • minHydration?: int: The minimum hydration the plant can grow in
      • Defaults to 0
    • maxHydration?: int: The maximum hydration the plant can grow in
      • Defaults to 100
    • hydrationWiggleRange?: int: Additional hydration range in which the plant can survive, but not necessarily grow, in
      • Defaults to 0
    • minTemperature?: number: The minimum temperature, in °C, the plant can grow in
      • Defaults to -Infinity
    • maxTemperature?: number: The maximum temperature, in °C, the plant can grow in
      • Defaults to Infinity
    • temperatureWiggleRange?: number: Additional temperature range in which the plant can survive, but not necessarily grow, in
      • Defaults to 0
  • 2nd argument: The registered id of the climate range whose values are being defined

Example

TFCEvents.data(event => {
    event.climateRange(
        {
            minHydration: 15,
            maxHydration: 75,
            minTemperature: -2,
            maxTemperature: 26
        },
        'kubejs:cicada_crop'
    )
})

Deposit

Add a deposit definition, which allows an item to processed in a pan or sluice

Method Signature

event.deposit(
    deposit: {
        ingredient: Ingredient,
        loot: ResourceKey<LootTable>,
        models?: List<ResourceLocaiton>
    },
    id?: ResourceLocation
)
  • 1st argument: The deposit data, a map of parameters to values
    • ingredient: Ingredient: An item ingredient, the items the deposit applies to
    • loot: ResourceKey<LootTable>: The id of a loot table, the result of panning/sluicing the item
    • models?: List<ResourceLocation>: The models to display in sequence while panning
      • Defaults to []
  • Optional 2nd argument: A ResourceLocation, the id of the deposit

Example

TFCEvents.data(event => {
    event.deposit(
        {
            ingredient: '#minecraft:flowers',
            loot: 'kubejs:flower_loot',
            models: [
                'minecraft:block/poppy',
                'minecraft:block/daisy',
                'minecraft:block/cornflower'
            ]
        }
    )
})

Drinkable

Add a drinkable definition, allows a fluid to be drunk for thirst, nutrients, and even effects

Method Signature

event.drinkable(
    drinkable: {
        ingredient: FluidIngredient,
        consumeChance?: number,
        mayDrinkWhenFull?: boolean,
        food?: {
            hunger?: int,
            water?: number,
            saturation?: number,
            intoxication?: int,
            grain?: number,
            fruit?: number,
            vegetables?: number,
            protein?: number
            dairy?: number,
            decayModifier?: number
        },
        effects?: List<{
            type: Holder<MobEffect>,
            duration: int,
            amplifier?: int,
            chance?: number
        }>
    },
    id?: ResourceLocation
)
  • 1st argument: The drinkable data, a map of parameters to values
    • ingredient: FluidIngredient: The fluids the drink data applies to
    • consumeChance?: number: The chance a block of fluid will be consumed when drinking from in-world
      • Must be in the range [0, 1]
      • Defaults to 1
    • mayDrinkWhenFull?: boolean: If the player can drink with a full thirst bar
      • Defaults to false
    • food?: FoodData: Additional food and nutrient data, the same as the food properties of food definitions
    • effects?: List<Effect>: A list of effects to apply, a map of parameters to values
      • type: Holder<MobEffect>: The effect to apply1
      • duration: int: How many ticks the effect should be active for
      • amplifier?: int: The level of the effect
        • Defaults to 0
      • chance?: number: The chance the effect is added
        • Must be in the range [0, 1]
        • Defaults to 0
  • Optional 2nd argument: A ResourceLocation, the id of the drinkable

Example

TFCEvents.data(event => {
    event.drinkable(
        {
            ingredient: Fluid.of('lava', 500),
            mayDrinkWhenFull: true,
            food: {
                protein: 500
            },
            effects: [{
                type: 'minecraft:wither',
                duration: 500,
                amplifier: 3,
                chance: 1
            }]
        }
    )
})

Entity Damage Resistance

Add an entity damage resistance

Method Signature

event.entityDamageResistance(
    resistance: {
        entity: TagKey<EntityType<?>>,
        piercing?: number,
        slashing?: number,
        crushing?: number
    },
    id?: ResourceLocation
)
  • 1st argument: The entity resistance data, a map of parameters to values:
    • entity: TagKey<EntityType<?>>: The entities the resistance applies to
    • piercing?: number: The piercing resistance
      • Negative values make the entity weak to piercing damage
      • Defaults to 0
    • slashing?: number: The slashing resistance
      • Negative values make the entity weak to slashing damage
      • Defaults to 0
    • crushing?: number: The crushing resistance
      • Negative values make the entity weak to crushing damage
      • Defaults to 0
  • Optional 2nd argument: A ResourceLocation, the id of the resistance

Example

TFCEvents.data(event => {
    event.entityDamageResistance(
        {
            entity: 'minecraft:fish',
            piercing: -800
        },
        'fish:get_pierced'
    )
})

Fauna

Defines the values of an existing, registered fauna, does not create new ones. See the relevant event for doing so

Method Signature

event.fauna(
    builder: Consumer<FaunaBuidler>,
    id: ResourceLocation
)
  • 1st argument: A consumer with several methods
    • .minTemperature(min: number): Sets the minimum temperature (and the maximum temperature to Infinity)
    • .maxTemperature(max: number): Sets the maximum temperature (and the minimum temperature to -Infinity)
    • .temperature(min: number, max: number): Sets the maximum and minimum temperature
    • .minGroundwater(min: number): Sets the minimum temperature (and the maximum groundwater to Infinity)
    • .maxGroundwater(max: number): Sets the maximum temperature (and the minimum groundwater to -Infinity)
    • .groundwater(min: number, max: number): Sets the maximum and minimum groundwater
    • .minRainVariance(min: number): Sets the minimum rain variance (and maximum rain variance to 1 and absolute rain variance to false)
    • .maxRainVariance(max: number): Sets the maximum rain variance (and minimum rain variance to -1 and absolute rain variance to false)
    • rainVariance(min: number, max: number, absolute: boolean): Sets the permissible rain variance, in the range [-1, 1], and if the sign of the rain variance should be ignored
    • .minForest(min: int): Sets the minimum forest density (and maximum forest density to 4)
    • .maxForest(max: int): Sets the maximum forest density (and minimum forest density to 0)
    • .forest(min: int, max: int): Sets the permissible forest density, in the range [0, 4]
    • .forestType(types...: ForestType[]): Restricts spawning to within the given ForestTypes
    • .minElevation(min: int): Sets the minimum elevation (and maximum elevation to 320)
    • .maxElevation(max: int): Sets the maximum elevation (and minimum elevation to -64)
    • .elevation(min: int, max: int): Sets the permissible elevation range
    • .months(months: List<Month>): Set the Months during which spawning is valid
    • .chance(value: int): Sets the spawn chance
    • .distanceBelowSeaLevel(value: int): Sets the distance below sea level required to spawn
    • .maxBrightness(value: int): Sets the maximum light level spawning can occur under
    • .fuzzy(): Makes the temperature, groundwater, and rain variance limits fuzzy when evaluating
    • .solid(): Makes it so spawning can only occur on blocks tagged minecraft:valid_sapwn
    • .ignoreRivers(): Ignores river contributions to groundwater values
  • 2nd argument: A ResourceLocation, the id of the fauna

Example

TFCEvents.data(event => {
    event.fauna(
        fauna => {
            fauna.temperature(-20, 5)
            fauna.forest(1, 3)
            fauna.fuzzy()
            fauna.solid()
        },
        'tfc:fox'
    )
})

Fertilizer

Add a fertilizer definition

Method Signature

event.fertilizer(
    fertilizer: {
        ingredient: Ingredient,
        nitrogen?: number,
        phosphorus?: number,
        potassium?: number
    },
    id?: ResourceLocation
)
  • 1st argument: The fertilizer data, a map of parameters to values
    • ingredient: Ingredient: The ingredient the fertilizer values apply to
    • nitrogen?: number: The nitrogen amount
      • Must be in the range [0, 1]
      • Defaults to 0
    • phosphorus?: number: The phosphorus amount
      • Must be in the range [0, 1]
      • Defaults to 0
    • potassium?: number: The potassium amount
      • Must be in the range [0, 1]
      • Defaults to 0
  • Optional 2nd argument: A ResourceLocation, the id of the fertilizer

Example

TFCEvents.data(event => {
    event.fertilizer(
        {
            ingredient: 'minecraft:bone_block',
            potassium: 0.2,
            phosphorous: 0.07
        },
        'kubejs:bone'
    )
})

Fluid Heat

Add a fluid heat, required for heating recipes to work with a fluid

Method Signature

event.fluidHeat(
    fluidHeat: {
        fluid: Fluid,
        meltTemperature: number,
        specificHeatCapacity: number
    },
    id?: ResourceLocation
)
  • 1st argument: The fluid heat data, a map of parameters to values
    • fluid: Fluid: The fluid the heat applies to
    • meltTemperature: number: The temperature, in °C
    • specificHeatCapacity: number: The specific heat capacity of the metal, in units of Energy / (°C * mB)
  • Optional 2nd argument: A ResourceLocation, the id of the fluid heat

If no id is specified, the namespace will be kubejs and the path will be the of the fluid with a slash between its namespace and path

Example

TFCEvents.data(event => {
    event.fluidHeat(
        {
            fluid: 'minecraft:lava', // Here, the id of the heat would be 'kubejs:minecraft/lava'
            meltTemperature: 1550,
            specificHeatCapacity: 0.023
        }
    )
})

Food

Add a food definition to an item

Method Signature

event.food(
    food: {
        ingredient: Ingredient,
        food: {
            hunger?: int,
            water?: number,
            saturation?: number,
            intoxication?: int,
            grain?: number,
            fruit?: number,
            vegetables?: number,
            protein?: number
            dairy?: number,
            decayModifier?: number
        },
        edible?: boolean
    },
    id?: ResourceLocation
)
  • 1st argument: The food definition data, a map of parameters to values
    • ingredient: Ingredient: The items the food applies to
    • food: FoodData: The food properties, a map of parameters to values
      • hunger?: int: The amount of hunger to add. A full hunger bar is 20
        • Defaults to 0
      • water?: number: The amount of thirst to restore. A full thirst bar is 100
        • Defaults to 0
      • saturation?: number: The amount of saturation to provide
        • Defaults to 0
      • intoxication?: int: The number of ticks of intoxication to add to the player
        • Defaults to 0
      • grain?: number: The amount of grain nutrient to add to the player
        • Defaults to 0
      • fruit?: number: The amount of fruit nutrient to add to the player
        • Defaults to 0
      • vegetables?: number: The amount of vegetables nutrient to add to the player
        • Defaults to 0
      • protein?: number: The amount of protein nutrient to add to the player
        • Defaults to 0
      • dairy?: number: The amount of dairy nutrient to add to the player
        • Defaults to 0
      • decayModifier?: number: The decay modifier to apply, a higher value means a quicker decay
        • Defaults to 0
    • edible?: boolean: If the food is edible
      • Defaults to true
  • Optional 2nd argument: A ResourceLocation, the id of the food definition

Example

TFCEvents.data(event => {
    event.food(
        {
            ingredient: 'minecraft:cooked_beef',
            food: {
                hunger: 4,
                saturation: 2,
                nutrients: [ 0, 0, 0, 5, 0 ]
            }
        }
    )
})

Fuel

Add a fuel for firepits, charcoal forges, etc.

Method Signature

event.fuel(
    fuel: {
        ingredient: Ingredient,
        duration?: int,
        temperature?: number,
        purity?: number
    },
    id?: ResourceLocation
)
  • 1st argument: The fuel definition, a map of parameters to values
    • ingredient: Ingredient: The items the fuel applies to
    • duration?: int: The number of ticks the fuel burns for
      • Defaults to 0
    • temperature?: number: The temperature, in °C, the fuel burns at
      • Defaults to 0
    • purity?: number: The purity of the fuel, effects how much smoke the firepit makes when burning the fuel
      • Defaults to 1
  • Optional 2nd argument: A ResourceLocation, the id of the fuel

Example

TFCEvents.data(event => {
    event.fuel(
        {
            ingredient: 'minecraft:poppy',
            duration: 500,
            temperature: 50,
            purity: 0.03
        },
        'kubejs:dirty_poppy'
    )
})

Heat

Add a heat capability definition to items

Method Signature

event.heat(
    heat: {
        ingredient: Ingredient,
        heatCapacity?: number,
        forgingTemperature?: number,
        weldingTemperature?: number
    },
    id?: ResourceLocation
)
  • 1st argument: The heat definition, a map of parameters to values
    • ingredient: Ingredient: The items the heat applies to
    • heatCapacity: number: The heat capacity of the item, a higher values makes the item take longer to heat up
      • Defaults to 0
    • forgingTemperature?: number: The temperature at which the item can be forged2
      • Defaults to 0
    • weldingTemperature?: number: The temperature at which the item can be welded2
      • Defaults to 0
  • Optional 2nd argument: A ResourceLocation, the id of the heat definition

Example

TFCEvents.data(event => {
    event.heat(
        {
            ingredient: 'minecraft:gold_ingot',
            heatCapacity: 0.5
        },
        'kubejs:vanilla_gold'
    )
})

Item Damage Resistance

Add an item damage resistance

Method Signature

event.itemDamageResistance(
    resistance: {
        ingredient: Ingredient,
        piercing?: number,
        slashing?: number,
        crushing?: number
    },
    id?: ResourceLocation
)
  • 1st argument: The resistance data, a map of parameters to values
    • ingredient: Ingredient: The items the resistance applies to
    • piercing?: number: The piercing resistance
      • Negative values make the item extra vulnerable to piercing damage
      • Defaults to 0
    • slashing?: number: The slashing resistance
      • Negative values make the item extra vulnerable to slashing damage
      • Defaults to 0
    • crushing?: number: The crushing resistance
      • Negative values make the item extra vulnerable to crushing damage
      • Defaults to 0
  • Optional 2nd argument: A ResourceLocation, the id of the resistance

Example

TFCEvents.data(event => {
    event.itemDamageResistance(
        {
            ingredient: '#kubejs:weak_to_slashing',
            slashing: -30,
            piercing: -2,
            crushing: 5
        }
    )
})

Item Size

Add a size and weight definition

Method Signature

event.itemSize(
    itemSize: {
        ingredient: Ingredient,
        size?: Size,
        weight?: Weight
    },
    id?: ResourceLocation
)
  • 1st argument: A item size definition, a map of parameters to values
    • ingredient: Ingredient: The items the size applies to
    • size?: Size: The size of the item(s)
      • Reveal/hide list of sizes
        • tiny
        • very_small
        • small
        • normal
        • large
        • very_large
        • huge
      • Defaults to small
    • weight?: Weight: The weight of the item(s)
      • Reveal/hide list of weights
        • very_light
        • light
        • medium
        • heavy
        • very_heavy
      • Defaults to light
  • Optional 2nd argument: A ResourceLocation, the id of the size

Example

TFCEvents.data(event => {
    event.itemSize(
        {
            ingredient: 'minecraft:netherite_ingot',
            weight: 'very_heavy'
        },
        'kubejs:heavy_netherite'
    )
})

Knapping Type

Add a new knapping type for use in knapping recipes

Method Signature

event.knappingType(
    knappingType: {
        inputItem: SizedIngredient,
        clickSound: Holder<SoundEvent>,
        icon: ItemStack,
        amountToConsume?: int,
        consumeAfterComplete?: boolean,
        hasOffTexture?: boolean,
        spansParticles?: boolean
    },
    id: ResourceLocation
)
  • 1st argument: The knapping type definition, a map of parameters to values
    • inputItem: SizedIngredient: The input for the knapping type
    • clickSound: Holder<SoundEvent>: The sound to play when knapping3
    • icon: ItemStack: The item to use as the category icon in recipe viewers
    • amountToConsume?: int: How many items of input to consume when performing a recipe
      • Defaults to the count of inputItem
    • consumeAfterComplete?: boolean: If the input items should only be consumed after the recipe completes
      • Defaults to false
    • hasOffTexture?: boolean: If the knapping screen should display a second texture for tiles that are off
      • Defaults to false
    • spawnsParticles?: boolean: If knapping particles should spawn when clicking a knapping tile
      • Defaults to false
  • 2nd argument: A ResourceLocation, the id of the knapping type which knapping recipes reference

Example

TFCEvents.data(event => {
    event.knappingType(
        {
            inputItem: Ingredient.of('minecraft:flint', 5),
            amountToConsume: 2,
            clickSound: 'minecraft:entity.warden.roar',
            icon: 'minecraft:flint',
            spawnsParticles: true
        },
        'kubejs:flint'
    )
})

Lamp Fuel

Add a new lamp fuel

Method Signature

event.lampFuel(
    lampFuel: {
        fluid: FluidIngredient,
        lamps: BlockIngredient,
        burnRate: int
    },
    id?: ResourceLocation
)
  • 1st argument: The lamp fuel data, a map of parameters to values
    • fluid: FluidIngredient: The fluids the fuel applies to
    • lamps: BlockIngredient: The blocks the fuel is valid for
    • burnRate: int: The burn rate, in ticks / mB, of the fuel
  • Optional 2nd argument: A ResourceLocation, the id of the fuel

Example

TFCEvents.data(event => {
    event.lampFuel(
        {
            fluid: 'minecraft:milk',
            lamps: [
                'tfc:metal/lamp/blue_steel',
                'tfc:metal/lamp/bronze'
            ],
            burnRate: 6
        }
    )
})

Support

Add a support definition

Method Signature

event.support(
    support: {
        ingredient: BlockIngredient,
        up?: int,
        down?: int,
        horizontal?: int
    },
    id?: ResourceLocation
)
  • 1st argument: The support data, a map of parameters to values
    • ingredient: BlockIngredient: A BlockIngredient, the blocks the support applies to
    • up?: int: The number of blocks above the support that are supported
      • Defaults to 0
    • down?: int: The number of blocks below the support that are supported
      • Defaults to 0
    • horizontal?: int: The number of blocks away that are supported
      • Defaults to 0
  • Optional 2nd argument: A ResourceLocation, the id of the support

Example

TFCEvents.data(event => {
    event.support(
        {
            ingredient: '#kubejs:wacky_supports',
            up: 6,
            horizontal: 2
        },
        'kubejs:wacky_support'
    )
})

Lost Page

Add a lost page definition, used in rituals

Method Signature

event.lostPage(
    page: {
        cost: Ingredient,
        costs: List<int>,
        reward: Item,
        rewards: List<int>,
        punishments?: List<Punishment>,
        translation?: Component
    },
    id?: ResourceLocation
)
  • 1st argument: The lost page data, a map of parameters to values
    • cost: Ingredient: The ingredient of the ritual
    • costs: List<int>: The potential quantity of a cost for the ritual
    • reward: Item: The reward for completing the ritual
    • rewards: List<int>: The potential quantity of a reward for the ritual
    • punishments?: List<Punishment>: The potential punishments for invoking the ritual
      Reveal/hide list of punishments
      • none
      • levitation
      • drunkenness
      • blaze_inferno
      • infestation
      • withering
      • slime
      • corruption
      • wrath
      • champion
      • blessing
      • greed
      • unknown
    • translation?: Component: The display for the cost
  • Optional 2nd argument: A ResourceLocation, the id of the lost page

Example

BeneathEvents.data(event => {
    event.lostPage(
        {
            cost: '#minecraft:flowers',
            costs: [
                1, 2, 3, 4, 5
            ],
            reward: 'minecraft:egg',
            rewards: [
                2, 4, 6, 8, 10
            ],
            punishments: [
                'none',
                'blaze_inferno',
                'corruption'
            ]
        }
    )
})

Nether Fertilizer

Add a nether fertilizer definition

Method Signature

event.netherFertilizer(
    fertilizer: {
        ingredient: Ingredient,
        death?: number,
        destruction?: number,
        decay?: number,
        sorrow?: number
        flame?: number
    },
    id?: ResourceLocation
)
  • 1st argument: The nether fertilizer data, a map of parameters to values
    • ingredient: Ingredient: The ingredient the fertilizer applies to
    • death?: number: the death value of the fertilizer
      • Must be in the range [0, 1]
      • Defaults to 0
    • destruction?: number: The destruction value of the fertilizer
      • Must be in the range [0, 1]
      • Defaults to 0
    • decay?: number: The decay value of the fertilizer
      • Must be in the range [0, 1]
      • Defaults to 0
    • sorrow?: number: The sorrow value of the fertilizer
      • Must be in the range [0, 1]
      • Defaults to 0
    • flame?: number: The flame value of the fertilizer
      • Must be in the range [0, 1]
      • Defaults to 0
  • Optional 2nd argument: A ResourceLocation, the id of the nether fertilizer

Example

BeneathEvents.data(event => {
    event.netherFertilizer(
        {
            ingredient: '#minecraft:dirt',
            death: 5,
            flame: 1.2
        }
    )
})

Greenhouse Type

Add a greenhouse type

Method Signature

event.greenhouseType(
    type: {
        ingredient: BlockIngredient,
        translationKey: Component,
        tier?: int
    },
    id?: ResourceLocation
)
  • 1st argument: The greenhouse data, a map of parameters to values
    • ingredient: BlockIngredient: The blocks the greenhouse type applies to
    • translationKey: Component: The text describing the greenhouse type
    • tier?: int: The tier of the greenhouse type
      • Defaults to 0

Example

FirmaLifeEvents.data(event => {
    event.greenhouseType(
        {
            ingredient: [
                'minecraft:green_wool',
                'minecraft:glass'
            ],
            translationKey: Text.darkPurple('"Green" House'),
            tier: 25
        }
    )
})

Plantable

Add a plantable definition, for use in planters in greenhouses

Method Signature

event.plantable(
    plantable: {
        ingredient: Ingredient,
        planter: PlanterType,
        seed: ItemStack,
        crop: ItemStack,
        tier?: int,
        stages?: int,
        extraSeedChance?: number,
        nutrient?: {
            nitrogen?: number,
            phosphorous?: number,
            potassium?: number
        },
        textures?: List<ResourceLocation>,
        specials?: List<ResourceLocation>
    },
    id?: ResourceLocation
)
  • 1st argument: The plantable data, a map of parameters to values
    • ingredient: Ingredient: The items that can be put in a planter to grow
    • planter: PlanterType: The planter the plantable grows in
      Reveal/hide list of planter types
      • quad
      • large
      • hanging
      • trellis
      • bonsai
      • hydroponic
    • seed: ItemStack: The seed drop when harvesting the plantable
    • crop: ItemStack: The crop drop when harvesting the plantable
    • tier?: int: The minimum greenhouse tier required for the plantable to grow
    • stages?: int: The number of growth stages the plantable has
      • Defaults to 0
    • extraSeedChance?: number: The chance an extra seed drops on harvest
      • Must be in the range [0, 1]
      • Defaults to 0
    • nutrient: NutrientList: The nutrients required to grow, a map of parameters to values
      • nitrogen?: number: The nitrogen amount
        • Must be in the range [0, 1]
        • Defaults to 0
      • phosphorous?: number: The phosphorous amount
        • Must be in the range [0, 1]
        • Defaults to 0
      • potassium?: number: The potassium amount
        • Must be in the range [0, 1]
        • Defaults to 0
    • textures?: List<ResourceLocation>: The textures used for the growth stages
      • Defaults to []
    • specials?: List<ResourceLocation>: Special textures used by hanging planters
      • Defaults to []
  • Optional 2nd argument: A ResourceLocation, the id of the plantable

Example

FirmaLifeEvents.data(event => {
    event.plantable(
        {
            ingredient: 'minecraft:rose_bush',
            planter: 'trellis',
            seed: 'minecraft:rose_bush',
            crop: 'minecraft:rose_bush',
            tier: 22,
            nutrient: {
                nitrogen: 2
            },
            textures: [
                'minecraft:block/stone',
                'minecraft:block/dirt'
            ]
        }
    )
})
  1. A full list of mob effects can be obtained by running the command /kubejs dump_registry minecraft:mob_effect in-game 

  2. In TFC, the forging and welding temperatures of an item are typically 60% and 80% of its melting temperature  2

  3. A full list of all sound events can be obtained by running the command /kubejs dump_registry minecraft:sound_event in-game