Création de loot boxes

Le serveur Mang’Armor s’est démarqué en proposant aux joueurs des coffres disponibles grâce aux progrès. Nous allons voir aujourd’hui comment mettre en place ces boites au contenu aléatoire.

Avant-propos

Ces coffres sont en fait des boites de shulker avec une table de loot personnalisée permettant d’obtenir des objets aléatoires à leur première ouverture. Les tables de loot sont de simples fichiers Json mais pour les créer plus facilement, j’utiliserais Minecraft.tools.

Architecture d’une table de loot

L’architecture est plutôt simple mais le côté répétitif augmente le risque des erreurs. C’est pour cela que je préfère utiliser un générateur. Dans cet exemple, le fichier json de la table de loot sera placé dans le répertoire data/mangarmor/loot_tables/chests dans le cas d’un loot de coffre. Il est également possible d’utiliser le répertoire entities pour les loots des mobs et gameplay pour la pêche.

Le fichier comprend un tableau nommé pools qui liste des objets contenant le nombre de lancers et les loots possibles. Voici l’exemple du fichier de la pêche minecraft/loot_tables/gameplay/fishing.json :

{
    "pools": [
        {
            "rolls": 1,
            "entries": [
                {
                    "type": "loot_table",
                    "name": "minecraft:gameplay/fishing/junk",
                    "weight": 10,
                    "quality": -2
                },
                {
                    "type": "loot_table",
                    "name": "minecraft:gameplay/fishing/treasure",
                    "weight": 5,
                    "quality": 2
                },
                {
                    "type": "loot_table",
                    "name": "minecraft:gameplay/fishing/fish",
                    "weight": 85,
                    "quality": -1
                }
            ]
        }
    ]
}

Ce fichier contient un tableau pools contenant une seule table de loot proposant 1 lancer avec 3 résultats possibles. Chaque résultat (appelé entrée) propose une autre table de loot, avec un poids différent (weight) et une qualité différente. Le poids indique les chances de l’obtenir. Plus la valeur est grande, plus on a de chance de l’avoir. La qualité permet de modifier ce résultat avec des enchantements de chance/malchance.

Voici un autre exemple avec un extrait des loots du coffre des igloos :

{
    "type": "minecraft:chest",
    "pools": [
        {
        "rolls": {
            "min": 2.0,
            "max": 8.0,
            "type": "minecraft:uniform"
        },
        "entries": [
            {
            "type": "minecraft:item",
            "weight": 15,
            "functions": [
                {
                "function": "minecraft:set_count",
                "count": {
                    "min": 1.0,
                    "max": 3.0,
                    "type": "minecraft:uniform"
                }
                }
            ],
            "name": "minecraft:apple"
            },
            {
            "type": "minecraft:item",
            "weight": 15,
            "functions": [
                {
                "function": "minecraft:set_count",
                "count": {
                    "min": 1.0,
                    "max": 4.0,
                    "type": "minecraft:uniform"
                }
                }
            ],
            "name": "minecraft:coal"
            },
            {
            "type": "minecraft:item",
            "weight": 10,
            "functions": [
                {
                "function": "minecraft:set_count",
                "count": {
                    "min": 1.0,
                    "max": 3.0,
                    "type": "minecraft:uniform"
                }
                }
            ],
            "name": "minecraft:gold_nugget"
            },
            {
            "type": "minecraft:item",
            "weight": 2,
            "name": "minecraft:stone_axe"
            },
            {
            "type": "minecraft:item",
            "weight": 10,
            "name": "minecraft:rotten_flesh"
            },
            {
            "type": "minecraft:item",
            "name": "minecraft:emerald"
            },
            {
            "type": "minecraft:item",
            "weight": 10,
            "functions": [
                {
                "function": "minecraft:set_count",
                "count": {
                    "min": 2.0,
                    "max": 3.0,
                    "type": "minecraft:uniform"
                }
                }
            ],
            "name": "minecraft:wheat"
            }
        ]
        },
        {
        "rolls": 1,
        "entries": [
            {
            "type": "minecraft:item",
            "name": "minecraft:golden_apple"
            }
        ]
        }
    ]
}

Pour les coffres d’igloo, il y a 2 pools. La première permet de faire gagner entre 2 et 8 entrées, la deuxième fera gagner une pomme dorée. On notera que pour chaque entrée il est possible de définir des fonctions. La plus utilisée est la fonction set_count qui permet de définir le nombre d’exemplaires que le joueur peut gagner. Les fonctions peuvent également servir à définir des enchantements.

Enfin, en plus des lancers et des entrées, on peut également définir une condition pour chaque pool.

De nombreuses tables de loot de mobs ont ainsi la condition suivante :

"conditions": [
  {
    "condition": "killed_by_player"
  }
]

Loots du coffre de démarrage

