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