예제 #1
0
    /// <summary>
    /// 获取种植收获
    /// </summary>
    public override List <ItemsBean> GetDropItems(BlockBean blockData)
    {
        List <ItemsBean> listData = new List <ItemsBean>();

        if (blockData == null || blockData.meta.IsNull())
        {
            ItemsInfoBean itemsInfo = ItemsHandler.Instance.manager.GetItemsInfoByBlockType(blockInfo.GetBlockType());
            listData.Add(new ItemsBean(itemsInfo.id, 1));
            return(listData);
        }
        BlockMetaCrop blockCrop = FromMetaData <BlockMetaCrop>(blockData.meta);

        Vector2Int[] uvPosition = blockInfo.GetUVPosition();
        if (blockCrop.growPro >= uvPosition.Length - 1)
        {
            //已经成熟
            listData = base.GetDropItems(blockData);
        }
        else
        {
            //没有成熟
            ItemsInfoBean itemsInfo = ItemsHandler.Instance.manager.GetItemsInfoByBlockType(blockInfo.GetBlockType());
            listData.Add(new ItemsBean(itemsInfo.id, 1));
        }
        return(listData);
    }
예제 #2
0
    /// <summary>
    /// 删除链接方块
    /// </summary>
    /// <param name="chunk"></param>
    /// <param name="localPosition"></param>
    /// <param name="direction"></param>
    /// <param name="listLink"></param>
    public void DestoryLinkBlock(Chunk chunk, Vector3Int localPosition, BlockDirectionEnum direction, List <Vector3Int> listLink)
    {
        Vector3Int baseWorldPosition = localPosition + chunk.chunkData.positionForWorld;
        //获取数据
        BlockBean blockData = chunk.GetBlockData(localPosition);

        //延迟一帧执行 等当前方块已经删除了
        chunk.chunkComponent.WaitExecuteEndOfFrame(1, () =>
        {
            if (blockData != null)
            {
                BlockMetaDoor blockDoorData = FromMetaData <BlockMetaDoor>(blockData.meta);
                if (blockDoorData != null)
                {
                    //如果是子级 则不生成
                    if (blockDoorData.level > 0)
                    {
                        baseWorldPosition = blockDoorData.linkBasePosition.GetVector3Int();
                        //删除基础方块
                        chunk.SetBlockForWorld(baseWorldPosition, BlockTypeEnum.None);
                    }
                }
            }

            //如果不是子级 则说明是基础方块 从这里开始删除方块
            for (int i = 0; i < listLink.Count; i++)
            {
                Vector3Int linkPosition       = listLink[i];
                Vector3Int closeWorldPosition = baseWorldPosition + linkPosition;
                chunk.SetBlockForWorld(closeWorldPosition, BlockTypeEnum.None);
            }
        });
    }
예제 #3
0
    public override List <ItemsBean> GetDropItems(BlockBean blockData)
    {
        List <ItemsBean> listData  = base.GetDropItems(blockData);
        ItemsInfoBean    itemsInfo = ItemsHandler.Instance.manager.GetItemsInfoByBlockType(blockData.GetBlockType());

        //加一个自己
        listData.Add(new ItemsBean(itemsInfo.id, 1, null));
        //添加箱子里的物品
        if (blockData == null)
        {
            return(listData);
        }
        BlockMetaBox blockBoxData = FromMetaData <BlockMetaBox>(blockData.meta);

        if (blockBoxData == null)
        {
            return(listData);
        }
        for (int i = 0; i < blockBoxData.items.Length; i++)
        {
            ItemsBean itemData = blockBoxData.items[i];
            listData.Add(itemData);
        }
        return(listData);
    }
예제 #4
0
    protected override void BaseAddTrisForCustom(Chunk chunk, Vector3Int localPosition, BlockDirectionEnum blockDirection, int[] trisAdd)
    {
        BlockBean    blockData     = chunk.GetBlockData(localPosition.x, localPosition.y, localPosition.z);
        BlockMetaBed blockMetaData = Block.FromMetaData <BlockMetaBed>(blockData.meta);

        //只有基础链接才绘制床
        if (blockMetaData != null && blockMetaData.level == 0)
        {
            int        index    = chunk.chunkMeshData.verts.Count;
            List <int> trisData = chunk.chunkMeshData.dicTris[block.blockInfo.material_type];
            AddTris(index, trisData, trisAdd);
        }

        if (block.blockInfo.collider_state == 1)
        {
            List <int> trisCollider  = chunk.chunkMeshData.trisCollider;
            int        colliderIndex = chunk.chunkMeshData.vertsCollider.Count;
            AddTris(colliderIndex, trisCollider, trisColliderAddCustom);
        }
        else if (block.blockInfo.trigger_state == 1)
        {
            List <int> trisTrigger  = chunk.chunkMeshData.trisTrigger;
            int        triggerIndex = chunk.chunkMeshData.vertsTrigger.Count;
            AddTris(triggerIndex, trisTrigger, trisColliderAddCustom);
        }
    }
