JJBB/Assets/Project/Script/GUI/Advance/AdvanceBase.cs

599 lines
22 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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<int> needShowCanAdvanceList = new List<int>();
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<int, AdvanceItemFunc> canAdvanceItemDic = new Dictionary<int, AdvanceItemFunc>();
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<int> skillId; // 技能id
public int _RemainAdvanceItemCount; //剩余进阶道具数量
public AdvanceInfo() { }
public AdvanceInfo(int baseId, int type, int level, int wish, int SoulDan, int SpiritDan, int combatValue, List<int> 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<int>();
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<int>();
Dictionary<int, Tab_AdvanceSkill> 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<int> m_SkillList = new List<int>();
public List<GameObject> 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<int>();
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());
}
/// <summary>
/// 更新红点
/// </summary>
/// <param name="adType">进阶类型</param>
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
/// <summary>
/// 初始化进阶界面数据:显示面板以及进阶面板
/// </summary>
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() { }
}