少年修仙传客户端代码仓库
client_linchunjie
2019-03-25 ed4064784f8c574375d302badf8868aabef6507b
3335 灵根开发
6 文件已复制
15个文件已删除
1 文件已重命名
7个文件已添加
9个文件已修改
1865 ■■■■■ 已修改文件
Core/GameEngine/DataToCtl/PackageRegedit.cs 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/GameEngine/Model/Config/ReikiRootConfig.cs 221 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/GameEngine/Model/Config/ReikiRootConfig.cs.meta 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/GameEngine/Model/Player/Character/PlayerBaseData.cs 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/GameEngine/Model/Player/Character/PlayerExtersionData.cs 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/GameEngine/Model/Player/PlayerDatas.cs 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/NetworkPackage/ClientPack/ClientToMapServer/CB2_NewFunction/CB206_tagCMAddPoint.cs 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/NetworkPackage/ClientPack/ClientToMapServer/CB2_NewFunction/CB206_tagCMAddPoint.cs.meta 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/NetworkPackage/DTCFile/ServerPack/HAD_SaleActivity.meta 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/NetworkPackage/DTCFile/ServerPack/HAE_Truck.meta 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/NetworkPackage/DTCFile/ServerPack/HAF_Merge.meta 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/NetworkPackage/DTCFile/ServerPack/HB0_Event.meta 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/NetworkPackage/DTCFile/ServerPack/HB1_Role/DTCB107_tagMCRolePointInfo.cs 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/NetworkPackage/DTCFile/ServerPack/HB1_Role/DTCB107_tagMCRolePointInfo.cs.meta 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/NetworkPackage/ServerPack/HAD_SaleActivity.meta 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/NetworkPackage/ServerPack/HAE_Truck.meta 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/NetworkPackage/ServerPack/HAF_Merge.meta 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/NetworkPackage/ServerPack/HB0_Event.meta 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/NetworkPackage/ServerPack/HB1_Role/HB107_tagMCRolePointInfo.cs 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/NetworkPackage/ServerPack/HB1_Role/HB107_tagMCRolePointInfo.cs.meta 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Lua/Gen/SnxxzUIRolePointModelWrap.cs 401 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Lua/Gen/XLuaGenAutoRegister.cs 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Role/ReikiRootModel.cs 365 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Role/ReikiRootModel.cs.meta 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Role/ReikiRootPointBehaviour.cs 151 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Role/ReikiRootPointBehaviour.cs.meta 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Role/ReikiRootWin.cs 189 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Role/ReikiRootWin.cs.meta 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Treasure/PotentialItemBehaviour.cs 85 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Treasure/PotentialItemBehaviour.cs.meta 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Treasure/PotentialItemUseWin.cs 89 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Treasure/PotentialItemUseWin.cs.meta 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Treasure/TreasureBaseWin.cs 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Treasure/TreasureNewStageWin.cs 106 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Treasure/TreasureNewStageWin.cs.meta 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/WindowBase/ModelCenter.cs 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Utility/EnumHelper.cs 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Utility/UIHelper.cs 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/GameEngine/DataToCtl/PackageRegedit.cs
@@ -25,6 +25,7 @@
    public static void Init()
    {
        // 登记相应的数据体及对应的数据转逻辑类
        Register(typeof(HB107_tagMCRolePointInfo), typeof(DTCB107_tagMCRolePointInfo));
        Register(typeof(HA327_tagMCRealmExpInfo), typeof(DTCA327_tagMCRealmExpInfo));
        Register(typeof(HA40C_tagGCAllFamilyBossInfo), typeof(DTCA40C_tagGCAllFamilyBossInfo));
        Register(typeof(HA3B1_tagMCEquipPartStarInfo), typeof(DTCA3B1_tagMCEquipPartStarInfo));
Core/GameEngine/Model/Config/ReikiRootConfig.cs
New file
@@ -0,0 +1,221 @@
//--------------------------------------------------------
//    [Author]:           Fish
//    [  Date ]:           Monday, March 25, 2019
//--------------------------------------------------------
using System.Collections.Generic;
using System.IO;
using System.Threading;
using System;
using UnityEngine;
[XLua.LuaCallCSharp]
public partial class ReikiRootConfig
{
    public readonly int id;
    public readonly Int2 propertyPerPoint;
    public readonly int promoteProperty;
    public readonly int[] promoteValue;
    public readonly int[] qualityArea;
    public ReikiRootConfig()
    {
    }
    public ReikiRootConfig(string input)
    {
        try
        {
            var tables = input.Split('\t');
            int.TryParse(tables[0],out id);
            Int2.TryParse(tables[1],out propertyPerPoint);
            int.TryParse(tables[2],out promoteProperty);
            string[] promoteValueStringArray = tables[3].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);
            promoteValue = new int[promoteValueStringArray.Length];
            for (int i=0;i<promoteValueStringArray.Length;i++)
            {
                 int.TryParse(promoteValueStringArray[i],out promoteValue[i]);
            }
            string[] qualityAreaStringArray = tables[4].Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);
            qualityArea = new int[qualityAreaStringArray.Length];
            for (int i=0;i<qualityAreaStringArray.Length;i++)
            {
                 int.TryParse(qualityAreaStringArray[i],out qualityArea[i]);
            }
        }
        catch (Exception ex)
        {
            DebugEx.Log(ex);
        }
    }
    static Dictionary<string, ReikiRootConfig> configs = new Dictionary<string, ReikiRootConfig>();
    public static ReikiRootConfig Get(string id)
    {
        if (!inited)
        {
            Debug.Log("ReikiRootConfig 还未完成初始化。");
            return null;
        }
        if (configs.ContainsKey(id))
        {
            return configs[id];
        }
        ReikiRootConfig config = null;
        if (rawDatas.ContainsKey(id))
        {
            config = configs[id] = new ReikiRootConfig(rawDatas[id]);
            rawDatas.Remove(id);
        }
        return config;
    }
    public static ReikiRootConfig Get(int id)
    {
        return Get(id.ToString());
    }
    public static List<string> GetKeys()
    {
        var keys = new List<string>();
        keys.AddRange(configs.Keys);
        keys.AddRange(rawDatas.Keys);
        return keys;
    }
    public static List<ReikiRootConfig> GetValues()
    {
        var values = new List<ReikiRootConfig>();
        values.AddRange(configs.Values);
        var keys = new List<string>(rawDatas.Keys);
        foreach (var key in keys)
        {
            values.Add(Get(key));
        }
        return values;
    }
    public static bool Has(string id)
    {
        return configs.ContainsKey(id) || rawDatas.ContainsKey(id);
    }
    public static bool Has(int id)
    {
        return Has(id.ToString());
    }
    public static bool inited { get; private set; }
    protected static Dictionary<string, string> rawDatas = new Dictionary<string, string>();
    public static void Init(bool sync=false)
    {
        inited = false;
        var path = string.Empty;
        if (AssetSource.refdataFromEditor)
        {
            path = ResourcesPath.CONFIG_FODLER +"/ReikiRoot.txt";
        }
        else
        {
            path = AssetVersionUtility.GetAssetFilePath("config/ReikiRoot.txt");
        }
        var tempConfig = new ReikiRootConfig();
        var preParse = tempConfig is IConfigPostProcess;
        if (sync)
        {
            var lines = File.ReadAllLines(path);
            if (!preParse)
            {
                rawDatas = new Dictionary<string, string>(lines.Length - 3);
            }
            for (int i = 3; i < lines.Length; i++)
            {
                try
                {
                    var line = lines[i];
                    var index = line.IndexOf("\t");
                    if (index == -1)
                    {
                        continue;
                    }
                    var id = line.Substring(0, index);
                    if (preParse)
                    {
                        var config = new ReikiRootConfig(line);
                        configs[id] = config;
                        (config as IConfigPostProcess).OnConfigParseCompleted();
                    }
                    else
                    {
                        rawDatas[id] = line;
                    }
                }
                catch (System.Exception ex)
                {
                    Debug.LogError(ex);
                }
            }
            inited = true;
        }
        else
        {
            ThreadPool.QueueUserWorkItem((object _object) =>
            {
                var lines = File.ReadAllLines(path);
                if (!preParse)
                {
                    rawDatas = new Dictionary<string, string>(lines.Length - 3);
                }
                for (int i = 3; i < lines.Length; i++)
                {
                    try
                    {
                       var line = lines[i];
                        var index = line.IndexOf("\t");
                        if (index == -1)
                        {
                            continue;
                        }
                        var id = line.Substring(0, index);
                        if (preParse)
                        {
                            var config = new ReikiRootConfig(line);
                            configs[id] = config;
                            (config as IConfigPostProcess).OnConfigParseCompleted();
                        }
                        else
                        {
                            rawDatas[id] = line;
                        }
                    }
                    catch (System.Exception ex)
                    {
                        Debug.LogError(ex);
                    }
                }
                inited = true;
            });
        }
    }
}
Core/GameEngine/Model/Config/ReikiRootConfig.cs.meta
copy from Lua/Gen/SnxxzUIRolePointModelWrap.cs.meta copy to Core/GameEngine/Model/Config/ReikiRootConfig.cs.meta
File was copied from Lua/Gen/SnxxzUIRolePointModelWrap.cs.meta
@@ -1,6 +1,6 @@
fileFormatVersion: 2
guid: 15f8b5f24633ef049b97209e9decd843
timeCreated: 1550120575
guid: 98b9f6b38bc0b1841bddba5f9aa30611
timeCreated: 1553483326
licenseType: Pro
MonoImporter:
  serializedVersion: 2
