ScreenJS
Download: CurseForge
The custom ContainerMenu event is a startup event.
Custom Container menus are created in a startup script. They cannot be reloaded without restarting the game. The event is not cancellable.
for block entities:
StartupEvents.registry('menu', event => {
event.create('example_block' /*name can be anything*/, 'block_entity')
.addSlot(-10, -10) // adds a slot into this x,y position on the texture
.addSlot(10, 200)
.loop(builder /*this builder*/=> {
for(let x = 0; x < 9; x++) {
for (let y = 0; y < 4; y++) {
builder.addSlot(x * 18 /*<- the width of a slot, remember to add this*/, y * 18, x + y * 4)
}
}
})
.addOutputSlot(118, 118, 0, 0, 1, 'minecraft:smelting') // adds a slot you can't put an item into, but can pull an item from
// LAST PARAMETER CAN BE NULL FOR NO OUTPUT HANDLING
.inputSlotIndices(0) // sets a list of ITEM HANDLER indexes to handle as slotChanged callback input
.playerInventoryY(100) // marks the start of the player's inventory on the texture
.tintColor(0xFF00FF00) // a color to tint the whole inventory texture, in hexadecimal [a, r, g, b]
.progressDrawable(50, 50, new Rectangle(0, 0, 10, 30), 'forge:textures/white.png', 'up', 'energy') // displays an energy bar from the blockentity's FE capability
.slotChanged((menu, level, player, itemHandlers) => {
console.info('' + player)
})
.setBlockEntity('kubejs:example_block') // the block entity type that should open this GUI on right-click
})
for any block:
StartupEvents.registry('menu', event => {
event.create('grass_block' /*name can be anything*/, 'block')
/*default parameter set*/
.addItemHandler(9) // adds an item handler.
.addItemHandler(1)
.inputSlotIndices(0)
.setBlock('minecraft:grass_block') // the block that should open this GUI on right-click
})
for entities:
StartupEvents.registry('menu', event => {
event.create('snow_golem' /*name can be anything*/, 'entity')
/*default parameter set*/
.setEntity('minecraft:snow_golem') // the enity type that should open this GUI on right-click
})
and lastly, for completely separate 'basic' GUIs:
currently nothing can access these!
StartupEvents.registry('menu', event => {
event.create('name_here' /*name can be anything*/)
/*default parameter set*/
})
- basic (this is the default)
- block_entity
- block
- entity
addSlot(x, y, slotIndex, containerIndex)addOutputSlot(x, y, slotIndex, inputContainerIndex, outputContainerIndex, recipeType)loop(builder => ...)inputSlotIndices(int[] indexes)tintColor(color)drawable(screenX, screenY, rectangle, textureLocation)progressDrawable(x, y, rectangle, textureLocation, direction, type)fluidDrawable(x, y, rectangle, textureLocation, direction, tankIndex)customDrawable(x, y, rectangle, textureLocation, direction, (menu, screen, drawable, direction) => ...)backroundTexture(texture, rectangle)quickMoveFunc((player, slotIndex, menu) => ... return item)slotChanged((menu, level, player, itemHandler) => ...)validityFunc((player, pos) => ... return boolean)disablePlayerInventory()playerInventoryY(yPos)button(rectangle, textComponent, button => ...)
default available types:
- PROGRESS
- FUEL
- ENERGY
default available move directions:
- UP
- DOWN
- LEFT
- RIGHT
available types:
Rectangle(x, y, u ,v)
MenuUtils (contains progress(max, current, length) for custom bars)
RecipeWrapper (forge IItemHandlerModifiable wrapper for recipes)
CraftingWrapper (ScreenJS wrapper class used for crafting recipes)
Custom Key Binds
ScreenJS can do custom key bindings! examples & available methods below:
The custom KeyBind event is a Client event.
// client_scripts
KeybindEvents.register(event => {
event.register(new KeyBind("open_menu" /* name */, InputConstants.KEY_G /* key index, opengl spec */, "screenjs" /* category name */), (action, modifiers /* modifiers as per OpenGL spec */) => {
if (action == 1) { // action == 1 is PRESS
Minecraft.instance.gui.setOverlayMessage(Text.string('AAA').yellow(), false) // vanilla method
MenuScreens.create('kubejs:separate', Minecraft.instance, 1000, Text.string('AAA').yellow()) // opens a GUI container, preferably of type 'basic'
} else if (action == 0) { // action == 0 is RELEASE
Minecraft.instance.gui.setOverlayMessage(Text.string('BBB').yellow(), true)
} else { // action == 2 is REPEAT (after a second of PRESS)
Minecraft.instance.gui.setOverlayMessage(Text.string('REPEAT').red(), false)
}
})
})
available methods:
register
available types:
KeyBind(name, keyIndex, category)
KeyAction(action, modifiers)
InputConstantsMinecraft (client main class)