Minecraft(我的世界)中文论坛

 找回密码
 注册(register)
查看: 976|回复: 3

[插件开发教程] [Tutorial][Bukkit][UD]如何给实体增加NBT数据

[复制链接]
发表于 2018-4-29 12:55:41 | 显示全部楼层 |阅读模式

您尚未登录,立即登录享受更好的浏览体验!

您需要 登录 才可以下载或查看,没有帐号?注册(register)

x
本帖最后由 602723113 于 2018-7-8 23:21 编辑


如何给你的实体增加NBT数据

目录:
  • 导读
  • 代码示例

导读

本教程使用的是 Spigot1.10.2-R0.1-SNAPSHOT 核心
在阅读之前请确保你具有Java基础知识

在上次的NBT教程中,我们是对物品的NBT进行的操作,那么实体可不可以操作它的NBT呢?答案是可以的

跟物品不同的是,你可以直接通过BukkitAPI操作实体的NBT,而不是通过NMS来进行操作

在BukkitAPI中,这个包就是为我们的实体的NBT进行的操作的包


特别感谢ChineseBukkitAPI汉化组

此包提供了开发者对实体进行的NBT操作,但此包不能用于物品!

代码示例

既然我们是对一个实体进行修改NBT的操作,那么我们就需要先有一个LivingEntity的实例
  1. Player player = (Player) sender;
  2. Zombie zombie = (Zombie) player.getWorld().spawnEntity(player.getLocation(), EntityType.ZOMBIE);
复制代码
在上方的代码中我们生成了一个僵尸,它是LivingEntity的一个子接口,然后我们获取其NBT
  1. AttributeInstance healthInstance = zombie.getAttribute(Attribute.GENERIC_MAX_HEALTH);
复制代码

在上方的代码中,我们调用了zombie.getAttribute()方法,里面需要填入一个Attribute枚举的示例,这里我们用最大生命值做演示
之后我们给这个僵尸增加一个AttributeModifier修改它的最大生命值
  1. healthInstance.addModifier(new AttributeModifier("最大生命值", 20D, AttributeModifier.Operation.ADD_NUMBER));
复制代码
上面的内容有点多,我们来一一介绍
我们调用的AttributeInstance类下的一个方法addModifier,里面需要填入的是一个AttributeModifier的示例,那么我们可以通过实例化就可以

之后我们再来看实例化的这些操作
AttributeModifier有两个构造方法可以供我们使用它们分别是
  1. AttributeModifier(String name, double amount, AttributeModifier.Operation operation)
  2. AttributeModifier(UUID uuid, String name, double amount, AttributeModifier.Operation operation)
复制代码
我们通过上方的两个构造方法可以发现两者只是一个UUID的不同,我们翻其实现可以发现,
  • UUID
没有UUID的构造方**自动给我们生成一个UUID,这个UUID用于AttributeModifier的区分,既然我们这里只修改了一个属性,所以我们直接使用上者即可

  • name
这里的name是AttributeModifier只要和其他的AttributeModifier不重复即可amount

  • amount
此处的amount是修改的数值

  • operation
operation用于表示当前AttributeModifier的数值是以什么进行作用
  • ADD_NUMBER (增加数值#会受到正负值的影响)
  • ADD_SCALAR (增加数值#不会受到正负值的影响,表示为标量)
  • MULTIPLY_SCALAR_1 (在将基值加1之后乘以该数值)
注释:
  • 基值: 此Attribute的基础值,如最大生命值,默认为20,20就是这里的基值


然后我们通过打印实体的最大血量进行观察
完整代码:
  1. Player player = (Player) sender;
  2. Zombie zombie = (Zombie) player.getWorld().spawnEntity(player.getLocation(), EntityType.ZOMBIE);
  3. player.sendMessage("[修改前]生命值: " + zombie.getMaxHealth());

  4. AttributeInstance healthInstance = zombie.getAttribute(Attribute.GENERIC_MAX_HEALTH);
  5. healthInstance.addModifier(new AttributeModifier("最大生命值", 20D, AttributeModifier.Operation.ADD_NUMBER));
  6. player.sendMessage("[修改后]生命值: " + zombie.getMaxHealth());
复制代码
测试结果:

                               
登录/注册后可看大图


通过上图,我们可以发现,我们已经成功修改了zombie实体的最大生命值

那么这里就会有人说

呆瓜:为什么不用setMaxHealth()呢?


为什么不用呢?首先这样的操作比较装逼,除此之外我们还可以修改NBT的其他Attribute属性
你可以在这里找到所有可用(不同版本,此枚举会有些不同)的Attribute


再吹一波ChineseBukkitAPI

通过查阅上方的doc,我们就可以看到有很多很多的Attribute可以修改

比如说
GENERIC_ARMOR (护甲值) -> 可以不用给实体穿戴护甲而增加其护甲值了
GENERIC_ATTACK_DAMAGE (当生物攻击其他人时所造成的伤害) -> 就可以不用给实体穿戴佩剑来增加其伤害了

诸如此类的操作...这里我就不再多说了



来自群组: Unknown Domain

评分

参与人数 5人气 +10 金粒 +25 贡献 +1 收起 理由
mimimis + 1 + 1 MCBBS有你更精彩~
@@Leo + 2 [s]首先这样的操作比较装逼,除此之外[/s].
754503921 + 3 + 25 MCBBS有你更精彩~
liuyipeng001 + 2 MCBBS有你更精彩~
逗比的幻影 + 2 MCBBS有你更精彩~

查看全部评分

发表于 2018-5-2 21:15:27 | 显示全部楼层
莫老,有没有获取NBT数据的方法
回复

使用道具 举报

发表于 2018-8-2 21:19:48 | 显示全部楼层
莫老 模组中的一些怪物或者实体,往往会有原版没有的Attribute,这些nbt属性可以通过bukkit修改吗
回复

使用道具 举报

发表于 2018-8-3 22:10:56 | 显示全部楼层
很好奇两个AttributeModifier的uuid一样会发生什么,测试是时候是什么都没发生,应该没这么简单吧QWQ
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册(register)

本版积分规则

Archiver|小黑屋|Mcbbs.net ( 京ICP备15023768号-1 ) | 手机版本

GMT+8, 2018-10-21 18:25 , Processed in 0.113278 second(s), 9 queries , Memcache On.

"Minecraft"以及"我的世界"为Mojang Synergies AB的商标。本站与Mojang以及微软公司没有从属关系。

© 2010-2017 我的世界中文论坛 版权所有。本站原创图文内容版权属于原创作者,未经许可不得转载。

快速回复 返回顶部 返回列表