少年修仙传客户端代码仓库
client_linchunjie
2018-08-16 af752cb5721629490d9361ee9cf253f0d2ea9059
法宝魂修改
1 文件已重命名
30个文件已修改
1个文件已删除
1个文件已添加
2806 ■■■■■ 已修改文件
Core/GameEngine/Model/Config/TreasurePrivilegeConfig.cs 67 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/GameEngine/Model/Config/TreasurePrivilegeConfig.cs.meta 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/GameEngine/Model/Config/TreasureUpConfig.cs 58 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/GameEngine/Model/Config/TreasureUpConfig.cs.meta 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA317_tagMCAllEquipAttrActiveInfo.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA353_tagMCMWPrivilegeDataInfo.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/BlastFurnace/BlastFurnaceModel.cs 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/BlastFurnace/TreasureRefineSuccessWin.cs 282 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/BlastFurnace/TreasureRefineTips.cs 67 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/FindPrecious/DemonJarModel.cs 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/KnapSack/Logic/TreasureEffectModel.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Rune/RuneBreakWin.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Rune/RuneModel.cs 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Treasure/FairyTreasureCollectPanelPattern1.cs 257 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Treasure/FairyTreasureCollectPanelPattern4.cs 48 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Treasure/TreasureData.cs 463 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Treasure/TreasureLevelUpWin.cs 122 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Treasure/TreasureMeridianBehaviour.cs 78 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Treasure/TreasureModel.cs 188 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Treasure/TreasureNewGotWin.cs 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Treasure/TreasureNewStageWin.cs 54 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Treasure/TreasureSoulBehaviour.cs 58 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Treasure/TreasureSoulModel.cs 566 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Treasure/TreasureSoulModel.cs.meta 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Treasure/TreasureSoulPattern.cs 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Treasure/TreasureSoulPattern1.cs 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Treasure/TreasureSoulPattern2.cs 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Treasure/TreasureSoulPattern3.cs 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Treasure/TreasureSoulPattern4.cs 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Treasure/TreasureSoulWin.cs 293 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Treasure/TreasureStageTipWin.cs 48 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/WindowBase/ModelCenter.cs 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/WindowJump/WindowJumpMgr.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/GameEngine/Model/Config/TreasurePrivilegeConfig.cs
@@ -1,14 +1,14 @@
//--------------------------------------------------------
//    [Author]:            第二世界
//    [  Date ]:           Monday, June 25, 2018
//--------------------------------------------------------
using UnityEngine;
using System;
namespace TableConfig {
//--------------------------------------------------------
//    [Author]:            第二世界
//    [  Date ]:           Thursday, August 16, 2018
//--------------------------------------------------------
using UnityEngine;
using System;
namespace TableConfig {
    public partial class TreasurePrivilegeConfig : ConfigBase {
        public int PrivilegeID { get ; private set ; }
@@ -18,16 +18,18 @@
        public int maxValue { get ; private set ; }
        public string attr { get ; private set; } 
        public string itemAward { get ; private set; } 
        public int[] successList;
        public int treasureId { get ; private set ; }
        public string Icon { get ; private set; } 
        public string Name { get ; private set; } 
        public string targetDescription { get ; private set; } 
        public override string getKey()
        {
            return PrivilegeID.ToString();
        }
        public override void Parse() {
        }
        public override void Parse() {
            try
            {
                PrivilegeID=IsNumeric(rawContents[0]) ? int.Parse(rawContents[0]):0; 
@@ -44,22 +46,31 @@
            
                itemAward = rawContents[6].Trim();
            
                Icon = rawContents[7].Trim();
                string[] successListStringArray = rawContents[7].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);
                successList = new int[successListStringArray.Length];
                for (int i=0;i<successListStringArray.Length;i++)
                {
                     int.TryParse(successListStringArray[i],out successList[i]);
                }
            
                Name = rawContents[8].Trim();
                treasureId=IsNumeric(rawContents[8]) ? int.Parse(rawContents[8]):0;
            
                targetDescription = rawContents[9].Trim();
                Icon = rawContents[9].Trim();
                Name = rawContents[10].Trim();
                targetDescription = rawContents[11].Trim();
            }
            catch (Exception ex)
            {
                DebugEx.Log(ex);
            }
        }
    }
}
            }
        }
    }
}
Core/GameEngine/Model/Config/TreasurePrivilegeConfig.cs.meta
@@ -1,6 +1,6 @@
fileFormatVersion: 2
guid: 761a8477b6259554ab927daec347dba7
timeCreated: 1529925515
timeCreated: 1534418397
licenseType: Pro
MonoImporter:
  serializedVersion: 2
Core/GameEngine/Model/Config/TreasureUpConfig.cs
@@ -1,14 +1,14 @@
//--------------------------------------------------------
//    [Author]:            第二世界
//    [  Date ]:           Thursday, June 07, 2018
//--------------------------------------------------------
using UnityEngine;
using System;
namespace TableConfig {
//--------------------------------------------------------
//    [Author]:            第二世界
//    [  Date ]:           Thursday, August 16, 2018
//--------------------------------------------------------
using UnityEngine;
using System;
namespace TableConfig {
    public partial class TreasureUpConfig : ConfigBase {
        public int ID { get ; private set ; }
@@ -18,15 +18,15 @@
        public string AddAttr { get ; private set; } 
        public int[] UnLockSkill;
        public int UnLockFuncID { get ; private set ; }
        public int Privilege { get ; private set ; }
        public int LVLimit { get ; private set ; }
        public int ActiveMWID { get ; private set ; }
        public string ItemAward { get ; private set; }
        public override string getKey()
        {
            return ID.ToString();
        }
        public override void Parse() {
        }
        public override void Parse() {
            try
            {
                ID=IsNumeric(rawContents[0]) ? int.Parse(rawContents[0]):0; 
@@ -48,20 +48,20 @@
            
                UnLockFuncID=IsNumeric(rawContents[6]) ? int.Parse(rawContents[6]):0; 
            
                Privilege=IsNumeric(rawContents[7]) ? int.Parse(rawContents[7]):0;
                ActiveMWID=IsNumeric(rawContents[7]) ? int.Parse(rawContents[7]):0;
            
                LVLimit=IsNumeric(rawContents[8]) ? int.Parse(rawContents[8]):0;
                ItemAward = rawContents[8].Trim();
            }
            catch (Exception ex)
            {
                DebugEx.Log(ex);
            }
        }
    }
}
            }
        }
    }
}
Core/GameEngine/Model/Config/TreasureUpConfig.cs.meta
@@ -1,6 +1,6 @@
fileFormatVersion: 2
guid: 882666fd713678849aebb360643bfe19
timeCreated: 1528358559
timeCreated: 1534419056
licenseType: Pro
MonoImporter:
  serializedVersion: 2
Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA317_tagMCAllEquipAttrActiveInfo.cs
@@ -17,7 +17,7 @@
        HA317_tagMCAllEquipAttrActiveInfo vNetData = vNetPack as HA317_tagMCAllEquipAttrActiveInfo;
        playerPack.SetPlayerEquipAttrActiveInfo(vNetData);
        ModelCenter.Instance.GetModel<TreasureModel>().UpdateTreasurePrivilege(vNetData);
        ModelCenter.Instance.GetModel<TreasureSoulModel>().UpdateTreasurePrivilege(vNetData);
    }
}
Core/NetworkPackage/DTCFile/ServerPack/HA3_Function/DTCA353_tagMCMWPrivilegeDataInfo.cs
@@ -15,7 +15,7 @@
    {
        base.Done(vNetPack);
        var package = vNetPack as HA353_tagMCMWPrivilegeDataInfo;
        ModelCenter.Instance.GetModel<TreasureModel>().UpdateTreasurePrivilege(package);
        ModelCenter.Instance.GetModel<TreasureSoulModel>().UpdateTreasurePrivilege(package);
    }
}
System/BlastFurnace/BlastFurnaceModel.cs
@@ -212,28 +212,6 @@
    public Treasure treasureData { get; private set; }
    public void RefreshTreasureRefineModel(HA3BE_tagMCMagicWeaponMsg data)
    {
        DebugEx.Log("RefreshTreasureRefineModel" + data.Count);
        if (data.Count > 0)
        {
            int i = 0;
            for (i = 0; i < data.Count; i++)
            {
                if (!treasureRefineDict.ContainsKey(data.MWInfo[i].MWID))
                {
                    treasureRefineDict.Add(data.MWInfo[i].MWID, data.MWInfo[i].MWLV);
                }
                else
                {
                    treasureRefineDict[data.MWInfo[i].MWID] = data.MWInfo[i].MWLV;
                }
                Treasure treasure = null;
                sTreasureModel.TryGetTreasure((int)data.MWInfo[i].MWID, out treasure);
                treasure.level = data.MWInfo[i].MWLV;
                treasureData = treasure;
            }
            if (RefreshTreasureRefineEvent != null)
                RefreshTreasureRefineEvent();
        }
    }
    public int GetAllTreasureRefineLv()
System/BlastFurnace/TreasureRefineSuccessWin.cs
@@ -1,141 +1,141 @@
using UnityEngine;
using UnityEngine.UI;
using TableConfig;
using System.Collections.Generic;
namespace Snxxz.UI
{
    public class TreasureRefineSuccessWin : Window
    {
        private Text _addFightingText;
        private Text _refineLvText;
        private Text _openSkillText;
        private int _addFighting;
        private Treasure _treasure;
        private TreasureConfig _tagTreasureModel;
        private TreasureRefineConfig _refineModel;
        private PlayerPropertyConfig _propertyModel;
        private FuncConfigConfig _tagFuncModel;
        private SkillConfig tagChinSkill;
        BlastFurnaceModel _furnaceModel;
        BlastFurnaceModel FurnaceModel
        {
            get
            {
                return _furnaceModel ?? (_furnaceModel = ModelCenter.Instance.GetModel<BlastFurnaceModel>());
            }
        }
        #region 实现抽象类
        protected override void BindController()
        {
            _tagFuncModel = ConfigManager.Instance.GetTemplate<FuncConfigConfig>("FightpowerFormula");
            _addFightingText = transform.Find("AddFightingText").GetComponent<Text>();
            _refineLvText = transform.Find("RefineLvText").GetComponent<Text>();
            _openSkillText = transform.Find("OpenSkillText").GetComponent<Text>();
        }
        protected override void AddListeners()
        {
        }
        protected override void OnPreOpen()
        {
            _treasure = FurnaceModel.treasureData;
            if(_treasure != null)
            {
                _refineModel = TreasureRefineConfig.GetTreasureRefineModel(_treasure.id, _treasure.level);
                _tagTreasureModel = ConfigManager.Instance.GetTemplate<TreasureConfig>(_treasure.id);
                InitUI();
            }
        }
        protected override void OnAfterOpen()
        {
        }
        protected override void OnPreClose()
        {
        }
        protected override void OnAfterClose()
        {
        }
       #endregion
        public void InitUI()
        {
            _addFightingText.text = Language.Get("BlastFurnace108",GetAddFighting());
            if(_tagTreasureModel != null)
            {
                _refineLvText.text = Language.Get("BlastFurnace109",_tagTreasureModel.Name,_treasure.level);
            }
            if(_refineModel != null)
            {
                if(_refineModel.OpenSkill != 0)
                {
                    _openSkillText.gameObject.SetActive(true);
                    tagChinSkill = ConfigManager.Instance.GetTemplate<SkillConfig>(_refineModel.OpenSkill);
                    if(tagChinSkill != null)
                    {
                        _openSkillText.text = Language.Get("BlastFurnace110",tagChinSkill.SkillName);
                    }
                }
                else
                {
                    _openSkillText.gameObject.SetActive(false);
                }
            }
            else
            {
                _openSkillText.gameObject.SetActive(false);
            }
            Invoke("CloseWin", 2);
        }
        private int[] attrIds;
        private int[] attrValues;
        private Dictionary<string, string> _attrDict = new Dictionary<string, string>();
        public string GetAddFighting()
        {
            if (_refineModel == null)
                return "";
            FurnaceModel.SetTreasureRefineModel(_refineModel);
            attrIds = FurnaceModel.attrIDs;
            attrValues = FurnaceModel.attrValues;
            int i = 0;
            _attrDict.Clear();
            Equation.Instance.Clear();
            for (i = 0; i < attrIds.Length; i++)
            {
                _propertyModel = ConfigManager.Instance.GetTemplate<PlayerPropertyConfig>(attrIds[i]);
                if (_propertyModel != null)
                {
                    Equation.Instance.AddKeyValue(_propertyModel.Parameter, attrValues[i]);
                }
            }
            if (_tagFuncModel != null)
            {
                return Equation.Instance.Eval<int>(_tagFuncModel.Numerical1).ToString();
            }
            return "";
        }
        private void CloseWin()
        {
            Close();
        }
    }
}
using UnityEngine;
using UnityEngine.UI;
using TableConfig;
using System.Collections.Generic;
namespace Snxxz.UI
{
    public class TreasureRefineSuccessWin : Window
    {
        private Text _addFightingText;
        private Text _refineLvText;
        private Text _openSkillText;
        private int _addFighting;
        private Treasure _treasure;
        private TreasureConfig _tagTreasureModel;
        private TreasureRefineConfig _refineModel;
        private PlayerPropertyConfig _propertyModel;
        private FuncConfigConfig _tagFuncModel;
        private SkillConfig tagChinSkill;
        BlastFurnaceModel _furnaceModel;
        BlastFurnaceModel FurnaceModel
        {
            get
            {
                return _furnaceModel ?? (_furnaceModel = ModelCenter.Instance.GetModel<BlastFurnaceModel>());
            }
        }
        #region 实现抽象类
        protected override void BindController()
        {
            _tagFuncModel = ConfigManager.Instance.GetTemplate<FuncConfigConfig>("FightpowerFormula");
            _addFightingText = transform.Find("AddFightingText").GetComponent<Text>();
            _refineLvText = transform.Find("RefineLvText").GetComponent<Text>();
            _openSkillText = transform.Find("OpenSkillText").GetComponent<Text>();
        }
        protected override void AddListeners()
        {
        }
        protected override void OnPreOpen()
        {
            //_treasure = FurnaceModel.treasureData;
            //if(_treasure != null)
            //{
            //    _refineModel = TreasureRefineConfig.GetTreasureRefineModel(_treasure.id, _treasure.level);
            //    _tagTreasureModel = ConfigManager.Instance.GetTemplate<TreasureConfig>(_treasure.id);
            //    InitUI();
            //}
        }
        protected override void OnAfterOpen()
        {
        }
        protected override void OnPreClose()
        {
        }
        protected override void OnAfterClose()
        {
        }
       #endregion
        public void InitUI()
        {
            //_addFightingText.text = Language.Get("BlastFurnace108",GetAddFighting());
            //if(_tagTreasureModel != null)
            //{
            //    _refineLvText.text = Language.Get("BlastFurnace109",_tagTreasureModel.Name,_treasure.level);
            //}
            //if(_refineModel != null)
            //{
            //    if(_refineModel.OpenSkill != 0)
            //    {
            //        _openSkillText.gameObject.SetActive(true);
            //        tagChinSkill = ConfigManager.Instance.GetTemplate<SkillConfig>(_refineModel.OpenSkill);
            //        if(tagChinSkill != null)
            //        {
            //            _openSkillText.text = Language.Get("BlastFurnace110",tagChinSkill.SkillName);
            //        }
            //    }
            //    else
            //    {
            //        _openSkillText.gameObject.SetActive(false);
            //    }
            //}
            //else
            //{
            //    _openSkillText.gameObject.SetActive(false);
            //}
            //Invoke("CloseWin", 2);
        }
        private int[] attrIds;
        private int[] attrValues;
        private Dictionary<string, string> _attrDict = new Dictionary<string, string>();
        public string GetAddFighting()
        {
            if (_refineModel == null)
                return "";
            FurnaceModel.SetTreasureRefineModel(_refineModel);
            attrIds = FurnaceModel.attrIDs;
            attrValues = FurnaceModel.attrValues;
            int i = 0;
            _attrDict.Clear();
            Equation.Instance.Clear();
            for (i = 0; i < attrIds.Length; i++)
            {
                _propertyModel = ConfigManager.Instance.GetTemplate<PlayerPropertyConfig>(attrIds[i]);
                if (_propertyModel != null)
                {
                    Equation.Instance.AddKeyValue(_propertyModel.Parameter, attrValues[i]);
                }
            }
            if (_tagFuncModel != null)
            {
                return Equation.Instance.Eval<int>(_tagFuncModel.Numerical1).ToString();
            }
            return "";
        }
        private void CloseWin()
        {
            Close();
        }
    }
}
System/BlastFurnace/TreasureRefineTips.cs
@@ -213,73 +213,6 @@
        private void OnClickDandrugCell(bool isOn,CellView cell,TreasureRefineConfig nextRefineModel,Treasure treasure)
        {
            if (!isOn)
                return;
            presentIndex = cell.index;
            TreasureConfig treasureModel = ConfigManager.Instance.GetTemplate<TreasureConfig>(treasure.id);
            _treasureNameText.text = treasureModel.Name;
            TreasureRefineConfig refineModel = TreasureRefineConfig.GetTreasureRefineModel(cell.index,treasure.level);
            _treasureModel = nextRefineModel;
           FurnaceModel.SetTreasureRefineModel(refineModel);
           FurnaceModel.SetTreasureSkillDict(treasure.id,treasure.level);
           FurnaceModel.SetNextTreasureRefineModel(nextRefineModel);
            _treasureSkillDict =FurnaceModel.treasureSkillDict;
            UI3DTreasureExhibition.Instance.BeginShowTreasure(treasure.id,_treasureIcon);
            CreateEffectCell(_treasureSkillDict);
            int i = 0;
            int length = _treasureAttrlist.Count;
            for (i = 0; i < length; i++)
            {
                _treasureAttrlist[i].SetActive(false);
            }
            if (refineModel == null)
            {
                SetTreasureAttrStr(FurnaceModel.nextAttrIDs,null,FurnaceModel.nextAttrValues);
            }
            else if(FurnaceModel.TreasureIsFullLv(treasure.id,treasure.level))
            {
                SetTreasureAttrStr(FurnaceModel.attrIDs,FurnaceModel.attrValues,null);
                _refineMaterContent.SetActive(false);
                _makeDanBtn.gameObject.SetActive(false);
                _noEnoughLVText.gameObject.SetActive(true);
                _noEnoughLVText.text = Language.Get("BlastFurnace102");
            }
            else
            {
                SetTreasureAttrStr(FurnaceModel.attrIDs,FurnaceModel.attrValues,FurnaceModel.nextAttrValues);
            }
            if (FurnaceModel.StoveLV < nextRefineModel.BlastFurnaceLV)
            {
                _refineMaterContent.SetActive(true);
                _makeDanBtn.gameObject.SetActive(false);
                _noEnoughLVText.gameObject.SetActive(true);
                _noEnoughLVText.text = Language.Get("BlastFurnace103");
            }
            if(FurnaceModel.StoveLV >= nextRefineModel.BlastFurnaceLV && !FurnaceModel.TreasureIsFullLv(treasure.id, treasure.level))
            {
                _refineMaterContent.SetActive(true);
                _makeDanBtn.gameObject.SetActive(true);
                _noEnoughLVText.gameObject.SetActive(false);
            }
            ChangeSuccessRate(0);
            RefreshMaterial();
            _refineMaterialButton.RemoveAllListeners();
            _refineMaterialButton.AddListener(() =>
            {
                //ItemWinModel itemWinModel = ItemCommonCtrl.Instance.OnSingleClickItemCell(FurnaceModel.nextRefineMaterialID);
                //ItemPopModel.Instance.SetDefaultShowUIDict(itemWinModel, false);
                //itemWinModel.SetShowWin(itemWinModel);
                ItemAttrData attrData = new ItemAttrData(FurnaceModel.nextRefineMaterialID,true);
                itemTipsModel.SetItemTipsModel(attrData);
            });
            RefreshAllTreasureLv();
            _chooseFireBtn.gameObject.SetActive(true);
        }
        private void SetTreasureAttrStr(int[] attrIds, int[] attrValues,int[] nextAttrValues)
