|
|
- BossModel = BossModel or BaseClass(BaseModel)
-
- -------------------------
- BossModel.EVENT_UPDATE_RED_DOT = "BossModel.EVENT_UPDATE_RED_DOT"
- BossModel.UPDATE_BOSS_RED_INFO = "BossModel.UPDATE_BOSS_RED_INFO"
- -------------------------
-
- BossModel.GRAVE_MONSTER_ID = 1200999 --墓碑怪物ID
-
- --新手假赏金BOSS相关配置
- BossModel.FAKE_MONEY_BOSS_SCENE_ID = 2060 --场景id
- BossModel.FAKE_MONEY_BOSS_DUN_ID = 3605 --副本id
- BossModel.FAKE_MONEY_BOSS_TASK_ID = 11260 --任务id
- BossModel.FAKE_MONEY_BOSS_MIN_LEVEL = 90 --等级下限
- BossModel.FAKE_MONEY_BOSS_MAX_LEVEL = 119 --等级上限
- BossModel.FAKE_MONEY_BOSS_ID = 13010000 --bossid
- BossModel.FAKE_MONEY_REWARD_BOSS_ID = 13010001 --奖励展示的bossid
-
- BossModel.BOSS_CARD =
- {
- REFRESH_MONEY_BOSS_ID = 102323, --赏金幻魔刷新卡
- REFRESH_DESERTED_BOSS_ID = 102324, --星域幻魔刷新卡
- OWNER_MONEY_BOSS_ID = 102325, --赏金幻魔独享卡
- OWNER_DESERTED_BOSS_ID = 102326, --星域幻魔独享卡
- }
-
- table_insert = table.insert
- function BossModel:__init()
- BossModel.Instance = self
- self:InitDesertedBossCFG()
- self.total_deserted_boss_time = Config.Desertedkv["feidu_boss_times"].val
- self.total_deserted_mon_time = Config.Desertedkv["feidu_elite_times"].val
- self:ResetData()
- end
-
- function BossModel:ResetData( )
- self.need_refresh_grave = true
- self.need_refresh_grave = false --是否要刷新墓碑
- self.perosn_normal_count = false --个人副本每日基础次数
- -------------------------
- self.world_boss_status = 0 --世界boss活动结束时间
- self.world_boss_info = {} --世界boss列表信息
- self.world_boss_hp_list = {} --世界boss血量信息
- self.world_boss_week_rank_list = {} --世界boss周榜单
- self.scene_boss_hp = {}--场景中boss最大血量
- self.boss_hurt_info = {}--场景中boss伤害列表
- self.money_boss_info = {} --赏金幻魔列表信息
- self.money_boss_my_info = {}--赏金幻魔个人信息
- self.money_boss_kill_history = {}
- self.money_inspire_count = {}--赏金幻魔鼓舞信息
- self.world_boss_protect_max = {}--世界boss护盾信息
- self.money_helper_info = {}--赏金幻魔协助者伤害
- self.boss_focus_check_list = {}--幻魔关注计时器检查列表
- self.boss_focus_tip_cd_list = {}--幻魔关注提示冷却时间
- self.money_focus_tip_time = 60--赏金幻魔关注提示时间
-
- self.person_boss_list_show_in_hall = false--保存专属幻魔界面的数据列表
- self.red_person_boss = false
- self.red_money_boss = false
- self.need_show_money_result = false--赏金幻魔结算数据
- self.my_hurt_only = false--boss自己的总伤害(只在组队状态下有用)
-
- self.left_free_deserted_boss_relive_times = 0 --星域幻魔剩余免费复活次数
-
- self.deserted_boss_rank_info = {}--星域幻魔伤害列表
- self.deserted_boss_num_info = {}--星域幻魔剩余次数信息
- self.deserted_boss_info = {}--星域幻魔基础信息
- self.need_find_boss_id = false--星域幻魔找boss信息
- self.deserted_monster_info = {} --星域幻魔找boss 精英怪信息
- self.boss_protect_time_info = {}--boss免战时间信息
- self:SetFocusClock()
- self:InitCheckMoneyRedLvList()
- self:InitCheckPersonRedLvList()
-
- self.festival_boss_list = false--节日幻魔基础信息
- self.festival_boss_scene_list = false--当前场景boss信息
- self.festival_boss_rank_info = false--排名信息
-
- self.boss_equip_tips_view_close_data = false --装备展示界面提示界面,退出关闭数据
- end
-
- function BossModel:GetInstance()
- if BossModel.Instance == nil then
- BossModel.New()
- end
- return BossModel.Instance
- end
-
- function BossModel:GetBossKeyValue( key )
- if not key or not Config.Localbosskv[key] then return end
- return Config.Localbosskv[key].value_content
- end
-
- --根据当前boss_id获取boss类型
- function BossModel:GetBossTypeByBossId( boss_id )
- if not boss_id then return end
- if SceneManager:getInstance():IsFakeBossMoneyScene() then
- return Config.ConfigBoss.ModuleId.Money
- end
- if self:GetWorldBossConf( boss_id ) then
- return Config.ConfigBoss.ModuleId.World
- elseif self:GetMoneyBossConf( boss_id ) then
- return Config.ConfigBoss.ModuleId.Money
- elseif self:GetPersonBossList( boss_id ) then
- return Config.ConfigBoss.ModuleId.Person
- elseif boss_id == GuildModel:getInstance():GetGuildCollectKvByKey("invade_mon").value then
- return Config.ConfigBoss.ModuleId.Collect
- elseif self:GetDesertedBossCFGById(boss_id) then
- return Config.ConfigBoss.ModuleId.Deserted
- end
- end
-
- --根据当前boss_id获取boss配置
- function BossModel:GetBossCfgByBossId( boss_id )
- if not boss_id then return end
- local boss_cfg = self:GetWorldBossConf( boss_id )
- or self:GetMoneyBossConf( boss_id )
- or self:GetPersonBossList( boss_id )
- or self:GetDesertedBossCFGById(boss_id)
- return boss_cfg
- end
-
- --刷新墓碑
- function BossModel:UpdateSceneGrave(vo)
- do return end
- -------------------------
- if not vo or not vo.boss_info then return end
- local boss_info = vo.boss_info
- if boss_info then
- local cur_scene_id = SceneManager.Instance:GetSceneId()
- for _, v in ipairs(boss_info) do
- if v.reborn_time > 0 then --复活结束时间戳>0说明怪物已经死亡
- local x, y
- local cfg = Config.Bosscfg[v.boss_id]
- local scene_id = 0
- if cfg then
- x = tonumber(cfg.x)
- y = tonumber(cfg.y)
- scene_id = tonumber(cfg.scene)
- end
-
- local monCfg = ConfigItemMgr.Instance:GetMonsterDataItem(v.boss_id)
- if x and y and monCfg and (scene_id == cur_scene_id) then
- local grave_vo = GraveVo.New()
-
- local data = {}
- data.instance_id = v.boss_id
- data.type_id = BossModel.GRAVE_MONSTER_ID
- data.boss_id = v.boss_id
- data.name = monCfg.name
- data.level = monCfg.lv
- data.refresh_time = math.ceil(v.reborn_time - TimeUtil:getServerTime())
- data.pos_x = x
- data.pos_y = y
-
- grave_vo:SetGraveVo(data)
- SceneManager:getInstance():AddGraveVo(grave_vo)
- end
- else
- SceneManager:getInstance():DeleteGraveVo(v.boss_id)
- end
- end
- end
- end
-
- --boss图标是否有红点
- function BossModel:HasBossRed( check_new )
- local bool_1 = self:HasPersonBossRed( check_new )
- -- local bool_2 = self:HasWorldBossRed( check_new )
- local bool_3 = self:HasMoneyBossRed( check_new )
- local bool_4 = self:HasDesertedBossRed(check_new)
- local bool_5 = self:HasBossHomeRed()
- return bool_1 or bool_2 or bool_3 or bool_4 or bool_5
- end
-
- function BossModel:HasPersonBossRed( check_new,mask_first )
- if not GetModuleIsOpen(460, Config.ConfigBoss.ModuleId.Person, true) then
- return false
- end
-
- if check_new then
- local dungeon_list = BaseDungeonModel:GetInstance():GetDunProtoInfo( BaseDungeonModel.DUN_TYPE.PersonBoss )
- local boss_type_count = self:GetBossNormalCount(Config.ConfigBoss.ModuleId.Person)
- if dungeon_list and dungeon_list[1] then
- local max_time = boss_type_count + dungeon_list[1].vip_count
- local vip_pass_count = 0--购买的vip次数使用过的次数
- for k, v in pairs(dungeon_list[1].rec_data) do
- if v.key == 8 then
- vip_pass_count = v.val
- end
- end
- local day_use = dungeon_list[1].day_pass_count+vip_pass_count
- self.red_person_boss = max_time-day_use > 0
- end
- end
-
- local can_first_pass = false
- if not mask_first then
- can_first_pass = self:GetPersonBossFirstPassRed()
- end
- return self.red_person_boss or can_first_pass
- end
-
- function BossModel:InitCheckPersonRedLvList( )
- self.check_red_person_lv = {}
- for k,v in pairs(self:GetPersonBossList()) do
- self.check_red_person_lv[self:GetPersonBossLimitLv(v.boss_id)] = true
- end
- end
-
- function BossModel:GetPersonBossFirstPassRed( )
- if not GetModuleIsOpen(460, Config.ConfigBoss.ModuleId.Person, true) then
- return false
- end
- --判断首次通关红点
- local my_lv = RoleManager.Instance.mainRoleInfo.level
- for k,v in pairs(self:GetPersonBossList()) do
- local limit_lv = self:GetPersonBossLimitLv(v.boss_id)
- if my_lv >= limit_lv then
- if not self:CheckHasPassPersonBoss(v.boss_id) then
- return true
- end
- end
- end
- return false
- end
-
- function BossModel:CheckHasPassPersonBoss( boss_id )
- local have_kill_pass = true --是否已经通关过
- -------------------------
- --获取副本数据
- local conf_boss = self:GetPersonBossList( boss_id )
- local dungeon_list = BaseDungeonModel:GetInstance():GetDunProtoInfo( BaseDungeonModel.DUN_TYPE.PersonBoss )
- if (not conf_boss) or (not dungeon_list) then
- have_kill_pass = true
- return have_kill_pass
- end
- -------------------------
- local need_dun_info = false
- for k,v in pairs(dungeon_list) do
- if v.dun_id == conf_boss.dun_id then
- need_dun_info = v
- break
- end
- end
- if not need_dun_info then
- have_kill_pass = true
- return have_kill_pass
- end
- -------------------------
- local first_pass_status = need_dun_info.is_pass--0未通关|1已通关
- if first_pass_status == 1 then
- have_kill_pass = true
- else
- have_kill_pass = false
- end
- return have_kill_pass
- end
-
- function BossModel:HasWorldBossRed( check_new )
- if not GetModuleIsOpen(460, Config.ConfigBoss.ModuleId.World,true) then
- return false
- end
- -------------------------
- return false
- end
-
- function BossModel:HasMoneyBossRed( check_new,mask_first )
- if not GetModuleIsOpen(460, Config.ConfigBoss.ModuleId.Money,true) then
- return false
- end
-
- if check_new then
- self.red_money_boss = self:GetMoneyLeftCount() > 0
- end
- -------------------------
- local can_first_pass = false
- if not mask_first then
- can_first_pass = self:GetMoneyBossFirstPassRed()
- end
- -------------------------
- return self.red_money_boss or can_first_pass
- end
-
- function BossModel:GetMoneyBossFirstPassRed( )
- if not GetModuleIsOpen(460, Config.ConfigBoss.ModuleId.Money,true) then
- return false
- end
- --判断首次通关红点
- local my_lv = RoleManager.Instance.mainRoleInfo.level
- for k,v in pairs(self:GetMoneyBossConf()) do
- local limit_lv = self:GetMoneyBossLimitLv(v.boss_id)
- if my_lv >= limit_lv then
- local ser_data = false
- for kk,vv in pairs(self:GetMoneyBossInfo()) do
- if vv.boss_id == v.boss_id then
- ser_data = vv
- break
- end
- end
- if ser_data and ser_data.kill_count == 0 then
- return true
- end
- end
- end
- return false
- end
-
- function BossModel:InitCheckMoneyRedLvList( )
- self.check_red_money_lv = {}
- for k,v in pairs(self:GetMoneyBossConf()) do
- self.check_red_money_lv[self:GetMoneyBossLimitLv(v.boss_id)] = true
- end
- end
-
- --专属幻魔的显示列表
- function BossModel:GetPersonBossList( boss_id )
- if boss_id then
- return Config.Personalbossinfo[boss_id]
- else
- return Config.Personalbossinfo
- end
- end
-
- function BossModel:GetPersonBossLimitLv( boss_id )
- if not boss_id then return 999 end
- local data = self:GetPersonBossList()
- if data[boss_id] then
- local dun_cfg = BaseDungeonModel:GetInstance():GetDunCfg( data[boss_id].dun_id )
- if dun_cfg then
- local temp = dun_cfg.condition
- for k,v in pairs(temp) do
- if v[1] == "lv" then
- return tonumber(v[2])
- end
- end
- end
- end
- return 999
- end
-
- --获取系统推荐的Boss选择
- function BossModel:GetRecommendPersonBossId( )
- local lower_cfg = false--最低战力boss
- local select_cfg = false--选择战力boss
- local lv_range = false--等级范围
- local my_lv = RoleManager.Instance.mainRoleInfo.level
- local my_fight = RoleManager.Instance.mainRoleInfo.fighting
- local default_id = 1
- for k,v in pairs(Config.Personalbossinfo) do
- if v.grade and v.grade == 1 then
- default_id = v.boss_id
- end
- lv_range = stringtotable(v.recommend_lv)
- if my_lv >= tonumber(lv_range[1][1]) and my_lv <= tonumber(lv_range[1][2]) then
- --如果该等级段玩家一个战力都不符合,则选中该等级段下战力最小的那个作为推荐boss
- lower_cfg = lower_cfg and (lower_cfg.recommend_power > v.recommend_power and v or lower_cfg) or v
- -------------------------
- if my_fight >= v.recommend_power then
- --先找到符合玩家等级的所有boss,然后找到玩家能打的最高战力boss作为推荐boss
- select_cfg = select_cfg and (select_cfg.recommend_power > v.recommend_power and select_cfg or v) or v
- end
- end
- end
- if select_cfg then
- return select_cfg.boss_id
- elseif lower_cfg then
- return lower_cfg.boss_id
- else
-
- return default_id
- end
- end
-
- function BossModel:GetBossNormalCount( boss_type )
- if boss_type == Config.ConfigBoss.ModuleId.Person then
- if not self.perosn_normal_count then
- for k,v in pairs(Config.Dungeoncfg) do
- if v.type == BaseDungeonModel.DUN_TYPE.PersonBoss then
- for a,b in pairs(stringtotable(v.count_cond)) do
- if b[1] == 1 then
- self.perosn_normal_count = b[2]
- end
- end
- if self.perosn_normal_count then
- break
- end
- end
- end
- end
- -------------------------
- return self.perosn_normal_count or 0
- end
- return 0
- end
-
- --离开场景清除数据
- function BossModel:LeaveSceneClear( type_id )
- self.boss_hurt_info = {}
- self.scene_boss_hp = {}
- self.my_hurt_only = false
- if type_id == Config.ConfigBoss.ModuleId.World then
- self.world_boss_protect_max = {}
- elseif type_id == Config.ConfigBoss.ModuleId.Money then
- self.money_helper_info = {}
- end
- end
-
- function BossModel:GetIsBossById( id )
- if not id then return end
- return Config.Personalbossinfo[id]
- end
-
- function BossModel:GetWorldBossStatus( )
- return self.world_boss_status or 0
- end
- function BossModel:SetWorldBossStatus( value )
- self.world_boss_status = value
- end
-
- function BossModel:GetWorldOneBossStatus( boss_id )
- if not self:GetWorldBossInfo().boss_info then return end
- local ser_data = false
- for k,v in pairs(self:GetWorldBossInfo().boss_info) do
- if v.boss_id == boss_id then
- ser_data = v
- end
- end
- if not ser_data then return end
- return ser_data.status
- end
-
- function BossModel:GetWorldBossInfo( )
- return self.world_boss_info or {}
- end
- function BossModel:SetWorldBossInfo( value )
- self.world_boss_info = value
- end
- function BossModel:SetWorldBossInfoOne( data )
- if data and data.boss_id then
- if self.world_boss_info and self.world_boss_info.boss_info then
- for k,v in pairs(self.world_boss_info.boss_info) do
- if v.boss_id == data.boss_id then
- v.status = data.status
- return true
- end
- end
- end
- end
- return false
- end
-
- function BossModel:GetWorldBossHp( boss_id )
- if not boss_id then return end
- return self.world_boss_hp_list[boss_id]
- end
- function BossModel:SetWorldBossHpList( value )
- if value then
- self.world_boss_hp_list[value.boss_id] = value
- end
- end
-
- function BossModel:GetWorldBossWeekRankList( show_week_type )
- if not show_week_type then return end
- return self.world_boss_week_rank_list[show_week_type]
- end
- function BossModel:SetWorldBossWeekRankList( value )
- if value then
- self.world_boss_week_rank_list[value.boss_id] = {list = value.rank_list,my_score = value.my_score}
- end
- end
-
- function BossModel:GetBossHurtInfo( type_id,role_id )
- if not type_id then return end
- if self.boss_hurt_info[type_id] then
- if role_id then
- return self.boss_hurt_info[type_id][role_id]
- else
- return self.boss_hurt_info[type_id]
- end
- end
- return {}
- end
- function BossModel:GetSceneBossHp( type_id )
- return self.scene_boss_hp[type_id] or 0
- end
- function BossModel:ResetBossHurtInfo( type_id )
- if not type_id then return end
- self.boss_hurt_info[type_id] = {}
- self.scene_boss_hp[type_id] = 0
- end
- function BossModel:SetBossHurtInfo( boss_id,role_id,name,hurt,boss_hp,type )
- if not boss_id then return end
- local type_id = self:GetBossTypeByBossId(boss_id)
-
- if role_id and hurt and name and type_id then
- self.boss_hurt_info[type_id] = self.boss_hurt_info[type_id] or {}
- self.boss_hurt_info[type_id][role_id] =
- {
- ["role_id"] = role_id,
- ["name"] = name,
- ["hurt"] = hurt,
- ["type"] = type,
- }
- end
- if boss_hp and type_id then
- self.scene_boss_hp[type_id] = boss_hp
- end
- end
-
- function BossModel:GetWorldBossConf( boss_id )
- if boss_id then
- return Config.Worldbossinfo[boss_id]
- else
- return Config.Worldbossinfo
- end
- end
-
- function BossModel:GetWorldBossWeekGiftByRank( rank_type, rank )
- if not rank_type or not rank then return {} end
- for k,v in pairs(Config.Worldbossweekrank) do
- if v.rank_type == rank_type then
- if v.rank_high <= rank and v.rank_low >= rank then
- return stringtotable(v.award),v
- end
- end
- end
- return {}
- end
-
- function BossModel:GetWorldBossWeekTypeByBossId( boss_id )
- for k,v in pairs(Config.Worldbossinfo) do
- if v.boss_id == boss_id then
- return v.rank_type
- end
- end
- return 1
- end
-
- function BossModel:GetWorldBossWeekLvSize( rank_type )
- local max_lv = 0
- local min_lv = 99999
- for k,v in pairs(Config.Worldbossinfo) do
- if rank_type == v.rank_type then
- max_lv = max_lv > v.boss_lv and max_lv or v.boss_lv
- min_lv = min_lv < v.boss_lv and min_lv or v.boss_lv
- end
- end
- return min_lv,max_lv
- end
-
- function BossModel:GetWorldBossRankTabData( )
- if not self.world_boss_rank_tab_list then
- local list = {}
- for k,v in pairs(Config.Worldbossweekrank) do
- if v.rank_high == 1 and v.rank_low == 1 then
- list[v.rank_type] = DeepCopy(v)
- end
- end
- local function sort_call( a,b )
- return a.rank_type < b.rank_type
- end
- table.sort( list, sort_call )
- self.world_boss_rank_tab_list = list
- end
- return self.world_boss_rank_tab_list
- end
-
- function BossModel:GetWorldBossLimitLv( boss_id )
- if not boss_id then return 0 end
- if self:GetWorldBossConf( boss_id ) then
- return self:GetWorldBossConf( boss_id ).boss_lv
- end
- end
-
- function BossModel:GetMoneyBossConf( boss_id )
- if boss_id then
- return Config.Rewardbossinfo[boss_id]
- else
- return Config.Rewardbossinfo
- end
- end
-
- function BossModel:GetMoneyBossLimitLv( boss_id )
- if not boss_id then return 0 end
- local conf = self:GetMoneyBossConf( boss_id )
- return conf and conf.enter_lv or 0
- end
-
- function BossModel:GetMoneyBossInfo( )
- return self.money_boss_info
- end
- function BossModel:SetMoneyBossInfo( boss_id,reborn_time,killer,is_focus,kill_count)
- if boss_id then
- -------------------------
- if self.money_boss_info[boss_id] and (not kill_count) then
- kill_count = self.money_boss_info[boss_id].kill_count
- end
- -------------------------
- if is_focus then
- self.money_boss_info[boss_id] = {
- boss_id = boss_id,reborn_time = reborn_time,killer = killer,is_focus = is_focus,kill_count = kill_count
- }
- else
- is_focus = self.money_boss_info[boss_id] and self.money_boss_info[boss_id].is_focus or 0
- self.money_boss_info[boss_id] = {
- boss_id = boss_id,reborn_time = reborn_time,killer = killer,is_focus = is_focus,kill_count = kill_count
- }
- end
- -------------------------
- --额外增加关注的处理
- self:SetFocusClockData( boss_id,reborn_time,is_focus )
- -------------------------
- end
- end
-
- function BossModel:SetDesertedBossInfo( boss_id,reborn_time,killer,is_focus,kill_count)
- if boss_id then
- -------------------------
- if self.deserted_boss_info[boss_id] and (not kill_count) then
- kill_count = self.deserted_boss_info[boss_id].kill_count
- end
- -------------------------
- if is_focus then
- self.deserted_boss_info[boss_id] = {
- boss_id = boss_id,reborn_time = reborn_time,killer = killer,is_focus = is_focus,kill_count = kill_count
- }
- else
- is_focus = self.deserted_boss_info[boss_id] and self.deserted_boss_info[boss_id].is_focus or 0
- self.deserted_boss_info[boss_id] = {
- boss_id = boss_id,reborn_time = reborn_time,killer = killer,is_focus = is_focus,kill_count = kill_count
- }
- end
- -------------------------
- --额外增加关注的处理
- self:SetFocusClockData( boss_id,reborn_time,is_focus )
- -------------------------
- end
- end
-
- function BossModel:ChangeBossFocusStatus( boss_id, op_type )
- local reborn_time = false
- for k,v in pairs(self.money_boss_info) do
- if v.boss_id == boss_id then
- v.is_focus = op_type
- reborn_time = v.reborn_time
- break
- end
- end
- for k,v in pairs(self.deserted_boss_info) do
- if v.boss_id == boss_id then
- v.is_focus = op_type
- reborn_time = v.reborn_time
- break
- end
- end
- -------------------------
- --额外增加关注的处理
- if reborn_time then
- self:SetFocusClockData( boss_id,reborn_time,op_type )
- end
- -------------------------
- end
-
- --赏金幻魔剩余次数和总次数
- function BossModel:GetMoneyLeftCount( )
- local my_data = self:GetMoneyBossMyInfo()
- local my_count = my_data and my_data.daily_award or 0
- local all_count = BossModel:GetInstance():GetBossKeyValue( "reward_boss_count" )
- if my_data and my_data.goods_times then
- --加入了道具卡,可以使用物品增加最大次数
- all_count = all_count + my_data.goods_times
- end
- local buff_kind = OperateActivityModel.MaterialSubmitBuffKind.BOSS_ADD_TIME --是否存在活动加成buff 挑战次数+1
- local buff_cfg,buff_info = OperateActivityModel:getInstance():GetMaterialBuffInfoByKind(buff_kind)
- if buff_cfg and buff_info then
- local sec = buff_info.etime - TimeUtil:getServerTime( )
- if sec > 0 then
- local have_time = 1
- for k,v in pairs(buff_info.used) do
- if v.kdata == 3 and v.vdata == 1 then--赏金幻魔boss还有次数
- have_time = 0
- break
- end
- end
- if have_time > 0 then
- all_count = all_count + 1
- end
- end
- end
- return all_count - my_count > 0 and all_count - my_count or 0,all_count
- end
-
- --赏金幻魔boss是否还有次数剩余
- function BossModel:IsTodayMoneyHaveLeftCount(boss_id)
- local left_count, all_count = self:GetMoneyLeftCount()
- if left_count == 0 and boss_id then
- local ser_data = false
- for k,v in pairs(self:GetMoneyBossInfo()) do
- if v.boss_id == boss_id then
- ser_data = v
- end
- end
- if ser_data and ser_data.kill_count == 0 then
- left_count = left_count + 1
- end
- end
- return left_count > 0
- end
-
- function BossModel:GetMoneyBossMyInfo( )
- return self.money_boss_my_info
- end
- function BossModel:SetMoneyBossMyInfo( value )
- self.money_boss_my_info = value
-
- --刷新赏金boss次数时,同步一下日常任务
- DailyModel.getInstance():Fire(DailyModel.REQUEST_CCMD_EVENT, 15701, DailyActivityType.Limit)
- DailyModel.getInstance():Fire(DailyModel.REQUEST_CCMD_EVENT, 15701, DailyActivityType.UnLimit)
- end
-
- function BossModel:GetMoneyBossKillHistory( )
- return self.money_boss_kill_history
- end
- function BossModel:SetMoneyBossKillHistory( value )
- self.money_boss_kill_history = value
- end
-
- function BossModel:GetMoneyInspireCount( boss_id )
- if not boss_id then return end
- return self.money_inspire_count[boss_id]
- end
- function BossModel:SetMoneyInspireCount( boss_id,by_gold,by_bgold )
- self.money_inspire_count[boss_id] = {boss_id = boss_id,by_gold = by_gold,by_bgold = by_bgold}
- end
-
- function BossModel:GetWorldBossProtectMax( boss_id )
- if not boss_id then return end
- return self.world_boss_protect_max[boss_id]
- end
- function BossModel:SetWorldBossProtectMax( data )
- if not data then return end
- self.world_boss_protect_max[data.boss_id] = data
- end
-
- function BossModel:GetMoneyHelperInfo( )
- return self.money_helper_info
- end
-
- function BossModel:SetMoneyHelperInfo( data,remove_id )
- if remove_id then
- self.money_helper_info[remove_id] = nil
- return
- end
- if not data then return end
- self.money_helper_info[data.role_id] = data
- end
-
- function BossModel:GetCurFightBossId( )
- if SceneManager:getInstance():IsFakeBossMoneyScene() then
- return BossModel.FAKE_MONEY_BOSS_ID
- end
- return self.cur_fight_boss_id
- end
- function BossModel:SetCurFightBossId( value )
- self.cur_fight_boss_id = value
- end
-
- --关注计时器列表数据的处理
- function BossModel:SetFocusClockData( boss_id,reborn_time,is_focus )
- if is_focus == 1 then
- if reborn_time == 0 then
- --复活了就不用管了,重置数据
- self.boss_focus_check_list[boss_id] = nil
- self.boss_focus_tip_cd_list[boss_id] = nil
- else
- local curTime = TimeUtil:getServerTime()
- if reborn_time > curTime then
- self.boss_focus_check_list[boss_id] = reborn_time
- else
- --容错重置
- self.boss_focus_check_list[boss_id] = nil
- self.boss_focus_tip_cd_list[boss_id] = nil
- end
- end
-
- else
- --没关注重置数据
- self.boss_focus_check_list[boss_id] = nil
- self.boss_focus_tip_cd_list[boss_id] = nil
- end
- end
-
- function BossModel:SetFocusClock( )
- local function clockFun()
- local curTime = TimeUtil:getServerTime()
- for k,v in pairs(self.boss_focus_check_list) do
- if v <= curTime + self.money_focus_tip_time and (not self.boss_focus_tip_cd_list[k]) then
- self:Fire(BossConst.OPEN_BOSS_RELIVE_TIP,k)
- -------------------------
- --设定tipCD
- self.boss_focus_tip_cd_list[k] = self.money_focus_tip_time + 5
- end
- end
- -------------------------
- --跑tip的cd并删除无用cd
- for k,v in pairs(self.boss_focus_tip_cd_list) do
- v = v - 1
- if v == 0 then
- self.boss_focus_tip_cd_list[k] = nil--删除无用cd
- end
- end
- -------------------------
-
- end
- self.focus_clock_id = self.focus_clock_id or GlobalTimerQuest:AddPeriodQuest(clockFun, 1, -1)
- end
-
- function BossModel:GetHurtNumStr( num )
- num = num or 0
- if num >= 0 and num <= 99999 then
- return num
- elseif num >= 100000 and num <= 99999999 then
- return string.format("%.1f万", num / 10000)
- elseif num >= 100000000 and num <= 99999999999 then
- return string.format("%.2f亿", num / 100000000)
- elseif num >= 100000000000 and num <= 999999999999 then
- return string.format("%.2f千亿", num / 100000000000)
- elseif num >= 1000000000000 and num <= 9999999999999 then
- return string.format("%.1f千亿", num / 100000000000)
- end
- return string.format("%.1f千亿", num / 100000000000)
- end
-
- function BossModel:GetShortNameStr( str )
- str = str or ""
- if SubStringGetTotalIndex(str) > 8 then
- return SubStringUTF8(str, 1, 8) .. "..."
- else
- return str
- end
- end
-
- function BossModel:SetHelpClock()
- if not self.help_clock_Id then
- self.help_clock = 5
- local function step_method( ... )
- self.help_clock = self.help_clock -1
- if self.help_clock <= 0 then
- --倒计时结束
- self:CloseHelpClock()
- end
- end
- self.help_clock_Id = GlobalTimerQuest:AddPeriodQuest(step_method, 1, -1)
- end
- end
-
- function BossModel:CloseHelpClock()
- self.help_clock = 0
- if self.help_clock_Id then
- GlobalTimerQuest:CancelQuest(self.help_clock_Id)
- self.help_clock_Id = nil
- end
- end
-
- --boss自己的总伤害(只在组队状态下有用)
- function BossModel:GetMyHurtOnly( )
- return self.my_hurt_only
- end
- function BossModel:SetMyHurtOnly( value )
- self.my_hurt_only = value
- end
- --废都右边伤害列表
- function BossModel:SetDesertedBossRankInfo( vo )
- self.deserted_boss_rank_info[vo.boss_id] = vo
- self:SetCurFightBossId(vo.boss_id)
- self:Fire(BossConst.ANS_DESERTED_RANK_INFO)
- end
-
- function BossModel:GetDesertedBossRankInfo( boss_id )
- return self.deserted_boss_rank_info[boss_id]
- end
-
- function BossModel:CleanDesertedBossRankInfoById( boss_id )
- self.deserted_boss_rank_info[boss_id] = nil
- end
-
- --星域幻魔每日次数
- function BossModel:SetDesertedBossNumInfo( vo )
- self.deserted_boss_num_info = vo
- self:ChangeVar("deserted_boss_num_info", self.deserted_boss_num_info, false, true)
- end
-
- function BossModel:GetDesertedBossNumInfo( )
- return self.deserted_boss_num_info
- end
-
- --获得星域幻魔剩余次数
- function BossModel:GetDesertedBossRestNum( )
- local time_info = self:GetDesertedBossNumInfo()
- if not time_info then
- return 0,0
- end
- local boss_time = time_info.boss_count or 0
- local mon_time = time_info.mon_count or 0
- local rest_boss_time = self.total_deserted_boss_time - boss_time
- local rest_mon_time = self.total_deserted_mon_time - mon_time
- return rest_boss_time, rest_mon_time
- end
-
- function BossModel:GetDesertedBossInfo( boss_id )
- if boss_id then
- return self.deserted_boss_info[boss_id]
- else
- return self.deserted_boss_info
- end
- end
-
- function BossModel:InitDesertedBossCFG( )
- self.deserted_boss_cfg = {}
- local cfg = Config.Desertedbossinfo
- for k,v in pairs(cfg) do
- if not self.deserted_boss_cfg[v.level] then
- self.deserted_boss_cfg[v.level] = {}
- end
- table_insert(self.deserted_boss_cfg[v.level], v)
- end
- for k,v in pairs(self.deserted_boss_cfg) do
- local sort_func = function ( a, b )
- return a.recommend_lv < b.recommend_lv
- end
- table.sort(v, sort_func)
- end
- end
- --根据层数获取boss配置
- function BossModel:GetDesertedBossCFG( level )
- if not level then
- return self.deserted_boss_cfg
- else
- return self.deserted_boss_cfg[level] or {}
- end
- end
- --根据bossid获取boss配置
- function BossModel:GetDesertedBossCFGById( boss_id )
- if boss_id then
- return Config.Desertedbossinfo[boss_id]
- else
- return {}
- end
- end
- --根据星域幻魔_id 获取场景id
- function BossModel:GetDesertedBossSceneById( boss_id )
- local cfg = Config.Desertedbossinfo
- if cfg[boss_id] then
- local level = cfg[boss_id].level
- local scene_cfg = Config.Desertedlevel[level]
- return scene_cfg.scene,scene_cfg.cls_scene
- end
- return 0,0
- end
-
- --刷新墓碑
- function BossModel:UpdateSceneGrave(vo)
- if not vo or not vo.boss_info then return end
- local boss_info = vo.boss_info
- if boss_info then
- local cur_scene_id = SceneManager.Instance:GetSceneId()
- for _, v in ipairs(boss_info) do
- if v.reborn_time > 0 then --复活结束时间戳>0说明怪物已经死亡
- local x, y
- local cfg = Config.Desertedbossinfo[v.boss_id]
- local scene_id,cs_scene_id = self:GetDesertedBossSceneById(v.boss_id)
- if cfg then
- local pos = stringtotable(cfg.born_pos)
- x = tonumber(pos[1])
- y = tonumber(pos[2])
- end
-
- local monCfg = ConfigItemMgr.Instance:GetMonsterDataItem(v.boss_id)
- if x and y and monCfg and (scene_id == cur_scene_id or cs_scene_id == cur_scene_id) then
- local grave_vo = GraveVo.New()
-
- local data = {}
- data.instance_id = v.boss_id
- data.type_id = BossModel.GRAVE_MONSTER_ID
- data.boss_id = v.boss_id
- data.name = monCfg.name
- data.level = monCfg.lv
- data.refresh_time = math.ceil(v.reborn_time - TimeUtil:getServerTime())
- data.pos_x = x
- data.pos_y = y
- grave_vo:SetGraveVo(data)
- SceneManager:getInstance():AddGraveVo(grave_vo)
- end
- else
- SceneManager:getInstance():DeleteGraveVo(v.boss_id)
- end
- end
- end
- end
-
- function BossModel:SetNeedFindBoss( boss_id )
- self.need_find_boss_id = boss_id
- end
-
- function BossModel:GetNeedFindBoss( )
- return self.need_find_boss_id
- end
-
- function BossModel:IsDesertedBoss( boss_id )
- if boss_id and Config.Desertedbossinfo[boss_id] then
- return true
- else
- return false
- end
- end
-
- function BossModel:HasDesertedBossRed( )
- if not GetModuleIsOpen(461, 0,true) then
- return false
- end
- local time_info = self:GetDesertedBossNumInfo()
- local boss_time = time_info.boss_count or 0
- local mon_time = time_info.mon_count or 0
- local rest_boss_time = self.total_deserted_boss_time - boss_time
- rest_boss_time = rest_boss_time < 0 and 0 or rest_boss_time
- local rest_mon_time = self.total_deserted_mon_time - mon_time
- rest_mon_time = rest_mon_time < 0 and 0 or rest_mon_time
- return rest_boss_time > 0 or rest_mon_time > 0
- end
-
- function BossModel:HasDesertedBossNum( )
- local time_info = self:GetDesertedBossNumInfo()
- local boss_time = time_info.boss_count or 0
- local rest_boss_time = self.total_deserted_boss_time - boss_time
- return rest_boss_time > 0
- end
-
- function BossModel:HasBossHomeRed( )
- local boss_home_red = BossHomeModel:getInstance():GetBossHomeRedCache()
- return boss_home_red
- end
-
- ------------活动boss start-------------
- --活动基础信息
- function BossModel:GetFestivalBossList( )
- return self.festival_boss_list
- end
- function BossModel:SetFestivalBossList( value )
- value.scene_id_list = {}
- for k,v in pairs(value.list) do
- value.scene_id_list[v.scene_id] = {}
- value.scene_id_list[v.scene_id][v.pool_id] = v
- end
- self.festival_boss_list = value
- end
- --当前场景boss信息
- function BossModel:GetFestivalBossSceneList( )
- return self.festival_boss_scene_list
- end
- function BossModel:SetFestivalBossSceneList( value )
- if value then
- value.id_list = {}
- value.scene_id_list = {}
- for k,v in pairs(value.list) do
- value.id_list[v.mon_id] = v
- value.scene_id_list[v.scene_id] = {}
- value.scene_id_list[v.scene_id][v.pool_id] = v
- end
- self.festival_boss_scene_list = value
- else
- self.festival_boss_scene_list = false
- end
- end
- --排名信息
- function BossModel:GetFestivalBossRankInfo( )
- return self.festival_boss_rank_info
- end
- function BossModel:SetFestivalBossRankInfo( value )
- if value then
- self.festival_boss_rank_info = value
- local list_role = {}
- for k,v in pairs(value.rank_list) do
- list_role[v.role_id] = v
- end
- self.festival_boss_rank_info.list_role = list_role
- else
- self.festival_boss_rank_info = false
- end
- end
- ------------活动boss end---------------
- --判断是否是废都幻魔的跨服场景
- function BossModel:CheckIsCrossDesertedScene( scene_id )
- if not self.deserted_boss_scene_list then
- self.deserted_boss_scene_list = {}
- local cfg = Config.Desertedlevel
- for i,v in ipairs(cfg) do
- self.deserted_boss_scene_list[v.cls_scene] = true
- end
- end
- return self.deserted_boss_scene_list[scene_id] or false
- end
- --获取废都幻魔第几层
- function BossModel:GetDesertedSceneFloor( scene_id )
- scene_id = scene_id or SceneManager:getInstance():GetSceneId()
- local cfg = Config.Desertedlevel
- for i,v in ipairs(cfg) do
- if v.scene == scene_id or v.cls_scene == scene_id then
- return v.level
- end
- end
- return 0
- end
-
- --星域幻魔剩余免费复活次数
- function BossModel:UpdateLeftDesertedBossFreeReliveTimes(vo)
- self.left_free_deserted_boss_relive_times = vo.left_count
- end
-
- function BossModel:GetLeftDesertedBossFreeReliveTimes( )
- return self.left_free_deserted_boss_relive_times
- end
-
- function BossModel:GetLeftDesertedBossMapShowDataList(level)
- local list = {}
- local all_boss_list = self:GetDesertedBossCFG(level) or {}
- if all_boss_list and #all_boss_list > 0 then
- for i,v in ipairs(all_boss_list) do
- local d = {}
- local pos = stringtotable(v.born_pos)
- d.x = tonumber(pos[1])
- d.y = tonumber(pos[2])
- d.boss_id = v.boss_id
- d.id = v.boss_id
- d.sub_type = FindVo.MONSTER
- d.xy = v.born_pos
- d.name = Trim(v.boss_name)
- table.insert(list, d)
- end
- end
- return list
- end
-
-
- --设置星域幻魔的当前层精英怪物数量
- function BossModel:SetLeftDesertedMonsterInfo(vo)
- self.deserted_monster_info = vo
- end
-
- --设置星域幻魔的当前层精英怪物数量
- function BossModel:SetLeftDesertedMonsterNumber(vo)
- if self.deserted_monster_info and self.deserted_monster_info.boss_info then
- for i,v in ipairs(self.deserted_monster_info.boss_info) do
- if vo.index == v.index then
- v.alive = vo.alive
- break
- end
- end
- end
- end
-
- --获取星域幻魔的当前层精英怪物数量
- function BossModel:GetLeftDesertedMonsterNumber()
- local cnt = 0
- if self.deserted_monster_info and self.deserted_monster_info.boss_info then
- for i,v in ipairs(self.deserted_monster_info.boss_info) do
- if v.alive == 1 then
- cnt = cnt + 1
- end
- end
- end
- return cnt
- end
-
- --包括赏金boss 专属boss 星域boss
- function BossModel:GetBossConfig( boss_id )
- if not boss_id then return end
- local cfg = Config.Rewardbossinfo[boss_id]
- if not cfg then
- cfg = Config.Desertedbossinfo[boss_id]
- end
-
- if not cfg then
- --如果走到这里,那就只可能是专属boss,专属boss 有个多星级,要转到1星的id才能拿到配置
- local id = math.floor(boss_id/10 ) * 10 + 1
- cfg = Config.Personalbossinfo[id]
- end
- return cfg
- end
-
- --设置boss免战时间
- function BossModel:SetBossProtectTimeInfo(info ,boss_type)
- self.boss_protect_time_info = self.boss_protect_time_info or {}
- self.boss_protect_time_info[boss_type] = info
- end
-
- --获取boss免战时间
- function BossModel:GetBossProtectTime(boss_type)
- local time = 0
- local time_info = self.boss_protect_time_info[boss_type]
- if time_info then
- local server_time = TimeUtil:getServerTime()
- if time_info.protect_time > server_time then
- time = time_info.protect_time - server_time
- end
- end
- return time
- end
-
- --获取boss免战使用次数
- function BossModel:GetBossProtectUseTime(boss_type)
- local use_times = false
- local time_info = self.boss_protect_time_info[boss_type]
- if time_info then
- use_times = time_info.use_times
- end
- return use_times
- end
-
- --获取boss免战使用次数
- function BossModel:GetBossProtectMaxUseTime(boss_type)
- local max_use_time = 1
- return max_use_time
- end
-
- --获取boss免战保护时间 **分
- function BossModel:GetBossProtectMaxTime(boss_type)
- local max_time = 15
- local cfg
- if boss_type == BossProtectTipsView.BossType.Deserted then
- cfg = Config.Desertedkv
- if cfg and cfg["role_protect_time"] then
- max_time = (cfg["role_protect_time"].val) / 60
- end
- else
- cfg = Config.Localbosskv
- if cfg and cfg["role_protect_time"] then
- max_time = (cfg["role_protect_time"].value_content) / 60
- end
- end
- return max_time
- end
-
- --是否满足新手假赏金BOSS的条件
- function BossModel:IsMatchFakeMoneyBoss( )
- --等级满足,接到任务且进度未完成
- local role_lv = RoleManager.Instance.mainRoleInfo.level
- if role_lv >= BossModel.FAKE_MONEY_BOSS_MIN_LEVEL and role_lv <= BossModel.FAKE_MONEY_BOSS_MAX_LEVEL then
- local task = TaskModel:getInstance():GetReceivedTaskById(BossModel.FAKE_MONEY_BOSS_TASK_ID)
- if task and not TaskModel:getInstance():IsTaskProgressFinish(task) then
- return true
- end
- end
- end
-
- function BossModel:GetPersonBossLeftCount( )
- if not GetModuleIsOpen(460, Config.ConfigBoss.ModuleId.Person, true) then
- return 0
- end
- local dungeon_list = BaseDungeonModel:GetInstance():GetDunProtoInfo( BaseDungeonModel.DUN_TYPE.PersonBoss )
- local boss_type_count = self:GetBossNormalCount(Config.ConfigBoss.ModuleId.Person)
- if dungeon_list and dungeon_list[1] then
- local max_time = boss_type_count + dungeon_list[1].vip_count
- local vip_pass_count = 0--购买的vip次数使用过的次数
- for k, v in pairs(dungeon_list[1].rec_data) do
- if v.key == 8 then
- vip_pass_count = v.val
- end
- end
- local day_use = dungeon_list[1].day_pass_count+vip_pass_count
- return max_time-day_use
- end
- return 0
- end
-
- --获取总的boss剩余挑战次数
- function BossModel:GetAllBossNum( )
- local money_boss_num, person_boss_num, deserted_boss_num, boss_home_num = 0, 0, 0, 0
-
- --赏金boss
- if not GetModuleIsOpen(460, Config.ConfigBoss.ModuleId.Money, true) then
- money_boss_num = 0
- else
- money_boss_num = self:GetMoneyLeftCount()
- end
-
- --专属boss
- person_boss_num = self:GetPersonBossLeftCount()
-
- --星域boss
- if not GetModuleIsOpen(461, 0, true) then
- deserted_boss_num = 0
- else
- deserted_boss_num = self:GetDesertedBossRestNum()
- end
-
- --boss之家
- -- boss_home_num = self:HasBossHomeRed() and 1 or 0
-
- return money_boss_num + person_boss_num + deserted_boss_num + boss_home_num
- end
-
- --获取赏金boss次数购买信息
- function BossModel:GetBossMoneyBuyCount( )
- local use_count, all_count = 0, 0
- local need_money = 0
- local cfg = Config.Localbosskv["reward_boss_count_recovery"]
- local cfg_value = stringtotable(cfg.value_content) or {}
- all_count = #cfg_value
- local boss_money_info = self:GetMoneyBossMyInfo()
- if boss_money_info and boss_money_info.recover_time then
- use_count = boss_money_info.recover_time
- end
- for i,v in ipairs(cfg_value) do
- if v[1] > use_count then
- need_money = v[2]
- break
- end
- end
- local left_count = all_count-use_count > 0 and all_count-use_count or 0
- return left_count, all_count, need_money
- end
-
- -- --更新幻魔星域BOSS挑战次数
- -- function BossModel:UpdateDesertedBossHaveTimes( )
- -- self.total_deserted_boss_time = Config.Desertedkv["feidu_boss_times"].val
- -- local buff_kind = OperateActivityModel.MaterialSubmitBuffKind.BOSS_ADD_TIME --是否存在活动加成buff 挑战次数+1
- -- local buff_cfg,buff_info = OperateActivityModel:getInstance():GetMaterialBuffInfoByKind(buff_kind)
- -- if buff_cfg and buff_info then
- -- local sec = buff_info.etime - TimeUtil:getServerTime( )
- -- if sec > 0 then
- -- local have_time = 0
- -- for k,v in pairs(buff_info.used) do
- -- if v.kdata == 9 and v.vdata == 0 then--废土boss还有次数
- -- have_time = 1
- -- break
- -- end
- -- end
- -- if have_time > 0 then
- -- self.total_deserted_boss_time = Config.Desertedkv["feidu_boss_times"].val + 1
- -- local sec = buff_info.etime - TimeUtil:getServerTime( )
- -- self:ActBuffTimeLate(sec)
- -- end
- -- end
- -- end
- -- BossController.Instance:BossControllerCheckRed( )
- -- end
-
- -- --buff结束后刷新boss红点
- -- function BossModel:ActBuffTimeLate( sec )
- -- if self.act_buff_timer_id then
- -- GlobalTimerQuest:CancelQuest(self.act_buff_timer_id)
- -- self.act_buff_timer_id = nil
- -- end
- -- local sec = sec or 0
- -- if sec > 0 then
- -- local function onTimer()
- -- sec = sec - 1
- -- if sec > 0 then
-
- -- else
- -- self:UpdateDesertedBossHaveTimes()
- -- GlobalTimerQuest:CancelQuest(self.act_buff_timer_id)
- -- self.act_buff_timer_id = nil
- -- end
- -- end
- -- if not self.act_buff_timer_id then
- -- self.act_buff_timer_id = GlobalTimerQuest:AddPeriodQuest(onTimer, 1, -1)
- -- end
- -- onTimer()
- -- else
- -- self:UpdateDesertedBossHaveTimes()
- -- end
- -- end
|