Ejemplo n.º 1
0
    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;
        }
    }
Ejemplo n.º 2
0
    /// <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);
    }
Ejemplo n.º 3
0
    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);
            }
        }
    }