public BSVoxelModify(IntVector3[] index, BSVoxel[] old_voxels, BSVoxel[] new_voxels, IBSDataSource ds, EBSBrushMode mode) { m_OldVoxels = old_voxels; m_Index = index; m_NewVoxels = new_voxels; dataSource = ds; m_Mode = mode; // Calculate bound if (index.Length > 0) { Vector3 min = new Vector3(index[0].x * dataSource.Scale, index[0].y * dataSource.Scale, index[0].z * dataSource.Scale); Vector3 max = min; m_Bound = new Bounds(); foreach (IntVector3 ipos in index) { Vector3 pos = new Vector3(ipos.x * dataSource.Scale, ipos.y * dataSource.Scale, ipos.z * dataSource.Scale); if (min.x > pos.x) { min.x = pos.x; } else if (max.x < pos.x) { max.x = pos.x; } if (min.y > pos.y) { min.y = pos.y; } else if (max.y < pos.y) { max.y = pos.y; } if (min.z > pos.z) { min.z = pos.z; } else if (max.z < pos.z) { max.z = pos.z; } } m_Bound.min = min; m_Bound.max = max; } }
/// <summary> /// voxel modify check event before really undo and redo. Call by BSVoxelModify /// </summary> bool OnCheckVoxelModify(int opType, IntVector3[] indexes, BSVoxel[] voxels, BSVoxel[] oldvoxels, EBSBrushMode mode, IBSDataSource ds) { if (IsGod) { return(true); } if (Pathea.PeCreature.Instance.mainPlayer == null) { return(false); } bool result = true; if (mode == EBSBrushMode.Add) { Dictionary <int, int> items = new Dictionary <int, int>(); // Calculate the needed items; int adder = 1; foreach (BSVoxel voxel in voxels) { int id = 0; if (ds == BuildingMan.Blocks) { if (voxel.IsExtendable()) { if (!voxel.IsExtendableRoot()) { id = GetBlockItemProtoID((byte)(voxel.materialType >> 2)); adder = 1; } else { adder = 0; } } else { id = GetBlockItemProtoID(voxel.materialType); } } else if (ds == BuildingMan.Voxels) { id = GetVoxelItemProtoID(voxel.materialType); } if (id <= 0) { continue; } if (id != 0) { if (items.ContainsKey(id)) { items[id] += adder; } else { items.Add(id, adder); } } } _costsItems = items; float divisor = 1.0f; if (ds == BuildingMan.Blocks) { divisor = (float)(1 << BSBlock45Data.s_ScaleInverted); } // Has player enough items ? Pathea.PackageCmpt pkg = Pathea.PeCreature.Instance.mainPlayer.GetCmpt <Pathea.PackageCmpt>(); _playerItems.Clear(); foreach (KeyValuePair <int, int> kvp in items) { _playerItems.Add(kvp.Key, pkg.GetItemCount(kvp.Key)); if (pkg.GetItemCount(kvp.Key) < Mathf.CeilToInt(kvp.Value / divisor)) { result = false; } } // now delete if (result) { if (GameConfig.IsMultiMode) { if (null == PlayerNetwork.mainPlayer) { return(false); } if (!Pathea.PeGameMgr.IsMultiCoop && VArtifactUtil.IsInTownBallArea(PlayerNetwork.mainPlayer._pos)) { new PeTipMsg(PELocalization.GetString(8000864), PeTipMsg.EMsgLevel.Warning); return(false); } //if (!PlayerNetwork.OnLimitBoundsCheck(brushBound)) //{ // new PeTipMsg(PELocalization.GetString(8000864), PeTipMsg.EMsgLevel.Warning); // return false; //} PlayerNetwork.mainPlayer.RequestRedo(opType, indexes, oldvoxels, voxels, mode, ds.DataType, ds.Scale); DigTerrainManager.BlockClearGrass(ds, indexes); return(true); } else { string debug_log = ""; foreach (KeyValuePair <int, int> kvp in items) { if (pkg.Destory(kvp.Key, Mathf.CeilToInt(kvp.Value / divisor))) { debug_log += "\r\n Rmove Item from player package ID[" + kvp.Key.ToString() + "]" + " count - " + kvp.Value.ToString(); } } if (ds == BuildingMan.Blocks) { for (int i = 0; i < indexes.Length; i++) { Vector3 pos = new Vector3(indexes[i].x * ds.Scale, indexes[i].y * ds.Scale, indexes[i].z * ds.Scale) - ds.Offset; PeGrassSystem.DeleteAtPos(pos); PeGrassSystem.DeleteAtPos(new Vector3(pos.x, pos.y - 1, pos.z)); //PeGrassSystem.DeleteAtPos(new Vector3(pos.x, pos.y + 1, pos.z)); } } else if (ds == BuildingMan.Voxels) { for (int i = 0; i < indexes.Length; i++) { Vector3 pos = new Vector3(indexes[i].x, indexes[i].y, indexes[i].z); PeGrassSystem.DeleteAtPos(pos); PeGrassSystem.DeleteAtPos(new Vector3(pos.x, pos.y - 1, pos.z)); //PeGrassSystem.DeleteAtPos(new Vector3(pos.x, pos.y + 1, pos.z)); } } //Debug.LogWarning(debug_log); } } else { new PeTipMsg(PELocalization.GetString(821000001), PeTipMsg.EMsgLevel.Warning); } } else if (mode == EBSBrushMode.Subtract) { Dictionary <int, int> items = new Dictionary <int, int>(); // Calculate the needed items; int adder = 1; foreach (BSVoxel voxel in oldvoxels) { int id = 0; if (ds == BuildingMan.Blocks) { if (voxel.IsExtendable()) { if (!voxel.IsExtendableRoot()) { id = GetBlockItemProtoID((byte)(voxel.materialType >> 2)); adder = 1; } else { adder = 0; } } else { if (!BuildingMan.Blocks.VoxelIsZero(voxel, 0)) { id = GetBlockItemProtoID((byte)(voxel.materialType)); } } } else if (ds == BuildingMan.Voxels) { if (!BuildingMan.Voxels.VoxelIsZero(voxel, 1)) { id = GetVoxelItemProtoID(voxel.materialType); } } if (id <= 0) { continue; } if (items.ContainsKey(id)) { items[id] += adder; } else { items.Add(id, adder); } } float divisor = 1.0f; if (ds == BuildingMan.Blocks) { divisor = (float)(1 << BSBlock45Data.s_ScaleInverted); } // Has player enough package ? Pathea.PlayerPackageCmpt pkg = Pathea.PeCreature.Instance.mainPlayer.GetCmpt <Pathea.PlayerPackageCmpt>(); MaterialItem[] array = new MaterialItem[items.Count]; int i = 0; foreach (KeyValuePair <int, int> kvp in items) { array[i] = new MaterialItem() { protoId = kvp.Key, count = Mathf.FloorToInt(kvp.Value / divisor) }; i++; } result = pkg.package.CanAdd(array); // Really add if (result) { if (GameConfig.IsMultiMode) { if (null == PlayerNetwork.mainPlayer) { return(false); } //if (!PlayerNetwork.OnLimitBoundsCheck(brushBound)) //{ // new PeTipMsg(PELocalization.GetString(8000864), PeTipMsg.EMsgLevel.Warning); // return false; //} PlayerNetwork.mainPlayer.RequestRedo(opType, indexes, oldvoxels, voxels, mode, ds.DataType, ds.Scale); return(true); } else { string debug_log = ""; foreach (MaterialItem mi in array) { if (mi.count != 0) { pkg.Add(mi.protoId, mi.count); } debug_log += "Add Item from player package ID[" + mi.protoId.ToString() + "]" + " count - " + mi.count.ToString() + "\r\n"; } Debug.LogWarning(debug_log); } } } if (result) { if (onVoxelMotify != null) { onVoxelMotify(indexes, voxels, oldvoxels, mode, ds); } } return(result); }
void OnBrushMenuItemClick(UIBrushMenuItem.BrushType type) { if (type == UIBrushMenuItem.BrushType.pointAdd) { mMenuCtrl.SetBrushItemSprite(type, menuItemAddColor); pointMode = EBSBrushMode.Add; if (m_CurBrush as BSPointBrush != null) { m_CurBrush.mode = pointMode; } mMenuCtrl.ManualEnbleBtn(mMenuCtrl.mPointBtn); } else if (type == UIBrushMenuItem.BrushType.pointRemove) { mMenuCtrl.SetBrushItemSprite(type, menuItemRemoveColor); pointMode = EBSBrushMode.Subtract; if (m_CurBrush as BSPointBrush != null) { m_CurBrush.mode = pointMode; } mMenuCtrl.ManualEnbleBtn(mMenuCtrl.mPointBtn); } else if (type == UIBrushMenuItem.BrushType.boxAdd) { mMenuCtrl.SetBrushItemSprite(type, menuItemAddColor); boxMode = EBSBrushMode.Add; if (m_CurBrush as BSBoxBrush != null) { m_CurBrush.mode = boxMode; } mMenuCtrl.ManualEnbleBtn(mMenuCtrl.mBoxBtn); } else if (type == UIBrushMenuItem.BrushType.boxRemove) { mMenuCtrl.SetBrushItemSprite(type, menuItemRemoveColor); boxMode = EBSBrushMode.Subtract; if (m_CurBrush as BSBoxBrush != null) { m_CurBrush.mode = boxMode; } mMenuCtrl.ManualEnbleBtn(mMenuCtrl.mBoxBtn); } else if (type == UIBrushMenuItem.BrushType.diagonalXPos) { diagonalRot = 0; BSB45DiagonalBrush db = m_CurBrush as BSB45DiagonalBrush; if (db != null) { db.m_Rot = diagonalRot; } mMenuCtrl.ManualEnbleBtn(mMenuCtrl.mDiagonalBtn); } else if (type == UIBrushMenuItem.BrushType.diagonalXNeg) { mMenuCtrl.SetBrushItemSprite(type, menuItemAddColor); diagonalRot = 2; BSB45DiagonalBrush db = m_CurBrush as BSB45DiagonalBrush; if (db != null) { db.m_Rot = diagonalRot; } mMenuCtrl.ManualEnbleBtn(mMenuCtrl.mDiagonalBtn); } else if (type == UIBrushMenuItem.BrushType.diagonalZPos) { mMenuCtrl.SetBrushItemSprite(type, menuItemAddColor); diagonalRot = 1; BSB45DiagonalBrush db = m_CurBrush as BSB45DiagonalBrush; if (db != null) { db.m_Rot = diagonalRot; } mMenuCtrl.ManualEnbleBtn(mMenuCtrl.mDiagonalBtn); } else if (type == UIBrushMenuItem.BrushType.diagonalZNeg) { mMenuCtrl.SetBrushItemSprite(type, menuItemAddColor); diagonalRot = 3; BSB45DiagonalBrush db = m_CurBrush as BSB45DiagonalBrush; if (db != null) { db.m_Rot = diagonalRot; } mMenuCtrl.ManualEnbleBtn(mMenuCtrl.mDiagonalBtn); } else if (type == UIBrushMenuItem.BrushType.SelectAll) { mMenuCtrl.SetBrushItemSprite(type, menuItemAddColor); if (m_CurBrush as BSIsoSelectBrush != null) { CreateBrush(BrushType.bt_selectAll); } } else if (type == UIBrushMenuItem.BrushType.SelectDetail) { mMenuCtrl.SetBrushItemSprite(type, menuItemAddColor); if (m_CurBrush as BSMiscBrush != null) { CreateBrush(BrushType.bt_selectBlock); } } }