Grilles d’objets et terminaux
GaldurItemGrid affiche des milliers d’objets avec leurs quantités, comme le terminal d’un réseau de stockage, sans créer de vraies cases de menu.
Pas de vraies cases
Un GaldurItemGrid se contente d’afficher une liste d’entrées et de signaler les clics. Il ne déplace aucun objet et ne parle pas au serveur. C’est ton mod qui :
- garde la liste à jour (depuis des paquets du serveur, par exemple),
- la filtre et la trie,
- envoie au serveur ce que le joueur veut faire d’un clic.
La liste est relue à chaque image : elle peut changer à tout moment sans reconstruire le widget.
Créer une grille
List<GaldurItemGrid.Entry> contents = ...; // tenu à jour par le modGaldurItemGrid grid = GaldurItemGrid.of(9, 6, () -> contents) .onClick((index, entry, button, shift) -> askServer(entry, button, shift));of(columns, rows, entries) crée une grille de columns × rows cases visibles, barre de défilement comprise. Chaque Entry est un ItemStack et une quantité long : les quantités peuvent dépasser largement 64.
La mettre dans un écran de terminal
Le terminal du mod de test place une grille de tous les objets au-dessus de l’inventaire du joueur, dans un GaldurContainerScreen :
public class TestTerminalScreen extends GaldurContainerScreen<TestTerminalMenu> { private int scrollRow; @Override protected void init() { super.init(); GaldurItemGrid grid = GaldurItemGrid.of(9, TestTerminalMenu.GRID_ROWS, () -> entries) .onClick((index, entry, button, shift) -> LOGGER.info("{} x {}", entry.stack(), entry.amount())); // Les cases de la grille s’alignent sur celles de l’inventaire : cadre à x - 1. grid.setPosition(leftPos + 7, topPos + TestTerminalMenu.GRID_Y - 1); grid.setScrollRow(scrollRow); addRenderableWidget(grid.onScroll(row -> scrollRow = row)); }}Le menu associé n’ajoute que l’inventaire du joueur, sous la grille :
static final int GRID_Y = 18;static final int GRID_ROWS = 6;static final int INVENTORY_Y = GRID_Y + GRID_ROWS * SLOT_SIZE + 14;// dans le constructeur :addPlayerInventory(inventory, 8, INVENTORY_Y);Minecraft rappelle init() à chaque redimensionnement. Garde la première rangée visible avec onScroll et remets-la avec setScrollRow, comme au-dessus.
Ce que fait la grille
| Comportement | |
|---|---|
| Rendu | Seules les rangées visibles sont dessinées (columns × rows cases), quelle que soit la taille de la liste. |
| Quantités | Forme courte dans la case : « 64 », « 1,2k », « 64k » (GaldurFormat.amount). |
| Défilement | Par rangées entières, à la molette (une rangée par cran) ou avec la barre, qu’on peut attraper et glisser. La barre ne s’affiche que si les objets ne tiennent pas. |
| Survol | Contour accent_hover, voile d’accent et info-bulle de l’objet, avec la quantité exacte au-delà de 1 000. |
| Clic | Gauche ou droit, avec l’état de Maj, sur une case occupée. |
| Désactivée | active = false : quantités atténuées, ni clic ni survol ; le défilement marche toujours pour parcourir. |
| JEI / EMI | Survoler un objet et appuyer sur R ou U affiche ses recettes (dans un GaldurContainerScreen). |
Une case fait 18 × 18 pixels, comme une case vanilla (CELL_SIZE). La largeur de la barre de défilement vient du thème (spacing.scrollbar_width).
Une seule case
Pour un seul objet au lieu d’une grille, GaldurItemSlot est une case d’affichage utilisable dans les layouts vanilla :
GaldurItemSlot iron = GaldurItemSlot.of(() -> new ItemStack(Items.IRON_INGOT), () -> network.amount(iron)) .onPress(button -> button == 0 ? takeStack() : takeHalf());La quantité est masquée quand elle vaut 1, comme dans Minecraft. Clic gauche = 0, clic droit = 1 ; Entrée et Espace comptent comme un clic gauche.