System/FindPrecious/DemonJarModel.cs
@@ -73,6 +73,8 @@
        DungeonModel dungeonModel { get { return ModelCenter.Instance.GetModel<DungeonModel>(); } }
        TreasureModel treasureModel { get { return ModelCenter.Instance.GetModel<TreasureModel>(); } }
        TreasureSoulModel treasureSoulModel { get { return ModelCenter.Instance.GetModel<TreasureSoulModel>(); } }
        public override void Init()
        {
            doubleToKillLowerBossHint = true;
@@ -108,7 +110,7 @@
        public void OnPlayerLoginOk()
        {
            demonJarSoulBuf = treasureModel.GetPrivilegeValue(2);
            demonJarSoulBuf = treasureSoulModel.GetTreasureSoulValue(2);
            demonJarSoulIncreaseDelta = 0;
            var bossId = GetLatestUnLockBoss();
@@ -250,7 +252,7 @@
        public void UpdateDemonJarSoul()
        {
            var demonJarSoul = treasureModel.GetPrivilegeValue(2);
            var demonJarSoul = treasureSoulModel.GetTreasureSoulValue(2);
            demonJarSoulIncreaseDelta = demonJarSoul - demonJarSoulBuf;
            demonJarSoulBuf = demonJarSoul;
        }
System/KnapSack/Logic/TreasureEffectModel.cs
@@ -35,7 +35,7 @@
            treasureSignlist = new List<int>();
            for (int i = 0; i < treasureUplist.Count; i++)
            {
                if(treasureUplist[i].Privilege == (int)TreasurePrivilege.Sign)
                if(treasureUplist[i].MWID == 304)
                {
                    treasureSignlist.Add(treasureUplist[i].ID);
                }
@@ -126,7 +126,7 @@
                if (treasureUpConfig.MWID == treasureId && treasureUpConfig.LV == 0)
                {
                    type = 2;
                    TreasurePrivilegeConfig privilegeConfig = ConfigManager.Instance.GetTemplate<TreasurePrivilegeConfig>(treasureUpConfig.Privilege);
                    TreasurePrivilegeConfig privilegeConfig = ConfigManager.Instance.GetTemplate<TreasurePrivilegeConfig>((int)TreasurePrivilege.Sign);
                    JsonData signData = JsonMapper.ToObject(privilegeConfig.attr);
                    foreach (var key in signData.Keys)
                    {
System/Rune/RuneBreakWin.cs
@@ -40,7 +40,7 @@
            }
        }
        TreasureModel treasureModel { get { return ModelCenter.Instance.GetModel<TreasureModel>(); } }
        TreasureSoulModel treasureSoulModel { get { return ModelCenter.Instance.GetModel<TreasureSoulModel>(); } }
        RuneComposeModel m_RuneComposeModel;
        RuneComposeModel runeComposeModel
@@ -278,7 +278,7 @@
            PlayerDatas.Instance.PlayerDataRefreshInfoEvent += PlayerDataRefreshInfoEvent;
            m_PlayerBreakEffect = false;
            UpdateRuneBreak(true);
            m_ContainerRuneSoul.gameObject.SetActive(treasureModel.IsGetTreasurePrivilege(TreasurePrivilege.RuneBreakExpAdd));
            m_ContainerRuneSoul.gameObject.SetActive(treasureSoulModel.IsGetTreasureSoul((int)TreasurePrivilege.RuneBreakExpAdd));
        }
        protected override void OnAfterOpen()
System/Rune/RuneModel.cs
@@ -230,8 +230,8 @@
        public float GetRuneSoulBreakExp(RuneData _rune)
        {
            ItemConfig _itemCfg = ConfigManager.Instance.GetTemplate<ItemConfig>(_rune.id);
            var _treasureModel = ModelCenter.Instance.GetModel<TreasureModel>();
            var _upper = (float)_treasureModel.GetPrivilegeValue((int)TreasurePrivilege.RuneBreakExpAdd) / 10000;
            var _treasureSoul = ModelCenter.Instance.GetModel<TreasureSoulModel>();
            var _upper = (float)_treasureSoul.GetTreasureSoulValue((int)TreasurePrivilege.RuneBreakExpAdd) / 10000;
            if (_itemCfg.Type == RUNE_CREAMTYPE)
            {
                return _itemCfg.EffectValueA1 * _upper;
@@ -246,8 +246,8 @@
        {
            float _exp = 0;
            ItemConfig _itemCfg = ConfigManager.Instance.GetTemplate<ItemConfig>(_rune.id);
            var _treasureModel = ModelCenter.Instance.GetModel<TreasureModel>();
            var _upper = (float)_treasureModel.GetPrivilegeValue((int)TreasurePrivilege.RuneBreakExpAdd) / 10000;
            var _treasureSoul = ModelCenter.Instance.GetModel<TreasureSoulModel>();
            var _upper = (float)_treasureSoul.GetTreasureSoulValue((int)TreasurePrivilege.RuneBreakExpAdd) / 10000;
            if (_itemCfg.Type == RUNE_CREAMTYPE)
            {
                return _itemCfg.EffectValueA1 + _itemCfg.EffectValueA1 * _upper;
System/Treasure/FairyTreasureCollectPanelPattern1.cs
File was deleted
System/Treasure/FairyTreasureCollectPanelPattern4.cs
@@ -80,30 +80,30 @@
        private void OnSignRefresh()
        {
            if (treasure.treasureStages[0].unlockType == TreasureStageUnlock.Privilege)
            {
                var _specialData = treasure.treasureStages[0].specialData;
                if (_specialData.type == TreasurePrivilege.Sign)
                {
                    var _property = _specialData.propertyDict.First();
                    var _propertyCfg = ConfigManager.Instance.GetTemplate<PlayerPropertyConfig>(_property.Key);
                    m_SignPropertyEffect.text = Language.Get("FairyTreasure_5",
                        _property.Value, _propertyCfg.Name);
                    m_SignInTotalDays.text = Language.Get("FairyTreasure_6", signInModel.SumSignNum);
                    if (treasure.state != TreasureState.Collected)
                    {
                        m_ProerptyValue.text = Language.Get("FairyTreasure_7",
                            _propertyCfg.Name, signInModel.SumSignNum * _property.Value);
                        m_SignInTip.text = Language.Get("SignInTreasureTip1");
                    }
                    else
                    {
                        m_ProerptyValue.text = Language.Get("FairyTreasure_8",
                           _propertyCfg.Name, signInModel.SumSignNum * _property.Value);
                        m_SignInTip.text = Language.Get("SignInTreasureTip2");
                    }
                }
            }
            //if (treasure.treasureStages[0].unlockType == TreasureStageUnlock.Privilege)
            //{
            //    var _specialData = treasure.treasureStages[0].specialData;
            //    if (_specialData.type == TreasurePrivilege.Sign)
            //    {
            //        var _property = _specialData.propertyDict.First();
            //        var _propertyCfg = ConfigManager.Instance.GetTemplate<PlayerPropertyConfig>(_property.Key);
            //        m_SignPropertyEffect.text = Language.Get("FairyTreasure_5",
            //            _property.Value, _propertyCfg.Name);
            //        m_SignInTotalDays.text = Language.Get("FairyTreasure_6", signInModel.SumSignNum);
            //        if (treasure.state != TreasureState.Collected)
            //        {
            //            m_ProerptyValue.text = Language.Get("FairyTreasure_7",
            //                _propertyCfg.Name, signInModel.SumSignNum * _property.Value);
            //            m_SignInTip.text = Language.Get("SignInTreasureTip1");
            //        }
            //        else
            //        {
            //            m_ProerptyValue.text = Language.Get("FairyTreasure_8",
            //               _propertyCfg.Name, signInModel.SumSignNum * _property.Value);
            //            m_SignInTip.text = Language.Get("SignInTreasureTip2");
            //        }
            //    }
            //}
        }
    }
}
System/Treasure/TreasureData.cs
@@ -17,13 +17,6 @@
    {
        public int id { get; private set; }
        int m_Level;
        public int level
        {
            get { return m_Level; }
            set { m_Level = value; }
        }
        int m_Stage;
        public int stage
        {
@@ -52,7 +45,6 @@
            set { m_State = value; }
        }
        #region 旧数据
        int m_Progress = 0;
        public int progress
        {
@@ -115,8 +107,6 @@
        public List<int> achievements = new List<int>();
        public Dictionary<int, AchievementGroup> achievementGroups = new Dictionary<int, AchievementGroup>();
        public Item[] needItems { get; private set; }
        public Redpoint skillLevelUpRedpoint { get; private set; }
        public Redpoint achievementRedpoint { get; private set; }
@@ -188,29 +178,6 @@
                        tempPotentials.Add(new TreasurePotential(skillId, 0));
                    }
                }
            }
            if (!string.IsNullOrEmpty(config.NeedItem))
            {
                try
                {
                    var stringSet = config.NeedItem.Split('|');
                    needItems = new Item[stringSet.Length];
                    for (int i = 0; i < needItems.Length; i++)
                    {
                        var itemStrings = stringSet[i].Split('_');
                        needItems[i] = new Item(int.Parse(itemStrings[0]), int.Parse(itemStrings[1]));
                    }
                }
                catch (Exception ex)
                {
                    Debug.Log(ex.StackTrace);
                }
            }
            else
            {
                needItems = null;
            }
        }
@@ -269,40 +236,11 @@
            return configA.ReOrder < configB.ReOrder ? -1 : 1;
        }
        #endregion
        public TreasureSpecialData specialData { get; private set; }
        public List<TreasureStage> treasureStages = new List<TreasureStage>();
        public void UpdateTreasureStage(TreasureUpConfig _cfg)
        {
            TreasureStage _stage;
            if (_cfg.UnLockFuncID != 0)
            {
                _stage = new TreasureStage(_cfg.UnLockFuncID);
                unLockFunc = _stage.func;
            }
            else if (_cfg.Privilege != 0)
            {
                _stage = new TreasureStage(_cfg.Privilege, TreasureStageUnlock.Privilege);
                specialData = _stage.specialData;
                unLockPrivilege = _stage.privilege;
            }
            else if (_cfg.UnLockSkill != null && _cfg.UnLockSkill.Length > 1)
            {
                _stage = new TreasureStage(_cfg.UnLockSkill);
            }
            else if (!_cfg.AddAttr.Equals(string.Empty))
            {
                _stage = new TreasureStage(_cfg.AddAttr);
            }
            else
            {
                _stage = new TreasureStage();
            }
            _stage.exp = _cfg.NeedExp;
            _stage.stage = _cfg.LV;
            _stage.limitLevel = _cfg.LVLimit;
            TreasureStage _stage = new TreasureStage(_cfg);
            treasureStages.Add(_stage);
        }
@@ -374,12 +312,6 @@
                }
                ModelCenter.Instance.GetModel<TreasureModel>().HumanTreasureStateChange(base.id);
            }
        }
        public HumanTreasure(int _id)
            : base(_id)
        {
        }
        public HumanTreasure(int _id, int[] _potentialIds, Redpoint _skillLevelUpRedpoint, Redpoint _achievementPoint
@@ -600,63 +532,71 @@
        public Dictionary<int, int> propertyDict { get; private set; }
        public Dictionary<int, int> skillDict { get; private set; }
        public int func { get; private set; }
        public int privilege { get; private set; }
        public Item item { get; private set; }
        public int treasure { get; private set; }
        public int exp { get; set; }
        public TreasureSpecialData specialData { get; private set; }
        public int stateSfxId { get; private set; }
        public const int selectedSfxId = 5144;
        public string sfxGotState { get; private set; }
        public string sfxUnGotState { get; private set; }
        public int limitLevel { get; set; }
        public TreasureStage()
        public TreasureStage(TreasureUpConfig _config)
        {
            unlockType = TreasureStageUnlock.None;
        }
        public TreasureStage(int _value, TreasureStageUnlock _type = TreasureStageUnlock.Func)
        {
            unlockType = _type;
            func = _type == TreasureStageUnlock.Func ? _value : 0;
            privilege = _type == TreasureStageUnlock.Privilege ? _value : 0;
            stateSfxId = 5141;
            sfxGotState = "Effect_FaBao_Icon_JiNeng_01";
            sfxUnGotState = "Effect_FaBao_Icon_JiNeng_02";
            //stateSfxId = _type == TreasureStageUnlock.Func ? 5140 : 5143;
            //sfxGotState = _type == TreasureStageUnlock.Func ? "Effect_FaBao_Icon_GongNeng_01" : "Effect_FaBao_Icon_TeQuan_02";
            //sfxUnGotState = _type == TreasureStageUnlock.Func ? "Effect_FaBao_Icon_GongNeng" : "Effect_FaBao_Icon_TeQuan";
            if (_type == TreasureStageUnlock.Privilege)
            if (_config.UnLockFuncID != 0)
            {
                SetSpecial();
                unlockType = TreasureStageUnlock.Func;
                func = _config.UnLockFuncID;
            }
        }
        public TreasureStage(string _property)
        {
            unlockType = TreasureStageUnlock.Property;
            propertyDict = ConfigParse.GetDic<int, int>(_property);
            stateSfxId = propertyDict.ContainsKey(6) ? 5142 : 5139;
            sfxGotState = propertyDict.ContainsKey(6) ? "Effect_FaBao_Icon_ShengMing" : "Effect_FaBao_Icon_GongJi";
            sfxUnGotState = propertyDict.ContainsKey(6) ? "Effect_FaBao_Icon_ShengMing" : "Effect_FaBao_Icon_GongJi";
        }
        public TreasureStage(int[] _skills)
        {
            unlockType = TreasureStageUnlock.Skill;
            stateSfxId = 5141;
            sfxGotState = "Effect_FaBao_Icon_JiNeng_01";
            sfxUnGotState = "Effect_FaBao_Icon_JiNeng_02";
            skillDict = new Dictionary<int, int>();
            for (int i = 0; i < _skills.Length; i++)
            else if (_config.UnLockSkill != null && _config.UnLockSkill.Length > 1)
            {
                skillDict.Add(i + 1, _skills[i]);
                unlockType = TreasureStageUnlock.Skill;
                skillDict = new Dictionary<int, int>();
                for (int i = 0; i < _config.UnLockSkill.Length; i++)
                {
                    skillDict.Add(i + 1, _config.UnLockSkill[i]);
                }
            }
        }
            else if (!string.IsNullOrEmpty(_config.AddAttr))
            {
                unlockType = TreasureStageUnlock.Property;
                propertyDict = ConfigParse.GetDic<int, int>(_config.AddAttr);
            }
            else if (_config.ActiveMWID != 0)
            {
                unlockType = TreasureStageUnlock.Treasure;
                treasure = _config.ActiveMWID;
            }
            else if (!string.IsNullOrEmpty(_config.ItemAward))
            {
                unlockType = TreasureStageUnlock.Item;
                var itemArray = LitJson.JsonMapper.ToObject<int[]>(_config.ItemAward);
                if (itemArray != null && itemArray.Length > 0)
                {
                    item = new Item()
                    {
                        id = itemArray[0],
                        count = itemArray.Length > 1 ? itemArray[1] : 1,
                        bind = itemArray.Length > 2 ? (itemArray[2] == 1) : false,
                    };
                }
            }
        public void SetSpecial()
        {
            var _priviligeCfg = ConfigManager.Instance.GetTemplate<TreasurePrivilegeConfig>(privilege);
            specialData = new TreasureSpecialData((TreasurePrivilege)_priviligeCfg.PrivilegeID);
            exp = _config.NeedExp;
            stage = _config.LV;
            switch (unlockType)
            {
                case TreasureStageUnlock.Property:
                    stateSfxId = propertyDict.ContainsKey(6) ? 5142 : 5139;
                    sfxGotState = propertyDict.ContainsKey(6) ? "Effect_FaBao_Icon_ShengMing" : "Effect_FaBao_Icon_GongJi";
                    sfxUnGotState = propertyDict.ContainsKey(6) ? "Effect_FaBao_Icon_ShengMing" : "Effect_FaBao_Icon_GongJi";
                    break;
                default:
                    stateSfxId = 5141;
                    sfxGotState = "Effect_FaBao_Icon_JiNeng_01";
                    sfxUnGotState = "Effect_FaBao_Icon_JiNeng_02";
                    break;
            }
        }
        public int GetSkill(int _job)
@@ -682,8 +622,6 @@
                        return _skillCfg.FightPower;
                    }
                    break;
                case TreasureStageUnlock.Privilege:
                    return specialData.GetFightPower();
            }
            return 0;
        }
