下面列出了怎么用org.bukkit.inventory.MerchantRecipe的API类实例代码及写法,或者点击链接到github查看源代码。
@Override
public boolean openTradeWindow(String title, List<ItemStack[]> recipes, Player player) {
// create empty merchant:
Merchant merchant = Bukkit.createMerchant(title);
// create list of merchant recipes:
List<MerchantRecipe> merchantRecipes = new ArrayList<MerchantRecipe>();
for (ItemStack[] recipe : recipes) {
// skip invalid recipes:
if (recipe == null || recipe.length != 3 || Utils.isEmpty(recipe[0]) || Utils.isEmpty(recipe[2])) {
continue;
}
// create and add merchant recipe:
merchantRecipes.add(this.createMerchantRecipe(recipe[0], recipe[1], recipe[2]));
}
// set merchant's recipes:
merchant.setRecipes(merchantRecipes);
// increase 'talked-to-villager' statistic:
player.incrementStatistic(Statistic.TALKED_TO_VILLAGER);
// open merchant:
return player.openMerchant(merchant, true) != null;
}
@Override
public ItemStack[] getUsedTradingRecipe(MerchantInventory merchantInventory) {
MerchantRecipe merchantRecipe = merchantInventory.getSelectedRecipe();
List<ItemStack> ingredients = merchantRecipe.getIngredients();
ItemStack[] recipe = new ItemStack[3];
recipe[0] = ingredients.get(0);
recipe[1] = null;
if (ingredients.size() > 1) {
ItemStack buyItem2 = ingredients.get(1);
if (!Utils.isEmpty(buyItem2)) {
recipe[1] = buyItem2;
}
}
recipe[2] = merchantRecipe.getResult();
return recipe;
}
@Override
public boolean openTradeWindow(String title, List<ItemStack[]> recipes, Player player) {
// create empty merchant:
Merchant merchant = Bukkit.createMerchant(title);
// create list of merchant recipes:
List<MerchantRecipe> merchantRecipes = new ArrayList<MerchantRecipe>();
for (ItemStack[] recipe : recipes) {
// skip invalid recipes:
if (recipe == null || recipe.length != 3 || Utils.isEmpty(recipe[0]) || Utils.isEmpty(recipe[2])) {
continue;
}
// create and add merchant recipe:
merchantRecipes.add(this.createMerchantRecipe(recipe[0], recipe[1], recipe[2]));
}
// set merchant's recipes:
merchant.setRecipes(merchantRecipes);
// increase 'talked-to-villager' statistic:
player.incrementStatistic(Statistic.TALKED_TO_VILLAGER);
// open merchant:
return player.openMerchant(merchant, true) != null;
}
@Override
public ItemStack[] getUsedTradingRecipe(MerchantInventory merchantInventory) {
MerchantRecipe merchantRecipe = merchantInventory.getSelectedRecipe();
List<ItemStack> ingredients = merchantRecipe.getIngredients();
ItemStack[] recipe = new ItemStack[3];
recipe[0] = ingredients.get(0);
recipe[1] = null;
if (ingredients.size() > 1) {
ItemStack buyItem2 = ingredients.get(1);
if (!Utils.isEmpty(buyItem2)) {
recipe[1] = buyItem2;
}
}
recipe[2] = merchantRecipe.getResult();
return recipe;
}
@Override
public List<MerchantRecipe> getRecipes() {
return Collections.unmodifiableList(Lists.transform(merchant.getRecipes(null), new com.google.common.base.Function<net.minecraft.village.MerchantRecipe, MerchantRecipe>() {
@Override
public MerchantRecipe apply(net.minecraft.village.MerchantRecipe recipe) {
return recipe.asBukkit();
}
}));
}
@Override
public void setRecipes(List<MerchantRecipe> recipes) {
MerchantRecipeList recipesList = merchant.getRecipes(null);
recipesList.clear();
for (MerchantRecipe recipe : recipes) {
recipesList.add(CraftMerchantRecipe.fromBukkit(recipe).toMinecraft());
}
}
public CraftMerchantRecipe(ItemStack result, int uses, int maxUses, boolean experienceReward) {
super(result, uses, maxUses, experienceReward);
this.handle = new net.minecraft.village.MerchantRecipe(
net.minecraft.item.ItemStack.EMPTY,
net.minecraft.item.ItemStack.EMPTY,
CraftItemStack.asNMSCopy(result),
uses,
maxUses,
this
);
}
public net.minecraft.village.MerchantRecipe toMinecraft() {
List<ItemStack> ingredients = getIngredients();
Preconditions.checkState(!ingredients.isEmpty(), "No offered ingredients");
handle.itemToBuy = CraftItemStack.asNMSCopy(ingredients.get(0));
if (ingredients.size() > 1) {
handle.secondItemToBuy = CraftItemStack.asNMSCopy(ingredients.get(1));
}
return handle;
}
public static CraftMerchantRecipe fromBukkit(MerchantRecipe recipe) {
if (recipe instanceof CraftMerchantRecipe) {
return (CraftMerchantRecipe) recipe;
} else {
CraftMerchantRecipe craft = new CraftMerchantRecipe(recipe.getResult(), recipe.getUses(), recipe.getMaxUses(), recipe.hasExperienceReward());
craft.setIngredients(recipe.getIngredients());
return craft;
}
}
private MerchantRecipe createMerchantRecipe(ItemStack buyItem1, ItemStack buyItem2, ItemStack sellingItem) {
assert !Utils.isEmpty(sellingItem) && !Utils.isEmpty(buyItem1);
MerchantRecipe recipe = new MerchantRecipe(sellingItem, 10000); // no max-uses limit
recipe.setExperienceReward(false); // no experience rewards
recipe.addIngredient(buyItem1);
if (!Utils.isEmpty(buyItem2)) {
recipe.addIngredient(buyItem2);
}
return recipe;
}
private MerchantRecipe createMerchantRecipe(ItemStack buyItem1, ItemStack buyItem2, ItemStack sellingItem) {
assert !Utils.isEmpty(sellingItem) && !Utils.isEmpty(buyItem1);
MerchantRecipe recipe = new MerchantRecipe(sellingItem, 10000); // no max-uses limit
recipe.setExperienceReward(false); // no experience rewards
recipe.addIngredient(buyItem1);
if (!Utils.isEmpty(buyItem2)) {
recipe.addIngredient(buyItem2);
}
return recipe;
}
public VillagerAcquireTradeEvent(Villager what, MerchantRecipe recipe) {
super(what);
this.recipe = recipe;
}
public VillagerReplenishTradeEvent(Villager what, MerchantRecipe recipe, int bonus) {
super(what);
this.recipe = recipe;
this.bonus = bonus;
}
@Override
public List<MerchantRecipe> getRecipes() {
return getMerchant().getRecipes();
}
@Override
public void setRecipes(List<MerchantRecipe> recipes) {
this.getMerchant().setRecipes(recipes);
}
@Override
public MerchantRecipe getRecipe(int i) {
return getMerchant().getRecipe(i);
}
@Override
public void setRecipe(int i, MerchantRecipe merchantRecipe) {
getMerchant().setRecipe(i, merchantRecipe);
}
@Override
public MerchantRecipe getSelectedRecipe() {
return getInventory().getCurrentRecipe().asBukkit();
}
@Override
public MerchantRecipe getRecipe(int i) {
return merchant.getRecipes(null).get(i).asBukkit();
}
@Override
public void setRecipe(int i, MerchantRecipe merchantRecipe) {
merchant.getRecipes(null).set(i, CraftMerchantRecipe.fromBukkit(merchantRecipe).toMinecraft());
}
public CraftMerchantRecipe(net.minecraft.village.MerchantRecipe merchantRecipe) {
super(CraftItemStack.asBukkitCopy(merchantRecipe.itemToSell), 0);
this.handle = merchantRecipe;
addIngredient(CraftItemStack.asBukkitCopy(merchantRecipe.itemToBuy));
addIngredient(CraftItemStack.asBukkitCopy(merchantRecipe.secondItemToBuy));
}
public void openTrading() {
// As task because of inventory issues
new BukkitRunnable() {
@SuppressWarnings("deprecation")
@Override
public void run() {
try {
EntityVillager entityVillager = VillagerItemShop.this.createVillager();
CraftVillager craftVillager = (CraftVillager) entityVillager.getBukkitEntity();
EntityHuman entityHuman = VillagerItemShop.this.getEntityHuman();
// set location
List<MerchantRecipe> recipeList = new ArrayList<MerchantRecipe>();
for (VillagerTrade trade : VillagerItemShop.this.category
.getFilteredOffers()) {
ItemStack reward = trade.getRewardItem();
Method colorable = Utils.getColorableMethod(reward.getType());
if (Utils.isColorable(reward)) {
reward
.setDurability(game.getPlayerTeam(player).getColor().getDyeColor().getWoolData());
} else if (colorable != null) {
ItemMeta meta = reward.getItemMeta();
colorable.setAccessible(true);
colorable.invoke(meta, new Object[]{VillagerItemShop.this.game
.getPlayerTeam(VillagerItemShop.this.player).getColor().getColor()});
reward.setItemMeta(meta);
}
if (!(trade.getHandle()
.getInstance() instanceof net.minecraft.server.v1_9_R2.MerchantRecipe)) {
continue;
}
MerchantRecipe recipe = new MerchantRecipe(trade.getRewardItem(), 1024);
recipe.addIngredient(trade.getItem1());
if (trade.getItem2() != null) {
recipe.addIngredient(trade.getItem2());
}
recipeList.add(recipe);
}
craftVillager.setRecipes(recipeList);
craftVillager.setRiches(0);
entityVillager.setTradingPlayer(entityHuman);
((CraftPlayer) player).getHandle().openTrade(entityVillager);
((CraftPlayer) player).getHandle().b(StatisticList.F);
} catch (Exception ex) {
BedwarsRel.getInstance().getBugsnag().notify(ex);
ex.printStackTrace();
}
}
}.runTask(BedwarsRel.getInstance());
}
public void openTrading() {
// As task because of inventory issues
new BukkitRunnable() {
@SuppressWarnings("deprecation")
@Override
public void run() {
try {
EntityVillager entityVillager = VillagerItemShop.this.createVillager();
CraftVillager craftVillager = (CraftVillager) entityVillager.getBukkitEntity();
EntityHuman entityHuman = VillagerItemShop.this.getEntityHuman();
// set location
List<MerchantRecipe> recipeList = new ArrayList<MerchantRecipe>();
for (VillagerTrade trade : VillagerItemShop.this.category
.getFilteredOffers()) {
ItemStack reward = trade.getRewardItem();
Method colorable = Utils.getColorableMethod(reward.getType());
if (Utils.isColorable(reward)) {
reward
.setDurability(game.getPlayerTeam(player).getColor().getDyeColor().getWoolData());
} else if (colorable != null) {
ItemMeta meta = reward.getItemMeta();
colorable.setAccessible(true);
colorable.invoke(meta, new Object[]{VillagerItemShop.this.game
.getPlayerTeam(VillagerItemShop.this.player).getColor().getColor()});
reward.setItemMeta(meta);
}
if (!(trade.getHandle()
.getInstance() instanceof net.minecraft.server.v1_9_R1.MerchantRecipe)) {
continue;
}
MerchantRecipe recipe = new MerchantRecipe(trade.getRewardItem(), 1024);
recipe.addIngredient(trade.getItem1());
if (trade.getItem2() != null) {
recipe.addIngredient(trade.getItem2());
}
recipeList.add(recipe);
}
craftVillager.setRecipes(recipeList);
craftVillager.setRiches(0);
entityVillager.setTradingPlayer(entityHuman);
((CraftPlayer) player).getHandle().openTrade(entityVillager);
((CraftPlayer) player).getHandle().b(StatisticList.F);
} catch (Exception ex) {
BedwarsRel.getInstance().getBugsnag().notify(ex);
ex.printStackTrace();
}
}
}.runTask(BedwarsRel.getInstance());
}
public void openTrading() {
// As task because of inventory issues
new BukkitRunnable() {
@SuppressWarnings("deprecation")
@Override
public void run() {
try {
EntityVillager entityVillager = VillagerItemShop.this.createVillager();
CraftVillager craftVillager = (CraftVillager) entityVillager.getBukkitEntity();
EntityHuman entityHuman = VillagerItemShop.this.getEntityHuman();
// set location
List<MerchantRecipe> recipeList = new ArrayList<MerchantRecipe>();
for (VillagerTrade trade : VillagerItemShop.this.category
.getFilteredOffers()) {
ItemStack reward = trade.getRewardItem();
Method colorable = Utils.getColorableMethod(reward.getType());
if (Utils.isColorable(reward)) {
reward
.setDurability(game.getPlayerTeam(player).getColor().getDyeColor().getWoolData());
} else if (colorable != null) {
ItemMeta meta = reward.getItemMeta();
colorable.setAccessible(true);
colorable.invoke(meta, new Object[]{VillagerItemShop.this.game
.getPlayerTeam(VillagerItemShop.this.player).getColor().getColor()});
reward.setItemMeta(meta);
}
if (!(trade.getHandle()
.getInstance() instanceof net.minecraft.server.v1_11_R1.MerchantRecipe)) {
continue;
}
MerchantRecipe recipe = new MerchantRecipe(trade.getRewardItem(), 1024);
recipe.addIngredient(trade.getItem1());
if (trade.getItem2() != null) {
recipe.addIngredient(trade.getItem2());
} else {
recipe.addIngredient(new ItemStack(Material.AIR));
}
recipe.setUses(0);
recipe.setExperienceReward(false);
recipeList.add(recipe);
}
craftVillager.setRecipes(recipeList);
craftVillager.setRiches(0);
entityVillager.setTradingPlayer(entityHuman);
((CraftPlayer) player).getHandle().openTrade(entityVillager);
} catch (Exception ex) {
BedwarsRel.getInstance().getBugsnag().notify(ex);
ex.printStackTrace();
}
}
}.runTask(BedwarsRel.getInstance());
}
public void openTrading() {
// As task because of inventory issues
new BukkitRunnable() {
@SuppressWarnings("deprecation")
@Override
public void run() {
try {
EntityVillager entityVillager = VillagerItemShop.this.createVillager();
CraftVillager craftVillager = (CraftVillager) entityVillager.getBukkitEntity();
EntityHuman entityHuman = VillagerItemShop.this.getEntityHuman();
// set location
List<MerchantRecipe> recipeList = new ArrayList<MerchantRecipe>();
for (VillagerTrade trade : VillagerItemShop.this.category
.getFilteredOffers()) {
ItemStack reward = trade.getRewardItem();
Method colorable = Utils.getColorableMethod(reward.getType());
if (Utils.isColorable(reward)) {
reward
.setDurability(game.getPlayerTeam(player).getColor().getDyeColor().getWoolData());
} else if (colorable != null) {
ItemMeta meta = reward.getItemMeta();
colorable.setAccessible(true);
colorable.invoke(meta, new Object[]{VillagerItemShop.this.game
.getPlayerTeam(VillagerItemShop.this.player).getColor().getColor()});
reward.setItemMeta(meta);
}
if (!(trade.getHandle()
.getInstance() instanceof net.minecraft.server.v1_12_R1.MerchantRecipe)) {
continue;
}
MerchantRecipe recipe = new MerchantRecipe(trade.getRewardItem(), 1024);
recipe.addIngredient(trade.getItem1());
if (trade.getItem2() != null) {
recipe.addIngredient(trade.getItem2());
} else {
recipe.addIngredient(new ItemStack(Material.AIR));
}
recipe.setUses(0);
recipe.setExperienceReward(false);
recipeList.add(recipe);
}
craftVillager.setRecipes(recipeList);
craftVillager.setRiches(0);
entityVillager.setTradingPlayer(entityHuman);
((CraftPlayer) player).getHandle().openTrade(entityVillager);
} catch (Exception ex) {
BedwarsRel.getInstance().getBugsnag().notify(ex);
ex.printStackTrace();
}
}
}.runTask(BedwarsRel.getInstance());
}
public void openTrading() {
// As task because of inventory issues
new BukkitRunnable() {
@SuppressWarnings("deprecation")
@Override
public void run() {
try {
EntityVillager entityVillager = VillagerItemShop.this.createVillager();
CraftVillager craftVillager = (CraftVillager) entityVillager.getBukkitEntity();
EntityHuman entityHuman = VillagerItemShop.this.getEntityHuman();
// set location
List<MerchantRecipe> recipeList = new ArrayList<MerchantRecipe>();
for (VillagerTrade trade : VillagerItemShop.this.category
.getFilteredOffers()) {
ItemStack reward = trade.getRewardItem();
Method colorable = Utils.getColorableMethod(reward.getType());
if (Utils.isColorable(reward)) {
reward
.setDurability(game.getPlayerTeam(player).getColor().getDyeColor().getWoolData());
} else if (colorable != null) {
ItemMeta meta = reward.getItemMeta();
colorable.setAccessible(true);
colorable.invoke(meta, new Object[]{VillagerItemShop.this.game
.getPlayerTeam(VillagerItemShop.this.player).getColor().getColor()});
reward.setItemMeta(meta);
}
if (!(trade.getHandle()
.getInstance() instanceof net.minecraft.server.v1_10_R1.MerchantRecipe)) {
continue;
}
MerchantRecipe recipe = new MerchantRecipe(trade.getRewardItem(), 1024);
recipe.addIngredient(trade.getItem1());
if (trade.getItem2() != null) {
recipe.addIngredient(trade.getItem2());
}
recipeList.add(recipe);
}
craftVillager.setRecipes(recipeList);
craftVillager.setRiches(0);
entityVillager.setTradingPlayer(entityHuman);
((CraftPlayer) player).getHandle().openTrade(entityVillager);
((CraftPlayer) player).getHandle().b(StatisticList.F);
} catch (Exception ex) {
BedwarsRel.getInstance().getBugsnag().notify(ex);
ex.printStackTrace();
}
}
}.runTask(BedwarsRel.getInstance());
}
/**
* Get the recipe to be acquired.
*
* @return the new recipe
*/
public MerchantRecipe getRecipe() {
return recipe;
}
/**
* Set the recipe to be acquired.
*
* @param recipe the new recipe
*/
public void setRecipe(MerchantRecipe recipe) {
this.recipe = recipe;
}
/**
* Get the recipe to replenish.
*
* @return the replenished recipe
*/
public MerchantRecipe getRecipe() {
return recipe;
}
/**
* Set the recipe to replenish.
*
* @param recipe the replenished recipe
*/
public void setRecipe(MerchantRecipe recipe) {
this.recipe = recipe;
}