/** Notify that the session is currently idle. */ public void idle() { if (pingMessageId == 0 && getProtocol() instanceof PlayProtocol) { pingMessageId = random.nextInt(); if (pingMessageId == 0) { pingMessageId++; } send(new PingMessage(pingMessageId)); } else { disconnect("Timed out"); } }
/** * Disconnects the session with the specified reason. This causes a KickMessage to be sent. When * it has been delivered, the channel is closed. * * @param reason The reason for disconnection. */ public void disconnect(String reason) { disconnect(reason, false); }
@Override @Deprecated public void disconnect() { disconnect("No reason specified."); }
/** * Sets the player associated with this session. * * @param profile The player's profile with name and UUID information. * @throws IllegalStateException if there is already a player associated with this session. */ public void setPlayer(PlayerProfile profile) { if (player != null) { throw new IllegalStateException("Cannot set player twice"); } // isActive check here in case player disconnected during authentication if (!isActive()) { // no need to call onDisconnect() since it only does anything if there's a player set return; } // initialize the player PlayerDataService.PlayerReader reader = server.getPlayerDataService().beginReadingData(profile.getUniqueId()); player = new GlowPlayer(this, profile, reader); // isActive check here in case player disconnected after authentication, // but before the GlowPlayer initialization was completed if (!isActive()) { onDisconnect(); return; } // login event PlayerLoginEvent event = EventFactory.onPlayerLogin(player, hostname); if (event.getResult() != PlayerLoginEvent.Result.ALLOWED) { disconnect(event.getKickMessage(), true); return; } // joins the player player.join(this, reader); // Kick other players with the same UUID for (GlowPlayer other : getServer().getOnlinePlayers()) { if (other != player && other.getUniqueId().equals(player.getUniqueId())) { other.getSession().disconnect("You logged in from another location.", true); break; } } player.getWorld().getRawPlayers().add(player); online = true; GlowServer.logger.info( player.getName() + " [" + address + "] connected, UUID: " + player.getUniqueId()); // message and user list String message = EventFactory.onPlayerJoin(player).getJoinMessage(); if (message != null && !message.isEmpty()) { server.broadcastMessage(message); } // todo: display names are included in the outgoing messages here, but // don't show up on the client. A workaround or proper fix is needed. Message addMessage = new UserListItemMessage(UserListItemMessage.Action.ADD_PLAYER, player.getUserListEntry()); List<UserListItemMessage.Entry> entries = new ArrayList<>(); for (GlowPlayer other : server.getOnlinePlayers()) { if (other != player && other.canSee(player)) { other.getSession().send(addMessage); } if (player.canSee(other)) { entries.add(other.getUserListEntry()); } } send(new UserListItemMessage(UserListItemMessage.Action.ADD_PLAYER, entries)); }