@@ -695,297 +633,8 @@
        Property,
        Skill,
        Func,
        Privilege,
    }
    public enum TreasurePrivilege
    {
        Property = 1,
        DemonJarAtk = 2,
        StrengthenAdd = 3,
        RuneBreakExpAdd = 4,
        MountAtk = 5,
        PetHp = 6,
        Boss = 7,
        Wing = 8,
        Suit = 9,
        Wash = 10,
        Sign = 11,
    }
    public enum TreasurePrivilegeState
    {
        Doing = 0,
        Reward = 1,
        Complete = 2
    }
    public class TreasureSpecialData
    {
        public TreasurePrivilege type { get; private set; }
        public int progress { get; private set; }
        public int totalProgress { get; private set; }
        public int effectValue { get; private set; }
        public List<AwardItem> items { get; private set; }
        public Dictionary<int, int> propertyDict { get; private set; }
        public Redpoint privilegeRedpoint { get; private set; }
        private TreasurePrivilegeState m_State = TreasurePrivilegeState.Doing;
        public TreasurePrivilegeState state
        {
            get { return m_State; }
            set { m_State = value; }
        }
        public int presentFinishCount { get; set; }
        public int presentGetCount { get; set; }
        public bool itemGet { get; set; }
        public TreasureSpecialData(TreasurePrivilege _type)
        {
            type = _type;
            var config = ConfigManager.Instance.GetTemplate<TreasurePrivilegeConfig>((int)_type);
            progress = Mathf.Max(1, config.singleValue);
            totalProgress = config.maxValue;
            var _effectValue = 0;
            int.TryParse(config.EffectValue, out _effectValue);
            effectValue = _effectValue;
            if (!string.IsNullOrEmpty(config.attr))
            {
                var propertyJson = LitJson.JsonMapper.ToObject(config.attr);
                propertyDict = new Dictionary<int, int>();
                foreach (var _key in propertyJson.Keys)
                {
                    var _property = int.Parse(_key);
                    var _value = int.Parse(propertyJson[_key].ToJson());
                    propertyDict.Add(_property, _value);
                }
            }
            if (!string.IsNullOrEmpty(config.itemAward))
            {
                var itemArray = LitJson.JsonMapper.ToObject<int[][]>(config.itemAward);
                if (itemArray != null && itemArray.Length > 0)
                {
                    items = new List<AwardItem>();
                    for (int i = 0; i < itemArray.Length; i++)
                    {
                        var _array = itemArray[i];
                        items.Add(new AwardItem()
                        {
                            isBind = _array[2],
                            item = new Item()
                            {
                                id = _array[0],
                                count = _array[1],
                            },
                        });
                    }
                }
            }
            if (type == TreasurePrivilege.PetHp)
            {
                var petCount = ConfigManager.Instance.GetAllValues<PetInfoConfig>().Count;
                totalProgress = petCount;
            }
            else if (type == TreasurePrivilege.MountAtk)
            {
                var mountConfigs = ConfigManager.Instance.GetAllValues<HorseConfig>();
                var maxlv = 0;
                for (int i = 0; i < mountConfigs.Count; i++)
                {
                    maxlv += mountConfigs[i].MaxLV;
                }
                totalProgress = maxlv;
            }
            else if (type == TreasurePrivilege.StrengthenAdd)
            {
                var configs = ConfigManager.Instance.GetAllValues<ItemPlusSumAttrConfig>();
                totalProgress = configs[configs.Count - 1].countNeed;
            }
            switch (_type)
            {
                case TreasurePrivilege.DemonJarAtk:
                case TreasurePrivilege.StrengthenAdd:
                case TreasurePrivilege.MountAtk:
                case TreasurePrivilege.PetHp:
                case TreasurePrivilege.Boss:
                case TreasurePrivilege.Wash:
                    privilegeRedpoint = new Redpoint(TreasureModel.TREASURE_SOUL_ID, TreasureModel.TREASURE_SOUL_ID * 100 + (int)type);
                    break;
            }
        }
        public int GetPrivilegeValue(int _index = 0)
        {
            switch (type)
            {
                case TreasurePrivilege.RuneBreakExpAdd:
                    return effectValue;
                case TreasurePrivilege.DemonJarAtk:
                case TreasurePrivilege.Suit:
                    return effectValue;
                case TreasurePrivilege.Wing:
                case TreasurePrivilege.StrengthenAdd:
                    return effectValue;
            }
            return 0;
        }
        public void UpdateState()
        {
            switch (type)
            {
                case TreasurePrivilege.Property:
                case TreasurePrivilege.RuneBreakExpAdd:
                case TreasurePrivilege.Wing:
                case TreasurePrivilege.Suit:
                    state = TreasurePrivilegeState.Complete;
                    break;
                case TreasurePrivilege.Boss:
                case TreasurePrivilege.DemonJarAtk:
                case TreasurePrivilege.PetHp:
                case TreasurePrivilege.MountAtk:
                    privilegeRedpoint.state = RedPointState.None;
                    if (presentFinishCount >= totalProgress && (presentGetCount / progress) >= (totalProgress / progress))
                    {
                        state = TreasurePrivilegeState.Complete;
                    }
                    else if (presentGetCount > 0 && presentFinishCount / progress < presentGetCount / progress)
                    {
                        state = TreasurePrivilegeState.Reward;
                        privilegeRedpoint.state = RedPointState.Simple;
                    }
                    else
                    {
                        state = TreasurePrivilegeState.Doing;
                    }
                    break;
                case TreasurePrivilege.Wash:
                    privilegeRedpoint.state = itemGet ? RedPointState.None : RedPointState.Simple;
                    state = itemGet ? TreasurePrivilegeState.Doing : TreasurePrivilegeState.Reward;
                    break;
                case TreasurePrivilege.StrengthenAdd:
                    privilegeRedpoint.state = RedPointState.None;
                    var strengthen = ModelCenter.Instance.GetModel<PlayerStrengthengDatas>();
                    var playerpack = ModelCenter.Instance.GetModel<PlayerPackModel>();
                    presentGetCount = 0;
                    foreach (var value in strengthen._EqInfo.Values)
                    {
                        ItemModel itemModel = playerpack.GetItemModelByIndex(PackType.rptEquip, value.EquipIndex);
                        if (itemModel != null)
                        {
                            presentGetCount += value.EquipPartStarLV;
                        }
                    }
                    var configs = ConfigManager.Instance.GetAllValues<ItemPlusSumAttrConfig>();
                    bool contains = configs.FindIndex((x) =>
                    {
                        return x.countNeed > presentFinishCount && presentGetCount >= x.countNeed;
                    }) != -1;
                    if (presentFinishCount >= totalProgress && presentGetCount >= totalProgress)
                    {
                        state = TreasurePrivilegeState.Complete;
                    }
                    else if (contains)
                    {
                        state = TreasurePrivilegeState.Reward;
                        privilegeRedpoint.state = RedPointState.Simple;
                    }
                    else
                    {
                        state = TreasurePrivilegeState.Doing;
                    }
                    break;
            }
        }
        public string ProgressDisplay()
        {
            switch (type)
            {
                case TreasurePrivilege.DemonJarAtk:
                case TreasurePrivilege.PetHp:
                case TreasurePrivilege.MountAtk:
                case TreasurePrivilege.Boss:
                    if (state == TreasurePrivilegeState.Complete) { return UIHelper.GetTextColorByItemColor(TextColType.Green, totalProgress.ToString(), true); }
                    else if (state == TreasurePrivilegeState.Doing)
                    {
                        return StringUtility.Contact(UIHelper.GetTextColorByItemColor(TextColType.Red, presentGetCount.ToString(), true), "/", (presentFinishCount / progress + 1) * progress);
                    }
                    else if (state == TreasurePrivilegeState.Reward)
                    {
                        var _completeCount = (presentFinishCount / progress + 1) * progress;
                        return StringUtility.Contact(UIHelper.GetTextColorByItemColor(TextColType.Green, presentGetCount.ToString(), true), "/", _completeCount);
                    }
                    break;
                case TreasurePrivilege.StrengthenAdd:
                    var configs = ConfigManager.Instance.GetAllValues<ItemPlusSumAttrConfig>();
                    var next = configs.Count - 1;
                    for (int i = 0; i < configs.Count; i++)
                    {
                        if (configs[i].countNeed > presentFinishCount)
                        {
                            next = i;
                            break;
                        }
                    }
                    if (state == TreasurePrivilegeState.Complete) { return totalProgress.ToString(); }
                    else if (state == TreasurePrivilegeState.Doing
                        || state == TreasurePrivilegeState.Reward)
                    {
                        var colortype = presentGetCount >= configs[next].countNeed ? TextColType.Green : TextColType.Red;
                        return StringUtility.Contact(UIHelper.GetTextColorByItemColor(colortype, presentGetCount.ToString(), true), "/", configs[next].countNeed);
                    }
                    break;
            }
            return string.Empty;
        }
        public void GetReward()
        {
            switch (type)
            {
                case TreasurePrivilege.MountAtk:
                case TreasurePrivilege.DemonJarAtk:
                case TreasurePrivilege.PetHp:
                case TreasurePrivilege.Boss:
                case TreasurePrivilege.Wash:
                    var _pak = new CA504_tagCMPlayerGetReward();
                    _pak.RewardType = (int)GotServerRewardType.Def_RewardType_TreasureSoul;
                    _pak.DataEx = (uint)type;
                    _pak.DataExStrLen = 0;
                    _pak.DataExStr = string.Empty;
                    GameNetSystem.Instance.SendInfo(_pak);
                    break;
                case TreasurePrivilege.StrengthenAdd:
                    var configs = ConfigManager.Instance.GetAllValues<ItemPlusSumAttrConfig>();
                    var present = 0;
                    for (int i = 0; i < configs.Count; i++)
                    {
                        if (presentGetCount >= configs[i].countNeed)
                        {
                            present = i;
                        }
                    }
                    CA503_tagCMActiveAllEquipAttr pak = new CA503_tagCMActiveAllEquipAttr();
                    pak.Type = 0;
                    pak.Cnt = (uint)configs[present].countNeed;
                    GameNetSystem.Instance.SendInfo(pak);
                    break;
            }
        }
        public int GetFightPower()
        {
            var _fightPower = 0;
            if (propertyDict != null)
            {
                _fightPower += UIHelper.GetFightPower(propertyDict);
            }
            return _fightPower;
        }
        Item,
        Treasure,
    }
}
System/Treasure/TreasureLevelUpWin.cs
@@ -163,7 +163,7 @@
            model.treasureLevelProgressUpdateEvent += TreasureLevelProgressUpdateEvent;
            model.treasureSelectedEvent += TreasureSelectedEvent;
            model.treasureStageUpEvent += TreasureStageUpEvent;
            PlayerDatas.Instance.PlayerDataRefreshInfoEvent += PlayerDataRefreshInfoEvent;
            //PlayerDatas.Instance.PlayerDataRefreshInfoEvent += PlayerDataRefreshInfoEvent;
            m_TreasureAnimation.OnStepComplete += OnStepComplete;
            RedpointCenter.Instance.redpointValueChangeEvent += RedpointValueChangeEvent;
            achievementModel.achievementCompletedEvent += AchievementCompletedEvent;
