Compounds
Create a new compound¶
In this example, let's create a simple gui which lists all existing materials. Also, we want to send a chat message with the name of the material when the user clicks on the icon.
You can create a compound inside a page builder scope. The recommended way of doing so is to use the createRectCompound
function.
page(1) {
val compound = createRectCompound<Material>(
Slots.RowOneSlotOne, Slots.RowSixSlotEight,
iconGenerator = {
ItemStack(it)
},
onClick = { clickEvent, element ->
clickEvent.player.sendMessage("You clicked on: ${element.name}")
}
)
}
Notice that the generic type of the compound is Material
. The compound type defines the type of the elements which can be added to the compound.
The iconGenerator
defines how each compound element should be displayed. You will get the element passed as it
and you have to return an ItemStack
, which will be used for the icon.
Info
In our example, it is very easy to create the icon, as we can easily create an ItemStack
from a Material
. In your scenarios, don't be scared of putting more complex logic inside the iconGenerator
.
Modify the content of a compound¶
The compound from above will be empty at first, you have to add content to it. This can be done using the compound.addContent
function.
The content you add has to be of the type you defined earlier (in our case this is Material
).
compound.addContent(Material.values().toList())
In order to remove content, call the compound.removeContent
function. Let's remove air from our example compound.
compound.removeContent(Material.AIR)
Sort the compound¶
You can use the compound.sortContentBy
function to define in which order the elements of a compound should be displayed.
In our example, we could sort by the name of the material like this:
compound.sortContentBy { it.name }
Add scroll buttons¶
If the content of the compound won't fit on one page of the GUI, do not create multiple pages, even if this is what you might think of at first.
Instead, add scroll buttons to the same page!
Smooth scrolling¶
To implement smooth scrolling, create scroll buttons like this:
compoundScroll(
Slots.RowOneSlotNine,
ItemStack(Material.PAPER), compound, scrollTimes = 6
)
compoundScroll(
Slots.RowSixSlotNine,
ItemStack(Material.PAPER), compound, scrollTimes = 6, reverse = true
)
Notice that you have to pass the compound
as a parameter. Also, be careful to set scrollTimes
to the height of your compound (in our example this is 6, because the inventory is 6 slots high, and we use the full height).
You can use the reverse
parameter and set it to true to create a button that scrolls backwards.
Instant (hard) scrolling¶
Instant (or hard) scrolling means that no scrolling animation will be displayed.
To implement instant scrolling, leave scrollTimes
at its default value (1) and instead modify the scrollLines
parameter.
Set scrollLines
to the amount of lines you want to instantly scroll by pressing the button.
If you want to scroll "page by page", set scrollLines
to the height of the compound.
In our example, we could create the following button to scroll "page by page" instantly (without any scrolling animation):
compoundScroll(
Slots.RowSixSlotNine,
ItemStack(Material.PAPER), compound, scrollLines = 6
)