Esempio n. 1
0
    public override string ItemUseMetaData(Vector3Int worldPosition, BlockTypeEnum blockType, BlockDirectionEnum blockDirection, string curMeta)
    {
        BlockMetaCubeHalf blockMeta = FromMetaData <BlockMetaCubeHalf>(curMeta);

        if (blockMeta == null)
        {
            blockMeta = new BlockMetaCubeHalf();
        }
        int direction = MathUtil.GetUnitTen((int)blockDirection);

        switch (direction)
        {
        case 1:
            blockMeta.SetHalfPosition(DirectionEnum.Down);
            break;

        case 2:
            blockMeta.SetHalfPosition(DirectionEnum.UP);
            break;

        case 3:
            blockMeta.SetHalfPosition(DirectionEnum.Right);
            break;

        case 4:
            blockMeta.SetHalfPosition(DirectionEnum.Left);
            break;

        case 5:
            blockMeta.SetHalfPosition(DirectionEnum.Forward);
            break;

        case 6:
            blockMeta.SetHalfPosition(DirectionEnum.Back);
            break;
        }
        return(ToMetaData(blockMeta));
    }
    public virtual bool CheckNeedBuildFace(Chunk chunk, Vector3Int localPosition, BlockDirectionEnum direction, DirectionEnum closeDirection, BlockMetaCubeHalf blockMeta)
    {
        if (localPosition.y == 0)
        {
            return(false);
        }
        GetCloseRotateBlockByDirection(chunk, localPosition, direction, closeDirection, out Block closeBlock, out Chunk closeBlockChunk, out Vector3Int closeLocalPosition);
        if (closeBlockChunk != null && closeBlockChunk.isInit)
        {
            if (closeBlock == null || closeBlock.blockType == BlockTypeEnum.None)
            {
                //只是空气方块
                return(true);
            }
        }
        else
        {
            //还没有生成chunk
            return(false);
        }

        BlockShapeEnum blockShape = closeBlock.blockInfo.GetBlockShape();

        switch (blockShape)
        {
        case BlockShapeEnum.Cube:
            return(CheckNeedBuildFaceForCube(closeDirection, blockMeta));

        case BlockShapeEnum.CubeHalf:
            BlockBean         blockData      = closeBlockChunk.GetBlockData(closeLocalPosition);
            BlockMetaCubeHalf blockMetaClose = blockData.GetBlockMeta <BlockMetaCubeHalf>();
            return(CheckNeedBuilFaceForCubeHalf(closeDirection, blockMeta, blockMetaClose));

        default:
            return(true);
        }
    }
    protected virtual bool CheckNeedBuilFaceForCubeHalf(DirectionEnum faceDirection, BlockMetaCubeHalf blockMeta, BlockMetaCubeHalf blockMetaClose)
    {
        DirectionEnum halfPosition      = blockMeta.GetHalfPosition();
        DirectionEnum halfPositionClose = blockMetaClose.GetHalfPosition();

        switch (faceDirection)
        {
        case DirectionEnum.Down:
            if (halfPosition == DirectionEnum.UP)
            {
                return(true);
            }
            else
            {
                switch (halfPositionClose)
                {
                case DirectionEnum.Down:
                    return(true);

                case DirectionEnum.UP:
                    return(false);

                case DirectionEnum.Left:
                    if (halfPosition == halfPositionClose)
                    {
                        return(false);
                    }
                    else
                    {
                        return(true);
                    }

                case DirectionEnum.Right:
                    if (halfPosition == halfPositionClose)
                    {
                        return(false);
                    }
                    else
                    {
                        return(true);
                    }

                case DirectionEnum.Forward:
                    if (halfPosition == halfPositionClose)
                    {
                        return(false);
                    }
                    else
                    {
                        return(true);
                    }

                case DirectionEnum.Back:
                    if (halfPosition == halfPositionClose)
                    {
                        return(false);
                    }
                    else
                    {
                        return(true);
                    }

                default:
                    return(false);
                }
            }

        case DirectionEnum.UP:
            if (halfPosition == DirectionEnum.Down)
            {
                return(true);
            }
            else
            {
                switch (halfPositionClose)
                {
                case DirectionEnum.Down:
                    return(false);

                case DirectionEnum.UP:
                    return(true);

                case DirectionEnum.Left:
                    if (halfPosition == halfPositionClose)
                    {
                        return(false);
                    }
                    else
                    {
                        return(true);
                    }

                case DirectionEnum.Right:
                    if (halfPosition == halfPositionClose)
                    {
                        return(false);
                    }
                    else
                    {
                        return(true);
                    }

                case DirectionEnum.Forward:
                    if (halfPosition == halfPositionClose)
                    {
                        return(false);
                    }
                    else
                    {
                        return(true);
                    }

                case DirectionEnum.Back:
                    if (halfPosition == halfPositionClose)
                    {
                        return(false);
                    }
                    else
                    {
                        return(true);
                    }

                default:
                    return(false);
                }
            }

        case DirectionEnum.Left:
            if (halfPosition == DirectionEnum.Right)
            {
                return(true);
            }
            else
            {
                switch (halfPositionClose)
                {
                case DirectionEnum.Down:
                    if (halfPosition == halfPositionClose)
                    {
                        return(false);
                    }
                    else
                    {
                        return(true);
                    }

                case DirectionEnum.UP:
                    if (halfPosition == halfPositionClose)
                    {
                        return(false);
                    }
                    else
                    {
                        return(true);
                    }

                case DirectionEnum.Left:
                    return(true);

                case DirectionEnum.Right:
                    return(false);

                case DirectionEnum.Forward:
                    if (halfPosition == halfPositionClose)
                    {
                        return(false);
                    }
                    else
                    {
                        return(true);
                    }

                case DirectionEnum.Back:
                    if (halfPosition == halfPositionClose)
                    {
                        return(false);
                    }
                    else
                    {
                        return(true);
                    }

                default:
                    return(false);
                }
            }

        case DirectionEnum.Right:
            if (halfPosition == DirectionEnum.Left)
            {
                return(true);
            }
            else
            {
                switch (halfPositionClose)
                {
                case DirectionEnum.Down:
                    if (halfPosition == halfPositionClose)
                    {
                        return(false);
                    }
                    else
                    {
                        return(true);
                    }

                case DirectionEnum.UP:
                    if (halfPosition == halfPositionClose)
                    {
                        return(false);
                    }
                    else
                    {
                        return(true);
                    }

                case DirectionEnum.Left:
                    return(false);

                case DirectionEnum.Right:
                    return(true);

                case DirectionEnum.Forward:
                    if (halfPosition == halfPositionClose)
                    {
                        return(false);
                    }
                    else
                    {
                        return(true);
                    }

                case DirectionEnum.Back:
                    if (halfPosition == halfPositionClose)
                    {
                        return(false);
                    }
                    else
                    {
                        return(true);
                    }

                default:
                    return(false);
                }
            }

        case DirectionEnum.Forward:
            if (halfPosition == DirectionEnum.Back)
            {
                return(true);
            }
            else
            {
                switch (halfPositionClose)
                {
                case DirectionEnum.Down:
                    if (halfPosition == halfPositionClose)
                    {
                        return(false);
                    }
                    else
                    {
                        return(true);
                    }

                case DirectionEnum.UP:
                    if (halfPosition == halfPositionClose)
                    {
                        return(false);
                    }
                    else
                    {
                        return(true);
                    }

                case DirectionEnum.Left:
                    if (halfPosition == halfPositionClose)
                    {
                        return(false);
                    }
                    else
                    {
                        return(true);
                    }

                case DirectionEnum.Right:
                    if (halfPosition == halfPositionClose)
                    {
                        return(false);
                    }
                    else
                    {
                        return(true);
                    }

                case DirectionEnum.Forward:
                    return(true);

                case DirectionEnum.Back:
                    return(false);

                default:
                    return(false);
                }
            }

        case DirectionEnum.Back:
            if (halfPosition == DirectionEnum.Forward)
            {
                return(true);
            }
            else
            {
                switch (halfPositionClose)
                {
                case DirectionEnum.Down:
                    if (halfPosition == halfPositionClose)
                    {
                        return(false);
                    }
                    else
                    {
                        return(true);
                    }

                case DirectionEnum.UP:
                    if (halfPosition == halfPositionClose)
                    {
                        return(false);
                    }
                    else
                    {
                        return(true);
                    }

                case DirectionEnum.Left:
                    if (halfPosition == halfPositionClose)
                    {
                        return(false);
                    }
                    else
                    {
                        return(true);
                    }

                case DirectionEnum.Right:
                    if (halfPosition == halfPositionClose)
                    {
                        return(false);
                    }
                    else
                    {
                        return(true);
                    }

                case DirectionEnum.Forward:
                    return(false);

                case DirectionEnum.Back:
                    return(true);

                default:
                    return(false);
                }
            }

        default:
            return(false);
        }
    }
    /// <summary>
    /// 构建方块的六个面
    /// </summary>
    /// <param name="chunk"></param>
    /// <param name="position"></param>
    /// <param name="blockData"></param>
    /// <param name="verts"></param>
    /// <param name="uvs"></param>
    /// <param name="tris"></param>
    public override void BuildBlock(Chunk chunk, Vector3Int localPosition)
    {
        if (block.blockType != BlockTypeEnum.None)
        {
            //只有在能旋转的时候才去查询旋转方向
            BlockDirectionEnum direction = BlockDirectionEnum.UpForward;
            if (block.blockInfo.rotate_state != 0)
            {
                direction = chunk.chunkData.GetBlockDirection(localPosition.x, localPosition.y, localPosition.z);
            }
            BlockBean         blockData = chunk.GetBlockData(localPosition);
            BlockMetaCubeHalf blockMeta = blockData.GetBlockMeta <BlockMetaCubeHalf>();
            if (blockMeta == null)
            {
                blockMeta = new BlockMetaCubeHalf();
                blockMeta.SetHalfPosition(DirectionEnum.Down);
            }

            DirectionEnum halfPosition = blockMeta.GetHalfPosition();

            Vector3[][] arrayVertsData = null;
            Vector2[][] arrayUvsData   = null;
            switch (halfPosition)
            {
            case DirectionEnum.UP:
                arrayVertsData = vertsAddHalfUp;
                arrayUvsData   = uvsAddHalfUp;
                break;

            case DirectionEnum.Down:
                arrayVertsData = vertsAddHalfDown;
                arrayUvsData   = uvsAddHalfDown;
                break;

            case DirectionEnum.Left:
                arrayVertsData = vertsAddHalfLeft;
                arrayUvsData   = uvsAddHalfLeft;
                break;

            case DirectionEnum.Right:
                arrayVertsData = vertsAddHalfRight;
                arrayUvsData   = uvsAddHalfRight;
                break;

            case DirectionEnum.Forward:
                arrayVertsData = vertsAddHalfForward;
                arrayUvsData   = uvsAddHalfForward;
                break;

            case DirectionEnum.Back:
                arrayVertsData = vertsAddHalfBack;
                arrayUvsData   = uvsAddHalfBack;
                break;
            }

            //Left
            if (CheckNeedBuildFace(chunk, localPosition, direction, DirectionEnum.Left, blockMeta))
            {
                Vector3[] useVertsAddLeft = arrayVertsData[0];
                Vector2[] useUvsAddLeft   = arrayUvsData[0];
                BuildFace(chunk, localPosition, direction, DirectionEnum.Left, useVertsAddLeft, useUvsAddLeft, colorsAdd, trisAdd);
            }

            //Right
            if (CheckNeedBuildFace(chunk, localPosition, direction, DirectionEnum.Right, blockMeta))
            {
                Vector3[] useVertsAddRight = arrayVertsData[1];
                Vector2[] useUvsAddRight   = arrayUvsData[1];
                BuildFace(chunk, localPosition, direction, DirectionEnum.Right, useVertsAddRight, useUvsAddRight, colorsAdd, trisAdd);
            }

            //Bottom
            if (CheckNeedBuildFace(chunk, localPosition, direction, DirectionEnum.Down, blockMeta))
            {
                Vector3[] useVertsAddDown = arrayVertsData[3];
                Vector2[] useUvsAddDown   = arrayUvsData[3];
                BuildFace(chunk, localPosition, direction, DirectionEnum.Down, useVertsAddDown, useUvsAddDown, colorsAdd, trisAdd);
            }

            //Top
            if (CheckNeedBuildFace(chunk, localPosition, direction, DirectionEnum.UP, blockMeta))
            {
                Vector3[] useVertsAddUp = arrayVertsData[2];
                Vector2[] useUvsAddUp   = arrayUvsData[2];
                BuildFace(chunk, localPosition, direction, DirectionEnum.UP, useVertsAddUp, useUvsAddUp, colorsAdd, trisAdd);
            }

            //Forward
            if (CheckNeedBuildFace(chunk, localPosition, direction, DirectionEnum.Forward, blockMeta))
            {
                Vector3[] useVertsAddForward = arrayVertsData[4];
                Vector2[] useUvsAddForward   = arrayUvsData[4];
                BuildFace(chunk, localPosition, direction, DirectionEnum.Forward, useVertsAddForward, useUvsAddForward, colorsAdd, trisAdd);
            }

            //Back
            if (CheckNeedBuildFace(chunk, localPosition, direction, DirectionEnum.Back, blockMeta))
            {
                Vector3[] useVertsAddBack = arrayVertsData[5];
                Vector2[] useUvsAddBack   = arrayUvsData[5];
                BuildFace(chunk, localPosition, direction, DirectionEnum.Back, useVertsAddBack, useUvsAddBack, colorsAdd, trisAdd);
            }
        }
    }
