public override void HandleMcpePlayStatus(McpePlayStatus message) { Client.PlayerStatus = message.status; if (Client.PlayerStatus == 3) { Client.HasSpawned = true; Client.PlayerStatusChangedWaitHandle.Set(); Client.SendMcpeMovePlayer(); var packet = McpeSetLocalPlayerAsInitializedPacket.CreateObject(); packet.runtimeEntityId = BaseClient.EntityId; BaseClient.SendPacket(packet); } }
public override Task Load(ProgressReport progressReport) { Client.GameStarted = false; return(Task.Run(() => { Stopwatch timer = Stopwatch.StartNew(); progressReport(LoadingState.ConnectingToServer, 25); var resetEvent = new ManualResetEventSlim(false); Client.Start(resetEvent); progressReport(LoadingState.ConnectingToServer, 50); // Client.HaveServer = true; //Client.SendOpenConnectionRequest1(); if (!resetEvent.Wait(TimeSpan.FromSeconds(5))) { Client.ShowDisconnect("Could not connect to server!"); return; } progressReport(LoadingState.ConnectingToServer, 98); //progressReport(LoadingState.LoadingChunks, 0); var percentage = 0; var statusChanged = false; var done = false; int previousPercentage = 0; bool hasSpawnChunk = false; while (true) { double radiusSquared = Math.Pow(Client.ChunkRadius, 2); var target = radiusSquared; percentage = (int)((100 / target) * World.ChunkManager.ChunkCount); if (Client.GameStarted && percentage != previousPercentage) { progressReport(LoadingState.LoadingChunks, percentage); previousPercentage = percentage; //Log.Info($"Progress: {percentage} ({ChunksReceived} of {target})"); } if (!statusChanged) { if (Client.PlayerStatus == 3 || Client.PlayerStatusChanged.WaitOne(50) || Client.HasSpawned || Client.ChangeDimensionResetEvent.WaitOne(5)) { statusChanged = true; //Client.SendMcpeMovePlayer(); //Client.IsEmulator = false; } } if (!hasSpawnChunk) { if (World.ChunkManager.TryGetChunk(new ChunkCoordinates(new PlayerLocation(Client.SpawnPoint.X, Client.SpawnPoint.Y, Client.SpawnPoint.Z)), out _)) { hasSpawnChunk = true; } } if (((percentage >= 100 || hasSpawnChunk))) { if (statusChanged) { break; } } if (!VerifyConnection()) { Client.ShowDisconnect("Connection lost."); timer.Stop(); return; } } if (World.Player is Player player) { var packet = McpeSetLocalPlayerAsInitializedPacket.CreateObject(); packet.runtimeEntityId = Client.EntityId; Client.SendPacket(packet); var p = player.KnownPosition; Client.SendMcpeMovePlayer(new MiNET.Utils.PlayerLocation(p.X, p.Y, p.Z, p.HeadYaw, p.Yaw, p.Pitch), player.KnownPosition.OnGround); } //SkyLightCalculations.Calculate(WorldReceiver as World); //Client.IsEmulator = false; progressReport(LoadingState.Spawning, 99); timer.Stop(); //TODO: Check if spawn position is safe. })); }