Core/GameEngine/Model/Player/Character/PlayerBaseData.cs
@@ -52,6 +52,11 @@
    public int BasicsScoreAHit;//基础命中
    public int BasicsDodge;//基础闪避
    public uint equipShowSwitch;//装备显隐开关
    public int mater;//灵根属性——金
    public int wood;//灵根属性——木
    public int water;//灵根属性——水
    public int fire;//灵根属性——火
    public int earth;//灵根属性——土
    public long treasurePotentialSp
    {
        get
Core/GameEngine/Model/Player/Character/PlayerExtersionData.cs
@@ -32,6 +32,7 @@
    public int PickupDist;         // 拾取距离 73,
    public int RealMapID;          // 数据地图ID   79,
    public uint Tick;               // 当前Tick   89,
    public int luckValue;         //气运 101
    public int battleValEx1;       // <攻速  136
    public int battleValEx3;       // <增加伤害  138
    public int damageReduceRate;  // <减少伤害  132
Core/GameEngine/Model/Player/PlayerDatas.cs
@@ -537,6 +537,7 @@
                }
                break;
            case PlayerDataType.LuckValue:
                extersion.luckValue = (int)value;
                break;
            case PlayerDataType.ExAttr1:
                break;
@@ -850,7 +851,20 @@
                break;
            case PlayerDataType.CDBPlayerRefresh_ZhuxianRate:
                break;
            case PlayerDataType.CDBPlayerRefresh_ZhuxianHurtPer:
            case PlayerDataType.CDBPlayerRefresh_Mater:
                baseData.mater = (int)value;
                break;
            case PlayerDataType.CDBPlayerRefresh_Wood:
                baseData.wood = (int)value;
                break;
            case PlayerDataType.CDBPlayerRefresh_Water:
                baseData.water = (int)value;
                break;
            case PlayerDataType.CDBPlayerRefresh_Fire:
                baseData.fire = (int)value;
                break;
            case PlayerDataType.CDBPlayerRefresh_Earth:
                baseData.earth = (int)value;
                break;
        }
    }
