本帖最后由 a390807154 于 2017-5-20 18:42 编辑

插件控制合成与取消合成事件
怎么说呢,这是个并没有卵用的教程
目地: 用插件添加新的合成 并且限制合成材料必须是用特殊数据值的
                                                                     因为Bukkit的合成只检测物品ID不检测物品的数据值
本教程说明: 类  包  方法

添加合成:
  方法 Bukkit.addRecipe(Recipe) 可以将一个Recipe进行注册是玩家能在服务器中合成
  注意 这个注册在插件被卸载的时候不会被注销 必须手动注销
  Recipe有3个子类 它们位于 org.bukkit.inventory 下 分别是: FurnaceRecipe   熔炉合成
                                                                                      ShapedRecipe    有型合成
                                                                                      ShapelessRecipe 无形合成
FurnaceRecipe : 通过查询API可知,熔炉的合成在构建的时候使用参数来设定目标物品  ←不是本教程重点ShapedRecipe : 在构建的时候通过参数ItemStack设置合成结果
ShapelessRecipe : 在构建的时候通过参数ItemStack设置合成结果


ShapedRecipeShapelessRecipe 的区别:
ShapelessRecip 只需要通过 .addIngredient() 来设置原料 无需设置形状
ShapedRecipe 必须通过 .shape(String[] shape) 来设置形状
例子:
  1. ShapedRecipe sr = new ShapedRecipe(item);
  2.         sr.shape(new String[]{
  3.                     "A C",
  4.                     "CBA",
  5.                     "A C"
  6.                 });
复制代码
那么 这个合成就必须按照这个形状来合成 不需要物品的地方使用空格

在指定形状后还需要指定每个字符代表的物品 空格不用指定
通过 .setIngredient(char key, Material ingredient) 来设置每个字符所代表的物品 因为这个方法不能使用 ItemStack 所以原料是无数据值的
例子:
  1. sr.setIngredient('A', Material.PAPER);
  2. sr.setIngredient('B', Material.VINE);
  3. sr.setIngredient('C', Material.BROWN_MUSHROOM);
复制代码
最后将这个合成进行注册就可以使用了
getServer().addRecipe(sr);

无形合成例子:
  1. ShapelessRecipe sr = new ShapelessRecipe(item);
  2.             sr.addIngredient(9, Material.VINE);
复制代码
就是这么简单 上面是9个藤蔓合成物品 可以重复调用方法来设置多种物品.


重点-限制合成原料必须是带有特定数据的:
此方法需要一个监听器: CraftItemEvent

在监听器中写入
  1. ItemStack item = evt.getRecipe().getResult();
  2.         item.setAmount(1);
  3. if (item.equals(目标物品)) {
  4.             if (!evt.getInventory().contains(必须原料)) {
  5.                 evt.setCancelled(true);
  6.             }
  7. }
复制代码


本教程到此为止 如果有更好方法请在下面回复~

↓ 加人气不扣自己的哦

下页 实例代码
https://coding.net/u/Bryan_lzh/p/SuperBandage/git/blob/master/src/superbandage/ItemsCreater.java

↑ 来自插件 http://www.mcbbs.net/thread-505610-1-1.html


合成注册部分:
  1. ItemStack item = new ItemStack(Material.PAPER);
  2.         ItemMeta im = item.getItemMeta();
  3.         im.setLore(this.Lore);
  4.         im.setDisplayName(ChatColor.translateAlternateColorCodes('&', "&b初级绷带"));
  5.         item.setItemMeta(im);
  6.         ShapedRecipe sr = new ShapedRecipe(item);
  7.         sr.shape(new String[]{
  8.                     "M M",
  9.                     "M M",
  10.                     "M M"
  11.                 });
  12.         sr.setIngredient('M', Material.VINE);
  13.         Items.plugin.getServer().addRecipe(sr);
  14.         Items.plugin.sr.add(sr);
  15.         return item;
复制代码
对应合成:
  1. ItemStack item = new ItemStack(Material.PAPER);
  2.         ItemMeta im = item.getItemMeta();
  3.         im.setLore(this.Lore);
  4.         im.setDisplayName(ChatColor.translateAlternateColorCodes('&', "&b中级绷带"));
  5.         item.setItemMeta(im);
  6.         ShapedRecipe sr = new ShapedRecipe(item);
  7.         sr.shape(new String[]{
  8.                     "MPM",
  9.                     " G ",
  10.                     "M M"
  11.                 });
  12.         sr.setIngredient('M', Material.VINE);
  13.         sr.setIngredient('G', Material.GOLD_INGOT);
  14.         sr.setIngredient('P', Material.PAPER);
  15.         Items.plugin.getServer().addRecipe(sr);
  16.         Items.plugin.sr.add(sr);
  17.         return item;
复制代码
对应合成:

监听部分:
https://coding.net/u/Bryan_lzh/p/SuperBandage/git/blob/master/src/superbandage/S_BandageListener.java