Esempio n. 1
0
        public void Update(GameTime gameTime)
        {
            var  any = false;
            Mesh _mesh;

            while (IncomingChunks.TryTake(out _mesh))
            {
                any = true;
                var mesh = _mesh as ChunkMesh;
                if (ActiveMeshes.Contains(mesh.Chunk.Coordinates))
                {
                    int existing = ChunkMeshes.FindIndex(m => m.Chunk.Coordinates == mesh.Chunk.Coordinates);
                    ChunkMeshes[existing] = mesh;
                }
                else
                {
                    ActiveMeshes.Add(mesh.Chunk.Coordinates);
                    ChunkMeshes.Add(mesh);
                }
            }
            if (any)
            {
                Game.FlushMainThreadActions();
            }
            WorldLighting.TryLightNext();
        }
Esempio n. 2
0
 void UnloadChunk(ReadOnlyChunk chunk)
 {
     Game.Invoke(() =>
     {
         ActiveMeshes.Remove(chunk.Coordinates);
         ChunkMeshes.RemoveAll(m => m.Chunk.Coordinates == chunk.Coordinates);
     });
 }
Esempio n. 3
0
        protected override void Update(GameTime gameTime)
        {
            GameTime = gameTime;

            foreach (var i in Interfaces)
            {
                i.Update(gameTime);
            }

            Mesh mesh;

            while (IncomingChunks.TryTake(out mesh))
            {
                ChunkMeshes.Add(mesh);
            }
            Action action;

            if (PendingMainThreadActions.TryTake(out action))
            {
                action();
            }

            if (NextPhysicsUpdate < DateTime.UtcNow && Client.LoggedIn)
            {
                IChunk chunk;
                var    adjusted = Client.World.World.FindBlockPosition(new Coordinates3D((int)Client.Position.X, 0, (int)Client.Position.Z), out chunk);
                if (chunk != null)
                {
                    if (chunk.GetHeight((byte)adjusted.X, (byte)adjusted.Z) != 0)
                    {
                        Client.Physics.Update();
                    }
                }
                // NOTE: This is to make the vanilla server send us chunk packets
                // We should eventually make some means of detecing that we're on a vanilla server to enable this
                // It's a waste of bandwidth to do it on a TrueCraft server
                Client.QueuePacket(new PlayerGroundedPacket {
                    OnGround = true
                });
                Client.QueuePacket(new PlayerPositionAndLookPacket(Client.Position.X, Client.Position.Y,
                                                                   Client.Position.Y + MultiplayerClient.Height, Client.Position.Z, Client.Yaw, Client.Pitch, false));
                NextPhysicsUpdate = DateTime.UtcNow.AddMilliseconds(1000 / 20);
            }

            if (Delta != Microsoft.Xna.Framework.Vector3.Zero)
            {
                var lookAt = Microsoft.Xna.Framework.Vector3.Transform(
                    Delta, Matrix.CreateRotationY(Microsoft.Xna.Framework.MathHelper.ToRadians(Client.Yaw)));

                Client.Position += new TrueCraft.API.Vector3(lookAt.X, lookAt.Y, lookAt.Z)
                                   * (gameTime.ElapsedGameTime.TotalSeconds * 4.3717);
            }

            base.Update(gameTime);
        }
Esempio n. 4
0
 void HandleClientPropertyChanged(object sender, PropertyChangedEventArgs e)
 {
     switch (e.PropertyName)
     {
     case "Position":
         var sorter = new ChunkRenderer.ChunkSorter(new Coordinates3D(
                                                        (int)Game.Client.Position.X, 0, (int)Game.Client.Position.Z));
         Game.Invoke(() => ChunkMeshes.Sort(sorter));
         break;
     }
 }
Esempio n. 5
0
 void HandleClientPropertyChanged(object sender, PropertyChangedEventArgs e)
 {
     switch (e.PropertyName)
     {
     case "Position":
         UpdateCamera();
         var sorter = new ChunkRenderer.ChunkSorter(new Coordinates3D(
                                                        (int)Client.Position.X, 0, (int)Client.Position.Z));
         PendingMainThreadActions.Add(() => ChunkMeshes.Sort(sorter));
         break;
     }
 }