@@ -209,7 +209,7 @@
            PlayerTaskDatas.CardLevelChange -= CardLevelChange;
            model.treasureSelectedEvent -= TreasureSelectedEvent;
            model.treasureStageUpEvent -= TreasureStageUpEvent;
            PlayerDatas.Instance.PlayerDataRefreshInfoEvent -= PlayerDataRefreshInfoEvent;
            //PlayerDatas.Instance.PlayerDataRefreshInfoEvent -= PlayerDataRefreshInfoEvent;
            m_TreasureAnimation.OnStepComplete -= OnStepComplete;
            RedpointCenter.Instance.redpointValueChangeEvent -= RedpointValueChangeEvent;
            achievementModel.achievementCompletedEvent -= AchievementCompletedEvent;
@@ -423,31 +423,31 @@
            }
        }
        private void PlayerDataRefreshInfoEvent(PlayerDataRefresh type)
        {
            if (type != PlayerDataRefresh.LV)
            {
                return;
            }
            if (m_Treasure != null && m_Treasure.state != TreasureState.Collected)
            {
                UpdateTreasureUnlockDetail();
            }
            else if (m_Treasure != null && m_Treasure.state == TreasureState.Collected)
            {
                if (m_TreasureAnimation.stepComplete && !model.treasureStepUpShow
                    && !m_AchievementScroll.showing && !m_Treasure.IsMaxStage())
                {
                    var _stage = m_Treasure.treasureStages[m_Treasure.StageCount - 1];
                    if (beforePlayerLv < _stage.limitLevel && PlayerDatas.Instance.baseData.LV >= _stage.limitLevel)
                    {
                        DisplayAchievements(true);
                        UpdateTreasureProgress();
                    }
                }
                beforePlayerLv = PlayerDatas.Instance.baseData.LV;
            }
        }
        //private void PlayerDataRefreshInfoEvent(PlayerDataRefresh type)
        //{
        //    if (type != PlayerDataRefresh.LV)
        //    {
        //        return;
        //    }
        //    if (m_Treasure != null && m_Treasure.state != TreasureState.Collected)
        //    {
        //        UpdateTreasureUnlockDetail();
        //    }
        //    else if (m_Treasure != null && m_Treasure.state == TreasureState.Collected)
        //    {
        //        if (m_TreasureAnimation.stepComplete && !model.treasureStepUpShow
        //            && !m_AchievementScroll.showing && !m_Treasure.IsMaxStage())
        //        {
        //            var _stage = m_Treasure.treasureStages[m_Treasure.StageCount - 1];
        //            if (beforePlayerLv < _stage.limitLevel && PlayerDatas.Instance.baseData.LV >= _stage.limitLevel)
        //            {
        //                DisplayAchievements(true);
        //                UpdateTreasureProgress();
        //            }
        //        }
        //        beforePlayerLv = PlayerDatas.Instance.baseData.LV;
        //    }
        //}
        private void OnFuncStateChangeEvent(int _id)
        {
@@ -566,14 +566,14 @@
                FuncOpen.Instance.ProcessorFuncErrorTip(126);
                return;
            }
            var _stage = m_Treasure.treasureStages.Find((x) =>
            {
                return x.unlockType == TreasureStageUnlock.Privilege;
            });
            if (_stage != null)
            {
                OpenTreasureStageTip(_stage.stage, m_PrivilegeLockBtn.transform as RectTransform);
            }
            //var _stage = m_Treasure.treasureStages.Find((x) =>
            //{
            //    return x.unlockType == TreasureStageUnlock.Privilege;
            //});
            //if (_stage != null)
            //{
            //    OpenTreasureStageTip(_stage.stage, m_PrivilegeLockBtn.transform as RectTransform);
            //}
        }
        private void OpenTreasureStageTip(int _stage, RectTransform _target)
@@ -1016,7 +1016,7 @@
                case TreasureStageUnlock.Func:
                    StartScreenShot();
                    break;
                case TreasureStageUnlock.Privilege:
                //case TreasureStageUnlock.Privilege:
                case TreasureStageUnlock.Property:
                    WindowCenter.Instance.Open<TreasureNewStageWin>(true);
                    break;
@@ -1178,31 +1178,31 @@
                        m_TreasureStageDesc.text = Language.Get("TreasureLevelUpSkill", _funcCfg.Remark);
                        m_CurrentStageIcon.SetSprite(_funcCfg.Icon);
                        break;
                    case TreasureStageUnlock.Privilege:
                        var privilege = m_Treasure.treasureStages[m_Treasure.StageCount - 1];
                        var _privilegeCfg = ConfigManager.Instance.GetTemplate<TreasurePrivilegeConfig>(_nextStage.privilege);
                        if (!FuncOpen.Instance.IsFuncOpen(126))
                        {
                            m_CurrentStageIcon.SetSprite("UnKnowIcon");
                            if (!FuncOpen.Instance.IsFuncOpen(126))
                            {
                                var funcConfig = ConfigManager.Instance.GetTemplate<FuncOpenLVConfig>(126);
                                m_TreasureStageDesc.text = Language.Get("TreasurePrivilegeFuncLimit", funcConfig.LimitLV, funcConfig.Remark);
                            }
                        }
                        else
                        {
                            m_CurrentStageIcon.SetSprite(_privilegeCfg.Icon);
                            if (PlayerDatas.Instance.baseData.LV >= _nextStage.limitLevel)
                            {
                                m_TreasureStageDesc.text = _privilegeCfg.Name;
                            }
                            else
                            {
                                m_TreasureStageDesc.text = Language.Get("TreasurePrivilege_Unlock", _nextStage.limitLevel);
                            }
                        }
                        break;
                    //case TreasureStageUnlock.Privilege:
                    //    var privilege = m_Treasure.treasureStages[m_Treasure.StageCount - 1];
                    //    var _privilegeCfg = ConfigManager.Instance.GetTemplate<TreasurePrivilegeConfig>(_nextStage.privilege);
                    //    if (!FuncOpen.Instance.IsFuncOpen(126))
                    //    {
                    //        m_CurrentStageIcon.SetSprite("UnKnowIcon");
                    //        if (!FuncOpen.Instance.IsFuncOpen(126))
                    //        {
                    //            var funcConfig = ConfigManager.Instance.GetTemplate<FuncOpenLVConfig>(126);
                    //            m_TreasureStageDesc.text = Language.Get("TreasurePrivilegeFuncLimit", funcConfig.LimitLV, funcConfig.Remark);
                    //        }
                    //    }
                    //    else
                    //    {
                    //        m_CurrentStageIcon.SetSprite(_privilegeCfg.Icon);
                    //        if (PlayerDatas.Instance.baseData.LV >= _nextStage.limitLevel)
                    //        {
                    //            m_TreasureStageDesc.text = _privilegeCfg.Name;
                    //        }
                    //        else
                    //        {
                    //            m_TreasureStageDesc.text = Language.Get("TreasurePrivilege_Unlock", _nextStage.limitLevel);
                    //        }
                    //    }
                    //    break;
                }
            }
            else
System/Treasure/TreasureMeridianBehaviour.cs
@@ -92,14 +92,14 @@
            if (m_TreasureStage != null
                && m_TreasureStage.unlockType != TreasureStageUnlock.Property)
            {
                if (m_TreasureStage.unlockType == TreasureStageUnlock.Privilege)
                {
                    if (!FuncOpen.Instance.IsFuncOpen(126))
                    {
                        FuncOpen.Instance.ProcessorFuncErrorTip(126);
                        return;
                    }
                }
                //if (m_TreasureStage.unlockType == TreasureStageUnlock.Privilege)
                //{
                //    if (!FuncOpen.Instance.IsFuncOpen(126))
                //    {
                //        FuncOpen.Instance.ProcessorFuncErrorTip(126);
                //        return;
                //    }
                //}
                model.selectedStage = m_TreasureStage.stage;
                if (!WindowCenter.Instance.CheckOpen<TreasureStageTipWin>())
                {
@@ -174,21 +174,21 @@
                        m_Descs[0].gameObject.SetActive(true);
                        m_Icon.SetSprite(_funcCfg.Icon);
                        break;
                    case TreasureStageUnlock.Privilege:
                        m_Descs[0].gameObject.SetActive(true);
                        m_Descs[0].color = UIHelper.s_LightYellow;
                        var _privilegeCfg = ConfigManager.Instance.GetTemplate<TreasurePrivilegeConfig>(m_TreasureStage.privilege);
                        if (FuncOpen.Instance.IsFuncOpen(126))
                        {
                            m_Icon.SetSprite(_privilegeCfg.Icon);
                            m_Descs[0].text = _privilegeCfg.Name;
                        }
                        else
                        {
                            m_Icon.SetSprite("UnKnowIcon");
                            m_Descs[0].text = string.Empty;
                        }
                        break;
                    //case TreasureStageUnlock.Privilege:
                    //    m_Descs[0].gameObject.SetActive(true);
                    //    m_Descs[0].color = UIHelper.s_LightYellow;
                    //    var _privilegeCfg = ConfigManager.Instance.GetTemplate<TreasurePrivilegeConfig>(m_TreasureStage.privilege);
                    //    if (FuncOpen.Instance.IsFuncOpen(126))
                    //    {
                    //        m_Icon.SetSprite(_privilegeCfg.Icon);
                    //        m_Descs[0].text = _privilegeCfg.Name;
                    //    }
                    //    else
                    //    {
                    //        m_Icon.SetSprite("UnKnowIcon");
                    //        m_Descs[0].text = string.Empty;
                    //    }
                    //    break;
                }
                m_Icon.SetNativeSize();
            }
@@ -200,22 +200,22 @@
            {
                return;
            }
            if (m_TreasureStage != null && m_TreasureStage.unlockType == TreasureStageUnlock.Privilege)
            {
                var _privilegeCfg = ConfigManager.Instance.GetTemplate<TreasurePrivilegeConfig>(m_TreasureStage.privilege);
                if (FuncOpen.Instance.IsFuncOpen(126))
                {
                    m_Icon.SetSprite(_privilegeCfg.Icon);
                    m_Icon.SetNativeSize();
                    m_Descs[0].text = _privilegeCfg.Name;
                }
                else
                {
                    m_Icon.SetSprite("UnKnowIcon");
                    m_Icon.SetNativeSize();
                    m_Descs[0].text = string.Empty;
                }
            }
            //if (m_TreasureStage != null && m_TreasureStage.unlockType == TreasureStageUnlock.Privilege)
            //{
            //    var _privilegeCfg = ConfigManager.Instance.GetTemplate<TreasurePrivilegeConfig>(m_TreasureStage.privilege);
            //    if (FuncOpen.Instance.IsFuncOpen(126))
            //    {
            //        m_Icon.SetSprite(_privilegeCfg.Icon);
            //        m_Icon.SetNativeSize();
            //        m_Descs[0].text = _privilegeCfg.Name;
            //    }
            //    else
            //    {
            //        m_Icon.SetSprite("UnKnowIcon");
            //        m_Icon.SetNativeSize();
            //        m_Descs[0].text = string.Empty;
            //    }
            //}
        }
        private void OnLineStepComplete()
System/Treasure/TreasureModel.cs
@@ -46,9 +46,7 @@
        public event Action vipKillNPCTreasureEvent;
        public event Action<int> treasureLevelProgressUpdateEvent;
        public event Action<int> treasureStageUpEvent;
        public event Action<int> treasurePrivilegeUpdateEvent;
        public event Action<int> humanTreasureStateChangeEvent;
        public event Action<int> treasureSelectSoulChangeEvent;
        bool m_WaitOpenDetailsWin = false;
        public bool waitOpenDetailsWin {
@@ -81,22 +79,6 @@
                }
            }
        }
        int m_SelectSoul = 0;
        public int selectSoul
        {
            get { return m_SelectSoul; }
            set
            {
                m_SelectSoul = value;
                if (treasureSelectSoulChangeEvent != null)
                {
                    treasureSelectSoulChangeEvent(value);
                }
            }
        }
        public int gotoSoul { get; set; }
        int m_SelectedStage = 0;
        public int selectedStage {
@@ -187,7 +169,6 @@
        Dictionary<int, Treasure> treasures = new Dictionary<int, Treasure>();
        Dictionary<TreasureCategory, List<int>> treasureCategory = new Dictionary<TreasureCategory, List<int>>();
        Dictionary<int, int> treasureMapDict = new Dictionary<int, int>();
        Dictionary<int, TreasureSpecialData> treasurePrivilegeDict = new Dictionary<int, TreasureSpecialData>();
        Dictionary<int, int> treasureAchievementDict = new Dictionary<int, int>();
        List<int> eightFurnacesAchievements = new List<int>();
        List<int> m_CacheGotAchievements = new List<int>();
@@ -264,7 +245,6 @@
            FuncOpen.Instance.OnFuncStateChangeEvent += OnFunctionStateChange;
            packageModel.RefreshItemCountAct += OnPackageItemChange;
            WindowCenter.Instance.windowAfterOpenEvent += OnWindowOpen;
            PlayerStrengthengDatas.RefreshEquipUpgradLvAct += RefreshEquipSTRLv;
        }
        public override void UnInit()
@@ -278,7 +258,6 @@
            FuncOpen.Instance.OnFuncStateChangeEvent -= OnFunctionStateChange;
            packageModel.RefreshItemCountAct -= OnPackageItemChange;
            WindowCenter.Instance.windowAfterOpenEvent -= OnWindowOpen;
            PlayerStrengthengDatas.RefreshEquipUpgradLvAct -= RefreshEquipSTRLv;
        }
        public void OnAfterPlayerDataInitialize()
