Exemplo n.º 1
0
        public void Calculate(IBlockAccess level, Queue <BlockCoordinates> lightBfQueue, HashSet <BlockCoordinates> lightBfSet)
        {
            try
            {
                //if (block.SkyLight != 15)
                //{
                //	Log.Error($"Block at {block.Coordinates} had unexpected light level. Expected 15 but was {block.SkyLight}");
                //}

                while (lightBfQueue.Count > 0)
                {
                    var coordinates = lightBfQueue.Dequeue();
                    lightBfSet.Remove(coordinates);
                    if (coordinates.Y < 0 || coordinates.Y > 255)
                    {
                        Log.Warn($"Y coord out of bounce {coordinates.Y}");
                        continue;
                    }

                    ChunkColumn chunk = level.GetChunk(coordinates);
                    if (chunk == null)
                    {
                        Log.Warn($"Chunk was null");
                        continue;
                    }

                    var newChunkCoord = (ChunkCoordinates)coordinates;
                    if (chunk.x != newChunkCoord.X || chunk.z != newChunkCoord.Z)
                    {
                        chunk = level.GetChunk(newChunkCoord);
                        if (chunk == null)
                        {
                            Log.Warn($"Chunk with new coords was null");
                            continue;
                        }
                    }

                    ProcessNode(level, chunk, coordinates, lightBfQueue, lightBfSet);
                }
            }
            catch (Exception e)
            {
                Log.Error("Calculation", e);
            }
        }
Exemplo n.º 2
0
Arquivo: Chest.cs Projeto: K4mey/Alex
        /// <inheritdoc />
        public override BlockState BlockPlaced(IBlockAccess world, BlockState state, BlockCoordinates position)
        {
            if (world is World w)
            {
                if (!w.EntityManager.TryGetBlockEntity(position, out var entity))
                {
                    var ent = new ChestBlockEntity(this, w, BlockEntityFactory.ChestTexture)
                    {
                        X = position.X & 0xf, Y = position.Y & 0xff, Z = position.Z & 0xf
                    };

                    w.EntityManager.AddBlockEntity(
                        position, ent);

                    var chunk = world.GetChunk(position, true);

                    if (chunk != null)
                    {
                        chunk.AddBlockEntity(new BlockCoordinates(ent.X, ent.Y, ent.Z), ent);
                    }
                }
            }
            return(base.BlockPlaced(world, state, position));
        }
Exemplo n.º 3
0
        private byte SetLightLevel(IBlockAccess level, ChunkColumn chunk, Chunk section, int sectionIdx, Queue <BlockCoordinates> lightBfsQueue, HashSet <BlockCoordinates> lightBfSet, BlockCoordinates coordinates, byte lightLevel, bool down = false, bool up = false)
        {
            //Interlocked.Add(ref visits, 1);

            if (TrackResults)
            {
                MakeVisit(coordinates);
            }

            if (!(up || down) && (chunk.x != coordinates.X >> 4 || chunk.z != coordinates.Z >> 4))
            {
                chunk   = level.GetChunk((ChunkCoordinates)coordinates);
                section = null;
            }
            else
            {
                if ((up || down) && coordinates.Y >> 4 != sectionIdx)
                {
                    section = null;
                }
            }

            if (chunk?.chunks == null)
            {
                return(lightLevel);
            }

            if (!down && !up && coordinates.Y >= GetHeight(coordinates, chunk))
            {
                if (GetSkyLight(coordinates, section) != 15)
                {
                    SetSkyLight(coordinates, 15, chunk);

                    if (!lightBfSet.Contains(coordinates))
                    {
                        lightBfsQueue.Enqueue(coordinates);
                        lightBfSet.Add(coordinates);
                    }
                }

                return(15);
            }

            if (section == null)
            {
                section = chunk.chunks[coordinates.Y >> 4];
            }

            bool isTransparent = IsTransparent(coordinates, section);
            byte skyLight      = GetSkyLight(coordinates, section);

            if (down && isTransparent && lightLevel == 15)
            {
                if (IsNotBlockingSkylight(coordinates, chunk))
                {
                    if (skyLight != 15)
                    {
                        SetSkyLight(coordinates, 15, chunk);
                    }

                    if (!lightBfSet.Contains(coordinates))
                    {
                        lightBfsQueue.Enqueue(coordinates);
                        lightBfSet.Add(coordinates);
                    }

                    return(15);
                }
            }

            if (isTransparent)
            {
                int diffuseLevel = GetDiffuseLevel(coordinates, section);
                if (skyLight + 1 + diffuseLevel <= lightLevel)
                {
                    byte newLevel = (byte)(lightLevel - diffuseLevel);
                    SetSkyLight(coordinates, newLevel, chunk);

                    if (!lightBfSet.Contains(coordinates))
                    {
                        lightBfsQueue.Enqueue(coordinates);
                        lightBfSet.Add(coordinates);
                    }

                    return(newLevel);
                }
            }

            return(skyLight);
        }