예제 #1
0
        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);
            }
        }
예제 #2
0
        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.
            }));
        }