@@ -301,9 +280,6 @@
                {
                    var humanTreasure = treasure as HumanTreasure;
                    humanTreasure.humanState = HumanTreasureState.Locked;
                    treasure.specialData.presentFinishCount = 0;
                    treasure.specialData.presentGetCount = 0;
                    treasure.specialData.itemGet = false;
                }
            }
        }
@@ -314,7 +290,6 @@
            UpdateAchievementRedpoints();
            UpdateCastSoulRedpoints();
            UpdateSkillLevelUpRedpoints();
            UpdatePrivileges();
        }
        private bool needDisplayReguluLevelUp = false;
@@ -748,11 +723,6 @@
                    UpdateSkillLevelUpRedpoints();
                }
            }
            if (_type == PackType.rptEquip)
            {
                UpdateTreasurePrivilegeStrenthen();
            }
        }
        private void OnFunctionStateChange(int _functionId)
@@ -1137,166 +1107,12 @@
                    }
                    UpdateCastSoulRedpoint(treasure.id);
                    UpdateAchievementRedpoint(treasure.id);
                    if (treasure.IsMaxStage())
                    {
                        UpdatePrivilege(treasure.id);
                    }
                    if (serverInited && _up && treasureStageUpEvent != null)
                    {
                        treasureStageUpEvent(treasure.id);
                    }
                }
            }
        }
        public void UpdateTreasurePrivilege(HA353_tagMCMWPrivilegeDataInfo package)
        {
            for (int i = 0; i < package.Count; i++)
            {
                var _data = package.InfoList[i];
                if ((TreasurePrivilege)_data.PriID == TreasurePrivilege.StrengthenAdd)
                {
                    continue;
                }
                if (treasurePrivilegeDict.ContainsKey((int)_data.PriID))
                {
                    var _specialData = treasurePrivilegeDict[(int)_data.PriID];
                    _specialData.presentFinishCount = (int)_data.GotValue;
                    _specialData.presentGetCount = (int)_data.CurValue;
                    _specialData.itemGet = _data.ItemAwardState == 1;
                    var _list = treasureCategory[TreasureCategory.Human];
                    var _index = _list.FindIndex((x) =>
                      {
                          var treasure = treasures[x];
                          return (int)treasure.specialData.type == _data.PriID;
                      });
                    if (_index != -1)
                    {
                        UpdatePrivilege(_list[_index]);
                    }
                }
                if (treasurePrivilegeUpdateEvent != null)
                {
                    treasurePrivilegeUpdateEvent((int)_data.PriID);
                }
            }
        }
        public void UpdateTreasurePrivilege(HA317_tagMCAllEquipAttrActiveInfo package)
        {
            for (int i = 0; i < package.ActiveInfo.Length; i++)
            {
                var _data = package.ActiveInfo[i];
                if (_data.Type == 0)
                {
                    if (treasurePrivilegeDict.ContainsKey((int)TreasurePrivilege.StrengthenAdd))
                    {
                        var _specialData = treasurePrivilegeDict[(int)TreasurePrivilege.StrengthenAdd];
                        _specialData.presentFinishCount = (int)_data.Cnt;
                        var _list = treasureCategory[TreasureCategory.Human];
                        var _index = _list.FindIndex((x) =>
                        {
                            var treasure = treasures[x];
                            return treasure.specialData.type == TreasurePrivilege.StrengthenAdd;
                        });
                        if (_index != -1)
                        {
                            UpdatePrivilege(_list[_index]);
                        }
                    }
                    if (treasurePrivilegeUpdateEvent != null)
                    {
                        treasurePrivilegeUpdateEvent((int)TreasurePrivilege.StrengthenAdd);
                    }
                }
            }
        }
        private void RefreshEquipSTRLv(int _index)
        {
            UpdateTreasurePrivilegeStrenthen();
        }
        public void UpdateTreasurePrivilegeStrenthen()
        {
            var _list = treasureCategory[TreasureCategory.Human];
            var _index = _list.FindIndex((x) =>
            {
                var treasure = treasures[x];
                return treasure.specialData.type == TreasurePrivilege.StrengthenAdd;
            });
            if (_index != -1)
            {
                UpdatePrivilege(_list[_index]);
                if (treasurePrivilegeUpdateEvent != null)
                {
                    treasurePrivilegeUpdateEvent((int)TreasurePrivilege.StrengthenAdd);
                }
            }
        }
        private void UpdatePrivileges()
        {
            var list = treasureCategory[TreasureCategory.Human];
            for (int i = 0; i < list.Count; i++)
            {
                UpdatePrivilege(list[i]);
            }
        }
        public bool IsGetTreasurePrivilege(TreasurePrivilege type)
        {
            var list = treasureCategory[TreasureCategory.Human];
            for (int i = 0; i < list.Count; i++)
            {
                Treasure treasure;
                if (TryGetTreasure(list[i], out treasure)
                    && treasure.specialData.type == type && treasure.IsMaxStage())
                {
                    return true;
                }
            }
            return false;
        }
        private void UpdatePrivilege(int _id)
        {
            if (treasures.ContainsKey(_id))
            {
                var treasure = treasures[_id];
                if (treasure.state != TreasureState.Collected || !treasure.IsMaxStage())
                {
                    if (treasure.specialData.privilegeRedpoint != null)
                    {
                        treasure.specialData.privilegeRedpoint.state = RedPointState.None;
                    }
                    return;
                }
                treasure.specialData.UpdateState();
            }
        }
        public int GetPrivilegeValue(int _privilegeId)
        {
            if (treasurePrivilegeDict.ContainsKey(_privilegeId))
            {
                var _list = GetTreasureCategory(TreasureCategory.Human);
                Treasure _treasure = null;
                var _index = _list.FindIndex((x) =>
                {
                    if (TryGetTreasure(x, out _treasure))
                    {
                        return _treasure.unLockPrivilege == _privilegeId;
                    }
                    return false;
                });
                if (_index != -1 && _treasure.IsMaxStage())
                {
                    var _specialData = treasurePrivilegeDict[_privilegeId];
                    return _specialData.GetPrivilegeValue();
                }
            }
            return 0;
        }
        public void HumanTreasureStateChange(int _id)
@@ -1396,10 +1212,6 @@
                if (TryGetTreasure(config.MWID, out treasure))
                {
                    treasure.UpdateTreasureStage(config);
                    if (treasure.specialData != null)
                    {
                        treasurePrivilegeDict.Add((int)treasure.specialData.type, treasure.specialData);
                    }
                }
            }
System/Treasure/TreasureNewGotWin.cs
@@ -407,15 +407,15 @@
                            m_Story.text = string.Format(config.Verse[0], killNpcConfig.MaxAtk);
                        }
                        break;
                    case 304:
                        var _specialData = treasure.specialData;
                        if (_specialData != null)
                        {
                            var _keyValue = _specialData.propertyDict.First();
                            var _propertyConfig = ConfigManager.Instance.GetTemplate<PlayerPropertyConfig>(_keyValue.Key);
                            m_Story.text = string.Format(config.Verse[0], _keyValue.Value, _propertyConfig.Name);
                        }
                        break;
                    //case 304://签到相关配置移到功能配置表
                    //    var _specialData = treasure.specialData;
                    //    if (_specialData != null)
                    //    {
                    //        var _keyValue = _specialData.propertyDict.First();
                    //        var _propertyConfig = ConfigManager.Instance.GetTemplate<PlayerPropertyConfig>(_keyValue.Key);
                    //        m_Story.text = string.Format(config.Verse[0], _keyValue.Value, _propertyConfig.Name);
                    //    }
                    //    break;
                }
                flyObject = unlockFlyObject1;
            }
System/Treasure/TreasureNewStageWin.cs
@@ -81,9 +81,9 @@
                case TreasureStageUnlock.Property:
                    DisplayProperty(stage);
                    break;
                case TreasureStageUnlock.Privilege:
                    DisplayPrivilege(stage);
                    break;
                //case TreasureStageUnlock.Privilege:
                //    DisplayPrivilege(stage);
                //    break;
            }
        }
@@ -101,30 +101,30 @@
            m_ContainerProgress.gameObject.SetActive(false);
            m_Progress1.gameObject.SetActive(false);
            m_Progress2.gameObject.SetActive(false);
            var config = ConfigManager.Instance.GetTemplate<TreasurePrivilegeConfig>(_stage.privilege);
            m_PrivilegeName.text = config.Name;
            m_Description.text = config.Description;
            switch (_stage.specialData.type)
            {
                case TreasurePrivilege.Property:
                    break;
                case TreasurePrivilege.DemonJarAtk:
                    break;
                case TreasurePrivilege.StrengthenAdd:
                    break;
                case TreasurePrivilege.Suit:
                case TreasurePrivilege.RuneBreakExpAdd:
                case TreasurePrivilege.Boss:
                    break;
                case TreasurePrivilege.MountAtk:
                    break;
                case TreasurePrivilege.PetHp:
                    break;
                case TreasurePrivilege.Wing:
                    break;
                case TreasurePrivilege.Wash:
                    break;
            }
            //var config = ConfigManager.Instance.GetTemplate<TreasurePrivilegeConfig>(_stage.privilege);
            //m_PrivilegeName.text = config.Name;
            //m_Description.text = config.Description;
            //switch (_stage.specialData.type)
            //{
            //    case TreasurePrivilege.Property:
            //        break;
            //    case TreasurePrivilege.DemonJarAtk:
            //        break;
            //    case TreasurePrivilege.StrengthenAdd:
            //        break;
            //    case TreasurePrivilege.Suit:
            //    case TreasurePrivilege.RuneBreakExpAdd:
            //    case TreasurePrivilege.Boss:
            //        break;
            //    case TreasurePrivilege.MountAtk:
            //        break;
            //    case TreasurePrivilege.PetHp:
            //        break;
            //    case TreasurePrivilege.Wing:
            //        break;
            //    case TreasurePrivilege.Wash:
            //        break;
            //}
        }
    }
System/Treasure/TreasureSoulBehaviour.cs
@@ -16,15 +16,15 @@
        [SerializeField] Button m_SelectBtn;
        [SerializeField] RedpointBehaviour m_Redpoint;
        int treasureId = 0;
        int treasureSoulId = 0;
        Treasure treasure;
        TreasureSpecialData special;
        TreasureModel model
        TreasureSoulModel model
        {
            get
            {
                return ModelCenter.Instance.GetModel<TreasureModel>();
                return ModelCenter.Instance.GetModel<TreasureSoulModel>();
            }
        }
