miduo_client/Assets/ManagedResources/~Lua/Modules/Adventure/AdventureManager.lua

529 lines
20 KiB
Lua
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

AdventureManager = {}
local this = AdventureManager
local GameSetting = ConfigManager.GetConfig(ConfigName.GameSetting)
-- local AdventureReward = ConfigManager.GetConfig(ConfigName.AdventureReward)
-- local AdventureConfig = ConfigManager.GetConfig(ConfigName.AdventureConfig)
local VipLevelConfig = ConfigManager.GetConfig(ConfigName.VipLevelConfig)
local StoreConfig = ConfigManager.GetConfig(ConfigName.StoreConfig)
local privilegeTypeConfig=ConfigManager.GetConfig(ConfigName.PrivilegeTypeConfig)
function this.Initialize()
this.curOpenFight = 1011 -- 当前开启的关卡
--奖励名次下限
this.minRank = {}
--奖励名次上限
this.maxRank = {}
--冒险每日玩家外敌入侵攻打次数
this.canAttackBossTimes = 0
--宝箱能出现的时间(60秒加一次收益)
this.adventureRefresh = 0
--冒险每日玩家外敌入侵攻打次数,每隔多长时间恢复
--this.invasionBossTimesAdd=0
--宝箱不领取最多能增长奖励的时间(10个小时)
this.adventureOffline = 0
--冒险快速战斗计算的收益时长s
this.adventureFastBattle = 0
--冒险伤害排行榜我的数据
this.myInfo = 0
--请求服务刷新Boss时间
--this.nextBossFlushTime=0
--已消耗快速领取奖励次数
this.buyTimsPerDay = 0
--每日已消耗挑战次数
this.dayChallengeTimes = 0
--冒险战斗结果
this.fightResult = 1
--Boss请求进入
this.canBossRequest = true
--每日奖励
this.dailyReward = {}
--冒险伤害排行榜数据
this.adventureRankItemInfo = {}
--冒险战斗数据
this.FightData = {}
--领取宝箱基础奖励
this.Drop = {}
--宝箱展示控制
this.adventureBoxShow = {}
--冒险挂机状态信息
this.adventureStateInfoList = {}
--领取宝箱随机奖励
this.randomDrop = {}
--进攻次数恢复时间
this.attackTimesRecover = 0
-- 外敌入侵数据
this.adventrueEnemyList = {}
-- 世界聊天
this.adventureChatList = {}
this.IsChatListNew = false
--请求极速探险成功
this.isSuccess = false
--显示外敌红点
this.isCanShowAlianInvasion = false
--召唤外敌次数
this.callAlianInvasionTime = 0
--召唤外敌倒计时时间
this.callAlianInvasionCountDownTime = 0
--已击杀外敌Id
this.hasKilledId = {}
--是否进入过秘境
this.isEnterAdventure = false
--宝箱存在时间
this.stateTime = 0
-- 登录时展示的可以获得的挂机奖励
this.HangOnReward = {}
--初始化表相关数据
this.GetTableStaticData()
-- 通关新关卡,时间不够一分钟
Game.GlobalEvent:AddEvent(GameEvent.Mission.OnOpenFight, function()
if this.stateTime<60 then
this.stateTime=60
end
end)
-- 删除好友,同时删除其外敌消息
Game.GlobalEvent:AddEvent(GameEvent.Friend.OnFriendDelete, function(friendId)
if not this.adventureChatList then return end
local list = {}
local isDelete = false
for _, chat in ipairs(this.adventureChatList) do
if chat.findUid == friendId then
isDelete = true
else
table.insert(list, chat)
end
end
this.adventureChatList = list
if isDelete then
this.IsChatListNew = true
-- 聊天数据刷新
Game.GlobalEvent:DispatchEvent(GameEvent.Adventure.OnChatListChanged)
-- 刷新外敌列表
this.RequestAdventureEnemyList()
end
end)
-- 外敌功能解锁,刷新外敌数据
Game.GlobalEvent:AddEvent(GameEvent.FunctionCtrl.OnFunctionOpen, function(funcId)
if funcId == FUNCTION_OPEN_TYPE.FIGHT_ALIEN then
local countDownTime = BagManager.GetItemRecoveryTime(GameSetting[1].AdventureItem)
--Log(countDownTime.."倒计时时间")
if (countDownTime ~= nil) then
this.callAlianInvasionRecoverTime = countDownTime
this.callAlianInvasionTime = BagManager.GetItemCountById(GameSetting[1].AdventureItem)
CheckRedPointStatus(RedPointType.SecretTer_CallAlianInvasionTime)
end
end
end)
-- 挂机特权解锁重置挂机时间
Game.GlobalEvent:AddEvent(GameEvent.Privilege.OnPrivilegeUpdate, function(PrivilegeId)
if PrivilegeId == PRIVILEGE_TYPE.ADVENTURE_EXPLORE then
this.stateTime = 0
end
end)
end
--冒险所有时间总的倒计时
function this.StartCountDown()
-- 开始定时刷新
if not this._CountDownTimer then
this._CountDownTimer = Timer.New(this.TimeCountDown, 1, -1, true)
this._CountDownTimer:Start()
end
end
--读取表的数据进行数据初始化
function this.GetTableStaticData()
--召唤外敌倒计时总时间
this.callAlianInvasionCountDownTime = GameSetting[1].ItemAdd[5][3]
--宝箱能出现的时间(60秒加一次收益)
this.adventureRefresh = GameSetting[1].AdventureRefresh
--宝箱不领取最多能增长奖励的时间(10个小时)
this.adventureOffline = GameSetting[1].AdventureOffline + PrivilegeManager.GetPrivilegeNumber(2002)
--this.adventureFastBattle = GameSetting[1].AdventureFastBattle
--冒险宝箱显示的三种状态(达到多少时间显示什么宝箱)
--每日奖励
this.adventureBoxShow = GameSetting[1].AdventureBoxShow
-- for k, v in ConfigPairs(AdventureReward) do
-- this.minRank[k] = v.MinRank
-- this.maxRank[k] = v.MaxRank
-- table.insert(this.dailyReward, v.DailyReward)
-- end
end
function this.TimeCountDown()
--召唤外敌倒计时恢复
if (this.callAlianInvasionRecoverTime) then
this.callAlianInvasionRecoverTime = this.callAlianInvasionRecoverTime - 1
this.callAlianInvasionTime = BagManager.GetItemCountById(GameSetting[1].AdventureItem)
if (this.callAlianInvasionTime >= this.callAlianInvasionTotalTime) then
this.callAlianInvasionRecoverTime = 0
elseif (this.callAlianInvasionRecoverTime < 0) then
this.callAlianInvasionRecoverTime = this.callAlianInvasionCountDownTime
end
Game.GlobalEvent:DispatchEvent(GameEvent.Adventure.CallAlianInvasionTime, this.callAlianInvasionRecoverTime)
end
--宝箱产生收益的时间进行时间叠加
this.stateTime = this.stateTime + 1
Game.GlobalEvent:DispatchEvent(GameEvent.Adventure.OnRefeshBoxRewardShow)
--外敌列表外敌进行倒计时,用于控制分享外敌的逃跑置灰
if this.adventrueEnemyList then
local isChanged = false
for i, v in ipairs(this.adventrueEnemyList) do
if v.levelTime == GetTimeStamp() then
this.hasKilledId[v.bossId] = v.bossId
this.IsChatListNew = true
isChanged = true
end
end
if isChanged then
-- 对外敌列表进行排序
this.SortEnemyList()
Game.GlobalEvent:DispatchEvent(GameEvent.Adventure.OnChatListChanged)
Game.GlobalEvent:DispatchEvent(GameEvent.Adventure.OnEnemyListChanged)
end
end
end
--接收服务器返回的冒险数据
function this.GetAdventureData()
-- 能够攻打外敌次数
this.canAttackBossTimes = PrivilegeManager.GetPrivilegeRemainValue(PRIVILEGE_TYPE.ADVENTURE_BOSS)
--能够召唤外敌的总次数
this.callAlianInvasionTotalTime = PrivilegeManager.GetPrivilegeNumber(24)
--当前拥有的召唤外敌次数
this.callAlianInvasionTime = BagManager.GetItemCountById(GameSetting[1].AdventureItem)
-- 简单外敌数据
this.adventrueEnemyList = FightPointPassManager.adventrueEnemyList
this.SortEnemyList()
this.stateTime = FightPointPassManager.HangOnTime
local rewardList = {}
if FightPointPassManager.HangOnReward ~= "" then
local list = string.split(FightPointPassManager.HangOnReward, "|")
for i = 1, #list do
local r = string.split(list[i], "#")
table.insert(rewardList, {tonumber(r[1]), tonumber(r[2])})
end
end
this.HangOnReward = rewardList
local countDownTime = BagManager.GetItemRecoveryTime(GameSetting[1].AdventureItem)
--Log(countDownTime.."倒计时时间")
if countDownTime ~= nil then
this.callAlianInvasionRecoverTime = countDownTime
end
this.StartCountDown()
Game.GlobalEvent:DispatchEvent(GameEvent.Adventure.OnRefreshData)
this.GetTableStaticData()
end
-- 获取妖晶急速探索次数
function this.GetStoneFastBattleCount()
return ShopManager.GetShopItemData(SHOP_TYPE.FUNCTION_SHOP, 10015).buyNum
end
-- 获取沙漏急速探索次数
function this.GetSandFastBattleCount()
return PrivilegeManager.GetPrivilegeRemainValue(PRIVILEGE_TYPE.EXPLORE_REWARD)
end
--根据宝箱奖励时间判断是否已经达到最大时长
function this.GetIsMaxTime()
if UIManager.IsOpen(UIName.GuidePanel) then
return
end
if this.stateTime >= (this.adventureOffline - 1) * 3600 then
if not UIManager.IsOpen(UIName.SupremeHeroPopup) or not UIManager.IsOpen(UIName.SupremeHeroPopupNew) then
UIManager.OpenPanel(UIName.FightAreaRewardFullPopup)
end
end
end
--请求Boss伤害排行榜数据
function this.GetAdventurnInjureRankRequest()
local injuerData = {}
this.adventureRankItemInfo = {}
NetManager.GetAdventurnInjureRankRequest(injuerData, 1, function(msg)
for i, v in ipairs(msg) do
for m, n in ipairs(v.adventureRankItemInfo) do
table.insert(this.adventureRankItemInfo, n)
end
this.myInfo = v.myInfo
end
Game.GlobalEvent:DispatchEvent(GameEvent.Adventure.OnInjureRank)
end)
end
---Boss被击杀刷新数据
function this.GetAdventureBossFlushRequest(msg)
this.hasKilledId[msg.bossId] = msg.bossId
this.IsChatListNew = true
Game.GlobalEvent:DispatchEvent(GameEvent.Adventure.OnChatListChanged)
end
--- 请求外敌入侵敌人数据
function this.RequestAdventureEnemyList(func)
NetManager.RequestAdventureEnemyList(function(msg)
-- 保存数据刷新
this.adventrueEnemyList = msg.adventureBossInfo
-- 排序
this.SortEnemyList()
if func then
func()
end
Game.GlobalEvent:DispatchEvent(GameEvent.Adventure.OnEnemyListChanged)
-- 重置外敌红点显示
ResetServerRedPointStatus(RedPointType.SecretTer_Boss)
end)
end
--保存Boss信息
function this.saveBossInfo()
this.bossInfo = this.adventrueEnemyList
end
--- 通过动态bossId获取boss数据
function this.GetBossId(bossId)
local data = nil
for i, v in ipairs(this.bossInfo) do
if v.bossId == bossId then
data = v
end
end
return data
end
--- 获取剩余挑战外敌次数
function this.GetLeftChallengeTimes()
--TODO: 外敌挑战次数与vip有关
local leftTimes = this.canAttackBossTimes
return leftTimes < 0 and 0 or leftTimes
end
--- 获取外敌数据
function this.GetAdventureEnemyList()
local list = {}
-- 数据不存在
if not this.adventrueEnemyList then
return list
end
-- 不显示剩余时间为0的敌人
for i, v in ipairs(this.adventrueEnemyList) do
if v.levelTime > GetTimeStamp() then
table.insert(list, v)
end
end
return list
end
--- 对外敌列表进行排序
function this.SortEnemyList()
if not this.adventrueEnemyList then return end
--Log("++++++++++++++对外敌列表进行排序+++++++++++++++++++++++++++")
--Log("++++++++++++++排序前====")
--for index, enemy in ipairs(this.adventrueEnemyList) do
-- Log(index..":::::"..enemy.levelTime)
--end
table.sort(this.adventrueEnemyList, function(a, b)
-- 我发现的放在前面
if a.findUid ~= b.findUid then
if a.findUid == PlayerManager.uid then return true end
if b.findUid == PlayerManager.uid then return false end
return a.findUid < b.findUid
end
-- 按时间排序
if a.levelTime ~= b.levelTime then
return a.levelTime < b.levelTime
end
-- 按bossid排序
return a.bossId < b.bossId
end)
--Log("++++++++++++++排序后====")
--for index, enemy in ipairs(this.adventrueEnemyList) do
-- Log(index..":::::"..enemy.levelTime)
--end
--Log("++++++++++++++对外敌列表进行排序+++++++++++++++++++++++++++")
end
--- 通过动态bossId获取boss数据
function this.GetEnemyDataByBossId(bossId)
local data = nil
for i, v in ipairs(this.adventrueEnemyList) do
if v.bossId == bossId then
data = v
end
end
return data
end
-- 判断外敌是否被击杀
function this.IsEnemyKilled(id)
if not this.hasKilledId then
return false
end
if not this.hasKilledId[id] then
return false
end
return true
end
--外敌界面Boss分享请求
this._ShareTimeFlag = 0
function this.GetAdventureBossShareRequest(bossId)
-- 分享冷却时间5秒
local curTimeStamp = GetTimeStamp()
if curTimeStamp - this._ShareTimeFlag < 5 then
PopupTipPanel.ShowTip(Language[10063])
return
end
this._ShareTimeFlag = curTimeStamp
-- 请求分享
NetManager.GetAdventureBossShareRequest(function()
--TODO: 此处需要好友系统支持策划说暂时弹出tips提示分享成功。
PopupTipPanel.ShowTip(Language[10064])
end, bossId)
end
--外敌界面Boss挑战请求
function this.GetAdventurenBossChallengeRequest(bossData, teamId, fightTimes, skipFight, callBack)
local isSkip = skipFight
FightPointPassManager.oldLevel = PlayerManager.level
NetManager.GetAdventurenBossChallengeRequest(function(msg)
--if callBack then callBack() end
this.saveBossInfo()
this.hurtNums = msg.hurtNums
local fightResult = msg.fightResult
--- 发现者名字有两种可能,一个是我和好友的敌人数据,另一种是世界聊天发过来的数据(两种数据结构不同)
local findName = bossData.findName
if (fightResult == 1 and findName == PlayerManager.nickName) then
--this.Data[bossData.arenaId].bossRemainTime = -1
end
if (isSkip == 0) then
local fightData = BattleManager.GetBattleServerData(msg)
this.consumeFightTimes = msg.consumeFightTimes
if callBack then
callBack(fightResult)
end
local battlePanel = UIManager.OpenPanel(UIName.BattlePanel, fightData, BATTLE_TYPE.BACK, function()
UIManager.OpenPanel(UIName.AdventureGetRewardPopup, bossData.bossGroupId, msg.consumeFightTimes, msg.hurtNums, fightResult, msg.killRewards, msg.bossTotalHp, msg.bossRemainHp)
end)
battlePanel:SetResult(fightResult) -- 回放战斗必须调用次接口
else
if callBack then
callBack(fightResult)
end
-- 设置战斗数据用于统计战斗
local _fightData = BattleManager.GetBattleServerData(msg)
BattleRecordManager.SetBattleRecord(_fightData)
--打完外敌Boss弹出领取奖励
UIManager.OpenPanel(UIName.AdventureGetRewardPopup, bossData.bossGroupId, msg.consumeFightTimes, msg.hurtNums, fightResult, msg.killRewards, msg.bossTotalHp, msg.bossRemainHp)
end
PrivilegeManager.RefreshPrivilegeUsedTimes(PRIVILEGE_TYPE.ADVENTURE_BOSS, msg.consumeFightTimes)
this.canAttackBossTimes = PrivilegeManager.GetPrivilegeRemainValue(PRIVILEGE_TYPE.ADVENTURE_BOSS)
--BagManager.UpdateItemsNum(44,msg.consumeFightTimes)
Game.GlobalEvent:DispatchEvent(GameEvent.Adventure.OnRefreshData)
-- 重新获取敌人数据
this.RequestAdventureEnemyList()
end, bossData.bossId, teamId, fightTimes, skipFight)
end
-- 获取聊天数据
function this.GetChatList()
this.IsChatListNew = false
return this.adventureChatList
end
--vip提升更新宝箱时间
function this.UpdateStateTime()
this.stateTime = 0
end
--解锁跳过战斗功能
function this.IsUnlockBattlePass()
return PrivilegeManager.GetPrivilegeOpenStatus(PRIVILEGE_TYPE.SkipFight)
end
--Vip等级提升时刷新数据
function this.RefreshAttachVipData()
this.canAttackBossTimes = PrivilegeManager.GetPrivilegeRemainValue(PRIVILEGE_TYPE.ADVENTURE_BOSS)
end
--是否进入过秘境
function this.IsEnterAdventure()
return this.isEnterAdventure
end
--- 召唤外敌请求
function this.CallAlianInvasionRequest(func)
NetManager.CallAlianInvasionRequest(function(msg)
local adventureBossInfo = {}
adventureBossInfo = msg.adventureBossInfo
-- 刷新召唤外敌次数
this.callAlianInvasionTime = BagManager.GetItemCountById(GameSetting[1].AdventureItem)
CheckRedPointStatus(RedPointType.SecretTer_CallAlianInvasionTime)
-- 计算次数恢复时间
local counDownTime = BagManager.GetItemRecoveryTime(GameSetting[1].AdventureItem)
this.callAlianInvasionRecoverTime = counDownTime
-- 外敌展示界面
UIManager.OpenPanel(UIName.MonsterShowPanel, adventureBossInfo.bossGroupId, function()
UIManager.OpenPanel(UIName.FormationPanel, FORMATION_TYPE.ADVENTURE_BOSS, adventureBossInfo)
end, function()end, true, 4)
-- 回调
if func then func() end
end)
end
--冒险奖励请求
function this.GetAventureRewardRequest(type, position, isCostDemonCrystal, isFastBattle, func)
NetManager.GetAventureRewardRequest(function(msg)
if type == 2 then
this.Drop = msg.Drop
this.randomDrop = msg.randomDrop
UIManager.OpenPanel(UIName.AdventureExploreRewardPanel, this.Drop, this.randomDrop)
end
--急速探险
if (isFastBattle == true) then
--花费妖晶
if (isCostDemonCrystal == true) then
PrivilegeManager.RefreshPrivilegeUsedTimes(GameSetting[1].AdventureFastBattlePrivilege, 1)
ShopManager.AddShopItemBuyNum(SHOP_TYPE.FUNCTION_SHOP, 10015, 1)
else
--花费时光沙漏
local freeTimes = PrivilegeManager.GetPrivilegeRemainValue(PRIVILEGE_TYPE.EXPLORE_REWARD)
if freeTimes > 0 then
PrivilegeManager.RefreshPrivilegeUsedTimes(4, 1)
CheckRedPointStatus(RedPointType.SecretTer_HaveFreeTime)
end
end
--CheckRedPointStatus(RedPointType.SecretTer_HaveFreeTime)
Game.GlobalEvent:DispatchEvent(GameEvent.Adventure.OnFastBattleChanged)
--点击宝箱手动领取奖励
else
if (this.stateTime >= this.adventureRefresh) then
if (this.stateTime >= this.adventureBoxShow[2]) then
this.stateTime=this.adventureBoxShow[2]
end
this.stateTime = this.stateTime % this.adventureRefresh
CheckRedPointStatus(RedPointType.SecretTer_MaxBoxReward)
Game.GlobalEvent:DispatchEvent(GameEvent.Adventure.OnRefeshBoxRewardShow)
end
end
if func then
func(msg)
end
end, type, position)
end
--极速探险有免费次数时,有时光沙漏时红点
function this.HaveFreeTime()
return this.GetSandFastBattleCount() ~= 0
end
--有召唤外敌次数时显示红点
function this.HaveCallAlianInvasionTime()
local callAlianInvasionTime=0
callAlianInvasionTime = BagManager.GetItemCountById(GameSetting[1].AdventureItem)
if(callAlianInvasionTime>=1) then
return true
else
return false
end
end
--宝箱收益最大红点
function this.BoxMaxReward()
local isMaxReward = false
if (this.stateTime >= this.adventureOffline * 3600) then
isMaxReward = true
end
return isMaxReward
end
return this