Aller au contenu
galdurdocs

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.

⏱ 6 minGaldur UI 0.1.0Client

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 :

  1. garde la liste à jour (depuis des paquets du serveur, par exemple),
  2. la filtre et la trie,
  3. 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

TerminalScreen.java
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 :

TestTerminalScreen.java
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 :

TestTerminalMenu.java
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);
Garder le défilement au redimensionnement

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
RenduSeules les rangées visibles sont dessinées (columns × rows cases), quelle que soit la taille de la liste.
QuantitésForme courte dans la case : « 64 », « 1,2k », « 64k » (GaldurFormat.amount).
DéfilementPar 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.
SurvolContour accent_hover, voile d’accent et info-bulle de l’objet, avec la quantité exacte au-delà de 1 000.
ClicGauche ou droit, avec l’état de Maj, sur une case occupée.
Désactivéeactive = false : quantités atténuées, ni clic ni survol ; le défilement marche toujours pour parcourir.
JEI / EMISurvoler 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 :

Example.java
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.

© 2026 Galdur Studio · galdurstudio.com · Discord · LGPL-3.0-onlyProduit non officiel. Non approuvé par Mojang ou Microsoft, ni associé à eux.