@@ -36,45 +36,38 @@
        private void OnEnable()
        {
            model.treasureSelectSoulChangeEvent += TreasureSelectSoulChangeEvent;
            PlayerDatas.Instance.PlayerDataRefreshInfoEvent += PlayerDataRefreshInfoEvent;
            model.treasureSoulEvent += TreasureSoulEvent;
        }
        private void OnDisable()
        {
            model.treasureSelectSoulChangeEvent -= TreasureSelectSoulChangeEvent;
            PlayerDatas.Instance.PlayerDataRefreshInfoEvent -= PlayerDataRefreshInfoEvent;
            model.treasureSoulEvent -= TreasureSoulEvent;
        }
        public void Display(int _id)
        {
            treasureId = _id;
            treasureSoulId = _id;
            m_Redpoint.redpointId = 0;
            if (model.TryGetTreasure(_id, out treasure))
            if (model.TryGetTreasureSoul(_id, out special))
            {
                var _privilege = treasure.unLockPrivilege;
                var config = ConfigManager.Instance.GetTemplate<TreasurePrivilegeConfig>(_privilege);
                var config = ConfigManager.Instance.GetTemplate<TreasurePrivilegeConfig>(_id);
                if (config == null)
                {
                    return;
                }
                m_Redpoint.redpointId = treasure.specialData.privilegeRedpoint != null ? treasure.specialData.privilegeRedpoint.id : 0;
                m_Redpoint.redpointId = special.redpoint.id;
                m_SoulName.text = config.Name;
                m_SelectImg.SetSprite(model.selectSoul == treasureId ? "ListBtn_Select" : "ListBtn_UnSelect");
                m_SelectImg.SetSprite(model.selectSoul == treasureSoulId ? "ListBtn_Select" : "ListBtn_UnSelect");
                DisplayState();
            }
        }
        void DisplayState()
        {
            if (treasure != null)
            if (special != null)
            {
                var stage = treasure.treasureStages[treasure.StageCount - 1];
                m_Lock.gameObject.SetActive(PlayerDatas.Instance.baseData.LV < stage.limitLevel);
                if (PlayerDatas.Instance.baseData.LV < stage.limitLevel)
                {
                    m_SoulState.text = Language.Get("TreasurePrivilege_Unlock", stage.limitLevel);
                }
                else if (treasure.IsMaxStage())
                if (special.active)
                {
                    m_SoulState.text = Language.Get("TreasureSoul_Awoke");
                }
@@ -85,28 +78,25 @@
            }
        }
        private void PlayerDataRefreshInfoEvent(PlayerDataRefresh refreshType)
        private void TreasureSelectSoulChangeEvent(int _id)
        {
            if (refreshType == PlayerDataRefresh.LV)
            if (special != null)
            {
                m_SelectImg.SetSprite(model.selectSoul == treasureSoulId ? "ListBtn_Select" : "ListBtn_UnSelect");
            }
        }
        private void TreasureSoulEvent(int _id)
        {
            if (_id == treasureSoulId)
            {
                DisplayState();
            }
        }
        private void TreasureSelectSoulChangeEvent(int _id)
        {
            if (treasure != null)
            {
                m_SelectImg.SetSprite(model.selectSoul == treasureId ? "ListBtn_Select" : "ListBtn_UnSelect");
            }
        }
        private void OnSelect()
        {
            if(model.TryGetTreasure(treasureId,out treasure))
            {
                model.selectSoul = treasureId;
            }
            model.selectSoul = treasureSoulId;
        }
    }
}
System/Treasure/TreasureSoulModel.cs
New file
@@ -0,0 +1,566 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using TableConfig;
using System;
namespace Snxxz.UI
{
    public class TreasureSoulModel : Model, IBeforePlayerDataInitialize, IPlayerLoginOk
    {
        Dictionary<int, TreasureSpecialData> treasureSoulDict = new Dictionary<int, TreasureSpecialData>();
        List<int> treasureSouls = new List<int>();
        Dictionary<int, List<int>> soulAchievements = new Dictionary<int, List<int>>();
        public event Action<int> treasureSoulEvent;
        public event Action<int> treasureSelectSoulChangeEvent;
        int m_SelectSoul = 0;
        public int selectSoul
        {
            get { return m_SelectSoul; }
            set
            {
                m_SelectSoul = value;
                if (treasureSelectSoulChangeEvent != null)
                {
                    treasureSelectSoulChangeEvent(value);
                }
            }
        }
        public int gotoSoul { get; set; }
        PlayerPackModel packModel { get { return ModelCenter.Instance.GetModel<PlayerPackModel>(); } }
        TreasureModel treasureModel { get { return ModelCenter.Instance.GetModel<TreasureModel>(); } }
        AchievementModel achievementModel { get { return ModelCenter.Instance.GetModel<AchievementModel>(); } }
        public override void Init()
        {
            packModel.RefreshItemCountAct += RefreshItemCountAct;
            PlayerStrengthengDatas.RefreshEquipUpgradLvAct += RefreshEquipSTRLv;
            achievementModel.achievementProgressUpdateEvent += AchievementUpdate;
            achievementModel.achievementCompletedEvent += AchievementUpdate;
            ParseConfig();
        }
        public void OnBeforePlayerDataInitialize()
        {
            foreach (var special in treasureSoulDict.Values)
            {
                special.presentFinishCount = 0;
                special.presentGetCount = 0;
                special.itemGet = false;
                special.active = false;
            }
        }
        public void OnPlayerLoginOk()
        {
            UpdateRedpoints();
        }
        public override void UnInit()
        {
            packModel.RefreshItemCountAct -= RefreshItemCountAct;
            PlayerStrengthengDatas.RefreshEquipUpgradLvAct -= RefreshEquipSTRLv;
            achievementModel.achievementProgressUpdateEvent -= AchievementUpdate;
            achievementModel.achievementCompletedEvent -= AchievementUpdate;
        }
        void ParseConfig()
        {
            var configs = ConfigManager.Instance.GetAllValues<TreasurePrivilegeConfig>();
            for (int i = 0; i < configs.Count; i++)
            {
                var treasureConfig = ConfigManager.Instance.GetTemplate<TreasureConfig>(configs[i].treasureId);
                if (treasureConfig == null || treasureConfig.Category != (int)TreasureCategory.Human)
                {
                    continue;
                }
                treasureSouls.Add(configs[i].PrivilegeID);
                treasureSoulDict.Add(configs[i].PrivilegeID, new TreasureSpecialData((TreasurePrivilege)configs[i].PrivilegeID));
            }
        }
        public List<int> GetTreasureSouls()
        {
            return treasureSouls;
        }
        public bool TryGetTreasureSoul(int _id, out TreasureSpecialData special)
        {
            return treasureSoulDict.TryGetValue(_id, out special);
        }
        public int GetTreasureSoulValue(int _soulId)
        {
            if (treasureSoulDict.ContainsKey(_soulId))
            {
                if (IsGetTreasureSoul(_soulId))
                {
                    var _specialData = treasureSoulDict[_soulId];
                    return _specialData.GetPrivilegeValue();
                }
            }
            return 0;
        }
        public bool IsGetTreasureSoul(int _soulId)
        {
            TreasureSpecialData special;
            return TryGetTreasureSoul(_soulId, out special) && special.active;
        }
        public bool IsOpenTreasureSoul(int _soulId)
        {
            TreasureSpecialData special;
            if (TryGetTreasureSoul(_soulId, out special))
            {
                Treasure treasure;
                return treasureModel.TryGetTreasure(special.treasureId, out treasure) && treasure.state == TreasureState.Collected;
            }
            return false;
        }
        private void RefreshEquipSTRLv(int obj)
        {
            UpdateTreasureSoulStrenthen();
        }
        private void RefreshItemCountAct(PackType packType, int arg2, int arg3)
        {
            if (packType == PackType.rptEquip)
            {
                UpdateTreasureSoulStrenthen();
            }
        }
        private void AchievementUpdate(int _id)
        {
            foreach (var soulId in soulAchievements.Keys)
            {
                if (soulAchievements[soulId].Contains(_id))
                {
                    UpdateAchievementRedpoint(_id);
                }
            }
        }
        public void UpdateTreasureSoulStrenthen()
        {
            UpdateRedpoint((int)TreasurePrivilege.StrengthenAdd);
            if (treasureSoulEvent != null)
            {
                treasureSoulEvent((int)TreasurePrivilege.StrengthenAdd);
            }
        }
        public void UpdateTreasurePrivilege(HA353_tagMCMWPrivilegeDataInfo package)
        {
            for (int i = 0; i < package.Count; i++)
            {
                var _data = package.InfoList[i];
                if ((TreasurePrivilege)_data.PriID == TreasurePrivilege.StrengthenAdd)
                {
                    continue;
                }
                if (treasureSoulDict.ContainsKey((int)_data.PriID))
                {
                    var _specialData = treasureSoulDict[(int)_data.PriID];
                    _specialData.presentFinishCount = (int)_data.GotValue;
                    _specialData.presentGetCount = (int)_data.CurValue;
                    _specialData.itemGet = _data.ItemAwardState == 1;
                }
                UpdateRedpoint((int)_data.PriID);
                UpdateAchievementRedpoint((int)_data.PriID);
                if (treasureSoulEvent != null)
                {
                    treasureSoulEvent((int)_data.PriID);
                }
            }
        }
        public void UpdateTreasurePrivilege(HA317_tagMCAllEquipAttrActiveInfo package)
        {
            for (int i = 0; i < package.ActiveInfo.Length; i++)
            {
                var _data = package.ActiveInfo[i];
                if (_data.Type == 0)
                {
                    if (treasureSoulDict.ContainsKey((int)TreasurePrivilege.StrengthenAdd))
                    {
                        var _specialData = treasureSoulDict[(int)TreasurePrivilege.StrengthenAdd];
                        _specialData.presentFinishCount = (int)_data.Cnt;
                        UpdateRedpoint((int)TreasurePrivilege.StrengthenAdd);
                    }
                    if (treasureSoulEvent != null)
                    {
                        treasureSoulEvent((int)TreasurePrivilege.StrengthenAdd);
                    }
                }
            }
        }
        private void UpdateRedpoint(int _id)
        {
            if (treasureSoulDict.ContainsKey(_id))
            {
                var special = treasureSoulDict[_id];
                special.UpdateState();
                if (special.privilegeRedpoint != null)
                {
                    special.privilegeRedpoint.state = RedPointState.None;
                    if (!FuncOpen.Instance.IsFuncOpen(126) || !IsOpenTreasureSoul(_id)
                        || !IsGetTreasureSoul(_id))
                    {
                        return;
                    }
                    switch (special.type)
                    {
                        case TreasurePrivilege.StrengthenAdd:
                        case TreasurePrivilege.DemonJarAtk:
                        case TreasurePrivilege.MountAtk:
                        case TreasurePrivilege.PetHp:
                        case TreasurePrivilege.Boss:
                            special.privilegeRedpoint.state = special.state == TreasurePrivilegeState.Reward ?
                                RedPointState.Simple : RedPointState.None;
                            break;
                        case TreasurePrivilege.Wash:
                            special.privilegeRedpoint.state = special.itemGet ?
                               RedPointState.None : RedPointState.Simple;
                            break;
                    }
                }
            }
        }
        private void UpdateAchievementRedpoint(int _id)
        {
            if (treasureSoulDict.ContainsKey(_id) && soulAchievements.ContainsKey(_id))
            {
                var special = treasureSoulDict[_id];
                special.activeRedpoint.state = RedPointState.None;
                if (!FuncOpen.Instance.IsFuncOpen(126) || !IsOpenTreasureSoul(_id) || special.active)
                {
                    return;
                }
                var list = soulAchievements[_id];
                bool allCompleted = true;
                for (int i = 0; i < list.Count; i++)
                {
                    Achievement achievement;
                    achievementModel.TryGetAchievement(list[i], out achievement);
                    if (achievement == null || (!achievement.completed && !Achievement.IsReach(achievement.id, achievement.progress)))
                    {
                        allCompleted = false;
                    }
                }
                special.activeRedpoint.state = allCompleted ? RedPointState.Simple : RedPointState.None;
            }
        }
        private void UpdateRedpoints()
        {
            foreach (var special in treasureSoulDict.Keys)
            {
                UpdateRedpoint(special);
                UpdateAchievementRedpoint(special);
            }
        }
    }
    public class TreasureSpecialData
    {
        public TreasurePrivilege type { get; private set; }
        public int progress { get; private set; }
        public int totalProgress { get; private set; }
        public int effectValue { get; private set; }
        public List<AwardItem> items { get; private set; }
        public Dictionary<int, int> propertyDict { get; private set; }
        public Redpoint redpoint { get; private set; }
        public Redpoint privilegeRedpoint { get; private set; }
        public Redpoint activeRedpoint { get; private set; }
        public int treasureId { get; set; }
        public bool active { get; set; }
        private TreasurePrivilegeState m_State = TreasurePrivilegeState.Doing;
        public TreasurePrivilegeState state
        {
            get { return m_State; }
            set { m_State = value; }
        }
        public int presentFinishCount { get; set; }
        public int presentGetCount { get; set; }
        public bool itemGet { get; set; }
        public TreasureSpecialData(TreasurePrivilege _type)
        {
            type = _type;
            var config = ConfigManager.Instance.GetTemplate<TreasurePrivilegeConfig>((int)_type);
            progress = Mathf.Max(1, config.singleValue);
            totalProgress = config.maxValue;
            var _effectValue = 0;
            int.TryParse(config.EffectValue, out _effectValue);
            effectValue = _effectValue;
            treasureId = config.treasureId;
            if (!string.IsNullOrEmpty(config.attr))
            {
                var propertyJson = LitJson.JsonMapper.ToObject(config.attr);
                propertyDict = new Dictionary<int, int>();
                foreach (var _key in propertyJson.Keys)
                {
                    var _property = int.Parse(_key);
                    var _value = int.Parse(propertyJson[_key].ToJson());
                    propertyDict.Add(_property, _value);
                }
            }
            if (!string.IsNullOrEmpty(config.itemAward))
            {
                var itemArray = LitJson.JsonMapper.ToObject<int[][]>(config.itemAward);
                if (itemArray != null && itemArray.Length > 0)
                {
                    items = new List<AwardItem>();
                    for (int i = 0; i < itemArray.Length; i++)
                    {
                        var _array = itemArray[i];
                        items.Add(new AwardItem()
                        {
                            isBind = _array[2],
                            item = new Item()
                            {
                                id = _array[0],
                                count = _array[1],
                            },
                        });
                    }
                }
            }
            if (type == TreasurePrivilege.PetHp)
            {
                var petCount = ConfigManager.Instance.GetAllValues<PetInfoConfig>().Count;
                totalProgress = petCount;
            }
            else if (type == TreasurePrivilege.MountAtk)
            {
                var mountConfigs = ConfigManager.Instance.GetAllValues<HorseConfig>();
                var maxlv = 0;
                for (int i = 0; i < mountConfigs.Count; i++)
                {
                    maxlv += mountConfigs[i].MaxLV;
                }
                totalProgress = maxlv;
            }
            else if (type == TreasurePrivilege.StrengthenAdd)
            {
                var configs = ConfigManager.Instance.GetAllValues<ItemPlusSumAttrConfig>();
                totalProgress = configs[configs.Count - 1].countNeed;
            }
            redpoint = new Redpoint(TreasureModel.TREASURE_SOUL_ID, TreasureModel.TREASURE_SOUL_ID * 100 + (int)type);
            activeRedpoint = new Redpoint(redpoint.id, redpoint.id * 100 + 1);
            switch (_type)
            {
                case TreasurePrivilege.DemonJarAtk:
                case TreasurePrivilege.StrengthenAdd:
                case TreasurePrivilege.MountAtk:
                case TreasurePrivilege.PetHp:
                case TreasurePrivilege.Boss:
                case TreasurePrivilege.Wash:
                    privilegeRedpoint = new Redpoint(redpoint.id, redpoint.id * 100 + 2);
                    break;
            }
        }
        public int GetPrivilegeValue(int _index = 0)
        {
            switch (type)
            {
                case TreasurePrivilege.RuneBreakExpAdd:
                    return effectValue;
                case TreasurePrivilege.DemonJarAtk:
                case TreasurePrivilege.Suit:
                    return effectValue;
                case TreasurePrivilege.Wing:
                case TreasurePrivilege.StrengthenAdd:
                    return effectValue;
            }
            return 0;
        }
        public void UpdateState()
        {
            switch (type)
            {
                case TreasurePrivilege.Property:
                case TreasurePrivilege.RuneBreakExpAdd:
                case TreasurePrivilege.Wing:
                case TreasurePrivilege.Suit:
                    state = TreasurePrivilegeState.Complete;
                    break;
                case TreasurePrivilege.Boss:
                case TreasurePrivilege.DemonJarAtk:
                case TreasurePrivilege.PetHp:
                case TreasurePrivilege.MountAtk:
                    if (presentFinishCount >= totalProgress && (presentGetCount / progress) >= (totalProgress / progress))
                    {
                        state = TreasurePrivilegeState.Complete;
                    }
                    else if (presentGetCount > 0 && presentFinishCount / progress < presentGetCount / progress)
                    {
                        state = TreasurePrivilegeState.Reward;
                    }
                    else
                    {
                        state = TreasurePrivilegeState.Doing;
                    }
                    break;
                case TreasurePrivilege.Wash:
                    state = itemGet ? TreasurePrivilegeState.Doing : TreasurePrivilegeState.Reward;
                    break;
                case TreasurePrivilege.StrengthenAdd:
                    var strengthen = ModelCenter.Instance.GetModel<PlayerStrengthengDatas>();
                    var playerpack = ModelCenter.Instance.GetModel<PlayerPackModel>();
                    presentGetCount = 0;
                    foreach (var value in strengthen._EqInfo.Values)
                    {
                        ItemModel itemModel = playerpack.GetItemModelByIndex(PackType.rptEquip, value.EquipIndex);
                        if (itemModel != null)
                        {
                            presentGetCount += value.EquipPartStarLV;
                        }
                    }
                    var configs = ConfigManager.Instance.GetAllValues<ItemPlusSumAttrConfig>();
                    bool contains = configs.FindIndex((x) =>
                    {
                        return x.countNeed > presentFinishCount && presentGetCount >= x.countNeed;
                    }) != -1;
                    if (presentFinishCount >= totalProgress && presentGetCount >= totalProgress)
                    {
                        state = TreasurePrivilegeState.Complete;
                    }
                    else if (contains)
                    {
                        state = TreasurePrivilegeState.Reward;
                    }
                    else
                    {
                        state = TreasurePrivilegeState.Doing;
                    }
                    break;
            }
        }
        public string ProgressDisplay()
        {
            switch (type)
            {
                case TreasurePrivilege.DemonJarAtk:
                case TreasurePrivilege.PetHp:
                case TreasurePrivilege.MountAtk:
                case TreasurePrivilege.Boss:
                    if (state == TreasurePrivilegeState.Complete) { return UIHelper.GetTextColorByItemColor(TextColType.Green, totalProgress.ToString(), true); }
                    else if (state == TreasurePrivilegeState.Doing)
                    {
                        return StringUtility.Contact(UIHelper.GetTextColorByItemColor(TextColType.Red, presentGetCount.ToString(), true), "/", (presentFinishCount / progress + 1) * progress);
                    }
                    else if (state == TreasurePrivilegeState.Reward)
                    {
                        var _completeCount = (presentFinishCount / progress + 1) * progress;
                        return StringUtility.Contact(UIHelper.GetTextColorByItemColor(TextColType.Green, presentGetCount.ToString(), true), "/", _completeCount);
                    }
                    break;
                case TreasurePrivilege.StrengthenAdd:
                    var configs = ConfigManager.Instance.GetAllValues<ItemPlusSumAttrConfig>();
                    var next = configs.Count - 1;
                    for (int i = 0; i < configs.Count; i++)
                    {
                        if (configs[i].countNeed > presentFinishCount)
                        {
                            next = i;
                            break;
                        }
                    }
                    if (state == TreasurePrivilegeState.Complete) { return totalProgress.ToString(); }
                    else if (state == TreasurePrivilegeState.Doing
                        || state == TreasurePrivilegeState.Reward)
                    {
                        var colortype = presentGetCount >= configs[next].countNeed ? TextColType.Green : TextColType.Red;
                        return StringUtility.Contact(UIHelper.GetTextColorByItemColor(colortype, presentGetCount.ToString(), true), "/", configs[next].countNeed);
                    }
                    break;
            }
            return string.Empty;
        }
        public void GetReward()
        {
            switch (type)
            {
                case TreasurePrivilege.MountAtk:
                case TreasurePrivilege.DemonJarAtk:
                case TreasurePrivilege.PetHp:
                case TreasurePrivilege.Boss:
                case TreasurePrivilege.Wash:
                    var _pak = new CA504_tagCMPlayerGetReward();
                    _pak.RewardType = (int)GotServerRewardType.Def_RewardType_TreasureSoul;
                    _pak.DataEx = (uint)type;
                    _pak.DataExStrLen = 0;
                    _pak.DataExStr = string.Empty;
                    GameNetSystem.Instance.SendInfo(_pak);
                    break;
                case TreasurePrivilege.StrengthenAdd:
                    var configs = ConfigManager.Instance.GetAllValues<ItemPlusSumAttrConfig>();
                    var present = 0;
                    for (int i = 0; i < configs.Count; i++)
                    {
                        if (presentGetCount >= configs[i].countNeed)
                        {
                            present = i;
                        }
                    }
                    CA503_tagCMActiveAllEquipAttr pak = new CA503_tagCMActiveAllEquipAttr();
                    pak.Type = 0;
                    pak.Cnt = (uint)configs[present].countNeed;
                    GameNetSystem.Instance.SendInfo(pak);
                    break;
            }
        }
        public int GetFightPower()
        {
            var _fightPower = 0;
            if (propertyDict != null)
            {
                _fightPower += UIHelper.GetFightPower(propertyDict);
            }
            return _fightPower;
        }
    }
    public enum TreasurePrivilegeState
    {
        Doing = 0,
        Reward = 1,
        Complete = 2
    }
    public enum TreasurePrivilege
    {
        Property = 1,
        DemonJarAtk = 2,
        StrengthenAdd = 3,
        RuneBreakExpAdd = 4,
        MountAtk = 5,
        PetHp = 6,
        Boss = 7,
        Wing = 8,
        Suit = 9,
        Wash = 10,
        Sign = 11,
    }
}
System/Treasure/TreasureSoulModel.cs.meta
File was renamed from System/Treasure/FairyTreasureCollectPanelPattern1.cs.meta
@@ -1,6 +1,6 @@
fileFormatVersion: 2
guid: f4d29363b41f2a740834a1aabf805009
timeCreated: 1521102270
guid: 546ae13b091e8c845b2c8d0e1a458b39
timeCreated: 1534406321
licenseType: Pro
MonoImporter:
  serializedVersion: 2
