Skip to main content

Migrating to KubeJS 6

This page is still being worked on, so if some info is missing, please check back later!

What's changed in new KubeJS 6 (1.19.2+)?

onEvent()

onEvent('string.event.id', event => {}) syntax has been replaced by
SomeEventGroup.someEventName(event => {}).

// Before

onEvent('block.right_click', event => {
  if(event.block.id === 'minecraft:dirt') {
    console.info('Hi!')
  }
})

// After

BlockEvents.rightClicked(event => {
  if(event.block.id === 'minecraft:dirt') {
    console.info('Hi!')
  }
})

Not only that, but new events also support extra parameter for IDs and other things! You can now chose to make each id have it's own event handler:

// Before

onEvent('block.right_click', event => {
  if(event.block.id === 'minecraft:dirt') {
    console.info('Hi!')
  } else if(event.block.id === 'minecraft:stone') {
    console.info('Bye!')
  }
})

// After

BlockEvents.rightClicked('minecraft:dirt', event => {
  console.info('Hi!')
})

BlockEvents.rightClicked('minecraft:stone', event => {
  console.info('Bye!')
})

Some events require ID, such as registry and tag events:

// Before

onEvent('item.registry', event => {
})

// After

StartupEvents.registry('item', event => {
})
// Before

onEvent('tags.items', event => {
})

// After

ServerEvents.tags('item', event => {
})

Using parameter is actually faster on CPU than checking some event.id == 'id'.

You can find full list of new events here.

onForgeEvent()

onForgeEvent('package.ClassName', event => {}) has been replaced by
ForgeEvents.onEvent('package.ClassName', event => {}).

// Before

onForgeEvent('net.minecraftforge.event.level.BlockEvent$PortalSpawnEvent', event => {
})

// After

ForgeEvents.onEvent('net.minecraftforge.event.level.BlockEvent$PortalSpawnEvent', event => {
})

New! It now supports generic events:

ForgeEvents.onGenericEvent('net.minecraftforge.event.AttachCapabilitiesEvent', 'net.minecraft.world.entity.Entity', event => {
})

Server settings

settings.log... properties have been removed from server scripts, and instead, moved to local/kubejsdev.properties file. By default it won't be shipped with back, but you can change saveDevPropertiesInConfig to true to instead save the file in kubejs/config/dev.properties.

java()

java('package.ClassName') has been replaced by
Java.loadClass('package.ClassName').

// Before

const CactusBlock = java('net.minecraft.world.level.block.CactusBlock')

// After

const CactusBlock = Java.loadClass('net.minecraft.world.level.block.CactusBlock')

There might be some more reflective helper methods later in Java util class, such as listing all fields and methods in a class, etc.

Bye Bye Wrapper classes

None of the vanilla classes are wrapper anymore - EntityJS, LevelJS, ItemStackJS, IngredientJS and others are gone. This may introduce some bugs, but in general, should make it significantly easier to interact with minecraft and other mods. Almost all old methods are still supported by coremodding vanilla. This should also significantly boost performance, as it doens't need to constantly wrap and unwrap classes.

Other questions

If you have any other questions, feel free to ask them on my discord.