Core/NetworkPackage/ClientPack/ClientToMapServer/CB2_NewFunction/CB206_tagCMAddPoint.cs
New file
@@ -0,0 +1,22 @@
using UnityEngine;
using System.Collections;
// B2 06 玩家加点 #tagCMAddPoint
public class CB206_tagCMAddPoint : GameNetPackBasic {
    public byte PointAttrIDCount;    // 加点属性ID个数
    public  byte[] PointAttrIDList;    // 加点属性ID列表
    public  ushort[] PointValueList;    // 加点属性ID对应的点数列表
    public CB206_tagCMAddPoint () {
        combineCmd = (ushort)0x03FE;
        _cmd = (ushort)0xB206;
    }
    public override void WriteToBytes () {
        WriteBytes (PointAttrIDCount, NetDataType.BYTE);
        WriteBytes (PointAttrIDList, NetDataType.BYTE, PointAttrIDCount);
        WriteBytes (PointValueList, NetDataType.WORD, PointAttrIDCount);
    }
}
Core/NetworkPackage/ClientPack/ClientToMapServer/CB2_NewFunction/CB206_tagCMAddPoint.cs.meta
copy from Lua/Gen/SnxxzUIRolePointModelWrap.cs.meta copy to Core/NetworkPackage/ClientPack/ClientToMapServer/CB2_NewFunction/CB206_tagCMAddPoint.cs.meta
File was copied from Lua/Gen/SnxxzUIRolePointModelWrap.cs.meta
@@ -1,6 +1,6 @@
fileFormatVersion: 2
guid: 15f8b5f24633ef049b97209e9decd843
timeCreated: 1550120575
guid: a674b054ed830b64798519873146fc6e
timeCreated: 1553496718
licenseType: Pro
MonoImporter:
  serializedVersion: 2
Core/NetworkPackage/DTCFile/ServerPack/HAD_SaleActivity.meta
File was deleted
Core/NetworkPackage/DTCFile/ServerPack/HAE_Truck.meta
File was deleted
Core/NetworkPackage/DTCFile/ServerPack/HAF_Merge.meta
File was deleted
Core/NetworkPackage/DTCFile/ServerPack/HB0_Event.meta
File was deleted
Core/NetworkPackage/DTCFile/ServerPack/HB1_Role/DTCB107_tagMCRolePointInfo.cs
New file
@@ -0,0 +1,24 @@
//--------------------------------------------------------
//    [Author]:           第二世界
//    [  Date ]:           Monday, March 25, 2019
//--------------------------------------------------------
using System;
using System.Collections;
using System.Collections.Generic;
using Snxxz.UI;
public class DTCB107_tagMCRolePointInfo : DtcBasic {
    public override void Done(GameNetPackBasic vNetPack)
    {
        base.Done(vNetPack);
        var package = vNetPack as HB107_tagMCRolePointInfo;
        ModelCenter.Instance.GetModel<ReikiRootModel>().ReceivePackage(package);
    }
}
Core/NetworkPackage/DTCFile/ServerPack/HB1_Role/DTCB107_tagMCRolePointInfo.cs.meta
File was renamed from Lua/Gen/SnxxzUIRolePointModelWrap.cs.meta
@@ -1,6 +1,6 @@
fileFormatVersion: 2
guid: 15f8b5f24633ef049b97209e9decd843
timeCreated: 1550120575
guid: de8eaad4e383f6f438a5ef4f4ecfbc63
timeCreated: 1553497409
licenseType: Pro
MonoImporter:
  serializedVersion: 2
Core/NetworkPackage/ServerPack/HAD_SaleActivity.meta
File was deleted
Core/NetworkPackage/ServerPack/HAE_Truck.meta
File was deleted
Core/NetworkPackage/ServerPack/HAF_Merge.meta
File was deleted
Core/NetworkPackage/ServerPack/HB0_Event.meta
File was deleted
Core/NetworkPackage/ServerPack/HB1_Role/HB107_tagMCRolePointInfo.cs
New file
@@ -0,0 +1,21 @@
using UnityEngine;
using System.Collections;
// B1 07 玩家点数信息 #tagMCRolePointInfo
public class HB107_tagMCRolePointInfo : GameNetPackBasic {
    public byte PointAttrIDCount;    // 点类型个数
    public  byte[] PointAttrIDList;    // 点类型列表
    public  ushort[] PointValueList;    // 点类型对应已加自由点数列表
    public HB107_tagMCRolePointInfo () {
        _cmd = (ushort)0xB107;
    }
    public override void ReadFromBytes (byte[] vBytes) {
        TransBytes (out PointAttrIDCount, vBytes, NetDataType.BYTE);
        TransBytes (out PointAttrIDList, vBytes, NetDataType.BYTE, PointAttrIDCount);
        TransBytes (out PointValueList, vBytes, NetDataType.WORD, PointAttrIDCount);
    }
}
Core/NetworkPackage/ServerPack/HB1_Role/HB107_tagMCRolePointInfo.cs.meta
copy from Lua/Gen/SnxxzUIRolePointModelWrap.cs.meta copy to Core/NetworkPackage/ServerPack/HB1_Role/HB107_tagMCRolePointInfo.cs.meta
File was copied from Lua/Gen/SnxxzUIRolePointModelWrap.cs.meta
@@ -1,6 +1,6 @@
fileFormatVersion: 2
guid: 15f8b5f24633ef049b97209e9decd843
timeCreated: 1550120575
guid: f06926fe399075046980dfee35b48088
timeCreated: 1553497359
licenseType: Pro
MonoImporter:
  serializedVersion: 2
