Java 让我们有几个乘客

Java 让我们有几个乘客,java,bukkit,Java,Bukkit,我正在编程一个旁观者模式插件,但我有一个问题 我想说的是,如果观众与球员互动,那么他应该成为其中的一员 但在我的实现中,只有一个玩家可以骑另一个。 我怎样才能让两名观众骑同一名运动员 @EventHandler public void onPlayerInteractEntity(PlayerInteractEntityEvent e) { Player p = e.getPlayer(); if(plugin.spectating.contains(p)) {

我正在编程一个旁观者模式插件,但我有一个问题

我想说的是,如果观众与球员互动,那么他应该成为其中的一员

但在我的实现中,只有一个玩家可以骑另一个。 我怎样才能让两名观众骑同一名运动员

@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.couster),您可以使用
player.setSpectatorTarget(Entity Entity)
使观众的视图跟随目标的视图(我假设这就是您提到的服务器实现的)。除非你想让观众在观看时保持不同的游戏模式,否则这应该很好,因为多个玩家可以使用内置的观众游戏模式同时观看同一实体

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

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);
}
公共静态无效设置FakePassenger(玩家-观众,实体目标){
EntityPlayer NMSSSpectator=((工匠玩家)观众).getHandle();
PacketPlayOutAttachEntity attachPacket=新的PacketPlayOutAttachEntity(0,nmsSpectator,((CraftEntity)target).getHandle();//通知客户端连接到实体的数据包
nmsSpectator.playerConnection.sendPacket(attachPacket);//将数据包发送到客户端
//观众是一个散列图,这样我们可以跟踪哪些玩家正在观看哪些实体
旁观者.put(旁观者.getUniqueId(),目标);
}

有了这项技术,其他玩家也不会再看到观众移动了(前提是他们看到观众时没有某种隐身能力),我也无法实现允许观众使用常规shift键下马或脱离目标的功能(不过其他方法也可以)。

是,但我是说对于1.7。。。这是可能的还是不可能的?通过向玩家的客户发送您自己的数据包,很可能“伪造”玩家的客户以为他们是另一个实体的乘客,从而允许多个玩家成为同一实体的乘客。服务器实际上不知道其他玩家是乘客,因为它只能为每个实体跟踪一名乘客,这可能会导致它对其他观众或“乘客”等的移动感到困惑,但它可能会起作用,我会研究它!非常感谢。因为我曾经在SurvivalGames服务器上看到,有两个人在同一个播放器上。编辑了我的答案,获得1.7版支持!不过,您必须跟踪一些事情,以删除一些bug/行为,并使其尽可能无缝地工作。你还记得1.7服务器是如何让观众从目标下马的吗?如果你在上面的1.7方法中遇到任何问题,请告诉我。