コード例 #1
0
        /// <summary>
        /// Handles the packet.
        /// </summary>
        /// <param name="Server">The server.</param>
        /// <param name="client">The client.</param>
        /// <remarks></remarks>
        public override void HandlePacket(MultiplayerServer Server, RemoteClient client)
        {
            if (client.LoggedIn)
            {
                Server.KickPlayer(client.PlayerEntity.Name, "Invalid packet recieved!");
                return;
            }
            if (ProtocolVersionOrEID < MultiplayerServer.ProtocolVersion)
            {
                client.PacketQueue.Clear();
                client.PacketQueue.Enqueue(new DisconnectPacket("Outdated client!"));
                return;
            }
            if (ProtocolVersionOrEID > MultiplayerServer.ProtocolVersion)
            {
                client.PacketQueue.Clear();
                client.PacketQueue.Enqueue(new DisconnectPacket("Outdated server!"));
                return;
            }

            client.PlayerEntity = Server.Levels[0].LoadPlayer(Username);

            if (Server.CurrentServer.OnlineMode)
            {
                WebClient webClient = new WebClient();
                try
                {
                    StreamReader r = new StreamReader(webClient.OpenRead("http://session.minecraft.net/game/checkserver.jsp?user="******"&serverId=" + client.OnlineModeHash));
                    if (!r.ReadToEnd().ToUpper().Contains("YES"))
                    {
                        Server.KickPlayer(client.PlayerEntity.Name, "Failed to verify username!");
                        r.Close();
                        return;
                    }
                    r.Close();
                }
                catch
                {
                    Server.KickPlayer(client.PlayerEntity.Name, "Failed to verify username!");
                    return;
                }
            }

            this.ProtocolVersionOrEID = client.PlayerEntity.ID;
            this.WorldMode = Server.Levels[0].GameMode;
            this.LevelType = Server.Levels[0].WorldGenerator.Name;
            this.IsServerContext = false;
            this.MaxPlayers = (byte)Server.CurrentServer.MaxPlayers;
            client.PacketQueue.Enqueue(this);
            this.IsServerContext = true;
            this.Username = client.PlayerEntity.Name;

            ChunkManager.RecalculateClientColumns(client, Server, true);

            // TODO: Send inventory
            client.PacketQueue.Enqueue(new SpawnPositionPacket(Server.Levels[client.PlayerEntity.LevelIndex].Spawn));
            client.PlayerEntity.Location = Server.Levels[client.PlayerEntity.LevelIndex].Spawn;

            // Send Position
            client.PacketQueue.Enqueue(new PlayerPositionAndLookPacket(client.PlayerEntity));
            client.LoggedIn = true;
            client.PlayerEntity.GameMode = Server.Levels[client.PlayerEntity.LevelIndex].GameMode;

            // Send the new client to all logged in clients
            Server.EnqueueToAllClients(new PlayerListItemPacket(client.PlayerEntity.Name, true, 0));

            // Send all logged in clients to the new client
            foreach (RemoteClient c in Server.GetLoggedInClients())
                if (c.PlayerEntity.Name != client.PlayerEntity.Name)
                    client.PacketQueue.Enqueue(new PlayerListItemPacket(c.PlayerEntity.Name, true, 0));

            // Add entity
            Server.GetWorld(client).AddEntity(client.PlayerEntity);
            foreach (RemoteClient c in Server.GetClientsInWorldExcept(Server.GetWorld(client), client))
            {
                c.PacketQueue.Enqueue(new SpawnNamedEntityPacket(client.PlayerEntity.ID, client.PlayerEntity.Name,
                    client.PlayerEntity.Location, client.PlayerEntity.Rotation, client.PlayerEntity.InHand.ID));
                c.PacketQueue.Enqueue(new EntityPacket());

                client.PacketQueue.Enqueue(new SpawnNamedEntityPacket(c.PlayerEntity.ID, c.PlayerEntity.Name,
                    c.PlayerEntity.Location, c.PlayerEntity.Rotation, c.PlayerEntity.InHand.ID));
            }
            client.PacketQueue.Enqueue(new TimeUpdatePacket(Server.Levels[client.PlayerEntity.LevelIndex].Time));

            if (Server.GetLevel(client).WeatherManager.WeatherOccuring)
                client.PacketQueue.Enqueue(new ChangeGameStatePacket(NewOrInvalidState.BeginRain));

            SetWindowItemsPacket swip = new SetWindowItemsPacket(0, client.PlayerEntity.Inventory);
            client.PacketQueue.Enqueue(swip);
        }