예제 #5
0
    /// <summary>
    /// 处理 读取的方块
    /// </summary>
    public void HandleForLoadBlock()
    {
        GameDataManager gameDataManager = GameDataHandler.Instance.manager;
        //获取数据中的chunk
        UserDataBean userData = gameDataManager.GetUserData();

        ChunkSaveBean chunkSaveData = gameDataManager.GetChunkSaveData(userData.userId, WorldCreateHandler.Instance.manager.worldType, chunkData.positionForWorld);

        //如果没有世界数据 则创建一个
        if (chunkSaveData == null)
        {
            chunkSaveData           = new ChunkSaveBean();
            chunkSaveData.workdType = (int)WorldCreateHandler.Instance.manager.worldType;
            chunkSaveData.userId    = userData.userId;
            chunkSaveData.position  = chunkData.positionForWorld;
        }
        chunkSaveData.InitData();
        Dictionary <int, BlockBean> dicBlockData = chunkSaveData.dicBlockData;

        foreach (var itemData in dicBlockData)
        {
            BlockBean  blockData     = itemData.Value;
            Vector3Int positionBlock = blockData.localPosition;

            //添加方块 如果已经有该方块 则先删除,优先使用存档的方块
            //chunkData.GetBlockForLocal(positionBlock, out Block block, out DirectionEnum direction);

            Block block = BlockHandler.Instance.manager.GetRegisterBlock(blockData.blockId);
            chunkData.SetBlockForLocal(positionBlock, block, blockData.direction);
        }
        SetChunkSaveData(chunkSaveData);
    }
예제 #6
0
    /// <summary>
    /// 破碎方块
    /// </summary>
    /// <param name="damage"></param>
    public void Break(int damage, bool isPlayEffect = true)
    {
        //重置刷新时间
        timeForUpdate = 0;

        //生命值扣除
        blockLife -= damage;
        if (blockLife < 0)
        {
            blockLife = 0;
        }
        else if (blockLife > block.blockInfo.life)
        {
            blockLife = block.blockInfo.life;
        }

        float breakPro;

        if (block.blockInfo.life != 0)
        {
            breakPro = 1 - ((float)blockLife / block.blockInfo.life);
        }
        else
        {
            breakPro = 1;
        }
        SetBreakPro(breakPro);

        //播放粒子特效
        if (isPlayEffect)
        {
            PlayBlockCptBreakEffect(block, worldPosition);
        }

        WorldCreateHandler.Instance.manager.GetBlockForWorldPosition(worldPosition, out Block targetBlock, out BlockDirectionEnum targetDirection, out Chunk targetChunk);
        Vector3Int localPosition = worldPosition - targetChunk.chunkData.positionForWorld;
        //设置破坏的形状
        Mesh newMeshData = block.blockShape.GetCompleteMeshData(targetChunk, localPosition, targetDirection);

        Vector2[] newUVS = new Vector2[newMeshData.vertices.Length];
        for (int i = 0; i < newMeshData.vertices.Length; i++)
        {
            int indexUV = i % 4;
            newUVS[i] = uvList[indexUV];
        }
        newMeshData.SetUVs(0, newUVS);
        mfBlockBreak.mesh = newMeshData;

        //设置方向
        tfCenter.eulerAngles = targetBlock.GetRotateAngles(targetDirection);
        tfCenter.localScale  = new Vector3(1.001f, 1.001f, 1.001f);

        //如果是link类型,
        if (targetBlock.blockInfo.GetBlockShape() == BlockShapeEnum.CustomLink)
        {
            BlockBean         blockData         = targetChunk.GetBlockData(localPosition.x, localPosition.y, localPosition.z);
            BlockMetaBaseLink blockMetaBaseLink = Block.FromMetaData <BlockMetaBaseLink>(blockData.meta);
            transform.position = blockMetaBaseLink.GetBasePosition();
        }
    }