Sur le serveur Mang’Armor, le fonctionnement du coffre de démarrage est différent des autres coffres. Alors que les autres proposent 1 objet avec différentes chances, le coffre de démarrage propose 2 objets avec une chance de 100%, et d’autres objets qui peuvent tous être dans le coffre. Pour configurer le fichier de base je vais utiliser le générateur de loots Minecraft.tools.

Formulaire de création d'une table de loot sur Minecraft.tool
Formulaire de création d’une table de loot sur Minecraft.tools

Pour type nous choisissons Ouvrir un coffre. J’utilise le nom starter car c’est notre coffre de démarrage. Les commandes étant en anglais, je préfère utiliser la même langue pour nommer les loots.

En quantité, nous allons définir 1 pool. J’indique donc 1/1. Les enchantements de chance ne pouvant pas influer sur les résultats des coffres, je laisse les champs bonus à 0/0.

J’ajoute ensuite mon premier objet. Comme indiqué sur le page des coffres, le coffre de démarrage propose du poulet roti et un bouclier dans 100% des cas. Commençons donc par ajouter le poulet rôti. Le poids n’a pas d’importance car il ne servira pas pour cette table de loot. Cochons ensuite nombre afin de préciser une valeur de 64/64. Dans plus d’option, nous allons définir ce loot en loot indépendant. Tous les loots seront en loot indépendant.

On ajoute ensuite le bouclier, en n’oubliant pas de le mettre en loot indépendant. Ainsi, on est certain de recevoir 64 poulets rotis et 1 bouclier dans chaque coffre de démarrage. Inutile de préciser le nombre qui est par défaut à 1.

Ajoutons maintenant les autres loots. L’établi et le fourneau ont une probabilité 75% à ajouter dans la section loot indépendant & condition. Les torches également mais il faut également préciser leur nombre : entre 32 et 64. Ajoutons également le Lingot de fer, avec une probabilité de 50% et un nombre entre 8 et 30. Le coffre a une probabilité de 25% et un nombre entre 1 et 6. L’arc une probabilité de 20% et enfin les Élytres ont une probabilité de 5%.

Les probabilité n’ont pas besoin de faire un total de 100% car elles sont indépendantes pour chaque objet. Ainsi, on a 5% de chance de trouver des Élytres en plus des autres loots.

Il ne reste plus qu’à générer la table de loot et à enregistrer le fichier starter.json dans le dossier data/mangarmor/loot_tables/chests. Si nous n’avions pas mis les loots en loot indépendant mais utilisé les poids, nous aurions pu obtenir plusieurs fois le même objet.

Voici le code de la table de loot :

{
    "pools": [
        {
        "rolls": 1,
        "entries": [
            {
            "type": "item",
            "name": "minecraft:cooked_chicken",
            "weight": 1,
            "functions": [
                {
                "function": "set_count",
                "count": 64
                }
            ]
            }
        ]
        },
        {
        "rolls": 1,
        "entries": [
            {
            "type": "item",
            "name": "minecraft:shield",
            "weight": 1
            }
        ]
        },
        {
        "conditions": [
            {
            "condition": "random_chance",
            "chance": 0.75
            }
        ],
        "rolls": 1,
        "entries": [
            {
            "type": "item",
            "name": "minecraft:crafting_table",
            "weight": 1
            }
        ]
        },
        {
        "conditions": [
            {
            "condition": "random_chance",
            "chance": 0.75
            }
        ],
        "rolls": 1,
        "entries": [
            {
            "type": "item",
            "name": "minecraft:furnace",
            "weight": 1
            }
        ]
        },
        {
        "conditions": [
            {
            "condition": "random_chance",
            "chance": 0.75
            }
        ],
        "rolls": 1,
        "entries": [
            {
            "type": "item",
            "name": "minecraft:torch",
            "weight": 0,
            "functions": [
                {
                "function": "set_count",
                "count": {
                    "min": 32,
                    "max": 64
                }
                }
            ]
            }
        ]
        },
        {
        "conditions": [
            {
            "condition": "random_chance",
            "chance": 0.5
            }
        ],
        "rolls": 1,
        "entries": [
            {
            "type": "item",
            "name": "minecraft:iron_ingot",
            "weight": 1,
            "functions": [
                {
                "function": "set_count",
                "count": {
                    "min": 8,
                    "max": 30
                }
                }
            ]
            }
        ]
        },
        {
        "conditions": [
            {
            "condition": "random_chance",
            "chance": 0.25
            }
        ],
        "rolls": 1,
        "entries": [
            {
            "type": "item",
            "name": "minecraft:chest",
            "weight": 1,
            "functions": [
                {
                "function": "set_count",
                "count": {
                    "min": 1,
                    "max": 6
                }
                }
            ]
            }
        ]
        },
        {
        "conditions": [
            {
            "condition": "random_chance",
            "chance": 0.2
            }
        ],
        "rolls": 1,
        "entries": [
            {
            "type": "item",
            "name": "minecraft:bow",
            "weight": 1
            }
        ]
        },
        {
        "conditions": [
            {
            "condition": "random_chance",
            "chance": 0.05
            }
        ],
        "rolls": 1,
        "entries": [
            {
            "type": "item",
            "name": "minecraft:elytra",
            "weight": 1
            }
        ]
        }
    ]
}

