/// <summary> /// 检测四周方块是否漏水 /// </summary> /// <returns></returns> protected void CheckRangeBlockLeak(Vector3Int worldPosition) { WorldCreateHandler.Instance.manager.GetBlockForWorldPosition(worldPosition, out Block closeBlock, out BlockDirectionEnum closeBlockDirection, out Chunk closeChunk); if (closeChunk == null) { //如果没有区块 则不处理 return; } else { if (closeBlock == null || closeBlock.blockType == BlockTypeEnum.None) { BlockMetaLiquid blockLiquid = new BlockMetaLiquid(); blockLiquid.level = 1; //如果没有方块 则漏水 closeChunk.SetBlockForWorld(worldPosition, blockType, BlockDirectionEnum.UpForward, ToMetaData(blockLiquid)); return; } else { //如果是重量为1的 则冲散 if (closeBlock.blockInfo.weight == 1) { BlockMetaLiquid blockLiquid = new BlockMetaLiquid(); blockLiquid.level = 1; closeChunk.SetBlockForWorld(worldPosition, blockType, BlockDirectionEnum.UpForward, ToMetaData(blockLiquid)); //创建掉落 ItemsHandler.Instance.CreateItemCptDrop(closeBlock, closeChunk, worldPosition); return; } } } return; }
protected virtual void BaseAddVertsUVsTrisDetails(Chunk chunk, Vector3Int localPosition, BlockDirectionEnum direction, DirectionEnum face, Vector3[] vertsAdd, Vector2[] uvsAdd, Color[] colorsAdd) { BlockBean blockData = chunk.GetBlockData(localPosition); if (blockData != null) { BlockMetaLiquid blockLiquid = Block.FromMetaData <BlockMetaLiquid>(blockData.meta); if (blockLiquid != null) { if (blockLiquid.level == 1) { Vector3[] vertsAddNew = GetAddVertsNew(chunk, localPosition, face, vertsAdd); //获取四周的方块 base.BaseAddVertsUVsColors(chunk, localPosition, direction, face, vertsAddNew, uvsAdd, colorsAdd); return; } } } base.BaseAddVertsUVsColors(chunk, localPosition, direction, face, vertsAdd, uvsAdd, colorsAdd); }
/// <summary> /// 检测四周是否有基础水方块 /// </summary> protected int CheckRangeBlockWater(Chunk chunk, Vector3Int worldPosition, int number) { WorldCreateHandler.Instance.manager.GetBlockForWorldPosition(worldPosition, out Block closeBlock, out BlockDirectionEnum closeBlockDirection, out Chunk closeChunk); if (closeChunk == null || closeBlock == null || closeBlock.blockType != blockType) { return(number); } BlockBean blockData = closeChunk.GetBlockData(worldPosition - closeChunk.chunkData.positionForWorld); if (blockData == null) { return(number + 1); } BlockMetaLiquid blockLiquid = FromMetaData <BlockMetaLiquid>(blockData.meta); if (blockLiquid == null || blockLiquid.level == 0) { return(number + 1); } return(number); }
protected void GetVertsAddNewForRange(Chunk chunk, DirectionEnum direction, Vector3Int localPosition, Vector3[] vertsAddNew, Vector3[] vertsAdd, int indexPosition) { block.GetCloseBlockByDirection(chunk, localPosition, direction, out Block closeBlock, out Chunk closeChunk, out Vector3Int closeLocalPosition); if (closeBlock != null && closeBlock.blockType == block.blockType) { Vector3Int tempPosition = block.GetClosePositionByDirection(direction, localPosition); Vector3Int localPositionClose = tempPosition + chunk.chunkData.positionForWorld - closeChunk.chunkData.positionForWorld; BlockBean closeBlockData = closeChunk.GetBlockData(localPositionClose); if (closeBlockData == null) { vertsAddNew[indexPosition] = vertsAdd[indexPosition]; } else { BlockMetaLiquid closeLiquid = Block.FromMetaData <BlockMetaLiquid>(closeBlockData.meta); if (closeLiquid == null || closeLiquid.level == 0) { vertsAddNew[indexPosition] = vertsAdd[indexPosition]; } } } }
/// <summary> /// 设置靠近的方块为水方块 /// </summary> /// <param name="worldPosition"></param> /// <param name="contactLevel"></param> /// <returns></returns> public void SetCloseBlock(Chunk chunk, Vector3Int worldPosition) { Vector3Int downWorldPosition = worldPosition + Vector3Int.down; WorldCreateHandler.Instance.manager.GetBlockForWorldPosition(downWorldPosition, out Block downBlock, out BlockDirectionEnum downBlockDirection, out Chunk downChunk); if (downBlock == null || downBlock.blockType == BlockTypeEnum.None) { //如果是空方块 替换成当前方块 downChunk.SetBlockForWorld(downWorldPosition, blockType); return; } else { Vector3Int upWorldPosition = worldPosition + Vector3Int.up; WorldCreateHandler.Instance.manager.GetBlockForWorldPosition(upWorldPosition, out Block upBlock, out BlockDirectionEnum upBlockDirection, out Chunk upChunk); if (downBlock.blockInfo.weight == 1) { //如果下方方块的重量是1 则冲掉下方方块 downChunk.SetBlockForWorld(downWorldPosition, blockType); //创建掉落 ItemsHandler.Instance.CreateItemCptDrop(downBlock, downChunk, downWorldPosition); } else if (downBlock.blockType == blockType) { //下方有水方块并且还不是基础方块 则设置成基础水方块 BlockBean downBlockData = downChunk.GetBlockData(downWorldPosition - downChunk.chunkData.positionForWorld); if (downBlockData != null) { BlockMetaLiquid downBlockLiquid = FromMetaData <BlockMetaLiquid>(downBlockData.meta); if (downBlockLiquid != null && downBlockLiquid.level == 1) { downChunk.SetBlockForWorld(downWorldPosition, blockType); } } } else { BlockBean blockData = chunk.GetBlockData(worldPosition - chunk.chunkData.positionForWorld); if (blockData != null) { //如果有数据 需要判断是几级水流 BlockMetaLiquid blockLiquid = FromMetaData <BlockMetaLiquid>(blockData.meta); if (blockLiquid != null) { //如果是1子级 则不再向外扩散 if (blockLiquid.level == 1) { //检测四周的基础水方块 int number = 0; number = CheckRangeBlockWater(chunk, worldPosition + Vector3Int.left, number); number = CheckRangeBlockWater(chunk, worldPosition + Vector3Int.right, number); number = CheckRangeBlockWater(chunk, worldPosition + Vector3Int.forward, number); number = CheckRangeBlockWater(chunk, worldPosition + Vector3Int.back, number); //如果有2块以上的基础水方块 则自身变为一个基础水方块 if (number >= 2) { chunk.SetBlockForWorld(worldPosition, blockType, BlockDirectionEnum.UpForward); } //如果一个基础水方块都没有 则设置为空气 if (number == 0) { chunk.SetBlockForWorld(worldPosition, BlockTypeEnum.None, BlockDirectionEnum.UpForward); } return; } } } //如果是实体方块 则判断周围是否有方块,如果周围都有镂空的方块 则水流失 CheckRangeBlockLeak(worldPosition + Vector3Int.left); CheckRangeBlockLeak(worldPosition + Vector3Int.right); CheckRangeBlockLeak(worldPosition + Vector3Int.forward); CheckRangeBlockLeak(worldPosition + Vector3Int.back); } } }