예제 #7
0
    /// <summary>
    /// 创建道具掉落
    /// </summary>
    /// <param name="oldBlock"></param>
    /// <param name="targetChunk"></param>
    /// <param name="targetPosition"></param>
    public void CreateItemCptDrop(Block targetBlock, Chunk targetChunk, Vector3Int targetWorldPosition)
    {
        BlockBean blockData = targetChunk.GetBlockData(targetWorldPosition - targetChunk.chunkData.positionForWorld);

        //如果是种植类物品
        if (targetBlock.blockInfo.GetBlockShape() == BlockShapeEnum.CropCross ||
            targetBlock.blockInfo.GetBlockShape() == BlockShapeEnum.CropCrossOblique ||
            targetBlock.blockInfo.GetBlockShape() == BlockShapeEnum.CropWell)
        {
            //首先判断生长周期

            //获取种植收货
            List <ItemsBean> listHarvest = targetBlock.GetDropItems(blockData);
            //创建掉落物
            CreateItemCptDropList(listHarvest, targetWorldPosition + Vector3.one * 0.5f, ItemDropStateEnum.DropPick);
        }
        else
        {
            //获取掉落道具
            List <ItemsBean> listDrop = targetBlock.GetDropItems(blockData);
            //如果没有掉落物,则默认掉落本体一个
            if (listDrop.IsNull())
            {
                //创建掉落物
                string blockMeta = blockData == null ? null : blockData.meta;
                CreateItemCptDrop(targetBlock.blockType, 1, blockMeta, targetWorldPosition + Vector3.one * 0.5f, ItemDropStateEnum.DropPick);
            }
            else
            {
                //创建掉落物
                CreateItemCptDropList(listDrop, targetWorldPosition + Vector3.one * 0.5f, ItemDropStateEnum.DropPick);
            }
        }
    }
예제 #8
0
    /// <summary>
    /// 保存链接数据
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="chunk"></param>
    /// <param name="baseWorldPosition"></param>
    /// <param name="listLinkPosition"></param>
    /// <param name="data"></param>
    public void SaveLinkBaseBlockData <T>(Vector3Int baseWorldPosition, T data) where T : BlockMetaBaseLink
    {
        WorldCreateHandler.Instance.manager.GetBlockForWorldPosition(baseWorldPosition, out Block baseBlock, out Chunk baseChunk);
        BlockBean baseBlockData = baseChunk.GetBlockDataForWorldPosition(baseWorldPosition);

        baseBlockData.meta = ToMetaData(data);
        baseChunk.SetBlockData(baseBlockData);
    }
예제 #9
0
    /// <summary>
    /// 设置存储方块数据
    /// </summary>
    /// <param name="blockData"></param>
    public void SetBlockData(BlockBean blockData, bool isSaveData = true)
    {
        int index = chunkData.GetIndexByPosition(blockData.localPosition);

        chunkSaveData.dicBlockData[index] = blockData;

        //异步保存数据
        this.isSaveData = isSaveData;
    }
