Exemplo n.º 1
0
    void OnTerrainMeshCreated(IntVector4 node)
    {
        if (CSMain.s_MgCreator.Assembly == null)
        {
            return;
        }

        if (!VFVoxelTerrain.TerrainColliderComplete)
        {
            return;
        }

        if (node.w == 0 && automaticData != null)
        {
            float dx = CSMain.s_MgCreator.Assembly.Position.x - node.x;
            float dy = CSMain.s_MgCreator.Assembly.Position.y - node.y;
            float dz = CSMain.s_MgCreator.Assembly.Position.z - node.z;

            float side = VoxelTerrainConstants._numVoxelsPerAxis << node.w;

            if (dx >= PETools.PEMath.Epsilon && dx <= side &&
                dy >= PETools.PEMath.Epsilon && dy <= side &&
                dz >= PETools.PEMath.Epsilon && dz <= side)
            {
                //To do : destroy block
                foreach (KeyValuePair <int, CSCommon> kp in CSMain.s_MgCreator.GetCommonEntities())
                {
                    if (Random.value < 0.5f)
                    {
                        DigTerrainManager.DestroyTerrainInRange(1, kp.Value.Position, 255.0f, 10.0f);
                    }
                }
            }
        }
    }
Exemplo n.º 2
0
 void CacheDelGrass()
 {
     if (delGrassPos.Count != 0)
     {
         DigTerrainManager.CacheDeleteGrass(delGrassPos);
     }
 }
Exemplo n.º 3
0
 void CacheDelTree()
 {
     if (delTreePos.Count != 0)
     {
         DigTerrainManager.CacheDeleteTree(delTreePos);
     }
 }
Exemplo n.º 4
0
    public static void RPC_S2C_TerrainDestroyInRange(uLink.BitStream stream, uLink.NetworkMessageInfo info)
    {
        Vector3 pos    = stream.Read <Vector3>();
        float   power  = stream.Read <float>();
        float   radius = stream.Read <float>();

        DigTerrainManager.TerrainDestroyInRangeNetReturn(pos, power, radius);
    }
Exemplo n.º 5
0
    public static void RPC_SKChangeTerrain(uLink.BitStream stream, uLink.NetworkMessageInfo info)
    {
        IntVector3 intPos     = stream.Read <IntVector3>();
        float      radius     = stream.Read <float>();
        byte       targetType = stream.Read <byte>();

        byte[] data = stream.Read <byte[]>();

        DigTerrainManager.ChangeTerrainNetReturn(intPos, radius, targetType, data);
    }
Exemplo n.º 6
0
    public static void RPC_SKDigTerrain(uLink.BitStream stream, uLink.NetworkMessageInfo info)
    {
        IntVector3 pos         = stream.Read <IntVector3>();
        float      durDec      = stream.Read <float>();
        float      radius      = stream.Read <float>();
        float      height      = stream.Read <float>();
        bool       bReturnItem = stream.Read <bool>();

        DigTerrainManager.DigTerrainNetReturn(pos, durDec, radius, height, bReturnItem);
    }
Exemplo n.º 7
0
    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
        }
    }
Exemplo n.º 8
0
            void PeLauncher.ILaunchable.Launch()
            {
                AIErodeMap.ResetErodeData();
                PeGameSummary.Mgr.Instance.Init();
                DigTerrainManager.ClearBlockInfo();

                //lz-2016.09.01 重置技能树可使用状态
                if (!Pathea.PeGameMgr.IsAdventure)
                {
                    RandomMapConfig.useSkillTree   = false;
                    RandomMapConfig.openAllScripts = false;
                }
            }
Exemplo n.º 9
0
    void RemoveTrees()
    {
        Vector3 dir       = m_LinkPos1 - m_LinkPos2;
        Vector3 normalDir = dir.normalized;

        RaycastHit[] hitTreeCols = Physics.RaycastAll(m_LinkPos2, normalDir, dir.magnitude, 1 << Pathea.Layer.NearTreePhysics, QueryTriggerInteraction.Ignore);
        for (int i = 0; i < hitTreeCols.Length; ++i)
        {
            GlobalTreeInfo gTreeinfo = PETools.PEUtil.GetTreeinfo(hitTreeCols[i].collider);
            if (null != gTreeinfo)
            {
                DigTerrainManager.RemoveTree(gTreeinfo);
            }
        }
    }
