public static void InitSpareIds()
        {
            spareActivityIds.Clear();
            spareAchieveIds.Clear();
            spareRewardIds.Clear();

            for (int i = MinActivityID; i <= MaxActivityID; ++i)
            {
                spareActivityIds.Add(i);
            }

            for (int i = MinAchieveID; i <= MaxAchieveID; ++i)
            {
                foreach (int e in Enum.GetValues(typeof(mw.Enums.TaskType)))
                {
                    if (e == (int)mw.Enums.TaskType.TASK_TYPE_MAIN ||
                        e == (int)mw.Enums.TaskType.TASK_TYPE_MYSTIC ||
                        e == (int)mw.Enums.TaskType.TASK_TYPE_GUILD ||
                        e == (int)mw.Enums.TaskType.TASK_TYPE_COMMON
                        )
                    {
                        continue;
                    }

                    uint id = CUtils.MakeLong((ushort)e, (ushort)i);
                    spareAchieveIds.Add(id);
                }
            }

            for (int i = MinRewardID; i <= MaxRewardID; ++i)
            {
                spareRewardIds.Add(i);
            }
        }
        public static bool RemoveActivityNode(int id)
        {
            if (!tableActivity.ContainsKey(id))
            {
                return(false);
            }

            mw.ActivityConfig config = null;
            tableActivity.TryGetValue(id, out config);

            if (null == config)
            {
                return(false);
            }

            List <mw.AchieveConfig> listAchieve = GetAchieveConfigsByActivityId(id);

            foreach (var achieveConfig in listAchieve)
            {
                uint longid = CUtils.MakeLong((ushort)achieveConfig.type, (ushort)achieveConfig.id);
                RemoveAchieveNode(longid);
            }

            tableActivity.Remove(id);
            spareActivityIds.Add(id);
            config = null;

            m_isDirty = true;
            return(true);
        }
        public static void AddAchieveNode(mw.AchieveConfig val)
        {
            uint id = CUtils.MakeLong((ushort)val.type, (ushort)val.id);

            if (tableAchieve.ContainsKey(id))
            {
                tableAchieve[id] = val;
            }
            else
            {
                tableAchieve.Add(id, val);
            }

            if (val.id >= MinAchieveID && val.id <= MaxAchieveID)
            {
                spareAchieveIds.Remove(id);
            }
            m_isDirty = true;
        }
        public static mw.AchieveConfig GetNewConfigAchieve(mw.Enums.TaskType type)
        {
            if (spareAchieveIds.Count == 0)
            {
                CErrMgr.SetLastErrMsg(EErrType.ERR_ACTIVITY_ACHIEVE_ID_MAX);
                return(null);
            }

            mw.AchieveConfig config = new mw.AchieveConfig();
            for (int i = MinAchieveID; i <= MaxAchieveID; ++i)
            {
                uint id = CUtils.MakeLong((ushort)type, (ushort)i);
                if (spareAchieveIds.Contains(id))
                {
                    config.id   = i;
                    config.type = type;
                    break;
                }
            }

            AddAchieveNode(config);

            return(config);
        }