Anschluss_zeit
本帖最后由 MinecraftE_D 于 2021-5-5 20:45 编辑

上一帖我们了解了如何设置彩字,这一帖我们来讲解如何添加合成表

同样,我们为了实现这个功能,需要导入三个类
  1. import org.bukkit.inventory.ShapedRecipe;
  2. import org.bukkit.inventory.ItemStack
  3. import org.bukkit.Material
复制代码

接下来我们需要自定义一个方法(这个方法无参数,名称随意)
  1. private void CreateRecipe(){
  2.      
  3. }
复制代码
注意:这个方法的修饰符为private

现在开始编写函数体
这里会接触到一种新的数据类型——ItemStack
直接翻译的话,意思是"物品堆 "?(某哥翻译原话)
其实这个数据类型也就是这个意思qwq,它可以保存一大堆物品,就是一个物品堆嘛(某哥翻译也没错)

还有一种我们也要用到——ShapedRecipe
同样,直接翻译意为"配方食谱"????(某哥翻译NB)

咳咳,不聊远了,开始设定配方
首先需要定义一个ItemStack类型的变量并new出一个实例
  1. ItemStack im = new ItemStack(Material.DIAMOND_ORE);
复制代码
这段代码实例化了一个保存了一个钻石矿石的ItemStack类
简单点来讲,就是一个ItemStack里面装了一个钻石矿石
Material又是啥?没错,它和ChatColor类似,都是枚举类,其中包含了Minecraft所有原版方块、物品等
Material.DIAMOND_ORE代表的便是钻石矿石,你可以更改为什么Material.GOLD_ORE呀什么的

然后需要定义一个ShapedRecipe类型的变量并new出实例
  1. ShapedRecipe recipe = new ShapedRecipe(Material.DIAMOND_ORE.getKey(),im);
复制代码
这次的参数有点特殊!
Parameters:
    key - the unique recipe key
    result - The item you want the recipe to create.
                                                              ——BukkitAPI原话

在高版本的BukkitAPI中,Bukkit官方为构造函数ShapedRecipe添加了一个参数:
一个NameSpacedKey类型的参数(真不明白官方的用意)
正好Material提供了一个getKey()的方法,就先偷个懒吧qwq
第二个参数则是前面定义的ItemStack,指合成的结果
下面的写法有些复杂,先上代码qwq
  1. recipe.shape("111","121","111");
  2. recipe.setIngredient('1', Material.STONE);
  3. recipe.setIngredient('2', Material.DIAMOND);
  4. getServer().addRecipe(recipe);
复制代码
第一句的意思是设置配方合成的形状,在这里的形状就是
1  1  1
1  2  1
1  1  1
二、三句则是说明'1'和'2'分别代表什么物品
第四句则是向服务器添加配方

最后一步,找到onEnable()这个方法
在里面添上一句:你的自定义配方方法名();

至此,你便完成了配方的创建,赶紧进服务器试一下吧qwq!

最后上个完整代码
  1. package plugins.test;

  2. import org.bukkit.ChatColor;
  3. import org.bukkit.Material;
  4. import org.bukkit.event.EventHandler;
  5. import org.bukkit.event.Listener;
  6. import org.bukkit.event.player.PlayerJoinEvent;
  7. import org.bukkit.event.player.PlayerQuitEvent;
  8. import org.bukkit.inventory.ItemStack;
  9. import org.bukkit.inventory.ShapedRecipe;
  10. import org.bukkit.plugin.java.JavaPlugin;

  11. public final class Test extends JavaPlugin implements Listener {

  12.     @Override
  13.     public void onEnable() {
  14.         // Plugin startup logic
  15.         getServer().getPluginManager().registerEvents(this,this);
  16.         CreateRecipe();
  17.     }

  18.     @Override
  19.     public void onDisable() {
  20.         // Plugin shutdown logic
  21.     }

  22.     @EventHandler
  23.     public void onPlayerJoin(PlayerJoinEvent event){
  24.         event.setJoinMessage(ChatColor.YELLOW + event.getPlayer().getName() + "进入了游戏!");
  25.     }

  26.     @EventHandler
  27.     public void inPlayerQuit(PlayerQuitEvent event){
  28.         event.setQuitMessage(ChatColor.YELLOW + event.getPlayer().getName() + "退出了游戏!");
  29.     }

  30.     private void CreateRecipe(){
  31.         ItemStack im = new ItemStack(Material.DIAMOND_ORE);
  32.         ShapedRecipe recipe = new ShapedRecipe(Material.DIAMOND_ORE.getKey(),im);
  33.         recipe.shape("111","121","111");
  34.         recipe.setIngredient('1', Material.STONE);
  35.         recipe.setIngredient('2', Material.DIAMOND);
  36.         getServer().addRecipe(recipe);
  37.     }
  38. }
复制代码




好了,今天的教程到此结束,谢谢你的阅读!
下帖预告:插件开发教程[4] - 添加新指令!




洞穴夜莺
NameSpacedKey是游戏内的ID,指令用的
“ShapedRecipe”是“有序合成配方”

Anschluss_zeit
洞穴夜莺 发表于 2021-5-9 09:41
NameSpacedKey是游戏内的ID,指令用的
“ShapedRecipe”是“有序合成配方”

我知道,原文中我是用谷歌翻译的,为了增加沙雕效果而已qwq

Anschluss_zeit
洞穴夜莺 发表于 2021-5-9 09:41
NameSpacedKey是游戏内的ID,指令用的
“ShapedRecipe”是“有序合成配方”

NameSpacedKey是我确实没懂官方为啥要添加,我觉得是真的没用

维勒
还好吧,这不都是在为我的世界做贡献?

洞穴夜莺
本帖最后由 洞穴夜莺 于 2021-5-14 21:24 编辑
MinecraftE_D 发表于 2021-5-9 19:07
NameSpacedKey是我确实没懂官方为啥要添加,我觉得是真的没用

游戏内使用指令授予/剥夺配方要用到
以及可以声明相同id的配方来覆盖别人的配方

Song丶鹦鹉123
想问下大佬,附魔书的合成怎么才能使他加上附魔效果,能够让别的物品打上?

wcnm0801
想问下大佬,附魔书的合成怎么才能使他加上附魔效果,能够让别的物品打上?

919509299
  1. D:\develop\MC plugin\src\main\java\surikkusu\test\Test.java:42:68
  2. java: 找不到符号
  3.   符号:   方法 getkey()
  4.   位置: 类型为org.bukkit.Material的变量 DIAMOND_ORE
复制代码

第一页 上一页 下一页 最后一页