插件控制合成与取消合成事件
怎么说呢,这是个并没有卵用的教程
目地: 用插件添加新的合成 并且限制合成材料必须是用特殊数据值的
因为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