private void SpreadInPos(int x, int y, int z, Chunk chunk, int curLightLevel) { //光照强度小于等于1时不再传播 if (curLightLevel < 2) { return; } Block b = chunk.GetBlock(x, y, z, true); BlockAttributeCalculator calculator = BlockAttributeCalculatorFactory.GetCalculator(b.BlockType); int lightDamp = calculator.LightDamp(b.ExtendId); if (lightDamp < WorldConfig.Instance.maxLightLevel) { int lightLevel = chunk.GetBlockLight(x, y, z); int nextLightLevel = curLightLevel - lightDamp - 1; if (nextLightLevel > lightLevel) { int curBlockLightLevel = calculator.LightLevel(b.ExtendId); if (curBlockLightLevel > nextLightLevel) { nextLightLevel = curBlockLightLevel; } SetLight(chunk, x, y, z, nextLightLevel); } } }
private List <Chunk> GetBlockLightChangeChunks(Chunk chunk, int x, int y, int z, Block b, List <Chunk> list) { BlockAttributeCalculator calculator = BlockAttributeCalculatorFactory.GetCalculator(b.BlockType); int curBlockLightLevel = calculator.LightLevel(b.ExtendId); int blockLightLevel = chunk.GetBlockLight(x, y, z, true); if (curBlockLightLevel > blockLightLevel) { int index = (x * Chunk.chunkDepth + z) * Chunk.chunkHeight + y; LightSpreadNode node = NodeCache.Instance.GetSpreadNode(index, curBlockLightLevel, chunk); _blockLightSpread.AddSpreadNode(node); chunk.SetBlockLight(x, y, z, curBlockLightLevel, true); } else if (curBlockLightLevel < blockLightLevel) { int index = (x * Chunk.chunkDepth + z) * Chunk.chunkHeight + y; LightShrinkNode node = NodeCache.Instance.GetShrinkNode(index, blockLightLevel, curBlockLightLevel, chunk); _blockLightShrink.AddShrinkNode(node); chunk.SetBlockLight(x, y, z, curBlockLightLevel, true); } List <Chunk> spreadList = _blockLightSpread.SpreadInChunk(chunk); List <Chunk> shrinkList = _blockLightShrink.ShrinkInChunk(chunk); for (int i = 0; i < spreadList.Count; i++) { if (!list.Contains(spreadList[i])) { list.Add(spreadList[i]); } } for (int i = 0; i < shrinkList.Count; i++) { if (!list.Contains(shrinkList[i])) { list.Add(shrinkList[i]); } } return(list); }