Торговля
Эта тема охватывает внутриигровые 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
, которые повысили уровень в прошлом.