diff --git a/TrueCraft.Client/Handlers/ChunkHandlers.cs b/TrueCraft.Client/Handlers/ChunkHandlers.cs index 16dd9cd..09dbe17 100644 --- a/TrueCraft.Client/Handlers/ChunkHandlers.cs +++ b/TrueCraft.Client/Handlers/ChunkHandlers.cs @@ -28,6 +28,8 @@ namespace TrueCraft.Client.Handlers } chunk.SetBlockID(adjusted, (byte)packet.BlockID); chunk.SetMetadata(adjusted, (byte)packet.Metadata); + client.OnBlockChanged(new BlockChangeEventArgs(coordinates, new TrueCraft.API.Logic.BlockDescriptor(), + new TrueCraft.API.Logic.BlockDescriptor())); client.OnChunkModified(new ChunkEventArgs(new ReadOnlyChunk(chunk))); } @@ -110,6 +112,7 @@ namespace TrueCraft.Client.Handlers // TODO: Lighting } chunk.UpdateHeightMap(); + chunk.TerrainPopulated = true; client.OnChunkLoaded(new ChunkEventArgs(new ReadOnlyChunk(chunk))); } } diff --git a/TrueCraft.Client/Modules/ChunkModule.cs b/TrueCraft.Client/Modules/ChunkModule.cs index f913779..1107105 100644 --- a/TrueCraft.Client/Modules/ChunkModule.cs +++ b/TrueCraft.Client/Modules/ChunkModule.cs @@ -9,6 +9,9 @@ using TrueCraft.API; using System.Linq; using System.Threading; using TrueCraft.Client.Events; +using TrueCraft.API.World; +using TrueCraft.Core.Lighting; +using TrueCraft.Core.World; namespace TrueCraft.Client.Modules { @@ -21,6 +24,7 @@ namespace TrueCraft.Client.Modules private HashSet ActiveMeshes { get; set; } private List ChunkMeshes { get; set; } private ConcurrentBag IncomingChunks { get; set; } + private WorldLighting WorldLighting { get; set; } private BasicEffect OpaqueEffect { get; set; } private AlphaTestEffect TransparentEffect { get; set; } @@ -33,8 +37,10 @@ namespace TrueCraft.Client.Modules Game.Client.ChunkLoaded += Game_Client_ChunkLoaded; Game.Client.ChunkUnloaded += (sender, e) => UnloadChunk(e.Chunk); Game.Client.ChunkModified += Game_Client_ChunkModified; + Game.Client.BlockChanged += Game_Client_BlockChanged; ChunkRenderer.MeshCompleted += MeshCompleted; ChunkRenderer.Start(); + WorldLighting = new WorldLighting(Game.Client.World.World, Game.BlockRepository); OpaqueEffect = new BasicEffect(Game.GraphicsDevice); OpaqueEffect.TextureEnabled = true; @@ -56,6 +62,28 @@ namespace TrueCraft.Client.Modules ActiveMeshes = new HashSet(); } + void Game_Client_BlockChanged(object sender, BlockChangeEventArgs e) + { + WorldLighting.EnqueueOperation(new TrueCraft.API.BoundingBox( + e.Position, e.Position + Coordinates3D.One), false); + WorldLighting.EnqueueOperation(new TrueCraft.API.BoundingBox( + e.Position, e.Position + Coordinates3D.One), true); + var posA = e.Position; + posA.Y = 0; + var posB = e.Position; + posB.Y = World.Height; + posB.X++; + posB.Z++; + WorldLighting.EnqueueOperation(new TrueCraft.API.BoundingBox(posA, posB), true); + WorldLighting.EnqueueOperation(new TrueCraft.API.BoundingBox(posA, posB), false); + for (int i = 0; i < 100; i++) + { + if (!WorldLighting.TryLightNext()) + break; + } + + } + private void Game_Client_ChunkModified(object sender, ChunkEventArgs e) { ChunkRenderer.Enqueue(e.Chunk, true); @@ -126,6 +154,7 @@ namespace TrueCraft.Client.Modules } if (any) Game.FlushMainThreadActions(); + WorldLighting.TryLightNext(); } private static readonly BlendState ColorWriteDisable = new BlendState diff --git a/TrueCraft.Client/MultiplayerClient.cs b/TrueCraft.Client/MultiplayerClient.cs index 8854eaf..0e3b43f 100644 --- a/TrueCraft.Client/MultiplayerClient.cs +++ b/TrueCraft.Client/MultiplayerClient.cs @@ -19,6 +19,7 @@ using TrueCraft.Core.Physics; using TrueCraft.Core.Windows; using TrueCraft.API.Windows; using TrueCraft.API.Logic; +using TrueCraft.API.World; namespace TrueCraft.Client { @@ -30,6 +31,7 @@ namespace TrueCraft.Client public event EventHandler ChunkModified; public event EventHandler ChunkLoaded; public event EventHandler ChunkUnloaded; + public event EventHandler BlockChanged; public event PropertyChangedEventHandler PropertyChanged; private long connected; @@ -265,6 +267,11 @@ namespace TrueCraft.Client if (ChunkModified != null) ChunkModified(this, e); } + protected internal void OnBlockChanged(BlockChangeEventArgs e) + { + if (BlockChanged != null) BlockChanged(this, e); + } + #region IAABBEntity implementation public const double Width = 0.6;