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); } } }
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); } }