Bukkit插件开发笔记

这篇文章用来记录个人在Bukkit插件开发中踩到的一些坑和其他琐碎知识…

交货前注意的几件事

由于本人经常在交货(或commit)后才突然想起:
卧槽!版本号忘了改!
卧槽!config格式忘了改!
卧槽!调试代码忘了删!
所以在这里写了这一点…

清除生物AI

在Bukkit 1.8 之前的 API 中是不能直接清除生物AI的,因此如果我们需要清理实体AI的话必须要手动调用NMS代码才能实现。
这里有两种方法:
1.让实体永远盯着某处
这样它就会除了盯着这里其他啥都不会做了
(虽然AI仍然存在,但是盯着某处永远是最高优先级

1
2
3
4
5
6
7
8
9
public static void setAI(LivingEntity entity, boolean hasAi) {
EntityLiving handle = ((CraftLivingEntity) entity).getHandle();
handle.getDataWatcher().watch(15, (byte) (hasAi ? 0 : 1));
}

// 例子:
Location loc = null;// 需要生成的位置
Villager villager = loc.getWorld().spawn(loc, Villager.class);
setAI(villager, false);

2.使用NBT清除实体AI
通过给实体添加一个NBT标记而让它的AI不起作用

1
2
3
4
5
6
7
8
9
10
void noAI(Entity bukkitEntity) {
net.minecraft.server.v1_8_R1.Entity nmsEntity = ((CraftEntity) bukkitEntity).getHandle();
NBTTagCompound tag = nmsEntity.getNBTTag();
if (tag == null) {
tag = new NBTTagCompound();
}
nmsEntity.c(tag);
tag.setInt("NoAI", 1);
nmsEntity.f(tag);
}

对于1.8以上的版本,Bukkit API 已经在 LivingEntity 中提供了一个清除AI的方法:

1
2
wither = (Wither) location.getWorld().spawnEntity(location, EntityType.WITHER);
wither.setAI(false);

关于自定义AI的一些事

详情请看这篇文章

人生不易,仓鼠断气