让实体有几个乘客

Let entity have several passengers

我正在编写旁观者模式插件,但遇到了问题。

我正在努力做到,如果观众与玩家互动,那么他应该成为它的乘客。

但是在我的实现中,只有一个玩家可以骑另一个玩家。 如何让两个观众骑同一个玩家?

@EventHandler
public void onPlayerInteractEntity(PlayerInteractEntityEvent e) {
    Player p = e.getPlayer();
    if(plugin.spectating.contains(p)) {
        if(e.getRightClicked() instanceof Player) {
            Player target = (Player) e.getRightClicked();
            if(plugin.alive.contains(target)) {
                target.setPassenger(p);
            }
        }
    }
}

编辑:我的意思是 Bukkit/Spigot 1.7

使用相对较新的香草旁观者游戏模式,您不必让旁观者成为目标玩家或实体的乘客。如果旁观者处于游戏模式 #3 (GameMode.SPECTATOR),您可以使用 player.setSpectatorTarget(Entity entity) 使旁观者的视野跟随目标的视野(我假设这是您提到的服务器实现的)。除非你想让旁观者在观看时保持不同的游戏模式,否则这应该会很好,因为多个玩家可以使用内置的旁观者游戏模式同时观看同一个实体。

在没有内置旁观者游戏模式的 Bukkit 早期版本中,您仍然可以让多个玩家旁观一个实体,方法是向客户端发送 "fake" 数据包,告诉玩家附加到指定的实体。由于服务器只能正式跟踪每个实体的一名乘客,因此它不会知道其他 clients/players 现在的行为就好像他们是该实体的乘客一样,这可能会导致奇怪的行为。您需要跟踪所有观众和他们在服务器端观看的实体,并自己处理诸如注销之类的事情(当观众重新登录时,他们将不再附加到该实体)。这是一个将玩家附加到实体的方法,尽管只在玩家的客户端上。

public static void setFakePassenger(Player spectator, Entity target) {
    EntityPlayer nmsSpectator = ((CraftPlayer) spectator).getHandle();
    PacketPlayOutAttachEntity attachPacket = new PacketPlayOutAttachEntity(0, nmsSpectator, ((CraftEntity) target).getHandle()); // The packet that tells a client to attach to an entity
    nmsSpectator.playerConnection.sendPacket(attachPacket); // Send packet to client
    // spectators is a HashMap<UUID, Entity> so that we can keep track of which players are spectating which entities
    spectators.put(spectator.getUniqueId(), target);
}

有了这个 hack,其他玩家也不会再看到旁观者移动(前提是他们在没有某种隐形的情况下完全看到旁观者)而且我无法实现允许旁观者下马或脱离自己的东西使用常规 shift 键从目标(其他方法可能有效)。