java - 龙头无限烟火

标签 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);

但是由于 127 是 .setPower() 允许的最大数字,烟花仍然会在一两分钟后消失。

我真的希望烟花能够无限期地可见。它根本不应该消失,并且每隔 10 秒发射一次新的烟花也不是一个选择,因为它总是会播放我根本不想要的发射声音。

最佳答案

根据 Minecraft 的实体数据部分 Firework Rocket页面,Firework Rockets 拥有以下 NBT 数据(除其他外):

  • 整数Life是火箭飞行的滴答数。

  • 整数 LifeTimeLife 必须大于或等于才会爆炸的刻度数。

据我所知,这些值都不能使用 Firework 进行修改实体或FireworkMeta Bukkit 提供的类(class)。

但是,通过直接修改 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是反编译的minecraft服务器的一部分repository由 bukkit 提供(不确定是否默认,可能需要您进行一些修改)。

关于java - 龙头无限烟火,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55921514/

相关文章:

用于解析 XSD 模式文件的 Java API

java - 通过修改desktop.ini来更改图标的文件夹

java - 让我的世界玩家看向点

java - 红石粒子不会改变它们的颜色

java - 并发修改异常;无法修复

java - org.hibernate.annotations 与 javax.persistence

java - Spring Boot如何知道MessageMapping指定的是Jms队列还是Websocket主题?

java - 我的世界启动器 : Cannot get main method need assistance

java - 错误 getPlayer(args[0]);

java - 尝试参加另一个类时出现问题