源战役客户端
Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.
 
 
 
 
 

1374 rader
40 KiB

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