Screen vs ContainerScreen
La lib propose trois types d'écrans de base. Choisir le bon dès le départ évite de devoir tout refactorer.
Les trois types
ApocalyScreen — écrans de données
Pour les UIs qui affichent et interagissent avec des données sans slot vanilla. C'est le type le plus courant.
Exemples : Clan Hub, profil joueur, classements, boutique par liste, menu de navigation.
public final class ClanHubScreen extends ApocalyScreen {
public ClanHubScreen(String clanName, int points) {
super(Component.translatable("monmod.screen.clanhub"), 260);
// ...
}
@Override
protected void buildLayout(Column root) {
// ajouter widgets et conteneurs à root
}
}
ApocalyContainerScreen<T> — écrans avec slots vanilla
Pour les UIs qui affichent des slots Minecraft (items déplaçables avec le curseur). Le contenu des slots est géré côté serveur via un AbstractContainerMenu.
Exemples : Coffre de guilde, atelier de clan, table d'enchantements personnalisée.
public final class CoffreGuildeScreen extends ApocalyContainerScreen<CoffreGuildeMenu> {
public CoffreGuildeScreen(CoffreGuildeMenu menu, Inventory inv) {
super(menu, inv,
Component.translatable("monmod.screen.coffre"),
220, 140); // largeur, hauteur du panneau
}
@Override
protected void buildLayout(Row root) {
// buildLayout reçoit une Row (pas une Column)
root.add(SlotGrid.builder()
.slots(this.menu.slots)
.screenOrigin(this.leftPos, this.topPos)
.build());
}
}
Row, pas une ColumnPour ApocalyContainerScreen, la méthode est buildLayout(Row root). C'est un Row pour permettre un layout horizontal à côté des slots (info à gauche, slots à droite, etc.).
ApocalyMultiScreen — écrans multi-panneaux
Pour les UIs composées de plusieurs panneaux côte à côte, chacun avec son propre titre, sa propre largeur et son propre scroll.
Exemples : Marchand (boutique + détails + inventaire), comparateur (article A vs article B), dashboard (stats + actions + historique).
public final class MarchandScreen extends ApocalyMultiScreen {
public MarchandScreen() {
super(Component.translatable("monmod.screen.marchand"));
}
@Override
protected List<PanelConfig> buildPanels() {
return List.of(
PanelConfig.of(
Component.translatable("monmod.panel.boutique"), 140,
this::buildBoutiquePanel),
PanelConfig.of(
Component.translatable("monmod.panel.details"), 170,
this::buildDetailsPanel)
);
}
private void buildBoutiquePanel(Column col) { /* ... */ }
private void buildDetailsPanel(Column col) { /* ... */ }
}
Chaque panneau est rendu indépendamment avec son propre scroll. Le groupe est centré horizontalement, les panneaux sont séparés de 8 px.
Arbre de décision
Mon UI a des slots vanilla (items déplaçables) ?
│
├─ Oui ──→ ApocalyContainerScreen<T>
│ (+ AbstractContainerMenu côté serveur)
│
└─ Non
│
Mon UI a plusieurs panneaux côte à côte ?
│
├─ Oui ──→ ApocalyMultiScreen
│ (+ buildPanels() retourne List<PanelConfig>)
│
└─ Non ──→ ApocalyScreen ← cas le plus courant
Comparaison rapide
ApocalyScreen | ApocalyContainerScreen | ApocalyMultiScreen | |
|---|---|---|---|
| Méthode abstraite | buildLayout(Column) | buildLayout(Row) | buildPanels() |
| Slots vanilla | Non | Oui | Non |
| Plusieurs panneaux | Non | Non | Oui |
| Scroll global auto | Oui | Non | Oui (par panneau) |
| Menu côté serveur | Non | Requis | Non |
Note sur isPauseScreen()
Les trois types retournent false : l'écran ne met pas le jeu en pause. C'est le comportement attendu sur un serveur multijoueur où le jeu continue de tourner pendant que le joueur navigue dans un UI.
Voir aussi
- Référence ApocalyScreen
- Référence ApocalyContainerScreen
- Référence ApocalyMultiScreen
- Recette marchand à slots — exemple complet avec AbstractContainerMenu
- Recette multi-panneaux — exemple complet ApocalyMultiScreen