예제 #10
0
    /// <summary>
    /// 互动
    /// </summary>
    public override void Interactive(GameObject user, Vector3Int worldPosition, BlockDirectionEnum direction)
    {
        //暂时解除控制
        ControlForPlayer controlForPlayer = GameControlHandler.Instance.manager.controlForPlayer;
        ControlForCamera controlForCamera = GameControlHandler.Instance.manager.controlForCamera;

        controlForPlayer.EnabledControl(false);
        controlForCamera.EnabledControl(false);

        CameraHandler.Instance.SetCameraAxis(-70, 0);
        //获取链接数据
        WorldCreateHandler.Instance.manager.GetBlockForWorldPosition(worldPosition, out Block targetBlock, out BlockDirectionEnum targetDirection, out Chunk targetChunk);
        BlockBean    blockData     = targetChunk.GetBlockData(worldPosition - targetChunk.chunkData.positionForWorld);
        BlockMetaBed blockMetaData = GetLinkBaseBlockData <BlockMetaBed>(blockData.meta);

        //获取身体的旋转角度
        float angleY = direction == BlockDirectionEnum.UpForward
            ? 0 : direction == BlockDirectionEnum.UpBack
            ? 180 : direction == BlockDirectionEnum.UpLeft
            ? 90 : direction == BlockDirectionEnum.UpRight
            ? -90 : 0;
        //获取身体偏移位置
        float moveX = direction == BlockDirectionEnum.UpLeft
            ? 0.5f : direction == BlockDirectionEnum.UpRight
            ? -0.5f : 0;
        float moveZ = direction == BlockDirectionEnum.UpForward
            ? 0.5f : direction == BlockDirectionEnum.UpBack
            ? -0.5f : 0;

        Player player = GameHandler.Instance.manager.player;

        player.transform.position    = blockMetaData.GetBasePosition() + new Vector3(0.5f, 0.5f, 0.5f);
        player.transform.eulerAngles = new Vector3(0, 180, 0);
        player.character.transform.localEulerAngles = new Vector3(-90, angleY, 0);
        player.character.transform.localPosition    = new Vector3(moveX, 0, moveZ);
        //设置时间
        GameTimeHandler.Instance.SetGameTime(6, 0);

        Action callBackForFinish = () =>
        {
            //恢复控制
            controlForPlayer.EnabledControl(true);
            controlForCamera.EnabledControl(true);
            player.character.transform.localEulerAngles = new Vector3(0, 0, 0);
            player.character.transform.localPosition    = new Vector3(0, 0, 0);
        };

        GameTimeHandler.Instance.WaitExecuteSeconds(3, callBackForFinish);

        //保存位置
        UserDataBean userData = GameDataHandler.Instance.manager.GetUserData();

        userData.userPosition.SetWorldType(WorldCreateHandler.Instance.manager.worldType);
        userData.userPosition.SetPosition(player.transform.position);
        GameDataHandler.Instance.manager.SaveUserData(userData);
    }
예제 #11
0
    /// <summary>
    /// 获取存储的方块数据
    /// </summary>
    public BlockBean GetBlockData(int x, int y, int z)
    {
        if (chunkSaveData == null)
        {
            return(null);
        }
        BlockBean blockData = chunkSaveData.GetBlockData(x, y, z);

        return(blockData);
    }
예제 #12
0
 /// <summary>
 /// 设置数据
 /// </summary>
 /// <param name="worldPosition"></param>
 public void SetData(Vector3Int worldPosition)
 {
     this.blockWorldPosition = worldPosition;
     //获取对应方块
     WorldCreateHandler.Instance.manager.GetBlockForWorldPosition(worldPosition, out Block block, out Chunk chunk);
     blockBox = block as BlockBaseBox;
     //获取方块数据
     blockData = chunk.GetBlockData(worldPosition - chunk.chunkData.positionForWorld);
     //设置数据
     ui_ViewBoxList.SetData(worldPosition, blockData);
 }
예제 #13
0
    /// <summary>
    /// 创建链接的方块
    /// </summary>
    public virtual void CreateLinkBlock(Chunk chunk, Vector3Int localPosition, List <Vector3Int> listLink)
    {
        //获取数据
        BlockBean blockData = chunk.GetBlockData(localPosition);

        if (blockData != null)
        {
            BlockMetaDoor blockDoorData = FromMetaData <BlockMetaDoor>(blockData.meta);
            if (blockDoorData != null)
            {
                //如果是子级 则不生成
                if (blockDoorData.level > 0)
                {
                    return;
                }
            }
        }
        //判断是否在指定的link坐标上有其他方块,如果有则生成道具
        bool hasBlock = false;

        for (int i = 0; i < listLink.Count; i++)
        {
            Vector3Int linkPosition       = listLink[i];
            Vector3Int closeWorldPosition = localPosition + chunk.chunkData.positionForWorld + linkPosition;
            chunk.GetBlockForWorld(closeWorldPosition, out Block closeBlock, out BlockDirectionEnum closeDirection, out Chunk closeChunk);
            if (closeBlock != null && closeBlock.blockType != BlockTypeEnum.None)
            {
                hasBlock = true;
                break;
            }
        }
        if (hasBlock)
        {
            //创建道具
            chunk.SetBlockForLocal(localPosition, BlockTypeEnum.None);
            ItemsHandler.Instance.CreateItemCptDrop(this, chunk, localPosition + chunk.chunkData.positionForWorld);
        }
        else
        {
            //创建link方块
            for (int i = 0; i < listLink.Count; i++)
            {
                Vector3Int    linkPosition       = listLink[i];
                Vector3Int    closeWorldPosition = localPosition + chunk.chunkData.positionForWorld + linkPosition;
                BlockMetaDoor blockDoor          = new BlockMetaDoor();
                blockDoor.level            = 1;
                blockDoor.linkBasePosition = new Vector3IntBean(localPosition + chunk.chunkData.positionForWorld);
                BlockDirectionEnum blockDirection = chunk.chunkData.GetBlockDirection(localPosition.x, localPosition.y, localPosition.z);
                chunk.SetBlockForWorld(closeWorldPosition, blockType, blockDirection, ToMetaData(blockDoor));
            }
        }
    }