Lua/Gen/SnxxzUIRolePointModelWrap.cs
File was deleted
Lua/Gen/XLuaGenAutoRegister.cs
@@ -1308,9 +1308,6 @@
            translator.DelayWrapLoader(typeof(Snxxz.UI.RoleModel), SnxxzUIRoleModelWrap.__Register);
        
        
            translator.DelayWrapLoader(typeof(Snxxz.UI.RolePointModel), SnxxzUIRolePointModelWrap.__Register);
            translator.DelayWrapLoader(typeof(Snxxz.UI.TitleModel), SnxxzUITitleModelWrap.__Register);
        
        
System/Role/ReikiRootModel.cs
New file
@@ -0,0 +1,365 @@
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
namespace Snxxz.UI
{
    public class ReikiRootModel : Model, IBeforePlayerDataInitialize, IPlayerLoginOk
    {
        Dictionary<int, int> m_ReikiRootPoints = new Dictionary<int, int>();
        Dictionary<int, int> m_ReikiRootFreePoints = new Dictionary<int, int>();
        Dictionary<int, List<int>> m_RecommendReikiRoots = new Dictionary<int, List<int>>();
        Dictionary<int, Dictionary<int, float>> m_RecommendProportion = new Dictionary<int, Dictionary<int, float>>();
        Dictionary<int, int> m_MainReikiRoots = new Dictionary<int, int>();
        Dictionary<int, int> m_CacheReikiRootPoints = new Dictionary<int, int>();
        public List<int> reikiRoots = new List<int>();
        public int freePoint
        {
            get
            {
                return (int)PlayerDatas.Instance.baseData.FreePoint;
            }
        }
        int m_CacheFreePoint = 0;
        public int cacheFreePoint
        {
            get { return m_CacheFreePoint; }
            set
            {
                if (m_CacheFreePoint != value)
                {
                    m_CacheFreePoint = value;
                    if (onCacheFreePointRefresh != null)
                    {
                        onCacheFreePointRefresh();
                    }
                }
            }
        }
        public int mainReikiRoot
        {
            get
            {
                var job = PlayerDatas.Instance.baseData.Job;
                return m_MainReikiRoots[job];
            }
        }
        public int maxQuality { get; private set; }
        public const int FUNCTION = 36;
        public event Action onCacheFreePointRefresh;
        public event Action onReikiRootPointRefresh;
        public override void Init()
        {
            ParseConfig();
            PlayerDatas.Instance.playerDataRefreshEvent += PlayerDataRefreshEvent;
        }
        public void OnBeforePlayerDataInitialize()
        {
            m_ReikiRootPoints.Clear();
            m_ReikiRootFreePoints.Clear();
        }
        public void OnPlayerLoginOk()
        {
            RefreshReikiRootPoint();
        }
        public override void UnInit()
        {
            PlayerDatas.Instance.playerDataRefreshEvent -= PlayerDataRefreshEvent;
        }
        void ParseConfig()
        {
            var funcConfig = FuncConfigConfig.Get("RecommendPoint");
            var json = LitJson.JsonMapper.ToObject(funcConfig.Numerical1);
            foreach (var jobKey in json.Keys)
            {
                var job = int.Parse(jobKey);
                var _mainReikiRoot = 0;
                var _proportion = 0f;
                m_RecommendProportion.Add(job, new Dictionary<int, float>());
                foreach (var idKey in json[jobKey].Keys)
                {
                    var id = int.Parse(idKey);
                    var proportion = int.Parse(json[jobKey][idKey].ToString()) / 100f;
                    if (proportion > _proportion)
                    {
                        _mainReikiRoot = id;
                        _proportion = proportion;
                    }
                    m_RecommendProportion[job].Add(id, proportion);
                }
                m_MainReikiRoots.Add(job, _mainReikiRoot);
                m_RecommendReikiRoots.Add(job, new List<int>(m_RecommendProportion[job].Keys));
            }
            reikiRoots.Add((int)AttrEnum.Mater);
            reikiRoots.Add((int)AttrEnum.Wood);
            reikiRoots.Add((int)AttrEnum.Water);
            reikiRoots.Add((int)AttrEnum.Fire);
            reikiRoots.Add((int)AttrEnum.Earth);
        }
        public int GetReikiRootQuality(int id, int point)
        {
            var config = ReikiRootConfig.Get(id);
            if (config == null)
            {
                return 0;
            }
            var quality = 0;
            for (int i = 0; i < config.qualityArea.Length; i++)
            {
                if (point >= config.qualityArea[i])
                {
                    quality = i + 1;
                }
                else
                {
                    break;
                }
            }
            return quality;
        }
        public int GetReikiRootQuality(int id)
        {
            if (m_ReikiRootPoints.ContainsKey(id))
            {
                return GetReikiRootQuality(id, m_ReikiRootPoints[id]);
            }
            return GetReikiRootQuality(id, 0);
        }
        public int GetReikiRootPoint(int id)
        {
            return m_ReikiRootPoints.ContainsKey(id) ? m_ReikiRootPoints[id] : 0;
        }
        public int GetReikiRootFreePoint(int id)
        {
            return m_ReikiRootFreePoints.ContainsKey(id) ? m_ReikiRootFreePoints[id] : 0;
        }
        int GetReikiRootCachePoint(int id)
        {
            return m_CacheReikiRootPoints.ContainsKey(id) ? m_CacheReikiRootPoints[id] : 0;
        }
        public List<ReikiRootRecommend> GetReikiRootRecommendPoint(int point)
        {
            if (point == 0)
            {
                return null;
            }
            m_CacheReikiRootPoints.Clear();
            foreach (var id in m_ReikiRootPoints.Keys)
            {
                m_CacheReikiRootPoints[id] = m_ReikiRootPoints[id];
            }
            var recommends = new List<ReikiRootRecommend>();
            var job = PlayerDatas.Instance.baseData.Job;
            var remainPoint = point;
            var currentMaxQuality = 1;
            foreach (var id in reikiRoots)
            {
                var quality = GetReikiRootQuality(id);
                if (quality >= currentMaxQuality)
                {
                    currentMaxQuality = quality;
                }
            }
            if (m_RecommendReikiRoots.ContainsKey(job))
            {
                var reikiRoots = m_RecommendReikiRoots[job];
                reikiRoots.Sort(QualityCompare);
                while (remainPoint > 0)
                {
                    var id = reikiRoots[0];
                    var quality = GetReikiRootQuality(id, m_CacheReikiRootPoints[id]);
                    var addpoint = 0;
                    if (quality >= maxQuality)
                    {
                        var proportions = m_RecommendProportion[job];
                        foreach (var key in proportions.Keys)
                        {
                            addpoint = Mathf.RoundToInt(remainPoint * proportions[key]);
                            recommends.Add(new ReikiRootRecommend()
                            {
                                id = key,
                                value = addpoint,
                            });
                            if (!m_CacheReikiRootPoints.ContainsKey(key))
                            {
                                m_CacheReikiRootPoints.Add(key, 0);
                            }
                            m_CacheReikiRootPoints[key] += addpoint;
                        }
                        remainPoint = 0;
                    }
                    else
                    {
                        addpoint = Mathf.Min(remainPoint, GetCacheQualityRequrePoint(id,
                            quality < currentMaxQuality ? currentMaxQuality : quality + 1));
                        remainPoint -= addpoint;
                        recommends.Add(new ReikiRootRecommend()
                        {
                            id = id,
                            value = addpoint,
                        });
                        if (!m_CacheReikiRootPoints.ContainsKey(id))
                        {
                            m_CacheReikiRootPoints.Add(id, 0);
                        }
                        m_CacheReikiRootPoints[id] += addpoint;
                    }
                }
            }
            return recommends;
        }
        int GetCacheQualityRequrePoint(int id,int quality)
        {
            var requirePoint = 0;
            var currebtQuality = GetReikiRootQuality(id, GetReikiRootCachePoint(id));
            if (currebtQuality < quality)
            {
                var point = GetReikiRootCachePoint(id);
                requirePoint = GetQualityPoint(id, quality) - point;
            }
            return requirePoint;
        }
        public int GetQualityPoint(int id, int quality)
        {
            var config = ReikiRootConfig.Get(id);
            for (int i = 0; i < config.qualityArea.Length; i++)
            {
                if (quality == i + 1)
                {
                    return config.qualityArea[i];
                }
            }
            return 0;
        }
        public void GetReikiRootProperty(int id, int point, ref Dictionary<int, int> propertyDict)
        {
            var config = ReikiRootConfig.Get(id);
            if (!propertyDict.ContainsKey(config.propertyPerPoint.x))
            {
                propertyDict.Add(config.propertyPerPoint.x, 0);
            }
            propertyDict[config.propertyPerPoint.x] += config.propertyPerPoint.y;
            if (!propertyDict.ContainsKey(config.promoteProperty))
            {
                propertyDict.Add(config.promoteProperty, 0);
            }
            var quality = GetReikiRootQuality(id, point);
            propertyDict[config.promoteProperty] += GetQualityProperty(id, quality);
        }
        public int GetQualityProperty(int id, int quality)
        {
            var config = ReikiRootConfig.Get(id);
            var value = 0;
            for (int i = 0; i < config.promoteValue.Length; i++)
            {
                if (quality > i)
                {
                    value = config.promoteValue[i];
                }
                else
                {
                    break;
                }
            }
            return value;
        }
        public void ReceivePackage(HB107_tagMCRolePointInfo package)
        {
            for (int i = 0; i < package.PointAttrIDCount; i++)
            {
                var id = package.PointAttrIDList[i];
                var point = package.PointValueList[i];
                m_ReikiRootFreePoints[id] = point;
            }
        }
        public void SendAddPoint(byte[] points, ushort[] pointValues)
        {
            var pak = new CB206_tagCMAddPoint();
            pak.PointAttrIDList = points;
            pak.PointValueList = pointValues;
            pak.PointAttrIDCount = (byte)points.Length;
            GameNetSystem.Instance.SendInfo(pak);
        }
        int QualityCompare(int lhs, int rhs)
        {
            var lhsQuality = GetReikiRootQuality(lhs);
            var rhsQuality = GetReikiRootQuality(rhs);
            if (mainReikiRoot == lhs || mainReikiRoot == rhs)
            {
                if (lhsQuality == rhsQuality)
                {
                    return mainReikiRoot == lhs ? -1 : 1;
                }
            }
            return lhsQuality.CompareTo(rhsQuality);
        }
        private void PlayerDataRefreshEvent(PlayerDataType dataType)
        {
            switch (dataType)
            {
                case PlayerDataType.CDBPlayerRefresh_Mater:
                case PlayerDataType.CDBPlayerRefresh_Wood:
                case PlayerDataType.CDBPlayerRefresh_Water:
                case PlayerDataType.CDBPlayerRefresh_Fire:
                case PlayerDataType.CDBPlayerRefresh_Earth:
                    RefreshReikiRootPoint();
                    break;
            }
        }
        void RefreshReikiRootPoint()
        {
            foreach (var id in reikiRoots)
            {
                m_ReikiRootPoints[id] = (int)UIHelper.GetPropertyMapPlayerData((AttrEnum)id);
            }
            if (onReikiRootPointRefresh != null)
            {
                onReikiRootPointRefresh();
            }
        }
    }
    public struct ReikiRootRecommend
    {
        public int id;
        public int value;
    }
}
System/Role/ReikiRootModel.cs.meta
copy from Lua/Gen/SnxxzUIRolePointModelWrap.cs.meta copy to System/Role/ReikiRootModel.cs.meta
File was copied from Lua/Gen/SnxxzUIRolePointModelWrap.cs.meta
@@ -1,6 +1,6 @@
fileFormatVersion: 2
guid: 15f8b5f24633ef049b97209e9decd843
timeCreated: 1550120575
guid: bf54066f835418b4c9f377706c85b4ad
timeCreated: 1553479811
licenseType: Pro
MonoImporter:
  serializedVersion: 2
