在一些RPG地图中我们有时会看到这样的武器
这个就是一把利用Attribute与NBTTag制造的一把武器=w=
那么我们要怎么利用代码做出这样的效果呢?
这里我要补充的是,在1.13.2版本的时候,BukkitAPI更新了对物品的Attribute的相关操作,相关的commit请点这个链接:点我
此外,如果你事先是不清楚BukkitAPI下 org.bukkit.attribute 的使用方法,我建议你可以看看这个教程
或者看我下面的一些操作,看你能不能看懂吧哈哈哈哈哈哈啊哈哈哈
1.13.2以下的版本 - //和往常一样我们实例化一个物品
- ItemStack item = new ItemStack(Material.DIAMOND_SWORD);
- ItemMeta im = item.getItemMeta();
- im.setDisplayName("§6[ §e§l战火 §6]");
- item.setItemMeta(im);
复制代码 之后获取这个物品的NBT
- NBTTagCompound compound =
- (nmsItem.hasTag()) ? nmsItem.getTag() : new NBTTagCompound();
复制代码 那么之后我们需要新建一个NBT集合
- NBTTagList modifiers = new NBTTagList();
复制代码 之后我们再实例化一个NBT数据出来
- NBTTagCompound damage = new NBTTagCompound();
复制代码 之后往里面写入一些数据
- //AttributeName指该修改的位置也就是 属性名 (17-8-18修订 嘻嘻嘻)
- //Name指该Attribute的名字 可以通过NBTCompound.get(String name)得到
- //Amount指该Attribute的属性所修改的的值
- //Operation值该Attribute的值是百分比还是数值来算
- // 数值为0 百分比为1(7-2号修订=w=)
- //UUID是用于区分这些Attribute的建议可以设置大一些
- //Slot值该Attribute在玩家的哪个 部位 才会生效,不填写则所有部位都会生效
- damage.set("AttributeName", new NBTTagString("generic.attackDamage"));
- damage.set("Name", new NBTTagString("Damage"));
- damage.set("Amount", new NBTTagInt(20));
- damage.set("Operation", new NBTTagInt(0));
- damage.set("UUIDLeast", new NBTTagInt(20000));
- damage.set("UUIDMost", new NBTTagInt(1000));
- damage.set("Slot", new NBTTagString("mainhand"));
复制代码 将刚刚写入好数据的damageNBT给放入NBT集合当中
之后将此NBT集合数据放入总NBT数据中
- compound.set("AttributeModifiers", modifiers);
复制代码 之后和上面的一样进行NBT保存
- nmsItem.setTag(compound);
复制代码 看不懂我在说啥?来看图吧=w=

1.13.2以上的版本
怎么说呢,早在1.13.2版本的时候BukkitAPI就已经更新了,并且相较于上面的方式来说,这种方法更为快捷,方便,同时也不用反射
但是要注意的是,只能编辑Attribute,而不是NBT这一点是要注意的
引入案例:我们现在需要做一个物品,这个物品名字叫 加速火把 当玩家手持它的时候它可以给玩家加速!那么在以前的时候,我们都是 使用Lore或者DisplayName 监听器,然后设置玩家的移速
那么现在我们可以不用这样了!因为好用的API增加了!
首先我们实例化一个火把 - ItemStack torch = new ItemStack(Material.TORCH);
复制代码之后我们获取它的 ItemMeta - ItemMeta itemMeta = torch.getItemMeta();
复制代码为了让它更美观,这里增加一些修饰 - itemMeta.setDisplayName("§f§l[ §a§l加速火把 §f§l]");
- itemMeta.setLore(Lists.newArrayList("§fPY又痒了? 我来给你加加速!"));;
复制代码重点来了,啪啪啪 AttributeModifier modifier = new AttributeModifier(UUID.randomUUID(), "我是加速火把", 0.2D, Operation.ADD_NUMBER, EquipmentSlot.OFF_HAND);
itemMeta.addAttributeModifier(Attribute.GENERIC_MOVEMENT_SPEED, modifier); |
在上方的代码里,我们使用了ItemMeta下的方法 addAttributeModifier,它的参数是长这样的 addAttributeModifier(Attribute attribute, AttributeModifier modifier)
- 第一个参数 attribute,其实是一个枚举,你可以直接在IDE里 Attribute. 就可以看到所有可以操作的属性了
- 第二个参数 modifier,这个就是属性修改器,我们可以在这里设置
- 这个attribute的UUID(UUID.randomUUID())
- 这个attitude的名字("我是加速火把")
- 这个attribute所增加或减少的值(0.2D)
- 增加的方式(Operation)
- 限定物品指定的位置才能生效(EquipmentSlot)
那么在上面我写的是,当这个 加速火把是在 副手手持的时候,就增加 0.2 的速度
最后我们需要把itemMeta设置回物品
- torch.setItemMeta(itemMeta);
复制代码现在让我们来看看成品的效果!
完整代码: ItemStack torch = new ItemStack(Material.TORCH); ItemMeta itemMeta = torch.getItemMeta(); itemMeta.setDisplayName("§f§l[ §a§l加速火把 §f§l]"); itemMeta.setLore(Lists.newArrayList("§fPY又痒了? 我来给你加加速!"));
AttributeModifier modifier = new AttributeModifier(UUID.randomUUID(), "我是加速火把", 0.2D, Operation.ADD_NUMBER, EquipmentSlot.OFF_HAND); itemMeta.addAttributeModifier(Attribute.GENERIC_MOVEMENT_SPEED, modifier);
torch.setItemMeta(itemMeta); |
那么同样的我们也可以利用这种方式给其他的物品增加attribute
下面我写了一个测试代码,方便读者用以测试,代码你可以随意CV
具体使用方法: 为了方便起见,这只是一个测试代码,请使用者在玩家状态下使用这个指令,如果你的指令是其他名字可以自己改成别的,默认指令是test 使用方法: - /test 1 获得所有的物品
- /test 2 查询玩家身上所有的物品的attribute
使用效果:
|