Personnaliser les marchands ambulants

Après avoir vu comment créer des vendeurs avec des offres personnalisées, voyons comment modifier les offres des marchands ambulants.

Avant-propos

Le 30 septembre, Bernie indiquait sous un article :

Aujourd’hui, nous allons donc poursuivre la personnalisation des offres des villageois avec le marchand ambulant. Pour bien comprendre ce qu’il va être dit, il est nécessaire d’avoir lu les articles sur les vendeurs villageois et sur l’aléatoire.

Création du datapack

Ça devient une habitude, je créé un nouveau datapack avec une fonction init que j’enregistre dans le tag de fonction minecraft:init. Le fichier data/minecraft/tags/functions/load.json contient donc :

				
					{
	"values": [
		"mangarmor:trades/init"
	]
}
				
			

Le fichier contient un simple message pour confirmer le chargement du datapack et l’appel de la fonction loop qui sera créée juste après :

				
					# data/mangarmor/functions/trades/init.mcfunction
tellraw @a ["",{"text":"Marchand ambulant :","color":"gold"}," datapack chargé"]
function mangarmor:trades/loop
				
			

Contrairement à d’habitude, je n’utilise pas le tag de fonction tick mais j’utilise à la place la commande schedule ajoutée dans Minecraft 1.14. Elle permet de programmer l’exécution d’une function. Pour le moment le fichier ne contient qu’une ligne permettant de relancer la fonction à chaque tick. Pour de meilleures performances, le temps peut être modifié. On pourra par exemple indiquer 1s pour une exécution à chaque seconde IRL (20 ticks) ou 1d pour une exécution chaque jour de jeu (20 minutes IRL).

				
					# data/mangarmor/functions/trades/loop.mcfunction
schedule function mangarmor:trades/loop 1t
				
			

Offres

Pour ce tutoriel, je vais reprendre les offres utilisées pour le vendeur villageois à savoir 5 émeraudes contre une pêche ou une pomme. Les modèles sont récupérés sur le site Custom heads. Pour rappel, voici le json de chacune de ces offres :

				
					{buy:{id:emerald,Count:5}, sell:{id:player_head,Count:1,tag:{display:{Name:"{\"text\":\"Pêche\"}"}, SkullOwner:{Id:[I;436418374,257114978,-1779699401,1303019964], Properties:{textures:[{Value:"eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNzg0MDRjZmU3YWQxMTY2ODFiNDg1MGI4OTk5OGFjZjAzY2ViZTQ2ODVjYzc2NjM4OTMwNjUyZGM0YWZjMzc2MiJ9fX0="}]}}}},rewardExp:0b,maxUses:9999999}
				
			
				
					{buy:{id:emerald,Count:5}, sell:{id:player_head,Count:1,tag:{display:{Name:"{\"text\":\"Pomme\"}"}, SkullOwner:{Id:[I;1773962895,-939242600,-1676573066,1848849180], Properties:{textures:[{Value:"eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvOTIxMTI3ZDIyNjc1YzVjNzY5YTBjMDhiNTcyMDE4ZDI5OWM4MzA0NmY4ZTFmOTQzZWQ5ZDUxYmUwM2IwNyJ9fX0="}]}}}},rewardExp:0b,maxUses:9999999}
				
			

Dans l’article sur le vendeur villageois, j’utilisais une commande pour faire apparaître le villageois. Pour le marchand ambulant, le système sera différent car nous souhaitons personnaliser les offres des marchands se générant naturellement. Pour cela, nous allons cibler tous les marchands, leur ajouter une offre et une étiquette pour ne plus les cibler après modification.

Je créé ensuite la fonction add_trade qui contiendra toutes les offres pouvant être ajoutées au marchand ambulant. Pour chaque offre, on ajoute une commande qui s’exécutera si la valeur de l’objectif trades correspond (à 1 pour le première offre, 2 pour la deuxième, …).

				
					execute if score @s trades matches 1 run data modify entity @s Offers.Recipes prepend value {}
				
			

La commande data s’occupera de modifier l’entité (le marchand ambulant) pour ajouter une offre dans sa liste (Offers.Recipes).

				
					# data/mangarmor/functions/trades/add_trade.mcfunction
execute if score random trades matches 1 run data modify entity @s Offers.Recipes prepend value {buy:{id:emerald,Count:5}, sell:{id:player_head,Count:1,tag:{display:{Name:"{\"text\":\"Pêche\"}"}, SkullOwner:{Id:[I;436418374,257114978,-1779699401,1303019964], Properties:{textures:[{Value:"eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNzg0MDRjZmU3YWQxMTY2ODFiNDg1MGI4OTk5OGFjZjAzY2ViZTQ2ODVjYzc2NjM4OTMwNjUyZGM0YWZjMzc2MiJ9fX0="}]}}}},rewardExp:0b,maxUses:9999999}
execute if score random trades matches 2 run data modify entity @s Offers.Recipes prepend value {buy:{id:emerald,Count:5}, sell:{id:player_head,Count:1,tag:{display:{Name:"{\"text\":\"Pomme\"}"}, SkullOwner:{Id:[I;1773962895,-939242600,-1676573066,1848849180], Properties:{textures:[{Value:"eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvOTIxMTI3ZDIyNjc1YzVjNzY5YTBjMDhiNTcyMDE4ZDI5OWM4MzA0NmY4ZTFmOTQzZWQ5ZDUxYmUwM2IwNyJ9fX0="}]}}}},rewardExp:0b,maxUses:9999999}
				
			