Exemplo n.º 10
0
    void OnDestroy()
    {
        if (_airborne != null)
        {
            MonsterAirborne.DestroyAirborne(_airborne, false);
        }

#if DestroyLeftMonster
        if (!isSweep)
        {
            for (int i = 0; i < _agents.Count; i++)
            {
                MonEscape(_agents [i] as SceneEntityPosAgent, transform.position);
            }
        }
#endif
        SceneMan.RemoveSceneObjs(_agents);
        _agents.Clear();

        if (UITowerInfo.Instance != null && _uiData != null)
        {
            UITowerInfo.Instance.Hide();
        }

        s_Beacons.Remove(this);

        if (!PeGameMgr.IsMulti && null != m_Mark)
        {
            PeMap.LabelMgr.Instance.Remove(m_Mark);
            m_Mark = null;
        }

        if (null != CSMain.Instance)
        {
            List <CSAssembly> assemblyList = CSMain.Instance.GetAllAssemblies();
            if (0 < assemblyList.Count)
            {
                for (int i = 0; i < assemblyList.Count; ++i)
                {
                    CSAssembly assembly = assemblyList[i];
                    if (null != assembly && assembly.InRange(_position))
                    {
                        DigTerrainManager.ClearColonyBlockInfo(assembly);
                    }
                }
            }
        }
    }
Exemplo n.º 11
0
    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);
        }
    }
Exemplo n.º 12
0
    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);
            }
        }
    }
Exemplo n.º 13
0
 public static void RPC_S2C_BlockDestroyInRange(uLink.BitStream stream, uLink.NetworkMessageInfo info)
 {
     byte[] data = stream.Read <byte[]>();
     DigTerrainManager.BlockDestroyInRangeNetReturn(data);
 }
Exemplo n.º 14
0
 public static void RPC_S2C_BuildBlock(uLink.BitStream stream, uLink.NetworkMessageInfo info)
 {
     byte[] binData = stream.Read <byte[]>();
     DigTerrainManager.ApplyBSVoxelData(binData);
 }
Exemplo n.º 15
0
 public static void RPC_S2C_BlockData(uLink.BitStream stream, uLink.NetworkMessageInfo info)
 {
     /*int index = */ stream.Read <int>();
     byte[] data = stream.Read <byte[]>();
     DigTerrainManager.ApplyBlockData(data);
 }
Exemplo n.º 16
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);
    }
Exemplo n.º 17
0
    protected void RPC_SKFellTree(uLink.BitStream stream, uLink.NetworkMessageInfo info)
    {
        /*int typeIndex = */ stream.Read <int> ();
        Vector3 pos = stream.Read <Vector3> ();

        /*float maxHP = */ stream.Read <float> ();
        float hp = stream.Read <float> ();

        TreeInfo tree = null;        // = RSubTerrainMgr.TreesAtPosF(pos);

        if (null != LSubTerrainMgr.Instance)
        {
            int x = Mathf.FloorToInt(pos.x);
            int y = Mathf.FloorToInt(pos.y);
            int z = Mathf.FloorToInt(pos.z);
            List <GlobalTreeInfo> tree_list = LSubTerrainMgr.Picking(new IntVector3(x, y, z), true);
            if (tree_list.Count > 0)
            {
                foreach (var iter in tree_list)
                {
                    if (hp <= 0)
                    {
                        PeEntity entity   = EntityMgr.Instance.Get(Id);
                        SkEntity skEntity = null == entity ? null : entity.skEntity;
                        SkEntitySubTerrain.Instance.OnTreeCutDown(skEntity, iter);
                        DigTerrainManager.RemoveTree(iter);
                        if (IsOwner)
                        {
                            SkEntitySubTerrain.Instance.SetTreeHp(iter.WorldPos, hp);
                        }
                    }
                    else
                    {
                        if (IsOwner)
                        {
                            SkEntitySubTerrain.Instance.SetTreeHp(iter.WorldPos, hp);
                        }
                    }
                }
            }
        }
        else if (null != RSubTerrainMgr.Instance)
        {
            RSubTerrSL.AddDeletedTree(pos);
            tree = RSubTerrainMgr.TreesAtPosF(pos);
            if (null != tree)
            {
                GlobalTreeInfo gTree = new GlobalTreeInfo(-1, tree);
                if (hp <= 0)
                {
                    PeEntity entity   = EntityMgr.Instance.Get(Id);
                    SkEntity skEntity = null == entity ? null : entity.skEntity;
                    SkEntitySubTerrain.Instance.OnTreeCutDown(skEntity, gTree);
                    DigTerrainManager.RemoveTree(gTree);
                    if (IsOwner)
                    {
                        SkEntitySubTerrain.Instance.SetTreeHp(gTree.WorldPos, hp);
                    }
                }
                else
                {
                    if (IsOwner)
                    {
                        SkEntitySubTerrain.Instance.SetTreeHp(gTree.WorldPos, hp);
                    }
                }
            }
        }
    }
