我目前正在开发一个应该冻结实体的插件。我已经做了大多数,但是现在我真的很迷上烟花。我已经有了一个函数,可以在每一个滴答声中将所有“移动”的实体传送回它们的位置。
Bukkit.getScheduler().runTaskTimer(instance, () -> {
for (Entity e : entities) {
//teleporting and setting velocity
if (e instanceof Firework) {
Firework f = (Firework) e;
//TODO how can I make it NOT disappear after one or two seconds
}
}
});
现在,烟花的问题在于,它们在触发某种寿命并爆炸后会自动被移除。我只是不希望实体被冻结。
我已经尝试过f.setTicksLived(1);
,但遗憾的是这根本不会改变任何东西。 (我真的不认为该功能可以正常工作)
我的下一个方法是改变烟火的力量。
FireworkMeta fm = f.getFireworkMeta();
fm.setPower(127);
f.setFireworkMeta(fm);
但是,由于.setPower()
的最大允许数字为127,因此一两分钟后,烟花仍然消失。
我真的希望烟花可以无限期地可见。它不应该完全消失,并且每10秒发射一次新的烟火是不可行的,因为它会一直播放我根本不想要的发射声。
答案 0 :(得分:0)
根据Minecraft Firework Rocket页面的“实体数据”部分,烟花火箭具有以下NBT数据(以及其他):
整数Life
是火箭飞行所经过的滴答声数。
整数LifeTime
是滴答声Life
的数量必须大于或等于爆炸次数。
AFAIK不能使用Bukkit提供的Firework
实体或FireworkMeta
类来修改这些值。
但是,通过直接修改Firework Rocket实体的NBT数据,我们可以更改以下值:
net.minecraft.server.v1_5_R1.Entity mcFireworkEntity = ((CraftEntity) bukkitFireworkEntity).getHandle();
NBTTagCompound tag = new NBTTagCompound();
mcFireworkEntity.c(tag); // gets the firework to dump nbt data into our 'tag' object
// set the entity life flag to 1.
tag.setInt("Life", 1);
// you can optionally also set the `LifeTime` value to the maximum setting as well
// tag.setInt("LifeTime", 2147483647)
// write the tag back into the entity. This needs to happen every game tick
// because minecraft will increase this value by 1 every tick
((EntityLiving)mcFireworkEntity).a(tag); //
NBTTagCompound
是bukkit提供的经过反编译的Minecraft服务器repository的一部分(不确定默认情况下是否可能需要您做些麻烦)。