using LitJson;
|
using vnxbqy.UI;
|
using Spine;
|
using System;
|
using System.Collections.Generic;
|
using System.Linq;
|
|
public class BeastInvasionModel : Model
|
{
|
public int[] bossNPCIDArr; //bossNPCID列表 [星期一NPCID, 星期二, ...]
|
public Dictionary<int, int[][]> rewardDict; //每日排行榜奖励 {"名次":[[物品ID,个数,是否拍品], ...], ...}
|
public int[] rankArr; //排名数组(记录先后关系用)
|
public int[] dropArr; //bossNPCID列表 [星期一NPCID, 星期二, ...]
|
public int intervalS; //每日刷新点前后x秒不让挑战
|
public readonly int rankType = 34; //异兽入侵榜单类型
|
public readonly int rankMaxCount = 1000; //每日排行最大条数
|
public readonly int itemCellCount = 6; //概率掉落展示最大格子数
|
public readonly int dungeonID = 50100; //副本总表ID
|
public int dataMapID; //数据地图ID
|
public int lineID; //功能线路ID
|
public int dayReKind; //每日重置类型
|
public DateTime reflashTime; //每日刷新时间
|
public List<int> itemCellList;
|
public int boxNum = 0; //当前已获得奖励盒子数
|
public float boxHurt = 0; //当前所在奖励盒子已经累计输出伤害
|
|
RankModel rankModel { get { return ModelCenter.Instance.GetModel<RankModel>(); } }
|
DungeonModel dungeonModel { get { return ModelCenter.Instance.GetModel<DungeonModel>(); } }
|
Redpoint mainRedPoint = new Redpoint(MainRedDot.BeastInvasionRedpoint);
|
Redpoint redPoint = new Redpoint(MainRedDot.BeastInvasionRedpoint, MainRedDot.BeastInvasionRedpoint * 10 + 1); //挑战红点
|
|
public override void Init()
|
{
|
dungeonModel.dungeonRecordChangeEvent += OndungeonRecordChangeEvent;
|
bossNPCIDArr = JsonMapper.ToObject<int[]>(FuncConfigConfig.Get("AlineInvade").Numerical1);
|
var jsonData = JsonMapper.ToObject(FuncConfigConfig.Get("AlineInvade").Numerical2);
|
List<string> keysList = jsonData.Keys.ToList();
|
rankArr = new int[keysList.Count];
|
rewardDict = new Dictionary<int, int[][]>();
|
for (int i = 0; i < keysList.Count; i++)
|
{
|
string keyStr = keysList[i];
|
int key = int.Parse(keyStr);
|
int[][] value = JsonMapper.ToObject<int[][]>(jsonData[keyStr].ToJson());
|
rewardDict[key] = value;
|
rankArr[i] = key;
|
}
|
dropArr = JsonMapper.ToObject<int[]>(FuncConfigConfig.Get("AlineInvade").Numerical3);
|
intervalS = int.Parse(FuncConfigConfig.Get("AlineInvade").Numerical4);
|
itemCellList = new List<int>();
|
dataMapID = DungeonConfig.Get(dungeonID).DataMapID;
|
lineID = DungeonConfig.Get(dungeonID).LineID;
|
dayReKind = DungeonOpenTimeConfig.Get(dataMapID).DayReKind;
|
|
var nowTime = TimeUtility.ServerNow;
|
if (dayReKind == 1)
|
{
|
reflashTime = new DateTime(nowTime.Year, nowTime.Month, nowTime.Day, 0, 0, 0);
|
}
|
else if (dayReKind == 2)
|
{
|
reflashTime = new DateTime(nowTime.Year, nowTime.Month, nowTime.Day, 5, 0, 0);
|
}
|
else
|
{
|
reflashTime = new DateTime(nowTime.Year, nowTime.Month, nowTime.Day, 0, 0, 0);
|
}
|
}
|
|
public override void UnInit()
|
{
|
dungeonModel.dungeonRecordChangeEvent -= OndungeonRecordChangeEvent;
|
|
}
|
|
private void OndungeonRecordChangeEvent(int dungeonId)
|
{
|
if (dungeonId != dataMapID)
|
return;
|
UpdateRedpoint();
|
}
|
|
void UpdateRedpoint()
|
{
|
redPoint.state = dungeonModel.GetEnterTimes(dataMapID) < dungeonModel.GetMaxTimesShow(dataMapID) ? RedPointState.Simple : RedPointState.None;
|
}
|
|
//当前时间能否进入副本
|
public bool isTimeOk()
|
{
|
if (dayReKind == 0)
|
return true;
|
var nowTime = TimeUtility.ServerNow;
|
var minTime = reflashTime.AddSeconds(-intervalS);
|
var maxTime = reflashTime.AddSeconds(intervalS);
|
if (nowTime >= minTime && nowTime <= maxTime)
|
return false;
|
return true;
|
}
|
|
public SortedDictionary<int, RankData> GetRankPageDatas()
|
{
|
Dictionary<int, RankData> rankPageDatas = rankModel.GetRankPageDatas(rankType);
|
SortedDictionary<int, RankData> sortedDict = new SortedDictionary<int, RankData>(rankPageDatas);
|
return sortedDict;
|
}
|
|
//获得副本剩余开放时间
|
public string GetRemainTime()
|
{
|
var nowTime = TimeUtility.ServerNow;
|
if (!isTimeOk())
|
{
|
return TimeUtility.SecondsToDHMS(0);
|
}
|
else
|
{
|
var minTime = reflashTime.AddSeconds(-intervalS);
|
if (nowTime < minTime)
|
{
|
return TimeUtility.SecondsToDHMS((int)(minTime - nowTime).TotalSeconds);
|
}
|
else
|
{
|
DateTime newReflashTime = reflashTime.AddDays(1);
|
var newMinTime = newReflashTime.AddSeconds(-intervalS);
|
return TimeUtility.SecondsToDHMS((int)(newMinTime - nowTime).TotalSeconds);
|
}
|
}
|
}
|
|
//获得今日要打的NPCID 按星期x轮换,周一为每周开始的第一天
|
//每日五点前是上一天的boss,5点后是当天boss
|
//配一个每天都一样 不足7个每星期按配置的个数循环,周一开始重新循环
|
public int GetTodayNPCID()
|
{
|
DateTime today = TimeUtility.ServerNow;
|
int dayOfWeek = (int)today.DayOfWeek;
|
int[] dayOfWeekByMonday = new int[] { 6, 0, 1, 2, 3, 4, 5 };
|
int realDayOfWeek = dayOfWeekByMonday[dayOfWeek];
|
int count = bossNPCIDArr.Length;
|
//只配一个或者类型是不刷新 每天都一样
|
if (count == 1 || dayReKind == 0)
|
return bossNPCIDArr[0];
|
int index = realDayOfWeek % count;
|
if (today >= reflashTime)
|
{
|
return bossNPCIDArr[index];
|
}
|
else
|
{
|
if (index == 0)
|
{
|
return bossNPCIDArr[count - 1];
|
}
|
else
|
{
|
return bossNPCIDArr[index - 1];
|
}
|
}
|
}
|
|
//获得当前排名的上一级排名,返回-1说明没有上一级排名
|
public int GetLastRank(int rank)
|
{
|
if (rank <= 3)
|
return -1;
|
for (int i = 0; i < rankArr.Length; i++)
|
{
|
if (rankArr[i] == rank)
|
{
|
return rankArr[i - 1];
|
}
|
}
|
return -1;
|
}
|
|
//获得第一名,第二名,第三名的对应图标
|
public string GetRankImage(int rank)
|
{
|
switch (rank)
|
{
|
case 1:
|
return "Rank_First";
|
case 2:
|
return "Rank_Second";
|
case 3:
|
return "Rank_Third";
|
default:
|
return string.Empty;
|
}
|
}
|
|
|
public void UpdateBeastInvasionBoxInfo(string info)
|
{
|
var json = JsonMapper.ToObject<BeastInvasionBox>(info);
|
if (json.dataMapID != 5010)
|
return;
|
boxNum = json.boxNum;
|
boxHurt = json.boxHurt;
|
}
|
}
|
public class BeastInvasionBox
|
{
|
public int dataMapID;
|
public int boxNum;
|
public float boxHurt;
|
}
|