Exemplo n.º 18
0
    private void onAlterAttribs(int idx, float oldValue, float newValue)
    {
//		if(_targetTree == null)	return;
//		Debug.Log("Cutting a tree........");

        /* when the tree's hp has been cut to zero
         * if (null != LSubTerrainMgr.Instance)
         * {
         *      LSubTerrainMgr.DeleteTree(mGroundItem);
         *      LSubTerrainMgr.RefreshAllLayerTerrains();
         * }
         * else if (null != RSubTerrainMgr.Instance)
         * {
         *      RSubTerrainMgr.DeleteTree(mGroundItem._treeInfo);
         *      RSubTerrainMgr.RefreshAllLayerTerrains();
         * }
         */

        if (idx != 2)
        {
            return;
        }

        float damage         = _attribs.sums[0];
        float resourceBonus  = _attribs.sums[1];
        bool  returnResource = _attribs.sums[2] > 0.0f;

        SkEntity caster = GetCasterToModAttrib(idx);

        if (null != caster)
        {
            ISkSubTerrain subTerrain = caster as ISkSubTerrain;
            if (null != subTerrain && null != subTerrain.treeInfo)
            {
                treeHPInfos[subTerrain.treeInfo.WorldPos] = DigTerrainManager.Fell(subTerrain.treeInfo, damage, GetTreeHP(subTerrain.treeInfo.WorldPos));
                if (GameConfig.IsMultiMode)
                {
                    caster.SendFellTree(subTerrain.treeInfo._treeInfo.m_protoTypeIdx, subTerrain.treeInfo.WorldPos, subTerrain.treeInfo._treeInfo.m_heightScale, subTerrain.treeInfo._treeInfo.m_widthScale);
                }
                else
                {
                    if (treeHPInfos[subTerrain.treeInfo.WorldPos] <= 0)
                    {
                        OnTreeCutDown(caster, subTerrain.treeInfo);
                        DigTerrainManager.RemoveTree(subTerrain.treeInfo);
                        if (returnResource)
                        {
                            bool bGetSpItems = false;
                            if (caster is SkAliveEntity)
                            {
                                SkAliveEntity alive = (SkAliveEntity)caster;
                                if (alive.Entity.proto == EEntityProto.Player)
                                {
                                    SkillTreeUnitMgr mgr = alive.Entity.GetCmpt <SkillTreeUnitMgr>();
                                    bGetSpItems = mgr.CheckMinerGetRare();
                                }
                            }
                            Dictionary <int, int> itemGet = DigTerrainManager.GetTreeResouce(subTerrain.treeInfo, 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]);
                                }
                                GetSpecialItem.PlantItemAdd(ref itemsArray);  //植物特殊道具添加
                                caster._attribs.pack += itemsArray.ToArray();
                            }
                        }
                    }
                }
            }
        }
    }