少年修仙传客户端代码仓库
client_linchunjie
2018-10-17 eba494f9a050178f2f71f7bf2173a00a6fa32130
3687 【1.2.0】天赋功能
13个文件已修改
14个文件已添加
2036 ■■■■ 已修改文件
Core/GameEngine/DataToCtl/PackageRegedit.cs 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/GameEngine/Model/Config/SkillConfig.cs 433 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/GameEngine/Model/Config/SkillConfig.cs.meta 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/GameEngine/Model/Config/TalentConfig.cs 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/GameEngine/Model/Config/TalentConfig.cs.meta 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/GameEngine/Model/ConfigManager.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/GameEngine/Model/Player/Character/PlayerExtersionData.cs 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/GameEngine/Model/Player/PlayerDatas.cs 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/NetworkPackage/ClientPack/ClientToMapServer/CA5_Function/CA550_tagCMResetMasterSkill.cs 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/NetworkPackage/ClientPack/ClientToMapServer/CA5_Function/CA550_tagCMResetMasterSkill.cs.meta 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/NetworkPackage/DTCFile/ServerPack/H03_MainCharacter/DTC0310_tagRoleSkillChange.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/NetworkPackage/DTCFile/ServerPack/H03_MainCharacter/DTC0311_tagDeleteSkill.cs 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/NetworkPackage/DTCFile/ServerPack/H03_MainCharacter/DTC0311_tagDeleteSkill.cs.meta 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/NetworkPackage/ServerPack/H03_MainCharacter/H0311_tagDeleteSkill.cs 34 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Skill/SkillPanel.cs 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Skill/TalentModel.cs 491 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Skill/TalentModel.cs.meta 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Skill/TalentSeriesBehaviour.cs 77 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Skill/TalentSeriesBehaviour.cs.meta 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Skill/TalentSkillBehaviour.cs 80 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Skill/TalentSkillBehaviour.cs.meta 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Skill/TalentTreeScriptable.cs 201 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Skill/TalentTreeScriptable.cs.meta 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Skill/TalentWin.cs 502 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/Skill/TalentWin.cs.meta 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
System/WindowBase/ModelCenter.cs 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Utility/EnumHelper.cs 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Core/GameEngine/DataToCtl/PackageRegedit.cs
@@ -11,6 +11,7 @@
    public static void Init()
    {
        // 登记相应的数据体及对应的数据转逻辑类
        Register(typeof(H0311_tagDeleteSkill), typeof(DTC0311_tagDeleteSkill));
        Register(typeof(HB106_tagMCNotifyPlayerMove), typeof(DTCB106_tagMCNotifyPlayerMove));
        Register(typeof(H0132_tagCreateRoleSucess), typeof(DTC0132_tagCreateRoleSucess));
        Register(typeof(HA326_tagMCNPCIDCollectionCntInfo), typeof(DTCA326_tagMCNPCIDCollectionCntInfo));
Core/GameEngine/Model/Config/SkillConfig.cs
@@ -1,6 +1,6 @@
//--------------------------------------------------------
//    [Author]:            第二世界
//    [  Date ]:           Thursday, May 03, 2018
//    [  Date ]:           Wednesday, September 26, 2018
//--------------------------------------------------------
using UnityEngine;
@@ -11,77 +11,78 @@
    
    public partial class SkillConfig : ConfigBase {
        public int SkillID { get ; private set ; }
        public string SkillName { get ; private set; }
        public int SkillTypeID { get ; private set ; }
        public int SkillLV { get ; private set ; }
        public int SkillMaxLV { get ; private set ; }
        public int UseType { get ; private set ; }
        public int FuncType { get ; private set ; }
        public int CastTime { get ; private set ; }
        public int SkillType { get ; private set ; }
        public int HurtType { get ; private set ; }
        public int ContinueUse { get ; private set ; }
        public int AtkType { get ; private set ; }
        public int AtkRadius { get ; private set ; }
        public int Tag { get ; private set ; }
        public int AtkDist { get ; private set ; }
        public int StiffTime { get ; private set ; }
        public int CoolDownTime { get ; private set ; }
        public int MP { get ; private set ; }
        public int HP { get ; private set ; }
        public int XP { get ; private set ; }
        public int UseItemID { get ; private set ; }
        public int UseItemCount { get ; private set ; }
        public int Effect1 { get ; private set ; }
        public int EffectValue11 { get ; private set ; }
        public int EffectValue12 { get ; private set ; }
        public int EffectValue13 { get ; private set ; }
        public int Effect2 { get ; private set ; }
        public int EffectValue21 { get ; private set ; }
        public int EffectValue22 { get ; private set ; }
        public int EffectValue23 { get ; private set ; }
        public int Effect3 { get ; private set ; }
        public int EffectValue31 { get ; private set ; }
        public int EffectValue32 { get ; private set ; }
        public int EffectValue33 { get ; private set ; }
        public int Effect4 { get ; private set ; }
        public int EffectValue41 { get ; private set ; }
        public int EffectValue42 { get ; private set ; }
        public int EffectValue43 { get ; private set ; }
        public int Effect5 { get ; private set ; }
        public int EffectValue51 { get ; private set ; }
        public int EffectValue52 { get ; private set ; }
        public int EffectValue53 { get ; private set ; }
        public int Effect6 { get ; private set ; }
        public int EffectValue61 { get ; private set ; }
        public int EffectValue62 { get ; private set ; }
        public int EffectValue63 { get ; private set ; }
        public int LearnSkillReq { get ; private set ; }
        public int LearnSkillLV { get ; private set ; }
        public int LearnLVReq { get ; private set ; }
        public int FightPower { get ; private set ; }
        public int LVUpCostMoneyType { get ; private set ; }
        public int LVUpCostMoney { get ; private set ; }
        public int LVUpCostExp { get ; private set ; }
        public int ClientActionLimit { get ; private set ; }
        public int ClientSkillSeriesLimit { get ; private set ; }
        public int SkillOfSeries { get ; private set ; }
        public int ExpendMPRate { get ; private set ; }
        public int ExAttr1 { get ; private set ; }
        public int ExAttr3 { get ; private set ; }
        public int ExAttr4 { get ; private set ; }
        public int ExAttr5 { get ; private set ; }
        public int WarnInfo { get ; private set ; }
        public int CtrlActionID { get ; private set ; }
        public int BuffEffectID { get ; private set ; }
        public int EffectName { get ; private set ; }
        public string IconName { get ; private set; }
        public string SkillNameIcon { get ; private set; }
        public string Description { get ; private set; }
        public string BuffDescription { get ; private set; }
        public string Skillsource { get ; private set; }
        public int Skillactmark { get ; private set ; }
        public int SkillID { get ; private set ; }
        public string SkillName { get ; private set; }
        public int SkillTypeID { get ; private set ; }
        public int SkillLV { get ; private set ; }
        public int SkillMaxLV { get ; private set ; }
        public int UseType { get ; private set ; }
        public int FuncType { get ; private set ; }
        public int CastTime { get ; private set ; }
        public int SkillType { get ; private set ; }
        public int HurtType { get ; private set ; }
        public int ContinueUse { get ; private set ; }
        public int AtkType { get ; private set ; }
        public int AtkRadius { get ; private set ; }
        public int Tag { get ; private set ; }
        public int AtkDist { get ; private set ; }
        public int StiffTime { get ; private set ; }
        public int CoolDownTime { get ; private set ; }
        public int MP { get ; private set ; }
        public int HP { get ; private set ; }
        public int XP { get ; private set ; }
        public int UseItemID { get ; private set ; }
        public int UseItemCount { get ; private set ; }
        public int Effect1 { get ; private set ; }
        public int EffectValue11 { get ; private set ; }
        public int EffectValue12 { get ; private set ; }
        public int EffectValue13 { get ; private set ; }
        public int Effect2 { get ; private set ; }
        public int EffectValue21 { get ; private set ; }
        public int EffectValue22 { get ; private set ; }
        public int EffectValue23 { get ; private set ; }
        public int Effect3 { get ; private set ; }
        public int EffectValue31 { get ; private set ; }
        public int EffectValue32 { get ; private set ; }
        public int EffectValue33 { get ; private set ; }
        public int Effect4 { get ; private set ; }
        public int EffectValue41 { get ; private set ; }
        public int EffectValue42 { get ; private set ; }
        public int EffectValue43 { get ; private set ; }
        public int Effect5 { get ; private set ; }
        public int EffectValue51 { get ; private set ; }
        public int EffectValue52 { get ; private set ; }
        public int EffectValue53 { get ; private set ; }
        public int Effect6 { get ; private set ; }
        public int EffectValue61 { get ; private set ; }
        public int EffectValue62 { get ; private set ; }
        public int EffectValue63 { get ; private set ; }
        public int LearnSkillReq { get ; private set ; }
        public int LearnSkillLV { get ; private set ; }
        public int LearnLVReq { get ; private set ; }
        public int LearnSkillPointReq { get ; private set ; }
        public int FightPower { get ; private set ; }
        public int LVUpCostMoneyType { get ; private set ; }
        public int LVUpCostMoney { get ; private set ; }
        public int LVUpCostExp { get ; private set ; }
        public int ClientActionLimit { get ; private set ; }
        public int ClientSkillSeriesLimit { get ; private set ; }
        public int SkillOfSeries { get ; private set ; }
        public int ExpendMPRate { get ; private set ; }
        public int ExAttr1 { get ; private set ; }
        public int ExAttr3 { get ; private set ; }
        public int ExAttr4 { get ; private set ; }
        public int ExAttr5 { get ; private set ; }
        public int WarnInfo { get ; private set ; }
        public int CtrlActionID { get ; private set ; }
        public int BuffEffectID { get ; private set ; }
        public int EffectName { get ; private set ; }
        public string IconName { get ; private set; }
        public string SkillNameIcon { get ; private set; }
        public string Description { get ; private set; }
        public string BuffDescription { get ; private set; }
        public string Skillsource { get ; private set; }
        public int Skillactmark { get ; private set ; }
        public int BuffDisplay { get ; private set ; }
        public override string getKey()
@@ -92,149 +93,151 @@
        public override void Parse() {
            try
            {
                SkillID=IsNumeric(rawContents[0]) ? int.Parse(rawContents[0]):0;
                SkillName = rawContents[1].Trim();
                SkillTypeID=IsNumeric(rawContents[2]) ? int.Parse(rawContents[2]):0;
                SkillLV=IsNumeric(rawContents[3]) ? int.Parse(rawContents[3]):0;
                SkillMaxLV=IsNumeric(rawContents[4]) ? int.Parse(rawContents[4]):0;
                UseType=IsNumeric(rawContents[5]) ? int.Parse(rawContents[5]):0;
                FuncType=IsNumeric(rawContents[6]) ? int.Parse(rawContents[6]):0;
                CastTime=IsNumeric(rawContents[7]) ? int.Parse(rawContents[7]):0;
                SkillType=IsNumeric(rawContents[8]) ? int.Parse(rawContents[8]):0;
                HurtType=IsNumeric(rawContents[9]) ? int.Parse(rawContents[9]):0;
                ContinueUse=IsNumeric(rawContents[10]) ? int.Parse(rawContents[10]):0;
                AtkType=IsNumeric(rawContents[11]) ? int.Parse(rawContents[11]):0;
                AtkRadius=IsNumeric(rawContents[12]) ? int.Parse(rawContents[12]):0;
                Tag=IsNumeric(rawContents[13]) ? int.Parse(rawContents[13]):0;
                AtkDist=IsNumeric(rawContents[14]) ? int.Parse(rawContents[14]):0;
                StiffTime=IsNumeric(rawContents[15]) ? int.Parse(rawContents[15]):0;
                CoolDownTime=IsNumeric(rawContents[16]) ? int.Parse(rawContents[16]):0;
                MP=IsNumeric(rawContents[17]) ? int.Parse(rawContents[17]):0;
                HP=IsNumeric(rawContents[18]) ? int.Parse(rawContents[18]):0;
                XP=IsNumeric(rawContents[19]) ? int.Parse(rawContents[19]):0;
                UseItemID=IsNumeric(rawContents[20]) ? int.Parse(rawContents[20]):0;
                UseItemCount=IsNumeric(rawContents[21]) ? int.Parse(rawContents[21]):0;
                Effect1=IsNumeric(rawContents[22]) ? int.Parse(rawContents[22]):0;
                EffectValue11=IsNumeric(rawContents[23]) ? int.Parse(rawContents[23]):0;
                EffectValue12=IsNumeric(rawContents[24]) ? int.Parse(rawContents[24]):0;
                EffectValue13=IsNumeric(rawContents[25]) ? int.Parse(rawContents[25]):0;
                Effect2=IsNumeric(rawContents[26]) ? int.Parse(rawContents[26]):0;
                EffectValue21=IsNumeric(rawContents[27]) ? int.Parse(rawContents[27]):0;
                EffectValue22=IsNumeric(rawContents[28]) ? int.Parse(rawContents[28]):0;
                EffectValue23=IsNumeric(rawContents[29]) ? int.Parse(rawContents[29]):0;
                Effect3=IsNumeric(rawContents[30]) ? int.Parse(rawContents[30]):0;
                EffectValue31=IsNumeric(rawContents[31]) ? int.Parse(rawContents[31]):0;
                EffectValue32=IsNumeric(rawContents[32]) ? int.Parse(rawContents[32]):0;
                EffectValue33=IsNumeric(rawContents[33]) ? int.Parse(rawContents[33]):0;
                Effect4=IsNumeric(rawContents[34]) ? int.Parse(rawContents[34]):0;
                EffectValue41=IsNumeric(rawContents[35]) ? int.Parse(rawContents[35]):0;
                EffectValue42=IsNumeric(rawContents[36]) ? int.Parse(rawContents[36]):0;
                EffectValue43=IsNumeric(rawContents[37]) ? int.Parse(rawContents[37]):0;
                Effect5=IsNumeric(rawContents[38]) ? int.Parse(rawContents[38]):0;
                EffectValue51=IsNumeric(rawContents[39]) ? int.Parse(rawContents[39]):0;
                EffectValue52=IsNumeric(rawContents[40]) ? int.Parse(rawContents[40]):0;
                EffectValue53=IsNumeric(rawContents[41]) ? int.Parse(rawContents[41]):0;
                Effect6=IsNumeric(rawContents[42]) ? int.Parse(rawContents[42]):0;
                EffectValue61=IsNumeric(rawContents[43]) ? int.Parse(rawContents[43]):0;
                EffectValue62=IsNumeric(rawContents[44]) ? int.Parse(rawContents[44]):0;
                EffectValue63=IsNumeric(rawContents[45]) ? int.Parse(rawContents[45]):0;
                LearnSkillReq=IsNumeric(rawContents[46]) ? int.Parse(rawContents[46]):0;
                LearnSkillLV=IsNumeric(rawContents[47]) ? int.Parse(rawContents[47]):0;
                LearnLVReq=IsNumeric(rawContents[48]) ? int.Parse(rawContents[48]):0;
                FightPower=IsNumeric(rawContents[49]) ? int.Parse(rawContents[49]):0;
                LVUpCostMoneyType=IsNumeric(rawContents[50]) ? int.Parse(rawContents[50]):0;
                LVUpCostMoney=IsNumeric(rawContents[51]) ? int.Parse(rawContents[51]):0;
                LVUpCostExp=IsNumeric(rawContents[52]) ? int.Parse(rawContents[52]):0;
                ClientActionLimit=IsNumeric(rawContents[53]) ? int.Parse(rawContents[53]):0;
                ClientSkillSeriesLimit=IsNumeric(rawContents[54]) ? int.Parse(rawContents[54]):0;
                SkillOfSeries=IsNumeric(rawContents[55]) ? int.Parse(rawContents[55]):0;
                ExpendMPRate=IsNumeric(rawContents[56]) ? int.Parse(rawContents[56]):0;
                ExAttr1=IsNumeric(rawContents[57]) ? int.Parse(rawContents[57]):0;
                ExAttr3=IsNumeric(rawContents[58]) ? int.Parse(rawContents[58]):0;
                ExAttr4=IsNumeric(rawContents[59]) ? int.Parse(rawContents[59]):0;
                ExAttr5=IsNumeric(rawContents[60]) ? int.Parse(rawContents[60]):0;
                WarnInfo=IsNumeric(rawContents[61]) ? int.Parse(rawContents[61]):0;
                CtrlActionID=IsNumeric(rawContents[62]) ? int.Parse(rawContents[62]):0;
                BuffEffectID=IsNumeric(rawContents[63]) ? int.Parse(rawContents[63]):0;
                EffectName=IsNumeric(rawContents[64]) ? int.Parse(rawContents[64]):0;
                IconName = rawContents[65].Trim();
                SkillNameIcon = rawContents[66].Trim();
                Description = rawContents[67].Trim();
                BuffDescription = rawContents[68].Trim();
                Skillsource = rawContents[69].Trim();
                Skillactmark=IsNumeric(rawContents[70]) ? int.Parse(rawContents[70]):0;
                BuffDisplay=IsNumeric(rawContents[71]) ? int.Parse(rawContents[71]):0;
                SkillID=IsNumeric(rawContents[0]) ? int.Parse(rawContents[0]):0;
                SkillName = rawContents[1].Trim();
                SkillTypeID=IsNumeric(rawContents[2]) ? int.Parse(rawContents[2]):0;
                SkillLV=IsNumeric(rawContents[3]) ? int.Parse(rawContents[3]):0;
                SkillMaxLV=IsNumeric(rawContents[4]) ? int.Parse(rawContents[4]):0;
                UseType=IsNumeric(rawContents[5]) ? int.Parse(rawContents[5]):0;
                FuncType=IsNumeric(rawContents[6]) ? int.Parse(rawContents[6]):0;
                CastTime=IsNumeric(rawContents[7]) ? int.Parse(rawContents[7]):0;
                SkillType=IsNumeric(rawContents[8]) ? int.Parse(rawContents[8]):0;
                HurtType=IsNumeric(rawContents[9]) ? int.Parse(rawContents[9]):0;
                ContinueUse=IsNumeric(rawContents[10]) ? int.Parse(rawContents[10]):0;
                AtkType=IsNumeric(rawContents[11]) ? int.Parse(rawContents[11]):0;
                AtkRadius=IsNumeric(rawContents[12]) ? int.Parse(rawContents[12]):0;
                Tag=IsNumeric(rawContents[13]) ? int.Parse(rawContents[13]):0;
                AtkDist=IsNumeric(rawContents[14]) ? int.Parse(rawContents[14]):0;
                StiffTime=IsNumeric(rawContents[15]) ? int.Parse(rawContents[15]):0;
                CoolDownTime=IsNumeric(rawContents[16]) ? int.Parse(rawContents[16]):0;
                MP=IsNumeric(rawContents[17]) ? int.Parse(rawContents[17]):0;
                HP=IsNumeric(rawContents[18]) ? int.Parse(rawContents[18]):0;
                XP=IsNumeric(rawContents[19]) ? int.Parse(rawContents[19]):0;
                UseItemID=IsNumeric(rawContents[20]) ? int.Parse(rawContents[20]):0;
                UseItemCount=IsNumeric(rawContents[21]) ? int.Parse(rawContents[21]):0;
                Effect1=IsNumeric(rawContents[22]) ? int.Parse(rawContents[22]):0;
                EffectValue11=IsNumeric(rawContents[23]) ? int.Parse(rawContents[23]):0;
                EffectValue12=IsNumeric(rawContents[24]) ? int.Parse(rawContents[24]):0;
                EffectValue13=IsNumeric(rawContents[25]) ? int.Parse(rawContents[25]):0;
                Effect2=IsNumeric(rawContents[26]) ? int.Parse(rawContents[26]):0;
                EffectValue21=IsNumeric(rawContents[27]) ? int.Parse(rawContents[27]):0;
                EffectValue22=IsNumeric(rawContents[28]) ? int.Parse(rawContents[28]):0;
                EffectValue23=IsNumeric(rawContents[29]) ? int.Parse(rawContents[29]):0;
                Effect3=IsNumeric(rawContents[30]) ? int.Parse(rawContents[30]):0;
                EffectValue31=IsNumeric(rawContents[31]) ? int.Parse(rawContents[31]):0;
                EffectValue32=IsNumeric(rawContents[32]) ? int.Parse(rawContents[32]):0;
                EffectValue33=IsNumeric(rawContents[33]) ? int.Parse(rawContents[33]):0;
                Effect4=IsNumeric(rawContents[34]) ? int.Parse(rawContents[34]):0;
                EffectValue41=IsNumeric(rawContents[35]) ? int.Parse(rawContents[35]):0;
                EffectValue42=IsNumeric(rawContents[36]) ? int.Parse(rawContents[36]):0;
                EffectValue43=IsNumeric(rawContents[37]) ? int.Parse(rawContents[37]):0;
                Effect5=IsNumeric(rawContents[38]) ? int.Parse(rawContents[38]):0;
                EffectValue51=IsNumeric(rawContents[39]) ? int.Parse(rawContents[39]):0;
                EffectValue52=IsNumeric(rawContents[40]) ? int.Parse(rawContents[40]):0;
                EffectValue53=IsNumeric(rawContents[41]) ? int.Parse(rawContents[41]):0;
                Effect6=IsNumeric(rawContents[42]) ? int.Parse(rawContents[42]):0;
                EffectValue61=IsNumeric(rawContents[43]) ? int.Parse(rawContents[43]):0;
                EffectValue62=IsNumeric(rawContents[44]) ? int.Parse(rawContents[44]):0;
                EffectValue63=IsNumeric(rawContents[45]) ? int.Parse(rawContents[45]):0;
                LearnSkillReq=IsNumeric(rawContents[46]) ? int.Parse(rawContents[46]):0;
                LearnSkillLV=IsNumeric(rawContents[47]) ? int.Parse(rawContents[47]):0;
                LearnLVReq=IsNumeric(rawContents[48]) ? int.Parse(rawContents[48]):0;
                LearnSkillPointReq=IsNumeric(rawContents[49]) ? int.Parse(rawContents[49]):0;
                FightPower=IsNumeric(rawContents[50]) ? int.Parse(rawContents[50]):0;
                LVUpCostMoneyType=IsNumeric(rawContents[51]) ? int.Parse(rawContents[51]):0;
                LVUpCostMoney=IsNumeric(rawContents[52]) ? int.Parse(rawContents[52]):0;
                LVUpCostExp=IsNumeric(rawContents[53]) ? int.Parse(rawContents[53]):0;
                ClientActionLimit=IsNumeric(rawContents[54]) ? int.Parse(rawContents[54]):0;
                ClientSkillSeriesLimit=IsNumeric(rawContents[55]) ? int.Parse(rawContents[55]):0;
                SkillOfSeries=IsNumeric(rawContents[56]) ? int.Parse(rawContents[56]):0;
                ExpendMPRate=IsNumeric(rawContents[57]) ? int.Parse(rawContents[57]):0;
                ExAttr1=IsNumeric(rawContents[58]) ? int.Parse(rawContents[58]):0;
                ExAttr3=IsNumeric(rawContents[59]) ? int.Parse(rawContents[59]):0;
                ExAttr4=IsNumeric(rawContents[60]) ? int.Parse(rawContents[60]):0;
                ExAttr5=IsNumeric(rawContents[61]) ? int.Parse(rawContents[61]):0;
                WarnInfo=IsNumeric(rawContents[62]) ? int.Parse(rawContents[62]):0;
                CtrlActionID=IsNumeric(rawContents[63]) ? int.Parse(rawContents[63]):0;
                BuffEffectID=IsNumeric(rawContents[64]) ? int.Parse(rawContents[64]):0;
                EffectName=IsNumeric(rawContents[65]) ? int.Parse(rawContents[65]):0;
                IconName = rawContents[66].Trim();
                SkillNameIcon = rawContents[67].Trim();
                Description = rawContents[68].Trim();
                BuffDescription = rawContents[69].Trim();
                Skillsource = rawContents[70].Trim();
                Skillactmark=IsNumeric(rawContents[71]) ? int.Parse(rawContents[71]):0;
                BuffDisplay=IsNumeric(rawContents[72]) ? int.Parse(rawContents[72]):0;
            }
            catch (Exception ex)
            {
Core/GameEngine/Model/Config/SkillConfig.cs.meta
@@ -1,6 +1,6 @@
fileFormatVersion: 2
guid: db393bd0ebb18b74e98ba16a7d19e7c6
timeCreated: 1525345704
timeCreated: 1537946131
licenseType: Pro
MonoImporter:
  serializedVersion: 2
Core/GameEngine/Model/Config/TalentConfig.cs
New file
@@ -0,0 +1,47 @@
//--------------------------------------------------------
//    [Author]:            第二世界
//    [  Date ]:           Thursday, October 11, 2018
//--------------------------------------------------------
using UnityEngine;
using System;
namespace TableConfig {
    public partial class TalentConfig : ConfigBase {
        public int skillId { get ; private set ; }
        public int type { get ; private set ; }
        public int series { get ; private set ; }
        public int order { get ; private set ; }
        public override string getKey()
        {
            return skillId.ToString();
        }
        public override void Parse() {
            try
            {
                skillId=IsNumeric(rawContents[0]) ? int.Parse(rawContents[0]):0;
                type=IsNumeric(rawContents[1]) ? int.Parse(rawContents[1]):0;
                series=IsNumeric(rawContents[2]) ? int.Parse(rawContents[2]):0;
                order=IsNumeric(rawContents[3]) ? int.Parse(rawContents[3]):0;
            }
            catch (Exception ex)
            {
                DebugEx.Log(ex);
            }
        }
    }
}
Core/GameEngine/Model/Config/TalentConfig.cs.meta
New file
@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: 86eb4a564c7dcb047bb4509cf2e2758a
timeCreated: 1539224901
licenseType: Pro
MonoImporter:
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
Core/GameEngine/Model/ConfigManager.cs
@@ -199,7 +199,7 @@
        AddAsyncTask<DungeonSpecialStateTimeConfig>();
        AddAsyncTask<DailyQuestSpecialOpenTimeConfig>();
        AddAsyncTask<WHYJRewardConfig>();
        AddAsyncTask<TalentConfig>();
        while (!AllCompleted())
        {
            var completedCount = 0;
Core/GameEngine/Model/Player/Character/PlayerExtersionData.cs
@@ -57,4 +57,5 @@
    public int forbidenTalk;
    public int NpcHurtAddPer;//对怪物伤害加成 188
    public int FunalHurtPer;//对怪物伤害加成 189
    public int talentPoint;//天赋点数 190
}
Core/GameEngine/Model/Player/PlayerDatas.cs
@@ -737,6 +737,9 @@
            case PlayerDataRefresh.CDBPlayerRefresh_ForbidenTalk:
                extersion.forbidenTalk = (int)value;
                break;
            case PlayerDataRefresh.CDBPlayerRefresh_TalentPoint:
                extersion.talentPoint = (int)value;
                break;
        }
    }
Core/NetworkPackage/ClientPack/ClientToMapServer/CA5_Function/CA550_tagCMResetMasterSkill.cs
New file
@@ -0,0 +1,16 @@
using UnityEngine;
using System.Collections;
// A5 50 重置大师天赋技能 #tagCMResetMasterSkill
public class CA550_tagCMResetMasterSkill : GameNetPackBasic {
    public CA550_tagCMResetMasterSkill () {
        combineCmd = (ushort)0x03FE;
        _cmd = (ushort)0xA550;
    }
    public override void WriteToBytes () {
    }
}
Core/NetworkPackage/ClientPack/ClientToMapServer/CA5_Function/CA550_tagCMResetMasterSkill.cs.meta
New file
@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: 34385181537277e42aecb5e9c8fbcb67
timeCreated: 1537966668
licenseType: Pro
MonoImporter:
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
Core/NetworkPackage/DTCFile/ServerPack/H03_MainCharacter/DTC0310_tagRoleSkillChange.cs
@@ -41,7 +41,7 @@
        model.UpdateTreasurePotentialInfo(vNetData.OldSkillID, vNetData.NewSkillID);
        ModelCenter.Instance.GetModel<TalentModel>().UpdateTalentSkill(vNetData.OldSkillID, vNetData.NewSkillID);
        if (vNetData != null)
        {
            //  horsemodel.MountSkill0310(vNetData.NewSkillID);
Core/NetworkPackage/DTCFile/ServerPack/H03_MainCharacter/DTC0311_tagDeleteSkill.cs
@@ -1,13 +1,24 @@
using UnityEngine;
using System.Collections;
/** 主角删除技能 */
public class DTC0311_tagDeleteSkill : DtcBasic {
    /** 重写基类的数据包转逻辑处理 */
    public override void Done(GameNetPackBasic vNetPack)
    {
        base.Done(vNetPack);
//        H0311_tagDeleteSkill vNetData = vNetPack as H0311_tagDeleteSkill;
    }
}
//--------------------------------------------------------
//    [Author]:           第二世界
//    [  Date ]:           Thursday, October 11, 2018
//--------------------------------------------------------
using System;
using System.Collections;
using System.Collections.Generic;
using Snxxz.UI;
public class DTC0311_tagDeleteSkill : DtcBasic
{
    public override void Done(GameNetPackBasic vNetPack)
    {
        base.Done(vNetPack);
        var package = vNetPack as H0311_tagDeleteSkill;
        ModelCenter.Instance.GetModel<TalentModel>().DeleteTalentSkill((int)package.SkillID);
    }
}
Core/NetworkPackage/DTCFile/ServerPack/H03_MainCharacter/DTC0311_tagDeleteSkill.cs.meta
@@ -1,8 +1,12 @@
fileFormatVersion: 2
guid: 995d5419b5b880447917544b8c2cf104
guid: f1409e1bfa7856e4d87922bed8509b8f
timeCreated: 1539223309
licenseType: Pro
MonoImporter:
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData: 
  assetBundleName:
  assetBundleVariant:
Core/NetworkPackage/ServerPack/H03_MainCharacter/H0311_tagDeleteSkill.cs
@@ -1,17 +1,17 @@
using UnityEngine;
using System.Collections;
/** 主角删除技能 */
public class H0311_tagDeleteSkill : GameNetPackBasic {
    public int    SkillID;
    public H0311_tagDeleteSkill () {
        _cmd = (ushort)0x0311;
    }
    /** 从字节包中解析信息 */
    public override void ReadFromBytes (byte[] vBytes) {
        TransBytes (out SkillID, vBytes, NetDataType.DWORD);
    }
}
using UnityEngine;
using System.Collections;
//03 11 主角删除技能#tagDeleteSkill
public class H0311_tagDeleteSkill : GameNetPackBasic {
    public uint SkillID;
    public H0311_tagDeleteSkill () {
        _cmd = (ushort)0x0311;
    }
    public override void ReadFromBytes (byte[] vBytes) {
        TransBytes (out SkillID, vBytes, NetDataType.DWORD);
    }
}
System/Skill/SkillPanel.cs
@@ -62,6 +62,15 @@
        private void OnTalentFunc()
        {
            CloseChild();
            functionOrder = 2;
            if (windowState == WindowState.Opened)
            {
                WindowCenter.Instance.OpenWithoutAnimation<TalentWin>();
            }
            else
            {
                WindowCenter.Instance.Open<TalentWin>();
            }
        }
        private void OnAccordFunc()
@@ -83,7 +92,7 @@
        protected override void OnActived()
        {
            base.OnActived();
            functionButtonTalent.state = TitleBtnState.Locked;
            //functionButtonTalent.state = TitleBtnState.Locked;
            if (functionOrder == 0 && model.jumpToPass)
            {
@@ -126,6 +135,10 @@
            if (WindowCenter.Instance.IsOpen<SkillPassWin>()) {
                WindowCenter.Instance.CloseImmediately<SkillPassWin>();
            }
            if (WindowCenter.Instance.IsOpen<TalentWin>())
            {
                WindowCenter.Instance.CloseImmediately<TalentWin>();
            }
        }
    }
}
System/Skill/TalentModel.cs
New file
@@ -0,0 +1,491 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using TableConfig;
using System;
using System.Linq;
namespace Snxxz.UI
{
    public class TalentModel : Model, IPlayerLoginOk, IBeforePlayerDataInitialize
    {
        Dictionary<int, TalentSkill> talentSkills = new Dictionary<int, TalentSkill>();
        Dictionary<int, TalentTree> talentTreeDict = new Dictionary<int, TalentTree>();
        int m_SelectSeries;
        public int selectSeries
        {
            get { return m_SelectSeries; }
            set
            {
                if (m_SelectSeries != value && selectSeriesEvent != null)
                {
                    m_SelectSeries = value;
                    selectSeriesEvent();
                }
                m_SelectSeries = value;
            }
        }
        int m_SelectTalentType;
        public int selectTalentType
        {
            get { return m_SelectTalentType; }
            set
            {
                if (m_SelectTalentType != value && selectTalentTypeEvnet != null)
                {
                    m_SelectTalentType = value;
                    selectTalentTypeEvnet();
                }
                m_SelectTalentType = value;
            }
        }
        int m_SelectSkill;
        public int selectSkill
        {
            get { return m_SelectSkill; }
            set
            {
                if (m_SelectSkill != value && selectSkillEvent != null)
                {
                    m_SelectSkill = value;
                    selectSkillEvent();
                }
                m_SelectSkill = value;
            }
        }
        bool serverInited = false;
        public event Action selectTalentTypeEvnet;
        public event Action selectSeriesEvent;
        public event Action selectSkillEvent;
        public event Action talentPointUpdate;
        public event Action<int> talentSkillUpdate;
        public override void Init()
        {
            ParseConfig();
            FuncOpen.Instance.OnFuncStateChangeEvent += OnFuncStateChangeEvent;
            PlayerDatas.Instance.PlayerDataRefreshInfoEvent += PlayerDataRefreshInfoEvent;
        }
        public void OnBeforePlayerDataInitialize()
        {
            foreach (var talent in talentSkills.Values)
            {
                talent.level = 0;
            }
            serverInited = false;
        }
        public void OnPlayerLoginOk()
        {
            serverInited = true;
            if (WindowCenter.Instance.IsOpen<TalentWin>())
            {
                foreach (var talent in talentSkills.Values)
                {
                    if (talentSkillUpdate != null)
                    {
                        talentSkillUpdate(talent.skillId);
                    }
                }
            }
            UpdateRedpoint();
        }
        public override void UnInit()
        {
            FuncOpen.Instance.OnFuncStateChangeEvent -= OnFuncStateChangeEvent;
            PlayerDatas.Instance.PlayerDataRefreshInfoEvent -= PlayerDataRefreshInfoEvent;
        }
        private void OnFuncStateChangeEvent(int _id)
        {
            if (_id == (int)FuncOpenEnum.Talent)
            {
                UpdateRedpoint();
            }
        }
        public int talentResetBook { get; private set; }
        public int talentResetBookCost { get; private set; }
        Dictionary<int, List<int>> jobTalentTypeDict = new Dictionary<int, List<int>>();
        void ParseConfig()
        {
            var configs = Config.Instance.GetAllValues<TalentConfig>();
            for (int i = 0; i < configs.Count; i++)
            {
                var skillId = configs[i].skillId;
                var skillConfig = Config.Instance.Get<SkillConfig>(skillId);
                TalentSkill talent;
                if (!TryGetTalent(skillConfig.SkillTypeID, out talent))
                {
                    talent = new TalentSkill(skillConfig.SkillTypeID, skillConfig.SkillMaxLV);
                    talent.level = 0;
                    talentSkills.Add(skillConfig.SkillTypeID, talent);
                    TalentTree talentTree;
                    if (!talentTreeDict.TryGetValue(skillConfig.UseType, out talentTree))
                    {
                        talentTree = new TalentTree();
                        talentTreeDict.Add(skillConfig.UseType, talentTree);
                    }
                    talentTree.Add(configs[i], skillConfig.SkillTypeID);
                    List<int> list = null;
                    if (!jobTalentTypeDict.TryGetValue(skillConfig.UseType, out list))
                    {
                        list = new List<int>();
                        jobTalentTypeDict.Add(skillConfig.UseType, list);
                    }
                    if (!list.Contains(configs[i].type))
                    {
                        list.Add(configs[i].type);
                    }
                }
            }
            var jobs = jobTalentTypeDict.Keys.ToList();
            for (int i = 0; i < jobs.Count; i++)
            {
                var list = jobTalentTypeDict[jobs[i]];
                list.Sort((x, y) =>
                {
                    return x.CompareTo(y);
                });
            }
            var config = Config.Instance.Get<FuncConfigConfig>("TalentResetBook");
            talentResetBook = int.Parse(config.Numerical1);
            talentResetBookCost = int.Parse(config.Numerical2);
        }
        public int GetTalentType(int index)
        {
            var job = (int)Math.Pow(2, PlayerDatas.Instance.baseData.Job);
            if (jobTalentTypeDict.ContainsKey(job))
            {
                var list = jobTalentTypeDict[job];
                return index < list.Count ? list[index] : list[0];
            }
            return 1;
        }
        public int talentTypeCount
        {
            get
            {
                var job = (int)Math.Pow(2, PlayerDatas.Instance.baseData.Job);
                if (jobTalentTypeDict.ContainsKey(job))
                {
                    var list = jobTalentTypeDict[job];
                    return list.Count;
                }
                return 0;
            }
        }
        public bool TryGetTalents(int job, int talentType, int talentSeries, out List<int> talents)
        {
            talents = null;
            TalentTree talentTree = null;
            var _job = (int)Math.Pow(2, job);
            talentTreeDict.TryGetValue(_job, out talentTree);
            if (null != talentTree)
            {
                return talentTree.TryGetTalents(talentType, talentSeries, out talents);
            }
            return false;
        }
        public bool TryGetTalent(int talentId, out TalentSkill talent)
        {
            return talentSkills.TryGetValue(talentId, out talent);
        }
        public int GetTalentTypePoint(int talentType)
        {
            var point = 0;
            for (int i = 1; i <= 3; i++)
            {
                point += GetSeriesPoint(talentType, i);
            }
            return point;
        }
        public int GetSeriesPoint(int talentType,int talentSeries)
        {
            var job = PlayerDatas.Instance.baseData.Job;
            List<int> list;
            var point = 0;
            if (TryGetTalents(job, talentType, talentSeries, out list))
            {
                for (int i = 0; i < list.Count; i++)
                {
                    TalentSkill talent;
                    if (TryGetTalent(list[i], out talent))
                    {
                        point += talent.level;
                    }
                }
            }
            return point;
        }
        public bool SatisfyLevelUp(int talentId, out int error)
        {
            error = 0;
            TalentSkill talent;
            if (TryGetTalent(talentId, out talent))
            {
                if (talent.level >= talent.maxLevel)
                {
                    error = 1;
                    return false;
                }
                if (talentPoint <= 0)
                {
                    error = 2;
                    return false;
                }
                var talentConfig = talent.GetTalentConfig(talent.level + 1);
                var skillConfig = talent.GetSkillConfig(talent.level + 1);
                var requireSeriesPoint = skillConfig.RequireTalentSeriesPoint();
                if (requireSeriesPoint != 0)
                {
                    var requireSeries = skillConfig.RequireTalentSeries();
                    if (GetSeriesPoint(talentConfig.type, requireSeries) < requireSeriesPoint)
                    {
                        error = 3;
                        return false;
                    }
                }
                if (skillConfig.LearnSkillReq != 0)
                {
                    TalentSkill learnTalent;
                    if (TryGetTalent(skillConfig.LearnSkillReq, out learnTalent))
                    {
                        if (learnTalent.level < skillConfig.LearnSkillLV)
                        {
                            error = 4;
                            return false;
                        }
                    }
                }
            }
            return true;
        }
        public void ProcessLevelUpError(int talentId, int error)
        {
            switch (error)
            {
                case 1:
                    SysNotifyMgr.Instance.ShowTip("TalentHighestLevel");
                    break;
                case 2:
                    SysNotifyMgr.Instance.ShowTip("LackTalentPoint");
                    break;
                case 3:
                    SysNotifyMgr.Instance.ShowTip("LackTalentSeriesPoint");
                    break;
                case 4:
                    SysNotifyMgr.Instance.ShowTip("PreTalentLevelLimit");
                    break;
            }
        }
        #region 服务端数据
        public int talentPoint { get { return PlayerDatas.Instance.extersion.talentPoint; } }
        private void PlayerDataRefreshInfoEvent(PlayerDataRefresh refreshType)
        {
            if (refreshType == PlayerDataRefresh.CDBPlayerRefresh_TalentPoint)
            {
                if (talentPointUpdate != null)
                {
                    talentPointUpdate();
                }
                UpdateRedpoint();
            }
        }
        public void UpdateTalentSkill(int _oldSkillId, int _newSkillId)
        {
            var config = Config.Instance.Get<SkillConfig>(_newSkillId);
            if (config == null)
            {
                return;
            }
            if (talentSkills.ContainsKey(config.SkillTypeID))
            {
                var talentSkill = talentSkills[config.SkillTypeID];
                talentSkill.level = config.SkillLV;
                if (talentSkillUpdate != null)
                {
                    talentSkillUpdate(config.SkillTypeID);
                }
            }
        }
        public void DeleteTalentSkill(int _skillId)
        {
            var config = Config.Instance.Get<SkillConfig>(_skillId);
            if (config == null)
            {
                return;
            }
            if (talentSkills.ContainsKey(config.SkillTypeID))
            {
                var talentSkill = talentSkills[config.SkillTypeID];
                talentSkill.level = 0;
                if (talentSkillUpdate != null)
                {
                    talentSkillUpdate(config.SkillTypeID);
                }
            }
        }
        #endregion
        #region 红点
        Redpoint talentRedpoint = new Redpoint(103, 10303);
        void UpdateRedpoint()
        {
            talentRedpoint.state = RedPointState.None;
            if (!FuncOpen.Instance.IsFuncOpen((int)FuncOpenEnum.Talent))
            {
                return;
            }
            if (talentPoint > 0)
            {
                talentRedpoint.state = RedPointState.Simple;
            }
        }
        #endregion
    }
    public class TalentSkill
    {
        public int skillId { get; private set; }
        public int level { get; set; }
        public int maxLevel { get; private set; }
        public TalentSkill(int skillId, int maxLevel)
        {
            this.skillId = skillId;
            this.maxLevel = maxLevel;
        }
        public SkillConfig GetSkillConfig(int level = 0)
        {
            if (level > 0)
            {
                return Config.Instance.Get<SkillConfig>(skillId + level - 1);
            }
            else
            {
                return Config.Instance.Get<SkillConfig>(skillId + level);
            }
        }
        public TalentConfig GetTalentConfig(int level = 0)
        {
            if (level > 0)
            {
                return Config.Instance.Get<TalentConfig>(skillId + level - 1);
            }
            else
            {
                return Config.Instance.Get<TalentConfig>(skillId + level);
            }
        }
    }
    public class TalentSeries
    {
        public int series { get; private set; }
        public List<int> talentSkills { get; private set; }
        public TalentSeries(int series)
        {
            this.series = series;
            talentSkills = new List<int>();
        }
        public void Add(int skillId)
        {
            if (talentSkills.Contains(skillId))
            {
                return;
            }
            talentSkills.Add(skillId);
        }
    }
    public class TalentTree
    {
        Dictionary<int, List<TalentSeries>> talentSeriesDict = new Dictionary<int, List<TalentSeries>>();
        public void Add(TalentConfig config, int skillId)
        {
            List<TalentSeries> list = null;
            if (!talentSeriesDict.TryGetValue(config.type, out list))
            {
                list = new List<TalentSeries>();
                talentSeriesDict.Add(config.type, list);
            }
            TalentSeries talentSeries = list.Find((x) =>
             {
                 return x.series == config.series;
             });
            if (talentSeries == null)
            {
                talentSeries = new TalentSeries(config.series);
                list.Add(talentSeries);
            }
            talentSeries.Add(skillId);
        }
        public bool TryGetTalents(int type, int series, out List<int> list)
        {
            list = null;
            if (talentSeriesDict.ContainsKey(type))
            {
                var talentSeries = talentSeriesDict[type].Find((x) =>
                 {
                     return x.series == series;
                 });
                if (talentSeries != null)
                {
                    list = talentSeries.talentSkills;
                    return true;
                }
            }
            return false;
        }
    }
    public static class TalentHelper
    {
        public static int RequireTalentSeries(this SkillConfig config)
        {
            if (config == null)
            {
                return 0;
            }
            return config.LearnSkillPointReq / 10000;
        }
        public static int RequireTalentSeriesPoint(this SkillConfig config)
        {
            if (config == null)
            {
                return 0;
            }
            return config.LearnSkillPointReq % 10000;
        }
    }
}
System/Skill/TalentModel.cs.meta
New file
@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: 94d2b0e6415910d47a88b77e252ec3a0
timeCreated: 1532942625
licenseType: Pro
MonoImporter:
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
System/Skill/TalentSeriesBehaviour.cs
New file
@@ -0,0 +1,77 @@
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
namespace Snxxz.UI
{
    public class TalentSeriesBehaviour : MonoBehaviour
    {
        [SerializeField] int talentSeries = 0;
        [SerializeField] Button m_Button;
        [SerializeField] Image m_Icon;
        [SerializeField] Text m_TalentType;
        [SerializeField] Text m_TalentPoint;
        [SerializeField] RectTransform m_ContainerSelect;
        TalentModel model { get { return ModelCenter.Instance.GetModel<TalentModel>(); } }
        private void Awake()
        {
            m_Button.onClick.AddListener(SelectSeries);
        }
        private void SelectSeries()
        {
            if (talentSeries != 0)
            {
                model.selectSeries = talentSeries;
            }
        }
        public void Display()
        {
            m_ContainerSelect.gameObject.SetActive(talentSeries == model.selectSeries);
            m_TalentType.text = Language.Get(StringUtility.Contact("TalentBtnSeries_", talentSeries));
            DisplayTalentPoint();
            model.selectSeriesEvent -= OnSelectSeriesEvent;
            model.selectSeriesEvent += OnSelectSeriesEvent;
            model.selectTalentTypeEvnet -= OnSelectTalentTypeEvnet;
            model.selectTalentTypeEvnet += OnSelectTalentTypeEvnet;
            model.talentSkillUpdate -= TalentSkillUpdate;
            model.talentSkillUpdate += TalentSkillUpdate;
        }
        void DisplayTalentPoint()
        {
            var point = model.GetSeriesPoint(model.selectTalentType, talentSeries);
            m_TalentPoint.text = StringUtility.Contact("(", point, ")");
        }
        public void Dispose()
        {
            model.selectSeriesEvent -= OnSelectSeriesEvent;
            model.selectTalentTypeEvnet -= OnSelectTalentTypeEvnet;
            model.talentSkillUpdate -= TalentSkillUpdate;
        }
        private void TalentSkillUpdate(int skillId)
        {
            DisplayTalentPoint();
        }
        private void OnSelectSeriesEvent()
        {
            m_ContainerSelect.gameObject.SetActive(talentSeries == model.selectSeries);
        }
        private void OnSelectTalentTypeEvnet()
        {
            DisplayTalentPoint();
        }
    }
}
System/Skill/TalentSeriesBehaviour.cs.meta
New file
@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: 44434ba8a44224c408afd5e00a00f571
timeCreated: 1533004940
licenseType: Pro
MonoImporter:
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
System/Skill/TalentSkillBehaviour.cs
New file
@@ -0,0 +1,80 @@
using System;
using System.Collections;
using System.Collections.Generic;
using TableConfig;
using UnityEngine;
using UnityEngine.UI;
namespace Snxxz.UI
{
    public class TalentSkillBehaviour : MonoBehaviour
    {
        [SerializeField] Image m_Icon;
        [SerializeField] Text m_Level;
        [SerializeField] Button m_Button;
        [SerializeField] RectTransform m_ContainerSelect;
        int skillId = 0;
        TalentModel model { get { return ModelCenter.Instance.GetModel<TalentModel>(); } }
        private void Awake()
        {
            m_Button.onClick.AddListener(SelectSkill);
        }
        public void Display(int _skillId)
        {
            skillId = _skillId;
            model.talentSkillUpdate -= TalentSkillUpdate;
            model.talentSkillUpdate += TalentSkillUpdate;
            model.selectSkillEvent -= OnSelectSkillEvent;
            model.selectSkillEvent += OnSelectSkillEvent;
            Display();
        }
        private void Display()
        {
            TalentSkill talent;
            if (model.TryGetTalent(skillId, out talent))
            {
                var config = Config.Instance.Get<SkillConfig>(talent.skillId);
                if (config != null)
                {
                    m_Icon.SetSprite(config.IconName);
                }
                m_Level.text = StringUtility.Contact(talent.level, "/", talent.maxLevel);
                m_Icon.material = talent.level > 0 ? MaterialUtility.GetUIDefaultGraphicMaterial() : MaterialUtility.GetDefaultSpriteGrayMaterial();
                m_ContainerSelect.gameObject.SetActive(skillId == model.selectSkill);
            }
        }
        private void TalentSkillUpdate(int _skillid)
        {
            if (skillId == _skillid)
            {
                Display();
            }
        }
        private void OnSelectSkillEvent()
        {
            m_ContainerSelect.gameObject.SetActive(skillId == model.selectSkill);
        }
        public void Dispose()
        {
            model.talentSkillUpdate -= TalentSkillUpdate;
            model.selectSkillEvent -= OnSelectSkillEvent;
        }
        private void SelectSkill()
        {
            if (skillId != 0)
            {
                model.selectSkill = skillId;
            }
        }
    }
}
System/Skill/TalentSkillBehaviour.cs.meta
New file
@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: 5359bc88b0bc7cd439412a99efda7dbb
timeCreated: 1533007965
licenseType: Pro
MonoImporter:
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
System/Skill/TalentTreeScriptable.cs
New file
@@ -0,0 +1,201 @@
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
#if UNITY_EDITOR
using UnityEditor;
#endif
namespace Snxxz.UI
{
    public class TalentTreeScriptable : ScriptableObject
    {
        [SerializeField] TalentTree talentTrees;
        [SerializeField] Vector2 m_ContentSizeDelta;
        [SerializeField] List<TalentElement> skillElements;
        [SerializeField] List<ArrowElement> arrowElements;
        public Vector2 contentSizeDelta
        {
            get { return m_ContentSizeDelta; }
        }
        public int arrowCount
        {
            get { return arrowElements == null ? 0 : arrowElements.Count; }
        }
        public int skillCount
        {
            get { return skillElements == null ? 0 : skillElements.Count; }
        }
        public TalentElement GetTalentElement(int index)
        {
            if (skillElements != null && index < skillElements.Count)
            {
                return skillElements[index];
            }
            return default(TalentElement);
        }
        public ArrowElement GetArrowElement(int index)
        {
            if (arrowElements != null && index < arrowElements.Count)
            {
                return arrowElements[index];
            }
            return default(ArrowElement);
        }
        public float GetPercentBySkillElement(int index, float viewHeight, float offset)
        {
            if (skillElements != null && index < skillElements.Count)
            {
                var element = skillElements[index];
                var height = contentSizeDelta.y - Mathf.Abs(element.position.y);
                var percent = Mathf.Clamp01((height - viewHeight) / (contentSizeDelta.y - viewHeight));
                return Mathf.Clamp01(percent + (offset / (contentSizeDelta.y - viewHeight)));//偏移
            }
            return 1;
        }
#if UNITY_EDITOR
        public void ApplyTalentElement(int index,Vector3 _position)
        {
            if (skillElements == null)
            {
                skillElements = new List<TalentElement>();
            }
            var element = new TalentElement()
            {
                position = _position,
            };
            if (index >= skillElements.Count)
            {
                skillElements.Add(element);
            }
            else
            {
                skillElements[index] = element;
            }
        }
        public void SyncTalentElementsCount(int count)
        {
            if (count < skillElements.Count)
            {
                skillElements.RemoveRange(count, skillElements.Count - count);
            }
        }
        public void ApplyArrowElement(int index, Vector3 _position, Vector2 _sizeDelta, Vector3 _rotation, string _iconKey)
        {
            if (arrowElements == null)
            {
                arrowElements = new List<ArrowElement>();
            }
            var element = new ArrowElement()
            {
                position = _position,
                sizeDelta = _sizeDelta,
                rotation = _rotation,
                iconKey = _iconKey,
            };
            if (index >= arrowElements.Count)
            {
                arrowElements.Add(element);
            }
            else
            {
                arrowElements[index] = element;
            }
        }
        public void SyncArrowElementsCount(int count)
        {
            if (count < arrowElements.Count)
            {
                arrowElements.RemoveRange(count, arrowElements.Count - count);
            }
        }
#endif
        public bool Belong(int job, int talentType, int talentSeries)
        {
            return talentTrees.Belong(job, talentType, talentSeries);
        }
        [Serializable]
        public struct TalentTree
        {
            public int[] jobs;
            public int[] talentTypes;
            public int[] talentSeriess;
            public bool Belong(int job, int talentType, int talentSeries)
            {
                bool sameJob = false;
                for (int i = 0; i < jobs.Length; i++)
                {
                    if (jobs[i] == job)
                    {
                        sameJob = true;
                        break;
                    }
                }
                bool sameType = false;
                for (int i = 0; i < talentTypes.Length; i++)
                {
                    if (talentTypes[i] == talentType)
                    {
                        sameType = true;
                        break;
                    }
                }
                bool sameSeries = false;
                for (int i = 0; i < talentSeriess.Length; i++)
                {
                    if (talentSeriess[i] == talentSeries)
                    {
                        sameSeries = true;
                        break;
                    }
                }
                return sameJob && sameType && sameSeries;
            }
        }
        [Serializable]
        public struct TalentElement
        {
            public Vector3 position;
        }
        [Serializable]
        public struct ArrowElement
        {
            public string iconKey;
            public Vector3 position;
            public Vector3 rotation;
            public Vector2 sizeDelta;
        }
    }
#if UNITY_EDITOR
    public class TalentTreeScriptableEditor : Editor
    {
        [MenuItem("策划工具/生成天赋配置文件")]
        static void BuildConfig()
        {
            TalentTreeScriptable config = CreateInstance<TalentTreeScriptable>();
            string _path = StringUtility.Contact("Assets/ResourcesOut/Refdata/ScriptableObject/SoTalentTree/",
                                          "SoTalentTree_",
                                          ".asset");
            AssetDatabase.CreateAsset(config, _path);
            AssetDatabase.Refresh();
            ProjectWindowUtil.ShowCreatedAsset(config);
        }
    }
#endif
}
System/Skill/TalentTreeScriptable.cs.meta
New file
@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: 56183617d36b9af4d9dbb2785a581975
timeCreated: 1537859705
licenseType: Pro
MonoImporter:
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
System/Skill/TalentWin.cs
New file
@@ -0,0 +1,502 @@
//--------------------------------------------------------
//    [Author]:           第二世界
//    [  Date ]:           Tuesday, July 31, 2018
//--------------------------------------------------------
using System;
using System.Collections;
using System.Collections.Generic;
using TableConfig;
using UnityEngine;
using UnityEngine.UI;
namespace Snxxz.UI {
    public class TalentWin : Window
    {
        [SerializeField] TalentSeriesBehaviour[] m_TalentSeries;
        [SerializeField] TalentTreeScriptable[] m_TalentConfigs;
        [SerializeField] RectTransform m_ContainerSelect;
        [SerializeField] Button m_TalentTypeSelect;
        [SerializeField] Text m_TalentType;
        [SerializeField] Text m_TalentTitle;
        [SerializeField] float m_AutoSelectOffset = 62f;
        [SerializeField] ScrollRect m_Scroller;
        [SerializeField] List<TalentSkillBehaviour> m_TalentSkills;
        [SerializeField] List<Image> m_Arrows;
        [SerializeField] RectTransform m_ContainerSelectSkill;
        [SerializeField] Image m_SelectSkillIcon;
        [SerializeField] Text m_SelectSkillLevel;
        [SerializeField] Text m_SelectSkillName;
        [SerializeField] RectTransform m_ContainerUnActive;
        [SerializeField] RectTransform m_ContainerActive;
        [SerializeField] RectTransform m_ContainerBetter;
        [SerializeField] RectTransform m_ContainerMax;
        [SerializeField] Text[] m_SelectConditions;
        [SerializeField] Text m_SelectSkillEffect;
        [SerializeField] Text m_SelectNextEffect;
        [SerializeField] Button m_ResetPoint;
        [SerializeField] Button m_AddPoint;
        [SerializeField] Text m_AddPointBtnText;
        [SerializeField] Text m_SurplusPoint;
#if UNITY_EDITOR
        [SerializeField] TalentTreeScriptable m_EditorScriptable;
        [SerializeField] bool m_EditorMode;
        [SerializeField] string m_StraightArrowName;
        [SerializeField] string m_TurnArrowName;
#endif
        TalentModel model { get { return ModelCenter.Instance.GetModel<TalentModel>(); } }
        PlayerPackModel pack { get { return ModelCenter.Instance.GetModel<PlayerPackModel>(); } }
        #region Built-in
        protected override void BindController()
        {
        }
        protected override void AddListeners()
        {
            m_TalentTypeSelect.onClick.AddListener(SelectTalentType);
            m_ResetPoint.onClick.AddListener(ResetPoint);
            m_AddPoint.onClick.AddListener(AddPoint);
        }
        protected override void OnPreOpen()
        {
            model.selectSeries = 1;
            model.selectTalentType = model.GetTalentType(0);
            Display();
            model.selectTalentTypeEvnet += OnSelectTalentTypeEvnet;
            model.selectSeriesEvent += OnSelectSeriesEvent;
            model.selectSkillEvent += OnSelectSkillEvent;
            model.talentSkillUpdate += TalentSkillUpdate;
            model.talentPointUpdate += TalentPointUpdate;
        }
        protected override void OnAfterOpen()
        {
        }
        protected override void OnPreClose()
        {
            model.selectTalentTypeEvnet -= OnSelectTalentTypeEvnet;
            model.selectSeriesEvent -= OnSelectSeriesEvent;
            model.selectSkillEvent -= OnSelectSkillEvent;
            model.talentSkillUpdate -= TalentSkillUpdate;
            model.talentPointUpdate -= TalentPointUpdate;
            for (int i = 0; i < m_TalentSeries.Length; i++)
            {
                m_TalentSeries[i].Dispose();
            }
            for (int i = 0; i < m_TalentSkills.Count; i++)
            {
                m_TalentSkills[i].Dispose();
            }
#if UNITY_EDITOR
            if (m_EditorScriptable != null)
            {
                m_EditorScriptable = null;
            }
#endif
        }
        protected override void OnAfterClose()
        {
        }
        #endregion
        protected override void LateUpdate()
        {
            base.LateUpdate();
#if UNITY_EDITOR
            if (m_EditorMode && m_EditorScriptable != null)
            {
                DisplayTalentLayout(m_EditorScriptable);
            }
#endif
        }
        void Display()
        {
            for (int i = 0; i < m_TalentSeries.Length; i++)
            {
                m_TalentSeries[i].Display();
            }
            DisplaySkills();
            DisplayTalentType();
            DisplaySelectSkill();
            DisplayTalentPoint();
            DisplayLevelUp();
        }
        void DisplaySkills()
        {
            var job = PlayerDatas.Instance.baseData.Job;
            List<int> talents = null;
            model.TryGetTalents(job, model.selectTalentType, model.selectSeries, out talents);
            TalentTreeScriptable selectScriptable = null;
            for (int i = 0; i < m_TalentConfigs.Length; i++)
            {
                if (m_TalentConfigs[i].Belong(job, model.selectTalentType, model.selectSeries))
                {
                    selectScriptable = m_TalentConfigs[i];
                    DisplayTalentLayout(selectScriptable);
                    break;
                }
            }
            List<int> sortTalents = new List<int>(talents);
            sortTalents.Sort(Compare);
            var index = 0;
            if (sortTalents != null && sortTalents.Count > 0)
            {
                index = 0;
            }
            model.selectSkill = sortTalents[index];
            if (selectScriptable != null)
            {
                var rect = m_Scroller.transform as RectTransform;
                var skillRect = m_TalentSkills[0].transform as RectTransform;
                m_Scroller.verticalNormalizedPosition = selectScriptable.GetPercentBySkillElement(index, rect.sizeDelta.y, m_AutoSelectOffset);
            }
            for (int i = 0; i < m_TalentSkills.Count; i++)
            {
                if (sortTalents != null && i < sortTalents.Count)
                {
                    m_TalentSkills[i].gameObject.SetActive(true);
                    m_TalentSkills[i].Display(sortTalents[i]);
                }
                else
                {
                    m_TalentSkills[i].Dispose();
                    m_TalentSkills[i].gameObject.SetActive(false);
                }
            }
            var talentTypeDisplay = Language.Get(StringUtility.Contact("TalentType_", model.selectTalentType));
            var seriesDisplay = Language.Get(StringUtility.Contact("TalentSeries_", model.selectSeries));
            m_TalentTitle.text = StringUtility.Contact(talentTypeDisplay, "·", seriesDisplay);
        }
        void DisplayTalentType()
        {
            m_ContainerSelect.gameObject.SetActive(model.talentTypeCount > 1);
            if (model.talentTypeCount > 1)
            {
                var unselectTalentType = model.selectTalentType == model.GetTalentType(0) ? model.GetTalentType(1) : model.GetTalentType(0);
                var point = model.GetTalentTypePoint(unselectTalentType);
                var job = PlayerDatas.Instance.baseData.Job;
                var talentTypeDisplay = Language.Get(StringUtility.Contact("TalentBtnType_", unselectTalentType));
                m_TalentType.text = StringUtility.Contact(talentTypeDisplay, "(", point, ")");
            }
        }
        void DisplaySelectSkill()
        {
            DisplaySkillInfo();
            DisplayConditions();
            DisplaySkillEffect();
        }
        void DisplayConditions()
        {
            TalentSkill talent;
            var index = 0;
            if (model.TryGetTalent(model.selectSkill, out talent))
            {
                var talentConfig = talent.GetTalentConfig(talent.level + 1);
                var skillConfig = talent.GetSkillConfig(talent.level + 1);
                if (talentConfig != null)
                {
                    var requireSeriesPoint = skillConfig.RequireTalentSeriesPoint();
                    if (requireSeriesPoint != 0 && index < m_SelectConditions.Length)
                    {
                        m_SelectConditions[index].gameObject.SetActive(true);
                        var requireSeries = skillConfig.RequireTalentSeries();
                        var point = model.GetSeriesPoint(talentConfig.type, requireSeries);
                        var requireDisplay = StringUtility.Contact(point, "/", requireSeriesPoint);
                        requireDisplay = UIHelper.GetTextColorByItemColor(point >= requireSeriesPoint ?
                            TextColType.Green : TextColType.Red, requireDisplay);
                        var seriesDisplay = Language.Get("TalentSeriesCondition", Language.Get(StringUtility.Contact("TalentSeries_", requireSeries)));
                        m_SelectConditions[index].text = StringUtility.Contact(seriesDisplay, requireDisplay);
                        index++;
                    }
                }
                if (skillConfig != null && index < m_SelectConditions.Length)
                {
                    TalentSkill learnTalent;
                    if (skillConfig.LearnSkillReq != 0 && model.TryGetTalent(skillConfig.LearnSkillReq, out learnTalent))
                    {
                        var learnSkillConfig = Config.Instance.Get<SkillConfig>(skillConfig.LearnSkillReq);
                        m_SelectConditions[index].gameObject.SetActive(true);
                        var requireDisplay = StringUtility.Contact(learnSkillConfig.SkillName, " ", learnTalent.level, "/", skillConfig.LearnSkillLV);
                        requireDisplay = UIHelper.GetTextColorByItemColor(learnTalent.level >= skillConfig.LearnSkillLV ?
                            TextColType.Green : TextColType.Red, requireDisplay);
                        m_SelectConditions[index].text = StringUtility.Contact(Language.Get("TalentPreSkillCondition"), requireDisplay);
                        index++;
                    }
                }
            }
            for (int i = index; i < m_SelectConditions.Length; i++)
            {
                m_SelectConditions[i].gameObject.SetActive(false);
            }
        }
        void DisplaySkillInfo()
        {
            TalentSkill talent;
            m_ContainerSelectSkill.gameObject.SetActive(false);
            if (model.TryGetTalent(model.selectSkill, out talent))
            {
                m_ContainerSelectSkill.gameObject.SetActive(true);
                var config = talent.GetSkillConfig(talent.level);
                m_SelectSkillIcon.SetSprite(config.IconName);
                m_SelectSkillLevel.text = StringUtility.Contact(Language.Get("TalentLevel"), talent.level, "/", talent.maxLevel);
                m_SelectSkillName.text = config.SkillName;
            }
        }
        void DisplaySkillEffect()
        {
            TalentSkill talent;
            if (model.TryGetTalent(model.selectSkill, out talent))
            {
                m_ContainerUnActive.gameObject.SetActive(talent.level == 0);
                m_ContainerActive.gameObject.SetActive(talent.level > 0);
                m_ContainerBetter.gameObject.SetActive(talent.level < talent.maxLevel);
                m_ContainerMax.gameObject.SetActive(talent.level >= talent.maxLevel);
                if (talent.level > 0)
                {
                    var config = talent.GetSkillConfig(talent.level);
                    m_SelectSkillEffect.text = config.Description;
                }
                if (talent.level < talent.maxLevel)
                {
                    var nextConfig = talent.GetSkillConfig(talent.level + 1);
                    m_SelectNextEffect.text = nextConfig.Description;
                }
            }
        }
        bool TryGetTalentConfig(out TalentTreeScriptable config)
        {
            config = null;
            for (int i = 0; i < m_TalentConfigs.Length; i++)
            {
                if (m_TalentConfigs[i].Belong(PlayerDatas.Instance.baseData.Job, model.selectTalentType, model.selectSeries))
                {
                    config = m_TalentConfigs[i];
                    return true;
                }
            }
            return false;
        }
        void DisplayTalentPoint()
        {
            m_SurplusPoint.text = model.talentPoint.ToString();
        }
        private void TalentSkillUpdate(int _skillId)
        {
            if (_skillId == model.selectSkill)
            {
                DisplaySkillInfo();
                DisplayConditions();
                DisplaySkillEffect();
                DisplayLevelUp();
            }
        }
        private void TalentPointUpdate()
        {
            DisplayTalentPoint();
        }
        private void OnSelectTalentTypeEvnet()
        {
            model.selectSeries = 1;
            DisplaySkills();
            DisplaySelectSkill();
            DisplayTalentType();
        }
        private void OnSelectSeriesEvent()
        {
            DisplaySkills();
            DisplaySelectSkill();
        }
        private void OnSelectSkillEvent()
        {
            DisplaySelectSkill();
            DisplayLevelUp();
        }
        private void SelectTalentType()
        {
            if (model.talentTypeCount > 1)
            {
                model.selectTalentType = model.selectTalentType == model.GetTalentType(0) ?
                         model.GetTalentType(1) : model.GetTalentType(0);
            }
        }
        private void DisplayLevelUp()
        {
            TalentSkill talent;
            if (model.TryGetTalent(model.selectSkill, out talent))
            {
                m_AddPointBtnText.text = talent.level >= talent.maxLevel ? Language.Get("TalentHighestLevel") : Language.Get("TalentLevelUp");
            }
        }
        private void AddPoint()
        {
            TalentSkill talent;
            if (model.TryGetTalent(model.selectSkill, out talent))
            {
                int error;
                if (!model.SatisfyLevelUp(model.selectSkill, out error))
                {
                    model.ProcessLevelUpError(model.selectSkill, error);
                    return;
                }
                else
                {
                    C0304_tagCAddSkillPoint pak = new C0304_tagCAddSkillPoint();
                    pak.SkillID = (ushort)model.selectSkill;
                    GameNetSystem.Instance.SendInfo(pak);
                }
            }
        }
        private void ResetPoint()
        {
            var count = pack.GetItemCountByID(PackType.rptItem, model.talentResetBook);
            var config = Config.Instance.Get<ItemConfig>(model.talentResetBook);
            if (count > 0)
            {
                ConfirmCancel.ShowItemConfirm(Language.Get("TalentResetRequire", config.ItemName), model.talentResetBook, 1, () =>
                    {
                        CA550_tagCMResetMasterSkill pak = new CA550_tagCMResetMasterSkill();
                        GameNetSystem.Instance.SendInfo(pak);
                    });
            }
            else
            {
                ConfirmCancel.ShowPopConfirm(Language.Get("Mail101"), Language.Get("LackTalentBook",
                    config.ItemName, model.talentResetBookCost), (bool isOk) =>
                    {
                        if (isOk)
                        {
                            if (UIHelper.GetMoneyCnt(1) < (ulong)model.talentResetBookCost)
                            {
                                WindowCenter.Instance.Open<RechargeTipWin>();
                            }
                            else
                            {
                                CA550_tagCMResetMasterSkill pak = new CA550_tagCMResetMasterSkill();
                                GameNetSystem.Instance.SendInfo(pak);
                            }
                        }
                    });
            }
        }
        void DisplayTalentLayout(TalentTreeScriptable config)
        {
            m_Scroller.content.sizeDelta = config.contentSizeDelta;
            for (int i = 0; i < config.skillCount; i++)
            {
                var element = config.GetTalentElement(i);
                if (i < m_TalentSkills.Count)
                {
                    m_TalentSkills[i].transform.localPosition = element.position;
                }
            }
            var index = 0;
            for (int i = 0; i < config.arrowCount; i++)
            {
                var element = config.GetArrowElement(i);
                if (i < m_Arrows.Count)
                {
                    var arrow = m_Arrows[i];
                    arrow.gameObject.SetActive(true);
                    arrow.transform.localPosition = element.position;
                    arrow.transform.localEulerAngles = element.rotation;
                    arrow.rectTransform.sizeDelta = element.sizeDelta;
                    arrow.SetSprite(element.iconKey);
                    index++;
                }
            }
            for (int i = index; i < m_Arrows.Count; i++)
            {
                m_Arrows[i].gameObject.SetActive(false);
            }
        }
        int Compare(int x, int y)
        {
            var configx = Config.Instance.Get<TalentConfig>(x);
            var configy = Config.Instance.Get<TalentConfig>(y);
            if (configx != null && configy != null)
            {
                return configx.order.CompareTo(configy.order);
            }
            return 0;
        }
#if UNITY_EDITOR
        [ContextMenu("应用位置数据")]
        void ApplyPositionToScriptable()
        {
            if (m_EditorScriptable == null)
            {
                return;
            }
            var count = 0;
            for (int i = 0; i < m_TalentSkills.Count; i++)
            {
                if (m_TalentSkills[i].gameObject.activeSelf)
                {
                    m_EditorScriptable.ApplyTalentElement(count, m_TalentSkills[i].transform.localPosition);
                    count++;
                }
            }
            m_EditorScriptable.SyncTalentElementsCount(count);
            count = 0;
            if (m_Arrows != null)
            {
                for (int i = 0; i < m_Arrows.Count; i++)
                {
                    if (m_Arrows[i].gameObject.activeSelf)
                    {
                        m_EditorScriptable.ApplyArrowElement(count, m_Arrows[i].transform.localPosition,
                            m_Arrows[i].rectTransform.sizeDelta, m_Arrows[i].transform.localEulerAngles,
                            m_Arrows[i].sprite.name.Equals(m_StraightArrowName) ? "Talent_StraightArrow" : "Talent_TurnArrow");
                        count++;
                    }
                }
                m_EditorScriptable.SyncArrowElementsCount(count);
            }
        }
#endif
    }
}
System/Skill/TalentWin.cs.meta
New file
@@ -0,0 +1,12 @@
fileFormatVersion: 2
guid: 0bfe355d392770544ad6c5a5d59852f1
timeCreated: 1533002943
licenseType: Pro
MonoImporter:
  serializedVersion: 2
  defaultReferences: []
  executionOrder: 0
  icon: {instanceID: 0}
  userData:
  assetBundleName:
  assetBundleVariant:
System/WindowBase/ModelCenter.cs
@@ -196,6 +196,7 @@
            RegisterModel<AwardExchangeModel>();
            RegisterModel<WheelOfFortuneModel>();
            RegisterModel<FlashRushToBuyModel>();
            RegisterModel<TalentModel>();
            RegisterModel<OpenServerActivityNotifyModel>();
            inited = true;
        }
Utility/EnumHelper.cs
@@ -565,6 +565,7 @@
    CDBPlayerRefresh_Danjing = 187,              // 丹精 187
    CDBPlayerRefresh_NPCHurtAddPer,//对怪物伤害加成 188
    FunalHurtPer = 189,// 最终伤害加成
    CDBPlayerRefresh_TalentPoint = 190,
};
/** 物品加成类型 */