Spigot бесконечный фейерверк - PullRequest
1 голос
/ 30 апреля 2019

В настоящее время я работаю над плагином, который должен заморозить сущности.Я уже сделал большинство из них, но теперь я действительно испорчен фейерверком.У меня уже есть функция, которая телепортирует все «движущиеся» сущности обратно в их местоположение каждый тик.

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 секунд - не вариант, поскольку он всегда будет воспроизводить звук запуска, который мне просто не нужен.

1 Ответ

0 голосов
/ 12 мая 2019

Согласно разделу Entity Data на странице Minecraft Firework Rocket , ракеты Firework имеют следующие данные NBT (среди прочих):

  • целое число Life - количество тактов, по которым ракета летела.

  • целое число LifeTime - количество тактов Life должно быть больше или равно, чтобы взорваться.

AFAIK, ни одно из этих значений не может быть изменено с использованием сущности Firework или FireworkMeta классов, предоставляемых Bukkit.

Однако, изменяя данные 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. Хранилище , предоставляемое Bukkit (не уверен, что по умолчанию может потребоваться возиться с вашей стороны).

...