private void ProcDigB45s(SkEntity caster)
    {
        SkInst      inst       = SkRuntimeInfo.Current as SkInst;
        IDigTerrain digTerrain = caster as IDigTerrain;
        IntVector4  digPos     = null;

        if (null == digTerrain || (digPos = digTerrain.digPosType) == IntVector4.Zero || (inst != null && !(inst._target is Block45Man)))
        {
            return;
        }

        float damage = caster.GetAttribute((int)AttribType.Atk);
        float radius = caster.GetAttribute((int)AttribType.ResRange);
        float height = caster.GetAttribute((int)AttribType.ResRange);
        //		float resourceBonus = caster.GetAttribute((int)AttribType.ResBouns);
        //		bool returnResource = digPos.w == 1;

        PeEntity entity = caster != null?caster.GetComponent <PeEntity>() : null;

        if (entity != null && entity.monster != null)
        {
            radius = entity.bounds.extents.x + 1;
            height = entity.bounds.extents.y + 1;
        }

        if (null != inst && null != inst._colInfo)
        {
            int effecID = 0;
            if (radius < 3)
            {
                effecID = 258;
            }
            else if (radius < 5f)
            {
                effecID = 259;
            }
            else
            {
                effecID = 260;
            }
            Pathea.Effect.EffectBuilder.Instance.Register(effecID, null, inst._colInfo.hitPos, Quaternion.identity);
        }

        if (!GameConfig.IsMultiMode)
        {
            List <B45Block> removeList = new List <B45Block>();
            DigTerrainManager.DigBlock45(digPos.ToIntVector3(), damage * 0.2f, radius, height, ref removeList, false);
        }
        else
        {
            /// TODO : code for multiplayer
        }
    }
    private void ProcChangeTypes(SkEntity caster)
    {
        IDigTerrain digTerrain = caster as IDigTerrain;
        IntVector4  digPos     = null;

        if (null == digTerrain || (digPos = digTerrain.digPosType) == IntVector4.Zero)
        {
            return;
        }

        float      radius     = 2;
        byte       targetType = (byte)Mathf.RoundToInt(_attribs.sums[0]);
        IntVector3 intPos     = digPos.XYZ;

        if (caster is Pathea.Projectile.SkProjectile)
        {
            SkEntity trueCaster = ((Pathea.Projectile.SkProjectile)caster).GetSkEntityCaster();
            DigTerrainManager.ChangeTerrain(intPos, radius, targetType, trueCaster);
        }
        else
        {
            DigTerrainManager.ChangeTerrain(intPos, radius, targetType, caster);
        }
    }
    private void ProcDigVoxels(SkEntity caster)
    {
        SkInst      inst       = SkRuntimeInfo.Current as SkInst;
        IDigTerrain digTerrain = caster as IDigTerrain;
        IntVector4  digPos     = null;

        if (null == digTerrain || (digPos = digTerrain.digPosType) == IntVector4.Zero || (inst != null && !(inst._target is VFVoxelTerrain)))
        {
            return;
        }

        float      damage         = caster.GetAttribute((int)AttribType.Atk) * (1f + caster.GetAttribute((int)AttribType.ResDamage));
        float      radius         = caster.GetAttribute((int)AttribType.ResRange);
        float      resourceBonus  = caster.GetAttribute((int)AttribType.ResBouns);
        float      height         = caster.GetAttribute((int)AttribType.ResDamage);
        bool       returnResource = digPos.w == 1;
        IntVector3 intPos         = digPos.XYZ;

        if (!GameConfig.IsMultiMode)
        {
            //VFVoxel getVoxel = VFVoxelTerrain.self.Voxels.SafeRead(intPos.x, intPos.y, intPos.z);
            List <VFVoxel> removeList = new List <VFVoxel>();
            DigTerrainManager.DigTerrain(intPos,
                                         damage * (returnResource ? 5f : 1f),
                                         radius,
                                         height,
                                         ref removeList, returnResource);
            if (returnResource)
            {
                bool bGetSpItems = false;
                if (caster is SkAliveEntity)
                {
                    SkAliveEntity    alive = (SkAliveEntity)caster;
                    SkillTreeUnitMgr mgr   = alive.Entity.GetCmpt <SkillTreeUnitMgr>();
                    bGetSpItems = mgr.CheckMinerGetRare();
                }
                Dictionary <int, int> itemGet = DigTerrainManager.GetResouce(removeList, resourceBonus, bGetSpItems);
                if (itemGet.Count > 0)
                {
                    List <int> itemsArray = new List <int>(itemGet.Count * 2);
                    foreach (int intemID in itemGet.Keys)
                    {
                        itemsArray.Add(intemID);
                        itemsArray.Add(itemGet[intemID]);
                    }
                    caster.Pack += itemsArray.ToArray();
                }
            }
        }
        else
        {
            if (caster != null && caster._net != null)
            {
                //VFVoxel getVoxel = VFVoxelTerrain.self.Voxels.SafeRead(intPos.x,intPos.y, intPos.z);

                bool bGetSpItems = false;
                if (returnResource)
                {
                    if (caster is SkAliveEntity)
                    {
                        SkAliveEntity    alive = (SkAliveEntity)caster;
                        SkillTreeUnitMgr mgr   = alive.Entity.GetCmpt <SkillTreeUnitMgr>();
                        bGetSpItems = mgr.CheckMinerGetRare();
                    }
                }

                DigTerrainManager.DigTerrainNetwork((SkNetworkInterface)(caster._net), intPos, damage * (returnResource ? 5f : 1f),
                                                    radius, resourceBonus, returnResource, bGetSpItems, 0.3f);
            }
        }
    }