sessions[$idx] = $this->updateSessions[$idx] = $session; } /** * Removes the given network session, due to disconnect. This should only be called by a network session on * disconnection. * * @param NetworkSession $session */ public function remove(NetworkSession $session) : void{ $idx = spl_object_id($session); unset($this->sessions[$idx], $this->updateSessions[$idx]); } /** * Requests an update to be scheduled on the given network session at the next tick. * * @param NetworkSession $session */ public function scheduleUpdate(NetworkSession $session) : void{ $this->updateSessions[spl_object_id($session)] = $session; } /** * Checks whether this network session is a duplicate of an already-connected session (same player connecting from * 2 locations). * * @param NetworkSession $connectingSession * * @return bool if the network session is still connected. */ public function kickDuplicates(NetworkSession $connectingSession) : bool{ foreach($this->sessions as $existingSession){ if($existingSession === $connectingSession){ continue; } $info = $existingSession->getPlayerInfo(); if($info !== null and ($info->getUsername() === $connectingSession->getPlayerInfo()->getUsername() or $info->getUuid()->equals($connectingSession->getPlayerInfo()->getUuid()))){ $ev = new PlayerDuplicateLoginEvent($connectingSession, $existingSession); $ev->call(); if($ev->isCancelled()){ $connectingSession->disconnect($ev->getDisconnectMessage()); return false; } $existingSession->disconnect($ev->getDisconnectMessage()); } } return true; } /** * Returns the number of known connected sessions. * * @return int */ public function getSessionCount() : int{ return count($this->sessions); } /** * Updates all sessions which need it. */ public function tick() : void{ foreach($this->updateSessions as $k => $session){ if(!$session->tick()){ unset($this->updateSessions[$k]); } } } /** * Terminates all connected sessions with the given reason. * * @param string $reason */ public function close(string $reason = "") : void{ foreach($this->sessions as $session){ $session->disconnect($reason); } $this->sessions = []; $this->updateSessions = []; } }