Торговля

Эта тема охватывает внутриигровые TradeOffer-ы предлагаемые Villager-ами/Merchant-ами.

Merchant

Merchant — это контейнер для TradeOffers. Наиболее распространенным вариантом является Villager. Интерфейс Merchant можно использовать для открытия торговых окон.

TradeOffers можно добавить и удалить из Merchants, используя TradeOfferData.

TradeOffer

Торговое предложение состоит из

  • a primary/first buying ItemStackSnapshot
  • необязательной вторичной покупки ItemStackSnapshot
  • продажи ItemStackSnapshot
  • уже использованных использований
  • максимально доступных использований
  • флаг, указывающий, генерируются ли очки опыта при торговле

TradeOffers могут быть созданы с помощью Builder или TradeOfferGenerator.

TradeOfferBuilder

TradeOfferBuilders в основном используются, если вы хотите динамически создавать TradeOffers на лету.

В следующем блоке кода создается новый TradeOffer, который позволяет Players обменять пять блоков DIRT на три блока GRASS. Это торговое предложение имеет четыре первоначальных использования, после чего Merchant может потребоваться некоторое время, чтобы снова предложить этот TradeOffer.

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

TradeOfferListMutator

A TradeOfferListMutator is an interface that is invoked during Villager level ups. It can be used to replace existing TradeOffers (e.g. higher tier) and add new TradeOffers. Its simplest and only API provided variant is the TradeOfferGenerator. The different TradeOfferListMutators for each level and Career can be configured in the VillagerRegistry.

Примечание

Список TradeOffer в Villagers может генерироваться лениво, когда торговый инвентарь открывается в первый раз.

TradeOfferGenerator

TradeOfferGenerators — это простые шаблоны для новых TradeOffers. Они представляют собой вариант TradeOfferListMutator, который будет добавлять только новые записи и не будет изменять или удалять какие-либо существующие TradeOffers у этого жителя.

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();

Этот TradeOfferGenerator будет произвольно генерировать TradeOffers, которые будут

  • покупать 5-8 DIRT
  • продавать 5 GRASS
  • иметь 2-4 оставшихся первоначальных использований
  • 5 максимальных использований

Вероятность того, что сгенерированный TradeOffer предоставит опыт, составляет 50%.

Примечание

Вы можете использовать ItemStackGenerators, чтобы динамически применять зачарования или другие пользовательские данные для покупки и продажи предметов.

VillagerRegistry

The VillagerRegistry can be obtained from the GameRegistry. It will be used to configure the TradeOfferListMutator that will be applied on a Villager’s level-up.

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);

Самый низкий уровень, определяемый мутатором, это 1. Это эквивалентно вновь созданному Villager.

Примечание

Изменения в VillagerRegistry будут потеряны при перезапуске сервера и не окажут никакого влияния на TradeOffers от Villagers, которые повысили уровень в прошлом.