private static void Login(IMultiPlayerServer server, RemoteClient client) { var username = client.Username ?? "<NO_USERNAME>"; if (string.IsNullOrWhiteSpace(username)) { username = "******"; } client.LoggedIn = true; client.Entity = new PlayerEntity(username); client.World = server.Worlds[0]; client.ChunkRadius = 2; server.Trace.TraceData(TraceEventType.Start, 0, $"{username} is logging in with reported position {client.Entity?.Position.ToString()}"); if (!client.Load()) { client.Entity.Position = client.World.SpawnPoint.AsVector3(); } // Make sure player doesn't spawn in the ground while (ClientCollidesWithGround(client, server, client)) { server.Trace.TraceData(TraceEventType.Warning, 0, "spawn point is in the ground"); client.Entity.Position += Directions.Up; } var entityManager = server.GetEntityManagerForWorld(client.World); entityManager.SpawnEntity(client.Entity); var position = client.Entity.Position; server.Trace.TraceData(TraceEventType.Start, 0, "updating initial chunks"); client.UpdateChunks(true); server.Trace.TraceData(TraceEventType.Start, 0, "done"); // Send setup packets server.Trace.TraceData(TraceEventType.Start, 0, "sending setup packets"); client.QueuePacket(new LoginResponsePacket(client.Entity.EntityId, 0, Dimension.Overworld)); client.QueuePacket(new WindowItemsPacket(0, client.Inventory.GetSlots())); client.QueuePacket(new UpdateHealthPacket(((PlayerEntity)client.Entity).Health)); client.QueuePacket(new SpawnPositionPacket((int)position.X, (int)position.Y, (int)position.Z)); client.QueuePacket(new SetPlayerPositionPacket(position.X, position.Y + 1, position.Y + client.Entity.Size.Height + 1, position.Z, client.Entity.Yaw, client.Entity.Pitch, true)); client.QueuePacket(new TimeUpdatePacket(client.World.Time)); // Start housekeeping for this client server.Trace.TraceData(TraceEventType.Start, 0, "starting housekeeping"); entityManager.SendEntitiesToClient(client); server.Scheduler.ScheduleEvent(Constants.Events.RemoteKeepAlive, client, TimeSpan.FromSeconds(10), client.SendKeepAlive); server.Scheduler.ScheduleEvent(Constants.Events.RemoteChunks, client, TimeSpan.FromSeconds(1), client.ExpandChunkRadius); if (!string.IsNullOrEmpty(server.ServerConfiguration.MOTD)) { client.SendMessage(server.ServerConfiguration.MOTD); } if (!server.ServerConfiguration.Singleplayer) { server.SendMessage(ChatColor.Yellow + "{0} joined the server.", client.Username); } }