System/Treasure/TreasureSoulPattern.cs
@@ -6,15 +6,15 @@
{
    public class TreasureSoulPattern : MonoBehaviour
    {
        protected TreasureModel model { get { return ModelCenter.Instance.GetModel<TreasureModel>(); } }
        protected Treasure treasure;
        protected TreasureSoulModel model { get { return ModelCenter.Instance.GetModel<TreasureSoulModel>(); } }
        protected TreasureSpecialData special;
        public virtual void Display(int _id)
        {
            model.TryGetTreasure(_id, out treasure);
            model.treasurePrivilegeUpdateEvent -= TreasurePrivilegeUpdateEvent;
            model.treasurePrivilegeUpdateEvent += TreasurePrivilegeUpdateEvent;
            model.TryGetTreasureSoul(_id, out special);
            model.treasureSoulEvent -= TreasurePrivilegeUpdateEvent;
            model.treasureSoulEvent += TreasurePrivilegeUpdateEvent;
        }
        protected virtual void TreasurePrivilegeUpdateEvent(int _id)
@@ -24,7 +24,7 @@
        public virtual void Dispose()
        {
            model.treasurePrivilegeUpdateEvent -= TreasurePrivilegeUpdateEvent;
            model.treasureSoulEvent -= TreasurePrivilegeUpdateEvent;
        }
    }
}
System/Treasure/TreasureSoulPattern1.cs
@@ -25,13 +25,12 @@
        private void OnGet()
        {
            treasure.specialData.GetReward();
            special.GetReward();
        }
        private void OnGoto()
        {
            var specialData = treasure.specialData;
            switch (specialData.type)
            switch (special.type)
            {
                case TreasurePrivilege.DemonJarAtk:
                    WindowJumpMgr.Instance.WindowJumpTo(JumpUIType.LootPreciousFrameFunc1);
@@ -46,14 +45,13 @@
                    WindowJumpMgr.Instance.WindowJumpTo(JumpUIType.PetFunc2);
                    break;
            }
            model.gotoSoul = treasure.id;
            model.gotoSoul = (int)special.type;
        }
        public override void Display(int _id)
        {
            base.Display(_id);
            var specialData = treasure.specialData;
            switch (specialData.type)
            switch (special.type)
            {
                case TreasurePrivilege.DemonJarAtk:
                    m_ProgressTitle.text = Language.Get("TreasurePrivilege_DemonJar");
@@ -73,14 +71,13 @@
        private void Display()
        {
            var specialData = treasure.specialData;
            m_Get.gameObject.SetActive(false);
            m_Goto.gameObject.SetActive(false);
            for (int i = 0; i < properties.Count; i++)
            {
                properties[i].gameObject.SetActive(false);
            }
            switch (specialData.type)
            switch (special.type)
            {
                case TreasurePrivilege.DemonJarAtk:
                case TreasurePrivilege.Boss:
@@ -89,9 +86,9 @@
                    var _index = 0;
                    m_ContainerHas.gameObject.SetActive(true);
                    m_ContainerNone.gameObject.SetActive(false);
                    foreach (var _key in specialData.propertyDict.Keys)
                    foreach (var _key in special.propertyDict.Keys)
                    {
                        var _value = specialData.propertyDict[_key] * specialData.presentFinishCount / specialData.progress;
                        var _value = special.propertyDict[_key] * special.presentFinishCount / special.progress;
                        if (_value <= 0)
                        {
                            m_ContainerHas.gameObject.SetActive(false);
@@ -102,11 +99,11 @@
                        properties[_index].DisplayUpper(_key, _value);
                        _index++;
                    }
                    m_Get.gameObject.SetActive(specialData.state == TreasurePrivilegeState.Reward);
                    m_Goto.gameObject.SetActive(specialData.state == TreasurePrivilegeState.Doing);
                    m_Progress.text = specialData.ProgressDisplay();
                    m_Get.gameObject.SetActive(special.state == TreasurePrivilegeState.Reward);
                    m_Goto.gameObject.SetActive(special.state == TreasurePrivilegeState.Doing);
                    m_Progress.text = special.ProgressDisplay();
                    //m_Progress.color = specialData.state == TreasurePrivilegeState.Doing ? UIHelper.GetUIColor(TextColType.Red, true) : UIHelper.GetUIColor(TextColType.Green, true);
                    m_Complete.gameObject.SetActive(specialData.state == TreasurePrivilegeState.Complete);
                    m_Complete.gameObject.SetActive(special.state == TreasurePrivilegeState.Complete);
                    break;
            }
        }
@@ -114,7 +111,7 @@
        protected override void TreasurePrivilegeUpdateEvent(int _id)
        {
            base.TreasurePrivilegeUpdateEvent(_id);
            if (_id == (int)treasure.specialData.type)
            if (_id == (int)special.type)
            {
                Display();
            }
System/Treasure/TreasureSoulPattern2.cs
@@ -47,13 +47,12 @@
        private void Display()
        {
            var specialData = treasure.specialData;
            var configs = ConfigManager.Instance.GetAllValues<ItemPlusSumAttrConfig>();
            var present = -1;
            var next = 0;
            for (int i = 0; i < configs.Count; i++)
            {
                if (specialData.presentFinishCount >= configs[i].countNeed)
                if (special.presentFinishCount >= configs[i].countNeed)
                {
                    present = i;
                }
@@ -87,22 +86,22 @@
                    }
                }
            }
            m_Complete.gameObject.SetActive(specialData.state == TreasurePrivilegeState.Complete);
            m_Goto.gameObject.SetActive(specialData.state == TreasurePrivilegeState.Doing);
            m_Get.gameObject.SetActive(specialData.state == TreasurePrivilegeState.Reward);
            m_Progress.text = specialData.ProgressDisplay();
            m_Complete.gameObject.SetActive(special.state == TreasurePrivilegeState.Complete);
            m_Goto.gameObject.SetActive(special.state == TreasurePrivilegeState.Doing);
            m_Get.gameObject.SetActive(special.state == TreasurePrivilegeState.Reward);
            m_Progress.text = special.ProgressDisplay();
            //m_Progress.color = specialData.state == TreasurePrivilegeState.Doing ? UIHelper.GetUIColor(TextColType.Red, true) : UIHelper.GetUIColor(TextColType.Green, true);
        }
        private void OnGoto()
        {
            WindowJumpMgr.Instance.WindowJumpTo(JumpUIType.RebornOpenStrength);
            model.gotoSoul = treasure.id;
            model.gotoSoul = (int)special.type;
        }
        private void OnGet()
        {
            treasure.specialData.GetReward();
            special.GetReward();
        }
    }
}
System/Treasure/TreasureSoulPattern3.cs
@@ -31,7 +31,7 @@
        protected override void TreasurePrivilegeUpdateEvent(int _id)
        {
            base.TreasurePrivilegeUpdateEvent(_id);
            if (_id == (int)treasure.specialData.type)
            if (_id == (int)special.type)
            {
                Display();
            }
@@ -39,14 +39,13 @@
        private void Display()
        {
            var specialData = treasure.specialData;
            for (int i = 0; i < m_Items.Length; i++)
            {
                m_Items[i].gameObject.SetActive(specialData.items != null && i < specialData.items.Count);
                m_Items[i].gameObject.SetActive(special.items != null && i < special.items.Count);
                m_Items[i].cellBtn.RemoveAllListeners();
                if (specialData.items != null && i < specialData.items.Count)
                if (special.items != null && i < special.items.Count)
                {
                    var award = specialData.items[i];
                    var award = special.items[i];
                    ItemCellModel cellModel = new ItemCellModel(award.item.id, true, (ulong)award.item.count, award.isBind);
                    m_Items[i].Init(cellModel);
                    m_Items[i].cellBtn.AddListener(() =>
@@ -56,12 +55,12 @@
                    });
                }
            }
            m_Get.SetInteractable(m_GetText, specialData.state == TreasurePrivilegeState.Reward);
            m_Get.SetInteractable(m_GetText, special.state == TreasurePrivilegeState.Reward);
        }
        private void OnGet()
        {
            treasure.specialData.GetReward();
            special.GetReward();
        }
    }
}
System/Treasure/TreasureSoulPattern4.cs
@@ -33,7 +33,7 @@
        protected override void TreasurePrivilegeUpdateEvent(int _id)
        {
            base.TreasurePrivilegeUpdateEvent(_id);
            if (_id == treasure.id)
            if (_id == (int)special.type)
            {
                Display();
            }
@@ -41,27 +41,26 @@
        private void Display()
        {
            var specialData = treasure.specialData;
            for (int i = 0; i < properties.Count; i++)
            {
                properties[i].gameObject.SetActive(false);
            }
            switch (specialData.type)
            switch (special.type)
            {
                case TreasurePrivilege.Property:
                    m_ContainerHas.gameObject.SetActive(true);
                    m_ContainerNone.gameObject.SetActive(false);
                    var _index = 0;
                    foreach (var _key in specialData.propertyDict.Keys)
                    foreach (var _key in special.propertyDict.Keys)
                    {
                        var _value = specialData.propertyDict[_key];
                        var _value = special.propertyDict[_key];
                        properties[_index].gameObject.SetActive(true);
                        properties[_index].DisplayUpper(_key, _value);
                        _index++;
                    }
                    break;
                case TreasurePrivilege.Suit:
                    var percentSuit = (float)specialData.propertyDict[87] / 10000;
                    var percentSuit = (float)special.propertyDict[87] / 10000;
                    var dict = suitModel.GetActiveSuitAttr();
                    var _suitIndex = 0;
                    foreach (var _key in dict.Keys)
@@ -79,7 +78,7 @@
                    m_ContainerNone.gameObject.SetActive(_suitIndex == 0);
                    break;
                case TreasurePrivilege.Wing:
                    var percentWing = (float)specialData.propertyDict[86] / 10000;
                    var percentWing = (float)special.propertyDict[86] / 10000;
                    var itemModel = pack.GetItemModelByIndex(PackType.rptEquip, (int)RoleEquipType.retWing);
                    m_ContainerHas.gameObject.SetActive(itemModel != null);
                    m_ContainerNone.gameObject.SetActive(itemModel == null);
System/Treasure/TreasureSoulWin.cs
@@ -19,27 +19,22 @@
        [SerializeField] Button m_CloseBtn;
        [SerializeField] Image m_SelectSoulImg;
        [SerializeField] Text m_SelectTreasureName;
        [SerializeField] Text m_SoulName;
        [SerializeField] Text m_SoulDescription;
        [SerializeField] Image m_SoulTarget;
        [SerializeField] Button m_GotoGetBtn;
        [SerializeField] Button m_Active;
        [SerializeField] List<TreasureSoulPattern> m_TreasureSouls;
        [SerializeField] RectTransform m_ContainerPreview;
        [SerializeField] Text m_PropertyTitle;
        [SerializeField] List<PropertyBehaviour> propertys;
        [SerializeField] ScrollerController m_ScollerControl;
        TreasureModel m_Model;
        TreasureModel model
        TreasureSoulModel m_Model;
        TreasureSoulModel model
        {
            get
            {
                return m_Model ?? (m_Model = ModelCenter.Instance.GetModel<TreasureModel>());
                return m_Model ?? (m_Model = ModelCenter.Instance.GetModel<TreasureSoulModel>());
            }
        }
        PlayerSuitModel suitModel { get { return ModelCenter.Instance.GetModel<PlayerSuitModel>(); } }
@@ -54,7 +49,6 @@
        }
        bool m_CorrectClose = true;
        int m_SelectSoul = 0;
        List<int> sortSouls = new List<int>();
@@ -66,14 +60,13 @@
        protected override void AddListeners()
        {
            m_GotoGetBtn.onClick.AddListener(OnGotoGet);
            m_Active.onClick.AddListener(Active);
            m_CloseBtn.onClick.AddListener(CloseClick);
            m_ScollerControl.OnRefreshCell += OnRefreshCell;
        }
        protected override void OnPreOpen()
        {
            m_CorrectClose = true;
            model.treasureSelectSoulChangeEvent += TreasureSelectSoulChangeEvent;
            PlayerDatas.Instance.PlayerDataRefreshInfoEvent += PlayerDataRefreshInfoEvent;
            m_TreasureSoulBtn.state = TitleBtnState.Click;
@@ -106,19 +99,22 @@
        protected override void OnAfterClose()
        {
            if (m_CorrectClose)
            {
                WindowCenter.Instance.Open<MainInterfaceWin>();
            }
            WindowCenter.Instance.Open<MainInterfaceWin>();
        }
        #endregion
        private void Display()
        {
            sortSouls.Clear();
            var _list = model.GetTreasureCategory(TreasureCategory.Human);
            sortSouls.AddRange(_list);
            if (m_ScollerControl.GetNumberOfCells(m_ScollerControl.m_Scorller) == 0)
            var _list = model.GetTreasureSouls();
            for (int i = 0; i < _list.Count; i++)
            {
                if (model.IsOpenTreasureSoul(_list[i]))
                {
                    sortSouls.Add(_list[i]);
                }
            }
            if (m_ScollerControl.GetNumberOfCells(m_ScollerControl.m_Scorller) != sortSouls.Count)
            {
                m_ScollerControl.Refresh();
                for (int i = 0; i < sortSouls.Count; i++)
@@ -146,38 +142,17 @@
                return _soul;
            }
            model.gotoSoul = 0;
            var _list = model.GetTreasureCategory(TreasureCategory.Human);
            var _select = _list[0];
            for (int i = 0; i < _list.Count; i++)
            var _select = sortSouls[sortSouls.Count - 1];
            for (int i = 0; i < sortSouls.Count; i++)
            {
                Treasure treasure;
                if (model.TryGetTreasure(_list[i], out treasure))
                TreasureSpecialData special;
                if (model.TryGetTreasureSoul(sortSouls[i], out special))
                {
                    if (treasure.specialData.privilegeRedpoint != null
                        && treasure.specialData.privilegeRedpoint.state == RedPointState.Simple)
                    if (special.redpoint.state == RedPointState.Simple)
                    {
                        return _list[i];
                        return sortSouls[i];
                    }
                }
            }
            for (int i = 0; i < _list.Count; i++)
            {
                Treasure treasure;
                if (model.TryGetTreasure(_list[i], out treasure))
                {
                    if (treasure.state == TreasureState.Collected)
                    {
                        if (!treasure.IsMaxStage())
                        {
                            return _list[i];
                        }
                        _select = treasure.id;
                    }
                }
            }
            if (_list.Contains(m_SelectSoul))
            {
                return m_SelectSoul;
            }
            return _select;
        }
@@ -196,48 +171,35 @@
            DisplaySelect();
        }
        private void OnGotoGet()
        private void Active()
        {
            m_CorrectClose = false;
            CloseImmediately();
            model.currentCategory = TreasureCategory.Human;
            model.selectedTreasure = model.selectSoul;
            model.openFromTreasureSoul = true;
            WindowCenter.Instance.Open<TreasureLevelUpWin>();
        }
        private void DisplaySelect()
        {
            Treasure treasure;
            model.TryGetTreasure(model.selectSoul, out treasure);
            if (treasure != null)
            TreasureSpecialData special;
            model.TryGetTreasureSoul(model.selectSoul, out special);
            if (special != null)
            {
                var _privilege = treasure.unLockPrivilege;
                var config = ConfigManager.Instance.GetTemplate<TreasurePrivilegeConfig>(_privilege);
                var config = ConfigManager.Instance.GetTemplate<TreasurePrivilegeConfig>((int)special.type);
                if (config != null)
                {
                    m_SoulName.text = config.Name;
                    m_SoulDescription.text = UIHelper.ReplaceNewLine(config.Description);
                    m_SoulTarget.SetSprite(config.targetDescription);
                    m_SoulTarget.SetNativeSize();
                    m_GotoGetBtn.gameObject.SetActive(!treasure.IsMaxStage());
                    DisplayPrivilege(treasure);
                    m_Active.gameObject.SetActive(model.IsGetTreasureSoul(model.selectSoul));
                    DisplayPrivilege(special);
                    m_SelectSoulImg.SetSprite(config.Icon);
                    m_SelectSoulImg.material = treasure.IsMaxStage() ? MaterialUtility.GetUIDefaultGraphicMaterial() : MaterialUtility.GetDefaultSpriteGrayMaterial();
                }
                var treasureConfig = ConfigManager.Instance.GetTemplate<TreasureConfig>(model.selectSoul);
                m_SelectTreasureName.text = treasureConfig.Name;
                DisplyPreview(treasure);
            }
        }
        private void DisplayPrivilege(Treasure treasure)
        private void DisplayPrivilege(TreasureSpecialData special)
        {
            int _pattern = -1;
            switch (treasure.specialData.type)
            switch (special.type)
            {
                case TreasurePrivilege.Property:
                case TreasurePrivilege.Suit:
@@ -260,200 +222,23 @@
            for (int i = 0; i < m_TreasureSouls.Count; i++)
            {
                m_TreasureSouls[i].Dispose();
                m_TreasureSouls[i].gameObject.SetActive(_pattern == i && treasure.IsMaxStage());
                if (_pattern == i && treasure.IsMaxStage())
                m_TreasureSouls[i].gameObject.SetActive(_pattern == i && model.IsGetTreasureSoul(model.selectSoul));
                if (_pattern == i)
                {
                    m_TreasureSouls[i].Display(treasure.id);
                    m_TreasureSouls[i].Display((int)special.type);
                }
            }
        }
        private void DisplyPreview(Treasure treasure)
        {
            m_ContainerPreview.gameObject.SetActive(false);
            if (treasure.IsMaxStage())
            {
                return;
            }
            switch (treasure.specialData.type)
            {
                case TreasurePrivilege.Wing:
                case TreasurePrivilege.Suit:
                case TreasurePrivilege.Property:
                    m_PropertyTitle.text = Language.Get("TreasureSoulAddPropertyTitle");
                    break;
                case TreasurePrivilege.DemonJarAtk:
                case TreasurePrivilege.StrengthenAdd:
                case TreasurePrivilege.MountAtk:
                case TreasurePrivilege.PetHp:
                case TreasurePrivilege.Boss:
                    m_PropertyTitle.text = Language.Get("TreasureSoulGetPropertyTitle");
                    break;
            }
            var specialData = treasure.specialData;
            for (int i = 0; i < propertys.Count; i++)
            {
                propertys[i].gameObject.SetActive(false);
            }
            switch (specialData.type)
            {
                case TreasurePrivilege.Property:
                    var _index = 0;
                    m_ContainerPreview.gameObject.SetActive(true);
                    foreach (var _key in specialData.propertyDict.Keys)
                    {
                        var _value = specialData.propertyDict[_key];
                        propertys[_index].gameObject.SetActive(true);
                        propertys[_index].DisplayUpper(_key, _value);
                        _index++;
                    }
                    break;
                case TreasurePrivilege.Suit:
                    var percentSuit = (float)specialData.propertyDict[87] / 10000;
                    var dict = suitModel.GetActiveSuitAttr();
                    var _suitIndex = 0;
                    foreach (var _key in dict.Keys)
                    {
                        var propertyConfig = ConfigManager.Instance.GetTemplate<PlayerPropertyConfig>(_key);
                        if (propertyConfig == null || propertyConfig.type != 1)
                        {
                            continue;
                        }
                        propertys[_suitIndex].gameObject.SetActive(true);
                        propertys[_suitIndex].DisplayUpper(_key, (int)(percentSuit * dict[_key]));
                        _suitIndex++;
                    }
                    m_ContainerPreview.gameObject.SetActive(_suitIndex > 0);
                    break;
                case TreasurePrivilege.Wing:
                    var percentWing = (float)specialData.propertyDict[86] / 10000;
                    var itemModel = pack.GetItemModelByIndex(PackType.rptEquip, (int)RoleEquipType.retWing);
                    m_ContainerPreview.gameObject.SetActive(itemModel != null);
                    if (itemModel != null)
                    {
                        var itemConfig = ConfigManager.Instance.GetTemplate<ItemConfig>(itemModel.itemId);
                        float value = 0;
                        if (ContainsProperty(itemConfig, 6, out value))
                        {
                            if (itemModel.GetUseDataModel(42) != null)
                            {
                                value += strengthengmodel.BackpackWings(itemModel.itemId, itemModel.GetUseDataModel(42)[0])[1];
                            }
                        }
                        propertys[0].gameObject.SetActive(true);
                        propertys[0].Display(6, (int)(value * percentWing));
                    }
                    break;
                case TreasurePrivilege.DemonJarAtk:
                case TreasurePrivilege.PetHp:
                case TreasurePrivilege.MountAtk:
                case TreasurePrivilege.Boss:
                    var index = 0;
                    m_ContainerPreview.gameObject.SetActive(true);
                    foreach (var _key in specialData.propertyDict.Keys)
                    {
                        var _value = specialData.propertyDict[_key] * (specialData.presentGetCount / specialData.progress);
                        if (_value <= 0)
                        {
                            m_ContainerPreview.gameObject.SetActive(false);
                            break;
                        }
                        propertys[index].gameObject.SetActive(true);
                        propertys[index].DisplayUpper(_key, _value);
                        index++;
                    }
                    break;
                case TreasurePrivilege.StrengthenAdd:
                    var configs = ConfigManager.Instance.GetAllValues<ItemPlusSumAttrConfig>();
                    var present = -1;
                    var next = 0;
                    var presentGetCount = 0;
                    foreach (var value in strengthengmodel._EqInfo.Values)
                    {
                        ItemModel equip = pack.GetItemModelByIndex(PackType.rptEquip, value.EquipIndex);
                        if (equip != null)
                        {
                            presentGetCount += value.EquipPartStarLV;
                        }
                    }
                    for (int i = 0; i < configs.Count; i++)
                    {
                        if (presentGetCount >= configs[i].countNeed)
                        {
                            present = i;
                        }
                    }
                    next = present + 1;
                    m_ContainerPreview.gameObject.SetActive(present >= 0);
                    if (present >= 0)
                    {
                        var config = configs[present];
                        for (int i = 0; i < propertys.Count; i++)
                        {
                            propertys[i].gameObject.SetActive(i < config.attType.Length);
                            if (i < config.attType.Length)
                            {
                                propertys[i].DisplayUpper(config.attType[i], config.attValue[i]);
                            }
                        }
                    }
                    break;
            }
        }
        int Compare(int x, int y)
        {
            //Treasure treasure_x;
            //Treasure treasure_y;
            //if (model.TryGetTreasure(x, out treasure_x) && model.TryGetTreasure(y, out treasure_y))
            //{
            //    var stage_x = treasure_x.treasureStages[treasure_x.StageCount - 1];
            //    var stage_y = treasure_y.treasureStages[treasure_y.StageCount - 1];
            //    bool awaking_x = PlayerDatas.Instance.baseData.LV >= stage_x.limitLevel && !treasure_x.IsMaxStage();
            //    bool awaking_y = PlayerDatas.Instance.baseData.LV >= stage_y.limitLevel && !treasure_y.IsMaxStage();
            //    if (awaking_x != awaking_y)
            //    {
            //        return -awaking_x.CompareTo(awaking_y);
            //    }
            //    bool awoke_x = treasure_x.IsMaxStage();
            //    bool awoke_y = treasure_y.IsMaxStage();
            //    if (awoke_x != awoke_y)
            //    {
            //        return -awoke_x.CompareTo(awoke_y);
            //    }
            //}
            TreasureSpecialData special_x;
            TreasureSpecialData special_y;
            if (model.TryGetTreasureSoul(x, out special_x) && model.TryGetTreasureSoul(y, out special_y))
            {
                return special_x.treasureId.CompareTo(special_y.treasureId);
            }
            return x.CompareTo(y);
        }
        public bool ContainsProperty(ItemConfig config, int _property, out float value)
        {
            value = 0;
            if (config.Effect1 == _property && config.EffectValueA1 > 0)
            {
                value = config.EffectValueA1;
                return true;
            }
            if (config.Effect2 == _property && config.EffectValueA2 > 0)
            {
                value = config.EffectValueA2;
                return true;
            }
            if (config.Effect3 == _property && config.EffectValueA3 > 0)
            {
                value = config.EffectValueA3;
                return true;
            }
            if (config.Effect4 == _property && config.EffectValueA4 > 0)
            {
                value = config.EffectValueA4;
                return true;
            }
            if (config.Effect5 == _property && config.EffectValueA5 > 0)
            {
                value = config.EffectValueA5;
                return true;
            }
            return false;
        }
    }
System/Treasure/TreasureStageTipWin.cs
@@ -131,45 +131,15 @@
                        m_Description.text = string.Empty;
                    }
                    break;
                case TreasureStageUnlock.Privilege:
                    m_ContainerFuncSoul.gameObject.SetActive(true);
                    m_ContainerSpecial.gameObject.SetActive(true);
                    var privilegeConfig = ConfigManager.Instance.GetTemplate<TreasurePrivilegeConfig>(m_TreasureStage.privilege);
                    m_Icon.SetSprite(privilegeConfig.Icon);
                    m_StageName.text = privilegeConfig.Name;
                    m_Description.text = UIHelper.ReplaceNewLine(privilegeConfig.Description);
                    DisplayTreasureSpecial();
                    break;
            }
        }
        void DisplayTreasureSpecial()
        {
            m_TreasurePrivileges[0].gameObject.SetActive(false);
            m_TreasurePrivileges[1].gameObject.SetActive(false);
            switch (m_Treasure.specialData.type)
            {
                case TreasurePrivilege.Sign:
                case TreasurePrivilege.Property:
                    break;
                case TreasurePrivilege.DemonJarAtk:
                    break;
                case TreasurePrivilege.StrengthenAdd:
                    break;
                case TreasurePrivilege.Suit:
                case TreasurePrivilege.RuneBreakExpAdd:
                case TreasurePrivilege.Boss:
                    m_TreasurePrivileges[0].gameObject.SetActive(false);
                    m_TreasurePrivileges[1].gameObject.SetActive(false);
                    break;
                case TreasurePrivilege.MountAtk:
                    break;
                case TreasurePrivilege.PetHp:
                    break;
                case TreasurePrivilege.Wing:
                    break;
                case TreasurePrivilege.Wash:
                    break;
                //case TreasureStageUnlock.Privilege:
                //    m_ContainerFuncSoul.gameObject.SetActive(true);
                //    m_ContainerSpecial.gameObject.SetActive(true);
                //    var privilegeConfig = ConfigManager.Instance.GetTemplate<TreasurePrivilegeConfig>(m_TreasureStage.privilege);
                //    m_Icon.SetSprite(privilegeConfig.Icon);
                //    m_StageName.text = privilegeConfig.Name;
                //    m_Description.text = UIHelper.ReplaceNewLine(privilegeConfig.Description);
                //    DisplayTreasureSpecial();
                //    break;
            }
        }
System/WindowBase/ModelCenter.cs
@@ -187,6 +187,7 @@
            RegisterModel<TrialDungeonModel>();
            RegisterModel<ActivitiesPushMgr>();
            RegisterModel<MultipleRealmPointModel>();
            RegisterModel<TreasureSoulModel>();
            inited = true;
        }
System/WindowJump/WindowJumpMgr.cs
@@ -685,7 +685,7 @@
                var soulId = 0;
                if (int.TryParse(_tagWinSearchModel.SelectActive, out soulId))
                {
                    ModelCenter.Instance.GetModel<TreasureModel>().gotoSoul = soulId;
                    ModelCenter.Instance.GetModel<TreasureSoulModel>().gotoSoul = soulId;
                }
                SetJumpLogic<TreasureSoulWin>(_tagWinSearchModel.TABID);
                break;