Торговля

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

Merchant

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

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

TradeOffer

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

  • основной/первичной покупки 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 — это интерфейс, который вызывается во время увеличения уровня Villager. Он может использоваться для замены существующих `` TradeOffers`` (ex higher tier) и добавления новых TradeOffers. Его упрощенный и единственный API-вариант это TradeOfferGenerator. Различные TradeOfferListMutators для каждого уровня и Career могут быть сконфигурированы в 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

VillagerRegistry можно получить из GameRegistry. Он будет использоваться для настройки TradeOfferListMutator, который будет применяться на повышении уровня 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);

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

Примечание

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