使用ItemMeta的子类 —— 实现更多的物品自定义 ——
其实,除了Bukkit提供的普通ItemMeta外,它还有一些其他的子类,这些子类用于设置一些特殊物品的属性,例如,我想设计一下这个烟花的样式,那么怎么才能进行编辑呢?ItemMeta类没有提供相关方法啊。这时就要用到ItemMeta的子类 FireworkMeta 来进行更加详细的设置。 本教程使用Intellij IDEA作为IDE SpigotAPI为1.12.2版本 使用Maven
|
|
|
BookMeta - 自定义书
教程内容:
自定义书本需要用到BookMeta类,首先我们新建一个插件,填写好相关内容并完成主类后,创建一个新的类,命名为TestBook,这个类我们拿来编辑BookMeta。 首先创建类,搞♂一个书ItemStack出来 写一个load()方法在开服时调用,对上面的ItemStack对象进行属性修改 获取书的ItemMeta 这里我们需要用到强制类型转换 特别注意:只有Material为BOOK_AND_QUILL或是WRITTEN_BOOK的ItemStack才可以 强制转换为BookMeta 获取到BookMeta之后,我们就可以进行编辑了 首先设置书的作者、书的标题 开始写入书内容,这里我们用到了StringBuilder类便于我们快速写入内容
最后调用addPage(String... string)方法,添加新的一页
特别注意:每页最多256个字符、最多50页

最后设置书的类型
Generation是BookMeta的内部枚举类,不同的枚举对应不同的书类型
- ORIGINAL -> 原著
- COPY_OF_ORIGINAL -> 副本
- COPY_OF_COPY -> 副本的副本
- TATTERED -> 破烂不堪
在这里,我们将这本书设置为原著

最后,将定义好的BookMeta设置为这本书的ItemMeta

我们在主类监听玩家加入事件,在玩家进服时自动给予一本书

使用Maven自动构建,将插件丢进服务端。
现在进游戏测试看看,我们写的书是什么样子的吧!

|
TestBook代码: - public class TestBook{
- //新建一个 ItemStack ,Material为成书
- static ItemStack book = new ItemStack(Material.WRITTEN_BOOK);
- //对 ItemStack 进行相关操作
- //在开服时调用,载入物品
- public static void load(){
- //将ItemMeta强制类型转换为BookMeta
- //注意,只有成书和书与笔才可以这样
- BookMeta bookmeta = (BookMeta) book.getItemMeta();
- //调用 BookMeta 类的方法 setAuthor() 填写作者
- bookmeta.setAuthor("秋风残叶");
- //调用 BookMeta 类的方法 setTitle() 设置书的标题
- bookmeta.setTitle("残叶的女装史");
- //使用StringBuilder类快速便捷文本内容
- StringBuilder text = new StringBuilder();
- text.append("时间:2017-7-1\n残叶的暑假开始了,门口放着\n夜幕寄来的女装。\n\n");
- text.append("时间:2017-7-5\n残叶非常喜欢夜幕送来的女\n装残叶每天上街都会穿着。\n\n");
- text.append("时间:2017-7-10\n残叶发现了一个神秘传送门\n倍感好奇地走了进去。");
- //将这些内容写入新的一页
- //注意,每页最多256个字符,每本书最多50页
- bookmeta.addPage(text.toString());
- //设置书的类型为原著
- bookmeta.setGeneration(BookMeta.Generation.ORIGINAL);
- //完成BookMeta编写
- book.setItemMeta(bookmeta);
- }
- }
复制代码 |
BannerMeta - 自定义旗帜
教程内容: 对于旗帜,Bukkit同样提供了ItemMeta的子类BannerMeta,这个类可以自定义旗帜的所有属性,包括样式、颜色等。 这里我们演示如何弄一个白底绿色麻将标志的旗帜。 首先新建一个TestFlag类,new一个旗帜出来,白色旗帜的副ID是15,所以后面的short值填15 
旗帜的样式由Pattern类决定,所以要搞样式就得new一个Pattern对象
在这里我们使用的构造方法是Pattern(DyeColor, PatternType);
当然还有一个另外的构造方法,请去SpigotAPI查阅。
这里要介绍的是DyeColor和PatternType类,这两个类都是枚举类

定义好了旗帜样式之后,就可以将我们的旗帜设置为这个样式了。

主类和上面的一样,开服时加载物品,玩家进服时给予。
现在进入游戏吧!

