我正在编程一个观众模式插件,但是我有一个问题。
我试图让观众与玩家互动,那么他应该成为其中的一员。
但是按照我的实现,只有一个玩家可以骑另一人。如何让两个观众骑同一位球员?
@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的早期版本中,您仍然可以让多个玩家通过向客户端发送“伪造”数据包来告知玩家附加到指定的实体来旁观一个实体。由于服务器只能正式跟踪每个实体的一名乘客,因此它不会知道其他行为类似的其他客户端/玩家,就像他们是该实体的乘客一样,这可能会导致奇怪的行为。您需要跟踪所有旁听者和他们在服务器端旁观的实体,并自行处理注销等操作(当旁观者重新登录后,它们将不再附加到该实体)。这是一种将播放器附加到实体的方法,尽管仅在播放器的客户端上。
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,其他玩家也不会看到观众移动了(只要他们完全看不见他们就看不见了),而且我无法实现允许观众使用常规移位键(不过其他方法也可以)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句