System/Role/ReikiRootPointBehaviour.cs
New file
@@ -0,0 +1,151 @@
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
namespace Snxxz.UI
{
    public class ReikiRootPointBehaviour : MonoBehaviour
    {
        [SerializeField] Text m_PropertyName;
        [SerializeField] Text m_PropertyValue;
        [SerializeField] Text m_Point;
        [SerializeField] Button m_Add;
        [SerializeField] Button m_Sub;
        [SerializeField] Button m_OpenKeyboard;
        public int id { get; private set; }
        int m_CachePoint = 0;
        public int point
        {
            get { return m_CachePoint; }
            set
            {
                if (m_CachePoint != value)
                {
                    m_CachePoint = value;
                    DisplayPoint();
                }
            }
        }
        Coroutine m_Coroutine = null;
        bool isPointAdd = false;
        bool isPointSub = false;
        int coroutineCount = 0;
        static WaitForSeconds waitSpeedFaster = new WaitForSeconds(0.05f);
        static WaitForSeconds waitSpeedSlow = new WaitForSeconds(0.2f);
        ReikiRootModel model { get { return ModelCenter.Instance.GetModel<ReikiRootModel>(); } }
        private void Awake()
        {
            UIEventTrigger.Get(m_Sub.gameObject).OnDown = OnSubDown;
            UIEventTrigger.Get(m_Sub.gameObject).OnUp = OnSubUp;
            UIEventTrigger.Get(m_Add.gameObject).OnDown = OnAddDown;
            UIEventTrigger.Get(m_Add.gameObject).OnUp = OnAddUp;
        }
        public void Display(int id)
        {
            this.id = id;
            DisplayBase();
            DisplayPoint();
            model.onReikiRootPointRefresh += OnReikiRootPointRefresh;
        }
        void DisplayBase()
        {
            var propertyConfig = PlayerPropertyConfig.Get(id);
            m_PropertyName.text = propertyConfig.Name;
            var qualiaty = model.GetReikiRootQuality(id);
            m_PropertyName.color = UIHelper.GetUIColor(qualiaty);
            m_PropertyValue.text = ((int)UIHelper.GetPropertyMapPlayerData((AttrEnum)id)).ToString();
        }
        void DisplayPoint()
        {
            m_Point.text = point.ToString();
        }
        private void OnAddDown(GameObject go)
        {
            isPointAdd = true;
            if (m_Coroutine != null)
            {
                StopCoroutine(m_Coroutine);
            }
            m_Coroutine = StartCoroutine(Co_PointRefresh(true));
        }
        private void OnAddUp(GameObject go)
        {
            isPointAdd = false;
        }
        private void OnSubDown(GameObject go)
        {
            if (m_Coroutine != null)
            {
                StopCoroutine(m_Coroutine);
            }
            isPointSub = true;
            m_Coroutine = StartCoroutine(Co_PointRefresh(false));
        }
        private void OnSubUp(GameObject go)
        {
            isPointSub = false;
        }
        IEnumerator Co_PointRefresh(bool pointUp)
        {
            while (pointUp ? isPointAdd : isPointSub)
            {
                if (pointUp && model.cacheFreePoint > 0)
                {
                    point += 1;
                    model.cacheFreePoint -= 1;
                }
                else if (!pointUp && point > 0)
                {
                    point -= 1;
                    model.cacheFreePoint += 1;
                }
                if (coroutineCount == 0)
                {
                    yield return waitSpeedSlow;
                }
                else
                {
                    yield return waitSpeedFaster;
                }
                coroutineCount++;
            }
        }
        private void OnReikiRootPointRefresh()
        {
            DisplayBase();
        }
        public void Dispose()
        {
            model.onReikiRootPointRefresh -= OnReikiRootPointRefresh;
            if (m_Coroutine != null)
            {
                StopCoroutine(m_Coroutine);
            }
            isPointAdd = false;
            isPointSub = false;
            point = 0;
        }
    }
}
System/Role/ReikiRootPointBehaviour.cs.meta
copy from Lua/Gen/SnxxzUIRolePointModelWrap.cs.meta copy to System/Role/ReikiRootPointBehaviour.cs.meta
File was copied from Lua/Gen/SnxxzUIRolePointModelWrap.cs.meta
@@ -1,6 +1,6 @@
fileFormatVersion: 2
guid: 15f8b5f24633ef049b97209e9decd843
timeCreated: 1550120575
guid: 0fd76f95c6abcdf4992d799150ccce66
timeCreated: 1553498324
licenseType: Pro
MonoImporter:
  serializedVersion: 2