예제 #14
0
    public override void RefreshCrop(Chunk chunk, Vector3Int localPosition, BlockInfoBean blockInfo)
    {
        base.RefreshCrop(chunk, localPosition, blockInfo);
        BlockBean blockData = chunk.GetBlockData(localPosition);
        //获取成长周期
        BlockMetaCrop blockCropData = FromMetaData <BlockMetaCrop>(blockData.meta);

        //如果是等级大于0的子集 则不继续往上生长
        if (blockCropData.uvIndex > 0)
        {
            return;
        }

        //判断是否已经是最大生长周期
        int lifeCycle = GetCropLifeCycle();

        if (blockCropData.growPro >= lifeCycle - 1)
        {
            //在玉米的上2格再生成同样的方格

            //更新方块并 添加更新区块
            GetCloseBlockByDirection(chunk, localPosition, DirectionEnum.UP, out Block blockUp, out Chunk chunkUp, out Vector3Int localPositionUp);
            GetCloseBlockByDirection(chunk, localPosition + Vector3Int.up, DirectionEnum.UP, out Block blockUpUp, out Chunk chunkUpUp, out Vector3Int localPositionUpUp);

            if (chunkUp != null && blockUp != null && blockUp.blockType != BlockTypeEnum.None)
            {
                return;
            }
            BlockMetaCrop blockCropDataUp = FromMetaData <BlockMetaCrop>(blockData.meta);
            if (chunkUpUp != null && blockUpUp != null && blockUpUp.blockType != BlockTypeEnum.None)
            {
                blockCropDataUp.uvIndex = 2;
            }
            else
            {
                blockCropDataUp.uvIndex = 1;
            }
            chunk.SetBlockForLocal(localPosition + Vector3Int.up, BlockTypeEnum.CropCorn, BlockDirectionEnum.UpForward, ToMetaData(blockCropDataUp), false);

            //继续往上
            if (chunkUpUp != null && blockUpUp != null && blockUpUp.blockType != BlockTypeEnum.None)
            {
                return;
            }
            blockCropDataUp.uvIndex = 2;
            chunk.SetBlockForLocal(localPosition + Vector3Int.up * 2, BlockTypeEnum.CropCorn, BlockDirectionEnum.UpForward, ToMetaData(blockCropDataUp), false);
        }
    }
예제 #15
0
 /// <summary>
 /// 初始化数据
 /// </summary>
 public void SetData(Vector3Int worldPosition, BlockBean blockData)
 {
     if (blockData == null)
     {
         return;
     }
     this.blockWorldPosition = worldPosition;
     this.blockData          = blockData;
     this.blockBoxData       = Block.FromMetaData <BlockMetaBox>(blockData.meta);
     if (blockBoxData == null)
     {
         blockBoxData = new BlockMetaBox(7 * 7);
     }
     ui_ItemList.SetCellCount(blockBoxData.items.Length);
     ui_ItemList.RefreshAllCells();
 }
