using System; using System.Collections.Generic; using System.Runtime.Remoting.Lifetime; using Games.GlobeDefine; using Games.LogicObj; using Games.SkillModle; using GCGame; using GCGame.Table; using Module.Log; using UnityEngine; using UnityEngine.UI; using System.Collections; using Games.Item; public class SkillRootLogic : MonoBehaviour { public static int MAX_SKILL_LEARN_LEVEL = 40; public static bool canDrag = false; private static SkillRootLogic m_Instance = null; public static SkillRootLogic Instance() { return m_Instance; } private void Awake() { _PreSkillNotEnough.SetActive(false); _PreSkillNotEnoughText.text = StrDictionary.GetClientDictionaryString("#{4762}"); } void OnEnable() { m_Instance = this; ShowTagPage(0); InitSkillInfos(); UIManager.ShowUI(UIInfo.MoneyInfoPanel); GUIData.delMoneyChanged += UpdateSkillCost; UpdateRedTips(); _DragIcon.gameObject.SetActive(false); } void OnDisable() { m_Instance = null; UIManager.CloseUI(UIInfo.MoneyInfoPanel); GUIData.delMoneyChanged -= UpdateSkillCost; } public void CloseWindow() { SaveSkillPage(); UIManager.CloseUI(UIInfo.SkillInfo); } public void OnShowPage(int page) { switch (page) { case 0: InitSkillInfos(); break; case 1: //InitChangeInfo(); ReqUnLockPageCount(); break; } } private void ReqUnLockPageCount() { ReqUnLockSkillCombine req = new ReqUnLockSkillCombine(); req._Flag = 1; req.SendMsg(); } public void UpdateSkillLvUpInfo() { LogModule.DebugLog("UpdateSkillLvUpInfo"); InitSkillItems(); OnSkillClassPage(_SkillClasses.SelectedSub1); UpdateSkillCost(); AdjustLvUpBtn(); } public void UpdateXiuwei() { _Xiuwei.text = StrDictionary.GetClientDictionaryString("#{2829}", GameManager.gameManager.PlayerDataPool.MainPlayerBaseAttr.Xiewei.ToString()); //_Xiuwei.text = StrDictionary.GetClientDictionaryString("#{10405}") + GameManager.gameManager.PlayerDataPool.MainPlayerBaseAttr.Xiewei.ToString(); } public void ShowHelpMessage(int messageID) { MessageHelpLogic.ShowHelpMessage(messageID); } public void ShowTagPage(int page) { if (page > 1) return; _TagPanel.ShowPage(page); } #region skill icons public UITagPanel _TagPanel; public UISubScollMenu _SkillClasses; public SkillRootPage _SkillInfoPage; private Dictionary> _MySkillInfos; public Dictionary> MySkillInfos { get { return _MySkillInfos; } } private SkillRootItem.SkillShowInfo _SelectedSkillShow; private void InitSkillInfos() { InitSkillItems(); _SkillClasses.Clear(); foreach (var skillClass in _MySkillInfos) { _SkillClasses.PushMenu(skillClass.Key); for (int i = 0; i < skillClass.Value.Count; ++i) { if (CanSkillItemLvUp(skillClass.Value[i])) { continue; } } } int idx = 0; if (UserConfigData._CurSkillPage != null) { idx = UserConfigData._CurSkillPage.PageIdx; } idx = Mathf.Max(0, idx); InitSkillPage(idx); _SkillClasses.ShowDefaultFirst(); _SkillInfoPage.SelectItem(_SelectedSkillShow); } /// /// 整理和包装玩家所有可学的技能信息,并在_MySkillInfos分类存储 /// /// private void InitSkillItems() { // 全部可学技能列表,为未分类 var totleList = new List(); // 分类过后的全部技能列表 _MySkillInfos = new Dictionary>(); var skillActives = TableManager.GetSkillActive().Values; var skillCount = 0; foreach (var skill in skillActives) { if (skill.Profession == Singleton.GetInstance().MainPlayer.Profession) skillCount++; } // 保存玩家已经学的技能 for(int i = 0; i < Singleton.GetInstance().MainPlayer.OwnSkillInfo.Length; ++i) { //if (skillInfo.SkillLevelTable == null) // continue; //潜规则,这两个位置默认存放试用技能 if (i == skillCount - 1 || i == skillCount - 2) continue; var skillInfo = Singleton.GetInstance().MainPlayer.OwnSkillInfo[i]; var showInfo = new SkillRootItem.SkillShowInfo(); showInfo.SkillExTab = skillInfo.SkillExTable; if (showInfo.SkillExTab == null) continue; showInfo.SkillBase = skillInfo.SkillBaseTable; Tab_SkillLevelUp skillnext = TableManager.GetSkillLevelUpByID(skillInfo.SkillExTable.NextSkillId, 0); showInfo.SkillLevelUp = skillnext; totleList.Add(showInfo); } // 获得所有可学技能列表 var learnList = TableManager.GetSkillLearn().Values; foreach (var tabAct in learnList) { if (tabAct.Profession != GameManager.gameManager.PlayerDataPool.MainPlayerBaseAttr.Profession) continue; // 获取每个技能相关信息 Tab_SkillEx skillEx = TableManager.GetSkillExByID(tabAct.SkillId, 0); Tab_SkillBase skillBase = TableManager.GetSkillBaseByID(skillEx.BaseId, 0); var skillInfo = totleList.Find((showInfo) => { if (showInfo.SkillBase.Id == skillEx.BaseId) { return true; } return false; }); if (skillInfo != null) { skillInfo.SkillLearn = tabAct; } else { SkillRootItem.SkillShowInfo showInfo = new SkillRootItem.SkillShowInfo(); showInfo.SkillLearn = tabAct; showInfo.SkillBase = skillBase; showInfo.SkillLevelUp = TableManager.GetSkillLevelUpByID(skillEx.SkillExID, 0); totleList.Add(showInfo); } } // 将已学和没学的技能,按照类型存入字典 foreach (var showInfo in totleList) { if (showInfo.SkillLearn == null) continue; if (_MySkillInfos.ContainsKey(showInfo.SkillLearn.Class)) { _MySkillInfos[showInfo.SkillLearn.Class].Add(showInfo); } else { List showList = new List(); showList.Add(showInfo); _MySkillInfos.Add(showInfo.SkillLearn.Class, showList); } } CanAnySkillLvUp(); } public void OnSkillClassPage(object paramObj) { LogModule.DebugLog("OnSkillClassPage:" + paramObj); string skillClass = paramObj as string; if (_MySkillInfos.ContainsKey(skillClass)) { _SkillInfoPage.InitContainer(_MySkillInfos[skillClass], OnSkillItemClick); if (_TagPanel.GetShowingPage() != 1) _SkillInfoPage.SelectItem(_SelectedSkillShow); } } public void OnShowSkillItem(int skillBaseId) { string pageName = ""; SkillRootItem.SkillShowInfo selectedItem = null; foreach (var skillPage in _MySkillInfos) { foreach (var skillShowInfo in skillPage.Value) { if (skillShowInfo.SkillBase.Id == skillBaseId) { pageName = skillPage.Key; selectedItem = skillShowInfo; } } } _SkillClasses.ShowMenu(pageName); //OnSkillClassPage(pageName); _SkillInfoPage.SelectItem(selectedItem); } public void OnSkillItemClick(object skillItem) { SkillRootItem.SkillShowInfo skillShowInfo = skillItem as SkillRootItem.SkillShowInfo; if (skillShowInfo == null) return; _SelectedSkillShow = skillShowInfo; if (_TagPanel.GetShowingPage() == 0) { InitSkillInfo(skillShowInfo); } else { if (skillShowInfo.SkillExTab != null) { var ownSkill = GameManager.gameManager.PlayerDataPool.GetOwnSkillInfo(skillShowInfo.SkillBase.Id); var newskillEx = TableManager.GetSkillExByID(skillShowInfo.SkillExTab.SkillExID + ownSkill.exSkillLevel, 0); SkillTooltipsLogic.ShowSkillToolTips(newskillEx.SkillExID, new Vector3(114, -35, 0)); } else { SkillTooltipsLogic.ShowSkillToolTips(skillShowInfo.SkillLearn.SkillId, new Vector3(114, -35, 0)); } } } #endregion #region skill lv UP public Text _SkillName; public Text _SkillCurDesc; public Text _SkillCurLevel; public Text _SkillNextDesc; public Text _LeardNeedLv; public Text _LeardNeedPreSkill; public Text _Xiuwei; public GameObject _NextLvPanel; public Image[] _DamageTypes; public UICurrencyItem _LvCost1; public UICurrencyItem _LvOwn1; public UICurrencyItem _LvCost2; public UICurrencyItem _LvOwn2; public GameObject _MoneyCostPanel; public GameObject _ItemCostPanel; public CommonItemMaterialSlot _ItemCostSlot; public GameObject _PreSkillNotEnough; public Text _PreSkillNotEnoughText; public GameObject _ResEnough; public GameObject _ResLack; public GameObject _ResLackMoney; public GameObject _ResLackEXP; public GameObject _LvUpPanel; public GameObject _LearnPanel; public GameObject _MaxLvPanel; public GameObject _LearnItemPanel; public GameObject _CantLearnPanel; public Button _BtnLearn; public Button _BtnLvUp; public Text _NextXiuwei; public CommonItemMaterialSlot _LearnItemSlot; private SkillRootItem.SkillShowInfo _SelectedSkill; private bool _IsCanLevelUpSkill = true; private long _ReplaceExpConsume; private long _ReplaceMoneyConsume; public void InitSkillInfo(SkillRootItem.SkillShowInfo skillShowInfo) { _SelectedSkill = skillShowInfo; _IsCanLevelUpSkill = true; _SkillName.text = skillShowInfo.SkillBase.Name; string[] skillDamageType = skillShowInfo.SkillLearn.SkillType.Split(';'); for (int i = 0; i < _DamageTypes.Length; ++i) { _DamageTypes[i].gameObject.SetActive(false); } for (int i = 0; i < skillDamageType.Length; ++i) { int index = int.Parse(skillDamageType[i]); _DamageTypes[index].gameObject.SetActive(true); } ShowLevelSkillCondition(skillShowInfo); ShowLevelSkillCost(skillShowInfo); AdjustLvUpBtn(); _Xiuwei.text = StrDictionary.GetClientDictionaryString("#{2829}", GameManager.gameManager.PlayerDataPool.MainPlayerBaseAttr.Xiewei.ToString()); } private void ShowLevelSkillCost(SkillRootItem.SkillShowInfo skillShowInfo) { OwnSkillData ownSkillData = GameManager.gameManager.PlayerDataPool.GetOwnSkillInfo(skillShowInfo.SkillBase.Id); if (skillShowInfo.SkillExTab == null) { _LvUpPanel.SetActive(false); _LearnPanel.SetActive(true); _MaxLvPanel.SetActive(false); _SkillCurDesc.gameObject.SetActive(false); _SkillCurLevel.text = "1"; if (skillShowInfo.SkillLevelUp.Level > GameManager.gameManager.PlayerDataPool.MainPlayerBaseAttr.Level || !skillShowInfo.IsNeedSkillLearned()) { _LearnItemPanel.SetActive(false); _CantLearnPanel.SetActive(true); _BtnLearn.interactable = false; } else { _LearnItemPanel.SetActive(true); _CantLearnPanel.SetActive(false); int needItem = -1; int needItemCount = -1; for (int i = 0; i < skillShowInfo.SkillLevelUp.getConsumIdCount(); ++i) { if (skillShowInfo.SkillLevelUp.GetConsumTypebyIndex(i) == (int)CONSUM_TYPE.ITEM) { needItem = skillShowInfo.SkillLevelUp.GetConsumIdbyIndex(i); needItemCount = skillShowInfo.SkillLevelUp.GetConsumValbyIndex(i); } } if (needItem > 0) { //Tab_CommonItem needItem = TableManager.GetCommonItemByID(skillShowInfo.SkillActive.NeedItem, 0); var itemCount = GameManager.gameManager.PlayerDataPool.BackPack.GetItemCountByDataId(needItem); _LearnItemSlot.InitMaterial(needItem, 1); if (itemCount > 0) { _BtnLearn.interactable = true; } else { _BtnLearn.interactable = false; } _ReplaceExpConsume = 0; _ReplaceMoneyConsume = 0; } } } else if (skillShowInfo.SkillLevelUp == null || skillShowInfo.SkillLevelUp.IsMaxLevel > 0) { _LvUpPanel.SetActive(false); _LearnPanel.SetActive(false); _MaxLvPanel.SetActive(true); _SkillCurDesc.gameObject.SetActive(true); _SkillCurDesc.text = ownSkillData.BaseExTableFinal.SkillDesc; _SkillCurLevel.text = ownSkillData.BaseExTableFinal.Level.ToString(); } else { _LvUpPanel.SetActive(true); _LearnPanel.SetActive(false); _MaxLvPanel.SetActive(false); _SkillCurDesc.gameObject.SetActive(true); _SkillCurDesc.text = ownSkillData.BaseExTableFinal.SkillDesc; _SkillCurLevel.text = ownSkillData.BaseExTableFinal.Level.ToString(); UpdateSkillCost(); } } public void UpdateSkillCost() { //if (!_LvCost1.gameObject.activeInHierarchy) // return; UpdateRedTips(); if (CONSUM_TYPE.ITEM == (CONSUM_TYPE)_SelectedSkill.SkillLevelUp.GetConsumTypebyIndex(0)) { _ReplaceMoneyConsume = 0; _ReplaceExpConsume = 0; _MoneyCostPanel.SetActive(false); _ItemCostPanel.SetActive(true); _ItemCostSlot.InitMaterial(_SelectedSkill.SkillLevelUp.GetConsumIdbyIndex(0), _SelectedSkill.SkillLevelUp.GetConsumValbyIndex(0)); if (_ItemCostSlot.IsMaterialEnough()) { if (alreadyLearnNeedSkill == true) { _PreSkillNotEnough.SetActive(false); } else { _PreSkillNotEnough.SetActive(true); } } else { _PreSkillNotEnough.SetActive(false); _IsCanLevelUpSkill &= false; } } else { _MoneyCostPanel.SetActive(true); _ItemCostPanel.SetActive(false); //通过类型和ID返回角色自身已经拥有的数量 long ownValue = GameManager.gameManager.PlayerDataPool.MainPlayerBaseAttr.SkillExp; if (ownValue > 0) { _LvCost1.ShowCurrency(_SelectedSkill.SkillLevelUp.GetConsumTypebyIndex(0), _SelectedSkill.SkillLevelUp.GetConsumIdbyIndex(0), _SelectedSkill.SkillLevelUp.GetConsumValbyIndex(0)); if (ownValue < _SelectedSkill.SkillLevelUp.GetConsumValbyIndex(0)) { _LvOwn1.SetColor(""); } _LvOwn1.ShowCurrency(_SelectedSkill.SkillLevelUp.GetConsumTypebyIndex(0), _SelectedSkill.SkillLevelUp.GetConsumIdbyIndex(0), ownValue); } else { _LvCost1.ShowReplaceOwnCurrency(_SelectedSkill.SkillLevelUp.GetConsumTypebyIndex(0), _SelectedSkill.SkillLevelUp.GetConsumIdbyIndex(0), _SelectedSkill.SkillLevelUp.GetConsumValbyIndex(0)); _LvOwn1.ShowReplaceOwnCurrencyCompare(_SelectedSkill.SkillLevelUp.GetConsumTypebyIndex(0), _SelectedSkill.SkillLevelUp.GetConsumIdbyIndex(0), _SelectedSkill.SkillLevelUp.GetConsumValbyIndex(0)); } long ownValue2 = GameManager.gameManager.PlayerDataPool.GetLongPropty(_SelectedSkill.SkillLevelUp.GetConsumTypebyIndex(1), _SelectedSkill.SkillLevelUp.GetConsumIdbyIndex(1)); if (ownValue2 > 0) { _LvCost2.ShowCurrency(_SelectedSkill.SkillLevelUp.GetConsumTypebyIndex(1), _SelectedSkill.SkillLevelUp.GetConsumIdbyIndex(1), _SelectedSkill.SkillLevelUp.GetConsumValbyIndex(1)); if (ownValue2 < _SelectedSkill.SkillLevelUp.GetConsumValbyIndex(1)) { _LvOwn2.SetColor(""); } _LvOwn2.ShowCurrency(_SelectedSkill.SkillLevelUp.GetConsumTypebyIndex(1), _SelectedSkill.SkillLevelUp.GetConsumIdbyIndex(1), ownValue2); } else { _LvCost2.ShowReplaceOwnCurrency(_SelectedSkill.SkillLevelUp.GetConsumTypebyIndex(1), _SelectedSkill.SkillLevelUp.GetConsumIdbyIndex(1), _SelectedSkill.SkillLevelUp.GetConsumValbyIndex(1)); _LvOwn2.ShowReplaceOwnCurrencyCompare(_SelectedSkill.SkillLevelUp.GetConsumTypebyIndex(1), _SelectedSkill.SkillLevelUp.GetConsumIdbyIndex(1), _SelectedSkill.SkillLevelUp.GetConsumValbyIndex(1)); } _ReplaceExpConsume = (ownValue - _SelectedSkill.SkillLevelUp.GetConsumValbyIndex(0)); _ReplaceMoneyConsume = (ownValue2 - _SelectedSkill.SkillLevelUp.GetConsumValbyIndex(1)); bool isExpEnough = GameManager.gameManager.PlayerDataPool.MainPlayerBaseAttr.Exp + _ReplaceExpConsume >= 0; bool isMoneyEnough = GameManager.gameManager.PlayerDataPool.Money.GetMoneyByType(MONEYTYPE.MONEYTYPE_COIN) + _ReplaceMoneyConsume >= 0; // 替代后不满足 if (!isExpEnough || !isMoneyEnough) { _IsCanLevelUpSkill &= false; //是否可以升级技能 默认为true _ResLack.SetActive(true); _ResEnough.SetActive(false); _ResLackMoney.SetActive(false); _ResLackEXP.SetActive(false); _PreSkillNotEnough.SetActive(false); } else { if (!_IsCanLevelUpSkill && alreadyLearnNeedSkill == false) { _PreSkillNotEnough.SetActive(true); _ResLack.SetActive(false); _ResEnough.SetActive(false); _ResLackMoney.SetActive(false); _ResLackEXP.SetActive(false); } else { _PreSkillNotEnough.SetActive(false); //两者都消耗 if ((_ReplaceExpConsume < 0 && isExpEnough) && (_ReplaceMoneyConsume < 0 && isMoneyEnough)) { _ResLack.SetActive(false); _ResEnough.SetActive(true); _ResLackMoney.SetActive(false); _ResLackEXP.SetActive(false); } //只消耗银票 else if (_ReplaceMoneyConsume < 0 && isMoneyEnough) { _ResLack.SetActive(false); _ResEnough.SetActive(false); _ResLackMoney.SetActive(true); _ResLackEXP.SetActive(false); } //只消耗经验 else if (_ReplaceExpConsume < 0 && isExpEnough) { _ResLack.SetActive(false); _ResEnough.SetActive(false); _ResLackMoney.SetActive(false); _ResLackEXP.SetActive(true); } //不替代就满足 else if (_ReplaceExpConsume >= 0 && _ReplaceMoneyConsume >= 0) { _ResLack.SetActive(false); _ResEnough.SetActive(false); _ResLackMoney.SetActive(false); _ResLackEXP.SetActive(false); } } } } AdjustLvUpBtn(); } private bool alreadyLearnNeedSkill = false; private void ShowLevelSkillCondition(SkillRootItem.SkillShowInfo skillShowInfo) { int exLv = 0; OwnSkillData ownSkill = GameManager.gameManager.PlayerDataPool.GetOwnSkillInfo(skillShowInfo.SkillBase.Id); if(ownSkill != null) { exLv = ownSkill.exSkillLevel; } if(skillShowInfo.SkillLevelUp == null) { return; } var levelUpNextSkill = TableManager.GetSkillExByID(skillShowInfo.SkillLevelUp.Id + exLv, 0); if (levelUpNextSkill == null) return; if (levelUpNextSkill != null) { _SkillNextDesc.text = levelUpNextSkill.SkillDesc; _NextXiuwei.text = StrDictionary.GetClientDictionaryString("#{2829}", Utils.GetColorEnableGreen()+ levelUpNextSkill.CombatValue.ToString() + ""); } if (skillShowInfo.SkillLevelUp.IsMaxLevel > 0) { _NextLvPanel.SetActive(false); _SkillNextDesc.gameObject.SetActive(false); } else { _NextLvPanel.SetActive(true); _SkillNextDesc.gameObject.SetActive(true); } if (skillShowInfo.SkillLevelUp.Level > GameManager.gameManager.PlayerDataPool.MainPlayerBaseAttr.Level) { _LeardNeedLv.text = Utils.GetColorDisableRed() + skillShowInfo.SkillLevelUp.Level.ToString() + ""; _IsCanLevelUpSkill &= false; } else { _LeardNeedLv.text = Utils.GetColorEnableGreen() + skillShowInfo.SkillLevelUp.Level.ToString() + ""; } var needSkill = skillShowInfo.GetNeedSkillLvUp(); if (needSkill == null) { _LeardNeedPreSkill.gameObject.SetActive(false); alreadyLearnNeedSkill = true; } else { _LeardNeedPreSkill.gameObject.SetActive(true); alreadyLearnNeedSkill = false; var skillBase = TableManager.GetSkillBaseByID(needSkill.BaseId, 0); foreach (var skillInfo in Singleton.GetInstance().MainPlayer.OwnSkillInfo) { var skillEx = skillInfo.SkillExTable; if (skillEx == null) continue; if (skillEx.BaseId == needSkill.BaseId && skillEx.Level >= needSkill.Level) { alreadyLearnNeedSkill = true; } } string skillName = skillBase.Name + needSkill.Level + StrDictionary.GetClientDictionaryString("#{5120}"); if (!alreadyLearnNeedSkill) { _LeardNeedPreSkill.text = Utils.GetColorDisableRed() + skillName + ""; _IsCanLevelUpSkill = false; } else { _LeardNeedPreSkill.text = Utils.GetColorEnableGreen() + skillName + ""; } } } void OnLvUpClick() { string tips = ""; if ((GameManager.gameManager.PlayerDataPool.MainPlayerBaseAttr.SkillExp != 0 && _ReplaceExpConsume < 0 ) && (GameManager.gameManager.PlayerDataPool.Money.GetMoney_CoinBind() != 0 && _ReplaceMoneyConsume < 0)) { tips = StrDictionary.GetClientDictionaryString("#{4744}", -_ReplaceExpConsume, -_ReplaceMoneyConsume); } else if (GameManager.gameManager.PlayerDataPool.MainPlayerBaseAttr.SkillExp != 0 && _ReplaceExpConsume < 0) { tips = StrDictionary.GetClientDictionaryString("#{4745}", -_ReplaceExpConsume); } else if (GameManager.gameManager.PlayerDataPool.Money.GetMoney_CoinBind() != 0 && _ReplaceMoneyConsume < 0) { tips = StrDictionary.GetClientDictionaryString("#{4746}", -_ReplaceMoneyConsume); } else { OnLvUpClickOK(); return; } MessageBoxLogic.OpenOKCancelBox(tips, "", OnLvUpClickOK); } void OnLvUpClickOK() { _ReplaceExpConsume = 0; _ReplaceMoneyConsume = 0; if (_IsCanLevelUpSkill) { DoLevelUp(); //升级完毕判断下一级是否能升级 } //if (_SelectedSkill.SkillLevelUp.SkillLevel == 1) //{ // GlobalEffectMgr.PlayerNormalEffect("TX_ui_jihuochenggong"); //} //else //{ // GlobalEffectMgr.PlayerNormalEffect("TX_ui_shenjichenggong"); //} } public void LevelUp() { if (_SelectedSkill.SkillLevelUp.SkillLevel == 1) { GlobalEffectMgr.PlayerNormalEffect("TX_ui_jihuochenggong"); } else { GlobalEffectMgr.PlayerNormalEffect("TX_ui_shenjichenggong"); } AdjustLvUpBtn(); } void AdjustLvUpBtn() { if (_IsCanLevelUpSkill) { _BtnLvUp.interactable = true; } else { _BtnLvUp.interactable = false; } } void DoLevelUp() { //发包 CG_ASK_LEVELUPSKILL packet = (CG_ASK_LEVELUPSKILL)PacketDistributed.CreatePacket(MessageID.PACKET_CG_ASK_LEVELUPSKILL); packet.SetSkillId(_SelectedSkill.SkillLevelUp.Id); packet.SendPacket(); } public void OnHelpClick() { } #endregion #region Skill Use public const string TALENT_PAGE_LOCK_STR = "Locked"; public UISubScollMenu _TalentPageContainer; // 技能页菜单容器 public UIContainerBase _TalentContainer; public Text _TalentPageName; public SkillBarItem[] _SkillBarItems; public GameObject _PageOpenPanel; public GameObject _PageLockPanel; public UIContainerBase _PageConditionContainer; public Image _DragIcon; public int _DragSkillOwnIdx { get; set; } public SkillBarItem _DragSkillBar { get; set; } private List _TalentPageStrs; public UserConfigData.SkillSavePage _CurSkillPage; // 显示技能组合面板 public void InitChangeInfo(int pageCount) { // 显示技能组合面板左侧菜单 if (_TalentPageStrs == null) { _TalentPageStrs = new List(); _TalentPageStrs.Add(StrDictionary.GetClientDictionaryString("#{4720}")); _TalentPageStrs.Add(StrDictionary.GetClientDictionaryString("#{4721}")); _TalentPageStrs.Add(StrDictionary.GetClientDictionaryString("#{4722}")); _TalentPageStrs.Add(StrDictionary.GetClientDictionaryString("#{4723}")); _TalentPageStrs.Add(StrDictionary.GetClientDictionaryString("#{4724}")); } // 获取开启技能页数 //int pageCount = GetActiveTalentPageCount(); _TalentPageContainer.Clear(); // 先显示已被使用的页面 for (int i = 0; i < pageCount; ++i) { _TalentPageContainer.PushMenu(_TalentPageStrs[i]); } // 未被开启的给与提示 for (int i = pageCount; i < _TalentPageStrs.Count; ++i) { _TalentPageContainer.PushMenu(TALENT_PAGE_LOCK_STR); } UserConfigData.LoadAllSkillPage(GameManager.gameManager.PlayerDataPool.MainPlayerBaseAttr.Guid.ToString()); if (UserConfigData._CurSkillPage == null) { _TalentPageContainer.ShowDefaultFirst(); } else { _TalentPageContainer.ShowMenu(_TalentPageStrs[UserConfigData._CurSkillPage.PageIdx]); } //OnTalentPageSelect(_TalentPageStrs[0]); } // 选中技能组合页面按钮回调 public void OnTalentPageSelect(object selectPage) { string pageName = selectPage as string; // 显示被锁界面 if (pageName == TALENT_PAGE_LOCK_STR) { _PageOpenPanel.SetActive(false); _PageLockPanel.SetActive(true); _PageConditionContainer.InitContentItem(TableManager.GetSkillBoxOpen().Values); } else { // 更具页面索引,显示玩家具体组合页面的技能 _PageOpenPanel.SetActive(true); _PageLockPanel.SetActive(false); int idx = _TalentPageStrs.IndexOf(pageName); InitSkillPage(idx); // 显示技能图标 for (int i = 0; i < _CurSkillPage.SkillIdxs.Length; ++i) { if (i < _SkillBarItems.Length) { _SkillBarItems[i].InitSkillBar(_CurSkillPage.SkillIdxs[i], i); } } UserConfigData._CurSkillPage = _CurSkillPage; } } public void InitSkillPage(int idx) { if (UserConfigData._SkillPages == null) return; if (_CurSkillPage != null) { _CurSkillPage.IsUsing = 0; _CurSkillPage = null; } foreach (var skillPage in UserConfigData._SkillPages) { if (skillPage.RoleGuid == GameManager.gameManager.PlayerDataPool.MainPlayerBaseAttr.Guid && skillPage.PageIdx == idx) { _CurSkillPage = skillPage; _CurSkillPage.IsUsing = 1; break; } } // 当玩家没有使用任一种组合,制定一套基础的代替 if (_CurSkillPage == null) { _TalentPageName.text = StrDictionary.GetClientDictionaryString("#{4726}"); _CurSkillPage = new UserConfigData.SkillSavePage(); _CurSkillPage.RoleGuid = GameManager.gameManager.PlayerDataPool.MainPlayerBaseAttr.Guid; _CurSkillPage.PageIdx = idx; _CurSkillPage.PageName = _TalentPageName.text; _CurSkillPage.IsUsing = 1; _CurSkillPage.SkillIdxs = new int[UserConfigData.SkillSavePage.PAGE_SKILL_NUM] { -1,-1,-1,-1 }; var mainPlayer = Singleton.GetInstance().MainPlayer; LogModule.WarningLog("OnTalentPageSelect : " + Time.realtimeSinceStartup); for (int _skillIndex = 0; _skillIndex < mainPlayer.OwnSkillInfo.Length; _skillIndex++) { if (mainPlayer.OwnSkillInfo[_skillIndex].SkillBaseTable == null) continue; if ((mainPlayer.OwnSkillInfo[_skillIndex].SkillBaseTable.SkillClass & (int)SKILLCLASS.SIMPLEATTACK) != 0) continue; if ((mainPlayer.OwnSkillInfo[_skillIndex].SkillBaseTable.SkillClass & (int)SKILLCLASS.AUTOREPEAT) == 0 && (mainPlayer.OwnSkillInfo[_skillIndex].SkillBaseTable.SkillClass & (int)SKILLCLASS.XP) == 0) { for (int _skillBarIndex = 0; _skillBarIndex < _CurSkillPage.SkillIdxs.Length; _skillBarIndex++) { if (_CurSkillPage.SkillIdxs[_skillBarIndex] < 0) { _CurSkillPage.SkillIdxs[_skillBarIndex] = _skillIndex; break; } } } } UserConfigData._SkillPages.Add(_CurSkillPage); } else { _TalentPageName.text = _CurSkillPage.PageName; } _SkillInfoPage.RefreshEquipedTag(); } public void OnTalentPageNameChange() { InputBoxLogic.ShowInputBoxStatic(StrDictionary.GetClientDictionaryString("#{4725}"), "", OnTalentPageNameChangeReturn, 7); } private void OnTalentPageNameChangeReturn(string changeName) { if (string.IsNullOrEmpty(changeName)) return; _TalentPageName.text = changeName; _CurSkillPage.PageName = changeName; } private void SaveSkillPage() { if(_CurSkillPage!=null) { UserConfigData._CurSkillPage = _CurSkillPage; UserConfigData.SaveSkillPages(); } if(SkillBarLogic.Instance() != null) SkillBarLogic.Instance().RefreshSkillBarInfo(); } public bool CanDragSkillItem() { if (_TagPanel.GetShowingPage() == 1) return true; return false; } public void SetDragSkillIdx(SkillRootItem.SkillShowInfo showInfo) { if (showInfo == null || showInfo.SkillExTab == null) { _DragSkillOwnIdx = -1; return; } for (int i = 0; i < Singleton.GetInstance().MainPlayer.OwnSkillInfo.Length; ++i) { if (showInfo.SkillExTab.SkillExID == Singleton.GetInstance().MainPlayer.OwnSkillInfo[i].SkillId) { _DragSkillOwnIdx = i; return; } } _DragSkillOwnIdx = -1; } public void ChangeSkillBar(int skillItemIdx) { if (_DragSkillOwnIdx < 0) return; if (skillItemIdx >= _CurSkillPage.SkillIdxs.Length) return; //SYK修改 for (int index = 0; index < _CurSkillPage.SkillIdxs.Length; index++) { //技能已经存在的情况 if (_CurSkillPage.SkillIdxs[index] == _DragSkillOwnIdx) { //index 技能存在位置下标 //目标位置ID与拖拽过来的技能ID相同 if (_CurSkillPage.SkillIdxs[skillItemIdx] == _DragSkillOwnIdx) { //不做操作 直接返回 return; } else { //目标位置技能ID置为拖拽过来的ID _CurSkillPage.SkillIdxs[skillItemIdx] = _DragSkillOwnIdx; //将存在技能的ID置为-1 _CurSkillPage.SkillIdxs[index] = -1; } //刷新界面 for (int i = 0; i < _CurSkillPage.SkillIdxs.Length; ++i) { if (i < _SkillBarItems.Length) { _SkillBarItems[index].InitSkillBar(_CurSkillPage.SkillIdxs[index], index); } } return; } } _CurSkillPage.SkillIdxs[skillItemIdx] = _DragSkillOwnIdx; _SkillInfoPage.RefreshEquipedTag(); } public void ExChangeSkillBar(int skillItemIdx) { if (_DragSkillOwnIdx < 0) return; if (skillItemIdx >= _CurSkillPage.SkillIdxs.Length) return; if (_DragSkillBar != null) { int tempIdx = _CurSkillPage.SkillIdxs[skillItemIdx]; _CurSkillPage.SkillIdxs[skillItemIdx] = _CurSkillPage.SkillIdxs[_DragSkillBar.SkillItemIdx]; _CurSkillPage.SkillIdxs[_DragSkillBar.SkillItemIdx] = tempIdx; } } public void ClearSkillBar(int skillItemIdx) { if (skillItemIdx >= _CurSkillPage.SkillIdxs.Length) return; _CurSkillPage.SkillIdxs[skillItemIdx] = -1; _SkillInfoPage.RefreshEquipedTag(); } #endregion #region 红点 public GameObject RedTips; public void UpdateRedTips() { if (CanAnySkillLvUp()) { RedTips.SetActive(true); foreach (var subItem in _SkillClasses.SubBtns) { ((UISkillSubMenu)subItem.Key).UpdateTips(); } foreach (var skillItem in _SkillInfoPage.SkillItems) { skillItem.UpdateRedTips(); } } else { RedTips.SetActive(false); foreach (var subItem in _SkillClasses.SubBtns) { ((UISkillSubMenu)subItem.Key).UpdateTips(); } foreach (var skillItem in _SkillInfoPage.SkillItems) { skillItem.UpdateRedTips(); } } } private static List totleList = null; public static List GetAllSkillList() { // 全部可学技能列表,为未分类 totleList = new List(); // 保存玩家已经学的技能 var _MainPlayerOwnSkillInfo = Singleton.GetInstance().MainPlayer.OwnSkillInfo; for (int index = 0; index < _MainPlayerOwnSkillInfo.Length; index++) { var showInfo = new SkillRootItem.SkillShowInfo(); showInfo.SkillExTab = _MainPlayerOwnSkillInfo[index].SkillExTable; if (showInfo.SkillExTab == null) continue; showInfo.SkillBase = _MainPlayerOwnSkillInfo[index].SkillBaseTable; Tab_SkillLevelUp skillnext = TableManager.GetSkillLevelUpByID(_MainPlayerOwnSkillInfo[index].SkillExTable.NextSkillId, 0); showInfo.SkillLevelUp = skillnext; if (!IsSimpleAttack(skillnext)) //脑残普攻 totleList.Add(showInfo); } // 获得所有可学技能列表 var learnList = TableManager.GetSkillLearn().Values; foreach (var tabAct in learnList) { if (tabAct.Profession != GameManager.gameManager.PlayerDataPool.MainPlayerBaseAttr.Profession) continue; // 获取每个技能相关信息 Tab_SkillEx skillEx = TableManager.GetSkillExByID(tabAct.SkillId, 0); Tab_SkillBase skillBase = TableManager.GetSkillBaseByID(skillEx.BaseId, 0); var skillInfo = totleList.Find((showInfo) => { if (showInfo.SkillBase.Id == skillEx.BaseId) { return true; } return false; }); if (skillInfo != null) { skillInfo.SkillLearn = tabAct; } else { SkillRootItem.SkillShowInfo showInfo = new SkillRootItem.SkillShowInfo(); showInfo.SkillLearn = tabAct; showInfo.SkillBase = skillBase; showInfo.SkillLevelUp = TableManager.GetSkillLevelUpByID(skillEx.SkillExID, 0); totleList.Add(showInfo); } } return totleList; } public static bool CanAnySkillLvUp() { //Debug.LogError("Count : " + GetAllSkillList().Count); for(int i = 0; i < GetAllSkillList().Count; i++) { var skillInfo = SkillRootLogic.totleList[i]; var _IsOwnSkill = false; var skillnext = skillInfo.SkillLevelUp; if (skillnext == null) continue; if (IsSimpleAttack(skillnext)) continue; if (!IsAlreadyHaveNeedSkill(skillnext, skillInfo.SkillBase)) continue; if (skillnext == null) continue; if (skillnext.IsMaxLevel > 0) continue; if (skillnext.Level > GameManager.gameManager.PlayerDataPool.MainPlayerBaseAttr.Level) continue; var isItemEnough = true; var isMoneyEnough = true; var isExpEnough = true; for (int index = 0; index < skillnext.getConsumTypeCount(); index++) { var type = skillnext.GetConsumTypebyIndex(index); if (type != -1) { switch (type) { case (int)CONSUM_TYPE.PROPVAL: { if (GameManager.gameManager.PlayerDataPool.MainPlayerBaseAttr.SkillExp < skillnext.GetConsumValbyIndex(0)) isExpEnough = false; } break; case (int)CONSUM_TYPE.PROPPER: { //没配 } break; case (int)CONSUM_TYPE.ITEM: { if (GameManager.gameManager.PlayerDataPool.BackPack.GetItemCountByDataId(skillnext.GetConsumIdbyIndex(index)) < skillnext.GetConsumValbyIndex(index)) isItemEnough = false; } break; case (int)CONSUM_TYPE.MONEY: { if (GameManager.gameManager.PlayerDataPool.Money.GetMoneyByType(MONEYTYPE.MONEYTYPE_COIN_BIND) < skillnext.GetConsumValbyIndex(1)) isMoneyEnough = false; } break; } } } if (isExpEnough && isItemEnough && isMoneyEnough) { UpdateFunctionTips(true); return true; } } UpdateFunctionTips(false); return false; } static bool IsSimpleAttack(Tab_SkillLevelUp skillTab) { if (skillTab == null) return false; if (skillTab.IsMaxLevel == 1) return false; for(int index = 0; index < skillTab.getConsumValCount(); index++) { if (skillTab.GetConsumValbyIndex(index) != -1) return false; } return true; } public static void UpdateFunctionTips(bool state) { RedTipPoint.RedPointStateChange(RedTipPoint.PointType.Skill, state); } public static bool IsAlreadyHaveNeedSkill(Tab_SkillLevelUp skillNext, Tab_SkillBase skillBase) { var alreadyHaveSkill = true; var isOwnSkill = false; for(int index = 0; index < skillNext.getNeedSkillIdCount(); index++) { if(skillNext.GetNeedSkillIdbyIndex(index) != -1) { var needSkill = TableManager.GetSkillExByID(skillNext.GetNeedSkillIdbyIndex(index), 0); if (needSkill == null) continue; if (needSkill.BaseId != skillBase.Id) //2级需要判断有1级,这个是不用判断的,必然有1级技能已经学会才能升级为2级 { foreach (var ownSkill in Singleton.GetInstance().MainPlayer.OwnSkillInfo) { var skillEx = ownSkill.SkillExTable; if (skillEx == null) continue; if (needSkill.BaseId == skillEx.BaseId) isOwnSkill = true; if (needSkill.BaseId == skillEx.BaseId && skillEx.Level < needSkill.Level) { alreadyHaveSkill = false; break; } } if (!isOwnSkill) return false; } } } return alreadyHaveSkill; } public static bool CanSkillItemLvUp(SkillRootItem.SkillShowInfo skillShowInfo) { Tab_SkillLevelUp skillnext = skillShowInfo.SkillLevelUp; if (skillnext == null) return false; if (skillnext.IsMaxLevel > 0) return false; if (IsSimpleAttack(skillnext)) return false; if (!IsAlreadyHaveNeedSkill(skillnext, skillShowInfo.SkillBase)) return false; if (skillnext.Level > GameManager.gameManager.PlayerDataPool.MainPlayerBaseAttr.Level) return false; for (int index = 0; index < skillnext.getConsumTypeCount(); index++) { var type = skillnext.GetConsumTypebyIndex(index); if (type != -1) { switch (type) { case (int)CONSUM_TYPE.PROPVAL: { if (GameManager.gameManager.PlayerDataPool.MainPlayerBaseAttr.SkillExp < skillnext.GetConsumValbyIndex(0)) return false; } break; case (int)CONSUM_TYPE.PROPPER: { //没配 } break; case (int)CONSUM_TYPE.ITEM: { if (GameManager.gameManager.PlayerDataPool.BackPack.GetItemCountByDataId(skillnext.GetConsumIdbyIndex(index)) < skillnext.GetConsumValbyIndex(index)) return false; } break; case (int)CONSUM_TYPE.MONEY: { if (GameManager.gameManager.PlayerDataPool.Money.GetMoneyByType(MONEYTYPE.MONEYTYPE_COIN_BIND) < skillnext.GetConsumValbyIndex(index)) return false; } break; } } } return true; } #endregion }