/// <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); }