子弹无限烟火

时间:2019-04-30 13:01:36

标签: java minecraft bukkit

我目前正在开发一个应该冻结实体的插件。我已经做了大多数,但是现在我真的很迷上烟花。我已经有了一个函数,可以在每一个滴答声中将所有“移动”的实体传送回它们的位置。

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秒发射一次新的烟火是不可行的,因为它会一直播放我根本不想要的发射声。

1 个答案:

答案 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的一部分(不确定默认情况下是否可能需要您做些麻烦)。