Coffre de démarrage

Afin de simplifier la réception de coffres, nous allons créer une fonction qui aura comme seul but la création du coffre. La commande utilisée est la commande give, suivie du sélecteur @s pour désigner le joueur exécutant la commande, suivi de l’objet (ici une boite de shulker noire) et enfin de la quantité.

Afin de permettre le loot aléatoire, on ajoute un tag sur l’entité du bloc spécifiant la table de loot. Pour ce coffre de démarrage, le loot sera le fichier mangarmor/loot_tables/chests/starter.json.

give @s minecraft:black_shulker_boxBlock[EntityTag:{LootTable:"mangarmor:chests/starter"}] 1

Coffre de bronze

Le coffre bronze a un fonctionnement plus classique. Pour simplifier les statistiques, le total des poids sera égal à 100. Ainsi, un objet avec un poids de 25 aura 25% de chance d’apparaître dans le coffre.

Créons la table de loot bronze. Le premier objet sera l’arc qui a un poids de 30. Par ailleurs, il a des enchantements aléatoires qu’on définira dans le générateur en utilisant l’enchantement naturel avec 15 d’XP. Le joueur aura donc 30% d’obtenir un arc pouvant être enchanté avec un de ces enchantements : Puissance II, Solidité II, Frappe I.

De la même manière l’épée en diamant à un poids de 30 et des enchantements naturels de 15XP. Ajoutons également le lingot de fer avec un poids de 25 et un nombre entre 32 et 64. Les Élytres ont un poids de 10 et un enchantement solidité. Pour cela, au lieu d’ajouter un enchantement naturel, nous ajoutons un enchantement spécifique : solidité. Ajoutons également un livre enchanté avec un poids de 4, et l’enchantement raccommodage, appelé réparation dans le générateur. Enfin, ajoutons 16 diamants avec un poids de 1.

Il ne reste plus qu’à générer la table de loot et à enregistrer le fichier bronze.json dans le dossier data/mangarmor/loot_tables/chests.

{
    "pools": [
        {
        "rolls": 1,
        "entries": [
            {
            "type": "item",
            "name": "minecraft:iron_ingot",
            "weight": 25,
            "functions": [
                {
                "function": "set_count",
                "count": {
                    "min": 32,
                    "max": 64
                }
                }
            ]
            },
            {
            "type": "item",
            "name": "minecraft:diamond",
            "weight": 1,
            "functions": [
                {
                "function": "set_count",
                "count": 16
                }
            ]
            },
            {
            "type": "item",
            "name": "minecraft:bow",
            "weight": 15,
            "functions": [
                {
                "function": "set_nbt",
                "tag": "{Enchantments:[{id:\"minecraft:unbreaking\",lvl:1},{id:\"minecraft:flame\",lvl:1}]}"
                }
            ]
            },
            {
            "type": "item",
            "name": "minecraft:bow",
            "weight": 15,
            "functions": [
                {
                "function": "set_nbt",
                "tag": "{Enchantments:[{id:\"minecraft:unbreaking\",lvl:2},{id:\"minecraft:punch\",lvl:1}]}"
                }
            ]
            },
            {
            "type": "item",
            "name": "minecraft:diamond_sword",
            "weight": 10,
            "functions": [
                {
                "function": "set_nbt",
                "tag": "{Enchantments:[{id:\"minecraft:sharpness\",lvl:2}]}"
                }
            ]
            },
            {
            "type": "item",
            "name": "minecraft:diamond_sword",
            "weight": 10,
            "functions": [
                {
                "function": "set_nbt",
                "tag": "{Enchantments:[{id:\"minecraft:smite\",lvl:2}]}"
                }
            ]
            },
            {
            "type": "item",
            "name": "minecraft:diamond_sword",
            "weight": 10,
            "functions": [
                {
                "function": "set_nbt",
                "tag": "{Enchantments:[{id:\"minecraft:bane_of_arthropods\",lvl:2}]}"
                }
            ]
            },
            {
            "type": "item",
            "name": "minecraft:elytra",
            "weight": 10,
            "functions": [
                {
                "function": "set_nbt",
                "tag": "{Enchantments:[{id:\"minecraft:unbreaking\",lvl:1}]}"
                }
            ]
            },
            {
            "type": "item",
            "name": "minecraft:enchanted_book",
            "weight": 4,
            "functions": [
                {
                "function": "set_nbt",
                "tag": "{Enchantments:[{id:\"minecraft:mending\",lvl:1}]}"
                }
            ]
            }
        ]
        }
    ]
}

Téléchargement

Le datapack de ce tutoriel est disponible au téléchargement sur Dropbox :

Sommaire

Partager

Partager sur facebook
Facebook
Partager sur twitter
Twitter

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.