/// <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); }
/// <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); } }); }
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); }
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); } }
/// <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); }
/// <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(); } }
/// <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); } } }
/// <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); }
/// <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; }
/// <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); }
/// <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); }
/// <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); }
/// <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)); } } }
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); } }
/// <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(); }
/// <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); } }
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); } } }
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(); } }
/// <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)); } }
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); }
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); } }
/// <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); }
/// <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); }
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); } }
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); } }
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); }
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]; } } } }
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); } }