System/Role/ReikiRootWin.cs
New file
@@ -0,0 +1,189 @@
//--------------------------------------------------------
//    [Author]:           第二世界
//    [  Date ]:           Monday, March 25, 2019
//--------------------------------------------------------
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
namespace Snxxz.UI
{
    public class ReikiRootWin : Window
    {
        [SerializeField] List<PropertyBehaviour> m_Propertys;
        [SerializeField] ReikiRootPointBehaviour[] m_ReikiRootPoints;
        [SerializeField] Text m_FreePoint;
        [SerializeField] Button m_Recommend;
        [SerializeField] Button m_Confirm;
        [SerializeField] Button m_Close;
        Dictionary<int, int> currentPropertyDict = new Dictionary<int, int>();
        Dictionary<int, int> upPropertyDict = new Dictionary<int, int>();
        ReikiRootModel model { get { return ModelCenter.Instance.GetModel<ReikiRootModel>(); } }
        #region Built-in
        protected override void BindController()
        {
        }
        protected override void AddListeners()
        {
            m_Recommend.AddListener(OnRecommend);
            m_Confirm.AddListener(Confirm);
            m_Close.AddListener(CloseClick);
        }
        protected override void OnPreOpen()
        {
            model.cacheFreePoint = model.freePoint;
            for (int i = 0; i < m_ReikiRootPoints.Length; i++)
            {
                if (i < model.reikiRoots.Count)
                {
                    m_ReikiRootPoints[i].Display(model.reikiRoots[i]);
                }
            }
            model.onCacheFreePointRefresh += OnCacheFreePointRefresh;
            PlayerDatas.Instance.playerDataRefreshEvent += PlayerDataRefreshEvent;
            Display();
        }
        protected override void OnAfterOpen()
        {
        }
        protected override void OnPreClose()
        {
            model.onCacheFreePointRefresh -= OnCacheFreePointRefresh;
            PlayerDatas.Instance.playerDataRefreshEvent -= PlayerDataRefreshEvent;
            for (int i = 0; i < m_ReikiRootPoints.Length; i++)
            {
                m_ReikiRootPoints[i].Dispose();
            }
        }
        protected override void OnAfterClose()
        {
        }
        #endregion
        void Display()
        {
            DisplayFreePoint();
            DisplayProperty();
        }
        void DisplayFreePoint()
        {
            m_FreePoint.text = model.cacheFreePoint.ToString();
        }
        void DisplayProperty()
        {
            currentPropertyDict.Clear();
            upPropertyDict.Clear();
            foreach (var reikiRootPoint in m_ReikiRootPoints)
            {
                var id = reikiRootPoint.id;
                var point = model.GetReikiRootPoint(id);
                model.GetReikiRootProperty(id, point, ref currentPropertyDict);
                var cachePoint = point + reikiRootPoint.point;
                model.GetReikiRootProperty(id, cachePoint, ref upPropertyDict);
            }
            var index = 0;
            foreach (var property in currentPropertyDict.Keys)
            {
                if (index < m_Propertys.Count)
                {
                    m_Propertys[index].gameObject.SetActive(true);
                    var value = currentPropertyDict[property];
                    var add = upPropertyDict.ContainsKey(property) ?
                        (upPropertyDict[property] - value) : 0;
                    m_Propertys[index].DisplayAdd(property, value, add);
                }
                index++;
            }
            for (int i = index; i < m_Propertys.Count; i++)
            {
                m_Propertys[i].gameObject.SetActive(false);
            }
        }
        private void OnRecommend()
        {
            var recommends = model.GetReikiRootRecommendPoint(model.freePoint);
            if (recommends != null)
            {
                foreach (var reikiRootPoint in m_ReikiRootPoints)
                {
                    var point = 0;
                    var list = recommends.FindAll((x) =>
                     {
                         return x.id == reikiRootPoint.id;
                     });
                    if (list != null)
                    {
                        foreach (var recommend in list)
                        {
                            point += recommend.value;
                        }
                    }
                    reikiRootPoint.point = point;
                }
                if (model.cacheFreePoint == 0)
                {
                    OnCacheFreePointRefresh();
                }
                model.cacheFreePoint = 0;
            }
        }
        private void Confirm()
        {
            if (model.freePoint != model.cacheFreePoint)
            {
                var ids = new byte[m_ReikiRootPoints.Length];
                var values = new ushort[m_ReikiRootPoints.Length];
                for (int i = 0; i < m_ReikiRootPoints.Length; i++)
                {
                    ids[i] = (byte)m_ReikiRootPoints[i].id;
                    values[i] = (ushort)m_ReikiRootPoints[i].point;
                }
                model.SendAddPoint(ids, values);
            }
        }
        private void OnCacheFreePointRefresh()
        {
            DisplayFreePoint();
            DisplayProperty();
        }
        private void PlayerDataRefreshEvent(PlayerDataType dataType)
        {
            if (dataType == PlayerDataType.FreePoint)
            {
                foreach (var reikiRootPoint in m_ReikiRootPoints)
                {
                    reikiRootPoint.point = 0;
                }
                model.cacheFreePoint = model.freePoint;
            }
        }
    }
}
System/Role/ReikiRootWin.cs.meta
copy from Lua/Gen/SnxxzUIRolePointModelWrap.cs.meta copy to System/Role/ReikiRootWin.cs.meta
File was copied from Lua/Gen/SnxxzUIRolePointModelWrap.cs.meta
@@ -1,6 +1,6 @@
fileFormatVersion: 2
guid: 15f8b5f24633ef049b97209e9decd843
timeCreated: 1550120575
guid: d925264697762074988dcfbc6d29d623
timeCreated: 1553498163
licenseType: Pro
MonoImporter:
  serializedVersion: 2
