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

时间:2017-01-26 03:08:41

标签: java bukkit

经过大量的研究和浪费了很多时间,我仍然无法找到如何将一个实体隐藏到一个玩家。

我要做的是创建一个伪装命令。我现在已经解决了所有问题,除了问题是实体仍然可见,并且一旦静止,你就无法与任何东西进行交互,因为暴徒的命中箱是阻碍的。我想隐藏播放器中的实体,以便您可以执行此操作。我知道玩家可以使用Player#hidePlayer(),但这不适用于实体。我尝试使用this之类的解决方案,但在遵循示例时出错了。 (很多东西都被折旧了,所以我认为它已经过时了。我正在使用Spigot 1.11.2)。非常感谢任何帮助。

PS:如果你想知道为什么我不只是使用一个已经制作的插件,那是因为它们都不是我发现的。

1 个答案:

答案 0 :(得分:1)

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

我强烈建议 ProtocolLib ,将其放入您的服务器并在插件中使用。

请注意,Bukkit用户 Comphenix 已经为protocollib开发了一个隐藏实体的类。你可以找到它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;
    }
}