using UnityEngine; using System.Collections; using UnityEngine.UI; using System.Collections.Generic; using GCGame.Table; using Games.Item; // 是否可进阶判断 ?? public class AdvanceCanadvanceCtr { public static AdvanceCanadvanceCtr Instance; public static AdvanceCanadvanceCtr GetInstance() { if (Instance == null) Instance = new AdvanceCanadvanceCtr(); return Instance; } public bool IsAdvanceFuncOpen(int type) { switch (type) { case (int)AdvanceBase.AdvanceType.Ride: if (GameManager.gameManager.PlayerDataPool.m_AdvanceData.RideLevel == 0 || !CheckFuncOpen(8)) { return false; } break; case (int)AdvanceBase.AdvanceType.Piano: if (GameManager.gameManager.PlayerDataPool.m_AdvanceData.GodWeaponLevel == 0 || !CheckFuncOpen(9)) { return false; } break; case (int)AdvanceBase.AdvanceType.Wing: if (GameManager.gameManager.PlayerDataPool.m_AdvanceData.WingLevel == 0 || !CheckFuncOpen(10)) { return false; } break; case (int)AdvanceBase.AdvanceType.Qilinbi: if (GameManager.gameManager.PlayerDataPool.m_AdvanceData.WishLevel == 0 || !CheckFuncOpen(11)) { return false; } break; case (int)AdvanceBase.AdvanceType.Soul: if (GameManager.gameManager.PlayerDataPool.m_AdvanceData.SealLevel == 0 || !CheckFuncOpen(12)) { return false; } break; case (int)AdvanceBase.AdvanceType.Mask: if (GameManager.gameManager.PlayerDataPool.m_AdvanceData.MaskLevel == 0 || !CheckFuncOpen(13)) { return false; } break; case (int)AdvanceBase.AdvanceType.Huopao: if (GameManager.gameManager.PlayerDataPool.m_AdvanceData.CrownLevel == 0 || !CheckFuncOpen(14)) { return false; } break; } return true; } private bool CheckFuncOpen(int id) { Tab_FunctionOpen table = TableManager.GetFunctionOpenByID(id); if (table != null) { //return table.OpenServerDay <= GlobalData.OpenServerDays && table.OpenVipLv <= GameManager.gameManager.PlayerDataPool.VipCost // && table.OpenLevel <= GameManager.gameManager.PlayerDataPool.MainPlayerBaseAttr.Level; if (table.OpenServerDay > GlobalData.OpenServerDays) { var str = StrDictionary.GetClientDictionaryString("#{6450}", table.OpenServerDay, table.Name ); GUIData.AddNotifyData(str); return false; } if (table.OpenLevel > GameManager.gameManager.PlayerDataPool.MainPlayerBaseAttr.Level) { var str = StrDictionary.GetClientDictionaryString("#{6451}", table.OpenLevel.ToString(), table.Name ); GUIData.AddNotifyData(str); return false; } } return true; } //判断可以进阶的类型显示对应的Icon 背包更新的时候判断 public void JudgeShowCanAdvanceIcon() { if(canAdvanceItemDic.Count == 0) { GetCanAdvanceitemfunc(); //获取可以用来进阶的物品ID } GameItemContainer Container = GameManager.gameManager.PlayerDataPool.GetItemContainer(GameItemContainer.Type.TYPE_BACKPACK); var itemList = Container.GetList(); var backPack = GameManager.gameManager.PlayerDataPool.BackPack; List needShowCanAdvanceList = new List(); for (int index = 0; index < itemList.Count; index++) { GameItem item = itemList[index]; //根据ID获取道具对应的功能 if (item.DataID != -1 && canAdvanceItemDic.ContainsKey(item.DataID) && !IsCleanWish(canAdvanceItemDic[item.DataID].advanceType)) { //对应的进阶已经激活 if (GetAdvanceLevel(canAdvanceItemDic[item.DataID].advanceType) > 0) { if (IsItemEnough(canAdvanceItemDic[item.DataID].advanceType)) { needShowCanAdvanceList.Add((int)canAdvanceItemDic[item.DataID].advanceType); } } } } if (ExtraFunTipRoot.Instance()) { ExtraFunTipRoot.Instance().ShowOrHideTypeIcon(needShowCanAdvanceList); } } private Dictionary canAdvanceItemDic = new Dictionary(); public struct AdvanceItemFunc { public AdvanceBase.AdvanceType advanceType; //对应的进阶类型 public bool isClean; public AdvanceItemFunc(AdvanceBase.AdvanceType _AdvanceType, bool _isClean) { advanceType = _AdvanceType; isClean = _isClean; } } public bool IsCleanWish(AdvanceBase.AdvanceType type) { int advanceBaseId = ((int)type + 1) * 1000 + GetAdvanceLevel(type); var advanceBase = TableManager.GetAdvanceBaseByID(advanceBaseId, 0); if(advanceBase != null) { return advanceBase.DayDecWishValuePercent > 0 ? true : false; } return true; } //获取跟进阶有关的Item的信息 public void GetCanAdvanceitemfunc() { var baseTabDic = TableManager.GetAdvanceBase(); foreach(var tab in baseTabDic.Values) { if(!canAdvanceItemDic.ContainsKey(tab.AdvanceCostItemId) && tab.AdvanceCostItemId != -1) { AdvanceBase.AdvanceType advanceType = (AdvanceBase.AdvanceType)((tab.Id - tab.Level) / 1000 - 1); AdvanceItemFunc func = new AdvanceItemFunc(advanceType, tab.DayDecWishValuePercent > 0 ? true : false); canAdvanceItemDic.Add(tab.AdvanceCostItemId, func); } } } public bool IsItemEnough(AdvanceBase.AdvanceType type) { //是否会被清空 数量是否足够 int advanceBaseId = -1; if (GetAdvanceLevel(type) != -1) advanceBaseId = ((int)type + 1) * 1000 + GetAdvanceLevel(type) + 1; //消耗判断的是下一个ID的 Tab_AdvanceBase advanceBase = TableManager.GetAdvanceBaseByID(advanceBaseId, 0); if (advanceBase != null) { int needCostItemId = advanceBase.AdvanceCostItemId; return advanceBase.AdvanceCostItemNum <= GameManager.gameManager.PlayerDataPool.BackPack.GetItemCountByDataId(needCostItemId) ? true : false; } else { return false; } } public int GetAdvanceLevel(AdvanceBase.AdvanceType type) { switch(type) { case AdvanceBase.AdvanceType.Wing: return GameManager.gameManager.PlayerDataPool.m_AdvanceData.WingLevel; case AdvanceBase.AdvanceType.Ride: return GameManager.gameManager.PlayerDataPool.m_AdvanceData.RideLevel ; case AdvanceBase.AdvanceType.Piano: return GameManager.gameManager.PlayerDataPool.m_AdvanceData.GodWeaponLevel; case AdvanceBase.AdvanceType.Qilinbi: return GameManager.gameManager.PlayerDataPool.m_AdvanceData.WishLevel; case AdvanceBase.AdvanceType.Soul: return GameManager.gameManager.PlayerDataPool.m_AdvanceData.SealLevel; case AdvanceBase.AdvanceType.Mask: return GameManager.gameManager.PlayerDataPool.m_AdvanceData.MaskLevel; case AdvanceBase.AdvanceType.Huopao: return GameManager.gameManager.PlayerDataPool.m_AdvanceData.CrownLevel; default: return -1; } } } public class AdvanceInfo { public int baseId; // 对应表ID public int type = -1; // 进阶类型 public int level = 0; // 等级 public int wish = 0; // 祝福值 public int SoulDan = 0; // 进阶之魂使用数量 public int SpiritDan = 0; // 进阶之灵使用数量 public int combatValue = 0; // 总战力 public List skillId; // 技能id public int _RemainAdvanceItemCount; //剩余进阶道具数量 public AdvanceInfo() { } public AdvanceInfo(int baseId, int type, int level, int wish, int SoulDan, int SpiritDan, int combatValue, List skillList, int remainAdvanceItemCount) { this.baseId = baseId; this.type = type; this.level = level; this.wish = wish; this.SoulDan = SoulDan; this.SpiritDan = SpiritDan; this.combatValue = combatValue; _RemainAdvanceItemCount = remainAdvanceItemCount; skillId = new List(); skillId.AddRange(skillList); } public void AddSkill(int skillID) { Tab_AdvanceSkill tab_AdvanceSkill = TableManager.GetAdvanceSkillByID(skillID, 0); if (tab_AdvanceSkill == null) return; for(int i=0;i< skillId.Count;i++) { Tab_AdvanceSkill tabAdvanceSkill = TableManager.GetAdvanceSkillByID(skillId[i], 0); if (tabAdvanceSkill != null && tabAdvanceSkill.Type == tab_AdvanceSkill.Type && tabAdvanceSkill.Index == tab_AdvanceSkill.Index) { skillId[i] = skillID; } } } public void InitSkill(int advanceType) { if (skillId != null) skillId.Clear(); else skillId = new List(); Dictionary tab_AdvanceSkills = TableManager.GetAdvanceSkill(); foreach(var skill in tab_AdvanceSkills) { if(skill.Value.Type == advanceType && skill.Value.SkillLevel == 0 && GameManager.gameManager.PlayerDataPool.MainPlayerBaseAttr.Profession == skill.Value.NeedCareer) { skillId.Add(skill.Key); } } } } //进阶返回 public class AdvanceRetInfo { public int type; public int level; public int wish; public bool isCrit; //是否暴击 public int incWish; //增长的祝福值,大于0就是成功。 public int remainAdvanceItemCount; public AdvanceRetInfo() { } public AdvanceRetInfo(int type, int level, int wish, int isCrit, int incWish, int remainAdvanceItemCount) { this.type = type; this.level = level; this.wish = wish; this.isCrit = isCrit == 1 ? true : false; this.incWish = incWish; this.remainAdvanceItemCount = remainAdvanceItemCount; } } public class AdvanceBase : MonoBehaviour { public static AdvanceBase Instance; private void Awake() { Instance = this; } private void OnDestroy() { Instance = null; } protected int m_BaseId; // 当前对应的模型索引ID(用于读取对应的描述,需要自己计算) protected int m_level; // 当前对应的等级((进阶类型+1)*1000 + 等级 == curBaseId) protected int m_WishValue; // 当前祝福值 protected int m_InjectionSoulItemUsedCount; // 进阶之魂使用的数量 protected int m_InjectionSpiritualItemUsedCount; // 进阶之灵使用过的数量 protected int m_TotalCombatValue; // 总战力 protected int m_AdvanceGrage; // 当前进阶等阶 protected List m_SkillList = new List(); public List pagePanels; // 三个界面预设数组 public bool hasOpenUI = false; // 是否有打开的界面,信息、进阶、幻化的其中一个 public AdvanceType m_AdvanceType; // 当前进阶界面类型 public AdvanceMenuItemPanelCtr menuItemPanelCtr; // 右侧菜单栏 public AdvanceShowPanelCtr showPanel; // 信息界面 public AdvancePanelCtr advancePanel; // 进阶界面 public AdvanceFashionPanelCtr fashionPanel; // 幻化界面 public enum AdvanceType { Invalid = -1, Ride = 0, // 坐骑 Piano = 1, // 竖琴 Wing = 2, // 翅膀 Qilinbi = 3, //麒麟臂 Soul = 4, // 魂器 Mask = 5, // 面具 Huopao = 6, //火炮 } public enum ReqType { ADVANCE_OPTION = 1, // 进阶(参数1:goodId不是-1代表自动购买该道具, 参数2:需要购买的数量) CHANGE_USEID = 2, // 幻化(参数1:目标id,进阶的id为等级) REQ_INFO = 3, // 请求进阶信息(参数1:0进阶信息,1时装信息) USE_DAN = 4, // 使用进阶丹(参数1:0进阶之魂,1进阶之灵) SKILL_OPTION = 5, // 学习或升级技能(参数1:目标技能id) } public enum Advance_req_infotype { AdvanceInfo = 0, FashionInfo = 1, } // 菜单按钮点击回调 public void OnMenuItemClick(AdvanceMenuItemPanelCtr.MenuItemOptType type) { hasOpenUI = true; ShowMarkIcon(type); CG_REQ_ADVANCE req = (CG_REQ_ADVANCE)PacketDistributed.CreatePacket(MessageID.PACKET_CG_REQ_ADVANCE); req.SetOptionType((int)ReqType.REQ_INFO); req.SetType((int)m_AdvanceType); req.SetParam2(-1); switch (type) //请求对应页面的信息 { case AdvanceMenuItemPanelCtr.MenuItemOptType.Show: case AdvanceMenuItemPanelCtr.MenuItemOptType.Advance: //请求当前进阶信息 req.SetParam1((int)Advance_req_infotype.AdvanceInfo); break; case AdvanceMenuItemPanelCtr.MenuItemOptType.Fashion: //请求当前进阶信息 req.SetParam1((int)Advance_req_infotype.FashionInfo); break; } req.SendPacket(); } // 激活和目前MenuItem一致的Panel public void ShowMarkIcon(AdvanceMenuItemPanelCtr.MenuItemOptType type) { for (int index = 0; index < pagePanels.Count; index++) { pagePanels[index].gameObject.SetActive(index == (int)type ? true : false); } //显示对应的按钮高亮 menuItemPanelCtr.ShowMenuItemMaskBG(type); } // 请求所有进阶数据信息 public void ReqAllAdvanceInfo() { CG_REQ_ADVANCE req = (CG_REQ_ADVANCE)PacketDistributed.CreatePacket(MessageID.PACKET_CG_REQ_ADVANCE); req.SetOptionType((int)AdvanceBase.ReqType.REQ_INFO); req.SetType((int)m_AdvanceType); req.SetParam2(-1); req.SendPacket(); } // 进阶信息 public AdvanceInfo m_advanceInfo; // 接收返回的信息 public virtual void OnAdvanceInfoReceive(AdvanceInfo packet) { m_level = packet.level; m_WishValue = packet.wish; m_InjectionSoulItemUsedCount = packet.SoulDan; m_InjectionSpiritualItemUsedCount = packet.SpiritDan; m_TotalCombatValue = packet.combatValue; m_SkillList = new List(); m_SkillList.AddRange(packet.skillId); // 计算对应的BaseId(进阶类型+1)*1000 + 等级 == curBaseId m_BaseId = (packet.type + 1) * 1000 + packet.level; // 获取当前进阶的等级 Tab_AdvanceBase advanceBase = TableManager.GetAdvanceBaseByID(m_BaseId, 0); if (advanceBase != null) { m_AdvanceGrage = advanceBase.Grade; } m_advanceInfo = new AdvanceInfo(m_BaseId, packet.type, packet.level, packet.wish, packet.SoulDan, packet.SpiritDan, packet.combatValue, packet.skillId, packet._RemainAdvanceItemCount); SetCurAdvanceInfo(m_BaseId); InitAdvanceInfo(); UpdateRedPoint(); } private int lastBaseId = -1; // 上一次显示的阶级ID // 保存当前显示的进阶数据到玩家信息库 public void SetCurAdvanceInfo(int baseId) { if(lastBaseId == baseId) { return; } lastBaseId = baseId; Tab_AdvanceBase advanceBase = TableManager.GetAdvanceBaseByID(baseId, 0); if(advanceBase == null) { return; } int type = (advanceBase.Id - advanceBase.Level) / 1000 - 1; switch(type) { case (int)AdvanceType.Ride: GameManager.gameManager.PlayerDataPool.m_AdvanceData.RideGrade = advanceBase.Grade; GameManager.gameManager.PlayerDataPool.m_AdvanceData.RideLevel = advanceBase.Level; break; case (int)AdvanceType.Wing: GameManager.gameManager.PlayerDataPool.m_AdvanceData.WingGrade = advanceBase.Grade; GameManager.gameManager.PlayerDataPool.m_AdvanceData.WingLevel = advanceBase.Level; break; case (int)AdvanceType.Piano: GameManager.gameManager.PlayerDataPool.m_AdvanceData.GodWeaponGrade = advanceBase.Grade; GameManager.gameManager.PlayerDataPool.m_AdvanceData.GodWeaponLevel = advanceBase.Level; break; case (int)AdvanceType.Qilinbi: GameManager.gameManager.PlayerDataPool.m_AdvanceData.WishGrade = advanceBase.Grade; GameManager.gameManager.PlayerDataPool.m_AdvanceData.WishLevel = advanceBase.Level; break; case (int)AdvanceType.Soul: GameManager.gameManager.PlayerDataPool.m_AdvanceData.SealGrade = advanceBase.Grade; GameManager.gameManager.PlayerDataPool.m_AdvanceData.SealLevel = advanceBase.Level; break; case (int)AdvanceType.Mask: GameManager.gameManager.PlayerDataPool.m_AdvanceData.MaskGrade = advanceBase.Grade; GameManager.gameManager.PlayerDataPool.m_AdvanceData.MaskLevel = advanceBase.Level; break; case (int)AdvanceType.Huopao: GameManager.gameManager.PlayerDataPool.m_AdvanceData.CrownGrade = advanceBase.Grade; GameManager.gameManager.PlayerDataPool.m_AdvanceData.CrownLevel = advanceBase.Level; break; } //是否要显示可以进阶的Icon(刷新物品的时候也要显示) if (AdvanceCanadvanceCtr.GetInstance() != null) { AdvanceCanadvanceCtr.GetInstance().JudgeShowCanAdvanceIcon(); } } #region 红点更新相关 public void UpdateRedPoint() { UpdateShowRedPoint(); UpdateAdvanceRedPoint(); } public void UpdateShowRedPoint() { menuItemPanelCtr.UpdateRedPoint(0, showPanel.hasRedPoint()); } public void UpdateAdvanceRedPoint() { menuItemPanelCtr.UpdateRedPoint(1, advancePanel.hasRedPoint()); } /// /// 更新红点 /// /// 进阶类型 public static void UpdateRedPoint(AdvanceType adType) { if (IsCanActiveRedIcon(adType) && (AdvanceShowPanelCtr.HasRedPoint(adType) || AdvancePanelCtr.HasRedPoint(adType))) { RedTipPoint.SetAdvanceRedTipState(adType, true); } else { RedTipPoint.SetAdvanceRedTipState(adType, false); } } public static bool IsCanActiveRedIcon(AdvanceType type) { var functionOpenId = (int)type + 8; //0 --》 8 var functionOpenTab = TableManager.GetFunctionOpenByID(functionOpenId, 0); if (functionOpenTab == null) return false; if(functionOpenTab.OpenLevel != 0) { if (GameManager.gameManager.PlayerDataPool.MainPlayerBaseAttr.Level >= functionOpenTab.OpenLevel && (GameManager.gameManager.PlayerDataPool.FunctionOpenState.ContainsKey(functionOpenId) && GameManager.gameManager.PlayerDataPool.FunctionOpenState[functionOpenId])) { return true; } } else { if(Guide.Instance._FinishGuideID >= functionOpenTab.ShowGUIDId && (GameManager.gameManager.PlayerDataPool.FunctionOpenState.ContainsKey(functionOpenId) && GameManager.gameManager.PlayerDataPool.FunctionOpenState[functionOpenId])) { return true; } } return false; } public static void UpdateAllRedPoint() { for (int i = 0; i <= (int)AdvanceType.Huopao; ++i) { UpdateRedPoint((AdvanceType)i); } if (AdvanceMountPanelCtr.Instance && AdvanceMountPanelCtr.Instance.gameObject.activeInHierarchy) { AdvanceMountPanelCtr.Instance.showPanel.ShowEquipRedIcon(); AdvanceMountPanelCtr.Instance.showPanel.ShowInjectRedIcon(); AdvanceMountPanelCtr.Instance.UpdateRedPoint(); } } #endregion /// /// 初始化进阶界面数据:显示面板以及进阶面板 /// public void InitAdvanceInfo() { showPanel.InitShowPanel(m_advanceInfo); advancePanel.InitAdvancePanel(m_advanceInfo); } public void OnDisable() { hasOpenUI = false; UIManager.CloseUI(UIInfo.MoneyInfoPanel); } // 刷新进阶界面的数据 public virtual void RefreshAdvancePanel(AdvanceRetInfo info) { showPanel.RefreshShowInfo(info); advancePanel.RefreshAdvancePanelInfo(info); } public virtual void RefreshItemPanel() { advancePanel.itemPanel.RefreshOwnItemInfo(); } public virtual void RefreshOwnValue() { } public virtual void OnCloseBtnClick() { } }