예제 #16
0
    /// <summary>
    /// 刷新植物
    /// </summary>
    /// <typeparam name="T"></typeparam>
    public virtual void RefreshCrop(Chunk chunk, Vector3Int localPosition, BlockInfoBean blockInfo)
    {
        chunk.chunkData.GetBlockForLocal(localPosition, out Block block, out BlockDirectionEnum direction);

        BlockBean     blockData = chunk.GetBlockData(localPosition);
        BlockMetaCrop blockCrop;

        if (blockData == null)
        {
            blockCrop             = new BlockMetaCrop();
            blockCrop.growPro     = 0;
            blockCrop.isStartGrow = false;

            string meta = ToMetaData(blockCrop);
            blockData = new BlockBean(localPosition, blockInfo.GetBlockType(), direction, meta);
            chunk.SetBlockData(blockData, false);
        }
        //获取成长周期
        blockCrop = FromMetaData <BlockMetaCrop>(blockData.meta);
        //成长周期+1
        if (blockCrop.isStartGrow)
        {
            //是否开始生长
            blockCrop.growPro++;
        }
        else
        {
            blockCrop.isStartGrow = true;
        }

        //设置新数据
        string newMeta = ToMetaData(blockCrop);

        blockData.meta = newMeta;
        chunk.SetBlockData(blockData);
        //刷新
        WorldCreateHandler.Instance.manager.AddUpdateChunk(chunk, 1);

        //判断是否已经是最大生长周期
        int lifeCycle = GetCropLifeCycle();

        if (blockCrop.growPro >= lifeCycle - 1)
        {
            chunk.UnRegisterEventUpdate(localPosition, TimeUpdateEventTypeEnum.Min);
        }
    }
예제 #17
0
    public void InitData()
    {
        dicBlockData.Clear();
        int widthChunk  = WorldCreateHandler.Instance.manager.widthChunk;
        int heightChunk = WorldCreateHandler.Instance.manager.heightChunk;

        for (int i = 0; i < listBlockData.Count; i++)
        {
            BlockBean  blockData     = listBlockData[i];
            Vector3Int localPosition = blockData.localPosition;
            int        index         = MathUtil.GetSingleIndexForThree(localPosition, widthChunk, heightChunk);
            if (!dicBlockData.ContainsKey(index))
            {
                dicBlockData.Add(index, blockData);
            }
        }
    }
예제 #18
0
    public void Show(Vector3Int worldPosition, Block block, bool isInteractive)
    {
        gameObject.SetActive(true);
        //展示文本互动提示
        objInteractive.ShowObj(isInteractive);

        //如果和上一个方块处于同一个位置
        if (lastWorldPosition == worldPosition)
        {
            lastWorldPosition = worldPosition;
            return;
        }
        lastWorldPosition = worldPosition;

        //设置方向
        WorldCreateHandler.Instance.manager.GetBlockForWorldPosition(worldPosition, out Block targetBlock, out BlockDirectionEnum targetDirection, out Chunk targetChunk);
        objTargetCenterBlock.transform.eulerAngles = targetBlock.GetRotateAngles(targetDirection);
        Vector3Int localPosition = worldPosition - targetChunk.chunkData.positionForWorld;
        //如果和上一个时同一个
        Mesh newMeshData = block.blockShape.GetCompleteMeshData(targetChunk, localPosition, targetDirection);

        //设置形状
        if (block.blockShape is BlockShapeCustom blockShapeCustom)
        {
        }
        else
        {
            Vector2[] newUVS = new Vector2[newMeshData.vertices.Length];
            for (int i = 0; i < newMeshData.vertices.Length; i++)
            {
                newUVS[i] = Vector2.zero;
            }
            newMeshData.SetUVs(0, newUVS);
        }
        meshFilter.mesh    = newMeshData;
        transform.position = worldPosition;
        //如果是link类型,
        if (targetBlock.blockInfo.GetBlockShape() == BlockShapeEnum.CustomLink)
        {
            BlockBean         blockData         = targetChunk.GetBlockData(localPosition.x, localPosition.y, localPosition.z);
            BlockMetaBaseLink blockMetaBaseLink = Block.FromMetaData <BlockMetaBaseLink>(blockData.meta);
            transform.position = blockMetaBaseLink.GetBasePosition();
        }
    }
예제 #19
0
    /// <summary>
    /// 获取连接的基础方块数据
    /// </summary>
    public T GetLinkBaseBlockData <T>(string meta) where T : BlockMetaBaseLink
    {
        //获取link数据
        T blockLink = FromMetaData <T>(meta);

        if (blockLink.level == 0)
        {
            //如果自己就是基础连接方块
            return(blockLink);
        }
        else
        {
            //获取基础连接方块
            Vector3Int baseWorldPosition = blockLink.linkBasePosition.GetVector3Int();
            WorldCreateHandler.Instance.manager.GetBlockForWorldPosition(baseWorldPosition, out Block baseBlock, out BlockDirectionEnum baseBlockDirection, out Chunk baseChunk);
            BlockBean blockDataBase = baseChunk.GetBlockData(baseWorldPosition - baseChunk.chunkData.positionForWorld);
            return(FromMetaData <T>(blockDataBase.meta));
        }
    }