Esempio n. 5
0
    public override void ItemUse(
        Vector3Int targetWorldPosition, BlockDirectionEnum targetBlockDirection, Block targetBlock, Chunk targetChunk,
        Vector3Int closeWorldPosition, BlockDirectionEnum closeBlockDirection, Block closeBlock, Chunk closeChunk,
        BlockDirectionEnum direction, string metaData)
    {
        //如果同样是半砖 并且是同一种类
        if (targetBlock.blockInfo.GetBlockShape() == BlockShapeEnum.CubeHalf && targetBlock.blockType == blockType)
        {
            BlockBean         targetBlockData = targetChunk.GetBlockData(targetWorldPosition - targetChunk.chunkData.positionForWorld);
            BlockMetaCubeHalf targetMetaData  = targetBlockData.GetBlockMeta <BlockMetaCubeHalf>();
            BlockMetaCubeHalf curMetaData     = FromMetaData <BlockMetaCubeHalf>(metaData);

            DirectionEnum targetHalfPosition = targetMetaData.GetHalfPosition();
            DirectionEnum curHalfPosition    = curMetaData.GetHalfPosition();
            bool          isMerge            = false;
            switch (targetHalfPosition)
            {
            case DirectionEnum.UP:
                if (curHalfPosition == DirectionEnum.UP)
                {
                    isMerge = true;
                }
                break;

            case DirectionEnum.Down:
                if (curHalfPosition == DirectionEnum.Down)
                {
                    isMerge = true;
                }
                break;

            case DirectionEnum.Left:
                if (curHalfPosition == DirectionEnum.Left)
                {
                    isMerge = true;
                }
                break;

            case DirectionEnum.Right:
                if (curHalfPosition == DirectionEnum.Right)
                {
                    isMerge = true;
                }
                break;

            case DirectionEnum.Forward:
                if (curHalfPosition == DirectionEnum.Forward)
                {
                    isMerge = true;
                }
                break;

            case DirectionEnum.Back:
                if (curHalfPosition == DirectionEnum.Back)
                {
                    isMerge = true;
                }
                break;
            }
            if (isMerge)
            {
                targetChunk.SetBlockForWorld(targetWorldPosition, (BlockTypeEnum)blockInfo.remark_int, BlockDirectionEnum.UpForward);
            }
            else
            {
                base.ItemUse(targetWorldPosition, targetBlockDirection, targetBlock, targetChunk, closeWorldPosition, closeBlockDirection, closeBlock, closeChunk, direction, metaData);
            }
        }
        else
        {
            base.ItemUse(targetWorldPosition, targetBlockDirection, targetBlock, targetChunk, closeWorldPosition, closeBlockDirection, closeBlock, closeChunk, direction, metaData);
        }
    }