Démarrage rapide
Ce guide t'amène de zéro à un premier écran fonctionnel qui s'affiche en jeu. Il suppose que tu as déjà un mod Forge 1.20.1 avec Java 17.
Étape 1 — Publier la lib en Maven local
Dans le répertoire d'ApocalyInterfaceLib :
gradlew publishToMavenLocal
Cela installe le JAR dans ~/.m2/repository/ca/tawess123/apocalyinterface/apocalyinterfacelib/1.0.0/.
Étape 2 — Modifier build.gradle de ton mod
2a. Déclarer le dépôt Maven local
Dans le bloc repositories {} (celui de la section dependencies, pas celui de buildscript) :
repositories {
mavenLocal() // ← ajouter cette ligne
}
2b. Déclarer la dépendance
dependencies {
minecraft "net.minecraftforge:forge:1.20.1-47.3.22"
// ApocalyInterfaceLib — bibliothèque UI côté client
implementation fg.deobf("ca.tawess123.apocalyinterface:apocalyinterfacelib:1.0.0")
}
fg.deobf() est indispensable pour les mods Forge : il réapplique le remapping des noms Mojang.
Étape 3 — Modifier mods.toml de ton mod
Dans src/main/resources/META-INF/mods.toml, ajouter un bloc de dépendance.
Remplacer monmod par le modId réel de ton mod :
[[dependencies.monmod]]
modId="apocalyinterfacelib"
mandatory=true
versionRange="[1.0,)"
ordering="AFTER"
side="CLIENT"
side="CLIENT" est obligatoireLa lib est cliente uniquement. Déclarer side="BOTH" provoque un crash côté serveur dédié.
| Champ | Valeur | Pourquoi |
|---|---|---|
mandatory | true | La lib doit être présente pour que l'UI fonctionne |
versionRange | [1.0,) | Accepte la 1.0.0 et toutes les versions supérieures |
ordering | AFTER | La lib est initialisée avant ton mod |
side | CLIENT | Ne pas déclarer en BOTH — la lib n'existe pas côté serveur |
Étape 4 — Créer ton premier écran
Voici un écran complet qui affiche le nom d'un joueur et ses coins. Copie ce code dans ton mod, adapte le package.
package ca.monmod.client.screen;
import ca.tawess123.apocalyinterface.api.data.DataSource;
import ca.tawess123.apocalyinterface.api.layout.Card;
import ca.tawess123.apocalyinterface.api.layout.Column;
import ca.tawess123.apocalyinterface.api.screen.ApocalyScreen;
import ca.tawess123.apocalyinterface.api.widget.Button;
import ca.tawess123.apocalyinterface.api.widget.KeyValueRow;
import ca.tawess123.apocalyinterface.api.widget.Label;
import net.minecraft.network.chat.Component;
public final class StatScreen extends ApocalyScreen {
private final String pseudo;
private final int coins;
public StatScreen(String pseudo, int coins) { // (1)
super(Component.translatable("monmod.screen.stats"), 220); // (2)
this.pseudo = pseudo;
this.coins = coins;
}
@Override
protected void buildLayout(Column root) { // (3)
root.add(Card.create() // (4)
.add(Label.builder()
.text("monmod.label.bonjour") // (5)
.value(DataSource.of(pseudo)) // (6)
.title() // (7)
.build())
.add(KeyValueRow.builder()
.key("monmod.row.coins")
.value(DataSource.of(coins + " ⬡"))
.build()));
root.add(Button.builder()
.text("monmod.btn.fermer")
.onClick(this::onClose) // (8)
.build());
}
}
Explication ligne par ligne :
| Annotation | Explication |
|---|---|
| (1) | Le constructeur reçoit les données. Tous les champs doivent être final — ils ne changent pas pendant la durée de vie de l'écran. |
| (2) | super() prend le titre (clé i18n) et la largeur en pixels du panneau. Forge traduit la clé dans la langue active du client. |
| (3) | buildLayout est appelée une fois à l'ouverture, puis à chaque redimensionnement. Tu ajoutes des widgets à root — pas de coordonnées. |
| (4) | Card.create() crée un sous-panneau avec fond, bordure et padding. Les méthodes .add() sont chaînables. |
| (5) | .text() prend toujours une clé i18n, jamais un texte brut. |
| (6) | .value(DataSource.of(pseudo)) fourni la valeur affichée après le label. DataSource.of() crée une valeur statique. |
| (7) | .title() applique la couleur jaune ApocalyColors.TITLE au label. |
| (8) | this::onClose est la méthode héritée de Screen — ferme l'écran proprement. |
Étape 5 — Ouvrir l'écran
Depuis un packet S2C (production)
// Dans le handler du packet d'ouverture, côté client :
Minecraft.getInstance().execute(() ->
Minecraft.getInstance().setScreen(
new StatScreen(payload.pseudo(), payload.coins())
)
);
Depuis un KeyMapping (développement)
// Dans le tick handler de ton mod, pour tester rapidement :
if (MON_KEYBIND.consumeClick()) {
Minecraft.getInstance().setScreen(new StatScreen("Tawess123", 1500));
}
Étape 6 — Ajouter les clés i18n
Dans src/main/resources/assets/monmod/lang/fr_ca.json :
{
"monmod.screen.stats": "Mes Stats",
"monmod.label.bonjour": "Joueur : %s",
"monmod.row.coins": "Coins",
"monmod.btn.fermer": "Fermer"
}
Dans src/main/resources/assets/monmod/lang/en_us.json (requis par Forge même si ton mod est francophone) :
{
"monmod.screen.stats": "My Stats",
"monmod.label.bonjour": "Player: %s",
"monmod.row.coins": "Coins",
"monmod.btn.fermer": "Close"
}
Résultat attendu
Un panneau centré, 220 px de large, avec :
- La barre de titre jaune affichant « Mes Stats »
- Une card avec le nom du joueur en jaune et ses coins en cyan
- Un bouton « Fermer » en bas
Aucun calcul de coordonnées, aucun appel OpenGL direct.
Étape suivante
- Système de layout — comprendre Column, Row, Card, Grid, ScrollableColumn
- Recettes — un hub complet avec boutons défilants (Clan Hub)