예제 #20
0
    public override void BaseAddVertsUVsColors(Chunk chunk, Vector3Int localPosition, BlockDirectionEnum direction, DirectionEnum face, Vector3[] vertsAdd, Vector2[] uvsAdd, Color[] colorsAdd)
    {
        BlockBean blockData = chunk.GetBlockData(localPosition);

        if (blockData != null && face == DirectionEnum.UP)
        {
            BlockMetaPlough blockMetaPlough = Block.FromMetaData <BlockMetaPlough>(blockData.meta);
            //判断是否浇水
            if (blockMetaPlough != null && blockMetaPlough.waterState == 1)
            {
                base.BaseAddVertsUVsColors(chunk, localPosition, direction, face, vertsAdd, uvsAdd, colorAddWater);
            }
            else
            {
                base.BaseAddVertsUVsColors(chunk, localPosition, direction, face, vertsAdd, uvsAdd, colorsAdd);
            }
            return;
        }
        base.BaseAddVertsUVsColors(chunk, localPosition, direction, face, vertsAdd, uvsAdd, colorsAdd);
    }
예제 #21
0
 public override void CreateBlockModel(Chunk chunk, Vector3Int localPosition)
 {
     //如果有模型。则创建模型
     if (!blockInfo.model_name.IsNull())
     {
         //获取数据
         BlockBean blockData = chunk.GetBlockData(localPosition);
         if (blockData != null)
         {
             BlockMetaDoor blockDoorData = FromMetaData <BlockMetaDoor>(blockData.meta);
             if (blockDoorData != null)
             {
                 if (blockDoorData.level == 1)
                 {
                     return;
                 }
             }
         }
         chunk.listBlockModelUpdate.Enqueue(localPosition);
     }
 }
예제 #22
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);
    }
예제 #23
0
    /// <summary>
    /// 获取UVAdd
    /// </summary>
    public virtual Vector2[] GetUVsAddForCrop(Chunk chunk, Vector3Int localPosition, BlockInfoBean blockInfo)
    {
        BlockBean     blockData     = chunk.GetBlockData(localPosition);
        BlockMetaCrop blockCropData = BlockBaseCrop.FromMetaData <BlockMetaCrop>(blockData.meta);

        Vector2 uvStartPosition = GetUVStartPosition(blockInfo, blockCropData);

        Vector2[] uvsAdd = new Vector2[]
        {
            new Vector2(uvStartPosition.x, uvStartPosition.y),
            new Vector2(uvStartPosition.x, uvStartPosition.y + uvWidth),
            new Vector2(uvStartPosition.x + uvWidth, uvStartPosition.y + uvWidth),
            new Vector2(uvStartPosition.x + uvWidth, uvStartPosition.y),

            new Vector2(uvStartPosition.x, uvStartPosition.y),
            new Vector2(uvStartPosition.x, uvStartPosition.y + uvWidth),
            new Vector2(uvStartPosition.x + uvWidth, uvStartPosition.y + uvWidth),
            new Vector2(uvStartPosition.x + uvWidth, uvStartPosition.y)
        };
        return(uvsAdd);
    }
예제 #24
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);
    }
    public override void RefreshCrop(Chunk chunk, Vector3Int localPosition, BlockInfoBean blockInfo)
    {
        base.RefreshCrop(chunk, localPosition, blockInfo);
        BlockBean blockData = chunk.GetBlockData(localPosition);
        //获取成长周期
        BlockMetaCrop blockCropData = FromMetaData <BlockMetaCrop>(blockData.meta);

        //如果是等级大于0的子集 则不继续往上生长
        if (blockCropData.uvIndex > 0)
        {
            return;
        }

        //判断是否已经是最大生长周期
        int lifeCycle = GetCropLifeCycle();

        if (blockCropData.growPro >= lifeCycle - 1)
        {
            chunk.SetBlockForLocal(localPosition, BlockTypeEnum.CropWatermelon);
        }
    }
