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; @@ -60,6 +60,7 @@ 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 ; } @@ -190,51 +191,53 @@ LearnLVReq=IsNumeric(rawContents[48]) ? int.Parse(rawContents[48]):0; FightPower=IsNumeric(rawContents[49]) ? int.Parse(rawContents[49]):0; LearnSkillPointReq=IsNumeric(rawContents[49]) ? int.Parse(rawContents[49]):0; LVUpCostMoneyType=IsNumeric(rawContents[50]) ? int.Parse(rawContents[50]):0; FightPower=IsNumeric(rawContents[50]) ? int.Parse(rawContents[50]):0; LVUpCostMoney=IsNumeric(rawContents[51]) ? int.Parse(rawContents[51]):0; LVUpCostMoneyType=IsNumeric(rawContents[51]) ? int.Parse(rawContents[51]):0; LVUpCostExp=IsNumeric(rawContents[52]) ? int.Parse(rawContents[52]):0; LVUpCostMoney=IsNumeric(rawContents[52]) ? int.Parse(rawContents[52]):0; ClientActionLimit=IsNumeric(rawContents[53]) ? int.Parse(rawContents[53]):0; LVUpCostExp=IsNumeric(rawContents[53]) ? int.Parse(rawContents[53]):0; ClientSkillSeriesLimit=IsNumeric(rawContents[54]) ? int.Parse(rawContents[54]):0; ClientActionLimit=IsNumeric(rawContents[54]) ? int.Parse(rawContents[54]):0; SkillOfSeries=IsNumeric(rawContents[55]) ? int.Parse(rawContents[55]):0; ClientSkillSeriesLimit=IsNumeric(rawContents[55]) ? int.Parse(rawContents[55]):0; ExpendMPRate=IsNumeric(rawContents[56]) ? int.Parse(rawContents[56]):0; SkillOfSeries=IsNumeric(rawContents[56]) ? int.Parse(rawContents[56]):0; ExAttr1=IsNumeric(rawContents[57]) ? int.Parse(rawContents[57]):0; ExpendMPRate=IsNumeric(rawContents[57]) ? int.Parse(rawContents[57]):0; ExAttr3=IsNumeric(rawContents[58]) ? int.Parse(rawContents[58]):0; ExAttr1=IsNumeric(rawContents[58]) ? int.Parse(rawContents[58]):0; ExAttr4=IsNumeric(rawContents[59]) ? int.Parse(rawContents[59]):0; ExAttr3=IsNumeric(rawContents[59]) ? int.Parse(rawContents[59]):0; ExAttr5=IsNumeric(rawContents[60]) ? int.Parse(rawContents[60]):0; ExAttr4=IsNumeric(rawContents[60]) ? int.Parse(rawContents[60]):0; WarnInfo=IsNumeric(rawContents[61]) ? int.Parse(rawContents[61]):0; ExAttr5=IsNumeric(rawContents[61]) ? int.Parse(rawContents[61]):0; CtrlActionID=IsNumeric(rawContents[62]) ? int.Parse(rawContents[62]):0; WarnInfo=IsNumeric(rawContents[62]) ? int.Parse(rawContents[62]):0; BuffEffectID=IsNumeric(rawContents[63]) ? int.Parse(rawContents[63]):0; CtrlActionID=IsNumeric(rawContents[63]) ? int.Parse(rawContents[63]):0; EffectName=IsNumeric(rawContents[64]) ? int.Parse(rawContents[64]):0; BuffEffectID=IsNumeric(rawContents[64]) ? int.Parse(rawContents[64]):0; IconName = rawContents[65].Trim(); EffectName=IsNumeric(rawContents[65]) ? int.Parse(rawContents[65]):0; SkillNameIcon = rawContents[66].Trim(); IconName = rawContents[66].Trim(); Description = rawContents[67].Trim(); SkillNameIcon = rawContents[67].Trim(); BuffDescription = rawContents[68].Trim(); Description = rawContents[68].Trim(); Skillsource = rawContents[69].Trim(); BuffDescription = rawContents[69].Trim(); Skillactmark=IsNumeric(rawContents[70]) ? int.Parse(rawContents[70]):0; Skillsource = rawContents[70].Trim(); BuffDisplay=IsNumeric(rawContents[71]) ? int.Parse(rawContents[71]):0; 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; //-------------------------------------------------------- // [Author]: 第二世界 // [ Date ]: Thursday, October 11, 2018 //-------------------------------------------------------- using System; using System.Collections; using System.Collections.Generic; using Snxxz.UI; public class DTC0311_tagDeleteSkill : DtcBasic { /** 主角删除技能 */ public class DTC0311_tagDeleteSkill : DtcBasic { /** 重写基类的数据包转逻辑处理 */ public override void Done(GameNetPackBasic vNetPack) { base.Done(vNetPack); // H0311_tagDeleteSkill vNetData = vNetPack as H0311_tagDeleteSkill; 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 UnityEngine; using System.Collections; /** 主角删除技能 */ public class H0311_tagDeleteSkill : GameNetPackBasic { //03 11 主角删除技能#tagDeleteSkill public int SkillID; 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, }; /** 物品加成类型 */