Торговля
Предупреждение
Эти документы были написаны для SpongeAPI 7 и, вероятно, устаревшие. Если вы чувствуете, что вы можете помочь обновить их, пожалуйста, отправьте PR!
Эта тема охватывает внутриигровые 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, которые повысили уровень в прошлом.