Les pools se tirent indépendamment
Une table de butin contient une liste de pools, et chacun est évalué séparément. C’est la chose la plus utile à savoir, car c’est ainsi qu’on exprime « toujours une arme, plus deux ou trois fournitures aléatoires, plus une chance rare de quelque chose de spécial » — trois pools, pas une seule liste astucieuse.
Dans un pool, rolls indique combien de fois piocher. Cela peut être un nombre fixe ou un intervalle :
"rolls": 1
"rolls": { "type": "minecraft:uniform", "min": 2, "max": 4 }
Chaque tirage choisit exactement une entrée dans la liste de ce pool. Quatre tirages sur un pool de trois objets peuvent tout à fait donner quatre fois le même objet — les tirages sont indépendants, ce n’est pas une main distribuée sans remise.
Le poids est une part, pas un pourcentage
C’est là que la plupart des tables déraillent. Le poids n’est pas une chance sur 100. C’est une part du poids total de ce pool.
iron_ingot poids 10
gold_ingot poids 5
diamond poids 1
Le total fait 16, donc le fer sort 10/16 du temps — environ 62 %, pas 10 %. Ajoutez une quatrième entrée de poids 84 et le fer tombe à 10/100 sans que vous ayez touché à son nombre. Chaque poids d’un pool est relatif à ses voisins : ajouter une entrée reprice silencieusement tout le reste du pool.
Si vous voulez un vrai pourcentage, c’est un autre mécanisme : une condition random_chance sur l’entrée.
"conditions": [
{ "condition": "minecraft:random_chance", "chance": 0.15 }
]
Ce sont là de vrais 15 %, évalués indépendamment du poids. Les deux se combinent d’une manière qui mérite d’être choisie sciemment : l’entrée doit d’abord gagner le tirage pondéré, et seulement ensuite le jet à 15 % a lieu.
La quantité est une étape distincte du choix
Choisir quel objet tombe et choisir combien sont deux opérations différentes. La taille de la pile vient d’une fonction appliquée après le choix de l’entrée :
{
"type": "minecraft:item",
"name": "minecraft:iron_ingot",
"weight": 10,
"functions": [
{
"function": "minecraft:set_count",
"count": { "type": "minecraft:uniform", "min": 1, "max": 4 }
}
]
}
Sans set_count, vous obtenez exactement un exemplaire. Cet objet sous count est un number provider, la même structure que celle utilisée par rolls. L’apprendre une fois couvre les deux.
Le type de table est un contrat, pas une étiquette
Le type en tête de fichier déclare dans quel contexte la table est tirée, et le jeu vous tient parole. Une table minecraft:chest n’a ni tueur ni victime : une condition qui interroge l’entité morte n’y est donc pas seulement inutile — elle rend la table invalide pour ce contexte.
| Type | Tirée quand |
|---|---|
minecraft:chest | Un coffre de structure se génère, ou /loot est utilisé |
minecraft:entity | Un monstre meurt |
minecraft:block | Un bloc est cassé |
minecraft:fishing | Quelque chose est remonté à la ligne |
minecraft:gift | Un villageois ou un chat apporte un cadeau |
Si une table se comporte correctement en test mais ne se déclenche jamais dans le monde, vérifiez que son type correspond à la façon dont elle est réellement déclenchée.
Tester sans courir après un coffre
Nul besoin de trouver un vrai donjon pour voir vos probabilités. La commande /loot tire une table existante à la demande :
/loot give @s loot harbor:harbor_dungeon
À dire clairement, car le nom induit en erreur : /loot lit une table, elle n’en crée pas. Aucune commande n’écrit une table de butin — le fichier doit d’abord exister dans un data pack. Si vous n’en avez pas encore, le guide data packs contre commandes explique pourquoi, et le générateur de data packs crée le dossier.
Lancez-la vingt fois de suite et la distribution apparaît vite. C’est aussi le moyen le plus rapide de repérer un poids mal calibré.
Quand la table n’est simplement jamais lue
Deux défaillances se ressemblent depuis l’intérieur du jeu et n’ont rien à voir avec votre JSON.
La première est le dossier. Minecraft 1.21 a renommé loot_tables en loot_table, au singulier. Sur 1.21+, un fichier resté dans l’ancien dossier n’est jamais chargé, et rien ne vous prévient — le pack s’affiche toujours comme activé.
La seconde est l’identifiant. Le fichier situé à data/harbor/loot_table/harbor_dungeon.json s’adresse par harbor:harbor_dungeon. L’espace de noms vient du dossier sous data, pas du nom du fichier, et un décalage ici produit une erreur « unknown loot table » plutôt qu’un silence — ce qui, comparé au premier cas, est une clémence.
Pour aller plus loin
Le générateur de tables de butin construit ces structures avec les number providers déjà à la bonne forme et affiche le chemin où le fichier doit aller. Pour le conteneur qui l’accueille, voyez le générateur de data packs ; pour rendre les objets qui en sortent plus intéressants, le constructeur d’objets couvre les noms, le lore et les IDs cachés.