using System.Collections;
|
using System.Collections.Generic;
|
using UnityEngine;
|
using System;
|
|
using vnxbqy.UI;
|
|
namespace vnxbqy.UI
|
{
|
|
public class PersonalBossModel : Model
|
{
|
public const int PERSONALBOSS_MAPID = 31240;
|
public const int PERSONAL_REDPOINTID = 76003;
|
|
public Redpoint personalRedpoint = new Redpoint(FindPreciousModel.FINDPRECIOUS_REDPOINTID, PERSONAL_REDPOINTID);
|
Redpoint mainBossRedpoint = new Redpoint(FindPreciousModel.FINDPRECIOUS_REDPOINTIDEX);
|
|
int m_SelectedBoss = 0;
|
public int selectedBoss {
|
get {
|
return this.m_SelectedBoss;
|
}
|
set {
|
if (this.m_SelectedBoss != value)
|
{
|
this.m_SelectedBoss = value;
|
if (bossSelectedEvent != null)
|
{
|
bossSelectedEvent(value);
|
}
|
}
|
}
|
}
|
|
public event Action<int> bossSelectedEvent;
|
List<int> sortedBossIds = new List<int>();
|
Dictionary<int, PersonalBossData> personalBosses = new Dictionary<int, PersonalBossData>();
|
int dungeonTicket = 0;
|
|
FindPreciousModel findPreciousModel { get { return ModelCenter.Instance.GetModel<FindPreciousModel>(); } }
|
PackModel playerPack { get { return ModelCenter.Instance.GetModel<PackModel>(); } }
|
DungeonModel dungeonModel { get { return ModelCenter.Instance.GetModel<DungeonModel>(); } }
|
|
|
public int WipeOutLV = 100; //XX级后可S级扫荡
|
public int maxBossTimes = 0;
|
public override void Init()
|
{
|
ParseConfig();
|
//playerPack.refreshItemCountEvent += RefreshItemCount;
|
PlayerDatas.Instance.playerDataRefreshEvent += OnPlayerDataChange;
|
dungeonModel.dungeonRecordChangeEvent += OnDungeonRecordChange;
|
}
|
|
public override void UnInit()
|
{
|
//playerPack.refreshItemCountEvent -= RefreshItemCount;
|
PlayerDatas.Instance.playerDataRefreshEvent -= OnPlayerDataChange;
|
dungeonModel.dungeonRecordChangeEvent -= OnDungeonRecordChange;
|
}
|
|
public void RequestSetDungeonAction()
|
{
|
var sendInfo = new CA508_tagCMDoFBAction();
|
sendInfo.ActionType = 0;
|
sendInfo.ActionInfo = (uint)selectedBoss;
|
GameNetSystem.Instance.SendInfo(sendInfo);
|
}
|
|
public bool TryGetBossData(int _bossId, out PersonalBossData _data)
|
{
|
return personalBosses.TryGetValue(_bossId, out _data);
|
}
|
|
public List<int> GetPersonalBosses()
|
{
|
var bosses = new List<int>();
|
var lockedCount = 0;
|
for (int i = 0; i < sortedBossIds.Count; i++)
|
{
|
var bossId = sortedBossIds[i];
|
if (findPreciousModel.IsBossUnlock(bossId))
|
{
|
bosses.Add(bossId);
|
}
|
else
|
{
|
if (lockedCount < FindPreciousModel.ShowLockBossCnt)
|
{
|
bosses.Add(bossId);
|
lockedCount++;
|
}
|
}
|
}
|
|
return bosses;
|
}
|
|
public int GetRecommendBoss()
|
{
|
for (int i = 0; i < sortedBossIds.Count; i++)
|
{
|
var bossId = sortedBossIds[i];
|
|
if (!findPreciousModel.IsBossUnlock(bossId))
|
{
|
continue;
|
}
|
|
if (IsFreeTime(bossId))
|
{
|
return bossId;
|
}
|
}
|
|
for (int i = sortedBossIds.Count - 1; i >= 0; i--)
|
{
|
var bossId = sortedBossIds[i];
|
if (IsFreeTime(bossId))
|
{
|
return bossId;
|
}
|
if (findPreciousModel.IsBossUnlock(bossId)
|
&& findPreciousModel.IsPlayerLevelLargerOrBiggerThanBoss(bossId))
|
{
|
return bossId;
|
}
|
}
|
|
return sortedBossIds[0];
|
}
|
|
public int GetBossNpcId(int lineId)
|
{
|
var configs = PersonalBossConfig.GetValues();
|
foreach (var config in configs)
|
{
|
if (config.lineId == lineId)
|
{
|
return config.NPCID;
|
}
|
}
|
|
return 0;
|
}
|
|
private void OnPlayerDataChange(PlayerDataType _type)
|
{
|
if (_type == PlayerDataType.LV)
|
{
|
UpdateRedpoint();
|
}
|
}
|
|
//private void RefreshItemCount(PackType type, int index, int id)
|
//{
|
// if (type == PackType.Item && id == dungeonTicket)
|
// {
|
// UpdateRedpoint();
|
// }
|
//}
|
|
private void OnDungeonRecordChange(int _id)
|
{
|
if (_id == PERSONALBOSS_MAPID)
|
{
|
UpdateRedpoint();
|
}
|
}
|
|
|
public void UpdateRedpoint()
|
{
|
if (!FuncOpen.Instance.IsFuncOpen(22))
|
{
|
return;
|
}
|
|
var dungeonModel = ModelCenter.Instance.GetModel<DungeonModel>();
|
var enterTimes = dungeonModel.GetEnterTimes(PERSONALBOSS_MAPID);
|
var totalTimes = dungeonModel.GetTotalTimes(PERSONALBOSS_MAPID);
|
|
bool hasFreeTimes = HasFreeBoss();
|
if (hasFreeTimes)
|
{
|
mainBossRedpoint.state = RedPointState.Simple;
|
}
|
else
|
{
|
mainBossRedpoint.state = RedPointState.None;
|
}
|
if (enterTimes >= totalTimes)
|
{
|
personalRedpoint.count = 0;
|
if (hasFreeTimes)
|
{
|
personalRedpoint.state = RedPointState.Simple;
|
}
|
else
|
{
|
personalRedpoint.state = RedPointState.None;
|
}
|
return;
|
}
|
|
|
personalRedpoint.count = totalTimes - enterTimes;
|
personalRedpoint.state = RedPointState.Quantity;
|
}
|
|
public bool HasFreeBoss()
|
{
|
foreach (var bossID in GetPersonalBosses())
|
{
|
if (IsFreeTime(bossID))
|
{
|
return true;
|
}
|
}
|
|
return false;
|
}
|
|
private void ParseConfig()
|
{
|
var bossConfigs = PersonalBossConfig.GetValues();
|
for (int i = 0; i < bossConfigs.Count; i++)
|
{
|
var config = bossConfigs[i];
|
var bossData = personalBosses[config.NPCID] = new PersonalBossData(config.NPCID);
|
var dungeonId = dungeonModel.GetDungeonId(PERSONALBOSS_MAPID, config.lineId);
|
var dungeonConfig = DungeonConfig.Get(dungeonId);
|
if (dungeonConfig != null)
|
{
|
bossData.challengableLevel = dungeonConfig.LVLimitMin;
|
}
|
}
|
|
sortedBossIds.AddRange(personalBosses.Keys);
|
sortedBossIds.Sort(FindPreciousModel.BossCompare);
|
|
//{
|
// var dungeonId = dungeonModel.GetDungeonId(PERSONALBOSS_MAPID, 0);
|
// var dungeonConfig = DungeonConfig.Get(dungeonId);
|
// dungeonTicket = dungeonConfig == null ? 0 : dungeonConfig.TicketID;
|
//}
|
|
maxBossTimes = dungeonModel.GetMaxTimesShow(PERSONALBOSS_MAPID);
|
|
WipeOutLV = int.Parse(FuncConfigConfig.Get("WipeOutLV").Numerical1);
|
}
|
|
public void RequestGotoDungeon(int _bossId)
|
{
|
var config = PersonalBossConfig.Get(_bossId);
|
ClientDungeonStageUtility.GotoNormalClientDungeon(PERSONALBOSS_MAPID, PERSONALBOSS_MAPID, config.lineId);
|
}
|
|
public bool IsPlayerLevelEnough(int bossId)
|
{
|
var config = NPCConfig.Get(bossId);
|
return PlayerDatas.Instance.baseData.LV >= config.NPCLV;
|
}
|
|
public bool IsFreeTime(int bossID)
|
{
|
|
if (bossID == 0) return false;
|
|
if (!(findPreciousModel.IsBossUnlock(bossID) && IsPlayerLevelEnough(bossID))) return false;
|
|
var config = PersonalBossConfig.Get(bossID);
|
DungeonRecord dungeonRecord;
|
if (dungeonModel.TryGetRecord(PERSONALBOSS_MAPID, out dungeonRecord))
|
{
|
if (dungeonRecord.lineGrades.ContainsKey(config.lineId) && dungeonRecord.lineGrades[config.lineId] > 0)
|
{
|
return false;
|
}
|
}
|
return true;
|
}
|
|
//S级可扫荡,增加等级限制(任务必须进副本否则会卡住,也不希望用户过早的扫荡低级BOSS)
|
public bool CanFBWipeOut(int bossID)
|
{
|
if (PlayerDatas.Instance.baseData.LV <= WipeOutLV)
|
{
|
return false;
|
}
|
var config = PersonalBossConfig.Get(bossID);
|
DungeonRecord dungeonRecord;
|
if (dungeonModel.TryGetRecord(PERSONALBOSS_MAPID, out dungeonRecord))
|
{
|
if (dungeonRecord.lineGrades.ContainsKey(config.lineId) && dungeonRecord.lineGrades[config.lineId] == 5)
|
{
|
return true;
|
}
|
}
|
return false;
|
}
|
|
//是否通关过
|
public bool IsFBPass(int lineId)
|
{
|
DungeonRecord dungeonRecord;
|
if (dungeonModel.TryGetRecord(PERSONALBOSS_MAPID, out dungeonRecord))
|
{
|
if (dungeonRecord.lineGrades.ContainsKey(lineId) && dungeonRecord.lineGrades[lineId] != 0)
|
{
|
return true;
|
}
|
}
|
return false;
|
}
|
}
|
|
public class PersonalBossData
|
{
|
public int id { get; private set; }
|
public int challengableLevel { get; set; }
|
|
public PersonalBossData(int _id)
|
{
|
this.id = _id;
|
}
|
}
|
|
}
|