如何设置单个实体对玩家不可见?

How to set a single entity invisible to a player?

经过大量研究和浪费大量时间,我仍然无法找到如何向玩家隐藏实体。

我想做的是创建一个伪装命令。我现在已经解决了所有问题,除了问题是实体仍然可见,并且一旦静止不动你就不能与任何东西互动,因为暴徒的碰撞箱挡住了路。我想对播放器隐藏该实体,以便您可以执行此操作。我知道玩家可以使用 Player#hidePlayer(),但这不适用于实体。我试过使用 this 等解决方案,但在执行示例时出现错误。 (而且很多东西都贬值了,所以我认为它已经过时了。我使用的是 Spigot 1.11.2)。非常感谢任何帮助。

PS:如果你想知道为什么我不直接使用一个已经制作好的插件,那是因为 none 是我发现的插件。

要完成您想要的,您必须使用数据包取消玩家看到的内容。

我强烈推荐ProtocolLib,在你的服务器中安装它并在你的插件中使用它。


考虑到这一点,Bukkit 用户 Comphenix 为协议库开发了一个 class 来隐藏实体。你可以找到它 in github.

Comphenix也提供了使用示例,如下所示:

    public class ExampleMod extends JavaPlugin {
    private EntityHider entityHider;

    private static final int TICKS_PER_SECOND = 20;

    @Override
    public void onEnable() {
        entityHider = new EntityHider(this, Policy.BLACKLIST);
    }

    @Override
    public boolean onCommand(CommandSender sender, Command command, String label, String[] args) {
        if (sender instanceof Player) {
            final Player player = (Player) sender;
            final Sheep sheep = player.getWorld().spawn(player.getLocation(), Sheep.class);

            // Show a particular entity
            entityHider.toggleEntity(player, sheep);

            getServer().getScheduler().scheduleSyncDelayedTask(this, new         Runnable() {
                @Override
                public void run() {
                    entityHider.toggleEntity(player, sheep);
                }
            }, 10 * TICKS_PER_SECOND);
        }
        return true;
    }
}