Trade-Offers

Ce sujet couvre les TradeOffers offerts par les Villagers/Merchants en jeu.

Marchand

Un Merchant est un conteneur pour les TradeOffers. Sa variante la plus commune est le Villager. L’interface Merchant peut être utilisée pour ouvrir des fenêtres d’échange.

Les TradeOffers peuvent être ajoutées et supprimées des Merchants en utilisant TradeOfferData.

Offre d’Échange

Une offre d’échange consiste en

  • un primaire/premier ItemStackSnapshot d’achat

  • un secondaire ItemStackSnapshot d’achat optionnel

  • un ItemStackSnapshot de vente

  • nombre d’utilisations déjà utilisées

  • nombre d’utilisations maximales disponibles

  • un booléen pour indiquer si les orbes d’expérience doivent apparaître lors de l’échange

Les TradeOffers peuvent être créées en utilisant un Builder ou un TradeOfferGenerator.

TradeOfferBuilders

Les TradeOfferBuilders sont principalement utilisés si vous voulez créer des TradeOffers dynamiquement.

Le bloc de code suivant construit une nouvelle TradeOffer qui permet aux Players d’échanger cinq blocs de DIRT contre trois blocs de GRASS. Cette offre d’échange possède quatre utilisations initiales, après ça le Merchant peut avoir besoin d’un peu de temps pour offrir cette TradeOffer encore une fois.

TradeOffer offer = TradeOffer.builder()
    .firstBuyingItem(ItemStack.of(ItemTypes.DIRT, 5))
    .sellingItem(ItemStack.of(ItemTypes.GRASS, 3))
    .uses(0)
    .maxUses(4)
    .canGrantExperience(false)
    .build();

TradeOfferListMutator

Un TradeOfferListMutator est une interface qui est invoquée lors de la montée de niveau d’un Villager. Il peut être utilisé pour remplacer des TradeOffers existantes (ex : de niveau supérieur) et ajouter de nouvelles TradeOffers. Sa seule et plus simple variante fournie par l’API est le TradeOfferGenerator. Les différents TradeOfferListMutators pour chaque niveau et Career peuvent être configurés dans le VillagerRegistry.

Note

La liste des TradeOffer dans les Villagers peut être générée de manière paresseuse lorsque l’inventaire d’échange est ouvert pour la première fois.

TradeOfferGenerator

Les TradeOfferGenerators sont des modèles simples pour les nouvelles TradeOffers. Il s’agit d’une variante du TradeOfferListMutator qui va seulement ajouter de nouvelles entrées et ne pas modifier ou supprimer de TradeOffers existantes sur ce villageois.

TradeOfferGenerator tradeOfferGenerator = TradeOfferGenerator.builder()
        .setPrimaryItemGenerator(random -> ItemStack.of(ItemTypes.DIRT, random.nextInt(3) + 5))
        .setSellingGenerator(random -> ItemStack.of(ItemTypes.GRASS, 5))
        .startingUses(VariableAmount.baseWithVariance(2, 1))
        .maxUses(VariableAmount.fixed(5))
        .experienceChance(0.5)
        .build();

Ce TradeOfferGenerator va générer aléatoirement des TradeOffers qui vont

  • acheter 5-8 DIRT

  • vendre 5 GRASS

  • avoir 2-4 utilisations initiales

  • 5 utilisations maximales

La chance que la TradeOffer générée donnera de l’expérience est de 50%.

Note

Vous pouvez utiliser les ItemStackGenerators pour appliquer dynamiquement des enchantements ou d’autres données personnalisées aux items d’achat et de vente.

VillagerRegistry

Le VillagerRegistry peut être obtenu depuis le GameRegistry. Il servira à configurer le TradeOfferListMutator qui sera appliqué lors de la montée de niveau d’un Villager.

VillagerRegistry villagerRegistry = this.game.getRegistry().getVillagerRegistry();
List<TradeOfferListMutator> generators = new ArrayList<>(villagerRegistry.getMutatorsForCareer(Careers.FARMER, 1));
generators.addAll(additionalFarmerLevel1TradeOffers());
villagerRegistry.setMutators(Careers.FARMER, 1, generators);

Le mutateur de montée de niveau spécifiable le plus bas est le niveau 1. C’est l’équivalent d’un Villager qui vient d’apparaître.

Note

Les changements au VillagerRegistry seront perdus lors du redémarrage du serveur et n’auront pas d’impact sur les TradeOffers des Villagers qui sont montés de niveau dans le passé.