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