System/Treasure/PotentialItemBehaviour.cs
File was deleted
System/Treasure/PotentialItemBehaviour.cs.meta
File was deleted
System/Treasure/PotentialItemUseWin.cs
File was deleted
System/Treasure/PotentialItemUseWin.cs.meta
File was deleted
System/Treasure/TreasureBaseWin.cs
@@ -198,8 +198,6 @@
        private void OnDragComplete(int result)
        {
            if (NewBieCenter.Instance.inGuiding
                 || WindowCenter.Instance.IsOpen<TreasureNewStageWin>()
                 || WindowCenter.Instance.IsOpen<PotentialItemUseWin>()
                 || WindowCenter.Instance.IsOpen<TreasureSoulActiveWin>()
                 || WindowCenter.Instance.IsOpen<GetItemPathWin>()
                 || WindowCenter.Instance.IsOpen<DemonTreasurePropertyWin>()
System/Treasure/TreasureNewStageWin.cs
File was deleted
System/Treasure/TreasureNewStageWin.cs.meta
File was deleted
System/WindowBase/ModelCenter.cs
@@ -230,6 +230,7 @@
            RegisterModel<EquipStrengthModel>();
            RegisterModel<RuneModel>();
            RegisterModel<RuneResolveModel>();
            RegisterModel<ReikiRootModel>();
            inited = true;
        }
Utility/EnumHelper.cs
@@ -552,7 +552,11 @@
    CDBPlayerRefresh_SoulCore = 198,//聚魂-核心环
    CDBPlayerRefresh_Honor = 199, //# 荣誉值
    CDBPlayerRefresh_ZhuxianRate = 200, //# 荣誉值
    CDBPlayerRefresh_ZhuxianHurtPer = 201, //# 荣誉值
    CDBPlayerRefresh_Mater = 201, //# 灵根属性-金
    CDBPlayerRefresh_Wood = 202,//# 灵根属性-木
    CDBPlayerRefresh_Water = 203,//# 灵根属性-水
    CDBPlayerRefresh_Fire = 204,//# 灵根属性-火
    CDBPlayerRefresh_Earth = 205,//# 灵根属性-土
};
/** 背包类型码定义 */
@@ -795,6 +799,12 @@
    SkillReducePerE = 113, //杏黄旗技能减伤百分比
    SkillReducePerF = 114, //嗜天斧技能减伤百分比
    SkillReducePerG = 115, //射日神弓技能减伤百分比
    Luck = 120,//气运
    Mater = 201,//金
    Wood = 202,//木
    Water = 203,//水
    Fire = 204,//火
    Earth = 205,//土
}
public enum TextColType
Utility/UIHelper.cs
@@ -146,7 +146,7 @@
    /// </summary>
    /// <param name="type"></param>
    /// <returns></returns>
    public static float GetPropertyMapPlayerData(AttrEnum type)
    public static int GetPropertyMapPlayerData(AttrEnum type)
    {
        switch (type)
        {
@@ -232,6 +232,18 @@
                return PlayerDatas.Instance.extersion.skillAtkRateReduce;
            case AttrEnum.NpcHurtAddPer:
                return PlayerDatas.Instance.extersion.NpcHurtAddPer;
            case AttrEnum.Luck:
                return PlayerDatas.Instance.extersion.luckValue;
            case AttrEnum.Mater:
                return PlayerDatas.Instance.baseData.mater;
            case AttrEnum.Wood:
                return PlayerDatas.Instance.baseData.wood;
            case AttrEnum.Water:
                return PlayerDatas.Instance.baseData.water;
            case AttrEnum.Fire:
                return PlayerDatas.Instance.baseData.fire;
            case AttrEnum.Earth:
                return PlayerDatas.Instance.baseData.earth;
        }
        return 0;
    }