Aléatoire

Comme vu dans l’article du mois dernier, il existe de nombreuses manières d’ajouter de l’aléatoire dans Minecraft. Pour faire au plus simple, je vais utiliser une variable qui sera incrémentée. Chaque vendeur se verra ainsi ajouté une recette dans un ordre établi : le premier à apparaître aura la première recette, le deuxième la deuxième, …

Pour cela, je commence par modifier la fonction init. J’y déclare l’objectif trades en dummy, qui contiendra les variables random et max. La variable random servira à enregistrer l’offre à ajouter et max doit être le nombre d’offres définies dans la fonction add_trade (dans cet exemple 2).

				
					# data/mangarmor/functions/trades/init.mcfunction
# Création des variables
scoreboard objectives add trades dummy "Marchand ambulant"
scoreboard players set random trades 1

# Indiquer ici le nombre d'offres personnalisées
scoreboard players set max trades 2

# Message pour confirmer le chargement du datapack
tellraw @a ["",{"text":"Marchand ambulant :","color":"gold"}," datapack chargé"]

# Première exécution de la fonction loop
function mangarmor:trades/loop
				
			

J’ajoute ensuite deux lignes à la fin de la fonction add_trade : une qui fixera la variable random à 0 si elle atteint la valeur max, et l’incrémentation de la variable random.

				
					# Ajout d'une offre en fonction de la valeur trades
execute if score random trades matches 1 run data modify entity @s Offers.Recipes prepend value {buy:{id:emerald,Count:5}, sell:{id:player_head,Count:1,tag:{display:{Name:"{\"text\":\"Pêche\"}"}, SkullOwner:{Id:[I;436418374,257114978,-1779699401,1303019964], Properties:{textures:[{Value:"eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvNzg0MDRjZmU3YWQxMTY2ODFiNDg1MGI4OTk5OGFjZjAzY2ViZTQ2ODVjYzc2NjM4OTMwNjUyZGM0YWZjMzc2MiJ9fX0="}]}}}},rewardExp:0b,maxUses:9999999}
execute if score random trades matches 2 run data modify entity @s Offers.Recipes prepend value {buy:{id:emerald,Count:5}, sell:{id:player_head,Count:1,tag:{display:{Name:"{\"text\":\"Pomme\"}"}, SkullOwner:{Id:[I;1773962895,-939242600,-1676573066,1848849180], Properties:{textures:[{Value:"eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvOTIxMTI3ZDIyNjc1YzVjNzY5YTBjMDhiNTcyMDE4ZDI5OWM4MzA0NmY4ZTFmOTQzZWQ5ZDUxYmUwM2IwNyJ9fX0="}]}}}},rewardExp:0b,maxUses:9999999}

# Ajout d'un tag pour éviter de cibler une nouvelle fois le marchand ambulant
tag @s add trade_added

# Incrémentation de la variable random
execute if score random trades >= max trades run scoreboard players set random trades 0
scoreboard players add random trades 1
				
			

Modification des marchands

Maintenant tout est prêt pour le sujet principal : ajouter une offre personnalisée à un marchand. J’ajoute à la fonction loop l’appel de la fonction add_trade sur tous les marchands ambulants sans l’étiquette trade_added. Cette étiquette est ajoutée par la fonction add_trade afin d’éviter d’ajouter des offres à tous les marchands.

				
					# Appel de la fonction à chaque tick
schedule function mangarmor:trades/loop 1t

# Modification des marchands ambulants
execute as @e[type=minecraft:wandering_trader,tag=!trade_added] run function mangarmor:trades/add_trade
				
			

À noter que l’offre personnalisée sera la première proposée par le marchand ambulant. Pour l’ajouter en dernier, il faudra modifier le prepend en append dans la fonction add_trade (en remplaçant … par l’offre) :

				
					execute if score random trades matches 1 run data modify entity @s Offers.Recipes append value {...}
				
			

Enfin, il est possible de modifier toutes les offres en utilisant set. Ainsi, on peut supprimer toutes les offres avec la commande suivante puis utiliser plusieurs appels de notre fonction add_trade pour ajouter des offres personnalisées. Dans ce cas, le mieux est d’utiliser le système aléatoire basé sur une particule.

				
					data modify entity @s Offers.Recipes set value {}
				
			

Pour aller plus loin

Voici d’autres articles qui pourraient t’intéresser :

Nouveautés

Bonne année 2021

Il est temps de faire le bilan de 2020 et présenter les projets pour cette nouvelle année.

Recette personnalisée d'étiquette
Minecraft

Recettes personnalisées

Que ce soit pour réintégrer des recettes disparues, ou en créer de nouvelles, voyons comment mettre en place des recettes personnalisées.

Minecraft

Boutique : monnaie virtuelle

Les vendeurs de Minecraft utilisent l’émeraude comme monnaie du jeu. Nous allons voir dans cet article comment utiliser une monnaie plus sécurisée car dématérialisée.

Laisser un commentaire

Votre adresse e-mail 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.

Sommaire

Partager

Partager sur facebook
Facebook
Partager sur twitter
Twitter