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

599 lines
22 KiB
C#
Raw Normal View History

2024-08-23 15:49:34 +08:00
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);
2024-08-23 15:49:34 +08:00
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() { }
}