예제 #26
0
    public void SetBlockForLocal(Vector3Int localPosition, BlockTypeEnum blockType, BlockDirectionEnum direction = BlockDirectionEnum.UpForward, string meta = null, bool isRefreshMesh = true, bool isSaveData = true, bool isRefreshBlockRange = true)
    {
        if (localPosition.y > chunkData.chunkHeight)
        {
            return;
        }
        //首先移除方块
        Block oldBlock = chunkData.GetBlockForLocal(localPosition);

        if (oldBlock != null && oldBlock.blockType != BlockTypeEnum.None)
        {
            //先删除方块 再删除老数据 因为再删除方块时会用到老数据
            oldBlock.DestoryBlock(this, localPosition, direction);
            //删除老数据
            ClearBlockData(localPosition);
        }
        //设置新方块
        Block newBlock = BlockHandler.Instance.manager.GetRegisterBlock(blockType);

        chunkData.SetBlockForLocal(localPosition, newBlock, direction);

        //保存数据
        if (isSaveData)
        {
            BlockBean blockData = new BlockBean(localPosition, blockType, direction, meta);
            SetBlockData(blockData);
        }
        //刷新blockMesh
        if (isRefreshMesh)
        {
            WorldCreateHandler.Instance.manager.AddUpdateChunk(this, 1);
        }
        //初始化方块(放再这里是等处理完数据和mesh之后再初始化)
        newBlock.InitBlock(this, localPosition, 1);
        //刷新六个方向的方块
        if (isRefreshBlockRange)
        {
            newBlock.RefreshBlockRange(this, localPosition, direction);
        }
    }
예제 #27
0
    public override void BaseAddVertsUVsColorsForCustom(Chunk chunk, Vector3Int localPosition, BlockDirectionEnum direction, Vector3[] vertsAdd, Vector2[] uvsAdd, Color[] colorsAdd, Vector3[] vertsColliderAdd)
    {
        BlockBean    blockData     = chunk.GetBlockData(localPosition.x, localPosition.y, localPosition.z);
        BlockMetaBed blockMetaData = Block.FromMetaData <BlockMetaBed>(blockData.meta);

        //只有基础链接才绘制床
        if (blockMetaData != null && blockMetaData.level == 0)
        {
            AddVertsUVsColors(localPosition, direction,
                              chunk.chunkMeshData.verts, chunk.chunkMeshData.uvs, chunk.chunkMeshData.colors,
                              vertsAdd, uvsAdd, colorsAdd);
        }

        if (block.blockInfo.collider_state == 1)
        {
            AddVerts(localPosition, direction, chunk.chunkMeshData.vertsCollider, vertsColliderAdd);
        }
        else if (block.blockInfo.trigger_state == 1)
        {
            AddVerts(localPosition, direction, chunk.chunkMeshData.vertsTrigger, vertsColliderAdd);
        }
    }
    public override void ItemUseHandle(ItemsBean itemsData, Vector3Int targetPosition, Block targetBlock, BlockDirectionEnum targetBlockDirection, Chunk targetChunk)
    {
        if (targetBlock == null)
        {
            return;
        }
        if (targetBlock.blockInfo.GetBlockShape() != BlockShapeEnum.Plough)
        {
            return;
        }
        ItemsDetailsToolBean itemsDetailsTool = itemsData.GetMetaData <ItemsDetailsToolBean>();

        //如果没有耐久了 则不执行
        if (itemsDetailsTool.life <= 0)
        {
            return;
        }
        //扣除耐久
        itemsDetailsTool.AddLife(-1);
        //保存数据 道具数据
        itemsData.SetMetaData(itemsDetailsTool);
        //回调
        EventHandler.Instance.TriggerEvent(EventsInfo.ItemsBean_MetaChange, itemsData);

        //修改耕地的状态
        BlockBean       blockData       = targetChunk.GetBlockData(targetPosition - targetChunk.chunkData.positionForWorld);
        BlockMetaPlough blockMetaPlough = Block.FromMetaData <BlockMetaPlough>(blockData.meta);

        if (blockMetaPlough == null)
        {
            blockMetaPlough = new BlockMetaPlough();
        }
        blockMetaPlough.waterState = 1;
        blockData.meta             = Block.ToMetaData(blockMetaPlough);
        targetChunk.SetBlockData(blockData);
        //更新区块
        WorldCreateHandler.Instance.manager.AddUpdateChunk(targetChunk, 1);
    }
예제 #29
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];
                }
            }
        }
    }
예제 #30
0
    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);
        }
    }