|
TestFlag代码: - public class TestFlag {
- //要以白色作为旗帜底色,所以说我们选择了副ID为15的旗帜
- static ItemStack flag = new ItemStack(Material.BANNER,1,(short)15);
- public static void load(){
- BannerMeta banner = (BannerMeta) flag.getItemMeta();
- //编辑旗帜样式需要用到Pattern类,这个类为旗帜提供提供样式
- //我们调用Pattern类的Pattern?(DyeColor color, PatternType pattern)构造方法
- //DyeColor与PatternType都是枚举类
- //DyeColor提供16种旗帜颜色,PatternType提供多种旗帜样式
- //这里我们选用绿色+麻将图标
- Pattern p = new Pattern(DyeColor.GREEN, PatternType.MOJANG);
- // 添加旗帜样式
- banner.addPattern(p);
- //设置ItemMeta
- flag.setItemMeta(banner);
- }
- }
复制代码 |
FireworkEffectMeta & FireworkMeta - 自定义烟花 烟火之星教程内容:对于烟花,Bukkit同样提供了可用于自定义的 FireworkEffectMeta 与 FireworkMeta ,它们分别是给烟火之星和烟花准备的。你可以自定义烟花的各种形状、颜色、样式等等。 首先来看FireworkEffectMeta自定义烟火之星的样式 新建一个TestFirework类 获取烟火之星的ItemMeta,强转为FireworkEffectMeta 开始自定义我们的FireworkEffectMeta 我们需要用到它的内部类Builder Builder类里面提供了很多方法用于设置属性 - withColor()可以为烟花设置颜色,可以传入多种颜色参数
- withFade()是烟花炸完了之后淡出的颜色,同样可以传入多种颜色参数
- withFlicker()可以设置烟花为闪烁状
- withTrail()可以设置烟花在飞行时飘出白色颗粒
- with()用于设置烟花的形状,传入一个Type类型参数,这个类是FireworkEffect的内部枚举类,这里我们使用小型球状 BALL
关于Type的所有枚举在 这里 查看
现在,进入游戏看看吧,我们定义好的烟火之星。 把它合成为烟火之星,别跟我说你玩了这么久MC连烟花合成都不会 烟花绽放的样子(红黄) 烟花淡出的样子(蓝绿) |
烟花教程内容: 烟花和烟火之星的设置基本相同 不过烟花可以同时使用多种烟花样式 当然还有一个setPower()用于设置烟花的飞行时间 (烟花这些属性都不知道还好意思说玩过MC?) 定义好之后,进游戏测试 两种形状都有哦,非常漂亮吧! |
两个类的代码: - public class TestFirework {
- //获取一个烟火之星的ItemStack实例
- static ItemStack firework = new ItemStack(Material.FIREWORK_CHARGE);
- public static void load(){
- //强制类型转换为FireworkEffectMeta
- //注意,这里只能使用烟火之星,请不要使用烟花
- FireworkEffectMeta effectMeta = (FireworkEffectMeta) firework.getItemMeta();
- //为了自定义烟花样式,我们要使用FireworkEffect.Bulider内部类
- //使用builder()方法获取内部类FireworkEffect.Bulider
- //这个类用于链式设置烟花的各种属性
- //什么是链式?这就是链式
- FireworkEffect fe = FireworkEffect.builder()
- .withColor(Color.RED,Color.YELLOW)
- .withFade(Color.GREEN,Color.BLUE)
- .withFlicker()
- .withTrail()
- .with(FireworkEffect.Type.BALL)
- .build();
- //设置烟花样式
- effectMeta.setEffect(fe);
- //最后设置为我们的Meta
- firework.setItemMeta(effectMeta);
- }
- }
复制代码
- public class TestFireworkNew {
- //实例化烟花的ItemStack
- static ItemStack fff = new ItemStack(Material.FIREWORK);
- public static void load(){
- //只有烟花才可以强制类型转换为FireworkMeta
- FireworkMeta f = (FireworkMeta) fff.getItemMeta();
- //定义两个FireworkEffect
- FireworkEffect f1 = FireworkEffect.builder()
- .withColor(Color.RED,Color.YELLOW)
- .withFade(Color.GREEN,Color.BLUE)
- .withFlicker()
- .withTrail()
- .with(FireworkEffect.Type.CREEPER)
- .build();
- FireworkEffect f2 = FireworkEffect.builder()
- .withColor(Color.RED,Color.YELLOW)
- .withFade(Color.GREEN,Color.BLUE)
- .withFlicker()
- .withTrail()
- .with(FireworkEffect.Type.STAR)
- .build();
- //为烟花添加Effect
- //可以使用addEffects()方法添加多个FireworkEffect
- f.addEffects(f1,f2);
- //设置烟花飞行时间,1就够了
- f.setPower(1);
- fff.setItemMeta(f);
- }
- }
复制代码 |
KnowledgeBookMeta - 自定义知识之书
教程内容: 什么?知识之书是什么?你连这个都不知道就来学教程了? 来来来,我来帮你科普一下(摘自Minecraft中文Wiki) 知识之书
- 一本绿色的书。
- 目前只能通过使用/give <玩家名称> knowledge_book命令获得。
- 一本带着Recipes NBT标签的知识之书,包含着物品ID列表,当玩家使用它时就会被消耗并解锁指定物品的配方。
总的说,就是你自定义好的知识之书,玩家右键会立即获得里面所包含的合成配方 我们直接来进行自定义教程吧,如果还不知道知识之书有什么用的,看完你就知道了 现在进入游戏,使用我们的知识之书 手持知识之书,右键即可 现在打开工作台的合成表界面吧,已经得到了这个合成配方了 |
TestKnowlageBook类代码:- public class TestKnowlageBook {
- //获取知识之书的ItemStack对象
- static ItemStack book = new ItemStack(Material.KNOWLEDGE_BOOK);
- public static void load(){
- //强制类型转换为 KnowledgeBookMeta
- KnowledgeBookMeta k = (KnowledgeBookMeta) book.getItemMeta();
- //NamespacedKey类作为合成配方提供类
- // 所包含的Key值,这个Key值就是物品minecraft名称,例如:minecraft:chest
- //我们调用构造方法 NamespacedKey?(String namespace, String key)
- NamespacedKey n = new NamespacedKey(NamespacedKey.MINECRAFT,"chest");
- //添加合成配方,可以多个
- k.addRecipe(n);
- //设置Meta数据
- book.setItemMeta(k);
- }
- }
复制代码 |
LeatherArmorMeta - 自定义皮革类装备颜色
教程内容: 对于可以染色皮革类装备,Bukkit怎么可能不提供Meta设置呢,我们可以通过 LeatherArmorMeta 来设置皮革类衣服的颜色,任意颜色均可,因为Color对象是可以任意调整RGB值的。 下面是详细操作过程: 现在上游戏看看我们做好的衣服(女装)吧 穿上试试看 |
TestLeather类代码:- public class TestLeather {
- //获取皮革衣服的ItemStack对象
- static ItemStack armor = new ItemStack(Material.LEATHER_CHESTPLATE);
- public static void load(){
- //强制类型转换为LeatherArmorMeta
- LeatherArmorMeta la = (LeatherArmorMeta) armor.getItemMeta();
- //获取衣服颜色
- //我们这里将衣服颜色调整颜色的RGB值为骚粉
- Color c = la.getColor().setRed(219).setGreen(160).setBlue(160);
- // 设置颜色
- la.setColor(c);
- armor.setItemMeta(la);
- }
- }
复制代码 |
PotionMeta - 自定义药水
教程内容: 药水的设置非常简单,和皮革装备一样,药水也是可以调整颜色的。 下面是详细操作过程: 现在进游戏看看实际效果吧! |
TestPotion类代码:- public class TestPotion {
- //获取喷溅型药水的ItemStack对象
- static ItemStack potion =new ItemStack(Material.SPLASH_POTION);
- public static void load(){
- //强制转换为药水类型
- PotionMeta pm = (PotionMeta) potion.getItemMeta();
- //Color类可以使用RGB值任意设置颜色
- Color c = Color.AQUA.setRed(255).setGreen(255).setBlue(0);
- //设置药水颜色
- pm.setColor(c);
- //设置基本属性PotionData
- //这个类用于设置药水基础内容,就是创造模式物品栏里面的各种药水属性
- //仅限于基础属性,凋零、反胃等不能在这里添加
- PotionData pa = new PotionData(PotionType.WATER, false,false);
- //用于添加额外的药水效果
- //你可以将overwrite参数设置为true来覆盖原来的效果
- pm.addCustomEffect(new PotionEffect(PotionEffectType.ABSORPTION,100,1) ,true);
- //最后设置药水基本属性
- pm.setBasePotionData(pa);
- potion.setItemMeta(pm);
- }
- }
复制代码 |
SkullMeta - 自定义头颅
教程内容: 自定义头颅可以让你自定义许多东西,大家熟悉的粘液科技,正是使用了头颅作为新增的物品 使用SkullMeta来让你的头颅丰富多彩 进游戏看看我们定义好的头颅吧 |
TestSkull类代码: - public class TestSkull {
- //获取头颅的ItemStack
- //注意这里的副ID必须是3,因为那才是玩家头
- static ItemStack skull = new ItemStack(Material.SKULL_ITEM,1,(short)3);
- static void load(){
- //转换为SkullMeta
- SkullMeta sm = (SkullMeta) skull.getItemMeta();
- //设置头颅主人
- //这里我们用的UUID
- //传入的参数是一个OfflinePlayer对象
- sm.setOwningPlayer(Bukkit.getOfflinePlayer(UUID.fromString("0749524f-e061-3ba8-aa11-31f8d4245848")));
- //设置头颅数据
- skull.setItemMeta(sm);
- }
- }
复制代码 |
|
|
|
[groupid=1330]PluginsCDTribe[/groupid]