Esempio n. 1
0
    /// <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;
    }
Esempio n. 2
0
    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);
    }
Esempio n. 3
0
    /// <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);
    }
Esempio n. 4
0
    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];
                }
            }
        }
    }
Esempio n. 5
0
    /// <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);
            }
        }
    }