Item Registry
Adding new items to game
Custom items are created in a startup script. They cannot be reloaded without restarting the game. The event is not cancellable.
// Listen to item registry event
StartupEvents.registry('item', e => {
// The texture for this item has to be placed in kubejs/assets/kubejs/textures/item/test_item.png
// If you want a custom item model, you can create one in Blockbench and put it in kubejs/assets/kubejs/models/item/test_item.json
e.create('test_item')
// If you want to specify a different texture location you can do that too, like this:
e.create('test_item_1').texture('mobbo:item/lava') // This texture would be located at kubejs/assets/mobbo/textures/item/lava.png
// You can chain builder methods as much as you like
e.create('test_item_2').maxStackSize(16).glow(true)
// You can specify item type as 2nd argument in create(), some types have different available methods
e.create('custom_sword', 'sword').tier('diamond').attackDamageBaseline(10.0)
})
Valid item types:
'basic'
(this is the default)'sword'
'pickaxe'
'axe'
'shovel'
'shears'
'hoe'
'helmet'
'chestplate'
'leggings'
'boots'
Other methods item builder supports: (you can chain these methods after
create()
)maxStackSize(size)
displayName(name)
unstackable()
maxDamage(damage)
burnTime(ticks)
containerItem(item_id)
rarity('rarity')
tool(type, level)
glow(true/false)
tooltip(text...)
group('group_id')
color(index, colorHex)
texture(customTextureLocation)
parentModel(customParentModelLocation)
food(foodBuilder => ...)
For full syntax see below
Methods available if you use a tool type (
'sword'
, 'pickaxe'
, 'axe'
, 'shovel'
or 'hoe'
):tier('toolTier')
modifyTier(tier => ...)
Same syntax as custom tool tier, see Custom TiersattackDamageBaseline(damage)
You only want to modify this if you are creating a custom weapon such as Spear, Battleaxe, etc.attackDamageBonus(damage)
speedBaseline(speed)
Same as attackDamageBaseline, only modify for custom weapon typesspeed(speed)
Default available tool tiers:
'wood'
'stone'
'iron'
'gold'
'diamond'
'netherite'
Methods available if you use an armor type ('helmet', 'chestplate', 'leggings' or 'boots'):
tier('armorTier')
modifyTier(tier => ...)
Same syntax as custom armor tier, see Custom Tiers
Default available armor tiers:
'leather'
'chainmail'
'iron'
'gold'
'diamond'
'turtle'
'netherite'
Vanilla group/creative tab IDs:
'search'
'buildingBlocks'
'decorations'
'redstone'
'transportation'
'misc'
'food'
'tools'
'combat'
'brewing'
#Custom Foods
StartupEvents.registry('item', event => {
event.create('magic_steak').food(food => {
food
.hunger(6)
.saturation(6)//This value does not directly translate to saturation points gained
//The real value can be assumed to be:
//min(hunger * saturation * 2 + saturation, foodAmountAfterEating)
.effect('speed', 600, 0, 1)
.removeEffect('poison')
.alwaysEdible()//Like golden apples
.fastToEat()//Like dried kelp
.meat()//Dogs are willing to eat it
.eaten(ctx => {//runs code upon consumption
ctx.player.tell(Text.gold('Yummy Yummy!'))
//If you want to modify this code then you need to restart the game.
//However, if you make this code call a global startup function
//and place the function *outside* of an event handler
//then you may use the command:
// /kubejs reload startup_scripts
//to reload the function instantly.
//See example below
})
})
event.create('magicer_steak').unstackable().food(food => food
.hunger(7)
.saturation(7)
// This references the function below instead of having code directly, so it is reloadable!
.eaten(ctx => global.myAwesomeReloadableFunction(ctx))
)
})
global.myAwesomeReloadableFunction = ctx => {
ctx.player.tell('Hello there!')
ctx.player.tell(Text.of('Change me then reload with ').append(Text.red('/kubejs reload startup_scripts')).append(' to see your changes!'))
}