插件控制合成与取消合成事件
怎么说呢,这是个并没有卵用的教程
目地: 用插件添加新的合成 并且限制合成材料必须是用特殊数据值的
因为Bukkit的合成只检测物品ID不检测物品的数据值
本教程说明: 类 包 方法
添加合成:
方法 Bukkit.addRecipe(Recipe) 可以将一个Recipe进行注册是玩家能在服务器中合成
注意 这个注册在插件被卸载的时候不会被注销 必须手动注销
Recipe有3个子类 它们位于 org.bukkit.inventory 下 分别是: FurnaceRecipe 熔炉合成
ShapedRecipe 有型合成
ShapelessRecipe 无形合成
FurnaceRecipe : 通过查询API可知,熔炉的合成在构建的时候使用参数来设定目标物品 ←不是本教程重点ShapedRecipe : 在构建的时候通过参数ItemStack设置合成结果
ShapelessRecipe : 在构建的时候通过参数ItemStack设置合成结果
ShapedRecipe与ShapelessRecipe 的区别:
ShapelessRecip 只需要通过 .addIngredient() 来设置原料 无需设置形状
ShapedRecipe 必须通过 .shape(String[] shape) 来设置形状
例子:
- ShapedRecipe sr = new ShapedRecipe(item);
 -         sr.shape(new String[]{
 -                     "A C",
 -                     "CBA",
 -                     "A C"
 - });
 
在指定形状后还需要指定每个字符代表的物品 空格不用指定
通过 .setIngredient(char key, Material ingredient) 来设置每个字符所代表的物品 因为这个方法不能使用 ItemStack 所以原料是无数据值的
例子:
- sr.setIngredient('A', Material.PAPER);
 - sr.setIngredient('B', Material.VINE);
 - sr.setIngredient('C', Material.BROWN_MUSHROOM);
 
getServer().addRecipe(sr);
无形合成例子:
- ShapelessRecipe sr = new ShapelessRecipe(item);
 - sr.addIngredient(9, Material.VINE);
 
重点-限制合成原料必须是带有特定数据的:
此方法需要一个监听器: CraftItemEvent
在监听器中写入
- ItemStack item = evt.getRecipe().getResult();
 -         item.setAmount(1);
 - if (item.equals(目标物品)) {
 -             if (!evt.getInventory().contains(必须原料)) {
 -                 evt.setCancelled(true);
 -             }
 - }
 
本教程到此为止 如果有更好方法请在下面回复~
↓ 加人气不扣自己的哦
下页 实例代码
https://coding.net/u/Bryan_lzh/p/SuperBandage/git/blob/master/src/superbandage/ItemsCreater.java
↑ 来自插件 http://www.mcbbs.net/thread-505610-1-1.html
合成注册部分:
- ItemStack item = new ItemStack(Material.PAPER);
 -         ItemMeta im = item.getItemMeta();
 -         im.setLore(this.Lore);
 -         im.setDisplayName(ChatColor.translateAlternateColorCodes('&', "&b初级绷带"));
 -         item.setItemMeta(im);
 -         ShapedRecipe sr = new ShapedRecipe(item);
 -         sr.shape(new String[]{
 -                     "M M",
 -                     "M M",
 -                     "M M"
 -                 });
 -         sr.setIngredient('M', Material.VINE);
 -         Items.plugin.getServer().addRecipe(sr);
 -         Items.plugin.sr.add(sr);
 -         return item;
 

- ItemStack item = new ItemStack(Material.PAPER);
 -         ItemMeta im = item.getItemMeta();
 -         im.setLore(this.Lore);
 -         im.setDisplayName(ChatColor.translateAlternateColorCodes('&', "&b中级绷带"));
 -         item.setItemMeta(im);
 -         ShapedRecipe sr = new ShapedRecipe(item);
 -         sr.shape(new String[]{
 -                     "MPM",
 -                     " G ",
 -                     "M M"
 -                 });
 -         sr.setIngredient('M', Material.VINE);
 -         sr.setIngredient('G', Material.GOLD_INGOT);
 -         sr.setIngredient('P', Material.PAPER);
 -         Items.plugin.getServer().addRecipe(sr);
 -         Items.plugin.sr.add(sr);
 - return item;
 

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

 
                