我正在创建一个需要一些隐形蝙蝠的插件。因此,我有一种方法可以繁殖和储存我的蝙蝠。这是代码,我目前有:
public class BatManager {
private static final List<Entity> bats = new ArrayList<>();
public static void spawnBat(Location location) {
Entity entity = location.getWorld().spawnEntity(location, EntityType.BAT);
try {
CraftBat l = (CraftBat) entity;
l.getHandle().setInvisible(true);
} catch (RuntimeException e) {
e.printStackTrace();
}
bats.add(entity);
}
}
这段代码确实可以编译,但是它不会使bat不可见。我强烈怀疑我在某个点创建了对象的副本,并在那里设置了不可见性。然而,我不确定如何在不转换为CraftBat的情况下设置不可见性,因为我不知道有什么方法可以使org.bukkit.Entity
本身不可见。
我该如何更正?
我也对其他关于不可见性的建议持开放态度,但我明确不想使用药剂效果,因为这些效果会留下一些粒子让玩家看到。
我找到了一个没有数据包的解决方案。有了快速定时器,一切都很好:
Entity bat = location.getWorld().spawnEntity(location, EntityType.BAT);
Bukkit.getScheduler().runTaskLater(MyPlugin.getInstance(), () -> {
((CraftBat) bat).getHandle().setInvisible(true);
}, 2);
我找到了另一种解决方案。实际上,可以在bukkit一侧默认隐藏粒子。因此,我使用了PotionEffect,看起来像这样:
Entity entity = location.getWorld().spawnEntity(location, EntityType.BAT);
LivingEntity livingEntity = (LivingEntity) entity;
PotionEffect effect = new PotionEffect(PotionEffectType.INVISIBILITY, Integer.MAX_VALUE, 1, false, false);
livingEntity.addPotionEffect(effect);
bats.add(livingEntity);